From c433c7c8ab8401f59262e3d32af607591ec2fe92 Mon Sep 17 00:00:00 2001 From: dcbuild3r Date: Wed, 15 Jul 2026 23:21:48 +0200 Subject: [PATCH 1/8] feat: rebuild mobench around pinned truth contract --- .github/workflows/ci.yml | 43 + .github/workflows/release-sync.yml | 108 + .gitignore | 5 + README.md | 64 +- apps/docs/astro.config.mjs | 86 + apps/docs/package.json | 24 + apps/docs/public/favicon.svg | 1 + apps/docs/public/fixtures/summary-basic.json | 84 + apps/docs/public/fixtures/summary-ffi.json | 84 + .../fonts/geist-latin-wght-normal.woff2 | Bin 0 -> 29400 bytes .../fonts/geist-mono-latin-wght-normal.woff2 | Bin 0 -> 29896 bytes apps/docs/public/llms-full.txt | 1928 ++++ apps/docs/public/llms.txt | 51 + .../manifests/mobench-site-manifest-v1.json | 9063 +++++++++++++++++ apps/docs/public/og/basic-example.png | Bin 0 -> 19585 bytes apps/docs/public/og/benchmark-functions.png | Bin 0 -> 19492 bytes apps/docs/public/og/benchmark-quality.png | Bin 0 -> 18979 bytes apps/docs/public/og/browserstack.png | Bin 0 -> 21322 bytes apps/docs/public/og/ci.png | Bin 0 -> 15234 bytes apps/docs/public/og/cli.png | Bin 0 -> 16393 bytes apps/docs/public/og/compatibility.png | Bin 0 -> 17315 bytes apps/docs/public/og/configuration.png | Bin 0 -> 17250 bytes apps/docs/public/og/device-matrices.png | Bin 0 -> 17972 bytes apps/docs/public/og/ffi-example.png | Bin 0 -> 17926 bytes apps/docs/public/og/host-preflight.png | Bin 0 -> 18702 bytes apps/docs/public/og/index.png | Bin 0 -> 18647 bytes apps/docs/public/og/installation.png | Bin 0 -> 16342 bytes apps/docs/public/og/outputs.png | Bin 0 -> 18826 bytes apps/docs/public/og/profiling.png | Bin 0 -> 18693 bytes apps/docs/public/og/quickstart.png | Bin 0 -> 16676 bytes apps/docs/public/og/regressions.png | Bin 0 -> 20327 bytes apps/docs/public/og/schemas.png | Bin 0 -> 17674 bytes apps/docs/public/og/setup-teardown.png | Bin 0 -> 19846 bytes apps/docs/public/og/troubleshooting.png | Bin 0 -> 17510 bytes apps/docs/public/robots.txt | 4 + .../public/schemas/ci-contract-v1.schema.json | 36 + .../mobench-site-manifest-v1.schema.json | 152 + .../public/schemas/summary-v1.schema.json | 75 + .../schemas/trace-events-v1.schema.json | 59 + apps/docs/src/assets/logo.svg | 7 + apps/docs/src/components/Head.astro | 43 + apps/docs/src/components/PageTitle.astro | 53 + apps/docs/src/content.config.ts | 36 + .../content/docs/analyze-results/outputs.mdx | 85 + .../docs/analyze-results/profiling.mdx | 94 + .../docs/analyze-results/regressions.mdx | 74 + apps/docs/src/content/docs/examples/basic.mdx | 86 + apps/docs/src/content/docs/examples/ffi.mdx | 88 + .../content/docs/get-started/installation.mdx | 86 + .../content/docs/get-started/quickstart.mdx | 96 + .../src/content/docs/help/troubleshooting.mdx | 94 + apps/docs/src/content/docs/index.mdx | 55 + apps/docs/src/content/docs/reference/cli.mdx | 445 + .../content/docs/reference/compatibility.mdx | 70 + .../content/docs/reference/configuration.mdx | 147 + .../docs/reference/device-matrices.mdx | 93 + .../src/content/docs/reference/schemas.mdx | 61 + .../docs/run-benchmarks/browserstack.mdx | 108 + .../src/content/docs/run-benchmarks/ci.mdx | 119 + .../content/docs/run-benchmarks/preflight.mdx | 92 + .../write-benchmarks/benchmark-functions.mdx | 91 + .../content/docs/write-benchmarks/quality.mdx | 70 + .../docs/write-benchmarks/setup-teardown.mdx | 84 + apps/docs/src/pages/404.astro | 12 + apps/docs/src/pages/[...slug].md.ts | 32 + apps/docs/src/scripts/analytics.ts | 39 + apps/docs/src/scripts/search-accessibility.ts | 38 + apps/docs/src/styles/mobench.css | 112 + apps/docs/tsconfig.json | 5 + apps/docs/vercel.json | 253 + apps/marketing/astro.config.mjs | 10 + apps/marketing/package.json | 24 + apps/marketing/public/favicon.svg | 1 + .../fonts/geist-latin-wght-normal.woff2 | Bin 0 -> 29400 bytes .../fonts/geist-mono-latin-wght-normal.woff2 | Bin 0 -> 29896 bytes .../public/hero/mobench-bench-320.png | Bin 0 -> 209652 bytes .../public/hero/mobench-bench-480.avif | Bin 0 -> 35750 bytes .../public/hero/mobench-bench-480.webp | Bin 0 -> 47444 bytes .../public/hero/mobench-bench-768.avif | Bin 0 -> 67777 bytes .../public/hero/mobench-bench-768.webp | Bin 0 -> 90136 bytes apps/marketing/public/llms.txt | 51 + apps/marketing/public/og/landing.png | Bin 0 -> 22248 bytes apps/marketing/public/og/landing.svg | 1 + apps/marketing/public/robots.txt | 4 + apps/marketing/src/layouts/BaseLayout.astro | 115 + apps/marketing/src/pages/404.astro | 13 + apps/marketing/src/pages/index.astro | 301 + apps/marketing/src/pages/privacy.astro | 13 + apps/marketing/src/scripts/analytics.ts | 24 + apps/marketing/src/styles/global.css | 294 + apps/marketing/tsconfig.json | 8 + apps/marketing/vercel.json | 353 + bun.lock | 1809 +++- components.json | 21 - docs/ARCHITECTURE.md | 46 + docs/AUTHORING.md | 62 + docs/DEPLOYMENT.md | 33 + docs/RELEASE_SYNC.md | 41 + docs/licenses/Geist-OFL.txt | 94 + index.html | 48 - lighthouserc.docs.cjs | 25 + lighthouserc.marketing.cjs | 25 + package-lock.json | 2636 ----- package.json | 62 +- packages/site-config/package.json | 10 + packages/site-config/src/index.ts | 22 + packages/site-config/tsconfig.json | 12 + packages/truth/README.md | 7 + packages/truth/fixtures/summary-basic.json | 84 + packages/truth/fixtures/summary-ffi.json | 84 + packages/truth/mobench-site-manifest-v1.json | 9063 +++++++++++++++++ packages/truth/package.json | 12 + packages/truth/pin.json | 10 + .../truth/schemas/ci-contract-v1.schema.json | 36 + .../mobench-site-manifest-v1.schema.json | 152 + packages/truth/schemas/summary-v1.schema.json | 75 + .../truth/schemas/trace-events-v1.schema.json | 59 + playwright.config.ts | 34 + scripts/generate-content.ts | 378 + scripts/generate-og-images.py | 240 - scripts/generate-og.ts | 90 + scripts/generate-route-html.mjs | 82 - scripts/sync-release.ts | 221 + scripts/validate-content.ts | 303 + src/components/app-head.tsx | 110 - src/components/code-highlight.tsx | 315 - src/components/icons.tsx | 37 - src/components/theme-toggle.tsx | 80 - src/components/ui/accordion.tsx | 61 - src/components/ui/button.tsx | 49 - src/lib/utils.ts | 6 - src/main.tsx | 27 - src/og-pages.json | 61 - src/routeTree.gen.ts | 95 - src/routes/$docSlug.tsx | 43 - src/routes/__root.tsx | 36 - src/routes/docs.tsx | 3625 ------- src/routes/index.tsx | 708 -- src/styles.css | 330 - src/vite-env.d.ts | 6 - tests/build-contracts.test.ts | 199 + .../visual.spec.ts/docs-404.png | Bin 0 -> 335743 bytes .../docs-cli-reference-desktop.png | Bin 0 -> 512486 bytes .../visual.spec.ts/docs-home-desktop.png | Bin 0 -> 627344 bytes .../visual.spec.ts/docs-mobile-navigation.png | Bin 0 -> 54761 bytes .../visual.spec.ts/docs-search-desktop.png | Bin 0 -> 89254 bytes .../visual.spec.ts/marketing-404.png | Bin 0 -> 420633 bytes .../visual.spec.ts/marketing-dark-mobile.png | Bin 0 -> 911588 bytes .../marketing-light-desktop.png | Bin 0 -> 1465165 bytes tests/e2e/surfaces.spec.ts | 147 + tests/e2e/visual.spec.ts | 44 + tsconfig.json | 25 +- vercel.json | 22 - vite.config.ts | 16 - 154 files changed, 28773 insertions(+), 8992 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/release-sync.yml create mode 100644 apps/docs/astro.config.mjs create mode 100644 apps/docs/package.json create mode 100644 apps/docs/public/favicon.svg create mode 100644 apps/docs/public/fixtures/summary-basic.json create mode 100644 apps/docs/public/fixtures/summary-ffi.json create mode 100644 apps/docs/public/fonts/geist-latin-wght-normal.woff2 create mode 100644 apps/docs/public/fonts/geist-mono-latin-wght-normal.woff2 create mode 100644 apps/docs/public/llms-full.txt create mode 100644 apps/docs/public/llms.txt create mode 100644 apps/docs/public/manifests/mobench-site-manifest-v1.json create mode 100644 apps/docs/public/og/basic-example.png create mode 100644 apps/docs/public/og/benchmark-functions.png create mode 100644 apps/docs/public/og/benchmark-quality.png create mode 100644 apps/docs/public/og/browserstack.png create mode 100644 apps/docs/public/og/ci.png create mode 100644 apps/docs/public/og/cli.png create mode 100644 apps/docs/public/og/compatibility.png create mode 100644 apps/docs/public/og/configuration.png create mode 100644 apps/docs/public/og/device-matrices.png create mode 100644 apps/docs/public/og/ffi-example.png create mode 100644 apps/docs/public/og/host-preflight.png create mode 100644 apps/docs/public/og/index.png create mode 100644 apps/docs/public/og/installation.png create mode 100644 apps/docs/public/og/outputs.png create mode 100644 apps/docs/public/og/profiling.png create mode 100644 apps/docs/public/og/quickstart.png create mode 100644 apps/docs/public/og/regressions.png create mode 100644 apps/docs/public/og/schemas.png create mode 100644 apps/docs/public/og/setup-teardown.png create mode 100644 apps/docs/public/og/troubleshooting.png create mode 100644 apps/docs/public/robots.txt create mode 100644 apps/docs/public/schemas/ci-contract-v1.schema.json create mode 100644 apps/docs/public/schemas/mobench-site-manifest-v1.schema.json create mode 100644 apps/docs/public/schemas/summary-v1.schema.json create mode 100644 apps/docs/public/schemas/trace-events-v1.schema.json create mode 100644 apps/docs/src/assets/logo.svg create mode 100644 apps/docs/src/components/Head.astro create mode 100644 apps/docs/src/components/PageTitle.astro create mode 100644 apps/docs/src/content.config.ts create mode 100644 apps/docs/src/content/docs/analyze-results/outputs.mdx create mode 100644 apps/docs/src/content/docs/analyze-results/profiling.mdx create mode 100644 apps/docs/src/content/docs/analyze-results/regressions.mdx create mode 100644 apps/docs/src/content/docs/examples/basic.mdx create mode 100644 apps/docs/src/content/docs/examples/ffi.mdx create mode 100644 apps/docs/src/content/docs/get-started/installation.mdx create mode 100644 apps/docs/src/content/docs/get-started/quickstart.mdx create mode 100644 apps/docs/src/content/docs/help/troubleshooting.mdx create mode 100644 apps/docs/src/content/docs/index.mdx create mode 100644 apps/docs/src/content/docs/reference/cli.mdx create mode 100644 apps/docs/src/content/docs/reference/compatibility.mdx create mode 100644 apps/docs/src/content/docs/reference/configuration.mdx create mode 100644 apps/docs/src/content/docs/reference/device-matrices.mdx create mode 100644 apps/docs/src/content/docs/reference/schemas.mdx create mode 100644 apps/docs/src/content/docs/run-benchmarks/browserstack.mdx create mode 100644 apps/docs/src/content/docs/run-benchmarks/ci.mdx create mode 100644 apps/docs/src/content/docs/run-benchmarks/preflight.mdx create mode 100644 apps/docs/src/content/docs/write-benchmarks/benchmark-functions.mdx create mode 100644 apps/docs/src/content/docs/write-benchmarks/quality.mdx create mode 100644 apps/docs/src/content/docs/write-benchmarks/setup-teardown.mdx create mode 100644 apps/docs/src/pages/404.astro create mode 100644 apps/docs/src/pages/[...slug].md.ts create mode 100644 apps/docs/src/scripts/analytics.ts create mode 100644 apps/docs/src/scripts/search-accessibility.ts create mode 100644 apps/docs/src/styles/mobench.css create mode 100644 apps/docs/tsconfig.json create mode 100644 apps/docs/vercel.json create mode 100644 apps/marketing/astro.config.mjs create mode 100644 apps/marketing/package.json create mode 100644 apps/marketing/public/favicon.svg create mode 100644 apps/marketing/public/fonts/geist-latin-wght-normal.woff2 create mode 100644 apps/marketing/public/fonts/geist-mono-latin-wght-normal.woff2 create mode 100644 apps/marketing/public/hero/mobench-bench-320.png create mode 100644 apps/marketing/public/hero/mobench-bench-480.avif create mode 100644 apps/marketing/public/hero/mobench-bench-480.webp create mode 100644 apps/marketing/public/hero/mobench-bench-768.avif create mode 100644 apps/marketing/public/hero/mobench-bench-768.webp create mode 100644 apps/marketing/public/llms.txt create mode 100644 apps/marketing/public/og/landing.png create mode 100644 apps/marketing/public/og/landing.svg create mode 100644 apps/marketing/public/robots.txt create mode 100644 apps/marketing/src/layouts/BaseLayout.astro create mode 100644 apps/marketing/src/pages/404.astro create mode 100644 apps/marketing/src/pages/index.astro create mode 100644 apps/marketing/src/pages/privacy.astro create mode 100644 apps/marketing/src/scripts/analytics.ts create mode 100644 apps/marketing/src/styles/global.css create mode 100644 apps/marketing/tsconfig.json create mode 100644 apps/marketing/vercel.json delete mode 100644 components.json create mode 100644 docs/ARCHITECTURE.md create mode 100644 docs/AUTHORING.md create mode 100644 docs/DEPLOYMENT.md create mode 100644 docs/RELEASE_SYNC.md create mode 100644 docs/licenses/Geist-OFL.txt delete mode 100644 index.html create mode 100644 lighthouserc.docs.cjs create mode 100644 lighthouserc.marketing.cjs delete mode 100644 package-lock.json create mode 100644 packages/site-config/package.json create mode 100644 packages/site-config/src/index.ts create mode 100644 packages/site-config/tsconfig.json create mode 100644 packages/truth/README.md create mode 100644 packages/truth/fixtures/summary-basic.json create mode 100644 packages/truth/fixtures/summary-ffi.json create mode 100644 packages/truth/mobench-site-manifest-v1.json create mode 100644 packages/truth/package.json create mode 100644 packages/truth/pin.json create mode 100644 packages/truth/schemas/ci-contract-v1.schema.json create mode 100644 packages/truth/schemas/mobench-site-manifest-v1.schema.json create mode 100644 packages/truth/schemas/summary-v1.schema.json create mode 100644 packages/truth/schemas/trace-events-v1.schema.json create mode 100644 playwright.config.ts create mode 100644 scripts/generate-content.ts delete mode 100644 scripts/generate-og-images.py create mode 100644 scripts/generate-og.ts delete mode 100644 scripts/generate-route-html.mjs create mode 100644 scripts/sync-release.ts create mode 100644 scripts/validate-content.ts delete mode 100644 src/components/app-head.tsx delete mode 100644 src/components/code-highlight.tsx delete mode 100644 src/components/icons.tsx delete mode 100644 src/components/theme-toggle.tsx delete mode 100644 src/components/ui/accordion.tsx delete mode 100644 src/components/ui/button.tsx delete mode 100644 src/lib/utils.ts delete mode 100644 src/main.tsx delete mode 100644 src/og-pages.json delete mode 100644 src/routeTree.gen.ts delete mode 100644 src/routes/$docSlug.tsx delete mode 100644 src/routes/__root.tsx delete mode 100644 src/routes/docs.tsx delete mode 100644 src/routes/index.tsx delete mode 100644 src/styles.css delete mode 100644 src/vite-env.d.ts create mode 100644 tests/build-contracts.test.ts create mode 100644 tests/e2e/__screenshots__/visual.spec.ts/docs-404.png create mode 100644 tests/e2e/__screenshots__/visual.spec.ts/docs-cli-reference-desktop.png create mode 100644 tests/e2e/__screenshots__/visual.spec.ts/docs-home-desktop.png create mode 100644 tests/e2e/__screenshots__/visual.spec.ts/docs-mobile-navigation.png create mode 100644 tests/e2e/__screenshots__/visual.spec.ts/docs-search-desktop.png create mode 100644 tests/e2e/__screenshots__/visual.spec.ts/marketing-404.png create mode 100644 tests/e2e/__screenshots__/visual.spec.ts/marketing-dark-mobile.png create mode 100644 tests/e2e/__screenshots__/visual.spec.ts/marketing-light-desktop.png create mode 100644 tests/e2e/surfaces.spec.ts create mode 100644 tests/e2e/visual.spec.ts delete mode 100644 vercel.json delete mode 100644 vite.config.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..2b5b285 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,43 @@ +name: Site acceptance + +on: + pull_request: + push: + branches: [main] + +permissions: + contents: read + +jobs: + acceptance: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: oven-sh/setup-bun@v2 + with: + bun-version: 1.3.13 + - name: Install workspace + run: bun install --frozen-lockfile + - name: Content, types, generation, and static contracts + run: | + bun run check + bun run test + - name: Install browser + run: | + bunx playwright install --with-deps chromium + echo "CHROME_PATH=$(bun -e 'import { chromium } from "playwright"; console.log(chromium.executablePath())')" >> "$GITHUB_ENV" + - name: Browser, accessibility, and visual acceptance + run: bun run test:e2e + - name: Lighthouse budgets + run: bun run test:lighthouse + - name: Diff hygiene + run: git diff --check + - name: Upload browser diagnostics + if: failure() + uses: actions/upload-artifact@v4 + with: + name: playwright-diagnostics + path: | + playwright-report + test-results + if-no-files-found: ignore diff --git a/.github/workflows/release-sync.yml b/.github/workflows/release-sync.yml new file mode 100644 index 0000000..ef0b328 --- /dev/null +++ b/.github/workflows/release-sync.yml @@ -0,0 +1,108 @@ +name: Mobench release sync + +on: + schedule: + - cron: '23 7 * * *' + workflow_dispatch: + inputs: + tag: + description: Optional explicit stable tag; defaults to the latest release + required: false + type: string + +permissions: + contents: write + pull-requests: write + +concurrency: + group: mobench-release-sync + cancel-in-progress: false + +jobs: + update: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: oven-sh/setup-bun@v2 + with: + bun-version: 1.3.13 + + - name: Resolve stable release and checksum + id: release + env: + GH_TOKEN: ${{ github.token }} + REQUESTED_TAG: ${{ inputs.tag }} + run: | + tag="$REQUESTED_TAG" + if [ -z "$tag" ]; then + tag="$(gh api repos/worldcoin/mobile-bench-rs/releases/latest --jq '.tag_name')" + fi + current="$(bun -e 'console.log((await Bun.file("packages/truth/pin.json").json()).release)')" + if [ "$tag" = "$current" ]; then + echo "update=false" >> "$GITHUB_OUTPUT" + exit 0 + fi + checksum_dir="$(mktemp -d)" + gh release download "$tag" \ + --repo worldcoin/mobile-bench-rs \ + --pattern 'mobench-site-manifest-v1.json.sha256' \ + --dir "$checksum_dir" + expected="$(awk '{print $1}' "$checksum_dir/mobench-site-manifest-v1.json.sha256")" + if ! printf '%s' "$expected" | grep -Eq '^[0-9a-f]{64}$'; then + echo "Release checksum asset is invalid" >&2 + exit 1 + fi + echo "update=true" >> "$GITHUB_OUTPUT" + echo "tag=$tag" >> "$GITHUB_OUTPUT" + echo "version=${tag#v}" >> "$GITHUB_OUTPUT" + echo "checksum=$expected" >> "$GITHUB_OUTPUT" + + - name: Install workspace + if: steps.release.outputs.update == 'true' + run: bun install --frozen-lockfile + + - name: Sync pinned release + if: steps.release.outputs.update == 'true' + env: + GH_TOKEN: ${{ github.token }} + run: | + bun run sync:release -- \ + --tag "${{ steps.release.outputs.tag }}" \ + --expected-manifest-sha256 "${{ steps.release.outputs.checksum }}" + bun install + bun run generate + + - name: Validate update + if: steps.release.outputs.update == 'true' + run: | + bun run check + bun run test + git diff --check + + - name: Open update pull request + if: steps.release.outputs.update == 'true' + env: + GH_TOKEN: ${{ github.token }} + TAG: ${{ steps.release.outputs.tag }} + VERSION: ${{ steps.release.outputs.version }} + run: | + if git diff --quiet; then + exit 0 + fi + branch="automation/mobench-release-$VERSION" + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git switch -c "$branch" + git add .github apps docs packages scripts tests README.md bun.lock package.json + git commit -m "chore: sync mobench $TAG truth contract" + git push --force-with-lease origin "$branch" + existing="$(gh pr list --head "$branch" --state open --json url --jq '.[0].url // empty')" + if [ -z "$existing" ]; then + gh pr create \ + --head "$branch" \ + --title "chore: sync mobench $TAG truth contract" \ + --body "Pins the tested $TAG release manifest, schemas, fixtures, generated references, and route-independent release copy. Preview deployment and E2E checks remain required before merge." + fi diff --git a/.gitignore b/.gitignore index 139c0f7..6e5816e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ node_modules dist +.astro .DS_Store *.local .vercel @@ -7,3 +8,7 @@ dist .env.* !.env.example .design-src +playwright-report +test-results +.lighthouseci +*.tsbuildinfo diff --git a/README.md b/README.md index 8838034..ae8233d 100644 --- a/README.md +++ b/README.md @@ -1,41 +1,61 @@ # mobench.org -Marketing site and documentation for **mobench** (`mobile-bench-rs`) — an open-source Rust -benchmarking harness that runs your benchmarks on real iOS and Android phones and reports -wall-clock time, peak memory, and energy. Built by [World](https://world.org). +The public website for [mobench](https://github.com/worldcoin/mobile-bench-rs), a Rust toolkit for building mobile benchmark runners, executing ordinary benchmark suites on BrowserStack devices, and producing stable CI reports. The repository publishes two static Astro sites: -## Stack +- `mobench.org` — product education and task entry points. +- `docs.mobench.org` — Starlight documentation, search, references, and examples. -- [TanStack Router](https://tanstack.com/router) (file-based routing, SPA) -- [Vite](https://vite.dev) + React + TypeScript -- [Tailwind CSS v4](https://tailwindcss.com) -- [shadcn/ui](https://ui.shadcn.com) primitives (Button, Accordion) +The current stable documentation targets `mobench 0.1.43`. Use the `mobench` executable in published commands. The `cargo mobench` wrapper is not a supported documentation entry point until its upstream argument-forwarding fix is released and smoke-tested. -## Routes +## Workspace -| Path | Source | Description | -| ------- | ----------------------- | ------------------------------------------------------- | -| `/` | `src/routes/index.tsx` | Landing page — hero, features, benchmarks, FAQ, CTA. | -| `/docs` | `src/routes/docs.tsx` | Documentation app — sidebar nav, 8 pages, right-rail TOC. | +```text +apps/ + marketing/ Astro marketing site + docs/ Astro Starlight documentation site +packages/ + truth/ Pinned upstream manifest, schema snapshots, and checksums +scripts/ Content, command, routing, and release-sync validation +docs/ Authoring, architecture, release, and deployment runbooks +``` -Both pages were imported from the Claude Design project *Mobile Bench landing page design* -(`Mobench Landing.dc.html`, `Mobench Docs.dc.html`) and reimplemented as React. +Both applications render complete HTML at build time. JavaScript is reserved for progressive enhancements such as theme selection, mobile navigation, search, and copy controls. ## Develop +Install [Bun](https://bun.sh/) and Rust only if you are validating upstream examples. + ```bash -npm install -npm run dev # http://localhost:3000 +bun install --frozen-lockfile +bun run dev:marketing # http://localhost:3000 +bun run dev:docs # http://localhost:3001 ``` -## Build +Do not use npm, pnpm, or Yarn in this repository. + +## Validate ```bash -npm run build # outputs to dist/ -npm run serve # preview the production build +bun run check +bun run test +bun run build +bun run test:e2e ``` +The checks validate MDX frontmatter, aliases, CLI and configuration snippets, upstream version alignment, internal links, generated `llms` files, redirect contracts, static routes, accessibility, and performance budgets. See [Authoring](docs/AUTHORING.md) and [Release sync](docs/RELEASE_SYNC.md) before changing product claims or reference material. + ## Deploy -Configured for [Vercel](https://vercel.com) (`vercel.json`): framework preset `vite`, SPA -rewrites so client-side routes resolve to `index.html`. +Create two Vercel projects from this repository, with root directories `apps/marketing` and `apps/docs`. The marketing project owns only marketing routes; the docs project owns only canonical documentation routes. Cross-host duplicates and legacy aliases must return redirects, not duplicate pages. + +Preview both projects before production and follow [Deployment and smoke checks](docs/DEPLOYMENT.md). Keep the preceding production deployments available for rollback. + +## Source of truth + +CLI flags, configuration keys, artifact names, schemas, and capability statements originate in the versioned `mobench-site-manifest-v1.json` release asset generated by `mobile-bench-rs`. This repository pins a release tag, commit SHA, manifest checksum, and schema snapshot. Upstream changes arrive through reviewed update pull requests; production builds never fetch `main`. + +To prepare a release update manually, use `bun run sync:release -- --help`. The command requires an explicit tag and trusted manifest checksum; the scheduled watcher uses the same path and opens a review branch rather than updating production directly. + +## License + +[MIT](LICENSE) diff --git a/apps/docs/astro.config.mjs b/apps/docs/astro.config.mjs new file mode 100644 index 0000000..44abf4a --- /dev/null +++ b/apps/docs/astro.config.mjs @@ -0,0 +1,86 @@ +import { defineConfig } from 'astro/config' +import sitemap from '@astrojs/sitemap' +import starlight from '@astrojs/starlight' + +const repository = 'https://github.com/worldcoin/mobile-bench-rs' + +export default defineConfig({ + site: 'https://docs.mobench.org', + output: 'static', + integrations: [ + starlight({ + title: 'mobench docs', + disable404Route: true, + description: 'Build, run, and analyze Rust benchmarks on mobile targets.', + favicon: '/favicon.svg', + logo: { + src: './src/assets/logo.svg', + alt: 'mobench', + }, + social: [ + { icon: 'github', label: 'GitHub', href: repository }, + ], + editLink: { + baseUrl: 'https://github.com/worldfnd/mobench.org/edit/main/apps/docs/', + }, + lastUpdated: true, + customCss: ['./src/styles/mobench.css'], + components: { + Head: './src/components/Head.astro', + PageTitle: './src/components/PageTitle.astro', + }, + sidebar: [ + { label: 'Get started', items: [ + { label: 'Installation', slug: 'installation' }, + { label: 'Quickstart', slug: 'quickstart' }, + ] }, + { label: 'Write benchmarks', items: [ + { label: 'Benchmark functions', slug: 'benchmark-functions' }, + { label: 'Setup and teardown', slug: 'setup-teardown' }, + { label: 'Benchmark quality', slug: 'benchmark-quality' }, + ] }, + { label: 'Run benchmarks', items: [ + { label: 'Host-side preflight', slug: 'host-preflight' }, + { label: 'BrowserStack devices', slug: 'browserstack' }, + { label: 'CI runs', slug: 'ci' }, + ] }, + { label: 'Analyze results', items: [ + { label: 'Outputs and metrics', slug: 'outputs' }, + { label: 'Regression comparison', slug: 'regressions' }, + { label: 'Local native profiling', slug: 'profiling' }, + ] }, + { label: 'Reference', items: [ + { label: 'CLI', slug: 'cli' }, + { label: 'Configuration', slug: 'configuration' }, + { label: 'Device matrices', slug: 'device-matrices' }, + { label: 'Output schemas', slug: 'schemas' }, + { label: 'Compatibility', slug: 'compatibility' }, + ] }, + { label: 'Examples', items: [ + { label: 'Basic benchmark', slug: 'basic-example' }, + { label: 'FFI benchmark', slug: 'ffi-example' }, + ] }, + { label: 'Help', items: [ + { label: 'Troubleshooting', slug: 'troubleshooting' }, + ] }, + ], + head: [ + { + tag: 'script', + attrs: { type: 'application/ld+json' }, + content: JSON.stringify({ + '@context': 'https://schema.org', + '@type': 'SoftwareSourceCode', + name: 'mobench', + codeRepository: repository, + programmingLanguage: 'Rust', + runtimePlatform: ['Android', 'iOS'], + }), + }, + ], + }), + sitemap(), + ], + build: { format: 'directory' }, + compressHTML: true, +}) diff --git a/apps/docs/package.json b/apps/docs/package.json new file mode 100644 index 0000000..423c168 --- /dev/null +++ b/apps/docs/package.json @@ -0,0 +1,24 @@ +{ + "name": "@mobench/docs", + "version": "1.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "astro dev --port 3001", + "build": "astro build", + "check": "astro check", + "preview": "astro preview --port 3001" + }, + "dependencies": { + "@astrojs/sitemap": "^3.7.3", + "@astrojs/starlight": "^0.41.3", + "@mobench/site-config": "workspace:*", + "@vercel/analytics": "2.0.1", + "astro": "7.0.6", + "sharp": "0.35.3" + }, + "devDependencies": { + "@astrojs/check": "^0.9.6", + "typescript": "^6.0.3" + } +} diff --git a/apps/docs/public/favicon.svg b/apps/docs/public/favicon.svg new file mode 100644 index 0000000..9248cc3 --- /dev/null +++ b/apps/docs/public/favicon.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/public/fixtures/summary-basic.json b/apps/docs/public/fixtures/summary-basic.json new file mode 100644 index 0000000..ff47d09 --- /dev/null +++ b/apps/docs/public/fixtures/summary-basic.json @@ -0,0 +1,84 @@ +{ + "summary": { + "generated_at": "2026-03-26T00:00:00Z", + "generated_at_unix": 1774483200, + "target": "android", + "function": "multiple", + "iterations": 5, + "warmup": 1, + "devices": [ + "Google Pixel 8-14.0", + "Samsung Galaxy S23-14.0" + ], + "device_summaries": [ + { + "device": "Google Pixel 8-14.0", + "benchmarks": [ + { + "function": "basic_benchmark::bench_fibonacci", + "samples": 5, + "mean_ns": 100000000, + "median_ns": 100000000, + "p95_ns": 105000000, + "min_ns": 95000000, + "max_ns": 105000000 + }, + { + "function": "basic_benchmark::bench_checksum", + "samples": 5, + "mean_ns": 145000000, + "median_ns": 145000000, + "p95_ns": 151000000, + "min_ns": 140000000, + "max_ns": 151000000 + } + ] + }, + { + "device": "Samsung Galaxy S23-14.0", + "benchmarks": [ + { + "function": "basic_benchmark::bench_fibonacci", + "samples": 5, + "mean_ns": 94000000, + "median_ns": 94000000, + "p95_ns": 98000000, + "min_ns": 90000000, + "max_ns": 98000000 + }, + { + "function": "basic_benchmark::bench_checksum", + "samples": 5, + "mean_ns": 136000000, + "median_ns": 136000000, + "p95_ns": 140000000, + "min_ns": 132000000, + "max_ns": 140000000 + } + ] + } + ] + }, + "benchmark_results": { + "Google Pixel 8-14.0": [ + { + "function": "basic_benchmark::bench_fibonacci", + "samples": [95000000, 98000000, 100000000, 102000000, 105000000] + }, + { + "function": "basic_benchmark::bench_checksum", + "samples": [140000000, 142000000, 145000000, 147000000, 151000000] + } + ], + "Samsung Galaxy S23-14.0": [ + { + "function": "basic_benchmark::bench_fibonacci", + "samples": [90000000, 92000000, 94000000, 96000000, 98000000] + }, + { + "function": "basic_benchmark::bench_checksum", + "samples": [132000000, 134000000, 136000000, 138000000, 140000000] + } + ] + } +} diff --git a/apps/docs/public/fixtures/summary-ffi.json b/apps/docs/public/fixtures/summary-ffi.json new file mode 100644 index 0000000..be49897 --- /dev/null +++ b/apps/docs/public/fixtures/summary-ffi.json @@ -0,0 +1,84 @@ +{ + "summary": { + "generated_at": "2026-03-26T00:00:00Z", + "generated_at_unix": 1774483200, + "target": "android", + "function": "multiple", + "iterations": 5, + "warmup": 1, + "devices": [ + "Google Pixel 8 Pro-14.0", + "OnePlus 12-14.0" + ], + "device_summaries": [ + { + "device": "Google Pixel 8 Pro-14.0", + "benchmarks": [ + { + "function": "ffi_benchmark::bench_fibonacci", + "samples": 5, + "mean_ns": 112000000, + "median_ns": 112000000, + "p95_ns": 118000000, + "min_ns": 108000000, + "max_ns": 118000000 + }, + { + "function": "ffi_benchmark::bench_checksum", + "samples": 5, + "mean_ns": 159000000, + "median_ns": 159000000, + "p95_ns": 165000000, + "min_ns": 154000000, + "max_ns": 165000000 + } + ] + }, + { + "device": "OnePlus 12-14.0", + "benchmarks": [ + { + "function": "ffi_benchmark::bench_fibonacci", + "samples": 5, + "mean_ns": 103000000, + "median_ns": 103000000, + "p95_ns": 107000000, + "min_ns": 99000000, + "max_ns": 107000000 + }, + { + "function": "ffi_benchmark::bench_checksum", + "samples": 5, + "mean_ns": 149000000, + "median_ns": 149000000, + "p95_ns": 153000000, + "min_ns": 145000000, + "max_ns": 153000000 + } + ] + } + ] + }, + "benchmark_results": { + "Google Pixel 8 Pro-14.0": [ + { + "function": "ffi_benchmark::bench_fibonacci", + "samples": [108000000, 110000000, 112000000, 114000000, 118000000] + }, + { + "function": "ffi_benchmark::bench_checksum", + "samples": [154000000, 156000000, 159000000, 161000000, 165000000] + } + ], + "OnePlus 12-14.0": [ + { + "function": "ffi_benchmark::bench_fibonacci", + "samples": [99000000, 101000000, 103000000, 105000000, 107000000] + }, + { + "function": "ffi_benchmark::bench_checksum", + "samples": [145000000, 147000000, 149000000, 151000000, 153000000] + } + ] + } +} diff --git a/apps/docs/public/fonts/geist-latin-wght-normal.woff2 b/apps/docs/public/fonts/geist-latin-wght-normal.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..991445d78ae619a7378ff219385588c7811c88ab GIT binary patch literal 29400 zcmV)2K+L~)Pew8T0RR910CLy>6aWAK0RadA0CHjg0RR9100000000000000000000 z0000Qh6NjepB@~COg~6gK~jfXKTTFaQalD=KT}jeRDn1Eg%B@(5eN$QXx<|WghBu? zfv9K!HUcCAi2wv31&A64i%ARz8zS))Y*%BTp1|g%HJ8sbD%h@O+zv$4`n_s4!iJ3l zAl@7k{eMzY8AB7;lNO*l-R=*yWFwRsIf8~9GL0FjwPHg^@2WWFJlFf012?ihsP#qZ z`;kyPGs$e>Hzyupcl@oUYGa#9SVz!vuHm}znb*V>SP;aAF)%QlYFJI3FdKLK;o9Vm zL%sj3B9mWq;uIuOmskyHi7k;>(vv|E#`_|7Mc32Pk68q`P5g+29AAWr)~F(~disD- z5k1a6Is!+ekc4EGfX3YEm(Rih&k@b}KYJIwgd~IzLI~mT03n#AG?)b~MN(7(MZA

6yP-h*_UmWm>FB3IQU-1<}Iu{JlGWR<|)Z;EicO6DLr(A24;o z|0kXHy+I8KZ5c3%1D~?{4;Z`axhXP|kBj!oYnsoT1z>N$abyxS0Js^?qnz4|p)g~W zFi>Jxa3m)(Pys-F-N{7^VhI2eotQ_fAzGgel1Xjype6J*v<*o;?cWPxwlc#qI>O`v zgQ$Q!;@VF6eLAaOUEQLV*fQ;S$S||JK1BOn5M3B{Nty$K2q;6~__F)ooPK{LOOE3} zfj~?3(+L@Y9 z3zQ-Wp?~D|Ac92lwycGr-1ZCLpMY3vCY{t7N+DL31CN1_-%Joanp-FhGO^FhP`~~B zuVpFicmI0BD2~#ul&7SYc9cT#6_S_^5Je;?b~C-Bxxam*ko!`eljN8$ug;l;NXN0=^j2RkmXrBN76Bkk-Mly*c9;2}Myf({r{APW?3Lq8@0KYy(h4zJD*em<^1lqnS~i>l zFI28wx{HflfY@CS(gGy!7OS)XdFO@V2SuMiQt}btMN*!TLrio^A0U16Nu8`^I3J{Q z2%%^~$eoMQO`ogUMWu03d9Elsmyw>woA|)2cboLBzyi!-r{Et;u~)_AQ}=L53m{f=Ce83*GPL_fsnx zGP*{x4+$y~WeEhSB_{RV*S!O?Vk)fzExU7}3*h6`-wWXi080U%0M25g2$^?|=TyZ$J4i&9|nVX;K^$AC&Hto|M1y%e%imq%G?y z{Tlsx{SN&;W6oGKmW^vnH%^*qbKZ*Eh#j}*>;>m0=T_%-=Wgd7=Lr|t5BFF1lzscb z>VAB`xL>N+$2%3d60D>ueU<(ycGx={9Bx&Gs<*0EwHh{gbS+SmYf3GBU^{x;LAd^9 zYubuioTD^I!?d5S*QGv`VW3|NvDW22GK+lDzQ5UCpftNVL1r}K0$RfOgJdA}TBbY|W zQ_vXc(k0C(Wfs$X>`(mEpZS?j#mz)3m<3rNgpaQfd&x#pPnt

4xJl4d-DN79mrX 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 literal 0 HcmV?d00001 diff --git a/apps/docs/public/llms-full.txt b/apps/docs/public/llms-full.txt new file mode 100644 index 0000000..9478acf --- /dev/null +++ b/apps/docs/public/llms-full.txt @@ -0,0 +1,1928 @@ +# mobench documentation — full authored text + +Release: 0.1.43 +Canonical origin: https://docs.mobench.org/ + +# Outputs and metrics + +Canonical URL: https://docs.mobench.org/outputs/ +Description: Understand mobench JSON, Markdown, CSV, plots, and optional resource values. +Source: BrowserStack metrics guide — https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/docs/guides/browserstack-metrics.md — Timing fields, resource columns, sources, and missing-value semantics. + +Normal runs can write a JSON report with `--output`. CI runs always normalize results into a three-file contract, with plots when available. + +## CI contract + +| Path | Intended use | +| --- | --- | +| `summary.json` | Machine-readable results, metadata, baselines, and integrations | +| `summary.md` | Human review and CI job summaries | +| `results.csv` | Tables, notebooks, and external analysis | +| `plots/*.svg` | Optional visual summaries when plot rendering is available | + +Generate the contract with an explicit directory: + +```bash +mobench ci run \ + --target android \ + --function bench_mobile::checksum \ + --local-only \ + --plots auto \ + --output-dir target/mobench/ci +``` + +The example uses the host harness to demonstrate files; it does not produce mobile measurements. + +## Timing fields + +Results include a sample count and timing statistics such as: + +- `mean_ns` +- `median_ns` +- `p95_ns` +- `min_ns` +- `max_ns` + +Raw sample durations live in JSON where the report contract provides them. Compare nanosecond values as numbers; format units only at the presentation layer. + +## Optional resource fields + +CSV and summary data can include: + +- `cpu_total_ms` +- `cpu_median_ms` +- `peak_memory_kb` +- `peak_memory_growth_kb` +- `process_peak_memory_kb` + +These values depend on the runner, platform, device, and provider data. A blank CSV cell or absent JSON field means **unavailable**, not zero. Keep missing values out of averages and regression gates that assume measured data. + +## Inspect and render + +```bash +mobench summary target/mobench/results.json +mobench summary --format json target/mobench/results.json +mobench summary --format csv target/mobench/results.json +``` + +Render Markdown from a CI summary: + +```bash +mobench report summarize \ + --summary target/mobench/ci/summary.json \ + --plots auto +``` + +## Next step + +Store a representative `summary.json`, then configure [regression comparison](/regressions/). + +# Regression comparison + +Canonical URL: https://docs.mobench.org/regressions/ +Description: Compare compatible mobench summaries and gate meaningful slowdowns. +Source: BrowserStack CI guide — https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/docs/guides/browserstack-ci.md — Baseline sources, thresholds, JUnit output, and compare behavior. + +Regression checks compare candidate timing summaries with a stored baseline. They are meaningful only when the benchmark, device, OS, build mode, and run counts are compatible. + +## Compare existing files + +```bash +mobench compare \ + --baseline baselines/android-summary.json \ + --candidate target/mobench/ci/summary.json \ + --output target/mobench/ci/comparison.md +``` + +Review the Markdown report before turning a threshold into a required check. + +## Compare during CI + +```bash +mobench ci run \ + --target android \ + --function bench_mobile::checksum \ + --devices "Google Pixel 7-13.0" \ + --baseline artifact:baselines/android-summary.json \ + --regression-threshold-pct 5 \ + --junit target/mobench/ci/junit.xml \ + --release \ + --output-dir target/mobench/ci +``` + +Baseline sources accept a local path, URL, or `artifact:` form. If a baseline resolves to the same path as the candidate output, mobench snapshots the previous file before writing the new result. + +## Choose a threshold + +Start with observed device-to-device and run-to-run variation rather than an arbitrary percentage. A good gate: + +- compares the same device and OS +- uses the same release profile and runner backend +- keeps iteration and warmup counts stable +- ignores unavailable resource values +- is rerun when a candidate sits near the threshold + +A single noisy result is a prompt to investigate, not proof of a code regression. + +## Publish results + +Render or publish a sticky pull-request comment from the standard summary: + +```bash +mobench report github \ + --pr 123 \ + --summary target/mobench/ci/summary.json \ + --publish +``` + +The default marker is ``, allowing later runs to update the same comment. + +## Next step + +When timing shows a repeatable slowdown, use [local profiling](/profiling/) to locate the hot path. + +# Local native profiling + +Canonical URL: https://docs.mobench.org/profiling/ +Description: Capture Android and iOS native stacks and compare profile manifests locally. +Source: Profiling guide — https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/docs/guides/profiling.md — Capability matrix, commands, requirements, and artifact layout. + +Profiling is separate from repeated benchmark timing. Use it after a slowdown is reproducible and you need native stacks, flamegraphs, or semantic phase detail. + +## Supported combinations + +| Provider | Backend | Behavior in 0.1.43 | +| --- | --- | --- | +| `local` | `android-native` | Attempts `simpleperf` capture, symbolization, folded stacks, reports, and flamegraphs | +| `local` | `ios-instruments` | Attempts simulator-host `sample` capture, folded stacks, reports, and flamegraphs | +| `local` | `rust-tracing` | Writes a planned manifest/trace contract; native capture is not implemented | +| `browserstack` | Any native backend | Unsupported | + +BrowserStack benchmark runs may still contain timing and resource metrics. They do not provide retrievable native stack artifacts in this release. + +## Profile Android locally + +Requirements include `adb`, an Android NDK, `simpleperf`, NDK `llvm-addr2line`, and a local device or emulator. + +```bash +mobench profile run \ + --target android \ + --provider local \ + --backend android-native \ + --function bench_mobile::checksum \ + --output-dir target/mobench/profile \ + --trace-events-output target/mobench/profile/trace-events.json +``` + +## Profile iOS locally + +The current backend uses macOS `sample` against an iOS simulator-host process. It requires macOS, Xcode command-line tools, `xcrun`, `simctl`, and an installed simulator runtime. + +```bash +mobench profile run \ + --target ios \ + --provider local \ + --backend ios-instruments \ + --function bench_mobile::checksum \ + --output-dir target/mobench/profile +``` + +Use Xcode Instruments directly for deeper real-device investigations. + +## Read the bundle + +Common outputs include: + +- `profile.json` +- `summary.md` +- `artifacts/raw/…` +- `artifacts/processed/stacks.folded` +- `artifacts/processed/native-report.txt` +- `artifacts/processed/flamegraph.full.svg` +- `artifacts/processed/flamegraph.focused.svg` +- `artifacts/processed/flamegraph.html` +- `artifacts/semantic/phases.json` when phase data exists + +Render a manifest: + +```bash +mobench profile summarize \ + --profile target/mobench/profile/profile.json +``` + +## Compare two profiles + +```bash +mobench profile diff \ + --baseline target/mobench/profile/baseline/profile.json \ + --candidate target/mobench/profile/candidate/profile.json \ + --normalize +``` + +In differential Inferno flamegraphs, red is hotter in the candidate and blue is hotter in the baseline. + +## Next step + +Open `flamegraph.html`, confirm the capture status in `profile.json`, and correlate hot frames with the timing regression. + +# Basic benchmark crate + +Canonical URL: https://docs.mobench.org/basic-example/ +Description: Follow the minimal SDK example from registration to host and mobile execution. +Source: Basic benchmark example — https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/examples/basic-benchmark/README.md — Minimal crate setup, registered functions, tests, and run commands. + +The upstream `examples/basic-benchmark` crate is the smallest complete integration. It registers two realistic workloads, exposes mobile entrypoints, and keeps deterministic fixture output for tests. + +## Cargo setup + +```toml +[lib] +name = "basic_benchmark" +crate-type = ["lib", "cdylib", "staticlib"] + +[dependencies] +mobench-sdk = { version = "0.1.43", default-features = false, features = ["registry"] } +inventory = "0.3" +serde = { version = "1", features = ["derive"] } +thiserror = "1" +uniffi = { version = "0.28", features = ["cli"] } +``` + +Use dependency versions compatible with your lockfile; the key mobench requirement is matching the `0.1.43` SDK line. + +## Benchmark functions + +```rust +use mobench_sdk::benchmark; + +#[benchmark] +pub fn bench_checksum() { + let bytes = std::hint::black_box(&INPUT); + let result = checksum_sweep(bytes, 8 * 1024, 2_048); + std::hint::black_box(result); +} +``` + +The upstream example uses deterministic, nontrivial input and enough repeated work to avoid a benchmark dominated by timer noise. + +## Test and discover + +From a checkout of `mobile-bench-rs`: + +```bash +cargo test -p basic-benchmark +mobench list --crate-path examples/basic-benchmark +``` + +Host-side preflight: + +```bash +mobench run \ + --crate-path examples/basic-benchmark \ + --target android \ + --function basic_benchmark::bench_fibonacci \ + --local-only +``` + +This validates the host harness only. For a mobile result, add an exact BrowserStack device and `--release`: + +```bash +mobench run \ + --crate-path examples/basic-benchmark \ + --target android \ + --function basic_benchmark::bench_fibonacci \ + --devices "Google Pixel 7-13.0" \ + --release \ + --output target/mobench/results.json +``` + +## Next step + +Copy the crate structure, replace one benchmark at a time, and confirm each new name with `mobench list`. + +# FFI benchmark crate + +Canonical URL: https://docs.mobench.org/ffi-example/ +Description: Expose mobench benchmarks through UniFFI, the native C ABI, or BoltFFI. +Source: FFI benchmark example — https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/examples/ffi-benchmark/README.md — UniFFI types, native C ABI export, BoltFFI bridge, tests, and run flow. + +The upstream `examples/ffi-benchmark` crate shows the full boundary between Rust benchmark registration and generated Kotlin or Swift runners. Start with the basic example unless your project needs custom cross-language types. + +## Default UniFFI path + +The compatibility backend serializes benchmark request and report types through generated UniFFI bindings. A crate can expose an entrypoint like: + +```rust +#[derive(uniffi::Record)] +pub struct BenchSpec { + pub name: String, + pub iterations: u32, + pub warmup: u32, +} + +uniffi::setup_scaffolding!(); + +#[uniffi::export] +pub fn run_benchmark(spec: BenchSpec) -> Result { + let sdk_spec = mobench_sdk::BenchSpec { + name: spec.name, + iterations: spec.iterations, + warmup: spec.warmup, + }; + Ok(mobench_sdk::run_benchmark(sdk_spec)?.into()) +} +``` + +The SDK also provides FFI-oriented types that can replace custom records for simpler projects. + +## Native C ABI path + +Configure `ffi_backend = "native-c-abi"` when generated runners should call the SDK's JSON C ABI directly: + +```rust +mobench_sdk::export_native_c_abi!(); +``` + +The generated runner calls `mobench_run_benchmark_json` and returns Rust-owned buffers through `mobench_free_buf`. Never free or reuse those buffers through another allocator. + +## BoltFFI path + +Projects using BoltFFI can expose the same JSON bridge: + +```rust +#[boltffi::export] +pub fn run_benchmark_json(spec_json: &str) -> Result { + let spec = serde_json::from_str(spec_json).map_err(|error| error.to_string())?; + let report = run_benchmark(spec).map_err(|error| error.to_string())?; + serde_json::to_string(&report).map_err(|error| error.to_string()) +} +``` + +Set `ffi_backend = "boltffi"` and ensure the BoltFFI generator is available to the build. + +## Exercise the example + +```bash +cargo test -p ffi-benchmark +mobench list --crate-path examples/ffi-benchmark +mobench run \ + --crate-path examples/ffi-benchmark \ + --target android \ + --function ffi_benchmark::bench_fibonacci \ + --local-only +``` + +The last command is a host preflight, not a mobile measurement. + +## Next step + +Select one backend, build both target platforms, and keep that backend fixed across your baseline and candidate runs. + +# Installation + +Canonical URL: https://docs.mobench.org/installation/ +Description: Install mobench 0.1.43 and prepare a Rust benchmark crate. +Source: Upstream README quick start — https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/README.md — CLI and SDK installation commands. + +Install the `mobench` executable once, then add `mobench-sdk` to each crate that owns benchmark functions. + +## Requirements + +- Rust 1.85 or newer +- Cargo +- Android or iOS build tools only when you build for that platform +- BrowserStack App Automate credentials only when you run on remote devices + +Check your toolchain: + +```bash +rustc --version +cargo --version +``` + +## Install the CLI + +If you use `cargo-binstall`: + +```bash +cargo binstall mobench --version 0.1.43 +``` + +Or compile the release from crates.io: + +```bash +cargo install mobench --version 0.1.43 --locked +``` + +Confirm that the canonical executable is available: + +```bash +mobench --version +mobench --help +``` + +## Add the SDK + +From the benchmark crate: + +```bash +cargo add mobench-sdk@0.1.43 inventory +``` + +Mobile runners load your crate as a native library. Include the required crate types in `Cargo.toml`: + +```toml +[lib] +crate-type = ["lib", "cdylib", "staticlib"] +``` + +The default `mobench-sdk` features include registration, builders, and code generation. For a deliberately smaller integration, see the [compatibility reference](/compatibility/). + +## Install platform prerequisites + +Ask mobench for a platform-specific check before installing tools blindly: + +```bash +mobench check --target android +mobench check --target ios +``` + +Android builds use the Android SDK, Android NDK, `cargo-ndk`, and Rust Android targets. iOS builds require macOS, Xcode command-line tools, XcodeGen, and Rust iOS targets. + +## Next step + +Continue to the [quickstart](/quickstart/) and register your first benchmark function. + +# Quickstart + +Canonical URL: https://docs.mobench.org/quickstart/ +Description: Register a Rust benchmark, validate it on the host, and run it on a mobile device. +Source: Basic benchmark example — https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/examples/basic-benchmark/README.md — Minimal SDK registration and CLI flow. + +This path first proves that mobench can discover and report your function on the host. It then moves the same function to a BrowserStack device for the actual mobile measurement. + +## 1. Register a benchmark + +Add a public function to your library crate: + +```rust +use mobench_sdk::benchmark; + +#[benchmark] +pub fn checksum() { + let bytes = std::hint::black_box(vec![42_u8; 64 * 1024]); + let sum: u64 = bytes.iter().map(|byte| u64::from(*byte)).sum(); + std::hint::black_box(sum); +} +``` + +Use enough work to rise above timer noise, and pass results through `black_box` so the optimizer cannot erase the operation. + +## 2. Confirm discovery + +From the project root, replace `bench-mobile` if your benchmark crate lives elsewhere: + +```bash +mobench list --crate-path bench-mobile +``` + +The output should include the fully qualified function name, such as `bench_mobile::checksum`. + +## 3. Run the host preflight + +```bash +mobench run \ + --target android \ + --crate-path bench-mobile \ + --function bench_mobile::checksum \ + --local-only \ + --iterations 20 \ + --warmup 5 \ + --output target/mobench/preflight.json +``` + +`--local-only` checks the host harness, discovery, and report path. It does not run Android code and must not be treated as a mobile result. + +Inspect the report: + +```bash +mobench summary target/mobench/preflight.json +``` + +## 4. Run on a mobile device + +Set your BrowserStack App Automate credentials: + +```bash +export BROWSERSTACK_USERNAME="your_username" +export BROWSERSTACK_ACCESS_KEY="your_access_key" +``` + +Choose a device that appears in `mobench devices --platform android`, then run: + +```bash +mobench run \ + --target android \ + --crate-path bench-mobile \ + --function bench_mobile::checksum \ + --devices "Google Pixel 7-13.0" \ + --iterations 20 \ + --warmup 5 \ + --release \ + --fetch \ + --output target/mobench/results.json +``` + +Using `--release` keeps the measured code optimized and reduces Android upload size. + +## Next step + +Read [benchmark quality](/benchmark-quality/) before using the result as a baseline. + +# Troubleshooting + +Canonical URL: https://docs.mobench.org/troubleshooting/ +Description: Diagnose discovery, toolchain, BrowserStack, result, and profiling failures. +Source: Upstream testing guide — https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/docs/guides/testing.md — Supported validation paths and platform smoke checks. + +Start with the narrowest command that can reproduce the failure, add `--verbose`, and keep the generated output directory until you understand the error. + +## Benchmark does not appear in `list` + +1. Confirm the function has `#[benchmark]` and a supported signature. +2. Confirm the benchmark crate depends on `mobench-sdk` with the registry feature and on `inventory`. +3. Pass an explicit `--crate-path` when the workspace contains several libraries. +4. Run `cargo check` for compile-time macro errors. + +```bash +mobench --verbose list --crate-path crates/bench-mobile +``` + +## `--local-only` succeeds but the device run fails + +That result is expected when the failure is in mobile compilation, packaging, signing, upload, or the generated runner. `--local-only` skips all of those layers. + +Run the platform checks and build separately: + +```bash +mobench check --target android +mobench build --target android --release --progress +mobench verify --target android --check-artifacts +``` + +For iOS, also verify Xcode, XcodeGen, signing, deployment target, and runner compatibility. + +## BrowserStack credentials or device fail + +```bash +mobench doctor --target both --browserstack true +mobench devices --validate "Google Pixel 7-13.0" +``` + +Check that the credentials are App Automate credentials, the device identifier still exists, and the app deployment target does not exceed the selected iOS version. + +## Upload times out + +Build and run with `--release`. Debug Android artifacts can be much larger. If the build was accepted but result polling expired, fetch it later with the BrowserStack build ID. + +## Result has no CPU or memory value + +Resource metrics are optional and vary by runner and provider availability. Missing means unavailable, not zero. Keep the timing result and resource availability as separate facts. + +## CI output is in the wrong place + +`ci run` and `profile run` use `--output-dir`. A normal `run` uses `--output` for its JSON report. + +```bash +mobench ci run --help +mobench profile run --help +mobench run --help +``` + +## Profiling writes no native capture + +Check the provider/backend combination first. BrowserStack native profiling is unsupported, and `rust-tracing` is only a planned manifest/trace contract in 0.1.43. + +For Android, confirm `adb`, `simpleperf`, the NDK, and `llvm-addr2line`. For iOS, confirm a simulator runtime, `xcrun`, `simctl`, and macOS `sample`. Read the capture status and warnings in `profile.json`; do not treat a planned or partial capture as complete. + +## Still stuck + +Capture these facts before opening an upstream issue: + +- `mobench --version` and `rustc --version` +- the smallest failing command with secrets removed +- platform and device identifier +- relevant `mobench.toml` and `bench-config.toml` sections +- verbose output and generated artifact paths +- whether host preflight, build, upload, execution, or fetch failed + +Contributor architecture and release-maintenance documentation belongs in the [upstream repository](https://github.com/worldcoin/mobile-bench-rs), not in the product guide. + +## Next step + +Re-run the narrow failing command with `--verbose`, then attach the sanitized evidence to an upstream issue. + +# mobench documentation + +Canonical URL: https://docs.mobench.org/ +Description: Build, run, and analyze Rust benchmarks on Android and iOS. +Source: Upstream README — https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/README.md — Product scope, workflow, release, and supported backends. + +mobench takes a Rust benchmark from a function in your crate to repeatable results on Android and iOS. It builds native libraries, generates mobile runners, executes them on selected BrowserStack devices, and writes artifacts that people and CI can compare. + +The current documentation describes mobench **0.1.43** and requires Rust **1.85 or newer**. + +## Choose a starting point + +| Goal | Start here | +| --- | --- | +| Install the CLI and SDK | [Installation](/installation/) | +| Get one benchmark running | [Quickstart](/quickstart/) | +| Write trustworthy benchmark functions | [Benchmark functions](/benchmark-functions/) | +| Validate a project without using a device farm | [Host-side preflight](/host-preflight/) | +| Run on Android or iOS devices | [BrowserStack](/browserstack/) | +| Add a stable CI contract | [CI runs](/ci/) | +| Interpret artifacts and compare revisions | [Outputs](/outputs/) | +| Capture native stacks locally | [Profiling](/profiling/) | + +## What mobench measures + +Normal benchmark runs record measured iteration durations. CPU time and memory fields may also be present when the runner or provider can collect them. Missing resource values mean **unavailable**, not zero. + +Native stack profiling is a separate, local-first workflow. Android uses `simpleperf`; iOS uses simulator-host `sample`. BrowserStack native profiling is not supported in 0.1.43. + +## The execution boundary + +Selecting devices makes `mobench run` build and schedule a real mobile benchmark through BrowserStack. `--local-only` skips mobile builds and writes host-side preflight/spec output without executing the requested benchmark. Use it to validate discovery, configuration, and report shape—not as evidence of mobile performance. + +## Stable outputs + +`mobench ci run` writes a reusable contract: + +- `summary.json` for machines and comparisons +- `summary.md` for people and CI job summaries +- `results.csv` for analysis tools +- `plots/*.svg` when plotting is available + +## Next step + +[Install mobench](/installation/), then complete the quickstart before adding a device matrix or CI workflow. + +# CLI reference + +Canonical URL: https://docs.mobench.org/cli/ +Description: Find mobench commands and the flags that connect authoring, execution, CI, and profiling. +Source: CLI definitions — https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/crates/mobench/src/cli.rs — Clap command, subcommand, argument, default, and enum definitions. + +The canonical executable is `mobench`. Run `mobench --help` against your installed version for the complete generated argument reference. + +{/* BEGIN GENERATED CLI REFERENCE */} +{/* Generated from @mobench/truth. Do not edit this section by hand. */} + +## Global flags + +| Flag | Value | Default | Purpose | +| --- | --- | --- | --- | +| `--dry-run` | boolean | false | Print what would be done without actually doing it | +| `--non-interactive` | boolean | false | Disable interactive prompts (fail instead) | +| `-v`, `--verbose` | boolean | false | Print verbose output including all commands | +| `--yes` | boolean | false | Assume yes to prompts and allow overwriting files | + +The generated CLI also provides `--help`, `-h`, `--version`, and `-V` where Clap exposes them. + +## Command index + +| Command | Purpose | +| --- | --- | +| `mobench build` | Build mobile artifacts from the resolved benchmark crate | +| `mobench check` | Check prerequisites for building mobile artifacts | +| `mobench ci` | CI helpers (workflow and action scaffolding) | +| `mobench ci check-run` | Create a GitHub Check Run with benchmark results | +| `mobench ci init` | Generate GitHub Actions workflow + local action wrapper | +| `mobench ci merge-split-runs` | Merge one-sample CI summaries into a normal CI output set | +| `mobench ci run` | Run a full CI benchmark flow with stable output contract | +| `mobench ci summarize` | Summarize benchmark results with device metrics | +| `mobench compare` | Compare two run summaries for regressions | +| `mobench config` | Validate run configuration and associated files | +| `mobench config validate` | Validate bench-config.toml and referenced matrix/settings | +| `mobench devices` | List available BrowserStack devices for testing | +| `mobench devices resolve` | Resolve devices from a matrix deterministically for CI usage | +| `mobench doctor` | Validate local + CI prerequisites and configuration | +| `mobench fetch` | Fetch BrowserStack build artifacts (logs, session JSON) for CI | +| `mobench fixture` | Fixture lifecycle helpers for reproducible CI setup | +| `mobench fixture build` | Build fixture artifacts using existing build commands | +| `mobench fixture cache-key` | Compute deterministic fixture cache key from config/toolchain inputs | +| `mobench fixture init` | Create starter fixture files for CI runs | +| `mobench fixture verify` | Verify fixture files and optional profile filtering | +| `mobench fixture verify-plots` | Render and verify checked-in plot fixtures | +| `mobench init` | Scaffold a base config file for the CLI | +| `mobench init-sdk` | Initialize a new benchmark project with the SDK templates | +| `mobench list` | List all discovered benchmark functions | +| `mobench package-ipa` | Package iOS app as IPA for distribution or testing | +| `mobench package-xcuitest` | Package XCUITest runner for BrowserStack testing | +| `mobench plan` | Generate a sample device matrix file | +| `mobench profile` | Profiling helpers for native profile capture and summary rendering | +| `mobench profile diff` | Generate a differential flamegraph bundle from two normalized profile manifests | +| `mobench profile run` | Plan or execute a native profiling session; local android-native and ios-instruments now attempt real native capture | +| `mobench profile summarize` | Render markdown or JSON from a normalized profile manifest | +| `mobench report` | Reporting helpers for CI summaries and PR comments | +| `mobench report github` | Generate/publish sticky GitHub PR comment from summary output | +| `mobench report summarize` | Generate markdown summary from standardized output JSON | +| `mobench run` | Build mobile artifacts, write host preflight output, or run on BrowserStack devices | +| `mobench summary` | Display summary statistics from a benchmark report JSON file | +| `mobench verify` | Verify benchmark setup: registry, spec, artifacts, and optional smoke test | + +## Complete command flag index + +Global flags above are omitted from each command row. Positional arguments use angle brackets. + +### `mobench build` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--crate-path` | `CRATE_PATH` | optional | Path to the benchmark crate (default: auto-detect bench-mobile/ or crates/{crate}) | +| `--ios-deployment-target` | `IOS_DEPLOYMENT_TARGET` | optional | iOS deployment target for generated app and XCUITest targets | +| `--ios-runner` | `swiftui \| uikit-legacy` | optional | iOS runner template (swiftui or uikit-legacy) | +| `--output-dir` | `OUTPUT_DIR` | optional | Output directory for mobile artifacts (default: target/mobench) | +| `--progress` | boolean | default: false | Show simplified step-by-step progress output | +| `--project-root` | `PROJECT_ROOT` | optional | Project root containing mobench.toml or the Cargo workspace | +| `--release` | boolean | default: false | Build in release mode | +| `--target` | `android \| both \| ios` | required | — | + +### `mobench check` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--format` | `json \| text` | default: text | Output format (text or json) | +| `-t`, `--target` | `android \| both \| ios` | required | Target platform (android or ios) | + +### `mobench ci check-run` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--annotation-path` | `ANNOTATION_PATH` | default: src/lib.rs | File path used in Check Run annotations (relative to repo root) | +| `--baseline` | `BASELINE` | optional | Optional baseline JSON for regression detection | +| `--name` | `NAME` | default: Mobench | Check Run name displayed in the PR | +| `--regression-threshold-pct` | `REGRESSION_THRESHOLD_PCT` | default: 5 | Regression threshold percentage | +| `--repo` | `REPO` | required | GitHub repository (owner/repo format) | +| `--results` | `RESULTS` | optional | Path to summary JSON with benchmark results | +| `--results-dir` | `RESULTS_DIR` | optional | Directory containing summary JSON files (processes all) | +| `--sha` | `SHA` | required | Git commit SHA to annotate | + +### `mobench ci init` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--action-dir` | `ACTION_DIR` | default: .github/actions/mobench | Directory to write the local GitHub Action | +| `--workflow` | `WORKFLOW` | default: .github/workflows/mobile-bench.yml | Path to write the workflow file | + +### `mobench ci merge-split-runs` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--device` | `DEVICE` | required | Device label all samples must match | +| `--function` | `FUNCTION` | required | Fully-qualified benchmark function all samples must contain | +| `--iterations` | `ITERATIONS` | required | Expected measured sample count | +| `--output-dir` | `OUTPUT_DIR` | required | Directory to write merged summary.json, summary.md, and results.csv | +| `--samples-dir` | `SAMPLES_DIR` | required | Directory containing sample-*/summary.json one-sample CI outputs | +| `--warmup` | `WARMUP` | default: 0 | Warmup count reported in merged CI summaries | + +### `mobench ci run` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--android-benchmark-timeout-secs` | `ANDROID_BENCHMARK_TIMEOUT_SECS` | optional | Android benchmark watchdog timeout in seconds for the generated harness | +| `--android-heartbeat-interval-secs` | `ANDROID_HEARTBEAT_INTERVAL_SECS` | optional | Android benchmark heartbeat interval in seconds for the generated harness | +| `--baseline` | `BASELINE` | optional | Baseline summary source (path\|url\|artifact:<path>) | +| `--config` | `CONFIG` | optional | Optional path to config file | +| `--crate-path` | `CRATE_PATH` | optional | Path to the benchmark crate directory containing Cargo.toml | +| `--device-matrix` | `DEVICE_MATRIX` | optional | Device matrix YAML file to load device names from | +| `--device-tags` | `DEVICE_TAGS` | optional | Device tags to select from the device matrix (comma-separated or repeatable) | +| `--devices` | `DEVICES` | optional | Device identifiers or labels (BrowserStack devices) | +| `--fetch` | boolean | default: false | Fetch BrowserStack artifacts after the run completes | +| `--fetch-output-dir` | `FETCH_OUTPUT_DIR` | default: target/browserstack | — | +| `--fetch-poll-interval-secs` | `FETCH_POLL_INTERVAL_SECS` | default: 5 | — | +| `--fetch-timeout-secs` | `FETCH_TIMEOUT_SECS` | default: 300 | — | +| `--function` | `FUNCTION` | optional | Fully-qualified Rust function to benchmark (single function) | +| `--functions` | `FUNCTIONS` | optional | Multiple benchmark functions (comma-separated or JSON array). Runs each in sequence. | +| `--ios-app` | `IOS_APP` | optional | Path to iOS app bundle (.ipa or zipped .app) for BrowserStack XCUITest | +| `--ios-deployment-target` | `IOS_DEPLOYMENT_TARGET` | optional | iOS deployment target for generated app and XCUITest targets | +| `--ios-runner` | `swiftui \| uikit-legacy` | optional | iOS runner template (swiftui or uikit-legacy) | +| `--ios-test-suite` | `IOS_TEST_SUITE` | optional | Path to iOS XCUITest test suite package (.zip or .ipa) | +| `--iterations` | `ITERATIONS` | default: 100 | — | +| `--junit` | `JUNIT` | optional | Write JUnit XML report to the given path | +| `--local-only` | boolean | default: false | Skip mobile builds and write host-side preflight/spec output without mobile execution | +| `--mobench-ref` | `MOBENCH_REF` | optional | Metadata: git ref/sha for this mobench invocation | +| `--output-dir` | `OUTPUT_DIR` | default: target/mobench/ci | Output directory for CI contract files | +| `--plots` | `auto \| off \| require` | default: auto | — | +| `--pr-number` | `PR_NUMBER` | optional | Metadata: pull request number | +| `--progress` | boolean | default: false | Show simplified step-by-step progress output | +| `--regression-threshold-pct` | `REGRESSION_THRESHOLD_PCT` | default: 5 | Regression threshold percentage when comparing to baseline | +| `--release` | boolean | default: false | Build in release mode (recommended for BrowserStack to reduce APK size and upload time) | +| `--request-command` | `REQUEST_COMMAND` | optional | Metadata: original command requested by the caller | +| `--requested-by` | `REQUESTED_BY` | optional | Metadata: user or actor that requested the run | +| `--target` | `android \| both \| ios` | required | — | +| `--warmup` | `WARMUP` | default: 10 | — | + +### `mobench ci summarize` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--build-id` | `BUILD_ID` | optional | BrowserStack build ID to enrich results with device metrics (requires --results-dir) | +| `--output-file` | `OUTPUT_FILE` | optional | Write output to file in addition to stdout | +| `--output-format` | `json \| markdown \| table` | default: table | Output format: table (terminal), markdown, or json | +| `--platform` | `android \| ios` | optional | Platform filter (show only one platform) | +| `--results-dir` | `RESULTS_DIR` | optional | Directory containing summary.json/CSV results (offline mode) | + +### `mobench compare` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--baseline` | `BASELINE` | required | Baseline JSON summary to compare against | +| `--candidate` | `CANDIDATE` | required | Candidate JSON summary to compare | +| `--output` | `OUTPUT` | optional | Optional output path for markdown report | + +### `mobench config validate` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--config` | `CONFIG` | default: bench-config.toml | — | +| `--format` | `json \| text` | default: text | — | + +### `mobench devices` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--json` | boolean | default: false | Output as JSON | +| `--platform` | `android \| ios` | optional | Filter by platform (android or ios) | +| `--validate` | `VALIDATE` | optional | Validate device specs against available devices | + +### `mobench devices resolve` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--config` | `CONFIG` | optional | Path to run config file (optional source for matrix/tags) | +| `--device-matrix` | `DEVICE_MATRIX` | optional | Path to device matrix YAML file | +| `--format` | `json \| text` | default: text | — | +| `--platform` | `android \| ios` | required | — | +| `--profile` | `PROFILE` | optional | Device profile/tag to resolve (defaults to `default`) | + +### `mobench doctor` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--browserstack` | `false \| true` | default: true | Validate BrowserStack credentials | +| `--config` | `CONFIG` | optional | Optional path to run config file to validate | +| `--device-matrix` | `DEVICE_MATRIX` | optional | Optional path to device matrix YAML file to validate | +| `--device-tags` | `DEVICE_TAGS` | optional | Device tags to select from the device matrix (comma-separated or repeatable) | +| `--format` | `json \| text` | default: text | — | +| `--target` | `android \| both \| ios` | default: both | — | + +### `mobench fetch` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--build-id` | `BUILD_ID` | required | — | +| `--output-dir` | `OUTPUT_DIR` | default: target/browserstack | — | +| `--poll-interval-secs` | `POLL_INTERVAL_SECS` | default: 10 | — | +| `--target` | `android \| ios` | required | — | +| `--timeout-secs` | `TIMEOUT_SECS` | default: 1800 | — | +| `--wait` | boolean | default: true | — | + +### `mobench fixture build` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--crate-path` | `CRATE_PATH` | optional | Path to benchmark crate | +| `--output-dir` | `OUTPUT_DIR` | optional | Output directory for mobile artifacts | +| `--progress` | boolean | default: false | Show simplified step-by-step progress output | +| `--release` | boolean | default: false | Build in release mode | +| `--target` | `android \| both \| ios` | default: both | — | + +### `mobench fixture cache-key` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--config` | `CONFIG` | default: bench-config.toml | — | +| `--device-matrix` | `DEVICE_MATRIX` | optional | — | +| `--format` | `json \| text` | default: text | — | +| `--profile` | `PROFILE` | optional | Device profile/tag for keying | +| `--target` | `android \| both \| ios` | default: both | — | + +### `mobench fixture init` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--config` | `CONFIG` | default: bench-config.toml | — | +| `--device-matrix` | `DEVICE_MATRIX` | default: device-matrix.yaml | — | +| `--force` | boolean | default: false | Overwrite existing fixture files | + +### `mobench fixture verify` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--config` | `CONFIG` | default: bench-config.toml | — | +| `--device-matrix` | `DEVICE_MATRIX` | optional | — | +| `--format` | `json \| text` | default: text | — | +| `--profile` | `PROFILE` | optional | Device profile/tag to verify | +| `--target` | `android \| both \| ios` | default: both | — | + +### `mobench fixture verify-plots` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `` | `basic \| ffi` | required | — | +| `--output-dir` | `OUTPUT_DIR` | optional | Output directory for rendered fixture artifacts (defaults under target/mobench/plot-fixtures) | + +### `mobench init` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--output` | `OUTPUT` | default: bench-config.toml | — | +| `--target` | `android \| ios` | default: android | — | + +### `mobench init-sdk` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--examples` | boolean | default: false | Generate example benchmarks | +| `--output-dir` | `OUTPUT_DIR` | default: . | — | +| `--project-name` | `PROJECT_NAME` | default: bench-project | — | +| `--target` | `android \| both \| ios` | required | — | + +### `mobench list` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--crate-path` | `CRATE_PATH` | optional | Path to the benchmark crate directory containing Cargo.toml | +| `--project-root` | `PROJECT_ROOT` | optional | Project root containing mobench.toml or the Cargo workspace | + +### `mobench package-ipa` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--crate-path` | `CRATE_PATH` | optional | Path to the benchmark crate directory containing Cargo.toml | +| `--method` | `adhoc \| development` | default: adhoc | Signing method | +| `--output-dir` | `OUTPUT_DIR` | optional | Output directory for mobile artifacts (default: target/mobench) | +| `--project-root` | `PROJECT_ROOT` | optional | Project root containing mobench.toml or the Cargo workspace | +| `--scheme` | `SCHEME` | default: BenchRunner | Xcode scheme to build | + +### `mobench package-xcuitest` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--crate-path` | `CRATE_PATH` | optional | Path to the benchmark crate directory containing Cargo.toml | +| `--output-dir` | `OUTPUT_DIR` | optional | Output directory for mobile artifacts (default: target/mobench) | +| `--project-root` | `PROJECT_ROOT` | optional | Project root containing mobench.toml or the Cargo workspace | +| `--scheme` | `SCHEME` | default: BenchRunner | Xcode scheme to build | + +### `mobench plan` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--output` | `OUTPUT` | default: device-matrix.yaml | — | + +### `mobench profile diff` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--baseline` | `BASELINE` | required | Path to the baseline profile.json manifest | +| `--candidate` | `CANDIDATE` | required | Path to the candidate profile.json manifest | +| `--normalize` | boolean | default: false | Normalize baseline sample counts to candidate totals before diffing | +| `--output-dir` | `OUTPUT_DIR` | default: target/mobench/profile/diff | Output directory for differential profile artifacts | + +### `mobench profile run` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--backend` | `android-native \| auto \| ios-instruments \| rust-tracing` | default: auto | — | +| `--config` | `CONFIG` | optional | Optional path to config file | +| `--crate-path` | `CRATE_PATH` | optional | Path to the benchmark crate directory containing Cargo.toml | +| `--device` | `DEVICE` | optional | Explicit BrowserStack device name to resolve for this profiling request | +| `--device-matrix` | `DEVICE_MATRIX` | optional | Path to device matrix YAML file used with --profile or config-based device tags | +| `--format` | `both \| native \| processed` | default: both | — | +| `--function` | `FUNCTION` | required | Fully-qualified Rust function to profile | +| `--os-version` | `OS_VERSION` | optional | OS version for --device (for example `16` or `14.0`) | +| `--output-dir` | `OUTPUT_DIR` | default: target/mobench/profile | — | +| `--profile` | `PROFILE` | optional | Device profile/tag to resolve (for example `high-spec`) | +| `--provider` | `browserstack \| local` | default: local | — | +| `--target` | `android \| ios` | required | — | +| `--trace-events-output` | `TRACE_EVENTS_OUTPUT` | optional | Write machine-readable trace/event JSON to this path for downstream consumers | +| `--warmup-mode` | `cold \| warm` | optional | Warm or cold capture mode for local native profiling (defaults to warm for local Android/iOS native backends) | + +### `mobench profile summarize` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--output` | `OUTPUT` | optional | — | +| `--output-format` | `json \| markdown` | default: markdown | — | +| `--profile` | `PROFILE` | default: target/mobench/profile/profile.json | — | + +### `mobench report github` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--marker` | `MARKER` | default: <!-- mobench-report --> | — | +| `--output` | `OUTPUT` | optional | Write generated comment body to file | +| `--pr` | `PR` | optional | Pull request number (auto-detected from GITHUB_REF if omitted) | +| `--publish` | boolean | default: false | Publish via GitHub API using GITHUB_TOKEN | +| `--summary` | `SUMMARY` | default: target/mobench/ci/summary.json | — | + +### `mobench report summarize` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--output` | `OUTPUT` | optional | Write markdown output to file | +| `--plots` | `auto \| off \| require` | default: auto | — | +| `--summary` | `SUMMARY` | default: target/mobench/ci/summary.json | — | + +### `mobench run` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--android-benchmark-timeout-secs` | `ANDROID_BENCHMARK_TIMEOUT_SECS` | optional | Android benchmark watchdog timeout in seconds for the generated harness | +| `--android-heartbeat-interval-secs` | `ANDROID_HEARTBEAT_INTERVAL_SECS` | optional | Android benchmark heartbeat interval in seconds for the generated harness | +| `--baseline` | `BASELINE` | optional | Baseline summary source (path\|url\|artifact:<path>) | +| `--ci` | boolean | default: false | Enable CI mode (job summary, optional JUnit, regression exit codes) | +| `--config` | `CONFIG` | optional | Optional path to config file | +| `--crate-path` | `CRATE_PATH` | optional | Path to the benchmark crate directory containing Cargo.toml | +| `--device-matrix` | `DEVICE_MATRIX` | optional | Device matrix YAML file to load device names from | +| `--device-tags` | `DEVICE_TAGS` | optional | Device tags to select from the device matrix (comma-separated or repeatable) | +| `--devices` | `DEVICES` | optional | Device identifiers or labels (BrowserStack devices) | +| `--fetch` | boolean | default: false | Fetch BrowserStack artifacts after the run completes | +| `--fetch-output-dir` | `FETCH_OUTPUT_DIR` | default: target/browserstack | — | +| `--fetch-poll-interval-secs` | `FETCH_POLL_INTERVAL_SECS` | default: 5 | — | +| `--fetch-timeout-secs` | `FETCH_TIMEOUT_SECS` | default: 300 | — | +| `--function` | `FUNCTION` | optional | Fully-qualified Rust function to benchmark | +| `--ios-app` | `IOS_APP` | optional | Path to iOS app bundle (.ipa or zipped .app) for BrowserStack XCUITest | +| `--ios-deployment-target` | `IOS_DEPLOYMENT_TARGET` | optional | iOS deployment target for generated app and XCUITest targets | +| `--ios-runner` | `swiftui \| uikit-legacy` | optional | iOS runner template (swiftui or uikit-legacy) | +| `--ios-test-suite` | `IOS_TEST_SUITE` | optional | Path to iOS XCUITest test suite package (.zip or .ipa) | +| `--iterations` | `ITERATIONS` | optional | — | +| `--junit` | `JUNIT` | optional | Write JUnit XML report to the given path | +| `--local-only` | boolean | default: false | Skip mobile builds and write host-side preflight/spec output without mobile execution | +| `--output` | `OUTPUT` | optional | Optional output path for JSON report | +| `--progress` | boolean | default: false | Show simplified step-by-step progress output | +| `--project-root` | `PROJECT_ROOT` | optional | Project root containing mobench.toml or the Cargo workspace | +| `--regression-threshold-pct` | `REGRESSION_THRESHOLD_PCT` | default: 5 | Regression threshold percentage when comparing to baseline | +| `--release` | boolean | default: false | Build in release mode (recommended for BrowserStack to reduce APK size and upload time) | +| `--summary-csv` | boolean | default: false | Write CSV summary alongside JSON | +| `--target` | `android \| ios` | optional | — | +| `--warmup` | `WARMUP` | optional | — | + +### `mobench summary` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--format` | `csv \| json \| text` | optional | Output format: text (default), json, or csv | +| `` | `REPORT` | required | Path to the benchmark report JSON file | + +### `mobench verify` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--check-artifacts` | boolean | default: false | Check that build artifacts exist | +| `--crate-path` | `CRATE_PATH` | optional | Path to the benchmark crate directory containing Cargo.toml | +| `--function` | `FUNCTION` | optional | Function name to verify/smoke test | +| `--output-dir` | `OUTPUT_DIR` | optional | Output directory for mobile artifacts (default: target/mobench) | +| `--project-root` | `PROJECT_ROOT` | optional | Project root containing mobench.toml or the Cargo workspace | +| `--smoke-test` | boolean | default: false | Run a local smoke test with minimal iterations | +| `--spec-path` | `SPEC_PATH` | optional | Path to bench_spec.json to validate | +| `--target` | `android \| both \| ios` | optional | Target platform to verify artifacts for | + + +{/* END GENERATED CLI REFERENCE */} + +`ci run` uses `--output-dir`, which defaults to `target/mobench/ci`. Its core outputs are `summary.json`, `summary.md`, and `results.csv`. `profile run` also uses `--output-dir`, defaulting to `target/mobench/profile`. BrowserStack native profiling is unsupported in 0.1.43. + +## Next step + +Run `mobench run --help` and save a minimal invocation in your repository's benchmark README. + +# Configuration + +Canonical URL: https://docs.mobench.org/configuration/ +Description: Configure project builds separately from benchmark run and provider settings. +Source: Current configuration specification — https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/docs/specs/mobench-current-spec.md — Project config, run config, resolution order, and examples. + +mobench uses two TOML files for different concerns: + +- `mobench.toml` describes the benchmark crate and generated mobile projects. +- `bench-config.toml` describes a run, device selection, and BrowserStack settings. + +Keeping them separate lets one project support several CI matrices without duplicating build identity. + +{/* BEGIN GENERATED CONFIG REFERENCE */} +{/* Generated from @mobench/truth. Do not edit this section by hand. */} + +## Published configuration keys + +These are the complete configuration keys in the pinned release contract. Example files below may use only a task-specific subset. + +### `mobench.toml` + +| Key | Value | Required | Default | Evidence | +| --- | --- | --- | --- | --- | +| `project.crate` | `string|null` | no | — | `source-mobench-config` | +| `project.library_name` | `string|null` | no | — | `source-mobench-config` | +| `project.output_dir` | `path|null` | no | — | `source-mobench-config` | +| `android.package` | `string` | no | dev.world.bench | `source-mobench-config` | +| `android.min_sdk` | `integer` | no | 24 | `source-mobench-config` | +| `android.target_sdk` | `integer` | no | 34 | `source-mobench-config` | +| `android.abis` | `string[]|null` | no | — | `source-mobench-config` | +| `ios.bundle_id` | `string` | no | dev.world.bench | `source-mobench-config` | +| `ios.deployment_target` | `string` | no | 15.0 | `source-mobench-config` | +| `ios.team_id` | `string|null` | no | — | `source-mobench-config` | +| `benchmarks.default_function` | `string|null` | no | — | `source-mobench-config` | +| `benchmarks.default_iterations` | `integer` | no | 100 | `source-mobench-config` | +| `benchmarks.default_warmup` | `integer` | no | 10 | `source-mobench-config` | +| `browserstack.ios_completion_timeout_secs` | `integer|null` | no | — | `source-mobench-config` | + +### `bench-config.toml` + +| Key | Value | Required | Default | Evidence | +| --- | --- | --- | --- | --- | +| `target` | `android|ios` | yes | — | `source-bench-config` | +| `function` | `string` | yes | — | `source-bench-config` | +| `iterations` | `integer` | yes | — | `source-bench-config` | +| `warmup` | `integer` | yes | — | `source-bench-config` | +| `device_matrix` | `path` | yes | — | `source-bench-config` | +| `device_tags` | `string[]|null` | no | — | `source-bench-config` | +| `browserstack.app_automate_username` | `string` | yes | — | `source-bench-config` | +| `browserstack.app_automate_access_key` | `string` | yes | — | `source-bench-config` | +| `browserstack.project` | `string|null` | no | — | `source-bench-config` | +| `browserstack.ios_completion_timeout_secs` | `integer|null` | no | — | `source-bench-config` | +| `browserstack.android_benchmark_timeout_secs` | `integer|null` | no | — | `source-bench-config` | +| `browserstack.android_heartbeat_interval_secs` | `integer|null` | no | — | `source-bench-config` | +| `ios_xcuitest.app` | `path` | no | — | `source-bench-config` | +| `ios_xcuitest.test_suite` | `path` | no | — | `source-bench-config` | + +{/* END GENERATED CONFIG REFERENCE */} + +## Project configuration + +Place `mobench.toml` at the project or workspace root: + +```toml test=config:mobench.toml +[project] +crate = "bench-mobile" +library_name = "bench_mobile" +output_dir = "target/mobench" + +[android] +package = "com.example.bench" +min_sdk = 24 +target_sdk = 34 +abis = ["arm64-v8a"] + +[ios] +bundle_id = "com.example.bench" +deployment_target = "15.0" +team_id = "ABCDE12345" + +[benchmarks] +default_function = "bench_mobile::checksum" +default_iterations = 100 +default_warmup = 10 +``` + +The pinned release contract defines only the keys shown above for generated project identity and build defaults. Runner-backend selection is not a published `mobench.toml` key in 0.1.43. + +## Run configuration + +Use `bench-config.toml` for a repeatable run: + +```toml test=config:bench-config.toml +target = "android" +function = "bench_mobile::checksum" +iterations = 100 +warmup = 10 +device_matrix = "device-matrix.yaml" +device_tags = ["default"] + +[browserstack] +app_automate_username = "${BROWSERSTACK_USERNAME}" +app_automate_access_key = "${BROWSERSTACK_ACCESS_KEY}" +project = "mobile-benchmarks" + +[ios_xcuitest] +app = "target/mobench/ios/BenchRunner.ipa" +test_suite = "target/mobench/ios/BenchRunnerUITests.zip" +``` + +Validate it before a run: + +```bash +mobench config validate --config bench-config.toml +``` + +## Resolution and overrides + +Explicit CLI values take precedence over config values. Project discovery considers explicit `--project-root` and `--crate-path`, explicit config, a discovered `mobench.toml`, Cargo workspace metadata, the Git root, and the legacy `bench-mobile/` layout. + +Use explicit paths in CI when a workspace contains several plausible benchmark crates: + +```bash +mobench build \ + --target android \ + --project-root . \ + --crate-path crates/bench-mobile +``` + +`--device-matrix` overrides the matrix path from `--config`. Do not combine `--devices` and `--device-matrix`; choose one source of device selection. + +## Next step + +Generate a [device matrix](/device-matrices/) and validate the combined setup with `mobench doctor`. + +# Device matrices + +Canonical URL: https://docs.mobench.org/device-matrices/ +Description: Select BrowserStack Android and iOS devices deterministically with tags. +Source: BrowserStack CI guide — https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/docs/guides/browserstack-ci.md — Device inventory, validation, matrix syntax, profiles, and legacy iOS constraints. + +A device matrix keeps exact BrowserStack identifiers and grouping decisions in version control. Tags let CI select a stable lane such as `default`, `pixel`, or `legacy-ios`. + +## Create a matrix + +Generate a starter file: + +```bash +mobench plan --output device-matrix.yaml +``` + +Example: + +```yaml +devices: + - name: "Google Pixel 7-13.0" + os: "android" + os_version: "13.0" + tags: ["default", "pixel"] + - name: "iPhone 14-16" + os: "ios" + os_version: "16" + tags: ["default", "iphone"] +``` + +Use identifiers from the live BrowserStack inventory: + +```bash +mobench devices --platform android +mobench devices --platform ios +mobench devices --json +``` + +## Validate identifiers + +```bash +mobench devices --validate "Google Pixel 7-13.0" +``` + +Invalid labels return nearby suggestions. Update the matrix deliberately when BrowserStack changes its inventory; do not silently fall back to another device. + +## Resolve a tagged profile + +```bash +mobench devices resolve \ + --platform android \ + --profile default \ + --device-matrix device-matrix.yaml +``` + +Run the selected group: + +```bash +mobench ci run \ + --target android \ + --function bench_mobile::checksum \ + --device-matrix device-matrix.yaml \ + --device-tags default \ + --release \ + --output-dir target/mobench/ci +``` + +`--device-tags` accepts comma-separated or repeated values. Explicit `--devices` and a matrix cannot be combined. + +## Legacy iOS lane + +An older BrowserStack device requires all three parts to agree: + +- the matrix's device OS +- the `mobench.toml` iOS deployment target +- the Xcode version on the build runner + +For a device below iOS 15, select `uikit-legacy`. mobench fails early when the app deployment target is newer than the chosen device OS. + +## Next step + +Run `mobench doctor --device-matrix device-matrix.yaml --browserstack true` before committing a CI lane. + +# Output schemas + +Canonical URL: https://docs.mobench.org/schemas/ +Description: Use the versioned mobench JSON contracts without depending on private implementation details. +Source: Upstream schemas — https://github.com/worldcoin/mobile-bench-rs/tree/d1a3176f9144f35e777e83fd07045116144da257/docs/schemas — Versioned CI, summary, and trace-event JSON Schema files. + +mobench publishes JSON Schemas for the contracts intended for downstream validation. Pin a schema revision alongside the mobench release used to create the artifact. + +## Published schemas + +| File | Contract | +| --- | --- | +| `ci-contract-v1.schema.json` | The top-level `ci` metadata and status contract | +| `summary-v1.schema.json` | The top-level normalized `summary` result contract | +| `trace-events-v1.schema.json` | Profiling trace source, total duration, lanes, and events | + +The CI and summary schemas are focused wrappers around the stable output sections. A complete `summary.json` can include additional forward-compatible fields. + +## Validate in CI + +Use any JSON Schema 2020-12 validator and point it at the pinned upstream file. Treat validation as a contract check, not as a semantic comparison of devices or benchmarks. + +Example with a generic validator: + +```bash +check-jsonschema \ + --schemafile vendor/mobench/summary-v1.schema.json \ + target/mobench/ci/summary.json +``` + +Vendor the schema or pin its commit URL so a remote branch update cannot change a historical validation job. + +## Trace-event semantics + +The trace-event schema requires: + +- `source` +- `total_duration_ns` +- `lanes` + +Trace events describe profiling lanes and phases. They are not interchangeable with sampled benchmark durations in the normal summary contract. + +## Missing values + +Optional CPU and memory fields may be absent. Preserve absence through parsing and serialization; do not substitute numeric zero. + +## Next step + +Pin the schema files at release commit `d1a3176f9144f35e777e83fd07045116144da257` next to the workflow that consumes `summary.json`. + +# Compatibility + +Canonical URL: https://docs.mobench.org/compatibility/ +Description: Match Rust, platform tools, devices, and generated runner backends to mobench 0.1.43. +Source: Build guide — https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/docs/guides/build.md — Rust and platform prerequisites, targets, outputs, and generated backends. + +mobench 0.1.43 has a Rust MSRV of **1.85**. Mobile compatibility also depends on the platform toolchain, target architecture, runner backend, and selected device OS. + +## Android + +Typical requirements: + +- Android SDK and NDK +- `cargo-ndk` +- `ANDROID_NDK_HOME` or discoverable SDK installation +- Rust targets such as `aarch64-linux-android`, `armv7-linux-androideabi`, and `x86_64-linux-android` + +The generated project defaults to Android min SDK 24, target SDK 34, and `arm64-v8a` unless configured otherwise. Set `UNIFFI_ANDROID_ABI=x86_64` when exercising the UniFFI path on a default x86_64 emulator. + +## iOS + +Typical requirements: + +- macOS +- Xcode command-line tools +- XcodeGen +- Rust targets `aarch64-apple-ios`, `aarch64-apple-ios-sim`, and `x86_64-apple-ios` + +The default deployment target is iOS 15.0 with the SwiftUI runner. Lower targets use `uikit-legacy` and need an Xcode release capable of building for that OS. BrowserStack device OS must be at least the app deployment target. + +## Generated runner backends + +| Backend | Use when | Integration requirement | +| --- | --- | --- | +| `uniffi` | You want the default compatibility path | UniFFI types and generated Kotlin/Swift bindings | +| `native-c-abi` | Binding overhead must stay out of measured work | Export `mobench_sdk::export_native_c_abi!()` | +| `boltffi` | The project already uses BoltFFI generation | Export the JSON bridge with `#[boltffi::export]` and provide BoltFFI tooling | + +Keep the backend constant across a baseline and candidate; changing it changes the execution path. + +## Profiling compatibility + +- Android native profiling is local and uses `simpleperf`. +- iOS profiling is local, simulator-host oriented, and uses macOS `sample`. +- `rust-tracing` is a planned manifest/trace contract only. +- BrowserStack native profiling is unsupported in 0.1.43. + +## Check the current machine + +```bash +mobench check --target android +mobench check --target ios +mobench doctor --target both +``` + +## Next step + +Run the platform check on the same machine image used by CI, then save its toolchain versions with your first baseline. + +# Host-side preflight + +Canonical URL: https://docs.mobench.org/host-preflight/ +Description: Validate configuration, discovery, builds, and reports before using mobile devices. +Source: Testing guide — https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/docs/guides/testing.md — Prerequisite, discovery, verification, and host-side preflight commands. + +Preflight catches inexpensive failures before a mobile build or BrowserStack session. It validates your local tools and config, proves that the benchmark is discoverable, and checks the requested report shape. + +## Check prerequisites + +Use `doctor` for the combined project, config, and credential view: + +```bash +mobench doctor \ + --target both \ + --config bench-config.toml \ + --device-matrix device-matrix.yaml \ + --browserstack true +``` + +Use `check` for a focused platform toolchain check: + +```bash +mobench check --target android +mobench check --target ios +mobench check --target android --format json +``` + +Validate a run configuration independently: + +```bash +mobench config validate --config bench-config.toml +``` + +## Prove discovery + +```bash +mobench list --crate-path bench-mobile +``` + +If the function is missing, fix the registry or crate selection before building a mobile runner. + +## Verify generated artifacts + +After a build, verify registry and platform files: + +```bash +mobench verify \ + --target android \ + --crate-path bench-mobile \ + --check-artifacts \ + --output-dir target/mobench +``` + +`verify --smoke-test` only works when the benchmark crate is linked into the `mobench` CLI binary. External crates selected through `mobench.toml`, `--project-root`, or `--crate-path` should use `list`, `verify --check-artifacts`, and a normal host preflight. + +## Write host-side preflight output + +```bash +mobench run \ + --target android \ + --crate-path bench-mobile \ + --function bench_mobile::checksum \ + --local-only \ + --iterations 5 \ + --warmup 1 \ + --output target/mobench/preflight.json +``` + +This command skips mobile builds and writes preflight/spec output without executing the requested benchmark. It is useful for discovery and report-shape debugging, but it is not an Android, iOS, or host performance measurement. + +Inspect the result shape: + +```bash +mobench summary target/mobench/preflight.json +``` + +## Next step + +Resolve a real device and continue with the [BrowserStack run guide](/browserstack/). + +# BrowserStack device runs + +Canonical URL: https://docs.mobench.org/browserstack/ +Description: Build, upload, run, and fetch Rust benchmarks with BrowserStack App Automate. +Source: BrowserStack CI guide — https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/docs/guides/browserstack-ci.md — Credentials, device resolution, execution, fetching, and iOS compatibility. + +When a `run` or `ci run` command selects devices, mobench builds mobile artifacts, uploads them to BrowserStack App Automate, schedules the sessions, and collects available results. This is the normal path for real Android and iOS measurements in 0.1.43. + +## Configure credentials + +Environment variables are the simplest option: + +```bash +export BROWSERSTACK_USERNAME="your_username" +export BROWSERSTACK_ACCESS_KEY="your_access_key" +export BROWSERSTACK_PROJECT="mobile-benchmarks" +``` + +You can also reference them from `bench-config.toml`: + +```toml test=config:bench-config.toml +[browserstack] +app_automate_username = "${BROWSERSTACK_USERNAME}" +app_automate_access_key = "${BROWSERSTACK_ACCESS_KEY}" +project = "mobile-benchmarks" +``` + +Validate the credentials before starting a build: + +```bash +mobench doctor --target both --browserstack true +``` + +## Choose a device + +List the current BrowserStack inventory and validate an exact identifier: + +```bash +mobench devices --platform android +mobench devices --platform ios +mobench devices --validate "Google Pixel 7-13.0" +``` + +For repeatable suites, use a [device matrix](/device-matrices/) rather than copying labels across workflows. + +## Run Android + +```bash +mobench run \ + --target android \ + --function bench_mobile::checksum \ + --devices "Google Pixel 7-13.0" \ + --iterations 30 \ + --warmup 5 \ + --release \ + --fetch \ + --output target/mobench/android-results.json +``` + +Use `--release` for optimized code and smaller APK uploads. + +## Run iOS + +```bash +mobench run \ + --target ios \ + --function bench_mobile::checksum \ + --devices "iPhone 14-16" \ + --iterations 20 \ + --warmup 3 \ + --release \ + --fetch \ + --output target/mobench/ios-results.json +``` + +mobench generates and packages the app and XCUITest suite unless `--ios-app` and `--ios-test-suite` point to existing artifacts. + +For older devices, the app deployment target must not exceed the device OS. Use the `uikit-legacy` runner and an appropriately old Xcode lane when SwiftUI is unavailable. + +## Fetch artifacts later + +```bash +mobench fetch \ + --target android \ + --build-id \ + --output-dir target/browserstack \ + --wait \ + --poll-interval-secs 10 \ + --timeout-secs 1800 +``` + +Fetched data can include session JSON, device logs, instrumentation logs, and available video links. BrowserStack does not expose native stack or flamegraph artifacts through this flow. + +## Next step + +Move a stable command into [CI](/ci/) and save its standard output contract. + +# CI runs + +Canonical URL: https://docs.mobench.org/ci/ +Description: Run repeatable mobile benchmarks and produce stable CI artifacts. +Source: BrowserStack CI guide — https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/docs/guides/browserstack-ci.md — CI run, split-sample merge, PR reporting, and regression commands. + +`mobench ci run` wraps execution in a stable file contract for artifact upload, job summaries, comparisons, plots, and downstream reporting. + +## Run one benchmark + +```bash +mobench ci run \ + --target android \ + --function bench_mobile::checksum \ + --devices "Google Pixel 7-13.0" \ + --iterations 20 \ + --warmup 5 \ + --release \ + --fetch \ + --plots auto \ + --output-dir target/mobench/ci +``` + +The output directory contains `summary.json`, `summary.md`, `results.csv`, and optional `plots/*.svg`. + +Use `--functions` for several benchmarks in one invocation: + +```bash +mobench ci run \ + --target android \ + --functions '["bench_mobile::checksum","bench_mobile::verify"]' \ + --devices "Google Pixel 7-13.0" \ + --release \ + --output-dir target/mobench/ci +``` + +## Minimal GitHub Actions shape + +```yaml +name: Mobile benchmarks + +on: + workflow_dispatch: + +permissions: + contents: read + +jobs: + android: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + with: + targets: aarch64-linux-android + - name: Run mobench + env: + BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }} + BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} + run: | + mobench ci run \ + --target android \ + --function bench_mobile::checksum \ + --device-matrix device-matrix.yaml \ + --device-tags default \ + --release \ + --output-dir target/mobench/ci + - uses: actions/upload-artifact@v4 + with: + name: mobench-android + path: target/mobench/ci +``` + +Install the pinned mobench release in an earlier step or use your repository's pinned local action wrapper. + +## Merge split samples + +Fragile or long BrowserStack lanes can run each measured sample separately. Place the one-sample `summary.json` files below `sample-*` directories, then merge them: + +```bash +mobench ci merge-split-runs \ + --samples-dir target/mobench/split \ + --output-dir target/mobench/ci \ + --function bench_mobile::checksum \ + --device "Google Pixel 7-13.0" \ + --iterations 5 \ + --warmup 1 +``` + +The merge validates function, device, and sample counts, then writes the same three standard files as a normal CI run. + +## Add a regression gate + +```bash +mobench ci run \ + --target android \ + --function bench_mobile::checksum \ + --devices "Google Pixel 7-13.0" \ + --baseline artifact:baselines/android-summary.json \ + --regression-threshold-pct 5 \ + --junit target/mobench/ci/junit.xml \ + --release \ + --output-dir target/mobench/ci +``` + +## Next step + +Read [outputs](/outputs/) before wiring fields into dashboards or PR comments. + +# Benchmark functions + +Canonical URL: https://docs.mobench.org/benchmark-functions/ +Description: Register discoverable benchmark functions with the mobench SDK. +Source: Current API specification — https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/docs/specs/mobench-current-spec.md — Benchmark macro rules, runtime API, and SDK feature flags. + +`#[benchmark]` registers a Rust function at compile time through `inventory`. The SDK runner and CLI use that registry to discover the function by its fully qualified name. + +## Minimal function + +```rust +use mobench_sdk::benchmark; + +#[benchmark] +pub fn parse_fixture() { + let input = std::hint::black_box(include_bytes!("fixture.bin")); + let parsed = parse(input); + std::hint::black_box(parsed); +} +``` + +A simple benchmark: + +- takes no parameters +- returns `()` +- is public when generated mobile runners need to link it +- keeps the measured work and result observable to the optimizer + +Async functions, parameters on a simple benchmark, and non-unit return types are rejected at compile time. Use [setup and teardown](/setup-teardown/) when the measured function needs an input. + +## Discover registered functions + +```bash +mobench list --crate-path bench-mobile +``` + +Pass the exact discovered name to `--function`: + +```bash +mobench run \ + --target android \ + --crate-path bench-mobile \ + --function bench_mobile::parse_fixture \ + --local-only +``` + +The host-only command is a discovery and reporting preflight. Select a device for a mobile measurement. + +## Programmatic execution + +Applications that need the SDK directly can build a validated `BenchSpec` and use the registry runner: + +```rust +use mobench_sdk::{run_benchmark, BenchSpec}; + +let spec = BenchSpec::new("bench_mobile::parse_fixture", 100, 10)?; +let report = run_benchmark(spec)?; +println!("median: {} ns", report.median_ns()); +``` + +For CI integrations, prefer the CLI's stable files over private implementation modules. + +## Named semantic phases + +When a benchmark contains meaningful sub-operations, `profile_phase` can record phase metadata separately from sampled native stacks: + +```rust +use mobench_sdk::{benchmark, profile_phase}; + +#[benchmark] +pub fn prove_and_verify() { + let proof = profile_phase("prove", || prove()); + profile_phase("verify", || verify(&proof)); +} +``` + +## Next step + +Choose a fixture lifecycle in [setup and teardown](/setup-teardown/), then apply the quality checklist. + +# Setup and teardown + +Canonical URL: https://docs.mobench.org/setup-teardown/ +Description: Keep fixture creation, mutation, and cleanup outside measured samples. +Source: Current API specification — https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/docs/specs/mobench-current-spec.md — Implemented setup, per-iteration setup, and teardown semantics. + +Use the macro's fixture attributes when input creation or cleanup is not part of the operation you want to measure. + +## Reuse one fixture + +Setup runs once before warmup and measured iterations. The benchmark receives a shared reference. + +```rust +use mobench_sdk::benchmark; + +fn create_input() -> Vec { + vec![42; 1024 * 1024] +} + +#[benchmark(setup = create_input)] +pub fn checksum(input: &Vec) { + let sum: u64 = input.iter().map(|byte| u64::from(*byte)).sum(); + std::hint::black_box(sum); +} +``` + +Choose this mode when repeated work does not mutate the fixture in a way that changes later samples. + +## Create a fresh fixture per iteration + +`per_iteration` runs setup before each warmup or measured iteration and passes the value by ownership. Setup remains outside the sample timer. + +```rust +use mobench_sdk::benchmark; + +fn unsorted_values() -> Vec { + (0..10_000).rev().collect() +} + +#[benchmark(setup = unsorted_values, per_iteration)] +pub fn sort_values(mut values: Vec) { + values.sort_unstable(); + std::hint::black_box(values); +} +``` + +Use this mode when the operation consumes or irreversibly mutates its input. + +## Clean up after the run + +Teardown receives the setup value after warmup and measurement. It runs outside measured timing, including when measured execution returns an error. + +```rust +fn open_store() -> Store { + Store::temporary() +} + +fn remove_store(store: Store) { + store.remove(); +} + +#[benchmark(setup = open_store, teardown = remove_store)] +pub fn query_store(store: &Store) { + std::hint::black_box(store.query("key")); +} +``` + +Teardown is not combined with `per_iteration`; make a consumed fixture clean itself up through ownership when each iteration needs independent cleanup. + +## Next step + +Run the benchmark with multiple warmups and inspect it against the [quality checklist](/benchmark-quality/). + +# Benchmark quality + +Canonical URL: https://docs.mobench.org/benchmark-quality/ +Description: Design mobile benchmarks that produce comparable, defensible results. +Source: BrowserStack metrics guide — https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/docs/guides/browserstack-metrics.md — Result interpretation, optional resource data, and comparison guidance. + +A mobile number is useful only when the work, build, device, and run conditions are clear enough to reproduce. + +## Keep the optimizer honest + +- Pass variable inputs and final outputs through `std::hint::black_box` or `mobench_sdk::black_box`. +- Make the workload long enough to rise above timer resolution and harness overhead. +- Keep setup, cloning, and cleanup outside the measured closure unless they are the subject of the benchmark. +- Prefer deterministic fixture data over network or wall-clock dependencies. + +## Separate warmup from measurement + +Warmups execute the benchmark without adding samples. They can stabilize code paths and caches, but they do not guarantee a thermally stable device. + +Use the same warmup and iteration counts when comparing revisions. Record changes to either value as a new experiment. + +## Compare like with like + +Keep these dimensions stable: + +- device model and OS version +- release versus debug build +- benchmark function and fixture +- runner backend +- iteration and warmup counts +- relevant dependency and toolchain versions + +Prefer medians and percentiles when isolated scheduling noise affects the mean. Repeat the full run when a result is close to your regression threshold. + +## Treat resource values as optional + +CPU and memory measurements depend on runner and provider availability. A blank or absent value means **unavailable**. Do not coerce it to zero, carry it into arithmetic, or claim that it was measured. + +mobench 0.1.43 does not define a power-consumption metric. + +## Use the right execution mode + +`--local-only` validates the host harness and output pipeline. It does not measure Android or iOS execution. For mobile results, choose a BrowserStack device and use `--release`. + +Native profiling is a separate local workflow and should answer *where time is spent*, not replace repeated timing samples. + +## Pre-baseline checklist + +- The function appears in `mobench list`. +- A host preflight completes without warnings you do not understand. +- The release mobile build succeeds. +- The exact device identifier resolves. +- The output contains the expected number of measured samples. +- Missing resource values remain missing. +- The baseline file is stored with its environment metadata. + +## Next step + +Complete the [host-side preflight](/host-preflight/) before spending BrowserStack time. diff --git a/apps/docs/public/llms.txt b/apps/docs/public/llms.txt new file mode 100644 index 0000000..699a900 --- /dev/null +++ b/apps/docs/public/llms.txt @@ -0,0 +1,51 @@ +# mobench + +> Source-backed documentation for mobench 0.1.43: build Android and iOS runners, execute ordinary benchmarks on BrowserStack devices, and analyze stable reports or supported local native profiles. + +Canonical documentation: https://docs.mobench.org/ +Source: https://github.com/worldcoin/mobile-bench-rs/tree/v0.1.43 +Pinned release SHA: d1a3176f9144f35e777e83fd07045116144da257 + +## Capability boundary + +- Use the `mobench` executable for release 0.1.43. The published `cargo mobench` wrapper is unsupported. +- Ordinary mobile benchmarks execute through BrowserStack when devices are selected. +- `--local-only` is host preflight and does not measure Android or iOS execution. +- Local native profiling has a separate Android simpleperf and iOS simulator-host capability matrix. +- The release does not define an energy or battery measurement contract. + +## Documentation + +- [Outputs and metrics](https://docs.mobench.org/outputs/): Understand mobench JSON, Markdown, CSV, plots, and optional resource values. +- [Regression comparison](https://docs.mobench.org/regressions/): Compare compatible mobench summaries and gate meaningful slowdowns. +- [Local native profiling](https://docs.mobench.org/profiling/): Capture Android and iOS native stacks and compare profile manifests locally. +- [Basic benchmark crate](https://docs.mobench.org/basic-example/): Follow the minimal SDK example from registration to host and mobile execution. +- [FFI benchmark crate](https://docs.mobench.org/ffi-example/): Expose mobench benchmarks through UniFFI, the native C ABI, or BoltFFI. +- [Installation](https://docs.mobench.org/installation/): Install mobench 0.1.43 and prepare a Rust benchmark crate. +- [Quickstart](https://docs.mobench.org/quickstart/): Register a Rust benchmark, validate it on the host, and run it on a mobile device. +- [Troubleshooting](https://docs.mobench.org/troubleshooting/): Diagnose discovery, toolchain, BrowserStack, result, and profiling failures. +- [mobench documentation](https://docs.mobench.org/): Build, run, and analyze Rust benchmarks on Android and iOS. +- [CLI reference](https://docs.mobench.org/cli/): Find mobench commands and the flags that connect authoring, execution, CI, and profiling. +- [Configuration](https://docs.mobench.org/configuration/): Configure project builds separately from benchmark run and provider settings. +- [Device matrices](https://docs.mobench.org/device-matrices/): Select BrowserStack Android and iOS devices deterministically with tags. +- [Output schemas](https://docs.mobench.org/schemas/): Use the versioned mobench JSON contracts without depending on private implementation details. +- [Compatibility](https://docs.mobench.org/compatibility/): Match Rust, platform tools, devices, and generated runner backends to mobench 0.1.43. +- [Host-side preflight](https://docs.mobench.org/host-preflight/): Validate configuration, discovery, builds, and reports before using mobile devices. +- [BrowserStack device runs](https://docs.mobench.org/browserstack/): Build, upload, run, and fetch Rust benchmarks with BrowserStack App Automate. +- [CI runs](https://docs.mobench.org/ci/): Run repeatable mobile benchmarks and produce stable CI artifacts. +- [Benchmark functions](https://docs.mobench.org/benchmark-functions/): Register discoverable benchmark functions with the mobench SDK. +- [Setup and teardown](https://docs.mobench.org/setup-teardown/): Keep fixture creation, mutation, and cleanup outside measured samples. +- [Benchmark quality](https://docs.mobench.org/benchmark-quality/): Design mobile benchmarks that produce comparable, defensible results. + +## Stable command entry points + +```bash +cargo install mobench --version 0.1.43 +mobench list --crate-path bench-mobile +mobench run --target android --function bench_mobile::checksum --local-only --output target/mobench/preflight.json +mobench run --target android --function bench_mobile::checksum --devices "Google Pixel 7-13.0" --release --fetch --output target/mobench/results.json +mobench ci run --target android --function bench_mobile::checksum --devices "Google Pixel 7-13.0" --release --fetch --output-dir target/mobench/ci +mobench profile run --target android --provider local --backend android-native --function bench_mobile::checksum --output-dir target/mobench/profile +``` + +Full authored documentation: https://docs.mobench.org/llms-full.txt diff --git a/apps/docs/public/manifests/mobench-site-manifest-v1.json b/apps/docs/public/manifests/mobench-site-manifest-v1.json new file mode 100644 index 0000000..9333624 --- /dev/null +++ b/apps/docs/public/manifests/mobench-site-manifest-v1.json @@ -0,0 +1,9063 @@ +{ + "schema_version": 1, + "release": { + "version": "0.1.43", + "tag": "v0.1.43", + "sha": "d1a3176f9144f35e777e83fd07045116144da257", + "repository": "https://github.com/worldcoin/mobile-bench-rs" + }, + "msrv": "1.85", + "binaries": [ + { + "name": "mobench", + "invocation": "mobench ", + "canonical_for_release": true, + "status": "supported", + "note": "Canonical executable for the pinned v0.1.43 release." + }, + { + "name": "cargo-mobench", + "invocation": "cargo mobench ", + "canonical_for_release": false, + "status": "unsupported", + "note": "The published v0.1.43 wrapper forwards Cargo's injected `mobench` token. A source fix is integration-tested but requires a later release." + } + ], + "command_tree": { + "name": "mobench", + "path": "mobench", + "about": "Mobile Rust benchmarking orchestrator", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "version", + "long": "version", + "short": "V", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Version", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print version" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [ + { + "name": "build", + "path": "mobench build", + "about": "Build mobile artifacts from the resolved benchmark crate", + "options": [ + { + "id": "crate_path", + "long": "crate-path", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CRATE_PATH" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to the benchmark crate (default: auto-detect bench-mobile/ or crates/{crate})" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "ios_completion_timeout_secs", + "long": "ios-completion-timeout-secs", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": true, + "action": "Set", + "value_names": [ + "IOS_COMPLETION_TIMEOUT_SECS" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Deprecated compatibility flag for generated XCUITest harness timeout" + }, + { + "id": "ios_deployment_target", + "long": "ios-deployment-target", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "IOS_DEPLOYMENT_TARGET" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "iOS deployment target for generated app and XCUITest targets" + }, + { + "id": "ios_runner", + "long": "ios-runner", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "IOS_RUNNER" + ], + "possible_values": [ + "swiftui", + "uikit-legacy" + ], + "defaults": [], + "environment": null, + "help": "iOS runner template (swiftui or uikit-legacy)" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output_dir", + "long": "output-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT_DIR" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Output directory for mobile artifacts (default: target/mobench)" + }, + { + "id": "progress", + "long": "progress", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "PROGRESS" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Show simplified step-by-step progress output" + }, + { + "id": "project_root", + "long": "project-root", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PROJECT_ROOT" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Project root containing mobench.toml or the Cargo workspace" + }, + { + "id": "release", + "long": "release", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "RELEASE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Build in release mode" + }, + { + "id": "target", + "long": "target", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "TARGET" + ], + "possible_values": [ + "android", + "both", + "ios" + ], + "defaults": [], + "environment": null, + "help": null + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "check", + "path": "mobench check", + "about": "Check prerequisites for building mobile artifacts", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "format", + "long": "format", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FORMAT" + ], + "possible_values": [ + "json", + "text" + ], + "defaults": [ + "text" + ], + "environment": null, + "help": "Output format (text or json)" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help (see more with '--help')" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "target", + "long": "target", + "short": "t", + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "TARGET" + ], + "possible_values": [ + "android", + "both", + "ios" + ], + "defaults": [], + "environment": null, + "help": "Target platform (android or ios)" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "ci", + "path": "mobench ci", + "about": "CI helpers (workflow and action scaffolding)", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [ + { + "name": "check-run", + "path": "mobench ci check-run", + "about": "Create a GitHub Check Run with benchmark results", + "options": [ + { + "id": "annotation_path", + "long": "annotation-path", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "ANNOTATION_PATH" + ], + "possible_values": [], + "defaults": [ + "src/lib.rs" + ], + "environment": null, + "help": "File path used in Check Run annotations (relative to repo root)" + }, + { + "id": "baseline", + "long": "baseline", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "BASELINE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Optional baseline JSON for regression detection" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "name", + "long": "name", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "NAME" + ], + "possible_values": [], + "defaults": [ + "Mobench" + ], + "environment": null, + "help": "Check Run name displayed in the PR" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "regression_threshold_pct", + "long": "regression-threshold-pct", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "REGRESSION_THRESHOLD_PCT" + ], + "possible_values": [], + "defaults": [ + "5" + ], + "environment": null, + "help": "Regression threshold percentage" + }, + { + "id": "repo", + "long": "repo", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "REPO" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "GitHub repository (owner/repo format)" + }, + { + "id": "results", + "long": "results", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "RESULTS" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to summary JSON with benchmark results" + }, + { + "id": "results_dir", + "long": "results-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "RESULTS_DIR" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Directory containing summary JSON files (processes all)" + }, + { + "id": "sha", + "long": "sha", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "SHA" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Git commit SHA to annotate" + }, + { + "id": "token", + "long": "token", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": true, + "action": "Set", + "value_names": [ + "TOKEN" + ], + "possible_values": [], + "defaults": [], + "environment": "GITHUB_TOKEN", + "help": "GitHub App token (from GITHUB_TOKEN env var or actions/create-github-app-token)" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "help", + "path": "mobench ci help", + "about": "Print this message or the help of the given subcommand(s)", + "options": [], + "subcommands": [ + { + "name": "check-run", + "path": "mobench ci help check-run", + "about": "Create a GitHub Check Run with benchmark results", + "options": [], + "subcommands": [] + }, + { + "name": "help", + "path": "mobench ci help help", + "about": "Print this message or the help of the given subcommand(s)", + "options": [], + "subcommands": [] + }, + { + "name": "init", + "path": "mobench ci help init", + "about": "Generate GitHub Actions workflow + local action wrapper", + "options": [], + "subcommands": [] + }, + { + "name": "merge-split-runs", + "path": "mobench ci help merge-split-runs", + "about": "Merge one-sample CI summaries into a normal CI output set", + "options": [], + "subcommands": [] + }, + { + "name": "run", + "path": "mobench ci help run", + "about": "Run a full CI benchmark flow with stable output contract", + "options": [], + "subcommands": [] + }, + { + "name": "summarize", + "path": "mobench ci help summarize", + "about": "Summarize benchmark results with device metrics", + "options": [], + "subcommands": [] + } + ] + }, + { + "name": "init", + "path": "mobench ci init", + "about": "Generate GitHub Actions workflow + local action wrapper", + "options": [ + { + "id": "action_dir", + "long": "action-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "ACTION_DIR" + ], + "possible_values": [], + "defaults": [ + ".github/actions/mobench" + ], + "environment": null, + "help": "Directory to write the local GitHub Action" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "workflow", + "long": "workflow", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "WORKFLOW" + ], + "possible_values": [], + "defaults": [ + ".github/workflows/mobile-bench.yml" + ], + "environment": null, + "help": "Path to write the workflow file" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "merge-split-runs", + "path": "mobench ci merge-split-runs", + "about": "Merge one-sample CI summaries into a normal CI output set", + "options": [ + { + "id": "device", + "long": "device", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "DEVICE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Device label all samples must match" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "function", + "long": "function", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FUNCTION" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Fully-qualified benchmark function all samples must contain" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "iterations", + "long": "iterations", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "ITERATIONS" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Expected measured sample count" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output_dir", + "long": "output-dir", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT_DIR" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Directory to write merged summary.json, summary.md, and results.csv" + }, + { + "id": "samples_dir", + "long": "samples-dir", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "SAMPLES_DIR" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Directory containing sample-*/summary.json one-sample CI outputs" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "warmup", + "long": "warmup", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "WARMUP" + ], + "possible_values": [], + "defaults": [ + "0" + ], + "environment": null, + "help": "Warmup count reported in merged CI summaries" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "run", + "path": "mobench ci run", + "about": "Run a full CI benchmark flow with stable output contract", + "options": [ + { + "id": "android_benchmark_timeout_secs", + "long": "android-benchmark-timeout-secs", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "ANDROID_BENCHMARK_TIMEOUT_SECS" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Android benchmark watchdog timeout in seconds for the generated harness" + }, + { + "id": "android_heartbeat_interval_secs", + "long": "android-heartbeat-interval-secs", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "ANDROID_HEARTBEAT_INTERVAL_SECS" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Android benchmark heartbeat interval in seconds for the generated harness" + }, + { + "id": "baseline", + "long": "baseline", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "BASELINE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Baseline summary source (path|url|artifact:)" + }, + { + "id": "config", + "long": "config", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CONFIG" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Optional path to config file" + }, + { + "id": "crate_path", + "long": "crate-path", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CRATE_PATH" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to the benchmark crate directory containing Cargo.toml" + }, + { + "id": "device_matrix", + "long": "device-matrix", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "DEVICE_MATRIX" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Device matrix YAML file to load device names from" + }, + { + "id": "device_tags", + "long": "device-tags", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Append", + "value_names": [ + "DEVICE_TAGS" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Device tags to select from the device matrix (comma-separated or repeatable)" + }, + { + "id": "devices", + "long": "devices", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Append", + "value_names": [ + "DEVICES" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Device identifiers or labels (BrowserStack devices)" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "fetch", + "long": "fetch", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "FETCH" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Fetch BrowserStack artifacts after the run completes" + }, + { + "id": "fetch_output_dir", + "long": "fetch-output-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FETCH_OUTPUT_DIR" + ], + "possible_values": [], + "defaults": [ + "target/browserstack" + ], + "environment": null, + "help": null + }, + { + "id": "fetch_poll_interval_secs", + "long": "fetch-poll-interval-secs", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FETCH_POLL_INTERVAL_SECS" + ], + "possible_values": [], + "defaults": [ + "5" + ], + "environment": null, + "help": null + }, + { + "id": "fetch_timeout_secs", + "long": "fetch-timeout-secs", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FETCH_TIMEOUT_SECS" + ], + "possible_values": [], + "defaults": [ + "300" + ], + "environment": null, + "help": null + }, + { + "id": "function", + "long": "function", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FUNCTION" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Fully-qualified Rust function to benchmark (single function)" + }, + { + "id": "functions", + "long": "functions", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Append", + "value_names": [ + "FUNCTIONS" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Multiple benchmark functions (comma-separated or JSON array). Runs each in sequence." + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "ios_app", + "long": "ios-app", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "IOS_APP" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to iOS app bundle (.ipa or zipped .app) for BrowserStack XCUITest" + }, + { + "id": "ios_completion_timeout_secs", + "long": "ios-completion-timeout-secs", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": true, + "action": "Set", + "value_names": [ + "IOS_COMPLETION_TIMEOUT_SECS" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Deprecated compatibility flag for generated XCUITest harness timeout" + }, + { + "id": "ios_deployment_target", + "long": "ios-deployment-target", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "IOS_DEPLOYMENT_TARGET" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "iOS deployment target for generated app and XCUITest targets" + }, + { + "id": "ios_runner", + "long": "ios-runner", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "IOS_RUNNER" + ], + "possible_values": [ + "swiftui", + "uikit-legacy" + ], + "defaults": [], + "environment": null, + "help": "iOS runner template (swiftui or uikit-legacy)" + }, + { + "id": "ios_test_suite", + "long": "ios-test-suite", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "IOS_TEST_SUITE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to iOS XCUITest test suite package (.zip or .ipa)" + }, + { + "id": "iterations", + "long": "iterations", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "ITERATIONS" + ], + "possible_values": [], + "defaults": [ + "100" + ], + "environment": null, + "help": null + }, + { + "id": "junit", + "long": "junit", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "JUNIT" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Write JUnit XML report to the given path" + }, + { + "id": "local_only", + "long": "local-only", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "LOCAL_ONLY" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Skip mobile builds and write host-side preflight/spec output without mobile execution" + }, + { + "id": "mobench_ref", + "long": "mobench-ref", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "MOBENCH_REF" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Metadata: git ref/sha for this mobench invocation" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output_dir", + "long": "output-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT_DIR" + ], + "possible_values": [], + "defaults": [ + "target/mobench/ci" + ], + "environment": null, + "help": "Output directory for CI contract files" + }, + { + "id": "plots", + "long": "plots", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PLOTS" + ], + "possible_values": [ + "auto", + "off", + "require" + ], + "defaults": [ + "auto" + ], + "environment": null, + "help": null + }, + { + "id": "pr_number", + "long": "pr-number", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PR_NUMBER" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Metadata: pull request number" + }, + { + "id": "progress", + "long": "progress", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "PROGRESS" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Show simplified step-by-step progress output" + }, + { + "id": "regression_threshold_pct", + "long": "regression-threshold-pct", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "REGRESSION_THRESHOLD_PCT" + ], + "possible_values": [], + "defaults": [ + "5" + ], + "environment": null, + "help": "Regression threshold percentage when comparing to baseline" + }, + { + "id": "release", + "long": "release", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "RELEASE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Build in release mode (recommended for BrowserStack to reduce APK size and upload time)" + }, + { + "id": "request_command", + "long": "request-command", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "REQUEST_COMMAND" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Metadata: original command requested by the caller" + }, + { + "id": "requested_by", + "long": "requested-by", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "REQUESTED_BY" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Metadata: user or actor that requested the run" + }, + { + "id": "target", + "long": "target", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "TARGET" + ], + "possible_values": [ + "android", + "both", + "ios" + ], + "defaults": [], + "environment": null, + "help": null + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "warmup", + "long": "warmup", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "WARMUP" + ], + "possible_values": [], + "defaults": [ + "10" + ], + "environment": null, + "help": null + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "summarize", + "path": "mobench ci summarize", + "about": "Summarize benchmark results with device metrics", + "options": [ + { + "id": "build_id", + "long": "build-id", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "BUILD_ID" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "BrowserStack build ID to enrich results with device metrics (requires --results-dir)" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help (see more with '--help')" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output_file", + "long": "output-file", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT_FILE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Write output to file in addition to stdout" + }, + { + "id": "output_format", + "long": "output-format", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT_FORMAT" + ], + "possible_values": [ + "json", + "markdown", + "table" + ], + "defaults": [ + "table" + ], + "environment": null, + "help": "Output format: table (terminal), markdown, or json" + }, + { + "id": "platform", + "long": "platform", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PLATFORM" + ], + "possible_values": [ + "android", + "ios" + ], + "defaults": [], + "environment": null, + "help": "Platform filter (show only one platform)" + }, + { + "id": "results_dir", + "long": "results-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "RESULTS_DIR" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Directory containing summary.json/CSV results (offline mode)" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + } + ] + }, + { + "name": "compare", + "path": "mobench compare", + "about": "Compare two run summaries for regressions", + "options": [ + { + "id": "baseline", + "long": "baseline", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "BASELINE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Baseline JSON summary to compare against" + }, + { + "id": "candidate", + "long": "candidate", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CANDIDATE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Candidate JSON summary to compare" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output", + "long": "output", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Optional output path for markdown report" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "config", + "path": "mobench config", + "about": "Validate run configuration and associated files", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [ + { + "name": "help", + "path": "mobench config help", + "about": "Print this message or the help of the given subcommand(s)", + "options": [], + "subcommands": [ + { + "name": "help", + "path": "mobench config help help", + "about": "Print this message or the help of the given subcommand(s)", + "options": [], + "subcommands": [] + }, + { + "name": "validate", + "path": "mobench config help validate", + "about": "Validate bench-config.toml and referenced matrix/settings", + "options": [], + "subcommands": [] + } + ] + }, + { + "name": "validate", + "path": "mobench config validate", + "about": "Validate bench-config.toml and referenced matrix/settings", + "options": [ + { + "id": "config", + "long": "config", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CONFIG" + ], + "possible_values": [], + "defaults": [ + "bench-config.toml" + ], + "environment": null, + "help": null + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "format", + "long": "format", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FORMAT" + ], + "possible_values": [ + "json", + "text" + ], + "defaults": [ + "text" + ], + "environment": null, + "help": null + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + } + ] + }, + { + "name": "devices", + "path": "mobench devices", + "about": "List available BrowserStack devices for testing", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help (see more with '--help')" + }, + { + "id": "json", + "long": "json", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "JSON" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Output as JSON" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "platform", + "long": "platform", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PLATFORM" + ], + "possible_values": [ + "android", + "ios" + ], + "defaults": [], + "environment": null, + "help": "Filter by platform (android or ios)" + }, + { + "id": "validate", + "long": "validate", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Append", + "value_names": [ + "VALIDATE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Validate device specs against available devices" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [ + { + "name": "help", + "path": "mobench devices help", + "about": "Print this message or the help of the given subcommand(s)", + "options": [], + "subcommands": [ + { + "name": "help", + "path": "mobench devices help help", + "about": "Print this message or the help of the given subcommand(s)", + "options": [], + "subcommands": [] + }, + { + "name": "resolve", + "path": "mobench devices help resolve", + "about": "Resolve devices from a matrix deterministically for CI usage", + "options": [], + "subcommands": [] + } + ] + }, + { + "name": "resolve", + "path": "mobench devices resolve", + "about": "Resolve devices from a matrix deterministically for CI usage", + "options": [ + { + "id": "config", + "long": "config", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CONFIG" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to run config file (optional source for matrix/tags)" + }, + { + "id": "device_matrix", + "long": "device-matrix", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "DEVICE_MATRIX" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to device matrix YAML file" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "format", + "long": "format", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FORMAT" + ], + "possible_values": [ + "json", + "text" + ], + "defaults": [ + "text" + ], + "environment": null, + "help": null + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "platform", + "long": "platform", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PLATFORM" + ], + "possible_values": [ + "android", + "ios" + ], + "defaults": [], + "environment": null, + "help": null + }, + { + "id": "profile", + "long": "profile", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PROFILE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Device profile/tag to resolve (defaults to `default`)" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + } + ] + }, + { + "name": "doctor", + "path": "mobench doctor", + "about": "Validate local + CI prerequisites and configuration", + "options": [ + { + "id": "browserstack", + "long": "browserstack", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "BROWSERSTACK" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "true" + ], + "environment": null, + "help": "Validate BrowserStack credentials" + }, + { + "id": "config", + "long": "config", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CONFIG" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Optional path to run config file to validate" + }, + { + "id": "device_matrix", + "long": "device-matrix", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "DEVICE_MATRIX" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Optional path to device matrix YAML file to validate" + }, + { + "id": "device_tags", + "long": "device-tags", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Append", + "value_names": [ + "DEVICE_TAGS" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Device tags to select from the device matrix (comma-separated or repeatable)" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "format", + "long": "format", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FORMAT" + ], + "possible_values": [ + "json", + "text" + ], + "defaults": [ + "text" + ], + "environment": null, + "help": null + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "target", + "long": "target", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "TARGET" + ], + "possible_values": [ + "android", + "both", + "ios" + ], + "defaults": [ + "both" + ], + "environment": null, + "help": null + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "fetch", + "path": "mobench fetch", + "about": "Fetch BrowserStack build artifacts (logs, session JSON) for CI", + "options": [ + { + "id": "build_id", + "long": "build-id", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "BUILD_ID" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": null + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help (see more with '--help')" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output_dir", + "long": "output-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT_DIR" + ], + "possible_values": [], + "defaults": [ + "target/browserstack" + ], + "environment": null, + "help": null + }, + { + "id": "poll_interval_secs", + "long": "poll-interval-secs", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "POLL_INTERVAL_SECS" + ], + "possible_values": [], + "defaults": [ + "10" + ], + "environment": null, + "help": null + }, + { + "id": "target", + "long": "target", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "TARGET" + ], + "possible_values": [ + "android", + "ios" + ], + "defaults": [], + "environment": null, + "help": null + }, + { + "id": "timeout_secs", + "long": "timeout-secs", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "TIMEOUT_SECS" + ], + "possible_values": [], + "defaults": [ + "1800" + ], + "environment": null, + "help": null + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "wait", + "long": "wait", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "WAIT" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "true" + ], + "environment": null, + "help": null + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "fixture", + "path": "mobench fixture", + "about": "Fixture lifecycle helpers for reproducible CI setup", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [ + { + "name": "build", + "path": "mobench fixture build", + "about": "Build fixture artifacts using existing build commands", + "options": [ + { + "id": "crate_path", + "long": "crate-path", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CRATE_PATH" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to benchmark crate" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output_dir", + "long": "output-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT_DIR" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Output directory for mobile artifacts" + }, + { + "id": "progress", + "long": "progress", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "PROGRESS" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Show simplified step-by-step progress output" + }, + { + "id": "release", + "long": "release", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "RELEASE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Build in release mode" + }, + { + "id": "target", + "long": "target", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "TARGET" + ], + "possible_values": [ + "android", + "both", + "ios" + ], + "defaults": [ + "both" + ], + "environment": null, + "help": null + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "cache-key", + "path": "mobench fixture cache-key", + "about": "Compute deterministic fixture cache key from config/toolchain inputs", + "options": [ + { + "id": "config", + "long": "config", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CONFIG" + ], + "possible_values": [], + "defaults": [ + "bench-config.toml" + ], + "environment": null, + "help": null + }, + { + "id": "device_matrix", + "long": "device-matrix", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "DEVICE_MATRIX" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": null + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "format", + "long": "format", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FORMAT" + ], + "possible_values": [ + "json", + "text" + ], + "defaults": [ + "text" + ], + "environment": null, + "help": null + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "profile", + "long": "profile", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PROFILE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Device profile/tag for keying" + }, + { + "id": "target", + "long": "target", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "TARGET" + ], + "possible_values": [ + "android", + "both", + "ios" + ], + "defaults": [ + "both" + ], + "environment": null, + "help": null + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "help", + "path": "mobench fixture help", + "about": "Print this message or the help of the given subcommand(s)", + "options": [], + "subcommands": [ + { + "name": "build", + "path": "mobench fixture help build", + "about": "Build fixture artifacts using existing build commands", + "options": [], + "subcommands": [] + }, + { + "name": "cache-key", + "path": "mobench fixture help cache-key", + "about": "Compute deterministic fixture cache key from config/toolchain inputs", + "options": [], + "subcommands": [] + }, + { + "name": "help", + "path": "mobench fixture help help", + "about": "Print this message or the help of the given subcommand(s)", + "options": [], + "subcommands": [] + }, + { + "name": "init", + "path": "mobench fixture help init", + "about": "Create starter fixture files for CI runs", + "options": [], + "subcommands": [] + }, + { + "name": "verify", + "path": "mobench fixture help verify", + "about": "Verify fixture files and optional profile filtering", + "options": [], + "subcommands": [] + }, + { + "name": "verify-plots", + "path": "mobench fixture help verify-plots", + "about": "Render and verify checked-in plot fixtures", + "options": [], + "subcommands": [] + } + ] + }, + { + "name": "init", + "path": "mobench fixture init", + "about": "Create starter fixture files for CI runs", + "options": [ + { + "id": "config", + "long": "config", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CONFIG" + ], + "possible_values": [], + "defaults": [ + "bench-config.toml" + ], + "environment": null, + "help": null + }, + { + "id": "device_matrix", + "long": "device-matrix", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "DEVICE_MATRIX" + ], + "possible_values": [], + "defaults": [ + "device-matrix.yaml" + ], + "environment": null, + "help": null + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "force", + "long": "force", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "FORCE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Overwrite existing fixture files" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "verify", + "path": "mobench fixture verify", + "about": "Verify fixture files and optional profile filtering", + "options": [ + { + "id": "config", + "long": "config", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CONFIG" + ], + "possible_values": [], + "defaults": [ + "bench-config.toml" + ], + "environment": null, + "help": null + }, + { + "id": "device_matrix", + "long": "device-matrix", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "DEVICE_MATRIX" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": null + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "format", + "long": "format", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FORMAT" + ], + "possible_values": [ + "json", + "text" + ], + "defaults": [ + "text" + ], + "environment": null, + "help": null + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "profile", + "long": "profile", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PROFILE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Device profile/tag to verify" + }, + { + "id": "target", + "long": "target", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "TARGET" + ], + "possible_values": [ + "android", + "both", + "ios" + ], + "defaults": [ + "both" + ], + "environment": null, + "help": null + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "verify-plots", + "path": "mobench fixture verify-plots", + "about": "Render and verify checked-in plot fixtures", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "fixture", + "long": null, + "short": null, + "positional_index": 1, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FIXTURE" + ], + "possible_values": [ + "basic", + "ffi" + ], + "defaults": [], + "environment": null, + "help": null + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output_dir", + "long": "output-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT_DIR" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Output directory for rendered fixture artifacts (defaults under target/mobench/plot-fixtures)" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + } + ] + }, + { + "name": "help", + "path": "mobench help", + "about": "Print this message or the help of the given subcommand(s)", + "options": [], + "subcommands": [ + { + "name": "build", + "path": "mobench help build", + "about": "Build mobile artifacts from the resolved benchmark crate", + "options": [], + "subcommands": [] + }, + { + "name": "check", + "path": "mobench help check", + "about": "Check prerequisites for building mobile artifacts", + "options": [], + "subcommands": [] + }, + { + "name": "ci", + "path": "mobench help ci", + "about": "CI helpers (workflow and action scaffolding)", + "options": [], + "subcommands": [ + { + "name": "check-run", + "path": "mobench help ci check-run", + "about": "Create a GitHub Check Run with benchmark results", + "options": [], + "subcommands": [] + }, + { + "name": "init", + "path": "mobench help ci init", + "about": "Generate GitHub Actions workflow + local action wrapper", + "options": [], + "subcommands": [] + }, + { + "name": "merge-split-runs", + "path": "mobench help ci merge-split-runs", + "about": "Merge one-sample CI summaries into a normal CI output set", + "options": [], + "subcommands": [] + }, + { + "name": "run", + "path": "mobench help ci run", + "about": "Run a full CI benchmark flow with stable output contract", + "options": [], + "subcommands": [] + }, + { + "name": "summarize", + "path": "mobench help ci summarize", + "about": "Summarize benchmark results with device metrics", + "options": [], + "subcommands": [] + } + ] + }, + { + "name": "compare", + "path": "mobench help compare", + "about": "Compare two run summaries for regressions", + "options": [], + "subcommands": [] + }, + { + "name": "config", + "path": "mobench help config", + "about": "Validate run configuration and associated files", + "options": [], + "subcommands": [ + { + "name": "validate", + "path": "mobench help config validate", + "about": "Validate bench-config.toml and referenced matrix/settings", + "options": [], + "subcommands": [] + } + ] + }, + { + "name": "devices", + "path": "mobench help devices", + "about": "List available BrowserStack devices for testing", + "options": [], + "subcommands": [ + { + "name": "resolve", + "path": "mobench help devices resolve", + "about": "Resolve devices from a matrix deterministically for CI usage", + "options": [], + "subcommands": [] + } + ] + }, + { + "name": "doctor", + "path": "mobench help doctor", + "about": "Validate local + CI prerequisites and configuration", + "options": [], + "subcommands": [] + }, + { + "name": "fetch", + "path": "mobench help fetch", + "about": "Fetch BrowserStack build artifacts (logs, session JSON) for CI", + "options": [], + "subcommands": [] + }, + { + "name": "fixture", + "path": "mobench help fixture", + "about": "Fixture lifecycle helpers for reproducible CI setup", + "options": [], + "subcommands": [ + { + "name": "build", + "path": "mobench help fixture build", + "about": "Build fixture artifacts using existing build commands", + "options": [], + "subcommands": [] + }, + { + "name": "cache-key", + "path": "mobench help fixture cache-key", + "about": "Compute deterministic fixture cache key from config/toolchain inputs", + "options": [], + "subcommands": [] + }, + { + "name": "init", + "path": "mobench help fixture init", + "about": "Create starter fixture files for CI runs", + "options": [], + "subcommands": [] + }, + { + "name": "verify", + "path": "mobench help fixture verify", + "about": "Verify fixture files and optional profile filtering", + "options": [], + "subcommands": [] + }, + { + "name": "verify-plots", + "path": "mobench help fixture verify-plots", + "about": "Render and verify checked-in plot fixtures", + "options": [], + "subcommands": [] + } + ] + }, + { + "name": "help", + "path": "mobench help help", + "about": "Print this message or the help of the given subcommand(s)", + "options": [], + "subcommands": [] + }, + { + "name": "init", + "path": "mobench help init", + "about": "Scaffold a base config file for the CLI", + "options": [], + "subcommands": [] + }, + { + "name": "init-sdk", + "path": "mobench help init-sdk", + "about": "Initialize a new benchmark project with the SDK templates", + "options": [], + "subcommands": [] + }, + { + "name": "list", + "path": "mobench help list", + "about": "List all discovered benchmark functions", + "options": [], + "subcommands": [] + }, + { + "name": "package-ipa", + "path": "mobench help package-ipa", + "about": "Package iOS app as IPA for distribution or testing", + "options": [], + "subcommands": [] + }, + { + "name": "package-xcuitest", + "path": "mobench help package-xcuitest", + "about": "Package XCUITest runner for BrowserStack testing", + "options": [], + "subcommands": [] + }, + { + "name": "plan", + "path": "mobench help plan", + "about": "Generate a sample device matrix file", + "options": [], + "subcommands": [] + }, + { + "name": "profile", + "path": "mobench help profile", + "about": "Profiling helpers for native profile capture and summary rendering", + "options": [], + "subcommands": [ + { + "name": "diff", + "path": "mobench help profile diff", + "about": "Generate a differential flamegraph bundle from two normalized profile manifests", + "options": [], + "subcommands": [] + }, + { + "name": "run", + "path": "mobench help profile run", + "about": "Plan or execute a native profiling session; local android-native and ios-instruments now attempt real native capture", + "options": [], + "subcommands": [] + }, + { + "name": "summarize", + "path": "mobench help profile summarize", + "about": "Render markdown or JSON from a normalized profile manifest", + "options": [], + "subcommands": [] + } + ] + }, + { + "name": "report", + "path": "mobench help report", + "about": "Reporting helpers for CI summaries and PR comments", + "options": [], + "subcommands": [ + { + "name": "github", + "path": "mobench help report github", + "about": "Generate/publish sticky GitHub PR comment from summary output", + "options": [], + "subcommands": [] + }, + { + "name": "summarize", + "path": "mobench help report summarize", + "about": "Generate markdown summary from standardized output JSON", + "options": [], + "subcommands": [] + } + ] + }, + { + "name": "run", + "path": "mobench help run", + "about": "Build mobile artifacts, write host preflight output, or run on BrowserStack devices", + "options": [], + "subcommands": [] + }, + { + "name": "summary", + "path": "mobench help summary", + "about": "Display summary statistics from a benchmark report JSON file", + "options": [], + "subcommands": [] + }, + { + "name": "verify", + "path": "mobench help verify", + "about": "Verify benchmark setup: registry, spec, artifacts, and optional smoke test", + "options": [], + "subcommands": [] + } + ] + }, + { + "name": "init", + "path": "mobench init", + "about": "Scaffold a base config file for the CLI", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help (see more with '--help')" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output", + "long": "output", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT" + ], + "possible_values": [], + "defaults": [ + "bench-config.toml" + ], + "environment": null, + "help": null + }, + { + "id": "target", + "long": "target", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "TARGET" + ], + "possible_values": [ + "android", + "ios" + ], + "defaults": [ + "android" + ], + "environment": null, + "help": null + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "init-sdk", + "path": "mobench init-sdk", + "about": "Initialize a new benchmark project with the SDK templates", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "examples", + "long": "examples", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "EXAMPLES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Generate example benchmarks" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output_dir", + "long": "output-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT_DIR" + ], + "possible_values": [], + "defaults": [ + "." + ], + "environment": null, + "help": null + }, + { + "id": "project_name", + "long": "project-name", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PROJECT_NAME" + ], + "possible_values": [], + "defaults": [ + "bench-project" + ], + "environment": null, + "help": null + }, + { + "id": "target", + "long": "target", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "TARGET" + ], + "possible_values": [ + "android", + "both", + "ios" + ], + "defaults": [], + "environment": null, + "help": null + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "list", + "path": "mobench list", + "about": "List all discovered benchmark functions", + "options": [ + { + "id": "crate_path", + "long": "crate-path", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CRATE_PATH" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to the benchmark crate directory containing Cargo.toml" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "project_root", + "long": "project-root", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PROJECT_ROOT" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Project root containing mobench.toml or the Cargo workspace" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "package-ipa", + "path": "mobench package-ipa", + "about": "Package iOS app as IPA for distribution or testing", + "options": [ + { + "id": "crate_path", + "long": "crate-path", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CRATE_PATH" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to the benchmark crate directory containing Cargo.toml" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help (see more with '--help')" + }, + { + "id": "method", + "long": "method", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "METHOD" + ], + "possible_values": [ + "adhoc", + "development" + ], + "defaults": [ + "adhoc" + ], + "environment": null, + "help": "Signing method" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output_dir", + "long": "output-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT_DIR" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Output directory for mobile artifacts (default: target/mobench)" + }, + { + "id": "project_root", + "long": "project-root", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PROJECT_ROOT" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Project root containing mobench.toml or the Cargo workspace" + }, + { + "id": "scheme", + "long": "scheme", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "SCHEME" + ], + "possible_values": [], + "defaults": [ + "BenchRunner" + ], + "environment": null, + "help": "Xcode scheme to build" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "package-xcuitest", + "path": "mobench package-xcuitest", + "about": "Package XCUITest runner for BrowserStack testing", + "options": [ + { + "id": "crate_path", + "long": "crate-path", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CRATE_PATH" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to the benchmark crate directory containing Cargo.toml" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help (see more with '--help')" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output_dir", + "long": "output-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT_DIR" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Output directory for mobile artifacts (default: target/mobench)" + }, + { + "id": "project_root", + "long": "project-root", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PROJECT_ROOT" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Project root containing mobench.toml or the Cargo workspace" + }, + { + "id": "scheme", + "long": "scheme", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "SCHEME" + ], + "possible_values": [], + "defaults": [ + "BenchRunner" + ], + "environment": null, + "help": "Xcode scheme to build" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "plan", + "path": "mobench plan", + "about": "Generate a sample device matrix file", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output", + "long": "output", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT" + ], + "possible_values": [], + "defaults": [ + "device-matrix.yaml" + ], + "environment": null, + "help": null + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "profile", + "path": "mobench profile", + "about": "Profiling helpers for native profile capture and summary rendering", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [ + { + "name": "diff", + "path": "mobench profile diff", + "about": "Generate a differential flamegraph bundle from two normalized profile manifests", + "options": [ + { + "id": "baseline", + "long": "baseline", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "BASELINE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to the baseline profile.json manifest" + }, + { + "id": "candidate", + "long": "candidate", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CANDIDATE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to the candidate profile.json manifest" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "normalize", + "long": "normalize", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NORMALIZE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Normalize baseline sample counts to candidate totals before diffing" + }, + { + "id": "output_dir", + "long": "output-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT_DIR" + ], + "possible_values": [], + "defaults": [ + "target/mobench/profile/diff" + ], + "environment": null, + "help": "Output directory for differential profile artifacts" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "help", + "path": "mobench profile help", + "about": "Print this message or the help of the given subcommand(s)", + "options": [], + "subcommands": [ + { + "name": "diff", + "path": "mobench profile help diff", + "about": "Generate a differential flamegraph bundle from two normalized profile manifests", + "options": [], + "subcommands": [] + }, + { + "name": "help", + "path": "mobench profile help help", + "about": "Print this message or the help of the given subcommand(s)", + "options": [], + "subcommands": [] + }, + { + "name": "run", + "path": "mobench profile help run", + "about": "Plan or execute a native profiling session; local android-native and ios-instruments now attempt real native capture", + "options": [], + "subcommands": [] + }, + { + "name": "summarize", + "path": "mobench profile help summarize", + "about": "Render markdown or JSON from a normalized profile manifest", + "options": [], + "subcommands": [] + } + ] + }, + { + "name": "run", + "path": "mobench profile run", + "about": "Plan or execute a native profiling session; local android-native and ios-instruments now attempt real native capture", + "options": [ + { + "id": "backend", + "long": "backend", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "BACKEND" + ], + "possible_values": [ + "android-native", + "auto", + "ios-instruments", + "rust-tracing" + ], + "defaults": [ + "auto" + ], + "environment": null, + "help": null + }, + { + "id": "config", + "long": "config", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CONFIG" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Optional path to config file" + }, + { + "id": "crate_path", + "long": "crate-path", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CRATE_PATH" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to the benchmark crate directory containing Cargo.toml" + }, + { + "id": "device", + "long": "device", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "DEVICE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Explicit BrowserStack device name to resolve for this profiling request" + }, + { + "id": "device_matrix", + "long": "device-matrix", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "DEVICE_MATRIX" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to device matrix YAML file used with --profile or config-based device tags" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "format", + "long": "format", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FORMAT" + ], + "possible_values": [ + "both", + "native", + "processed" + ], + "defaults": [ + "both" + ], + "environment": null, + "help": null + }, + { + "id": "function", + "long": "function", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FUNCTION" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Fully-qualified Rust function to profile" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help (see more with '--help')" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "os_version", + "long": "os-version", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OS_VERSION" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "OS version for --device (for example `16` or `14.0`)" + }, + { + "id": "output_dir", + "long": "output-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT_DIR" + ], + "possible_values": [], + "defaults": [ + "target/mobench/profile" + ], + "environment": null, + "help": null + }, + { + "id": "profile", + "long": "profile", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PROFILE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Device profile/tag to resolve (for example `high-spec`)" + }, + { + "id": "provider", + "long": "provider", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PROVIDER" + ], + "possible_values": [ + "browserstack", + "local" + ], + "defaults": [ + "local" + ], + "environment": null, + "help": null + }, + { + "id": "target", + "long": "target", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "TARGET" + ], + "possible_values": [ + "android", + "ios" + ], + "defaults": [], + "environment": null, + "help": null + }, + { + "id": "trace_events_output", + "long": "trace-events-output", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "TRACE_EVENTS_OUTPUT" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Write machine-readable trace/event JSON to this path for downstream consumers" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "warmup_mode", + "long": "warmup-mode", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "WARMUP_MODE" + ], + "possible_values": [ + "cold", + "warm" + ], + "defaults": [], + "environment": null, + "help": "Warm or cold capture mode for local native profiling (defaults to warm for local Android/iOS native backends)" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "summarize", + "path": "mobench profile summarize", + "about": "Render markdown or JSON from a normalized profile manifest", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output", + "long": "output", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": null + }, + { + "id": "output_format", + "long": "output-format", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT_FORMAT" + ], + "possible_values": [ + "json", + "markdown" + ], + "defaults": [ + "markdown" + ], + "environment": null, + "help": null + }, + { + "id": "profile", + "long": "profile", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PROFILE" + ], + "possible_values": [], + "defaults": [ + "target/mobench/profile/profile.json" + ], + "environment": null, + "help": null + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + } + ] + }, + { + "name": "report", + "path": "mobench report", + "about": "Reporting helpers for CI summaries and PR comments", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [ + { + "name": "github", + "path": "mobench report github", + "about": "Generate/publish sticky GitHub PR comment from summary output", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "marker", + "long": "marker", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "MARKER" + ], + "possible_values": [], + "defaults": [ + "" + ], + "environment": null, + "help": null + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output", + "long": "output", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Write generated comment body to file" + }, + { + "id": "pr", + "long": "pr", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PR" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Pull request number (auto-detected from GITHUB_REF if omitted)" + }, + { + "id": "publish", + "long": "publish", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "PUBLISH" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Publish via GitHub API using GITHUB_TOKEN" + }, + { + "id": "summary", + "long": "summary", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "SUMMARY" + ], + "possible_values": [], + "defaults": [ + "target/mobench/ci/summary.json" + ], + "environment": null, + "help": null + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "help", + "path": "mobench report help", + "about": "Print this message or the help of the given subcommand(s)", + "options": [], + "subcommands": [ + { + "name": "github", + "path": "mobench report help github", + "about": "Generate/publish sticky GitHub PR comment from summary output", + "options": [], + "subcommands": [] + }, + { + "name": "help", + "path": "mobench report help help", + "about": "Print this message or the help of the given subcommand(s)", + "options": [], + "subcommands": [] + }, + { + "name": "summarize", + "path": "mobench report help summarize", + "about": "Generate markdown summary from standardized output JSON", + "options": [], + "subcommands": [] + } + ] + }, + { + "name": "summarize", + "path": "mobench report summarize", + "about": "Generate markdown summary from standardized output JSON", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output", + "long": "output", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Write markdown output to file" + }, + { + "id": "plots", + "long": "plots", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PLOTS" + ], + "possible_values": [ + "auto", + "off", + "require" + ], + "defaults": [ + "auto" + ], + "environment": null, + "help": null + }, + { + "id": "summary", + "long": "summary", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "SUMMARY" + ], + "possible_values": [], + "defaults": [ + "target/mobench/ci/summary.json" + ], + "environment": null, + "help": null + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + } + ] + }, + { + "name": "run", + "path": "mobench run", + "about": "Build mobile artifacts, write host preflight output, or run on BrowserStack devices", + "options": [ + { + "id": "android_benchmark_timeout_secs", + "long": "android-benchmark-timeout-secs", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "ANDROID_BENCHMARK_TIMEOUT_SECS" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Android benchmark watchdog timeout in seconds for the generated harness" + }, + { + "id": "android_heartbeat_interval_secs", + "long": "android-heartbeat-interval-secs", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "ANDROID_HEARTBEAT_INTERVAL_SECS" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Android benchmark heartbeat interval in seconds for the generated harness" + }, + { + "id": "baseline", + "long": "baseline", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "BASELINE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Baseline summary source (path|url|artifact:)" + }, + { + "id": "ci", + "long": "ci", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "CI" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Enable CI mode (job summary, optional JUnit, regression exit codes)" + }, + { + "id": "config", + "long": "config", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CONFIG" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Optional path to config file" + }, + { + "id": "crate_path", + "long": "crate-path", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CRATE_PATH" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to the benchmark crate directory containing Cargo.toml" + }, + { + "id": "device_matrix", + "long": "device-matrix", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "DEVICE_MATRIX" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Device matrix YAML file to load device names from" + }, + { + "id": "device_tags", + "long": "device-tags", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Append", + "value_names": [ + "DEVICE_TAGS" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Device tags to select from the device matrix (comma-separated or repeatable)" + }, + { + "id": "devices", + "long": "devices", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Append", + "value_names": [ + "DEVICES" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Device identifiers or labels (BrowserStack devices)" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "fetch", + "long": "fetch", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "FETCH" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Fetch BrowserStack artifacts after the run completes" + }, + { + "id": "fetch_output_dir", + "long": "fetch-output-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FETCH_OUTPUT_DIR" + ], + "possible_values": [], + "defaults": [ + "target/browserstack" + ], + "environment": null, + "help": null + }, + { + "id": "fetch_poll_interval_secs", + "long": "fetch-poll-interval-secs", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FETCH_POLL_INTERVAL_SECS" + ], + "possible_values": [], + "defaults": [ + "5" + ], + "environment": null, + "help": null + }, + { + "id": "fetch_timeout_secs", + "long": "fetch-timeout-secs", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FETCH_TIMEOUT_SECS" + ], + "possible_values": [], + "defaults": [ + "300" + ], + "environment": null, + "help": null + }, + { + "id": "function", + "long": "function", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FUNCTION" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Fully-qualified Rust function to benchmark" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help (see more with '--help')" + }, + { + "id": "ios_app", + "long": "ios-app", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "IOS_APP" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to iOS app bundle (.ipa or zipped .app) for BrowserStack XCUITest" + }, + { + "id": "ios_completion_timeout_secs", + "long": "ios-completion-timeout-secs", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": true, + "action": "Set", + "value_names": [ + "IOS_COMPLETION_TIMEOUT_SECS" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Deprecated compatibility flag for generated XCUITest harness timeout" + }, + { + "id": "ios_deployment_target", + "long": "ios-deployment-target", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "IOS_DEPLOYMENT_TARGET" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "iOS deployment target for generated app and XCUITest targets" + }, + { + "id": "ios_runner", + "long": "ios-runner", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "IOS_RUNNER" + ], + "possible_values": [ + "swiftui", + "uikit-legacy" + ], + "defaults": [], + "environment": null, + "help": "iOS runner template (swiftui or uikit-legacy)" + }, + { + "id": "ios_test_suite", + "long": "ios-test-suite", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "IOS_TEST_SUITE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to iOS XCUITest test suite package (.zip or .ipa)" + }, + { + "id": "iterations", + "long": "iterations", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "ITERATIONS" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": null + }, + { + "id": "junit", + "long": "junit", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "JUNIT" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Write JUnit XML report to the given path" + }, + { + "id": "local_only", + "long": "local-only", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "LOCAL_ONLY" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Skip mobile builds and write host-side preflight/spec output without mobile execution" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output", + "long": "output", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Optional output path for JSON report" + }, + { + "id": "progress", + "long": "progress", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "PROGRESS" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Show simplified step-by-step progress output" + }, + { + "id": "project_root", + "long": "project-root", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PROJECT_ROOT" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Project root containing mobench.toml or the Cargo workspace" + }, + { + "id": "regression_threshold_pct", + "long": "regression-threshold-pct", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "REGRESSION_THRESHOLD_PCT" + ], + "possible_values": [], + "defaults": [ + "5" + ], + "environment": null, + "help": "Regression threshold percentage when comparing to baseline" + }, + { + "id": "release", + "long": "release", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "RELEASE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Build in release mode (recommended for BrowserStack to reduce APK size and upload time)" + }, + { + "id": "summary_csv", + "long": "summary-csv", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "SUMMARY_CSV" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Write CSV summary alongside JSON" + }, + { + "id": "target", + "long": "target", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "TARGET" + ], + "possible_values": [ + "android", + "ios" + ], + "defaults": [], + "environment": null, + "help": null + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "warmup", + "long": "warmup", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "WARMUP" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": null + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "summary", + "path": "mobench summary", + "about": "Display summary statistics from a benchmark report JSON file", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "format", + "long": "format", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FORMAT" + ], + "possible_values": [ + "csv", + "json", + "text" + ], + "defaults": [], + "environment": null, + "help": "Output format: text (default), json, or csv" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help (see more with '--help')" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "report", + "long": null, + "short": null, + "positional_index": 1, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "REPORT" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to the benchmark report JSON file" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "verify", + "path": "mobench verify", + "about": "Verify benchmark setup: registry, spec, artifacts, and optional smoke test", + "options": [ + { + "id": "check_artifacts", + "long": "check-artifacts", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "CHECK_ARTIFACTS" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Check that build artifacts exist" + }, + { + "id": "crate_path", + "long": "crate-path", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CRATE_PATH" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to the benchmark crate directory containing Cargo.toml" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "function", + "long": "function", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FUNCTION" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Function name to verify/smoke test" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help (see more with '--help')" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output_dir", + "long": "output-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT_DIR" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Output directory for mobile artifacts (default: target/mobench)" + }, + { + "id": "project_root", + "long": "project-root", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PROJECT_ROOT" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Project root containing mobench.toml or the Cargo workspace" + }, + { + "id": "smoke_test", + "long": "smoke-test", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "SMOKE_TEST" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Run a local smoke test with minimal iterations" + }, + { + "id": "spec_path", + "long": "spec-path", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "SPEC_PATH" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to bench_spec.json to validate" + }, + { + "id": "target", + "long": "target", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "TARGET" + ], + "possible_values": [ + "android", + "both", + "ios" + ], + "defaults": [], + "environment": null, + "help": "Target platform to verify artifacts for" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + } + ] + }, + "config": [ + { + "file": "mobench.toml", + "keys": [ + { + "path": "project.crate", + "value_type": "string|null", + "required": false, + "default": null, + "evidence_id": "source-mobench-config" + }, + { + "path": "project.library_name", + "value_type": "string|null", + "required": false, + "default": null, + "evidence_id": "source-mobench-config" + }, + { + "path": "project.output_dir", + "value_type": "path|null", + "required": false, + "default": null, + "evidence_id": "source-mobench-config" + }, + { + "path": "android.package", + "value_type": "string", + "required": false, + "default": "dev.world.bench", + "evidence_id": "source-mobench-config" + }, + { + "path": "android.min_sdk", + "value_type": "integer", + "required": false, + "default": 24, + "evidence_id": "source-mobench-config" + }, + { + "path": "android.target_sdk", + "value_type": "integer", + "required": false, + "default": 34, + "evidence_id": "source-mobench-config" + }, + { + "path": "android.abis", + "value_type": "string[]|null", + "required": false, + "default": null, + "evidence_id": "source-mobench-config" + }, + { + "path": "ios.bundle_id", + "value_type": "string", + "required": false, + "default": "dev.world.bench", + "evidence_id": "source-mobench-config" + }, + { + "path": "ios.deployment_target", + "value_type": "string", + "required": false, + "default": "15.0", + "evidence_id": "source-mobench-config" + }, + { + "path": "ios.team_id", + "value_type": "string|null", + "required": false, + "default": null, + "evidence_id": "source-mobench-config" + }, + { + "path": "benchmarks.default_function", + "value_type": "string|null", + "required": false, + "default": null, + "evidence_id": "source-mobench-config" + }, + { + "path": "benchmarks.default_iterations", + "value_type": "integer", + "required": false, + "default": 100, + "evidence_id": "source-mobench-config" + }, + { + "path": "benchmarks.default_warmup", + "value_type": "integer", + "required": false, + "default": 10, + "evidence_id": "source-mobench-config" + }, + { + "path": "browserstack.ios_completion_timeout_secs", + "value_type": "integer|null", + "required": false, + "default": null, + "evidence_id": "source-mobench-config" + } + ] + }, + { + "file": "bench-config.toml", + "keys": [ + { + "path": "target", + "value_type": "android|ios", + "required": true, + "default": null, + "evidence_id": "source-bench-config" + }, + { + "path": "function", + "value_type": "string", + "required": true, + "default": null, + "evidence_id": "source-bench-config" + }, + { + "path": "iterations", + "value_type": "integer", + "required": true, + "default": null, + "evidence_id": "source-bench-config" + }, + { + "path": "warmup", + "value_type": "integer", + "required": true, + "default": null, + "evidence_id": "source-bench-config" + }, + { + "path": "device_matrix", + "value_type": "path", + "required": true, + "default": null, + "evidence_id": "source-bench-config" + }, + { + "path": "device_tags", + "value_type": "string[]|null", + "required": false, + "default": null, + "evidence_id": "source-bench-config" + }, + { + "path": "browserstack.app_automate_username", + "value_type": "string", + "required": true, + "default": null, + "evidence_id": "source-bench-config" + }, + { + "path": "browserstack.app_automate_access_key", + "value_type": "string", + "required": true, + "default": null, + "evidence_id": "source-bench-config" + }, + { + "path": "browserstack.project", + "value_type": "string|null", + "required": false, + "default": null, + "evidence_id": "source-bench-config" + }, + { + "path": "browserstack.ios_completion_timeout_secs", + "value_type": "integer|null", + "required": false, + "default": null, + "evidence_id": "source-bench-config" + }, + { + "path": "browserstack.android_benchmark_timeout_secs", + "value_type": "integer|null", + "required": false, + "default": null, + "evidence_id": "source-bench-config" + }, + { + "path": "browserstack.android_heartbeat_interval_secs", + "value_type": "integer|null", + "required": false, + "default": null, + "evidence_id": "source-bench-config" + }, + { + "path": "ios_xcuitest.app", + "value_type": "path", + "required": false, + "default": null, + "evidence_id": "source-bench-config" + }, + { + "path": "ios_xcuitest.test_suite", + "value_type": "path", + "required": false, + "default": null, + "evidence_id": "source-bench-config" + } + ] + } + ], + "artifacts": [ + { + "id": "benchmark-spec", + "path_pattern": "target/mobench/{android|ios}/**/bench_spec.json", + "produced_by": [ + "mobench run", + "mobench build" + ], + "description": "Resolved benchmark request embedded in generated runners.", + "evidence_id": "source-run-artifacts" + }, + { + "id": "benchmark-metadata", + "path_pattern": "target/mobench/{android|ios}/**/bench_meta.json", + "produced_by": [ + "mobench run", + "mobench build" + ], + "description": "Build metadata embedded beside the benchmark spec.", + "evidence_id": "source-run-artifacts" + }, + { + "id": "android-app", + "path_pattern": "target/mobench/android/app/build/outputs/apk/{debug|release}/*.apk", + "produced_by": [ + "mobench build", + "mobench run" + ], + "description": "Generated Android app and instrumentation packages.", + "evidence_id": "source-build-artifacts" + }, + { + "id": "ios-framework", + "path_pattern": "target/mobench/ios/.xcframework", + "produced_by": [ + "mobench build", + "mobench run" + ], + "description": "Generated iOS xcframework.", + "evidence_id": "source-build-artifacts" + }, + { + "id": "ios-app", + "path_pattern": "target/mobench/ios/BenchRunner.ipa", + "produced_by": [ + "mobench package-ipa", + "mobench run" + ], + "description": "Packaged iOS benchmark application.", + "evidence_id": "source-build-artifacts" + }, + { + "id": "ios-test-suite", + "path_pattern": "target/mobench/ios/BenchRunnerUITests.zip", + "produced_by": [ + "mobench package-xcuitest", + "mobench run" + ], + "description": "Packaged XCUITest suite for BrowserStack.", + "evidence_id": "source-build-artifacts" + }, + { + "id": "ci-summary-json", + "path_pattern": "/summary.json", + "produced_by": [ + "mobench ci run", + "mobench ci merge-split-runs" + ], + "description": "Machine-readable benchmark summary.", + "evidence_id": "test-ci-artifacts" + }, + { + "id": "ci-summary-markdown", + "path_pattern": "/summary.md", + "produced_by": [ + "mobench ci run", + "mobench ci merge-split-runs" + ], + "description": "Human-readable benchmark summary.", + "evidence_id": "test-ci-artifacts" + }, + { + "id": "ci-results-csv", + "path_pattern": "/results.csv", + "produced_by": [ + "mobench ci run", + "mobench ci merge-split-runs" + ], + "description": "Tabular benchmark results.", + "evidence_id": "test-ci-artifacts" + }, + { + "id": "profile-manifest", + "path_pattern": "//profile.json", + "produced_by": [ + "mobench profile run" + ], + "description": "Normalized profile manifest, plus a latest convenience copy.", + "evidence_id": "test-profile-artifacts" + }, + { + "id": "profile-summary", + "path_pattern": "//summary.md", + "produced_by": [ + "mobench profile run" + ], + "description": "Profile summary, plus a latest convenience copy.", + "evidence_id": "test-profile-artifacts" + }, + { + "id": "profile-folded-stacks", + "path_pattern": "//artifacts/processed/stacks.folded", + "produced_by": [ + "mobench profile run" + ], + "description": "Processed native stack samples when capture succeeds.", + "evidence_id": "test-profile-artifacts" + }, + { + "id": "profile-native-report", + "path_pattern": "//artifacts/processed/native-report.txt", + "produced_by": [ + "mobench profile run" + ], + "description": "Symbolized native profiler report when available.", + "evidence_id": "test-profile-artifacts" + }, + { + "id": "profile-flamegraphs", + "path_pattern": "//artifacts/processed/flamegraph.{full|focused}.svg", + "produced_by": [ + "mobench profile run" + ], + "description": "Full and benchmark-focused flamegraph SVGs when capture succeeds.", + "evidence_id": "test-profile-artifacts" + }, + { + "id": "profile-viewer", + "path_pattern": "//artifacts/processed/flamegraph.html", + "produced_by": [ + "mobench profile run" + ], + "description": "Standalone profile viewer when capture succeeds.", + "evidence_id": "test-profile-artifacts" + }, + { + "id": "trace-events", + "path_pattern": "", + "produced_by": [ + "mobench profile run" + ], + "description": "Machine-readable structured trace-event contract.", + "evidence_id": "test-trace-events" + } + ], + "schemas": [ + { + "id": "summary-v1", + "path": "docs/schemas/summary-v1.schema.json", + "checksum_sha256": "dd67ff6dbf57e06acd3516b1f41f1b76654baf351a2a2fbc9ade2db1406a70fc" + }, + { + "id": "ci-contract-v1", + "path": "docs/schemas/ci-contract-v1.schema.json", + "checksum_sha256": "eff1ddfc6800a6a990cd85a3bf02feb03e0c71aac9ea64cd499e41790703e962" + }, + { + "id": "trace-events-v1", + "path": "docs/schemas/trace-events-v1.schema.json", + "checksum_sha256": "da8309604422fa31f653be40c0fafdcbc5dfbc8c001da78fc5f7e185f7c861ac" + }, + { + "id": "mobench-site-manifest-v1", + "path": "docs/schemas/mobench-site-manifest-v1.schema.json", + "checksum_sha256": "84bd1985e3a0025d56df39392a08f8f52631676b6ecc0173990d12be8828bb27" + } + ], + "capabilities": [ + { + "id": "benchmark.build.android", + "status": "supported", + "summary": "Build generated Android benchmark artifacts.", + "evidence_ids": [ + "source-build-artifacts" + ] + }, + { + "id": "benchmark.build.ios", + "status": "supported", + "summary": "Build generated iOS benchmark artifacts.", + "evidence_ids": [ + "source-build-artifacts" + ] + }, + { + "id": "benchmark.execute.browserstack.android", + "status": "supported", + "summary": "Execute Android benchmarks through BrowserStack App Automate when devices and credentials are provided.", + "evidence_ids": [ + "source-browserstack-run" + ] + }, + { + "id": "benchmark.execute.browserstack.ios", + "status": "supported", + "summary": "Execute iOS benchmarks through BrowserStack XCUITest when devices, credentials, and packages are provided.", + "evidence_ids": [ + "source-browserstack-run" + ] + }, + { + "id": "benchmark.execute.local-only", + "status": "unsupported", + "summary": "`--local-only` writes preflight/spec outputs but skips the mobile build and does not execute the requested benchmark in v0.1.43.", + "evidence_ids": [ + "source-local-only" + ] + }, + { + "id": "benchmark.execute.attached-device", + "status": "unsupported", + "summary": "Ordinary `mobench run` does not execute on an attached phone in v0.1.43.", + "evidence_ids": [ + "source-browserstack-run" + ] + }, + { + "id": "benchmark.execute.android-emulator", + "status": "unsupported", + "summary": "Ordinary `mobench run` has no Android emulator execution provider in v0.1.43.", + "evidence_ids": [ + "source-browserstack-run" + ] + }, + { + "id": "benchmark.execute.ios-simulator", + "status": "unsupported", + "summary": "Ordinary `mobench run` has no iOS simulator execution provider in v0.1.43.", + "evidence_ids": [ + "source-browserstack-run" + ] + }, + { + "id": "benchmark.build-without-devices", + "status": "supported", + "summary": "With no BrowserStack devices, `mobench run` builds artifacts and skips upload/execution.", + "evidence_ids": [ + "source-browserstack-run" + ] + }, + { + "id": "profile.local.android-native", + "status": "supported", + "summary": "Attempt local Android simpleperf capture, symbolization, and flamegraph generation when required tools and a device are available.", + "evidence_ids": [ + "source-android-profile", + "test-android-profile" + ] + }, + { + "id": "profile.local.ios-instruments", + "status": "supported", + "summary": "Attempt local iOS simulator-host sample capture and flamegraph generation when required tools are available.", + "evidence_ids": [ + "source-ios-profile", + "test-ios-profile" + ] + }, + { + "id": "profile.local.rust-tracing", + "status": "planned", + "summary": "The manifest/trace contract exists, but local rust-tracing capture is not implemented.", + "evidence_ids": [ + "source-rust-tracing" + ] + }, + { + "id": "profile.browserstack.android-native", + "status": "unsupported", + "summary": "BrowserStack native Android stack capture is not implemented.", + "evidence_ids": [ + "test-browserstack-profile" + ] + }, + { + "id": "profile.browserstack.ios-instruments", + "status": "unsupported", + "summary": "BrowserStack native iOS Instruments capture is not implemented.", + "evidence_ids": [ + "test-browserstack-profile" + ] + }, + { + "id": "profile.browserstack.rust-tracing", + "status": "unsupported", + "summary": "BrowserStack rust-tracing capture is not implemented.", + "evidence_ids": [ + "source-rust-tracing" + ] + } + ], + "evidence": [ + { + "id": "source-mobench-config", + "kind": "source", + "reference": "crates/mobench/src/config.rs#MobenchConfig" + }, + { + "id": "source-bench-config", + "kind": "source", + "reference": "crates/mobench/src/lib.rs#BenchConfig" + }, + { + "id": "source-run-artifacts", + "kind": "source", + "reference": "crates/mobench/src/lib.rs#persist_mobile_spec" + }, + { + "id": "source-build-artifacts", + "kind": "source", + "reference": "crates/mobench/src/lib.rs#cmd_build" + }, + { + "id": "source-browserstack-run", + "kind": "source", + "reference": "crates/mobench/src/lib.rs#run_from" + }, + { + "id": "source-local-only", + "kind": "source", + "reference": "crates/mobench/src/lib.rs#run_from:local_only" + }, + { + "id": "source-android-profile", + "kind": "source", + "reference": "crates/mobench/src/profile.rs#execute_local_android_capture" + }, + { + "id": "source-ios-profile", + "kind": "source", + "reference": "crates/mobench/src/profile.rs#execute_local_ios_capture" + }, + { + "id": "source-rust-tracing", + "kind": "source", + "reference": "crates/mobench/src/profile.rs#execute_capture" + }, + { + "id": "test-ci-artifacts", + "kind": "test", + "reference": "crates/mobench/src/split_runs.rs#merge_split_run_summaries" + }, + { + "id": "test-profile-artifacts", + "kind": "test", + "reference": "crates/mobench/src/profile.rs#profile_run_writes_run_scoped_and_latest_manifest_files" + }, + { + "id": "test-trace-events", + "kind": "test", + "reference": "crates/mobench/tests/profile_cli.rs#profile_run_dry_run_writes_trace_events_output_for_downstream_consumers" + }, + { + "id": "test-android-profile", + "kind": "test", + "reference": "crates/mobench/src/profile.rs#android_backend_builds_capture_plan_with_flamegraph_artifacts" + }, + { + "id": "test-ios-profile", + "kind": "test", + "reference": "crates/mobench/src/profile.rs#ios_backend_allocates_sample_and_flamegraph_artifacts" + }, + { + "id": "test-browserstack-profile", + "kind": "test", + "reference": "crates/mobench/tests/profile_cli.rs#browserstack_profile_run_reports_unsupported_native_capture" + }, + { + "id": "test-cargo-wrapper", + "kind": "test", + "reference": "crates/mobench/tests/invocation_cli.rs#cargo_mobench_invocation_works_through_cargo" + } + ] +} diff --git a/apps/docs/public/og/basic-example.png b/apps/docs/public/og/basic-example.png new file mode 100644 index 0000000000000000000000000000000000000000..965f8522da4e0683df26c3a7a4c3477d2e4ce882 GIT binary patch literal 19585 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 AkN^Mx literal 0 HcmV?d00001 diff --git a/apps/docs/public/og/benchmark-quality.png b/apps/docs/public/og/benchmark-quality.png new file mode 100644 index 0000000000000000000000000000000000000000..ee682881980327fe24926f35468bde64d0c95306 GIT binary patch literal 18979 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 O4TGnvpUXO@geCw2IhAMt literal 0 HcmV?d00001 diff --git a/apps/docs/public/og/browserstack.png b/apps/docs/public/og/browserstack.png new file mode 100644 index 0000000000000000000000000000000000000000..d75485e837ea977aa9c00cdae950798921001dc2 GIT binary patch literal 21322 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 literal 0 HcmV?d00001 diff --git a/apps/docs/public/og/configuration.png b/apps/docs/public/og/configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..613f361251a958079dc7131295741892aae26f20 GIT binary patch literal 17250 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 literal 0 HcmV?d00001 diff --git a/apps/docs/public/og/ffi-example.png b/apps/docs/public/og/ffi-example.png new file mode 100644 index 0000000000000000000000000000000000000000..a45711814ba7420ab3d2cb827469f60e9b80eaf0 GIT binary patch literal 17926 zcmd74cT`hfw*>kegD=xe&W)CoWQSnf04zDNB~m|H-C zn}L(=&I39Ic3OP{&9%khm4zWT0p`B$Y8D;_U9ehtamM|JESy5DOx*P2!>x~$`RpB_ zTPvd++-yTXzJH2FczD<%O6)h5M%>-3JinM3o9b$6KmQOF_~&;Y{XH567P^6+I&U8b zRzAkMYP66fcV$_YjGR~=Dp}21_Bm8CBPleb+;M4ckoL|k1H%`yQ$1f(qZ_|t7+LAH z9G|Mcc&4l>r>6C!1zYq;hEL@2!{Gs}jjd@!c)&dlW&>l@qJl488Rqey!*rY!kg*|g zUA~heZ4%NVsBZ~;QtXe_1VTc*W7~cFeQn<4*~sdOM16PfXer}*bWc#8>&f#+&z{S; z#2cw;D1i0Ug91JLb1h4Y(t`t??V}-IKEqATK-1%$kL3hjg=l|@^bvZ**HD-LsnzS1 zg-%LhWMa%4n@BK7U&+hk)yF0eenBp7(ffggwt)fm&o!i;DoV9AmD<=s;y(C)XoOi= zgLwrwq2>_Z%vX-F2J)(pBkEj#4mN(vjAP?siH-C%fok$TzAr4pD<%8r*I2uiwNY

~;o#Pj)^05^X>7k4*kWT=PaQz5G`UFb_K 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 V*SnCwk6Bz$R@6|)mp2Rie*l>egn9q~ literal 0 HcmV?d00001 diff --git a/apps/docs/public/og/host-preflight.png b/apps/docs/public/og/host-preflight.png new file mode 100644 index 0000000000000000000000000000000000000000..70a4bad9a378b16409162e7be0b4185ccadef95f GIT binary patch literal 18702 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 literal 0 HcmV?d00001 diff --git a/apps/docs/public/og/index.png b/apps/docs/public/og/index.png new file mode 100644 index 0000000000000000000000000000000000000000..ec01d38250f6026d63e4b1c6dae5af1520db003c GIT binary patch literal 18647 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

4f=S|) zj1D}f0=!O}W_pwfJ*d5c*(Mk3m5(6;V=Ks!O$0C~<12c)bwe(|iTH8 zk1-sd^csp9TM&KaInEQ2qBJG9Pyh=}FBmBtKmTxVqhQz=tUH3(+}Qy+)Z@6fihCdA zOe)O0%cEO7wfM7A6iRmPx0cas`D%*JJev?sV2;PERImMpnWoFHxfo({yT*@ZAg+qGE|imjn=LW)X>qf+{<(DNnl15v0gnFECacB&De$Wf-gU>Q z4hvx94yH8D^?WrS*Z7WCk_*m8EUYHSF^R?xnn$Jesi>r&5}C^mGn*OVoQ5IgYmV&gVk3k`X6BLAu1+ za-z_$SD-uPvLnnyJ8xC49L*VV{9q=wMxRc6PRW>Z-yOryDokC=b>{ojp=?rV<2kqR zHTh>#owJAhvx=-$)|jd%3$?ZH@S1O4mPrPhV@MPMMgWH_Ut2j@(ut%(vt zx7zZnrdDaO!D)qRzz$qD$b$^$O#!yrA2b>^AoyI7CSd1Dro8v^WZ=mYl7$(hcJsQ( z&hLINR|h*Yuj4iP1~|S{&SAeGGm*>@w`4?HZT+Tc_v`$;9gq|$>|5XbAAy#xjn~+hXvIT=d48fseswyn2(%e_UA#fvjWr( zMjil6$AtH0OF?>9K%ojPwxK$=sZc4-|N&+2v6(ez#St~A&=;rf2Bwrah6Ha2v&be6QV z$w-)cNbWfR6G7i8Pfu4>Y}md1?urp-TVnyc;(<-B7Vy>8AmjIXoBXI6{vd#o9&~WBUpl&b6OK zFdKxu`SbpFE>IB8)_GZxFl`At=w!p?bmvAt9M9*!5gY;>pAfvbc>FhafCyoX|Ly(< rgXr%5ukO!(zJ>OGpnxXMN#5XqDS>)wN`!xBxum70_qbT)*_;0YXL$<) literal 0 HcmV?d00001 diff --git a/apps/docs/public/og/installation.png b/apps/docs/public/og/installation.png new file mode 100644 index 0000000000000000000000000000000000000000..5e6039403daedfdf1d0ab5b4ef6ed930ec10b36b GIT binary patch literal 16342 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 N)RlFVN)(>F`foU+0;2!` literal 0 HcmV?d00001 diff --git a/apps/docs/public/og/outputs.png b/apps/docs/public/og/outputs.png new file mode 100644 index 0000000000000000000000000000000000000000..a7d36f0e3ddbf8718ee36905083c5ecbc41d15ed GIT binary patch literal 18826 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

)W%c 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 literal 0 HcmV?d00001 diff --git a/apps/docs/public/og/profiling.png b/apps/docs/public/og/profiling.png new file mode 100644 index 0000000000000000000000000000000000000000..bf0e27bd20c4e2906ed86943167480861c5a3e88 GIT binary patch literal 18693 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

m$ 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 Qy@}M6v>z2ISib)M00%&_d;kCd literal 0 HcmV?d00001 diff --git a/apps/docs/public/og/regressions.png b/apps/docs/public/og/regressions.png new file mode 100644 index 0000000000000000000000000000000000000000..46f5a0115792057dd23c86a10b3fc4149add3adb GIT binary patch literal 20327 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 HUA+4j+rT}O literal 0 HcmV?d00001 diff --git a/apps/docs/public/og/schemas.png b/apps/docs/public/og/schemas.png new file mode 100644 index 0000000000000000000000000000000000000000..12e2c58673267bd9fa0736c3d54d965a295e5473 GIT binary patch literal 17674 zcmdtKcQl-D*D#u{CD93j=)FXZ9z=Aa%osf*O7!TRV1|f4ggyZfI&e zFuZW#3i`r@OTNUH0f>J_tlNbPmoGfhF;=_HcPp(o)Hm75EI^A}@y^cL7_THJB^@~n z2h%M!I_L|1EJ~W-6D2(pjr0Rit599~JJeLSC>Xft zZn4wQu~3W1^4YyIw20IJd8^M&_H3_?O579e?`~k^q0@lMaf+~rit}fGe0PV7nVp-( z`Z0)^pP>kuzPdQb&Cd}T>Fb|ulbRB{`DeJUx{zJywu>v2fs@w9$1yi25nk?+n;yf+ zOV296bWcZwM~p4*RoK`1qDMv=sXZYx<6W)TQgaIf-^|Cl4oXs*LJZ7w_f=(kyXt;V zbZcnc7nA3IXf4Zim-Ugeay2H;&H;3r>(*dDHZ~^2%u4%nUJAriFEjm(%@b4IM-SC? z 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 YpVse0ouEhT0RNZNRJ4^#6)j)?A8`$C+yDRo literal 0 HcmV?d00001 diff --git a/apps/docs/public/robots.txt b/apps/docs/public/robots.txt new file mode 100644 index 0000000..b33a489 --- /dev/null +++ b/apps/docs/public/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +Sitemap: https://docs.mobench.org/sitemap-index.xml diff --git a/apps/docs/public/schemas/ci-contract-v1.schema.json b/apps/docs/public/schemas/ci-contract-v1.schema.json new file mode 100644 index 0000000..6d1d5a4 --- /dev/null +++ b/apps/docs/public/schemas/ci-contract-v1.schema.json @@ -0,0 +1,36 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://world.org/mobench/schemas/ci-contract-v1.schema.json", + "title": "Mobench CI Contract v1", + "type": "object", + "required": ["ci"], + "properties": { + "ci": { + "type": "object", + "required": ["metadata", "outputs"], + "properties": { + "metadata": { + "type": "object", + "required": ["requested_by", "request_command", "mobench_version"], + "properties": { + "requested_by": { "type": "string" }, + "pr_number": { "type": ["string", "null"] }, + "request_command": { "type": "string" }, + "mobench_ref": { "type": ["string", "null"] }, + "mobench_version": { "type": "string" } + } + }, + "outputs": { + "type": "object", + "required": ["summary_json", "summary_md", "results_csv"], + "properties": { + "summary_json": { "type": "string" }, + "summary_md": { "type": "string" }, + "results_csv": { "type": "string" } + } + } + } + } + }, + "additionalProperties": true +} diff --git a/apps/docs/public/schemas/mobench-site-manifest-v1.schema.json b/apps/docs/public/schemas/mobench-site-manifest-v1.schema.json new file mode 100644 index 0000000..74adf44 --- /dev/null +++ b/apps/docs/public/schemas/mobench-site-manifest-v1.schema.json @@ -0,0 +1,152 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://mobench.org/schemas/mobench-site-manifest-v1.schema.json", + "title": "Mobench website release manifest v1", + "type": "object", + "additionalProperties": false, + "required": [ + "schema_version", + "release", + "msrv", + "binaries", + "command_tree", + "config", + "artifacts", + "schemas", + "capabilities", + "evidence" + ], + "properties": { + "schema_version": { "const": 1 }, + "release": { + "type": "object", + "additionalProperties": false, + "required": ["version", "tag", "sha", "repository"], + "properties": { + "version": { "type": "string", "minLength": 1 }, + "tag": { "type": "string", "pattern": "^v" }, + "sha": { "type": "string", "pattern": "^[0-9a-fA-F]{40}$" }, + "repository": { "type": "string", "format": "uri" } + } + }, + "msrv": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+" }, + "binaries": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/binary" } }, + "command_tree": { "$ref": "#/$defs/command" }, + "config": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/config" } }, + "artifacts": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/artifact" } }, + "schemas": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/schema" } }, + "capabilities": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/capability" } }, + "evidence": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/evidence" } } + }, + "$defs": { + "status": { "enum": ["supported", "preview", "planned", "unsupported"] }, + "binary": { + "type": "object", + "additionalProperties": false, + "required": ["name", "invocation", "canonical_for_release", "status", "note"], + "properties": { + "name": { "type": "string" }, + "invocation": { "type": "string" }, + "canonical_for_release": { "type": "boolean" }, + "status": { "$ref": "#/$defs/status" }, + "note": { "type": "string" } + } + }, + "command": { + "type": "object", + "additionalProperties": false, + "required": ["name", "path", "about", "options", "subcommands"], + "properties": { + "name": { "type": "string" }, + "path": { "type": "string" }, + "about": { "type": ["string", "null"] }, + "options": { "type": "array", "items": { "$ref": "#/$defs/option" } }, + "subcommands": { "type": "array", "items": { "$ref": "#/$defs/command" } } + } + }, + "option": { + "type": "object", + "additionalProperties": false, + "required": ["id", "long", "short", "positional_index", "required", "global", "hidden", "action", "value_names", "possible_values", "defaults", "environment", "help"], + "properties": { + "id": { "type": "string" }, + "long": { "type": ["string", "null"] }, + "short": { "type": ["string", "null"], "maxLength": 1 }, + "positional_index": { "type": ["integer", "null"], "minimum": 1 }, + "required": { "type": "boolean" }, + "global": { "type": "boolean" }, + "hidden": { "type": "boolean" }, + "action": { "type": "string" }, + "value_names": { "type": "array", "items": { "type": "string" } }, + "possible_values": { "type": "array", "items": { "type": "string" } }, + "defaults": { "type": "array", "items": { "type": "string" } }, + "environment": { "type": ["string", "null"] }, + "help": { "type": ["string", "null"] } + } + }, + "config": { + "type": "object", + "additionalProperties": false, + "required": ["file", "keys"], + "properties": { + "file": { "type": "string" }, + "keys": { "type": "array", "items": { "$ref": "#/$defs/configKey" } } + } + }, + "configKey": { + "type": "object", + "additionalProperties": false, + "required": ["path", "value_type", "required", "default", "evidence_id"], + "properties": { + "path": { "type": "string" }, + "value_type": { "type": "string" }, + "required": { "type": "boolean" }, + "default": {}, + "evidence_id": { "type": "string" } + } + }, + "artifact": { + "type": "object", + "additionalProperties": false, + "required": ["id", "path_pattern", "produced_by", "description", "evidence_id"], + "properties": { + "id": { "type": "string" }, + "path_pattern": { "type": "string" }, + "produced_by": { "type": "array", "items": { "type": "string" } }, + "description": { "type": "string" }, + "evidence_id": { "type": "string" } + } + }, + "schema": { + "type": "object", + "additionalProperties": false, + "required": ["id", "path", "checksum_sha256"], + "properties": { + "id": { "type": "string" }, + "path": { "type": "string" }, + "checksum_sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" } + } + }, + "capability": { + "type": "object", + "additionalProperties": false, + "required": ["id", "status", "summary", "evidence_ids"], + "properties": { + "id": { "type": "string" }, + "status": { "$ref": "#/$defs/status" }, + "summary": { "type": "string" }, + "evidence_ids": { "type": "array", "minItems": 1, "items": { "type": "string" } } + } + }, + "evidence": { + "type": "object", + "additionalProperties": false, + "required": ["id", "kind", "reference"], + "properties": { + "id": { "type": "string" }, + "kind": { "enum": ["source", "test"] }, + "reference": { "type": "string" } + } + } + } +} diff --git a/apps/docs/public/schemas/summary-v1.schema.json b/apps/docs/public/schemas/summary-v1.schema.json new file mode 100644 index 0000000..9f452ae --- /dev/null +++ b/apps/docs/public/schemas/summary-v1.schema.json @@ -0,0 +1,75 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://world.org/mobench/schemas/summary-v1.schema.json", + "title": "Mobench Summary v1", + "type": "object", + "required": ["summary"], + "properties": { + "summary": { + "type": "object", + "required": [ + "generated_at", + "generated_at_unix", + "target", + "function", + "iterations", + "warmup", + "devices", + "device_summaries" + ], + "properties": { + "generated_at": { "type": "string" }, + "generated_at_unix": { "type": "integer" }, + "target": { "type": "string", "enum": ["android", "ios"] }, + "function": { "type": "string" }, + "iterations": { "type": "integer" }, + "warmup": { "type": "integer" }, + "devices": { + "type": "array", + "items": { "type": "string" } + }, + "device_summaries": { + "type": "array", + "items": { + "type": "object", + "required": ["device", "benchmarks"], + "properties": { + "device": { "type": "string" }, + "benchmarks": { + "type": "array", + "items": { + "type": "object", + "required": ["function", "samples"], + "properties": { + "function": { "type": "string" }, + "samples": { "type": "integer" }, + "mean_ns": { "type": ["integer", "null"] }, + "median_ns": { "type": ["integer", "null"] }, + "p95_ns": { "type": ["integer", "null"] }, + "min_ns": { "type": ["integer", "null"] }, + "max_ns": { "type": ["integer", "null"] }, + "resource_usage": { + "type": ["object", "null"], + "properties": { + "cpu_total_ms": { "type": ["integer", "null"] }, + "cpu_median_ms": { "type": ["integer", "null"] }, + "peak_memory_kb": { "type": ["integer", "null"] }, + "peak_memory_growth_kb": { "type": ["integer", "null"] }, + "process_peak_memory_kb": { "type": ["integer", "null"] }, + "total_pss_kb": { "type": ["integer", "null"] }, + "private_dirty_kb": { "type": ["integer", "null"] }, + "native_heap_kb": { "type": ["integer", "null"] }, + "java_heap_kb": { "type": ["integer", "null"] } + } + } + } + } + } + } + } + } + } + } + }, + "additionalProperties": true +} diff --git a/apps/docs/public/schemas/trace-events-v1.schema.json b/apps/docs/public/schemas/trace-events-v1.schema.json new file mode 100644 index 0000000..73e866e --- /dev/null +++ b/apps/docs/public/schemas/trace-events-v1.schema.json @@ -0,0 +1,59 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://world.org/mobench/schemas/trace-events-v1.schema.json", + "title": "Mobench Trace Events v1", + "type": "object", + "required": ["source", "total_duration_ns", "lanes"], + "properties": { + "source": { + "type": "object", + "required": ["kind", "profiler", "origin"], + "properties": { + "kind": { "type": "string" }, + "profiler": { "type": "string" }, + "origin": { "type": "string", "enum": ["local", "browserstack"] } + }, + "additionalProperties": false + }, + "total_duration_ns": { "type": "integer", "minimum": 0 }, + "lanes": { + "type": "array", + "items": { + "type": "object", + "required": ["id", "label", "events"], + "properties": { + "id": { "type": "string" }, + "label": { "type": "string" }, + "events": { + "type": "array", + "items": { + "type": "object", + "required": [ + "event_kind", + "start_offset_ns", + "end_offset_ns", + "frames", + "phase", + "iteration" + ], + "properties": { + "event_kind": { "type": "string" }, + "start_offset_ns": { "type": "integer", "minimum": 0 }, + "end_offset_ns": { "type": ["integer", "null"], "minimum": 0 }, + "frames": { + "type": "array", + "items": { "type": "string" } + }, + "phase": { "type": ["string", "null"] }, + "iteration": { "type": ["integer", "null"], "minimum": 0 } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false +} diff --git a/apps/docs/src/assets/logo.svg b/apps/docs/src/assets/logo.svg new file mode 100644 index 0000000..61f3089 --- /dev/null +++ b/apps/docs/src/assets/logo.svg @@ -0,0 +1,7 @@ + + mobench + + + + mobench + diff --git a/apps/docs/src/components/Head.astro b/apps/docs/src/components/Head.astro new file mode 100644 index 0000000..232b13c --- /dev/null +++ b/apps/docs/src/components/Head.astro @@ -0,0 +1,43 @@ +--- +import Default from '@astrojs/starlight/components/Head.astro' + +const route = Astro.locals.starlightRoute +const data = route.entry.data +const slug = route.entry.id === 'index' ? 'index' : route.entry.id +const canonical = Astro.url.href +const image = new URL(`/og/${slug}.png`, 'https://docs.mobench.org').href +const imageAlt = `${data.title} — mobench ${data.release ?? 'documentation'}` +const breadcrumbs = route.entry.id === 'index' + ? [{ '@type': 'ListItem', position: 1, name: 'mobench documentation', item: 'https://docs.mobench.org/' }] + : [ + { '@type': 'ListItem', position: 1, name: 'mobench documentation', item: 'https://docs.mobench.org/' }, + { '@type': 'ListItem', position: 2, name: data.title, item: canonical }, + ] +const structuredData = [ + { + '@context': 'https://schema.org', + '@type': 'TechArticle', + headline: data.title, + description: data.description, + url: canonical, + image, + dateModified: data.lastVerified instanceof Date ? data.lastVerified.toISOString().slice(0, 10) : undefined, + isPartOf: { '@type': 'WebSite', name: 'mobench docs', url: 'https://docs.mobench.org/' }, + about: { '@type': 'SoftwareApplication', name: 'mobench', softwareVersion: data.release }, + }, + { + '@context': 'https://schema.org', + '@type': 'BreadcrumbList', + itemListElement: breadcrumbs, + }, +] +--- + + + + + + + + diff --git a/apps/docs/src/components/PageTitle.astro b/apps/docs/src/components/PageTitle.astro new file mode 100644 index 0000000..c26501f --- /dev/null +++ b/apps/docs/src/components/PageTitle.astro @@ -0,0 +1,53 @@ +--- +import Default from '@astrojs/starlight/components/PageTitle.astro' + +const route = Astro.locals.starlightRoute +const cleanPath = Astro.url.pathname.replace(/\/$/, '') +const markdownPath = cleanPath ? `${cleanPath}.md` : '/index.md' +const sourcePath = route.entry.filePath?.replace(/^.*?src\/content\/docs\//, '') ?? `${route.entry.id}.mdx` +const sourceUrl = `https://github.com/worldfnd/mobench.org/blob/main/apps/docs/src/content/docs/${sourcePath}` +--- + +

+ + +
+ + + + diff --git a/apps/docs/src/content.config.ts b/apps/docs/src/content.config.ts new file mode 100644 index 0000000..cb83588 --- /dev/null +++ b/apps/docs/src/content.config.ts @@ -0,0 +1,36 @@ +import { defineCollection } from 'astro:content' +import { z } from 'astro/zod' +import { docsLoader } from '@astrojs/starlight/loaders' +import { docsSchema } from '@astrojs/starlight/schema' + +const sourceReference = z.object({ + label: z.string().min(1), + url: z.url(), + evidence: z.string().min(1).optional(), +}) + +const docs = defineCollection({ + loader: docsLoader(), + schema: docsSchema({ + extend: z.object({ + slug: z.string().regex(/^(?:index|[a-z0-9]+(?:-[a-z0-9]+)*)$/), + audience: z + .array(z.enum(['new-user', 'benchmark-author', 'ci-engineer', 'contributor'])) + .optional(), + release: z.string().optional(), + lastVerified: z.coerce.date().optional(), + sourceRefs: z.array(sourceReference).optional(), + aliases: z.array(z.string().startsWith('/')).default([]), + section: z.string().optional(), + order: z.number().int().nonnegative().optional(), + og: z + .object({ + image: z.string().startsWith('/'), + alt: z.string().min(1), + }) + .optional(), + }), + }), +}) + +export const collections = { docs } diff --git a/apps/docs/src/content/docs/analyze-results/outputs.mdx b/apps/docs/src/content/docs/analyze-results/outputs.mdx new file mode 100644 index 0000000..1eb1383 --- /dev/null +++ b/apps/docs/src/content/docs/analyze-results/outputs.mdx @@ -0,0 +1,85 @@ +--- +title: Outputs and metrics +slug: outputs +aliases: [/reports, /outputs-and-reports] +description: Understand mobench JSON, Markdown, CSV, plots, and optional resource values. +sidebar: + order: 1 +audience: [benchmark-author, ci-engineer] +release: 0.1.43 +lastVerified: 2026-07-15 +section: Analyze results +order: 1 +sourceRefs: + - label: BrowserStack metrics guide + url: https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/docs/guides/browserstack-metrics.md + evidence: Timing fields, resource columns, sources, and missing-value semantics. +--- + +Normal runs can write a JSON report with `--output`. CI runs always normalize results into a three-file contract, with plots when available. + +## CI contract + +| Path | Intended use | +| --- | --- | +| `summary.json` | Machine-readable results, metadata, baselines, and integrations | +| `summary.md` | Human review and CI job summaries | +| `results.csv` | Tables, notebooks, and external analysis | +| `plots/*.svg` | Optional visual summaries when plot rendering is available | + +Generate the contract with an explicit directory: + +```bash +mobench ci run \ + --target android \ + --function bench_mobile::checksum \ + --local-only \ + --plots auto \ + --output-dir target/mobench/ci +``` + +The example uses the host harness to demonstrate files; it does not produce mobile measurements. + +## Timing fields + +Results include a sample count and timing statistics such as: + +- `mean_ns` +- `median_ns` +- `p95_ns` +- `min_ns` +- `max_ns` + +Raw sample durations live in JSON where the report contract provides them. Compare nanosecond values as numbers; format units only at the presentation layer. + +## Optional resource fields + +CSV and summary data can include: + +- `cpu_total_ms` +- `cpu_median_ms` +- `peak_memory_kb` +- `peak_memory_growth_kb` +- `process_peak_memory_kb` + +These values depend on the runner, platform, device, and provider data. A blank CSV cell or absent JSON field means **unavailable**, not zero. Keep missing values out of averages and regression gates that assume measured data. + +## Inspect and render + +```bash +mobench summary target/mobench/results.json +mobench summary --format json target/mobench/results.json +mobench summary --format csv target/mobench/results.json +``` + +Render Markdown from a CI summary: + +```bash +mobench report summarize \ + --summary target/mobench/ci/summary.json \ + --plots auto +``` + +## Next step + +Store a representative `summary.json`, then configure [regression comparison](/regressions/). diff --git a/apps/docs/src/content/docs/analyze-results/profiling.mdx b/apps/docs/src/content/docs/analyze-results/profiling.mdx new file mode 100644 index 0000000..a9ee9d3 --- /dev/null +++ b/apps/docs/src/content/docs/analyze-results/profiling.mdx @@ -0,0 +1,94 @@ +--- +title: Local native profiling +slug: profiling +description: Capture Android and iOS native stacks and compare profile manifests locally. +sidebar: + order: 3 +audience: [benchmark-author] +release: 0.1.43 +lastVerified: 2026-07-15 +section: Analyze results +order: 3 +sourceRefs: + - label: Profiling guide + url: https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/docs/guides/profiling.md + evidence: Capability matrix, commands, requirements, and artifact layout. +--- + +Profiling is separate from repeated benchmark timing. Use it after a slowdown is reproducible and you need native stacks, flamegraphs, or semantic phase detail. + +## Supported combinations + +| Provider | Backend | Behavior in 0.1.43 | +| --- | --- | --- | +| `local` | `android-native` | Attempts `simpleperf` capture, symbolization, folded stacks, reports, and flamegraphs | +| `local` | `ios-instruments` | Attempts simulator-host `sample` capture, folded stacks, reports, and flamegraphs | +| `local` | `rust-tracing` | Writes a planned manifest/trace contract; native capture is not implemented | +| `browserstack` | Any native backend | Unsupported | + +BrowserStack benchmark runs may still contain timing and resource metrics. They do not provide retrievable native stack artifacts in this release. + +## Profile Android locally + +Requirements include `adb`, an Android NDK, `simpleperf`, NDK `llvm-addr2line`, and a local device or emulator. + +```bash +mobench profile run \ + --target android \ + --provider local \ + --backend android-native \ + --function bench_mobile::checksum \ + --output-dir target/mobench/profile \ + --trace-events-output target/mobench/profile/trace-events.json +``` + +## Profile iOS locally + +The current backend uses macOS `sample` against an iOS simulator-host process. It requires macOS, Xcode command-line tools, `xcrun`, `simctl`, and an installed simulator runtime. + +```bash +mobench profile run \ + --target ios \ + --provider local \ + --backend ios-instruments \ + --function bench_mobile::checksum \ + --output-dir target/mobench/profile +``` + +Use Xcode Instruments directly for deeper real-device investigations. + +## Read the bundle + +Common outputs include: + +- `profile.json` +- `summary.md` +- `artifacts/raw/…` +- `artifacts/processed/stacks.folded` +- `artifacts/processed/native-report.txt` +- `artifacts/processed/flamegraph.full.svg` +- `artifacts/processed/flamegraph.focused.svg` +- `artifacts/processed/flamegraph.html` +- `artifacts/semantic/phases.json` when phase data exists + +Render a manifest: + +```bash +mobench profile summarize \ + --profile target/mobench/profile/profile.json +``` + +## Compare two profiles + +```bash +mobench profile diff \ + --baseline target/mobench/profile/baseline/profile.json \ + --candidate target/mobench/profile/candidate/profile.json \ + --normalize +``` + +In differential Inferno flamegraphs, red is hotter in the candidate and blue is hotter in the baseline. + +## Next step + +Open `flamegraph.html`, confirm the capture status in `profile.json`, and correlate hot frames with the timing regression. diff --git a/apps/docs/src/content/docs/analyze-results/regressions.mdx b/apps/docs/src/content/docs/analyze-results/regressions.mdx new file mode 100644 index 0000000..31686b1 --- /dev/null +++ b/apps/docs/src/content/docs/analyze-results/regressions.mdx @@ -0,0 +1,74 @@ +--- +title: Regression comparison +slug: regressions +description: Compare compatible mobench summaries and gate meaningful slowdowns. +sidebar: + order: 2 +audience: [ci-engineer, benchmark-author] +release: 0.1.43 +lastVerified: 2026-07-15 +section: Analyze results +order: 2 +sourceRefs: + - label: BrowserStack CI guide + url: https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/docs/guides/browserstack-ci.md + evidence: Baseline sources, thresholds, JUnit output, and compare behavior. +--- + +Regression checks compare candidate timing summaries with a stored baseline. They are meaningful only when the benchmark, device, OS, build mode, and run counts are compatible. + +## Compare existing files + +```bash +mobench compare \ + --baseline baselines/android-summary.json \ + --candidate target/mobench/ci/summary.json \ + --output target/mobench/ci/comparison.md +``` + +Review the Markdown report before turning a threshold into a required check. + +## Compare during CI + +```bash +mobench ci run \ + --target android \ + --function bench_mobile::checksum \ + --devices "Google Pixel 7-13.0" \ + --baseline artifact:baselines/android-summary.json \ + --regression-threshold-pct 5 \ + --junit target/mobench/ci/junit.xml \ + --release \ + --output-dir target/mobench/ci +``` + +Baseline sources accept a local path, URL, or `artifact:` form. If a baseline resolves to the same path as the candidate output, mobench snapshots the previous file before writing the new result. + +## Choose a threshold + +Start with observed device-to-device and run-to-run variation rather than an arbitrary percentage. A good gate: + +- compares the same device and OS +- uses the same release profile and runner backend +- keeps iteration and warmup counts stable +- ignores unavailable resource values +- is rerun when a candidate sits near the threshold + +A single noisy result is a prompt to investigate, not proof of a code regression. + +## Publish results + +Render or publish a sticky pull-request comment from the standard summary: + +```bash +mobench report github \ + --pr 123 \ + --summary target/mobench/ci/summary.json \ + --publish +``` + +The default marker is ``, allowing later runs to update the same comment. + +## Next step + +When timing shows a repeatable slowdown, use [local profiling](/profiling/) to locate the hot path. diff --git a/apps/docs/src/content/docs/examples/basic.mdx b/apps/docs/src/content/docs/examples/basic.mdx new file mode 100644 index 0000000..a0007e3 --- /dev/null +++ b/apps/docs/src/content/docs/examples/basic.mdx @@ -0,0 +1,86 @@ +--- +title: Basic benchmark crate +slug: basic-example +aliases: [/examples] +description: Follow the minimal SDK example from registration to host and mobile execution. +sidebar: + order: 1 +audience: [new-user, benchmark-author] +release: 0.1.43 +lastVerified: 2026-07-15 +section: Examples +order: 1 +sourceRefs: + - label: Basic benchmark example + url: https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/examples/basic-benchmark/README.md + evidence: Minimal crate setup, registered functions, tests, and run commands. +--- + +The upstream `examples/basic-benchmark` crate is the smallest complete integration. It registers two realistic workloads, exposes mobile entrypoints, and keeps deterministic fixture output for tests. + +## Cargo setup + +```toml +[lib] +name = "basic_benchmark" +crate-type = ["lib", "cdylib", "staticlib"] + +[dependencies] +mobench-sdk = { version = "0.1.43", default-features = false, features = ["registry"] } +inventory = "0.3" +serde = { version = "1", features = ["derive"] } +thiserror = "1" +uniffi = { version = "0.28", features = ["cli"] } +``` + +Use dependency versions compatible with your lockfile; the key mobench requirement is matching the `0.1.43` SDK line. + +## Benchmark functions + +```rust +use mobench_sdk::benchmark; + +#[benchmark] +pub fn bench_checksum() { + let bytes = std::hint::black_box(&INPUT); + let result = checksum_sweep(bytes, 8 * 1024, 2_048); + std::hint::black_box(result); +} +``` + +The upstream example uses deterministic, nontrivial input and enough repeated work to avoid a benchmark dominated by timer noise. + +## Test and discover + +From a checkout of `mobile-bench-rs`: + +```bash +cargo test -p basic-benchmark +mobench list --crate-path examples/basic-benchmark +``` + +Host-side preflight: + +```bash +mobench run \ + --crate-path examples/basic-benchmark \ + --target android \ + --function basic_benchmark::bench_fibonacci \ + --local-only +``` + +This validates the host harness only. For a mobile result, add an exact BrowserStack device and `--release`: + +```bash +mobench run \ + --crate-path examples/basic-benchmark \ + --target android \ + --function basic_benchmark::bench_fibonacci \ + --devices "Google Pixel 7-13.0" \ + --release \ + --output target/mobench/results.json +``` + +## Next step + +Copy the crate structure, replace one benchmark at a time, and confirm each new name with `mobench list`. diff --git a/apps/docs/src/content/docs/examples/ffi.mdx b/apps/docs/src/content/docs/examples/ffi.mdx new file mode 100644 index 0000000..4c6d2f6 --- /dev/null +++ b/apps/docs/src/content/docs/examples/ffi.mdx @@ -0,0 +1,88 @@ +--- +title: FFI benchmark crate +slug: ffi-example +description: Expose mobench benchmarks through UniFFI, the native C ABI, or BoltFFI. +sidebar: + order: 2 +audience: [benchmark-author, contributor] +release: 0.1.43 +lastVerified: 2026-07-15 +section: Examples +order: 2 +sourceRefs: + - label: FFI benchmark example + url: https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/examples/ffi-benchmark/README.md + evidence: UniFFI types, native C ABI export, BoltFFI bridge, tests, and run flow. +--- + +The upstream `examples/ffi-benchmark` crate shows the full boundary between Rust benchmark registration and generated Kotlin or Swift runners. Start with the basic example unless your project needs custom cross-language types. + +## Default UniFFI path + +The compatibility backend serializes benchmark request and report types through generated UniFFI bindings. A crate can expose an entrypoint like: + +```rust +#[derive(uniffi::Record)] +pub struct BenchSpec { + pub name: String, + pub iterations: u32, + pub warmup: u32, +} + +uniffi::setup_scaffolding!(); + +#[uniffi::export] +pub fn run_benchmark(spec: BenchSpec) -> Result { + let sdk_spec = mobench_sdk::BenchSpec { + name: spec.name, + iterations: spec.iterations, + warmup: spec.warmup, + }; + Ok(mobench_sdk::run_benchmark(sdk_spec)?.into()) +} +``` + +The SDK also provides FFI-oriented types that can replace custom records for simpler projects. + +## Native C ABI path + +Configure `ffi_backend = "native-c-abi"` when generated runners should call the SDK's JSON C ABI directly: + +```rust +mobench_sdk::export_native_c_abi!(); +``` + +The generated runner calls `mobench_run_benchmark_json` and returns Rust-owned buffers through `mobench_free_buf`. Never free or reuse those buffers through another allocator. + +## BoltFFI path + +Projects using BoltFFI can expose the same JSON bridge: + +```rust +#[boltffi::export] +pub fn run_benchmark_json(spec_json: &str) -> Result { + let spec = serde_json::from_str(spec_json).map_err(|error| error.to_string())?; + let report = run_benchmark(spec).map_err(|error| error.to_string())?; + serde_json::to_string(&report).map_err(|error| error.to_string()) +} +``` + +Set `ffi_backend = "boltffi"` and ensure the BoltFFI generator is available to the build. + +## Exercise the example + +```bash +cargo test -p ffi-benchmark +mobench list --crate-path examples/ffi-benchmark +mobench run \ + --crate-path examples/ffi-benchmark \ + --target android \ + --function ffi_benchmark::bench_fibonacci \ + --local-only +``` + +The last command is a host preflight, not a mobile measurement. + +## Next step + +Select one backend, build both target platforms, and keep that backend fixed across your baseline and candidate runs. diff --git a/apps/docs/src/content/docs/get-started/installation.mdx b/apps/docs/src/content/docs/get-started/installation.mdx new file mode 100644 index 0000000..1689721 --- /dev/null +++ b/apps/docs/src/content/docs/get-started/installation.mdx @@ -0,0 +1,86 @@ +--- +title: Installation +slug: installation +aliases: [/install] +description: Install mobench 0.1.43 and prepare a Rust benchmark crate. +sidebar: + order: 1 +audience: [new-user, benchmark-author] +release: 0.1.43 +lastVerified: 2026-07-15 +section: Get started +order: 1 +sourceRefs: + - label: Upstream README quick start + url: https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/README.md + evidence: CLI and SDK installation commands. +--- + +Install the `mobench` executable once, then add `mobench-sdk` to each crate that owns benchmark functions. + +## Requirements + +- Rust 1.85 or newer +- Cargo +- Android or iOS build tools only when you build for that platform +- BrowserStack App Automate credentials only when you run on remote devices + +Check your toolchain: + +```bash +rustc --version +cargo --version +``` + +## Install the CLI + +If you use `cargo-binstall`: + +```bash +cargo binstall mobench --version 0.1.43 +``` + +Or compile the release from crates.io: + +```bash +cargo install mobench --version 0.1.43 --locked +``` + +Confirm that the canonical executable is available: + +```bash +mobench --version +mobench --help +``` + +## Add the SDK + +From the benchmark crate: + +```bash +cargo add mobench-sdk@0.1.43 inventory +``` + +Mobile runners load your crate as a native library. Include the required crate types in `Cargo.toml`: + +```toml +[lib] +crate-type = ["lib", "cdylib", "staticlib"] +``` + +The default `mobench-sdk` features include registration, builders, and code generation. For a deliberately smaller integration, see the [compatibility reference](/compatibility/). + +## Install platform prerequisites + +Ask mobench for a platform-specific check before installing tools blindly: + +```bash +mobench check --target android +mobench check --target ios +``` + +Android builds use the Android SDK, Android NDK, `cargo-ndk`, and Rust Android targets. iOS builds require macOS, Xcode command-line tools, XcodeGen, and Rust iOS targets. + +## Next step + +Continue to the [quickstart](/quickstart/) and register your first benchmark function. diff --git a/apps/docs/src/content/docs/get-started/quickstart.mdx b/apps/docs/src/content/docs/get-started/quickstart.mdx new file mode 100644 index 0000000..75f62a5 --- /dev/null +++ b/apps/docs/src/content/docs/get-started/quickstart.mdx @@ -0,0 +1,96 @@ +--- +title: Quickstart +slug: quickstart +description: Register a Rust benchmark, validate it on the host, and run it on a mobile device. +sidebar: + order: 2 +audience: [new-user, benchmark-author] +release: 0.1.43 +lastVerified: 2026-07-15 +section: Get started +order: 2 +sourceRefs: + - label: Basic benchmark example + url: https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/examples/basic-benchmark/README.md + evidence: Minimal SDK registration and CLI flow. +--- + +This path first proves that mobench can discover and report your function on the host. It then moves the same function to a BrowserStack device for the actual mobile measurement. + +## 1. Register a benchmark + +Add a public function to your library crate: + +```rust +use mobench_sdk::benchmark; + +#[benchmark] +pub fn checksum() { + let bytes = std::hint::black_box(vec![42_u8; 64 * 1024]); + let sum: u64 = bytes.iter().map(|byte| u64::from(*byte)).sum(); + std::hint::black_box(sum); +} +``` + +Use enough work to rise above timer noise, and pass results through `black_box` so the optimizer cannot erase the operation. + +## 2. Confirm discovery + +From the project root, replace `bench-mobile` if your benchmark crate lives elsewhere: + +```bash +mobench list --crate-path bench-mobile +``` + +The output should include the fully qualified function name, such as `bench_mobile::checksum`. + +## 3. Run the host preflight + +```bash +mobench run \ + --target android \ + --crate-path bench-mobile \ + --function bench_mobile::checksum \ + --local-only \ + --iterations 20 \ + --warmup 5 \ + --output target/mobench/preflight.json +``` + +`--local-only` checks the host harness, discovery, and report path. It does not run Android code and must not be treated as a mobile result. + +Inspect the report: + +```bash +mobench summary target/mobench/preflight.json +``` + +## 4. Run on a mobile device + +Set your BrowserStack App Automate credentials: + +```bash +export BROWSERSTACK_USERNAME="your_username" +export BROWSERSTACK_ACCESS_KEY="your_access_key" +``` + +Choose a device that appears in `mobench devices --platform android`, then run: + +```bash +mobench run \ + --target android \ + --crate-path bench-mobile \ + --function bench_mobile::checksum \ + --devices "Google Pixel 7-13.0" \ + --iterations 20 \ + --warmup 5 \ + --release \ + --fetch \ + --output target/mobench/results.json +``` + +Using `--release` keeps the measured code optimized and reduces Android upload size. + +## Next step + +Read [benchmark quality](/benchmark-quality/) before using the result as a baseline. diff --git a/apps/docs/src/content/docs/help/troubleshooting.mdx b/apps/docs/src/content/docs/help/troubleshooting.mdx new file mode 100644 index 0000000..01b0ccf --- /dev/null +++ b/apps/docs/src/content/docs/help/troubleshooting.mdx @@ -0,0 +1,94 @@ +--- +title: Troubleshooting +slug: troubleshooting +aliases: [/testing, /codebase] +description: Diagnose discovery, toolchain, BrowserStack, result, and profiling failures. +sidebar: + order: 1 +audience: [new-user, benchmark-author, ci-engineer] +release: 0.1.43 +lastVerified: 2026-07-15 +section: Help +order: 1 +sourceRefs: + - label: Upstream testing guide + url: https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/docs/guides/testing.md + evidence: Supported validation paths and platform smoke checks. +--- + +Start with the narrowest command that can reproduce the failure, add `--verbose`, and keep the generated output directory until you understand the error. + +## Benchmark does not appear in `list` + +1. Confirm the function has `#[benchmark]` and a supported signature. +2. Confirm the benchmark crate depends on `mobench-sdk` with the registry feature and on `inventory`. +3. Pass an explicit `--crate-path` when the workspace contains several libraries. +4. Run `cargo check` for compile-time macro errors. + +```bash +mobench --verbose list --crate-path crates/bench-mobile +``` + +## `--local-only` succeeds but the device run fails + +That result is expected when the failure is in mobile compilation, packaging, signing, upload, or the generated runner. `--local-only` skips all of those layers. + +Run the platform checks and build separately: + +```bash +mobench check --target android +mobench build --target android --release --progress +mobench verify --target android --check-artifacts +``` + +For iOS, also verify Xcode, XcodeGen, signing, deployment target, and runner compatibility. + +## BrowserStack credentials or device fail + +```bash +mobench doctor --target both --browserstack true +mobench devices --validate "Google Pixel 7-13.0" +``` + +Check that the credentials are App Automate credentials, the device identifier still exists, and the app deployment target does not exceed the selected iOS version. + +## Upload times out + +Build and run with `--release`. Debug Android artifacts can be much larger. If the build was accepted but result polling expired, fetch it later with the BrowserStack build ID. + +## Result has no CPU or memory value + +Resource metrics are optional and vary by runner and provider availability. Missing means unavailable, not zero. Keep the timing result and resource availability as separate facts. + +## CI output is in the wrong place + +`ci run` and `profile run` use `--output-dir`. A normal `run` uses `--output` for its JSON report. + +```bash +mobench ci run --help +mobench profile run --help +mobench run --help +``` + +## Profiling writes no native capture + +Check the provider/backend combination first. BrowserStack native profiling is unsupported, and `rust-tracing` is only a planned manifest/trace contract in 0.1.43. + +For Android, confirm `adb`, `simpleperf`, the NDK, and `llvm-addr2line`. For iOS, confirm a simulator runtime, `xcrun`, `simctl`, and macOS `sample`. Read the capture status and warnings in `profile.json`; do not treat a planned or partial capture as complete. + +## Still stuck + +Capture these facts before opening an upstream issue: + +- `mobench --version` and `rustc --version` +- the smallest failing command with secrets removed +- platform and device identifier +- relevant `mobench.toml` and `bench-config.toml` sections +- verbose output and generated artifact paths +- whether host preflight, build, upload, execution, or fetch failed + +Contributor architecture and release-maintenance documentation belongs in the [upstream repository](https://github.com/worldcoin/mobile-bench-rs), not in the product guide. + +## Next step + +Re-run the narrow failing command with `--verbose`, then attach the sanitized evidence to an upstream issue. diff --git a/apps/docs/src/content/docs/index.mdx b/apps/docs/src/content/docs/index.mdx new file mode 100644 index 0000000..963f9a2 --- /dev/null +++ b/apps/docs/src/content/docs/index.mdx @@ -0,0 +1,55 @@ +--- +title: mobench documentation +slug: index +aliases: [/docs, /overview] +description: Build, run, and analyze Rust benchmarks on Android and iOS. +audience: [new-user, benchmark-author, ci-engineer] +release: 0.1.43 +lastVerified: 2026-07-15 +section: Overview +order: 0 +sourceRefs: + - label: Upstream README + url: https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/README.md + evidence: Product scope, workflow, release, and supported backends. +--- + +mobench takes a Rust benchmark from a function in your crate to repeatable results on Android and iOS. It builds native libraries, generates mobile runners, executes them on selected BrowserStack devices, and writes artifacts that people and CI can compare. + +The current documentation describes mobench **0.1.43** and requires Rust **1.85 or newer**. + +## Choose a starting point + +| Goal | Start here | +| --- | --- | +| Install the CLI and SDK | [Installation](/installation/) | +| Get one benchmark running | [Quickstart](/quickstart/) | +| Write trustworthy benchmark functions | [Benchmark functions](/benchmark-functions/) | +| Validate a project without using a device farm | [Host-side preflight](/host-preflight/) | +| Run on Android or iOS devices | [BrowserStack](/browserstack/) | +| Add a stable CI contract | [CI runs](/ci/) | +| Interpret artifacts and compare revisions | [Outputs](/outputs/) | +| Capture native stacks locally | [Profiling](/profiling/) | + +## What mobench measures + +Normal benchmark runs record measured iteration durations. CPU time and memory fields may also be present when the runner or provider can collect them. Missing resource values mean **unavailable**, not zero. + +Native stack profiling is a separate, local-first workflow. Android uses `simpleperf`; iOS uses simulator-host `sample`. BrowserStack native profiling is not supported in 0.1.43. + +## The execution boundary + +Selecting devices makes `mobench run` build and schedule a real mobile benchmark through BrowserStack. `--local-only` skips mobile builds and writes host-side preflight/spec output without executing the requested benchmark. Use it to validate discovery, configuration, and report shape—not as evidence of mobile performance. + +## Stable outputs + +`mobench ci run` writes a reusable contract: + +- `summary.json` for machines and comparisons +- `summary.md` for people and CI job summaries +- `results.csv` for analysis tools +- `plots/*.svg` when plotting is available + +## Next step + +[Install mobench](/installation/), then complete the quickstart before adding a device matrix or CI workflow. diff --git a/apps/docs/src/content/docs/reference/cli.mdx b/apps/docs/src/content/docs/reference/cli.mdx new file mode 100644 index 0000000..af6a294 --- /dev/null +++ b/apps/docs/src/content/docs/reference/cli.mdx @@ -0,0 +1,445 @@ +--- +title: CLI reference +slug: cli +aliases: [/cli-reference, /cli-man-pages] +description: Find mobench commands and the flags that connect authoring, execution, CI, and profiling. +sidebar: + order: 1 +tableOfContents: + minHeadingLevel: 2 + maxHeadingLevel: 2 +audience: [benchmark-author, ci-engineer] +release: 0.1.43 +lastVerified: 2026-07-15 +section: Reference +order: 1 +sourceRefs: + - label: CLI definitions + url: https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/crates/mobench/src/cli.rs + evidence: Clap command, subcommand, argument, default, and enum definitions. +--- + +The canonical executable is `mobench`. Run `mobench --help` against your installed version for the complete generated argument reference. + +{/* BEGIN GENERATED CLI REFERENCE */} +{/* Generated from @mobench/truth. Do not edit this section by hand. */} + +## Global flags + +| Flag | Value | Default | Purpose | +| --- | --- | --- | --- | +| `--dry-run` | boolean | false | Print what would be done without actually doing it | +| `--non-interactive` | boolean | false | Disable interactive prompts (fail instead) | +| `-v`, `--verbose` | boolean | false | Print verbose output including all commands | +| `--yes` | boolean | false | Assume yes to prompts and allow overwriting files | + +The generated CLI also provides `--help`, `-h`, `--version`, and `-V` where Clap exposes them. + +## Command index + +| Command | Purpose | +| --- | --- | +| `mobench build` | Build mobile artifacts from the resolved benchmark crate | +| `mobench check` | Check prerequisites for building mobile artifacts | +| `mobench ci` | CI helpers (workflow and action scaffolding) | +| `mobench ci check-run` | Create a GitHub Check Run with benchmark results | +| `mobench ci init` | Generate GitHub Actions workflow + local action wrapper | +| `mobench ci merge-split-runs` | Merge one-sample CI summaries into a normal CI output set | +| `mobench ci run` | Run a full CI benchmark flow with stable output contract | +| `mobench ci summarize` | Summarize benchmark results with device metrics | +| `mobench compare` | Compare two run summaries for regressions | +| `mobench config` | Validate run configuration and associated files | +| `mobench config validate` | Validate bench-config.toml and referenced matrix/settings | +| `mobench devices` | List available BrowserStack devices for testing | +| `mobench devices resolve` | Resolve devices from a matrix deterministically for CI usage | +| `mobench doctor` | Validate local + CI prerequisites and configuration | +| `mobench fetch` | Fetch BrowserStack build artifacts (logs, session JSON) for CI | +| `mobench fixture` | Fixture lifecycle helpers for reproducible CI setup | +| `mobench fixture build` | Build fixture artifacts using existing build commands | +| `mobench fixture cache-key` | Compute deterministic fixture cache key from config/toolchain inputs | +| `mobench fixture init` | Create starter fixture files for CI runs | +| `mobench fixture verify` | Verify fixture files and optional profile filtering | +| `mobench fixture verify-plots` | Render and verify checked-in plot fixtures | +| `mobench init` | Scaffold a base config file for the CLI | +| `mobench init-sdk` | Initialize a new benchmark project with the SDK templates | +| `mobench list` | List all discovered benchmark functions | +| `mobench package-ipa` | Package iOS app as IPA for distribution or testing | +| `mobench package-xcuitest` | Package XCUITest runner for BrowserStack testing | +| `mobench plan` | Generate a sample device matrix file | +| `mobench profile` | Profiling helpers for native profile capture and summary rendering | +| `mobench profile diff` | Generate a differential flamegraph bundle from two normalized profile manifests | +| `mobench profile run` | Plan or execute a native profiling session; local android-native and ios-instruments now attempt real native capture | +| `mobench profile summarize` | Render markdown or JSON from a normalized profile manifest | +| `mobench report` | Reporting helpers for CI summaries and PR comments | +| `mobench report github` | Generate/publish sticky GitHub PR comment from summary output | +| `mobench report summarize` | Generate markdown summary from standardized output JSON | +| `mobench run` | Build mobile artifacts, write host preflight output, or run on BrowserStack devices | +| `mobench summary` | Display summary statistics from a benchmark report JSON file | +| `mobench verify` | Verify benchmark setup: registry, spec, artifacts, and optional smoke test | + +## Complete command flag index + +Global flags above are omitted from each command row. Positional arguments use angle brackets. + +### `mobench build` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--crate-path` | `CRATE_PATH` | optional | Path to the benchmark crate (default: auto-detect bench-mobile/ or crates/{crate}) | +| `--ios-deployment-target` | `IOS_DEPLOYMENT_TARGET` | optional | iOS deployment target for generated app and XCUITest targets | +| `--ios-runner` | `swiftui \| uikit-legacy` | optional | iOS runner template (swiftui or uikit-legacy) | +| `--output-dir` | `OUTPUT_DIR` | optional | Output directory for mobile artifacts (default: target/mobench) | +| `--progress` | boolean | default: false | Show simplified step-by-step progress output | +| `--project-root` | `PROJECT_ROOT` | optional | Project root containing mobench.toml or the Cargo workspace | +| `--release` | boolean | default: false | Build in release mode | +| `--target` | `android \| both \| ios` | required | — | + +### `mobench check` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--format` | `json \| text` | default: text | Output format (text or json) | +| `-t`, `--target` | `android \| both \| ios` | required | Target platform (android or ios) | + +### `mobench ci check-run` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--annotation-path` | `ANNOTATION_PATH` | default: src/lib.rs | File path used in Check Run annotations (relative to repo root) | +| `--baseline` | `BASELINE` | optional | Optional baseline JSON for regression detection | +| `--name` | `NAME` | default: Mobench | Check Run name displayed in the PR | +| `--regression-threshold-pct` | `REGRESSION_THRESHOLD_PCT` | default: 5 | Regression threshold percentage | +| `--repo` | `REPO` | required | GitHub repository (owner/repo format) | +| `--results` | `RESULTS` | optional | Path to summary JSON with benchmark results | +| `--results-dir` | `RESULTS_DIR` | optional | Directory containing summary JSON files (processes all) | +| `--sha` | `SHA` | required | Git commit SHA to annotate | + +### `mobench ci init` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--action-dir` | `ACTION_DIR` | default: .github/actions/mobench | Directory to write the local GitHub Action | +| `--workflow` | `WORKFLOW` | default: .github/workflows/mobile-bench.yml | Path to write the workflow file | + +### `mobench ci merge-split-runs` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--device` | `DEVICE` | required | Device label all samples must match | +| `--function` | `FUNCTION` | required | Fully-qualified benchmark function all samples must contain | +| `--iterations` | `ITERATIONS` | required | Expected measured sample count | +| `--output-dir` | `OUTPUT_DIR` | required | Directory to write merged summary.json, summary.md, and results.csv | +| `--samples-dir` | `SAMPLES_DIR` | required | Directory containing sample-*/summary.json one-sample CI outputs | +| `--warmup` | `WARMUP` | default: 0 | Warmup count reported in merged CI summaries | + +### `mobench ci run` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--android-benchmark-timeout-secs` | `ANDROID_BENCHMARK_TIMEOUT_SECS` | optional | Android benchmark watchdog timeout in seconds for the generated harness | +| `--android-heartbeat-interval-secs` | `ANDROID_HEARTBEAT_INTERVAL_SECS` | optional | Android benchmark heartbeat interval in seconds for the generated harness | +| `--baseline` | `BASELINE` | optional | Baseline summary source (path\|url\|artifact:<path>) | +| `--config` | `CONFIG` | optional | Optional path to config file | +| `--crate-path` | `CRATE_PATH` | optional | Path to the benchmark crate directory containing Cargo.toml | +| `--device-matrix` | `DEVICE_MATRIX` | optional | Device matrix YAML file to load device names from | +| `--device-tags` | `DEVICE_TAGS` | optional | Device tags to select from the device matrix (comma-separated or repeatable) | +| `--devices` | `DEVICES` | optional | Device identifiers or labels (BrowserStack devices) | +| `--fetch` | boolean | default: false | Fetch BrowserStack artifacts after the run completes | +| `--fetch-output-dir` | `FETCH_OUTPUT_DIR` | default: target/browserstack | — | +| `--fetch-poll-interval-secs` | `FETCH_POLL_INTERVAL_SECS` | default: 5 | — | +| `--fetch-timeout-secs` | `FETCH_TIMEOUT_SECS` | default: 300 | — | +| `--function` | `FUNCTION` | optional | Fully-qualified Rust function to benchmark (single function) | +| `--functions` | `FUNCTIONS` | optional | Multiple benchmark functions (comma-separated or JSON array). Runs each in sequence. | +| `--ios-app` | `IOS_APP` | optional | Path to iOS app bundle (.ipa or zipped .app) for BrowserStack XCUITest | +| `--ios-deployment-target` | `IOS_DEPLOYMENT_TARGET` | optional | iOS deployment target for generated app and XCUITest targets | +| `--ios-runner` | `swiftui \| uikit-legacy` | optional | iOS runner template (swiftui or uikit-legacy) | +| `--ios-test-suite` | `IOS_TEST_SUITE` | optional | Path to iOS XCUITest test suite package (.zip or .ipa) | +| `--iterations` | `ITERATIONS` | default: 100 | — | +| `--junit` | `JUNIT` | optional | Write JUnit XML report to the given path | +| `--local-only` | boolean | default: false | Skip mobile builds and write host-side preflight/spec output without mobile execution | +| `--mobench-ref` | `MOBENCH_REF` | optional | Metadata: git ref/sha for this mobench invocation | +| `--output-dir` | `OUTPUT_DIR` | default: target/mobench/ci | Output directory for CI contract files | +| `--plots` | `auto \| off \| require` | default: auto | — | +| `--pr-number` | `PR_NUMBER` | optional | Metadata: pull request number | +| `--progress` | boolean | default: false | Show simplified step-by-step progress output | +| `--regression-threshold-pct` | `REGRESSION_THRESHOLD_PCT` | default: 5 | Regression threshold percentage when comparing to baseline | +| `--release` | boolean | default: false | Build in release mode (recommended for BrowserStack to reduce APK size and upload time) | +| `--request-command` | `REQUEST_COMMAND` | optional | Metadata: original command requested by the caller | +| `--requested-by` | `REQUESTED_BY` | optional | Metadata: user or actor that requested the run | +| `--target` | `android \| both \| ios` | required | — | +| `--warmup` | `WARMUP` | default: 10 | — | + +### `mobench ci summarize` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--build-id` | `BUILD_ID` | optional | BrowserStack build ID to enrich results with device metrics (requires --results-dir) | +| `--output-file` | `OUTPUT_FILE` | optional | Write output to file in addition to stdout | +| `--output-format` | `json \| markdown \| table` | default: table | Output format: table (terminal), markdown, or json | +| `--platform` | `android \| ios` | optional | Platform filter (show only one platform) | +| `--results-dir` | `RESULTS_DIR` | optional | Directory containing summary.json/CSV results (offline mode) | + +### `mobench compare` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--baseline` | `BASELINE` | required | Baseline JSON summary to compare against | +| `--candidate` | `CANDIDATE` | required | Candidate JSON summary to compare | +| `--output` | `OUTPUT` | optional | Optional output path for markdown report | + +### `mobench config validate` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--config` | `CONFIG` | default: bench-config.toml | — | +| `--format` | `json \| text` | default: text | — | + +### `mobench devices` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--json` | boolean | default: false | Output as JSON | +| `--platform` | `android \| ios` | optional | Filter by platform (android or ios) | +| `--validate` | `VALIDATE` | optional | Validate device specs against available devices | + +### `mobench devices resolve` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--config` | `CONFIG` | optional | Path to run config file (optional source for matrix/tags) | +| `--device-matrix` | `DEVICE_MATRIX` | optional | Path to device matrix YAML file | +| `--format` | `json \| text` | default: text | — | +| `--platform` | `android \| ios` | required | — | +| `--profile` | `PROFILE` | optional | Device profile/tag to resolve (defaults to `default`) | + +### `mobench doctor` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--browserstack` | `false \| true` | default: true | Validate BrowserStack credentials | +| `--config` | `CONFIG` | optional | Optional path to run config file to validate | +| `--device-matrix` | `DEVICE_MATRIX` | optional | Optional path to device matrix YAML file to validate | +| `--device-tags` | `DEVICE_TAGS` | optional | Device tags to select from the device matrix (comma-separated or repeatable) | +| `--format` | `json \| text` | default: text | — | +| `--target` | `android \| both \| ios` | default: both | — | + +### `mobench fetch` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--build-id` | `BUILD_ID` | required | — | +| `--output-dir` | `OUTPUT_DIR` | default: target/browserstack | — | +| `--poll-interval-secs` | `POLL_INTERVAL_SECS` | default: 10 | — | +| `--target` | `android \| ios` | required | — | +| `--timeout-secs` | `TIMEOUT_SECS` | default: 1800 | — | +| `--wait` | boolean | default: true | — | + +### `mobench fixture build` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--crate-path` | `CRATE_PATH` | optional | Path to benchmark crate | +| `--output-dir` | `OUTPUT_DIR` | optional | Output directory for mobile artifacts | +| `--progress` | boolean | default: false | Show simplified step-by-step progress output | +| `--release` | boolean | default: false | Build in release mode | +| `--target` | `android \| both \| ios` | default: both | — | + +### `mobench fixture cache-key` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--config` | `CONFIG` | default: bench-config.toml | — | +| `--device-matrix` | `DEVICE_MATRIX` | optional | — | +| `--format` | `json \| text` | default: text | — | +| `--profile` | `PROFILE` | optional | Device profile/tag for keying | +| `--target` | `android \| both \| ios` | default: both | — | + +### `mobench fixture init` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--config` | `CONFIG` | default: bench-config.toml | — | +| `--device-matrix` | `DEVICE_MATRIX` | default: device-matrix.yaml | — | +| `--force` | boolean | default: false | Overwrite existing fixture files | + +### `mobench fixture verify` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--config` | `CONFIG` | default: bench-config.toml | — | +| `--device-matrix` | `DEVICE_MATRIX` | optional | — | +| `--format` | `json \| text` | default: text | — | +| `--profile` | `PROFILE` | optional | Device profile/tag to verify | +| `--target` | `android \| both \| ios` | default: both | — | + +### `mobench fixture verify-plots` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `` | `basic \| ffi` | required | — | +| `--output-dir` | `OUTPUT_DIR` | optional | Output directory for rendered fixture artifacts (defaults under target/mobench/plot-fixtures) | + +### `mobench init` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--output` | `OUTPUT` | default: bench-config.toml | — | +| `--target` | `android \| ios` | default: android | — | + +### `mobench init-sdk` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--examples` | boolean | default: false | Generate example benchmarks | +| `--output-dir` | `OUTPUT_DIR` | default: . | — | +| `--project-name` | `PROJECT_NAME` | default: bench-project | — | +| `--target` | `android \| both \| ios` | required | — | + +### `mobench list` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--crate-path` | `CRATE_PATH` | optional | Path to the benchmark crate directory containing Cargo.toml | +| `--project-root` | `PROJECT_ROOT` | optional | Project root containing mobench.toml or the Cargo workspace | + +### `mobench package-ipa` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--crate-path` | `CRATE_PATH` | optional | Path to the benchmark crate directory containing Cargo.toml | +| `--method` | `adhoc \| development` | default: adhoc | Signing method | +| `--output-dir` | `OUTPUT_DIR` | optional | Output directory for mobile artifacts (default: target/mobench) | +| `--project-root` | `PROJECT_ROOT` | optional | Project root containing mobench.toml or the Cargo workspace | +| `--scheme` | `SCHEME` | default: BenchRunner | Xcode scheme to build | + +### `mobench package-xcuitest` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--crate-path` | `CRATE_PATH` | optional | Path to the benchmark crate directory containing Cargo.toml | +| `--output-dir` | `OUTPUT_DIR` | optional | Output directory for mobile artifacts (default: target/mobench) | +| `--project-root` | `PROJECT_ROOT` | optional | Project root containing mobench.toml or the Cargo workspace | +| `--scheme` | `SCHEME` | default: BenchRunner | Xcode scheme to build | + +### `mobench plan` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--output` | `OUTPUT` | default: device-matrix.yaml | — | + +### `mobench profile diff` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--baseline` | `BASELINE` | required | Path to the baseline profile.json manifest | +| `--candidate` | `CANDIDATE` | required | Path to the candidate profile.json manifest | +| `--normalize` | boolean | default: false | Normalize baseline sample counts to candidate totals before diffing | +| `--output-dir` | `OUTPUT_DIR` | default: target/mobench/profile/diff | Output directory for differential profile artifacts | + +### `mobench profile run` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--backend` | `android-native \| auto \| ios-instruments \| rust-tracing` | default: auto | — | +| `--config` | `CONFIG` | optional | Optional path to config file | +| `--crate-path` | `CRATE_PATH` | optional | Path to the benchmark crate directory containing Cargo.toml | +| `--device` | `DEVICE` | optional | Explicit BrowserStack device name to resolve for this profiling request | +| `--device-matrix` | `DEVICE_MATRIX` | optional | Path to device matrix YAML file used with --profile or config-based device tags | +| `--format` | `both \| native \| processed` | default: both | — | +| `--function` | `FUNCTION` | required | Fully-qualified Rust function to profile | +| `--os-version` | `OS_VERSION` | optional | OS version for --device (for example `16` or `14.0`) | +| `--output-dir` | `OUTPUT_DIR` | default: target/mobench/profile | — | +| `--profile` | `PROFILE` | optional | Device profile/tag to resolve (for example `high-spec`) | +| `--provider` | `browserstack \| local` | default: local | — | +| `--target` | `android \| ios` | required | — | +| `--trace-events-output` | `TRACE_EVENTS_OUTPUT` | optional | Write machine-readable trace/event JSON to this path for downstream consumers | +| `--warmup-mode` | `cold \| warm` | optional | Warm or cold capture mode for local native profiling (defaults to warm for local Android/iOS native backends) | + +### `mobench profile summarize` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--output` | `OUTPUT` | optional | — | +| `--output-format` | `json \| markdown` | default: markdown | — | +| `--profile` | `PROFILE` | default: target/mobench/profile/profile.json | — | + +### `mobench report github` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--marker` | `MARKER` | default: <!-- mobench-report --> | — | +| `--output` | `OUTPUT` | optional | Write generated comment body to file | +| `--pr` | `PR` | optional | Pull request number (auto-detected from GITHUB_REF if omitted) | +| `--publish` | boolean | default: false | Publish via GitHub API using GITHUB_TOKEN | +| `--summary` | `SUMMARY` | default: target/mobench/ci/summary.json | — | + +### `mobench report summarize` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--output` | `OUTPUT` | optional | Write markdown output to file | +| `--plots` | `auto \| off \| require` | default: auto | — | +| `--summary` | `SUMMARY` | default: target/mobench/ci/summary.json | — | + +### `mobench run` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--android-benchmark-timeout-secs` | `ANDROID_BENCHMARK_TIMEOUT_SECS` | optional | Android benchmark watchdog timeout in seconds for the generated harness | +| `--android-heartbeat-interval-secs` | `ANDROID_HEARTBEAT_INTERVAL_SECS` | optional | Android benchmark heartbeat interval in seconds for the generated harness | +| `--baseline` | `BASELINE` | optional | Baseline summary source (path\|url\|artifact:<path>) | +| `--ci` | boolean | default: false | Enable CI mode (job summary, optional JUnit, regression exit codes) | +| `--config` | `CONFIG` | optional | Optional path to config file | +| `--crate-path` | `CRATE_PATH` | optional | Path to the benchmark crate directory containing Cargo.toml | +| `--device-matrix` | `DEVICE_MATRIX` | optional | Device matrix YAML file to load device names from | +| `--device-tags` | `DEVICE_TAGS` | optional | Device tags to select from the device matrix (comma-separated or repeatable) | +| `--devices` | `DEVICES` | optional | Device identifiers or labels (BrowserStack devices) | +| `--fetch` | boolean | default: false | Fetch BrowserStack artifacts after the run completes | +| `--fetch-output-dir` | `FETCH_OUTPUT_DIR` | default: target/browserstack | — | +| `--fetch-poll-interval-secs` | `FETCH_POLL_INTERVAL_SECS` | default: 5 | — | +| `--fetch-timeout-secs` | `FETCH_TIMEOUT_SECS` | default: 300 | — | +| `--function` | `FUNCTION` | optional | Fully-qualified Rust function to benchmark | +| `--ios-app` | `IOS_APP` | optional | Path to iOS app bundle (.ipa or zipped .app) for BrowserStack XCUITest | +| `--ios-deployment-target` | `IOS_DEPLOYMENT_TARGET` | optional | iOS deployment target for generated app and XCUITest targets | +| `--ios-runner` | `swiftui \| uikit-legacy` | optional | iOS runner template (swiftui or uikit-legacy) | +| `--ios-test-suite` | `IOS_TEST_SUITE` | optional | Path to iOS XCUITest test suite package (.zip or .ipa) | +| `--iterations` | `ITERATIONS` | optional | — | +| `--junit` | `JUNIT` | optional | Write JUnit XML report to the given path | +| `--local-only` | boolean | default: false | Skip mobile builds and write host-side preflight/spec output without mobile execution | +| `--output` | `OUTPUT` | optional | Optional output path for JSON report | +| `--progress` | boolean | default: false | Show simplified step-by-step progress output | +| `--project-root` | `PROJECT_ROOT` | optional | Project root containing mobench.toml or the Cargo workspace | +| `--regression-threshold-pct` | `REGRESSION_THRESHOLD_PCT` | default: 5 | Regression threshold percentage when comparing to baseline | +| `--release` | boolean | default: false | Build in release mode (recommended for BrowserStack to reduce APK size and upload time) | +| `--summary-csv` | boolean | default: false | Write CSV summary alongside JSON | +| `--target` | `android \| ios` | optional | — | +| `--warmup` | `WARMUP` | optional | — | + +### `mobench summary` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--format` | `csv \| json \| text` | optional | Output format: text (default), json, or csv | +| `` | `REPORT` | required | Path to the benchmark report JSON file | + +### `mobench verify` + +| Flag or argument | Value | Requirement | Purpose | +| --- | --- | --- | --- | +| `--check-artifacts` | boolean | default: false | Check that build artifacts exist | +| `--crate-path` | `CRATE_PATH` | optional | Path to the benchmark crate directory containing Cargo.toml | +| `--function` | `FUNCTION` | optional | Function name to verify/smoke test | +| `--output-dir` | `OUTPUT_DIR` | optional | Output directory for mobile artifacts (default: target/mobench) | +| `--project-root` | `PROJECT_ROOT` | optional | Project root containing mobench.toml or the Cargo workspace | +| `--smoke-test` | boolean | default: false | Run a local smoke test with minimal iterations | +| `--spec-path` | `SPEC_PATH` | optional | Path to bench_spec.json to validate | +| `--target` | `android \| both \| ios` | optional | Target platform to verify artifacts for | + + +{/* END GENERATED CLI REFERENCE */} + +`ci run` uses `--output-dir`, which defaults to `target/mobench/ci`. Its core outputs are `summary.json`, `summary.md`, and `results.csv`. `profile run` also uses `--output-dir`, defaulting to `target/mobench/profile`. BrowserStack native profiling is unsupported in 0.1.43. + +## Next step + +Run `mobench run --help` and save a minimal invocation in your repository's benchmark README. diff --git a/apps/docs/src/content/docs/reference/compatibility.mdx b/apps/docs/src/content/docs/reference/compatibility.mdx new file mode 100644 index 0000000..a488106 --- /dev/null +++ b/apps/docs/src/content/docs/reference/compatibility.mdx @@ -0,0 +1,70 @@ +--- +title: Compatibility +slug: compatibility +aliases: [/build, /build-artifacts, /sdk, /sdk-integration, /public-api] +description: Match Rust, platform tools, devices, and generated runner backends to mobench 0.1.43. +sidebar: + order: 5 +audience: [benchmark-author, ci-engineer] +release: 0.1.43 +lastVerified: 2026-07-15 +section: Reference +order: 5 +sourceRefs: + - label: Build guide + url: https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/docs/guides/build.md + evidence: Rust and platform prerequisites, targets, outputs, and generated backends. +--- + +mobench 0.1.43 has a Rust MSRV of **1.85**. Mobile compatibility also depends on the platform toolchain, target architecture, runner backend, and selected device OS. + +## Android + +Typical requirements: + +- Android SDK and NDK +- `cargo-ndk` +- `ANDROID_NDK_HOME` or discoverable SDK installation +- Rust targets such as `aarch64-linux-android`, `armv7-linux-androideabi`, and `x86_64-linux-android` + +The generated project defaults to Android min SDK 24, target SDK 34, and `arm64-v8a` unless configured otherwise. Set `UNIFFI_ANDROID_ABI=x86_64` when exercising the UniFFI path on a default x86_64 emulator. + +## iOS + +Typical requirements: + +- macOS +- Xcode command-line tools +- XcodeGen +- Rust targets `aarch64-apple-ios`, `aarch64-apple-ios-sim`, and `x86_64-apple-ios` + +The default deployment target is iOS 15.0 with the SwiftUI runner. Lower targets use `uikit-legacy` and need an Xcode release capable of building for that OS. BrowserStack device OS must be at least the app deployment target. + +## Generated runner backends + +| Backend | Use when | Integration requirement | +| --- | --- | --- | +| `uniffi` | You want the default compatibility path | UniFFI types and generated Kotlin/Swift bindings | +| `native-c-abi` | Binding overhead must stay out of measured work | Export `mobench_sdk::export_native_c_abi!()` | +| `boltffi` | The project already uses BoltFFI generation | Export the JSON bridge with `#[boltffi::export]` and provide BoltFFI tooling | + +Keep the backend constant across a baseline and candidate; changing it changes the execution path. + +## Profiling compatibility + +- Android native profiling is local and uses `simpleperf`. +- iOS profiling is local, simulator-host oriented, and uses macOS `sample`. +- `rust-tracing` is a planned manifest/trace contract only. +- BrowserStack native profiling is unsupported in 0.1.43. + +## Check the current machine + +```bash +mobench check --target android +mobench check --target ios +mobench doctor --target both +``` + +## Next step + +Run the platform check on the same machine image used by CI, then save its toolchain versions with your first baseline. diff --git a/apps/docs/src/content/docs/reference/configuration.mdx b/apps/docs/src/content/docs/reference/configuration.mdx new file mode 100644 index 0000000..36a42ec --- /dev/null +++ b/apps/docs/src/content/docs/reference/configuration.mdx @@ -0,0 +1,147 @@ +--- +title: Configuration +slug: configuration +aliases: [/concepts] +description: Configure project builds separately from benchmark run and provider settings. +sidebar: + order: 2 +audience: [benchmark-author, ci-engineer] +release: 0.1.43 +lastVerified: 2026-07-15 +section: Reference +order: 2 +sourceRefs: + - label: Current configuration specification + url: https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/docs/specs/mobench-current-spec.md + evidence: Project config, run config, resolution order, and examples. +--- + +mobench uses two TOML files for different concerns: + +- `mobench.toml` describes the benchmark crate and generated mobile projects. +- `bench-config.toml` describes a run, device selection, and BrowserStack settings. + +Keeping them separate lets one project support several CI matrices without duplicating build identity. + +{/* BEGIN GENERATED CONFIG REFERENCE */} +{/* Generated from @mobench/truth. Do not edit this section by hand. */} + +## Published configuration keys + +These are the complete configuration keys in the pinned release contract. Example files below may use only a task-specific subset. + +### `mobench.toml` + +| Key | Value | Required | Default | Evidence | +| --- | --- | --- | --- | --- | +| `project.crate` | `string|null` | no | — | `source-mobench-config` | +| `project.library_name` | `string|null` | no | — | `source-mobench-config` | +| `project.output_dir` | `path|null` | no | — | `source-mobench-config` | +| `android.package` | `string` | no | dev.world.bench | `source-mobench-config` | +| `android.min_sdk` | `integer` | no | 24 | `source-mobench-config` | +| `android.target_sdk` | `integer` | no | 34 | `source-mobench-config` | +| `android.abis` | `string[]|null` | no | — | `source-mobench-config` | +| `ios.bundle_id` | `string` | no | dev.world.bench | `source-mobench-config` | +| `ios.deployment_target` | `string` | no | 15.0 | `source-mobench-config` | +| `ios.team_id` | `string|null` | no | — | `source-mobench-config` | +| `benchmarks.default_function` | `string|null` | no | — | `source-mobench-config` | +| `benchmarks.default_iterations` | `integer` | no | 100 | `source-mobench-config` | +| `benchmarks.default_warmup` | `integer` | no | 10 | `source-mobench-config` | +| `browserstack.ios_completion_timeout_secs` | `integer|null` | no | — | `source-mobench-config` | + +### `bench-config.toml` + +| Key | Value | Required | Default | Evidence | +| --- | --- | --- | --- | --- | +| `target` | `android|ios` | yes | — | `source-bench-config` | +| `function` | `string` | yes | — | `source-bench-config` | +| `iterations` | `integer` | yes | — | `source-bench-config` | +| `warmup` | `integer` | yes | — | `source-bench-config` | +| `device_matrix` | `path` | yes | — | `source-bench-config` | +| `device_tags` | `string[]|null` | no | — | `source-bench-config` | +| `browserstack.app_automate_username` | `string` | yes | — | `source-bench-config` | +| `browserstack.app_automate_access_key` | `string` | yes | — | `source-bench-config` | +| `browserstack.project` | `string|null` | no | — | `source-bench-config` | +| `browserstack.ios_completion_timeout_secs` | `integer|null` | no | — | `source-bench-config` | +| `browserstack.android_benchmark_timeout_secs` | `integer|null` | no | — | `source-bench-config` | +| `browserstack.android_heartbeat_interval_secs` | `integer|null` | no | — | `source-bench-config` | +| `ios_xcuitest.app` | `path` | no | — | `source-bench-config` | +| `ios_xcuitest.test_suite` | `path` | no | — | `source-bench-config` | + +{/* END GENERATED CONFIG REFERENCE */} + +## Project configuration + +Place `mobench.toml` at the project or workspace root: + +```toml test=config:mobench.toml +[project] +crate = "bench-mobile" +library_name = "bench_mobile" +output_dir = "target/mobench" + +[android] +package = "com.example.bench" +min_sdk = 24 +target_sdk = 34 +abis = ["arm64-v8a"] + +[ios] +bundle_id = "com.example.bench" +deployment_target = "15.0" +team_id = "ABCDE12345" + +[benchmarks] +default_function = "bench_mobile::checksum" +default_iterations = 100 +default_warmup = 10 +``` + +The pinned release contract defines only the keys shown above for generated project identity and build defaults. Runner-backend selection is not a published `mobench.toml` key in 0.1.43. + +## Run configuration + +Use `bench-config.toml` for a repeatable run: + +```toml test=config:bench-config.toml +target = "android" +function = "bench_mobile::checksum" +iterations = 100 +warmup = 10 +device_matrix = "device-matrix.yaml" +device_tags = ["default"] + +[browserstack] +app_automate_username = "${BROWSERSTACK_USERNAME}" +app_automate_access_key = "${BROWSERSTACK_ACCESS_KEY}" +project = "mobile-benchmarks" + +[ios_xcuitest] +app = "target/mobench/ios/BenchRunner.ipa" +test_suite = "target/mobench/ios/BenchRunnerUITests.zip" +``` + +Validate it before a run: + +```bash +mobench config validate --config bench-config.toml +``` + +## Resolution and overrides + +Explicit CLI values take precedence over config values. Project discovery considers explicit `--project-root` and `--crate-path`, explicit config, a discovered `mobench.toml`, Cargo workspace metadata, the Git root, and the legacy `bench-mobile/` layout. + +Use explicit paths in CI when a workspace contains several plausible benchmark crates: + +```bash +mobench build \ + --target android \ + --project-root . \ + --crate-path crates/bench-mobile +``` + +`--device-matrix` overrides the matrix path from `--config`. Do not combine `--devices` and `--device-matrix`; choose one source of device selection. + +## Next step + +Generate a [device matrix](/device-matrices/) and validate the combined setup with `mobench doctor`. diff --git a/apps/docs/src/content/docs/reference/device-matrices.mdx b/apps/docs/src/content/docs/reference/device-matrices.mdx new file mode 100644 index 0000000..5993be6 --- /dev/null +++ b/apps/docs/src/content/docs/reference/device-matrices.mdx @@ -0,0 +1,93 @@ +--- +title: Device matrices +slug: device-matrices +description: Select BrowserStack Android and iOS devices deterministically with tags. +sidebar: + order: 3 +audience: [ci-engineer, benchmark-author] +release: 0.1.43 +lastVerified: 2026-07-15 +section: Reference +order: 3 +sourceRefs: + - label: BrowserStack CI guide + url: https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/docs/guides/browserstack-ci.md + evidence: Device inventory, validation, matrix syntax, profiles, and legacy iOS constraints. +--- + +A device matrix keeps exact BrowserStack identifiers and grouping decisions in version control. Tags let CI select a stable lane such as `default`, `pixel`, or `legacy-ios`. + +## Create a matrix + +Generate a starter file: + +```bash +mobench plan --output device-matrix.yaml +``` + +Example: + +```yaml +devices: + - name: "Google Pixel 7-13.0" + os: "android" + os_version: "13.0" + tags: ["default", "pixel"] + - name: "iPhone 14-16" + os: "ios" + os_version: "16" + tags: ["default", "iphone"] +``` + +Use identifiers from the live BrowserStack inventory: + +```bash +mobench devices --platform android +mobench devices --platform ios +mobench devices --json +``` + +## Validate identifiers + +```bash +mobench devices --validate "Google Pixel 7-13.0" +``` + +Invalid labels return nearby suggestions. Update the matrix deliberately when BrowserStack changes its inventory; do not silently fall back to another device. + +## Resolve a tagged profile + +```bash +mobench devices resolve \ + --platform android \ + --profile default \ + --device-matrix device-matrix.yaml +``` + +Run the selected group: + +```bash +mobench ci run \ + --target android \ + --function bench_mobile::checksum \ + --device-matrix device-matrix.yaml \ + --device-tags default \ + --release \ + --output-dir target/mobench/ci +``` + +`--device-tags` accepts comma-separated or repeated values. Explicit `--devices` and a matrix cannot be combined. + +## Legacy iOS lane + +An older BrowserStack device requires all three parts to agree: + +- the matrix's device OS +- the `mobench.toml` iOS deployment target +- the Xcode version on the build runner + +For a device below iOS 15, select `uikit-legacy`. mobench fails early when the app deployment target is newer than the chosen device OS. + +## Next step + +Run `mobench doctor --device-matrix device-matrix.yaml --browserstack true` before committing a CI lane. diff --git a/apps/docs/src/content/docs/reference/schemas.mdx b/apps/docs/src/content/docs/reference/schemas.mdx new file mode 100644 index 0000000..951943a --- /dev/null +++ b/apps/docs/src/content/docs/reference/schemas.mdx @@ -0,0 +1,61 @@ +--- +title: Output schemas +slug: schemas +aliases: [/current-spec, /reference] +description: Use the versioned mobench JSON contracts without depending on private implementation details. +sidebar: + order: 4 +audience: [ci-engineer, contributor] +release: 0.1.43 +lastVerified: 2026-07-15 +section: Reference +order: 4 +sourceRefs: + - label: Upstream schemas + url: https://github.com/worldcoin/mobile-bench-rs/tree/d1a3176f9144f35e777e83fd07045116144da257/docs/schemas + evidence: Versioned CI, summary, and trace-event JSON Schema files. +--- + +mobench publishes JSON Schemas for the contracts intended for downstream validation. Pin a schema revision alongside the mobench release used to create the artifact. + +## Published schemas + +| File | Contract | +| --- | --- | +| `ci-contract-v1.schema.json` | The top-level `ci` metadata and status contract | +| `summary-v1.schema.json` | The top-level normalized `summary` result contract | +| `trace-events-v1.schema.json` | Profiling trace source, total duration, lanes, and events | + +The CI and summary schemas are focused wrappers around the stable output sections. A complete `summary.json` can include additional forward-compatible fields. + +## Validate in CI + +Use any JSON Schema 2020-12 validator and point it at the pinned upstream file. Treat validation as a contract check, not as a semantic comparison of devices or benchmarks. + +Example with a generic validator: + +```bash +check-jsonschema \ + --schemafile vendor/mobench/summary-v1.schema.json \ + target/mobench/ci/summary.json +``` + +Vendor the schema or pin its commit URL so a remote branch update cannot change a historical validation job. + +## Trace-event semantics + +The trace-event schema requires: + +- `source` +- `total_duration_ns` +- `lanes` + +Trace events describe profiling lanes and phases. They are not interchangeable with sampled benchmark durations in the normal summary contract. + +## Missing values + +Optional CPU and memory fields may be absent. Preserve absence through parsing and serialization; do not substitute numeric zero. + +## Next step + +Pin the schema files at release commit `d1a3176f9144f35e777e83fd07045116144da257` next to the workflow that consumes `summary.json`. diff --git a/apps/docs/src/content/docs/run-benchmarks/browserstack.mdx b/apps/docs/src/content/docs/run-benchmarks/browserstack.mdx new file mode 100644 index 0000000..1ab74c4 --- /dev/null +++ b/apps/docs/src/content/docs/run-benchmarks/browserstack.mdx @@ -0,0 +1,108 @@ +--- +title: BrowserStack device runs +slug: browserstack +aliases: [/app-automate] +description: Build, upload, run, and fetch Rust benchmarks with BrowserStack App Automate. +sidebar: + order: 2 +audience: [benchmark-author, ci-engineer] +release: 0.1.43 +lastVerified: 2026-07-15 +section: Run benchmarks +order: 2 +sourceRefs: + - label: BrowserStack CI guide + url: https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/docs/guides/browserstack-ci.md + evidence: Credentials, device resolution, execution, fetching, and iOS compatibility. +--- + +When a `run` or `ci run` command selects devices, mobench builds mobile artifacts, uploads them to BrowserStack App Automate, schedules the sessions, and collects available results. This is the normal path for real Android and iOS measurements in 0.1.43. + +## Configure credentials + +Environment variables are the simplest option: + +```bash +export BROWSERSTACK_USERNAME="your_username" +export BROWSERSTACK_ACCESS_KEY="your_access_key" +export BROWSERSTACK_PROJECT="mobile-benchmarks" +``` + +You can also reference them from `bench-config.toml`: + +```toml test=config:bench-config.toml +[browserstack] +app_automate_username = "${BROWSERSTACK_USERNAME}" +app_automate_access_key = "${BROWSERSTACK_ACCESS_KEY}" +project = "mobile-benchmarks" +``` + +Validate the credentials before starting a build: + +```bash +mobench doctor --target both --browserstack true +``` + +## Choose a device + +List the current BrowserStack inventory and validate an exact identifier: + +```bash +mobench devices --platform android +mobench devices --platform ios +mobench devices --validate "Google Pixel 7-13.0" +``` + +For repeatable suites, use a [device matrix](/device-matrices/) rather than copying labels across workflows. + +## Run Android + +```bash +mobench run \ + --target android \ + --function bench_mobile::checksum \ + --devices "Google Pixel 7-13.0" \ + --iterations 30 \ + --warmup 5 \ + --release \ + --fetch \ + --output target/mobench/android-results.json +``` + +Use `--release` for optimized code and smaller APK uploads. + +## Run iOS + +```bash +mobench run \ + --target ios \ + --function bench_mobile::checksum \ + --devices "iPhone 14-16" \ + --iterations 20 \ + --warmup 3 \ + --release \ + --fetch \ + --output target/mobench/ios-results.json +``` + +mobench generates and packages the app and XCUITest suite unless `--ios-app` and `--ios-test-suite` point to existing artifacts. + +For older devices, the app deployment target must not exceed the device OS. Use the `uikit-legacy` runner and an appropriately old Xcode lane when SwiftUI is unavailable. + +## Fetch artifacts later + +```bash +mobench fetch \ + --target android \ + --build-id \ + --output-dir target/browserstack \ + --wait \ + --poll-interval-secs 10 \ + --timeout-secs 1800 +``` + +Fetched data can include session JSON, device logs, instrumentation logs, and available video links. BrowserStack does not expose native stack or flamegraph artifacts through this flow. + +## Next step + +Move a stable command into [CI](/ci/) and save its standard output contract. diff --git a/apps/docs/src/content/docs/run-benchmarks/ci.mdx b/apps/docs/src/content/docs/run-benchmarks/ci.mdx new file mode 100644 index 0000000..ff1bf82 --- /dev/null +++ b/apps/docs/src/content/docs/run-benchmarks/ci.mdx @@ -0,0 +1,119 @@ +--- +title: CI runs +slug: ci +description: Run repeatable mobile benchmarks and produce stable CI artifacts. +sidebar: + order: 3 +audience: [ci-engineer, benchmark-author] +release: 0.1.43 +lastVerified: 2026-07-15 +section: Run benchmarks +order: 3 +sourceRefs: + - label: BrowserStack CI guide + url: https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/docs/guides/browserstack-ci.md + evidence: CI run, split-sample merge, PR reporting, and regression commands. +--- + +`mobench ci run` wraps execution in a stable file contract for artifact upload, job summaries, comparisons, plots, and downstream reporting. + +## Run one benchmark + +```bash +mobench ci run \ + --target android \ + --function bench_mobile::checksum \ + --devices "Google Pixel 7-13.0" \ + --iterations 20 \ + --warmup 5 \ + --release \ + --fetch \ + --plots auto \ + --output-dir target/mobench/ci +``` + +The output directory contains `summary.json`, `summary.md`, `results.csv`, and optional `plots/*.svg`. + +Use `--functions` for several benchmarks in one invocation: + +```bash +mobench ci run \ + --target android \ + --functions '["bench_mobile::checksum","bench_mobile::verify"]' \ + --devices "Google Pixel 7-13.0" \ + --release \ + --output-dir target/mobench/ci +``` + +## Minimal GitHub Actions shape + +```yaml +name: Mobile benchmarks + +on: + workflow_dispatch: + +permissions: + contents: read + +jobs: + android: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + with: + targets: aarch64-linux-android + - name: Run mobench + env: + BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }} + BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} + run: | + mobench ci run \ + --target android \ + --function bench_mobile::checksum \ + --device-matrix device-matrix.yaml \ + --device-tags default \ + --release \ + --output-dir target/mobench/ci + - uses: actions/upload-artifact@v4 + with: + name: mobench-android + path: target/mobench/ci +``` + +Install the pinned mobench release in an earlier step or use your repository's pinned local action wrapper. + +## Merge split samples + +Fragile or long BrowserStack lanes can run each measured sample separately. Place the one-sample `summary.json` files below `sample-*` directories, then merge them: + +```bash +mobench ci merge-split-runs \ + --samples-dir target/mobench/split \ + --output-dir target/mobench/ci \ + --function bench_mobile::checksum \ + --device "Google Pixel 7-13.0" \ + --iterations 5 \ + --warmup 1 +``` + +The merge validates function, device, and sample counts, then writes the same three standard files as a normal CI run. + +## Add a regression gate + +```bash +mobench ci run \ + --target android \ + --function bench_mobile::checksum \ + --devices "Google Pixel 7-13.0" \ + --baseline artifact:baselines/android-summary.json \ + --regression-threshold-pct 5 \ + --junit target/mobench/ci/junit.xml \ + --release \ + --output-dir target/mobench/ci +``` + +## Next step + +Read [outputs](/outputs/) before wiring fields into dashboards or PR comments. diff --git a/apps/docs/src/content/docs/run-benchmarks/preflight.mdx b/apps/docs/src/content/docs/run-benchmarks/preflight.mdx new file mode 100644 index 0000000..aae1b33 --- /dev/null +++ b/apps/docs/src/content/docs/run-benchmarks/preflight.mdx @@ -0,0 +1,92 @@ +--- +title: Host-side preflight +slug: host-preflight +aliases: [/local-devices] +description: Validate configuration, discovery, builds, and reports before using mobile devices. +sidebar: + order: 1 +audience: [benchmark-author, ci-engineer] +release: 0.1.43 +lastVerified: 2026-07-15 +section: Run benchmarks +order: 1 +sourceRefs: + - label: Testing guide + url: https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/docs/guides/testing.md + evidence: Prerequisite, discovery, verification, and host-side preflight commands. +--- + +Preflight catches inexpensive failures before a mobile build or BrowserStack session. It validates your local tools and config, proves that the benchmark is discoverable, and checks the requested report shape. + +## Check prerequisites + +Use `doctor` for the combined project, config, and credential view: + +```bash +mobench doctor \ + --target both \ + --config bench-config.toml \ + --device-matrix device-matrix.yaml \ + --browserstack true +``` + +Use `check` for a focused platform toolchain check: + +```bash +mobench check --target android +mobench check --target ios +mobench check --target android --format json +``` + +Validate a run configuration independently: + +```bash +mobench config validate --config bench-config.toml +``` + +## Prove discovery + +```bash +mobench list --crate-path bench-mobile +``` + +If the function is missing, fix the registry or crate selection before building a mobile runner. + +## Verify generated artifacts + +After a build, verify registry and platform files: + +```bash +mobench verify \ + --target android \ + --crate-path bench-mobile \ + --check-artifacts \ + --output-dir target/mobench +``` + +`verify --smoke-test` only works when the benchmark crate is linked into the `mobench` CLI binary. External crates selected through `mobench.toml`, `--project-root`, or `--crate-path` should use `list`, `verify --check-artifacts`, and a normal host preflight. + +## Write host-side preflight output + +```bash +mobench run \ + --target android \ + --crate-path bench-mobile \ + --function bench_mobile::checksum \ + --local-only \ + --iterations 5 \ + --warmup 1 \ + --output target/mobench/preflight.json +``` + +This command skips mobile builds and writes preflight/spec output without executing the requested benchmark. It is useful for discovery and report-shape debugging, but it is not an Android, iOS, or host performance measurement. + +Inspect the result shape: + +```bash +mobench summary target/mobench/preflight.json +``` + +## Next step + +Resolve a real device and continue with the [BrowserStack run guide](/browserstack/). diff --git a/apps/docs/src/content/docs/write-benchmarks/benchmark-functions.mdx b/apps/docs/src/content/docs/write-benchmarks/benchmark-functions.mdx new file mode 100644 index 0000000..67afec2 --- /dev/null +++ b/apps/docs/src/content/docs/write-benchmarks/benchmark-functions.mdx @@ -0,0 +1,91 @@ +--- +title: Benchmark functions +slug: benchmark-functions +aliases: [/authoring, /writing-benchmarks, /writing] +description: Register discoverable benchmark functions with the mobench SDK. +sidebar: + order: 1 +audience: [benchmark-author] +release: 0.1.43 +lastVerified: 2026-07-15 +section: Write benchmarks +order: 1 +sourceRefs: + - label: Current API specification + url: https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/docs/specs/mobench-current-spec.md + evidence: Benchmark macro rules, runtime API, and SDK feature flags. +--- + +`#[benchmark]` registers a Rust function at compile time through `inventory`. The SDK runner and CLI use that registry to discover the function by its fully qualified name. + +## Minimal function + +```rust +use mobench_sdk::benchmark; + +#[benchmark] +pub fn parse_fixture() { + let input = std::hint::black_box(include_bytes!("fixture.bin")); + let parsed = parse(input); + std::hint::black_box(parsed); +} +``` + +A simple benchmark: + +- takes no parameters +- returns `()` +- is public when generated mobile runners need to link it +- keeps the measured work and result observable to the optimizer + +Async functions, parameters on a simple benchmark, and non-unit return types are rejected at compile time. Use [setup and teardown](/setup-teardown/) when the measured function needs an input. + +## Discover registered functions + +```bash +mobench list --crate-path bench-mobile +``` + +Pass the exact discovered name to `--function`: + +```bash +mobench run \ + --target android \ + --crate-path bench-mobile \ + --function bench_mobile::parse_fixture \ + --local-only +``` + +The host-only command is a discovery and reporting preflight. Select a device for a mobile measurement. + +## Programmatic execution + +Applications that need the SDK directly can build a validated `BenchSpec` and use the registry runner: + +```rust +use mobench_sdk::{run_benchmark, BenchSpec}; + +let spec = BenchSpec::new("bench_mobile::parse_fixture", 100, 10)?; +let report = run_benchmark(spec)?; +println!("median: {} ns", report.median_ns()); +``` + +For CI integrations, prefer the CLI's stable files over private implementation modules. + +## Named semantic phases + +When a benchmark contains meaningful sub-operations, `profile_phase` can record phase metadata separately from sampled native stacks: + +```rust +use mobench_sdk::{benchmark, profile_phase}; + +#[benchmark] +pub fn prove_and_verify() { + let proof = profile_phase("prove", || prove()); + profile_phase("verify", || verify(&proof)); +} +``` + +## Next step + +Choose a fixture lifecycle in [setup and teardown](/setup-teardown/), then apply the quality checklist. diff --git a/apps/docs/src/content/docs/write-benchmarks/quality.mdx b/apps/docs/src/content/docs/write-benchmarks/quality.mdx new file mode 100644 index 0000000..5ddd527 --- /dev/null +++ b/apps/docs/src/content/docs/write-benchmarks/quality.mdx @@ -0,0 +1,70 @@ +--- +title: Benchmark quality +slug: benchmark-quality +description: Design mobile benchmarks that produce comparable, defensible results. +sidebar: + order: 3 +audience: [benchmark-author, ci-engineer] +release: 0.1.43 +lastVerified: 2026-07-15 +section: Write benchmarks +order: 3 +sourceRefs: + - label: BrowserStack metrics guide + url: https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/docs/guides/browserstack-metrics.md + evidence: Result interpretation, optional resource data, and comparison guidance. +--- + +A mobile number is useful only when the work, build, device, and run conditions are clear enough to reproduce. + +## Keep the optimizer honest + +- Pass variable inputs and final outputs through `std::hint::black_box` or `mobench_sdk::black_box`. +- Make the workload long enough to rise above timer resolution and harness overhead. +- Keep setup, cloning, and cleanup outside the measured closure unless they are the subject of the benchmark. +- Prefer deterministic fixture data over network or wall-clock dependencies. + +## Separate warmup from measurement + +Warmups execute the benchmark without adding samples. They can stabilize code paths and caches, but they do not guarantee a thermally stable device. + +Use the same warmup and iteration counts when comparing revisions. Record changes to either value as a new experiment. + +## Compare like with like + +Keep these dimensions stable: + +- device model and OS version +- release versus debug build +- benchmark function and fixture +- runner backend +- iteration and warmup counts +- relevant dependency and toolchain versions + +Prefer medians and percentiles when isolated scheduling noise affects the mean. Repeat the full run when a result is close to your regression threshold. + +## Treat resource values as optional + +CPU and memory measurements depend on runner and provider availability. A blank or absent value means **unavailable**. Do not coerce it to zero, carry it into arithmetic, or claim that it was measured. + +mobench 0.1.43 does not define a power-consumption metric. + +## Use the right execution mode + +`--local-only` validates the host harness and output pipeline. It does not measure Android or iOS execution. For mobile results, choose a BrowserStack device and use `--release`. + +Native profiling is a separate local workflow and should answer *where time is spent*, not replace repeated timing samples. + +## Pre-baseline checklist + +- The function appears in `mobench list`. +- A host preflight completes without warnings you do not understand. +- The release mobile build succeeds. +- The exact device identifier resolves. +- The output contains the expected number of measured samples. +- Missing resource values remain missing. +- The baseline file is stored with its environment metadata. + +## Next step + +Complete the [host-side preflight](/host-preflight/) before spending BrowserStack time. diff --git a/apps/docs/src/content/docs/write-benchmarks/setup-teardown.mdx b/apps/docs/src/content/docs/write-benchmarks/setup-teardown.mdx new file mode 100644 index 0000000..2647aa1 --- /dev/null +++ b/apps/docs/src/content/docs/write-benchmarks/setup-teardown.mdx @@ -0,0 +1,84 @@ +--- +title: Setup and teardown +slug: setup-teardown +aliases: [/setup-and-teardown] +description: Keep fixture creation, mutation, and cleanup outside measured samples. +sidebar: + order: 2 +audience: [benchmark-author] +release: 0.1.43 +lastVerified: 2026-07-15 +section: Write benchmarks +order: 2 +sourceRefs: + - label: Current API specification + url: https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/docs/specs/mobench-current-spec.md + evidence: Implemented setup, per-iteration setup, and teardown semantics. +--- + +Use the macro's fixture attributes when input creation or cleanup is not part of the operation you want to measure. + +## Reuse one fixture + +Setup runs once before warmup and measured iterations. The benchmark receives a shared reference. + +```rust +use mobench_sdk::benchmark; + +fn create_input() -> Vec { + vec![42; 1024 * 1024] +} + +#[benchmark(setup = create_input)] +pub fn checksum(input: &Vec) { + let sum: u64 = input.iter().map(|byte| u64::from(*byte)).sum(); + std::hint::black_box(sum); +} +``` + +Choose this mode when repeated work does not mutate the fixture in a way that changes later samples. + +## Create a fresh fixture per iteration + +`per_iteration` runs setup before each warmup or measured iteration and passes the value by ownership. Setup remains outside the sample timer. + +```rust +use mobench_sdk::benchmark; + +fn unsorted_values() -> Vec { + (0..10_000).rev().collect() +} + +#[benchmark(setup = unsorted_values, per_iteration)] +pub fn sort_values(mut values: Vec) { + values.sort_unstable(); + std::hint::black_box(values); +} +``` + +Use this mode when the operation consumes or irreversibly mutates its input. + +## Clean up after the run + +Teardown receives the setup value after warmup and measurement. It runs outside measured timing, including when measured execution returns an error. + +```rust +fn open_store() -> Store { + Store::temporary() +} + +fn remove_store(store: Store) { + store.remove(); +} + +#[benchmark(setup = open_store, teardown = remove_store)] +pub fn query_store(store: &Store) { + std::hint::black_box(store.query("key")); +} +``` + +Teardown is not combined with `per_iteration`; make a consumed fixture clean itself up through ownership when each iteration needs independent cleanup. + +## Next step + +Run the benchmark with multiple warmups and inspect it against the [quality checklist](/benchmark-quality/). diff --git a/apps/docs/src/pages/404.astro b/apps/docs/src/pages/404.astro new file mode 100644 index 0000000..6c8ac2b --- /dev/null +++ b/apps/docs/src/pages/404.astro @@ -0,0 +1,12 @@ +--- +import '../styles/mobench.css' +--- + + + + Page not found — mobench docs +
mmobench docs

404 / DOCS ROUTE MISSING

This page is outside the current manifest.

The guide may have moved. Start at the documentation index or use search from any documentation page.

+ + diff --git a/apps/docs/src/pages/[...slug].md.ts b/apps/docs/src/pages/[...slug].md.ts new file mode 100644 index 0000000..3963127 --- /dev/null +++ b/apps/docs/src/pages/[...slug].md.ts @@ -0,0 +1,32 @@ +const sources = import.meta.glob('../content/docs/**/*.{md,mdx}', { + eager: true, + query: '?raw', + import: 'default', +}) + +function sourceSlug(path: string, source: string) { + const frontmatter = source.match(/^---\r?\n([\s\S]*?)\r?\n---/) + const configuredSlug = frontmatter?.[1]?.match(/^slug:\s*["']?([^"'\r\n]+)["']?\s*$/m)?.[1]?.trim() + return configuredSlug || path.replace('../content/docs/', '').replace(/\.(md|mdx)$/, '') +} + +function markdownBody(source: string) { + return source.replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n/, '').trimStart() +} + +export function getStaticPaths() { + return Object.entries(sources).map(([path, source]) => ({ + params: { slug: sourceSlug(path, source) }, + props: { source: markdownBody(source) }, + })) +} + +export function GET({ props }: { props: { source: string } }) { + return new Response(props.source, { + headers: { + 'Content-Type': 'text/markdown; charset=utf-8', + 'Cache-Control': 'public, max-age=0, must-revalidate', + 'X-Content-Type-Options': 'nosniff', + }, + }) +} diff --git a/apps/docs/src/scripts/analytics.ts b/apps/docs/src/scripts/analytics.ts new file mode 100644 index 0000000..c74b329 --- /dev/null +++ b/apps/docs/src/scripts/analytics.ts @@ -0,0 +1,39 @@ +import { inject, track } from '@vercel/analytics' +import { analyticsEvents, type AnalyticsEvent } from '@mobench/site-config' + +const analyticsEnabled = window.location.hostname === 'docs.mobench.org' +const allowedEvents = new Set(analyticsEvents) + +function emit(name: AnalyticsEvent) { + if (!analyticsEnabled || !allowedEvents.has(name)) return + track(name) +} + +if (analyticsEnabled) inject() + +document.addEventListener('click', (event) => { + const result = event.target instanceof Element + ? event.target.closest('.pagefind-ui__result-link') + : null + if (result) emit('search_result_opened') +}) + +const searchRoot = document.querySelector('#starlight__search') +let zeroResultTracked = false + +searchRoot?.addEventListener('input', () => { + zeroResultTracked = false +}) + +if (searchRoot) { + const observer = new MutationObserver(() => { + const input = searchRoot.querySelector('input') + const message = searchRoot.querySelector('.pagefind-ui__message') + const hasNoResults = message?.textContent?.trim().startsWith('No results') ?? false + if (!zeroResultTracked && input?.value.trim() && hasNoResults) { + emit('search_zero_results') + zeroResultTracked = true + } + }) + observer.observe(searchRoot, { childList: true, subtree: true, characterData: true }) +} diff --git a/apps/docs/src/scripts/search-accessibility.ts b/apps/docs/src/scripts/search-accessibility.ts new file mode 100644 index 0000000..73fcc6e --- /dev/null +++ b/apps/docs/src/scripts/search-accessibility.ts @@ -0,0 +1,38 @@ +const siteSearch = document.querySelector('site-search') +const searchRoot = document.querySelector('#starlight__search') +const searchTrigger = siteSearch?.querySelector('[data-open-modal]') + +if (searchTrigger) { + const visibleLabel = searchTrigger.textContent?.replace(/\s+/g, ' ').trim() + if (visibleLabel) searchTrigger.setAttribute('aria-label', visibleLabel) +} + +siteSearch?.addEventListener('keydown', (event) => { + if (!(event instanceof KeyboardEvent) || !['ArrowDown', 'ArrowUp'].includes(event.key)) return + const input = searchRoot?.querySelector('.pagefind-ui__search-input') + const links = [...(searchRoot?.querySelectorAll('.pagefind-ui__result-link') ?? [])] + if (!input || !links.length) return + + const activeIndex = links.indexOf(document.activeElement as HTMLElement) + if (event.key === 'ArrowDown') { + links[Math.min(activeIndex + 1, links.length - 1)]?.focus() + } else if (activeIndex <= 0) { + input.focus() + } else { + links[activeIndex - 1]?.focus() + } + event.preventDefault() +}) + +if (searchRoot) { + const announceResults = () => { + const message = searchRoot.querySelector('.pagefind-ui__message') + message?.setAttribute('role', 'status') + message?.setAttribute('aria-live', 'polite') + } + new MutationObserver(announceResults).observe(searchRoot, { + childList: true, + subtree: true, + characterData: true, + }) +} diff --git a/apps/docs/src/styles/mobench.css b/apps/docs/src/styles/mobench.css new file mode 100644 index 0000000..7b0f2af --- /dev/null +++ b/apps/docs/src/styles/mobench.css @@ -0,0 +1,112 @@ +@font-face { + font-family: 'Geist Variable'; + font-style: normal; + font-display: swap; + font-weight: 100 900; + src: url('/fonts/geist-latin-wght-normal.woff2') format('woff2-variations'); +} + +@font-face { + font-family: 'Geist Mono Variable'; + font-style: normal; + font-display: swap; + font-weight: 100 900; + src: url('/fonts/geist-mono-latin-wght-normal.woff2') format('woff2-variations'); +} + +:root { + --sl-font: 'Geist Variable', 'Geist', sans-serif; + --sl-font-mono: 'Geist Mono Variable', 'Geist Mono', monospace; + --sl-color-accent-low: #24391e; + --sl-color-accent: #9bd17e; + --sl-color-accent-high: #d9f2c9; + --sl-color-white: #f5efdd; + --sl-color-gray-1: #e1dac7; + --sl-color-gray-2: #c7bfae; + --sl-color-gray-3: #a79e8b; + --sl-color-gray-4: #706b5e; + --sl-color-gray-5: #393d34; + --sl-color-gray-6: #1b2118; + --sl-color-black: #11160f; + --sl-color-bg: #11160f; + --sl-color-bg-nav: rgba(17, 22, 15, .92); + --sl-color-bg-sidebar: #151a13; + --sl-color-bg-inline-code: #20291c; + --sl-color-hairline-light: rgba(245, 239, 221, .17); + --sl-color-hairline: rgba(245, 239, 221, .13); + --sl-content-width: 48rem; + --sl-sidebar-width: 18rem; + --sl-nav-height: 4.6rem; +} + +:root[data-theme='light'] { + --sl-color-accent-low: #e0ecd4; + --sl-color-accent: #356c28; + --sl-color-accent-high: #254d1c; + --sl-color-white: #271f16; + --sl-color-gray-1: #443c31; + --sl-color-gray-2: #5f574a; + --sl-color-gray-3: #6c6252; + --sl-color-gray-4: #b4aa95; + --sl-color-gray-5: #d4cbb6; + --sl-color-gray-6: #ebe4d1; + --sl-color-gray-7: #f4efdd; + --sl-color-black: #fffdf5; + --sl-color-bg: #f4efdd; + --sl-color-bg-nav: rgba(244, 239, 221, .92); + --sl-color-bg-sidebar: #eee7d5; + --sl-color-bg-inline-code: #e2ecd7; + --sl-color-hairline-light: rgba(39, 31, 22, .17); + --sl-color-hairline: rgba(39, 31, 22, .13); +} + +html { scroll-behavior: smooth; } +body { letter-spacing: -.006em; -webkit-font-smoothing: antialiased; } +body::before { position: fixed; z-index: -1; inset: 0; pointer-events: none; background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 180 180' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='.45'/%3E%3C/svg%3E"); opacity: .022; content: ''; } + +header.header { border-bottom: 1px solid var(--sl-color-hairline); backdrop-filter: blur(18px); } +.site-title { letter-spacing: -.04em; } +.site-title img { max-height: 2.35rem; } + +/* Keep task search obvious at every viewport instead of collapsing it away. */ +site-search { min-width: min(24rem, 38vw); } +site-search > button { min-width: 2.75rem; min-height: 2.75rem; border-radius: .55rem !important; background: color-mix(in srgb, var(--sl-color-black) 76%, transparent) !important; } +starlight-menu-button button { min-width: 2.75rem; min-height: 2.75rem; } +@media (max-width: 50rem) { + site-search { display: block !important; min-width: 2.75rem; } + site-search > button { min-width: 2.75rem; } + site-search > button > span:not(.sl-hidden) { display: none; } +} + +.sidebar-pane { border-inline-end-color: var(--sl-color-hairline) !important; } +nav.sidebar a { border-radius: .4rem; } +nav.sidebar a[aria-current='page'] { background: var(--sl-color-accent-low); color: var(--sl-color-accent-high); font-weight: 620; } +.sidebar-content summary { color: var(--sl-color-white); font-family: var(--sl-font-mono); font-size: .68rem; letter-spacing: .08em; text-transform: uppercase; } + +.main-pane { background-image: linear-gradient(90deg, transparent 0, transparent calc(100% - 1px), var(--sl-color-hairline) calc(100% - 1px)); } +.content-panel { padding-block: clamp(2rem, 6vw, 4rem); } +.sl-markdown-content h2 { margin-top: 3.25rem; padding-top: 1rem; border-top: 1px solid var(--sl-color-hairline); letter-spacing: -.045em; } +.sl-markdown-content h3 { letter-spacing: -.03em; } +.sl-markdown-content p, .sl-markdown-content li { line-height: 1.72; } +.sl-markdown-content a:not([class]) { text-decoration-color: color-mix(in srgb, var(--sl-color-accent) 38%, transparent); text-underline-offset: .2em; } +.sl-markdown-content table { display: block; width: 100%; max-width: 100%; overflow-x: auto; font-size: .86rem; } +.sl-markdown-content th { background: var(--sl-color-bg-sidebar); } +.sl-markdown-content :not(pre) > code { border: 1px solid var(--sl-color-hairline); border-radius: .25rem; color: var(--sl-color-accent-high); } +.expressive-code { margin-block: 1.6rem; } +.expressive-code figure { box-shadow: none !important; } + +.pagination-links a { border-color: var(--sl-color-hairline); border-radius: .65rem; background: color-mix(in srgb, var(--sl-color-black) 58%, transparent); } +.pagination-links a:hover { border-color: var(--sl-color-accent); } + +mobile-starlight-toc nav { backdrop-filter: blur(18px); } +mobile-starlight-toc summary { min-height: 2.9rem; } + +@media (max-width: 50rem) { + :root { --sl-nav-height: 4.2rem; } + .content-panel { padding-inline: 1rem; } +} + +@media (prefers-reduced-motion: reduce) { + html { scroll-behavior: auto; } + *, *::before, *::after { animation-duration: .01ms !important; animation-iteration-count: 1 !important; scroll-behavior: auto !important; transition-duration: .01ms !important; } +} diff --git a/apps/docs/tsconfig.json b/apps/docs/tsconfig.json new file mode 100644 index 0000000..8bf91d3 --- /dev/null +++ b/apps/docs/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "astro/tsconfigs/strict", + "include": [".astro/types.d.ts", "**/*"], + "exclude": ["dist"] +} diff --git a/apps/docs/vercel.json b/apps/docs/vercel.json new file mode 100644 index 0000000..5cbf517 --- /dev/null +++ b/apps/docs/vercel.json @@ -0,0 +1,253 @@ +{ + "$schema": "https://openapi.vercel.sh/vercel.json", + "framework": "astro", + "installCommand": "cd ../.. && bun install --frozen-lockfile", + "buildCommand": "cd ../.. && bun run generate && bun run build:docs", + "outputDirectory": "dist", + "redirects": [ + { + "source": "/analyze-results/outputs", + "destination": "/outputs/", + "permanent": true + }, + { + "source": "/analyze-results/profiling", + "destination": "/profiling/", + "permanent": true + }, + { + "source": "/analyze-results/regressions", + "destination": "/regressions/", + "permanent": true + }, + { + "source": "/app-automate", + "destination": "/browserstack/", + "permanent": true + }, + { + "source": "/authoring", + "destination": "/benchmark-functions/", + "permanent": true + }, + { + "source": "/build-artifacts", + "destination": "/compatibility/", + "permanent": true + }, + { + "source": "/build", + "destination": "/compatibility/", + "permanent": true + }, + { + "source": "/cli-man-pages", + "destination": "/cli/", + "permanent": true + }, + { + "source": "/cli-reference", + "destination": "/cli/", + "permanent": true + }, + { + "source": "/codebase", + "destination": "/troubleshooting/", + "permanent": true + }, + { + "source": "/concepts", + "destination": "/configuration/", + "permanent": true + }, + { + "source": "/current-spec", + "destination": "/schemas/", + "permanent": true + }, + { + "source": "/diagrams", + "destination": "/device-matrices/", + "permanent": true + }, + { + "source": "/docs", + "destination": "/", + "permanent": true + }, + { + "source": "/examples", + "destination": "/basic-example/", + "permanent": true + }, + { + "source": "/examples/basic", + "destination": "/basic-example/", + "permanent": true + }, + { + "source": "/examples/ffi", + "destination": "/ffi-example/", + "permanent": true + }, + { + "source": "/get-started/installation", + "destination": "/installation/", + "permanent": true + }, + { + "source": "/get-started/quickstart", + "destination": "/quickstart/", + "permanent": true + }, + { + "source": "/help/troubleshooting", + "destination": "/troubleshooting/", + "permanent": true + }, + { + "source": "/home", + "destination": "/", + "permanent": true + }, + { + "source": "/install", + "destination": "/installation/", + "permanent": true + }, + { + "source": "/local-devices", + "destination": "/host-preflight/", + "permanent": true + }, + { + "source": "/outputs-and-reports", + "destination": "/outputs/", + "permanent": true + }, + { + "source": "/overview", + "destination": "/", + "permanent": true + }, + { + "source": "/public-api", + "destination": "/compatibility/", + "permanent": true + }, + { + "source": "/reference", + "destination": "/schemas/", + "permanent": true + }, + { + "source": "/reference/cli", + "destination": "/cli/", + "permanent": true + }, + { + "source": "/reference/compatibility", + "destination": "/compatibility/", + "permanent": true + }, + { + "source": "/reference/configuration", + "destination": "/configuration/", + "permanent": true + }, + { + "source": "/reference/device-matrices", + "destination": "/device-matrices/", + "permanent": true + }, + { + "source": "/reference/schemas", + "destination": "/schemas/", + "permanent": true + }, + { + "source": "/reports", + "destination": "/outputs/", + "permanent": true + }, + { + "source": "/run-benchmarks/browserstack", + "destination": "/browserstack/", + "permanent": true + }, + { + "source": "/run-benchmarks/ci", + "destination": "/ci/", + "permanent": true + }, + { + "source": "/run-benchmarks/preflight", + "destination": "/host-preflight/", + "permanent": true + }, + { + "source": "/sdk-integration", + "destination": "/compatibility/", + "permanent": true + }, + { + "source": "/sdk", + "destination": "/compatibility/", + "permanent": true + }, + { + "source": "/setup-and-teardown", + "destination": "/setup-teardown/", + "permanent": true + }, + { + "source": "/testing", + "destination": "/troubleshooting/", + "permanent": true + }, + { + "source": "/write-benchmarks/benchmark-functions", + "destination": "/benchmark-functions/", + "permanent": true + }, + { + "source": "/write-benchmarks/quality", + "destination": "/benchmark-quality/", + "permanent": true + }, + { + "source": "/write-benchmarks/setup-teardown", + "destination": "/setup-teardown/", + "permanent": true + }, + { + "source": "/writing-benchmarks", + "destination": "/benchmark-functions/", + "permanent": true + }, + { + "source": "/writing", + "destination": "/benchmark-functions/", + "permanent": true + } + ], + "headers": [ + { + "source": "/(.*)", + "headers": [ + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "Referrer-Policy", + "value": "strict-origin-when-cross-origin" + }, + { + "key": "Permissions-Policy", + "value": "camera=(), microphone=(), geolocation=()" + } + ] + } + ] +} diff --git a/apps/marketing/astro.config.mjs b/apps/marketing/astro.config.mjs new file mode 100644 index 0000000..fa1374e --- /dev/null +++ b/apps/marketing/astro.config.mjs @@ -0,0 +1,10 @@ +import { defineConfig } from 'astro/config' +import sitemap from '@astrojs/sitemap' + +export default defineConfig({ + site: 'https://mobench.org', + output: 'static', + integrations: [sitemap()], + build: { format: 'directory' }, + compressHTML: true, +}) diff --git a/apps/marketing/package.json b/apps/marketing/package.json new file mode 100644 index 0000000..dff5fb8 --- /dev/null +++ b/apps/marketing/package.json @@ -0,0 +1,24 @@ +{ + "name": "@mobench/marketing", + "version": "1.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "astro dev --port 3000", + "build": "astro build", + "check": "astro check", + "preview": "astro preview --port 3000" + }, + "dependencies": { + "@astrojs/sitemap": "^3.7.3", + "@mobench/site-config": "workspace:*", + "@mobench/truth": "workspace:*", + "@vercel/analytics": "2.0.1", + "astro": "7.0.6", + "sharp": "0.35.3" + }, + "devDependencies": { + "@astrojs/check": "^0.9.6", + "typescript": "^6.0.3" + } +} diff --git a/apps/marketing/public/favicon.svg b/apps/marketing/public/favicon.svg new file mode 100644 index 0000000..9248cc3 --- /dev/null +++ b/apps/marketing/public/favicon.svg @@ -0,0 +1 @@ + diff --git a/apps/marketing/public/fonts/geist-latin-wght-normal.woff2 b/apps/marketing/public/fonts/geist-latin-wght-normal.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..991445d78ae619a7378ff219385588c7811c88ab GIT binary patch literal 29400 zcmV)2K+L~)Pew8T0RR910CLy>6aWAK0RadA0CHjg0RR9100000000000000000000 z0000Qh6NjepB@~COg~6gK~jfXKTTFaQalD=KT}jeRDn1Eg%B@(5eN$QXx<|WghBu? zfv9K!HUcCAi2wv31&A64i%ARz8zS))Y*%BTp1|g%HJ8sbD%h@O+zv$4`n_s4!iJ3l zAl@7k{eMzY8AB7;lNO*l-R=*yWFwRsIf8~9GL0FjwPHg^@2WWFJlFf012?ihsP#qZ z`;kyPGs$e>Hzyupcl@oUYGa#9SVz!vuHm}znb*V>SP;aAF)%QlYFJI3FdKLK;o9Vm zL%sj3B9mWq;uIuOmskyHi7k;>(vv|E#`_|7Mc32Pk68q`P5g+29AAWr)~F(~disD- z5k1a6Is!+ekc4EGfX3YEm(Rih&k@b}KYJIwgd~IzLI~mT03n#AG?)b~MN(7(MZA

6yP-h*_UmWm>FB3IQU-1<}Iu{JlGWR<|)Z;EicO6DLr(A24;o z|0kXHy+I8KZ5c3%1D~?{4;Z`axhXP|kBj!oYnsoT1z>N$abyxS0Js^?qnz4|p)g~W zFi>Jxa3m)(Pys-F-N{7^VhI2eotQ_fAzGgel1Xjype6J*v<*o;?cWPxwlc#qI>O`v zgQ$Q!;@VF6eLAaOUEQLV*fQ;S$S||JK1BOn5M3B{Nty$K2q;6~__F)ooPK{LOOE3} zfj~?3(+L@Y9 z3zQ-Wp?~D|Ac92lwycGr-1ZCLpMY3vCY{t7N+DL31CN1_-%Joanp-FhGO^FhP`~~B zuVpFicmI0BD2~#ul&7SYc9cT#6_S_^5Je;?b~C-Bxxam*ko!`eljN8$ug;l;NXN0=^j2RkmXrBN76Bkk-Mly*c9;2}Myf({r{APW?3Lq8@0KYy(h4zJD*em<^1lqnS~i>l zFI28wx{HflfY@CS(gGy!7OS)XdFO@V2SuMiQt}btMN*!TLrio^A0U16Nu8`^I3J{Q z2%%^~$eoMQO`ogUMWu03d9Elsmyw>woA|)2cboLBzyi!-r{Et;u~)_AQ}=L53m{f=Ce83*GPL_fsnx zGP*{x4+$y~WeEhSB_{RV*S!O?Vk)fzExU7}3*h6`-wWXi080U%0M25g2$^?|=TyZ$J4i&9|nVX;K^$AC&Hto|M1y%e%imq%G?y z{Tlsx{SN&;W6oGKmW^vnH%^*qbKZ*Eh#j}*>;>m0=T_%-=Wgd7=Lr|t5BFF1lzscb z>VAB`xL>N+$2%3d60D>ueU<(ycGx={9Bx&Gs<*0EwHh{gbS+SmYf3GBU^{x;LAd^9 zYubuioTD^I!?d5S*QGv`VW3|NvDW22GK+lDzQ5UCpftNVL1r}K0$RfOgJdA}TBbY|W zQ_vXc(k0C(Wfs$X>`(mEpZS?j#mz)3m<3rNgpaQfd&x#pPnt

4xJl4d-DN79mrX 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 literal 0 HcmV?d00001 diff --git a/apps/marketing/public/hero/mobench-bench-320.png b/apps/marketing/public/hero/mobench-bench-320.png new file mode 100644 index 0000000000000000000000000000000000000000..8273c214dc7e7f2bbe7017f48312bfa4b2db85ae GIT binary patch literal 209652 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

@)g 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

ec|$gnLCnH+bi6_)&&+YP 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 ne+F5N2} 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 literal 0 HcmV?d00001 diff --git a/apps/marketing/public/hero/mobench-bench-480.avif b/apps/marketing/public/hero/mobench-bench-480.avif new file mode 100644 index 0000000000000000000000000000000000000000..9bcc60624e45ad3bcb41b89371315494a5724230 GIT binary patch literal 35750 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 literal 0 HcmV?d00001 diff --git a/apps/marketing/public/hero/mobench-bench-768.avif b/apps/marketing/public/hero/mobench-bench-768.avif new file mode 100644 index 0000000000000000000000000000000000000000..d5492043579da1a67ffa9f9ee7c355abf671507b GIT binary patch literal 67777 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

@If3^gOr262u}WBG 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 Gn?D$?hjqyS literal 0 HcmV?d00001 diff --git a/apps/marketing/public/hero/mobench-bench-768.webp b/apps/marketing/public/hero/mobench-bench-768.webp new file mode 100644 index 0000000000000000000000000000000000000000..4d6bc57d415a61bb2737c2f67c91e76472723c36 GIT binary patch literal 90136 zcmV(vKU@?V!9 zA%C2ITmN(ZC-P_37yhsGzw>-Mt;hba^Zvo!=Y7Bar}&@sKe>MupJ)HG{eP?zBksP54f(1zF|nKHgH&n69JFZcH{xaxv{;H=+gZ4}2Fr8* z@fmFQ{p_r*_j3yMjvz4{CCrSpBfqrxOhI zTmppuiG({{=5lYJXHpsxP(iVgpt+`MQyMDLi&}4PX=H>!-poYBQWxrbiVXr{q&eQE z6J6DAWpZwbBePr`Z_9WEF0E;M=$Z7M^?7H3j0*O#Jy+zJKjUK&hBGH3I)qhNhf3Fg zCArlUY%Oy|+$X>6g?QlYkoD`ul_@Qhb)zLO@7gQd8DI5rkNP%s&jN^XK9QAv8d7yvR+>|j8f zxfU)P80mrp+G+78vL9Uf>(p&(Md5j>Q%rFLD5RoagPS?NZ~lWP+3k}Qi`U6*)3IBR zRzPXi@iH-4ugqV#`71!|R?@KKZO=_YYcv_q0g%vidc?EqSR{<|XWZK$>F+Zi&Pt^E z$SDb*u8_9G#Cr>;^(zAUpYWo6`%7FPJCoqKza*$1*1KcS(2(G~=>lBXv88aLqh z1ZP3{*6IG6d%i{VAODC-P8on)Q%yTiV%w2 zLF8FCzVG-roBEk8t0${cWV5CHcq{`542G_ksahsGY-_q~<7LMIK5!ox;f9jq~)z90)X%pI|g zcaM#hVMm!zn~}7)f3qV(Y-Mlyj*4(s8EVXdLt@5NTu|zB!*Ud zj0EL=FpKo|$N<5#U=}Vsg%&MS9I;s33GGR@1UT$%ceIzc$GiS8i3GDTv21h3uekdl zxjyPCBqmp3;_(;H@*M!M2|i)wnq1O6u z?jd|Ao1!X@dD=a2)#;(LLDm><&p4d|4amKYqjQQT1Gq9YLCR10*ONvOBgIijiCTiE z1icWCZELVb8$1v&vLS3q4UQm)Ie8^I*DJmne~QS-iO7M09!{m#1%W zbR4WQ``&5Yg_ikb&EF-@dAHtFjslja494nmtg$F}<#^g?=r4~rNpzgw*k+h&A#*2&E0bzK7-Wn9!HxTAH zOk~IrBkY`S`BDHVx<;NTXz0}vTZ7(>;cW>4!0~WG3F%qHP5w4-FG0Bs6kh|@E-XZ# zuyRR;(p<1V3YwGmdzD)xZwf5~4xSnF*@;DleaQMpTX}c7zh&{KYk?ry&KN}%gv!eI zzZ{aWPA@9%->Null92|enGMzA1c*swhf zX8_AnE(9yGW5P$7e@1c75g`7yn2Ec!&f3Oq)4I!qCaja>5$f5y+< z&x672DEGYXemV}5U}i5=x1kDTNN3}Qpa69Hffgbfwj(GEI#$Gt9qN29IHAEq^+n-t zgyHWK6{@xqmx~Bqu#MG#6udm8OELO?>w{E36a@h$?aX%G)L(bOK0N8XmljEKe2ZmN zZTVmZh3;~vz?PI-6uz=DdPpCh%_^A4-0ntXR7DBacD|&_Psw-lZNnQf%kC8*H|fO>CKA(-u^24 z4(^vx5itknZqX9L-JUZV3-~B2y@eX2KXY9@n#64p*W8_&H5&S4^;<)E<&q->*vo{J z4CgVbPEnQoxf{@&PkD|@-rES3*j*;t9s`7mL5A4r2Jw3GeS%5b{p%4uRYSG@%XSOo zZ@_u z@T3IbVDbN>8(LV{)qSKNk%vzfLJCd90{6*_h- zK~v8zR6pfld3&-7Ad`{O;gzI_F$C`?&*$yZf|rApk;JhS5lBp3pKCa&AJ|4b4*#}A zP@YwmZM40>lggA^6{`1qt`8mp?Z-6Jz~C;UM>16<>4xs%D-S-IpBT8y9f-GYCOYFE z;`J-27|4($u%CL0K|`ae9w}AGTpO_CQz~dS1R{lH#sG-`>CCYSzm=xoI;06j78SPK z#%sqYnVi_ePgA_l${y&i!_fRh0n@6sfrg|}6%C}s)^^4C;gf4pNF46L=7zt;v^_8j zjK;@9KC;C0hp53tuU{U+E}TV+wS6X@eh8tScN~R_fJC3@3$NSle z*mm%hR=ys(T@&H`N_|J;+UU{~dYb_d{bD!T-`5($x*}GLQ~TRHeqJYfwz7##rK>3a z0occL$vAkCSMsZRbP~@5vt)J;lR4)L+9bJh*X$_1!pgWjmw60Z_qZhM!>-9Oro`Fm0xV(>7$0_L`U+@Uz0`fg8OQG*Iiud z-AzJ4)%(V4Dos_7q&e2ETxBv}g|F1IpWHbV8B2pb&U;(-xpM1BAf;~DD59Ro=9(88 zO?)zbo6s0xiEXPoT(mVd@E=W~uU1)y|HpD6i`q2C*2X#olQ5X4u0v+DrLp`DGlCw5OngC)jqqgzLuB{ zm!Rz^7OF(+w%nX`&R(30Y9N}~tcOuVXq2m;mv`XDNwq}Xc(tWt`1q5G79g1vl0yQY zy<2*92pyI<AXc? z3~WOX_XD3cOGkiSJ;50!48(j8#-}QT>v5zS6$ISy$TcQ)l9k_PbTRy9LK}}<`WqC2 zC`|)T?b;;MNI?x%UjF|&K&b-9{5~ELluTKsu*54*2Q&P+1*idsQQBZlB*T5RmrT_( zfVV4rzr2J}Dr?SqB_tAYlQzY766nla&Gqe|p4)Wxeq?h`ORLW<_lPf_b<^7P0{GdS z9W*nhQ3|Hc_xv1nPC{Wf8L5Gi5&}y*rREH?@J2Daw6`La{v@4H#h2D2hOVDA=uAtOs;%?e4p0;+mc(HL(%lYLyklH z>p+U(DXziD)9$SHSFAMVDEDqKEbYUb*y^a{@=+I@f5Q|@bIG-y@MSNb{kM1y--btd zf$7(RbLhc`I}3*|Q?%}E_uXK4uOU84#l`chxs3COXk~zMGJHD{L*4sia}Wx9O4%GLb*PQr5|swn z(RGLd$g$-0dF;H(@7KgiBbU|%D*iJV5sTmidIW+P3cM{&*7qKs2=`J@v|t2zvAfF4dKs<0nLZu7J>I$pdkz}C6E=OO zc`~U28LNC)?-o9OxfC%0vd=A*h7hbQ0HasZ2%pbZl6@Qxl-V{X9?eT~&gkoz^QNn( zbElm$={v>pNd4y5UX&=C3pa+u?2i5FV}eM#s8*7Otgb%Y)gu-?IT2|O43EPm-)#;& zc&ykZj^L?8Fk&SVSOMktIhftT)8(<1GY|X&g~FyYiVS^QAEb&)#@ zMjVHfVO?AvX~2YM*nGutU@&vUYSd*bTYg`RYK!@rwJb^{jKkRHcWR9C%R$YiDhtqW zzN}Jb6{;Tw_nK#qOuSoNLYBLL*YcOv)v>6&M7;-W!&ysgBdTh{)1&ff&C!%3_ZRw_ z50E4vSVH+3^_yYW#roCYVG zD2Er`hf>?msyptUt`j?Lv%df)+O2M3c5EtQM|grQN>GcI8mR*xBP$Zu--9AnT`@N0ILZd^{ZJxUnx$pYsbziLPFNm zB81P8=z?&YvXO%NH5K=r(^mTg@IUvf(XJM)#uK;DXigJb^+6Xj5#g^sRiHl7HWj2TQDfR=I1*>h5wu1W6LL;UETlQSkNBK< zVksh=dN-yz8Y?8Fl@vN~YLPMpb=btC_a%JF+$S9|MOzGuiddd25X-A^BAAnFs%qn{E`*$EP9s7|KwRT^2()|Bf#^ms zY>if(MVYzH0vyU|KfULvmb*$FqcWjuO6p?{E?)-e-C`ML+MnY}eRL3!3G-<-VR)D8 z>Kf6G`-$4Gr7<>-Yz~`>=FBZRJYQ(JVpIT4=MY1BlLitOT|uux>9eaP^a#IHz~dmj z?Y;`OOhUPz_M!`{HR(#JXvp*QHspMyTr~DRT(JxEjr9bw68x0$fd7vq)$j%0Omhb@ zED5{q=MJu;>XC-k^uD8LLcxfYJafnzG}ykGy};6{^uL;JOu8_8f!^yUHJZXhY}S!MrUEOjV=rKQHt`13ns$A` zT*O_q(DIGa;Qywk*ghC~y>)qzT(Nb_S~y3n81V5CitGU$KrLde*`Y{(*Y82)7$xxM zq({54ozh4%=}b;!JoRYfd(4U=A^@1)Y91b4jbn&&<(4yi&W6lHG~1S}1-NBf zBK7uyHJg`c)8P$m((-oE*Q>+x)&>9`_wbu<_Wc?Y)nC-OTUA2heDKR#Sw8Ex)1Wg* z6X;fw2^p&cx$S@W+=xiB_zK(YV+zAhIG@8m&f!JCalStadExy^-`Nb)OBQG5r%ozJ zTk(H|ub*umI6FTz72(gD_arDsi@=G?h4zo<6!6faEHPHKsk_~!e)9Miq3c;EEtO$} zVwzAJ@s_Okz2Klc88F!CZ6=W}zW66w$ICP*W7!CyYDo79XD;Ak>#mK$QZ>tB+%O}F zxLYam-xc?_PL`qOKe4&YQk{TbAc7Fkt7W%IpTy`n2ztvGx~2QrPh!nsj(|;CCGaa` z8N?lDv-|UT9-Kt3$(pTO1Nn*Y=;pbN_w&l`?nviv`q7!2T z*s`0RwIaG!F3!{=xZ|UGf))IvS?95Yo#wbZC~JSw`Swfa0jaBl$8&k>B5{o=&4u4S zTalTH#}+|Thq3<(_4tx8e3yK;ei6RlYcN7LjaNuQ6w1iV4%0heQVM2#cJGsi8(WG# zIi93Kg3hPcti_FbL4(Xt3GNb?stb<; z$Rr_+)5_|)XAuQcAR#Ngy7`H!li_Wf{gR&1_(tq-?;BB+yy#Vo`Iz0w&rRO@W<4Lc zWk+9nv>z&v&_j2R%$m4nJ}GduaupxA9|%jRB)Mn39g6+cfZ0V z28W{j0zGYpTWr|y$4$i~rSys2lME$;og7AXHHMtI0F`Ux#fG2 z+u)VtER1n|L6sUtAGt-2Lo88QlrvyR68b3|!#75H19P$_6 zpbz!ulo>)F&v^Dl&GEK_Fn?~@wPq;{rZeMPubC6!O%<6c6&B*N1f0P*x_UMwp61_; zpgD8wpH}P8dlLXLKUWN8Q2-0{gs5Sn;9SKEgxLb>k@^O7XCQlO?y65~5$55~b@X7e zoLWXQq0`OVyvt8wkoHqbkWh8-TsI_mfs23mrXdv?{*}BefC1|5A%LHtAXf(#^~osL z4B8y7V<1ItZX2Od7T-N?0f%o&;+wycvfW9(H$7#6C670>J6GPj6MirF(Zaz1%6LX? z^;>;xC|aoX&O%UczAv5X4oyTO|3W(5`)mddP{gQ$WLRa~P-*eyN);7>7KCS5pw2_1 zKDfc}SZC(Q{{N2)h8)=&oWdx$-|g!wf-J{fp6DLcSiw09#BC(a$?yHmQqbJDLli~i zH!SQ$v>}p4O~oP>UR_VT6(6dw=cX68&F@5jpOv#UFz7Y{9>2d3}{QQ{XSJn;$ZS&qwHkOIqgmNNV)^Q3+enA86@|8uk>eNge$96F{Kyq?ZpiAj2# zV__>#j}}EuJmz2a;N#YdpgMz8fTsrv6Y1=?~d** z>NnjkYY6A=RHIJ_?4}^W(1%mrhVt%v!`goe2vzRw`%9}KY?f62VI#I1V7J%9^3=*3 z5FglKRXX2D-)Y{VSkI=c1>Z=r!T*jzm+=28+^V(VEn37EPePw7@0I^JB7eUgLE*VH zrH`j@Qn6V+SIGM(g$N+J>xi~v(=3)$WJlJLg=q>yS_-g|QqZ`Y<{rDJl2F%Qr=7?= zdL3GW}T_=f1^bK?8MpyoR^G;+T>bg3V9B znwjT2f>XnPw5~+HMT0FRt8L^k0yHa)y-#qrlokiA(cM@GPjObrGWyzH`A?hxdd+uG zO|5LU<48KM*zA8<1E!IRj|4yjGMvlLkdDjPDkDw!9{X|f=T0>)q#eR{|Bkm$kv$hp zpNz-y(o)M}2*Q?Kg*jX_0@;kNBd&q%l+fy5>4O^i0OKc^kVg;BUn`Q zA(~{&W#Xw-ZDn)3m+0cC6&;ohQKZs!iUP7Mr-X#P#9qq?%1Gigd|mrPiVssp zWpv}~Ijmd|%*4al?|;o)pL)lkVv=!^o?&x<*}OlI86n)9Pvic{E#GNcbg??De6~YS zJhmSj5WbK&aIKCBMq%PbT}fkr#s&9iAtcZQd4?iIPZV}=e+@=M3v`53K}IaZ(m%i7 zQ`GvfKYu^c$r>`=;q(-qMrj@a1yJdnlN6pL*$rVY8K9GdsP-RL<6rP7b??34&J6Vj;T2@arJ(MMo-X*{^)$rf!sH)_E5c2~mBU;nZw z74DQJzgk;xC2t|)C!rr~CxP}$FGiNwWAUQ?a&bmt&VYqdoF+* zNL99;NKqR6C)C0#8{4oVwfZJSOO4b zE8A>2+NdW#xiJFN-m}HF**%Euq{uU?E_KBTh2|+jsL=(yk`4fc2Oz`Iqjk?5h8-hw z!d-!DBV<)B-8F0=02=R!p;w&XymTL82zc7u_shoXuXqvPp+ehpUjf9}oYw30nYo%e zvzXq2^#*@{|NriB9!fDb@pfS?SFu+g{C&%xhKD&|d}!N~?^p^Bp4sAlKq@ub1GB>w z%^&4w98Hg4s2$>M^@z@r_cy#JR@-k+zsyBW{<&Ql#{&fbsAmFiz~mjeL`)1EXav`? zDJv30V8*;gEPTkI$(BZW152BJtUsaGvPD@& zT8WuE)Y}0`B#FQwRA|bbo0VMj^t z<;ku><=@9O1c$A3;IW&2T0#^ntw}=P@7h|I+K!J?JNZ4Ecf%}0U#*-&A})ckZ;fi6 zYCChhF4OxeIM!K@sEiKhme6&*H0aO=3Q>4HSemsWHrtZ^S_#SfOj`;RnBo`mRvps+ zq7<2kf60G`>S6lxsog{>>9KcH!3x0|(JOE)vkYDm4@V&2lk^6qF{|4bd%xeRp-nuo zNR&Qqav!zY^4o?!t%OKVd=@vD%8cP%&6eOg-iB~AMa{mC zJFV{ib-x+@7zJn*6f{OLS(I~aXARgknjPL+p77q5-f<_UmW-#t{NFH(X##<89Zdw4 zm1s@5HcxN5&@|)Lv2rl(fy~>05f>!+zj7Q^c&RTkQLG;)8(T>GRxq5LaS|M|G6~bY za6*W&SuCd53n!pZu7F>Da9xzyfxEm9I#Yd>2->-napY~CTIk4W+zz`}4#01Y|J$lM zeKxDnRf9`^mMRxAnf}%!GLoMgA z@>TjQi1^$yRz2l*KX0M=Tq7A<;@n^cd6kIZKz@J?8o_m7F~tomu3Yks=Jatt%@qHf zuP3Av@<@m-+9yJC>$$eN{tjCw4yGQ5XQ=VD{8**4fPI#2dFac@6B)2<)lDn=aQP~DlZJOmrq>e*Yy`H1AyqH zcQVZ+lUTj$AB?RE$os$7H4@>$HCq8pfzqQ!z`G?C5alblv@;&Mb9zyLLkLeN>?McJ zmX9v2=D8N+zm=b!V8Ra z33dxDK$RVV88kamXOSTzh0{{fPDancY4hC5O$hdihZFf*X(^%(xMHYPTmmM29SV6F;vD6tugMC4tB=l zj%8yVGF>7kk?1&KIs6`!8V0%!H2lj60=wGvdiBgHx0Og~;2K2Rm4ED6B7RO8c2P53 z3WI)_F)39~Qp;k0p5N%MOK8_mSIL~4=_t9mywj?7CEL1w%Vf_YsG9z2)8CRIf9aDY z$d1Tdoc&)Cra=_~pKwaOF?*lF=|x3M)VTb;Q%T^F+bx;3xr|Uo_;nX1g2j7^v&lPl zrII`2+R@)!z5au#lqLtY+|6mH zZQ(Jz<7tBF{0oAgfvv#1G{SO2ZI9VM#??RPh8R!rq-!P13?r9mIgE-pMoQ+jIRoau zjN*#VS+4pzBxPI*^Te>G^B0nAXBo-Pw&9HKtYVy@nXCi(`ZqjM(F$I<{a)O0^T}7N zmwm!^1R3IV7gif=iZRQ0t%EE{<{WNv5~MShfx_wXXF;KI#2Fla5{~|gV;l|adP;ql zO_!3j9MG^qp?yz<#C;vk0;kJ_D!W;gFpL?j8_m+rO z#)jf7-fp5bfDg;q|HUmP(_W~p1*g8wy+r+Q5}F>Ny0*ar54 z0ul|?lN_vDwJlL8cSlC$`;c?Sxk2*QG*VJ?6$BK%sn;_j zU1BwiTt-Nb&SRZfARhAIaH0$vVHmXO*IOb|%qujQ7b3Q;0(Zz~MBDh0LhrP7{>?f$mu@RW>} zzq@A4c<_%xfv;?J?5{HX!_%|4ljpmsks#)UL_56cqoG_aPQWHqmq%!B) zNB8=i6wv)Vh)oH{|HppKMoDxk^K!%i6<;yqa3~QZL(D^8$u#)<;wH1sIAR)6tx1i@ z1&4?u6iJiE(gN}_ncBK%`o>E`C2mmPF@t~|@u}(ovG!3g^>;}CMU&xIaL~RLM!u=t z<-gcgc$pyVoal(9t-@J|3`{`Can6b{hB|}+^QBe|P>%2l^X8Q1#!1aKaV_M7^F>Fb zSOI0OI!CCloo>_$`C@7)@Kw&?7+haCz+t+B^YAAb)HxCX0#=aWy{90BO6b%Y;_gQw z>Ia0`(g{wb&sW_2{~=9XcB)%U}&H+lA&X{ZCPOJ@p)9v5KrdAQCQ2p`A=!4E#145pHP&Gmi9&5S{cLYhDP|@J;gfxI@T@Pc(Bhb&~4;>+qD6* zKL<&As$qlDERDqB+@GD<1o2Gr`;v*q%G;xnJje1>biVAr>`UO|fKT}crCsKIw#QAb zy)V&J-MS~Y4GxItG_a|fs!B~&=Fxs&8JqA|6;FdWa#&z<3C5fQhHz(ofQY?B0Iasp zS3NhiuG}L)fLDkqImK&E2q?Xn-48(5uMTDqTzSCQpCbr0QtVM~^^e|C3stC9u;JqG zFpP>?$`!>=FbVf7sI$uqTf^32@|zH!#pa20IcRs$k8NSEoQH+G0ZxdO0Vl-5S{)S* zpx16AiaHjo-E)i+?Z_w*5ji=4y9M;D3BS4F-M+IRp(EHmu^)&hl!oKEr{Q<8f7lW> z-5q3f^nuA^`KYeP<$Z^9{C`vO0WJxrt?i;rT{rIXPmr=P!VOmSShsHG)oUjfdh!9a zP4`;EBXz1<0|{IRxam$w!UU$SN-PbdAr@wSlGqAWP_PM{t5_z5p_eQTPJ_)mTjM-q+iMD3oV z4G{SyvC%;MO`98-;F0Y}2gKRnFyT0FZixg`Q4>M|`Z;jWtQ%+kS7cd|{XDpl?P?^$5(7t%$ z@#7w0HAI-)G|Y`VvgEArF$20pceKIO0A+!=HcTTr@T7UY-(sP4o5Zpj<&MOIfoO+jY}o;NVPX}sXk;qDQxbhN=EkjuoYYAFF~8?0x>wqS4TB@)`&PBIH^Yn1rNF5^V5m(mjf~+&7l^!$ak_vxP|PBLHQ8 zD5%8Ix@`M8o`7|xS!bojQnAj5yYczUj1qAaUpjNZy4JP1Ebw4S15&hRB zSzS$@6PBRC0V>$xu5&A*UN8=fZYdcE_Z35F8hLPzXV5zk`5~|ccV`{7=Q$}ZA81@qlnJi1dw3XQfy(W;WXiAN@k#=&?2R6FQYl=hHUw}z7aQHxB6MThxKk4caiHGSg}svCxdyK#*D z!*_+l$PA#wck<+(yiXi+Dr@UGYnZqMq!I-6)sLX?5hjtLgA%lz#%crg&W%>-6&O+f zr*EPNbK}$&@Qa1*$R3L5(DWl;z$;p%gj4Y`Cl2f4NRZ+hmB_vrmW!G#v5h9pNU`ZY z7%O&(6iqtl8j2>Mn}TI{f>EHuYtBpKF@lfJAWIR{dDZ0?eY*5bgR16NBc4?kTw_d_N@IyXPGX(ri@q<_u z#G1EYqyrr^UKwuyb=>OaUW-!eL(N zO%TrLO7Gk^i@q(KI14!{$n8u;)dbEtJWvxPofyv2d=~S=xvo5f>kAN`hK$i0X~8q; z0~s?jVDL6#M@@+?sw}bZaU~|aD&er}1r{1>854Qn90*~t#dSEiH8KU)hq2zO&+nTa z*?d|5-V`)mmt`wnaLpc8vgt+uw%ht4$@7&qyz#7_g1?YxY;dFm85dy=;~Gy2@81RF zb@RFoql#4(weph1Lgmb~H-=e%23KlF=em&Zy=?&Wz^Y<~Z>yno zL0$&4*CV68L*#tn@@Mkzy=Te3E9q>hEnrk2F4#k`M!^;m+E&FOK317$z*1h1TB+uI zz(aXu&)OU5ZjF_!P+{Q*0TWiq`0>_q=}B{@aRfUgK$M_`frS;!iXJ<6mrDMpd_|wJ z3Ias{>|Ah1V+$mqUwMi|gR6B527C?Ylw9YM{{2myo3k5+hujNBPivHufxX__k5g}+ zeOsr~P}Od|tmqVVyHDF(lvk*wMpq$4psHw9Cc$)M-Nm2TA*5@d!=P7tD!+LZ$%1_7|Xj&bVof>ih-z-?0|IY!ITPh&a$uSNfTkOz4 zMn?xJ0-DoMeFt;v33nn}9oM)W(hJ5`g}1VK*+{OdOKmkWSz|=#w~Y$$0wQk5{5pFNv7;7zzlkEGVF7U8K5?a|q-6r(btr&sykjZAU4ko$2{V-b zOh^glDqFqAVjC7l`=9A1RLinZhBJCOX530;Ef0jd!fE@RE3X&*cP#v#8A`)&{<$xl z>yR%61dQt^=O(c+QU#&{Ev8yF7w+NxDY3_6Z2zXyz|8A*__ zUDTqPc~z1zdvgP@(Q;5>N$EZ6Khf4^EmS z;d}>t=M)y>yGRGbd|r>+XM6}i&&%yW)J*qfH_1+qAukF1`~~lNbW$Xvk0tik8|lCW z4ft_lg|%jc4w~CYevoOj>evrxRGSHs_&`@V5fRBpMzDBJ&-oO^;0C2Dmq6C-GulhV zPkG7W=lLSYFqOaEgY(VgVd$)h>osHm>N8PLy}V5zg#cfWGRWb8bo1~C5mDVOM&qYm zp!=_OlGy8^Y)H(5<@?%=KIKWFKNMi%rv0M$kgn@lBvEe$NPpOxnD~if!pas6kguLl z?LuLcF9y`6IU>tE&2x0(fsFFf2f*Al)YGS(4d(n!TXxc95jYxF2USq2(g{@%V}SV9?$0a?tw4Hd0zCXH&Q5AB{c=y6qzWVhbjQ?{_!SgbiuUS#5Hs~v; zDxU)Skj|eJuT4U(Ci4$)5-_K&xUVzf5@7f-qy1WowHba?zsbgp8Hq^HHJdNxESK5( zjJ6T5_>KH%){$!-_Q4V65>Bs~h!P6yu;-wPdl6YaWMDq!eMg+i&fpCNX}@%UUGt2g z&+@+`Sq*gcu`wGm1bFF@+9dM&KsC&%^rdZFX!tmB9e>K1y~$fiv{m%ik$^D*=46I^ zLJ;GIlKQQk;Du)$N-p<<49n0D&MJEG#H4J^B=NKfh=%ms_$;f?`Rn0ZbP;dyiZhJy zK+TkLlOY7)0{c~Z2Xan|^i60*n^p}Q+~yalrC~ab=qt@7sRFZE#^OkMHiP8j#fbgk zM8DYjodtuuwHO9=lOwDs#BW&f5JW}m4)_(N;+!D)Y!m3_(^eu)-QKmco+MLS>r94) zA_+3h@}CqT=$tvfN;1O+Rnjvkh=bsxo>K`oQwRGy zH+HZgE#5UJLQOa*T4sh;o0|+*a0@S7tZn9-{hKiiw8`O?2$v98xbX+2E)rSUwH1tX zU-D6qX-Pe?^YfE5$1L$#p_;6brczNT*My}o%ZQj&%^xY40ET}Fx`xKxAYEU`qXGQ{ zc!>DA*$s=Vs2|h<53R?ZiE?1bHy~&AiyO&~-V_r6pD*H?iTeav50OLHc^@bZDuuNI zI`Y4i$zM{*{e~MF_DQvk|MwIV^qJw&;qj|uJrQf2jtgh`3}VGDgfchAl|wucZr0hk z|D4u09OLY{Z^p7HIcbHZVt)B<{ zad?!4&v*Rde8Q*^=tsYH;$__PT_J9RTSUcp^z6c`eP2NhFL3Ui(5&w%sSk{k?g;pG z;WR7RSA{DO;2HG>n>PA`Y+)u@0J%D7Vua0s=FCGL=Vs&DlCx9Rh)!#s#@*yG!|ZrOqP}-^ zThpou6*OstBNT38T?0YG47XJiwr3cUO@zGf0el%!PG`(x9A9~Iyan6T=4}oJb|T;* z%2O3r#wMG!s=jT*%GKI3Yx;?cPQrWve9@GA_iRf`c-_hHlh~bDzJ|hA2!=T<`i1~! zFy~w~Q8)4hGUNn$&1@$UMV(!>uqQOt;Xczy7+NyYT6r8FYjGr9lhv47hK&_JWP{nr z?P}c~3#=Cjy$HexrON{v*gQ*$YFd*if} z_133qI-&0vn~AznmyV?KeRY9xn`i6;7@8}FcIlk#L-c`YTBT+h24BU@cj=o znJrE2(s3SCAhSFx|AYzn?W&|xc05qNWFtD}gBC5i9@J1ZlI$6|ZO47&;~~Ri$(PH{ z_%JvTdDJMH4jWGH2Bs!rft9y-S9Sonlpw zDbF0K_E|`|hpQf_*8`C?9@;^!_31_P6=D|fH>PNF?*i9KE7^n);Rev2yIOy$O>eOK%zE3uz z^2FMNw9xDYSRybwRKM`Ty@%CHR_0IkLI7!ej`y2hGg=Fhcbc^unJ;t}r05uXUfmz1 z6c}bP-Um=X)3e1>L5oJ-h_W6M9{hKR|LWAh|49*19 zgW+Ptf*kEzksb$#mgrjVzynDj504qS$zqR@%gtH30R>}9=xK*AX zrH{85p+vm$(}E#Z2n?vmmwxcB*>?82gB@l_doRI*mrEXU5r|^Aipo zhcOEZnB!SJsYA@tX0-P!|6~93&8n#)9m=J~@=0c3{%h04=26+oMod=R&*k1- zfCj|>dJwOKXe8r7H|mErQ^N^!M0iGM_lAx4$fHHLajV8z#OAPW;zyhLwLPlz2le%23*FH8pS#A}N?5{ir zs(npZZY*w<*8-J!VK} z1VrxKukhwF%q6VtaL<6(2YTI>5CpOsibVA5+<>M!$Tk(}A?#M`e zM_N(t#ITX^^ZTeqdlvjLiO_T=R04$@+0NS;%S=BN^C3NaUdtvr^Z2zib%}A$sDQO# zXKcdKajTO;`|+7~+K<(0<4)}lU#JHQ2^OU^K*LVX_*E6RO$ZuFl7xRZ)MI1$GVrh$ z2Pp9og7yDw0vZoWNI~T|LXtVK7N+$I-52PeA`& zJZT4rE7h`g|uUnU)t^F-5JXnB$cuCYMS1?0& z?T?1WzZZry`k1bRsZ&hDn~jQDlTHFaZ$K#2tkXVU5U^tl^k6@Gg+`g72IfDZcF;{Rv?rXg^v!YD=PIlCf9(pV3#Yp3z@EF<)B* z{dDe*l|m4gSgh9ccA$!>yxwx{R8aLkG*=o}+LmhxWsM6W-h!E;-eM)`VUig=f2Doi zKL3E#8kJ(vW7*FhSQYo+ut!;gEi8LUvVoF<#{2@m)|=qD7PqZ6P1=_cB?V+%p5Oeg zvdup*F%Q+2N6^F^l52QPwxFX4H&ZatD#u^1Wy-q1SOSF@Q$DE@}*9 zyAZ2`boxAVhWN8WFIDjzdTHYih2~}ACU(VYy*M7lEy9Qc4p0RHYG(Y5fB7Vwtb3ERk|JYDsz6-TzjTm=LVy59+bdCGGHY~obRl8X9+lf5q(D$DVp@&83V_s0TZd(Nphpf&!Sj?QT{2n0mChj zEEY{mQ}#80Sg5UimmDeEM9wb5-RW!1sNlv;5g6A$pbJ)9e-lFvcTED;)Orf!;b4KD z?Ph~o?7X`pjLW31(CLDx&h-XJ-DtXjas5N0OQ`g2a{Iug9WqQnn>%n=s#x?+;k-Fgt! zl$oC~z0Q_=>I+na;;&Udb5$fhg(?G{Y|vu2D#(I5$W>RHH6)VL9@9lVRI1I%q9xt^ z>nl;AqDICAS+kC}##p3Bn-VKCt0XB_sEl|Z)9nWA>FPhs7lkgCg78z);4{&nO=Y&`HQ3hqnC~T7ngZ5ced>*>RzT(`nw~IDt*}V0I?ImMH6C zN;<|mBr{j>19zyP-OPcp^%B`d+58~53rc^tHV0z-P|aOo9CN^Zk>8286ESu`x+Bxu zKKR7m6c&OQxO|QR5^m%LqN;Z2A1=81S2gKwlQs1=@9h)r6rMdK32JHcOAAJ5f|65Q zL;#3W3v)9imeKUKg=D`#-a4Z5?G zTR(!$TRtp*Gkld>Xwr%sshc2eujHzMwelWApSg%AGYTS+xKQ08!Y5<8d6&e_!?^WGQtnQMU zm8FO^1P$ z7y5MpU$ioak^MAi^Ja-=9HU>RRj|?0@%j2=JENcLsujgMoYKe_yE_y_BC4nYfH1I) zUvy$|jS{742-I)JZ_Bd#Iw}=mjnerbf@~<_dJ#T2_ ztjV8ax>i%@&9GOYazsfg^m*j+=p$)FPfB7&CcY+?$|Tq-8IOxY7*{GLI-c-PkX){) z+TDP)H)4H>)hDKzsZ`$GR6Or@=!1Gs-bPYR8XIx z03;3}@@dmvZiB>>LQVWrqK;l{AH1|{7WYwzAr4rFF#Fx~<5YE&1T%ZDmxDQzvEwKJN_>hgJV)I>9BEa1> zfUWhSbAznj0$;HtMzJbm=4wd{`>3jNd|=-}Msd&(ZS3t;1CkVtHVg5ZNL5p;St(SK z(`LWU;)m!eBxpZ>9r+ZTYl=@-97aCf>{{wMjzR0H&x0F-bQ+inCON0)CLZ$`ekihK zE)9gtvQKtayyLmHr?x{2^)qpfRCE2#CVzd-A{Nyd4~w#yr=lxOGui?58)TAIP@JlM z&wCL>oSh@Wkq3CHMNygQp6wZ@qUrxy)L*~ne?2*(a4Y&Wp(6o{&MxEDe2)*G3sLgY z;e>R+iW>vWlEbNdLD?*e3)+t_cQfIvm?!1zS!HPd;H*F$Z29dq43WU_fDM>`1*NeT zRo(4bb5DHTEB+Fm7WH5zpkaE@HyjJ4%}U&A$Wv>>{}fASe)cbIis3+Ifx(rLb8}+L z<_oIuuT}qs@xl)+T6TL>Db$t!z^!R@Fe<{xD@PAO|=t`<1s&S~$=ZKpc4-pAs(g z!Va+B?A_ZzuB!WgWSe6w(1{jOZ^do5t)T8oB&ke}UrBhMZYxl7nimDFoCh0 zkO8joPQZ{%k995L^nZdh;XEbp=QDW;1=lSE`UH<3zd-QHhVx?}otML75EP){antRp4|B!eZZrbRm zs3O)DX{faAxW70o0DYD#S%$Xj2+&;)Y!Diy1wuFJT3OWg4*ZROj1E7?TNskJJR~ls z2@L_baczi9ALvA(rChoK-6?J~a7v5GJ|oJ6Ivyf4nT7n7aHwgmNs@85`q`c7x-q8- zn7L8YQLH8j-X{$Z(X|j`%wbj^zQrnkyg_>_?6jJr)%sSR{*>#W2u(-%4p^6sJEqO2A#0Va5t7X$Gw@CBdJhZOyAvgFg-l9MD0R#_Z)>rJ_HU*p`o6C z0q~AnaZl@G5&B}LO@YEj$YpG$zh~o2$RxWFg|#FN;0%1z_c#rvn1R;@yS1fXthE)N zYq_TrF{(N#Ucc+8iVrmhwfuR%;%Z1@bssl;{?TgQy zrCkf1891r_lOWgJE~9$$DgML+CaGXH za5wT?@*Af^;GVHd&2@{J7=I7SefjmsF0RIa0>?mrLpug3fC1@{zGg-*Ar{?l2I%3Q=01#93+wSiwipO#WjpVexqbFu zp0P4XR|xL6XeaGB77&1cHOv>jPbG6wP%gZP=zEE`>x)32cSA zULQg;6u-kktL}wetu?TE{e{hfJl(s>jsa=rVgx{{t=MeWcOfMyHL%jDuKrJX#7?7O zxMkqJZj%VtsCA8VckWs4wAHbsa&RJ7Y32SiQfP$xb`DE+v70YGU{&on&m^?yacSoG*4~7nXv0I2)n8BS%a@ z|AHu6M5o$qk^I>6p{X68C{UYxHCK z7Yk(mk|t?0`97nfSsY7toP7#mLE1Qkho!102S9AG-`!vUF5)jo!WfOpIj{v>8>r_= zv^D8=SrMsp->Ld1+4jFrk@gbu#X_pPRN6<6dKvu%hTSTnw&U?V^-|;_W}A= zIn;=tWl|xTOeY(Fc}_%0{_;}sAaZhY{o(C*Qs`2}W0o5E_HAxwxFQCNyrdh9i%6M6 z+;X!O@g0V5!W4nFak8*=SB*5=gaXk)dLxJOTj}_7o`3SyoBDkFJU-p2mTtFlA@(}i zz0Hw5#VEAl_sFd~+AGlPkuzMoqAqz)Co+Aw&X-1Ri0=l;TGx;6#ZQus*bVK3v<5$| zgFLNh^*I=-F|B-U#A!w<@p6Rx>t>3ggDE`sGZTp{PVncjj=Y9-y7;AL@>Bv*Xa`69 zF|(zI0MzeVp7+T`K z3&=~8ecDaalSX!l$g_*9G7NLMwi+-in3Uw{JSZmOr=2*7m*+;$b-Fq2-`d^({C4U( zD*&;pPpBq+coZ~ML8<2c|HT#ut1Q*9*#mt4ar{IIOs6SbOSZXi(}1MPHP`z6_QNQbaQ3=apjzM+Mw-)u*ZCP- z&lI+NKHfZhgTc-<0DutD96HQR#55i!lMLEdS%Hv6i7ZaoY~vV#Pm8YKmVW+3cAd#(~FPser~s9)&{?2VqfM#+3O!wnL&Q;CLyr||N> zRc*WnM;nMq$eHq<*2!Wvzt)N=*LTDT4^7>J77j%v03QPU@2wHT1t!nk)6W`Bok5lo zzbovhhG|b!tE-Ay)oUdZrnx^gp*^iiBbNLoaNtbcIRkQxnqLWvXWNsL zSL`DGw>p$ideBRb?T^?~A8$mP#j&4F6usm%G&QU#c@U}|51^Qd}Q zUB)Id4`mg-gM0$ilvSTd(Rn1uB~GJq>b4OkRJOIMK#Ql|99$XrhQ@Jprhg7jND?g^1XU%)_{4!Wbd9ror zeKZgiK}UkL*x1P;U_$Rjebm<0WkVYq$hVph8yw2q^t~%Ld5dt7JBy~ElVbFK6elcE zbY!6=Q#;4A0*X9)$dI;k5vP`#;C1o8uV5fb?783u*MMI18&s^u>p`<;Cb zK7Gu=r#c!{=J6g}k{I@L(h`;=B4JE53dol9h$yFti&s}r{bugn9^VpaHKIUzsqYbG z?jH?55;143xSRCG%eyjrq!T9yDm!rv6%{)ZDlq2`Cumo$U91$cD$|mi|YCN1w8AA$yKZe{uT!2w_s zjgYRfKxdV`g2DAltG6N}SP8rHYzhi)*$^+H$%IVR zgstl2!^36~Ds&4PEXz|gK9j~0%zR%_W2Musw!}V%gYO!Bd8KoEAKWKI#f0O>8fkhq z#f#fY9(jg-fFaB=CZ0^dqeDiFN)Mc&l4>1UNkphi&Mp9Cfn3_*5zJQgZP;|;t6cnZ z71u4)MW^YRs{J*25Q+q$UOR4KSJfsf)dBw!H9!2(V?G^SVu}6qMDQb*{v1#)i?BF$MC;rqBoU(TC z%+5p?Vl4Pvcr>_1>QS_5X*Xv z#TVuB4?Gf=)jh16V=p#s@5>4)nwoTD9V>Vf}!Duab~zj*vjnWwIKJICg7+eTj5 z^?Y6NfP0NK)>_Rw^4OO2nxGsLExqVGjCNU!PICVG$c=SswNENp@fKD41@H_ty^xRc zmn5?m)34?bQM&Cgc~)s8&rj~jSgj5pKue#gK2=32AF+%o0AYH)&NMOjR=&{=Z z@z7c|_D}v($2SyR9iu0teJR+&O0FwZzvn6%su_j#B^`yF)k^0gHTJzp;xz=S5vh`C zc}lJYyx(XoZ0kwHYCsWU^qW==Y+Z7;K<;L9)_=@?R|$sK2Y|Zc>0`Fd))$FyvB|8{ zB=9;!{Q1K0Xs*$+49piPaLc?`cUeyHc}+f!(8MGZrB=Eu?tYk!#!P(A%URT67E=SN z*u&_4h{a(#l0v^PC(e}P6jcZ^PwgVpXLJ`#K3SloAbM3b z$BCUyi~!S89=??lJ!qLz?cKQ%f7QVT&iH;BG}w|aXnW3c>(Rb(m#98$5FkBRBw3Ng z$2QVhOr?V;fZT`^-0DvQt{l)pD||J6%fgfy;AAK3saMCHF<%sD|6X_DN?&V}>x@a5 zT0bYyo^_=sDuIgEs|h_WcBLXpK+wjBNy`WSwB>49%9^|a_ zdN~y%v)lVtGt6B(_zI5x;N5-CgvMQ{Im=-eNcv`*ajt63^cf9}BM%l~q(!|tzh^#b zyYo+>Z3-VFOi=2mR8^%lK4Xg`m(|Cn+o?RJwq4uC`_{_>0FagYvY}Eq`bb(G$=^|t96%?m z&TUCOCDoUU!-E}Z5p!beN^!o|Ez#YV;N&>P)Z`_}{nx+nr=)8CFcyxCGN6X$lB;=i zGHE{CLk~mMjS7D&S03+bgpS$#KA2KHJUan60E$DI6j0ebV<}=tW0Erc+b%2O7{FRq z7T|UKGy@F%WY>p5s;X86p4Gp)o#dhdQ)WO%}an3kRiGF`8;>mb>duiX`$MH4J)_?MVFEp<$Z##qW# z`Q}bobx2P%K4kwP6Kir_5Z5vWEU)KI9;zycGQ%fDXjnnyhhe6#C7JcjE2~I8=N4e|f@)Ts5y<~~|Ea6XFn%k}R&C;X zb$*i5bfv{~MAG6aaqmZG;;;Vop~cojN=Fq)PS%e^U<+TOEYMZa$K5-a_yEAa-Ar0t zUhU~JK(6e)cMX~C#7#k(DcjJkrdJk*Glg`IV+M|WGjw|$pF1;^L( zJ-!L_(sN5h7@+tUXhZOxkorL@4Lw+X0{F^c6ST=+ZQ-g+q$t5lQmzwVj=L`4l)d^b z{;jVAxxgOl%$M?kvKh1+ka@@CGDshjk3{=GVPvwrE>+{_T=FN$(Jl8)gz_N>+V@eWsl-Exn4aab@PG|OL zzD{Y-)68PYrLak~hyO?lnJP5Jgg6rR`B3l!x*<}v2VM?sV2=25UJoFoTE?pQQI?Na zzR=lj#P34)WCT!VqPKh~wy5a4tH%BGjyCl6AG!}X!C*EPpA39<^Ym3YCcZ`#$WtpF{w zYm4fx-9Z<#;su*rxGIbmQ{z90Ufz{(6kWc>nCotWP(Ob=nKtA$xvk>7Ww}Vz->2Wy zfXn4M(aF?f5XMt`wcw3(RMgun!y4)3=iLnSE}*RD^?dt%u{tcj ze<#ib}(lu)GJ~bs8+}v#V8*Q1BuuJy{V(0vaWbWKl+gR;nA-3Edx*^;PE;XYnKH z1$Hj9nH4Fq#xiVIH+k;ejqosrZ(2o?asuy%4qzqMM^F&paj355V+IS9WtQ{z;j`bwss+}@@?a3gd0Oktzi+nHxA7j zD$TWKjo-iI%vMcGb}to^WjiFd-Yo9O1!w6P6s)6M>H~U|KYSN~U2Q}SJTq!zuCd)a zt0-~=h9#KTRv@&05-?SW+J{B2=-yIA3t?DGhVOA?^^qJEq`D6^Cxj)c^%zZZIVON3 z3i4(hS*(P$+b9-f#^NRG>;yd?`Y>aoCnT_8UmQA_#p!DdVCvJ=Gk%YJJepM=+e12D zj8&9GG@y0UY&;kkSEp3{X=EWrx&PoMJoXwdMe_Dh{3 zMt6ra_C*{(P5$V4F=Sez1F;A-e;{DePg1^cu@49Q(3pefYF0w@q;>4&gW_~zD>LcX z92-%W63|$@ujLygg1wMCUbbD07F6 zwbRcOLw>o)jODnQa~yI@tdaG~pL*hRcoJS2wi(D{YpRsy%eZzu?0aQg_-|M!|rv2si%Rv-HJnV|8N{ zv~lfVeC>a2??dQu)ePbbkP@!(hdb9F$j1Ml#2=c%JpesOcj(8)SniT6fWxb|T-yO- z(pgacs{e)E@Q9{GbFy27I2gCks`!~LOj!{t$lX-wKW&{226NK`A@#}tRnrdUGicWu zS0$(a=E?$|=ATIMf?n2pxZ2EY0Js1N!QiwXzzIEk&cpB1LZ%YgG# z?Drs!>P_m^p^DjvtV@{}L>%#&hH_jan2F@_1kf{(G(+z9LK^*%S?Q|wk-U#({Vk1p z&nE(-S?PTD^Mu83OJV*;Z~Wx!zaDFJH^wjgGLU7V$!hz4Q~@*u9Ut^6yrd+SV+R1b znXOW7GYmHQ_J)l6AG z)~{o4BwJ&NgKdz@me@F_MH#g~!S(oTxBD*8Q&s;AYLR^;>T{{d!SUgvAFm*srcIkh zS&G>uR-caByI~u3r?(hvIvVfXW23b-@e>?GhAGUp3=fgzcW>teP-C!F`LMvX1(6*T zv9ACKjYsdpGyOIN=QsIUpO*{itHNy}!(61$c3mGQ`yRX57{9sQOTbl<^cOtv7F%OY z7Gr<)?qP4{lBJ1H!rB;GLIU%n5on>o3HuK?a#$S?9p01vYCJz*!LO}|HT0d* zJoq=cJ+5bVOq$ziKH6EqpOWky^r1-Eb0k3I_*G;*!}OL>@Jy>RhFX&7q6-YI+SNqt z^)~$4=D|3n$++nNmn$->4I%IfYDSCIa>^YK%2$tn%Eb%MN7b9Td|g-#`kwcx=e)`D z?(d&XTe+)*qhgJcMXAS8Y!hCgAhGj2xA6i<|3;m!AJ~d`6X3K4s3u0b0;Qfn@!`SW zg3Z1#+&{#5#l#FxV|5G;+#4FXCycJ!I^*?Lu!qffNdvgpK;Hhz zv<-~9`z{aLj8gz02nSM1t{_SN=*F)B29LMm@AeV3Bpg{OilvM<>gNFNoxKxyG~h?s zLgrQN&{chw4_2mGe^Ozg77W}z;%b$mP1!b4Qf$ml2qopUjQ&`w;th4hRWnND-C>2cK4k!2c%t;yUT?n)j^^m7v(P&??khAS)CK$VM!2ntex^Rs|y@licplHsVWhHPPNAt1z^Q1`7uhVeyG zr&_V+(6D=g)Q6I-)JYJ2=?zrLjIKFk3E51b`0RsPKTT4U;zt%Lgh9TgeJHDXPa;Xh zk=I@MC-9b8Dv{ermF%}DJ+?kHaLCeyd0=o(1lq=ce!W{8``(}fnyx)n%(EJBjf&+h zN~7i#-L)%vaX(T97a0+Fq>23Rj61PH;Z>^#e11MBSfnEnR#h8IIpnkLOrB?bA<8P% z7x;~XLbaEix7&N0Y)Pf)LeiM~P7A+hc$ZSM#7)mIopN2qlvtWZu^ZKZ#WV7lLyjI$ zekt=kpuEj7gpW-}08^!C^6z&fa2np^_Rn*UNqPmPWR@vY$g_(@d{z@CeLbw!wnUfK zV2veKv$3VzSw>nw;9?e&)v3kd>J+p~(IuWYq$-G|4uwjOL7|SUd6!{m{9UNAKDQ7_ zPHP5&5wD>_albcd1pZ7=IuIuMXN4UJ@!R3PN?|c3V{)$`0qsI4Pn(x0?&wL;Lj4C; z7B{(5UuW(+syaMG_#~x862g50y;wKKdiHJKzBomdWgv+|gLC+KjG&wg+a@mI8g;-X ze8eN82kmf74|59Vm2C4n>@=BmW%3sJFQFhP7wT1qe8v$L)lHpqJ}vS}VRa~rY3FDh zS;d;IdFe%mIrnCk0}7xeI9<0d_*Zjvvk+>IGY?Hc4*{8m2*X288Pd-lK1*OH!T#qe z1(^X42VAJGijk7~F46{{Hq|}LKie#&dCgp$f^90u!B(V7I@Sd9t;oXS%{l<7%++v+fgB*-w$%2qnSo2d zGonpnLK|y9hM|{p3856$$!5P`$_awS>PMF>3=OF&B-l8Om-0}z|A9S?LGQOSVm26+ zXF9fCcbQ}R#T>UnbyUL_ zQZMewA-}YlFON;YWAko`CkC<9i?&&GP3p})D~VK&aDhLg^S#f4Rm2$v=SeZI?ycFH z%$L`5-||f-h#4y3xCPF!KLx8FMXV7E!vWg^MtQ)7RP?^N$$Yt=grn;WCNCQsj`$kQ z32QTRAEkMHNXd`TO;Hm7T8o1Tpr_$t^2ke$rFuo_wnD$pp`xJE`^pTA^M)QSG0TIQq+u`tQX zlLr=*3EKy&9@HlIHvQfqm}cOyrQ83T!L$YzLTiw)Kd15bA6T7?E2Sy?<<}-dT}9?d z!2ZoEENKG$$77&xxQ$+=%5QckukE4?rhYk4DgoFG_qF&A2*0g#QeNH;U_nMPaPhYc1Mi}2 z`o1$Q(YHghjj~1{DC7NQjx>G%X|k^cIGX=3C8Kd#z4c*&5eo3K}5th(k3WCH9s>TKc_+tLoM67EMhYD2zC( zj_!kCotnmkTR8ok)Y4_bAZ!V1kf9p{t0J~FtDM74RJefXl z^ncxZT5n?`GSbg)+YO-dI|4}I8Q$?MdpQg3rYc53g+%GB)AjHL_*rR{!JG^teq=J` zstO=N-6LO;w`E4=G~wt69;scSKr5O?weL~h-#3Pj+DeYtPXSz9UK0OV%!&+Sn$bJ_ z-=3&jabhNzsaCkYQygWPeZ!3~aZ%r)^zR8CBzx&Mpa8I+1T>;Lcv#D7ZG=h8}i<_u(&`OwB$L)PvV;mcVJP`hKuPI7h`Kyl;}k{ZF($L}xQAbg^w z;OMwhRCq3-Uqo^7aQ{Gfg$<)-ojqECgU>4(7K;;R_*#M9YM_2LY6Y!NiT^}m>J+FzFAg7rNJJz8N@Y37?IG-(g~T>UZ`I<jY&wB5|Vk2O2q-`^* zFN;h9(x*27RA;E7!+5;AM~Tvo?d?rI>$FM=5JV|f>YzMNV4cYbg3BuHmVb5Lcz+Br z>BK7SheSgV{4c}6XjAIIpxh9*&4Fi~;oDxjj6sk3GZ>qC-Bj``Y$rfZ_XpdTx;r=E zHiZg`rXOd(=@pVUJ3EOzjUn^(3tEYB$6fl<@jG5fKBdtsL<4jA-g?Gn3v?WIf_LMq z^0GeORL$ioNSDtG4B;i*c`L{V3YsS9Ll3fH@rsQ`FZ zfWqR*7;Y&?La4J&ETr>PdG9;D6X`c*2z|hg)y7wRerj@_Tg*LiYzDcYr-r%NTuTu~ z-)u`P`8L3zz2+HeCP%`0?YW^oqc#SwH#rWx7y2aL*x+XO{l+s8ur}L5jUGbfXl)<< zt=;b?82W8%7HKYZPUd5gyX9mW3;y*(DTcjR^ywieT7uG`nsDDr?%s-t?c{(CH^%;y z#|kiV3W|~U9n}D~G9jU{O__=VyRp?q-G3t9PXoTr_DaNzR!RDwU-2q&9E|m#!k@g$ zL%+K!?}PO`)2l1cWpwqMqFuc z)|InQ`EMY?91FfJ29nE|$UQPGS$+diAE>A(=^N^n?xUVjf7T}hEe$79_14oMCi)a< zoz$>0@Q@M0I$TysII*pYMIosxq4RM3qRvp&i-U9jPL=SX$Etm~0tyBnRxTz2S!pdo z-wLA_!874$Jx(zyY>YLS$|o5G@*AGe(#~9DSJ-Kw1Iu=XS|YdP)XMNR)M<^SWe&)4 z(h4DNk?+CUwK#|0s8%K6tlJ}S>Y?IKN@}}ENWI`$?XIyaI=cO!d|)gp2;K7U?3;9* z3q{3qcR_#7hvy_5*fQAta9DdyiSZm6&p==v4z{4!^leW=aq(L3{-C!M zgnrBT?L|w`ut}Ms1o-W4mANd;ZV}9N%KZZd!`@(XX5;ySvu-bgsJFz77ou1y(d5{I zg!BYxM(p|D;uUJz4>v}k91fLbnyd@LFEw|4&IPoPx4(bdS4{PtkJG6g0~ntStU~0< z)E^F9s4vq>ouXc@liC{w6)#mzOz*m%I_lU&04yWR?f0zl0|oECE}VfK=FqcNGmG~) z&9;9dwH6qK9e3W?$a85s%7z>DwZ#9l8Q+{0w3Bf;e;4FpVeEBd5U|vNa7Oaz1IY8) z3Wiv!41HkLB(B8XO?@=)V0vqMY?&_?(M7MD2az=sCG0q@qvWk6=G|JT{DXzp=G%!| zbN&+C3pvpXz_qfViMYg9r-xKdncGmHKz!J&>@eZZ(2>=UVDL~FU>^=-{Q^e-RMBBy zsGnu%#Tohs7!^(CM0KkJGK#4eD8VH%byA-TIBX@G_HNd~tVWtXO*W;wSfGcfLz4N#pW`Xi6 zbEycuLcCpgnRI}53woS>cBTzP=vmdxZkqc|97t*$UN9Sj;Qyk5J<7}O za4n2}klq4q6DxI%-d2f>w3OH{sNF{XvlT{g@MISHcN#nBxq$EbB|`*cMwCLY*gfPs+m8}$zM2>_6UO$87|WqNCjl9w`yT znoXab-on5AD20BjzgSKXu)Y<7EYK~&$5MpeN?ZTgI8P7{^pm%t)^;&pFc>Q{M)@-& zxduR8rT~n$OQV{Q>B|kI8KEWsD7B#}0G7~ge!4hr=_z|~204SWlk3UL6-^(bex?3P z9djz%XWlK2v7iG*o52um^K!uy0~dSi25f6EJJiYHihl}2pWow%m(ZI?o2V9mn|ZoS zK%>$HO>Q@aGk>XteY<*{A_xWWm04HPGngjn(XR&$9v8n2s&p2I6tGzM)NjRz!+G%} zf4>^XLYq@duycZllnMPL-$yZ`(3~JyZl;$Kk}=0lb;P3kQIZMpR!7>&`93XAnclPM zpv-s)?P(_;?rPcgZaXZXQd`FixxiLYnDbJv zQbG7j{B*v=p#M-6VfsR$f?2jCxx)LWspL&+xLcdldG(8i+={u)*JqiJgEi^^@UUnf zm6+C?QN(=L?;Y6(J5r@1^XL{Ae=F9ZB`Z7bf6I`20li($k;b@w_FCK`31vAJdepE9 zwP|{*xlF$0wJlnZgt|b6TIx)>I;S1?&3lvx-n1vUi+uqhp~~coSuGu$p9G+n(aJde zby4<_G8g4uhnc3S%NSEfL$*$0OFPU0`h~UuCYNBXW5Actry9t>RXQK9KGG1^wI{|c zXK5H^Nxx{4&_7Q;^bmFP?pD(oh&VCf?0U9}hC=rQDJGm^WP&0Iw~#aLsOmwL zH=On?b1EtKDFQSO()?|0ZNeL7go?YpN#ZurvtFYrgRnM-JCukU;J9&)hdmEglX zT(GJR!=-#A>%))%Q5Z_aRljg%uD&i|KCcR^Pl;B)(zeK)E6oW5Yg(e9RVjrrQB;e9 zhh*sX+?>NF8rhoC2}TdVNEma207F2$zq%mbc-C+Dp{a>Pq~Da< zjgC*27y+@1_@{+4@{MfU6xei77rt9ms@YAp{Tu@ z?9Wx#>efz`PvaxctuMs0teOlsA8W&~}}_`L`LoV^y0t zN(lavP95tqOB#Y99PFxL0POE-e3iC&uRee22uDfIl!uGW_c zazVi<9sRb_Jw=H>GJyRd7n$&tc>?YeAs;k-@E9z_zn_ne!bDRI82@*4VW8$NAx>BH z1mb`J!fwa8wp^ArHLNj6I!7nv9kh=@;~Nfb8@*)4NVLt#-KTfYA<;&2s)o-i$#+a# zMY~w;R^i+zmTbSj9^M>Ce!%4+}gkN!n4GuO9e6vDiv$0~AbcOoTOSOOdbK}e4#Gg#{; z_}Y!VAQ^Z`NiN^~GjB;Gx=4W(S)&`OcyqH1EEI`04vl7KP~q$=4XgSAIFuON3UsiB zT(;zQa(2oyISRI)svBgu_>qq$As9x2^C|W-u0=i1{h1QcVX^V^!aTp13|7URviVr$ z@jpPjFALb(T0ieSgAQ9Q8-^8*)g_Mmyrwy|Q%ssPo{rv;-QhEj#=5nAleW8=4GXrl z&~@lM{7tTCLxXU#+PQ=C<7o9%b4%X_J&MAWT?DRREcyDJ#cKlxRR}v`rFt{=Rn*Ex zRV4l|UMPQsCzKSB^ftcpn!!c2kOw1Fl~*1;*!*dHRZ0L7S8lnjb12e|CKxi^Iuv^P z)!s-c4ln5bNqCou4nII}v@|pCPVl|Nn1pzW6+~yi0yBrm-*aU!9H;A4Z~; ztU+x6zcwYrrK=hCu!ol&hq&>sNkaULc)0 z=^dJ!5|~b|5SO*wQiUSeei=87YYTm{PHywA`Tx)^I3mrV+9!K$GXAS<&g8O!7$c2{ zxB?|k`NJ72Og#|(-A68*=6;_FAixpTnT87-bgS>2p=qWgwE^lnIK~dhOW137Q8jx& zO8GARQ^L-2U5A)F<{;WY+QS4kj)t6!-%#-2vRuhw7FHIRAe z@<6zWu@?P%5wHwdz%B@Dt1wfHk=KqO?Jbw**0pd_yyJ1`6LR1l{(VaCP#7<-ggwk< z`&Rlp41MOMG8s1xnrcIxff$QP@|OvdkfblU7#_cp6Tg(T_g-s7!`ci-+g1yjhZ^0%{xGxOtZxK=wnPFL{lOtNrv&}0MItWuq(zLNKT%v37$F9kL{9_4mZ$AN zW&RonlN4bOwAyY&BJF_VEcHz)19#DmW-;4|_F3-cv|Vc!`*W5ypgnUHZ^}B$JM}tp z`nqfFiuMp!drN{#Ct<`Bta8K65)^Ni(c&s<5&jIjgP$~sC_{_#9_t$4m-7>2mKgxV ziNo)A02Ay!8@2bdDwUa*pu-u;&sOcm?9~uIF6}?i=U9cL@#U;kMa0n`E+~QMHHQxC zIziHsiKcA8Lv4r;Kwc?RI0rMaT~8Iov#n;=nnhKPiAk8nl(*|tM1PrhdbP9n>d#BT!_3!E<4~U44dekI4qxH&3`gff^z2^Y-ox9*A|*qxfahn89hkxM4CH zVGUvyOaZ^y$3A~0rgDD6Hy+L6FP_Z8KW9IAWjoRiOMa<=Ip9SLJWMgNmLE#aRNx}@Dr(VTBM-P9a8dDL{j=lt$iwY4yPSJTIfk#;-3KN&6a`_|ipI-YDx{l3X~aKPw<)PnD0ppIg@8?2g}H+I+yzwv9xayL@9iiL z`{bm$0>5>0Gq#wEr0hO_oJpUQT_uB}#SdOuNDR^*tB5^u<_JR0d2<4s`VzN5N_ z4Yl8mv2|1+UR+OK=S2ZIkDu0%AsLSnybes86LFwro@jB~D%t?-2QNC2Ksy1{j<7`p zA0#LTu5)DIOn}O)#C?AKN%u3m5+|SP!vUKC33|0(%ID&fRG_Rh8Y&#?pes=fhXGqY z-I^@ydvMS(fn{4BnyOpR_{Vg?HKb1yIg3SB_6Wsr(=u516NS-IA7Wvy4%@CyY9_Un zn;mg^rxJEWrwnRp43T$~doTl^f?sX?b@h4E#1dUWLd}9Sh+jRxe5^c^EiLy8|FK&8 z4TNT1(*k9{FOKStu4jBrH$^0Glv1{-F_peQ<976t&%Qj==S~5A?nYRffSy!ts7dl6yiSxeL}9F|ERxlBN}NgrYsaka36debVU;F1evyO(mi zL+O&71NnYcVE1}ISJ|M^-9MwAEIHhHn^K*XnWB~8#M`CnDa@(!nIZpAMC%RWmMfXv zq;_N4yYUkHiz}gCQCoTNRb5Xa<6jXxNxkz8?l@uRy5Ex+TI;LAtwq{O@cCgN2p|wt zsq6!i3e)w$tkiI`!w^g$E)Nv@_)un}yoH11xF;(A5u%X99RsHQU^n&#zgS$yhzdD>U@!Y}!`FPu7qEZ6|2HE8UeWc-PM!0U!0T>#d(c&jH1V#zo6rFjxsYq~@=U4ribE@e zx$$|qY025hWL$q$i6xV;5@s>b*K}yt9!jTW@(+E#EJwarD~`vQDJAp=Pz_;PA#h+nUSgdd>G9xFk0&Ft!t-{7s?t5hcv8z#@S%sThm6*x z06I=07nn#+kWbv6`$@tt|80`+>ZSWHSNX;oUGQnKBHD(hmr?4a!8@^2VVn-Vtb22o zfOQvTXWtg(8$DvE;`?NaMz41D6=VBsxp=4&yU2&0GtiAA?|Ty-v&+yQf_vp3fsbhY z1X}Zmeg)dxEK*=+IRV_gi$PODi*b8CR(kkxPaoIK_z${LTiBHa=f`_ZErMXyrMd8^ zxN|Y36-5F`tiov*ppdR=U1)@bg_+DB)>$wzB)P|-TNVwJMI@rdaD02E06TE;gx(yu zjJdND_Ep_z3_tyhp(rJ-qp_xr7L141kcVQIvXG|BULOMj)zilPf>wBT4Ab)Lkk#%5 zsq-sNllO-2-*{6PzsK~>DMdcneo@ha%WTbtb}d*iu&_0eL`0KP*-TBd^2tl?xDF-3I(Pbps5)2oMj=Y-BD*%gJXtx8-*9`u0+UKPe_Y{hTyrx#sx0-ZqVn8z=ESa zL}hRGxZ5{CDZeH~9c&f1s> zxM~SP+avX7I8)J*7+gJ#^22Un(J2f@wm%!fduIqVoP6cDpiC@^C&yWeLw!B-J_eop zIw1DJ1q?-xIFb%2Eomh7WND$$>=XvE>vf`z-a^IYL%&o>U?Cy^t>uGPrH{dZSo0l2k|2YJ>DbmK2xgz4iiFC_#Qo0aNYrI|`)v<(lY$;nrPh6a zhZ_2^#L*eGi~K_Bja^H4IAnMLAQdT^RIL*&8EyyhmQV-hZc@uKRXJV4HAnX1N)vsZ zRvbgqOiw%vZaUXN1xYuPAy#pU@k3=5Qr~QiuT7crK?3|WV8&LV|A-wCY_>rL4QVw3 z0^Q?m(C~H=RCJ|rw2Xm0)C-ZKx2nHAtJZ0X8xIn_F>HHyba6yH53hnpTu1-X(9n}~ zNkWV;s0u(?FEZVgho2hk#&?p=+hUbb#XQYATKNR(+BlDC16IampKyN$am5}VLg#Gg z;MlZIO|7{0!Tp~+iCu+k9e$l@wLY!F&{sz2Oq z0o+N?N@cvWlFsBn87#GlqSqq@U2Xk*@Ik|^-2KeSNP^Qm}7M^K%So8Hdy(q!a-6O4u>Xw zU669GT2qal-x(}TlwMVXQH2il%BR7Y8nAT+w;p^5-B@`vaYbs`LzcSaauk4Kg@sv5 z`=g%ERh{|rGojKB`Cu*dd%X8~mU?w9)>%|A&NIK2)})ePgCK(^+hfINsWQoC!FrlY zRP-mshj;vYA9v3Q|`Ngkym(0A5Q#L zpMdK?lz2N9Gf8p}bQ83|tn@g~xJ`2gU@O=yWGyX$f z?KA=FjVPLS|CQa9-ub*457=j3&rrmZAF3g7f;Bmp9~Q@VnFFa;&{5}ro;5dRTX<8| zgTC|CC03dx{zV+ZFU0bCLi`l=fc2H?z`<`I-o3Aou9nVcZJ*s6$l5dQ!~CX+@%lSZ z2~Iz1$@9IF-+p`cxT>;x2q7YvK$Jxg7R>mBTPst*cpfvYHN-oA*3!IpXMLYY!>2k} zzaj8+?1$w2*{PcngA-hM63fhy&S0UC)^x?%vOtfzB=0{yjn-zT=FSFlk6Z+B@$oxf zeN^EBbr2&&*2e*5kng>AuD_mRb9=s{rte@~a(*cOGG9|u(@N^*;ix*+j!#T*|61hG!cW5yP{2CHgJBt+G`y=pv_)^7Nb9+`&56EH$22rM zS6G<1whRRl#Xk= zU2yxO09ljQnqbq`U|A_I#oc-&!Oc*+mxfh+hAswDUbwX+KfO01gP31cQgpU4;${qc z!u*O|bRv}iAE5}q00000DZD*`5U)X`6Xpb zF;JC|*qSTbyAYbZ0(t}q^whl&^bN~l~}E>|!3#?nx2IPDCn1<$UkQjW9w$4fU8XGOUS zgD5;OkqQlWFV1xrdMpCVdXz_l)mZDg$kp}$B@mGp8QJGw)D|%cN`aX9Q|VP%skbA0 z_~BE>8^Gksw%%2vUclmnfOfXZuK6{Pke(`qU87s_hR_19ELjH&_%`eFppVa+D3NLLCqJL8O5w{E6KYgSoads}EF)A%VVg`#7wA zv<}c@QT`7-Vef_|a|Fv!_Y;UMA5EknS{!u=Z43dJ&HbZ`DOX8AJ_o@vW6K0EQ3?I_ zlNK|3o!khgif@}mdT`|BIY%6zcV0hqw)qJiq#Bf$1uRDp1Zjx_L zlVJvZi1jA~JBiQpZ6Z^R0*FC!_{8L*#Yt_$=1(Kuc|Go4sVDqJ=s<+aO(%2t*X! zvKFxZ$>4JGrhQC5FjS{^oC;QY^XfxRY}B?gGvPoV*U#Spu9!m^<#akqW}p~`>`YWT z00CCjJ3XV=uZ4yzvLWr5KrH51>4E_YiRik)LMM;%>`7qhQ09@*RZ6F@513v0 zwT3yBD+fu)mDH1*%V7TNvP}T_u=N!R1W%u%V6v_M4FR#h*;rTm6T!kFsx-bDRt{Rq z5Gh+m!mOzx;Z%(qe~4G%Vd?HkCkzRA97hp=31EM#!m@nfjrCNfKRs>YmAscs#XjUv zB8m&Jmr#pBopiGxeNVGpnrmA|S1k7B29qRiz!Ojq2H^2?J{<=uH-N0R zB|c%p+XV}#b@)-9+>Y);ziQc!(Fy=iW~|^fKgxjvdA#xknxoq~usyBRNa=l1V`v&Y zD7TbTssYAR*d^6OT6HE!lQB<2Qfh9}_F9zQwQ>cl57A~jxWsRn#)IImS+6O~a3Fy> z$~9hkQ7EVDH}MaNov>K|v$%=>CbLHiZimy*jvSfyZPdNig%c0tp!jnAJfF0ZTYdMD zPb3*TwB8VAq#pp3?9c^}t)E?Sy$-;V40bxIMYQ4bm2n6VB`uI^!8FLHauNOJ{dlaL!x+>4zG4@k7cs?{2%R~ zcT{kqp*XYK)%RnYsGJKMHgVgV2!N?3k*1m#-^gHjQ=jQ&4@o`(9)m@=roj{x~ zm3>FZ>JS<-rAQv#G_olisQMk0Jp4!G7~*U`HQ21DgFpxMO4_Mx%mDTgo#pk{l#lsuPND}=IP+r#0xb&|)Y*KQ)o0IihkubJ&N8=t`uGyc#aBZ?DHe-4X0$mpG^X8ix22>ub@9@KRnUS%0&`HP`bOil?){{& zuJeMGetr}E(9L5zRLRUNu=2#DmworA?k@IeiRuOJWDouHMeXw)G4v zz-*#r6~oP*JC(ghO@_U@^jEde_bfh7ht}S&?vU(0<7}w)X76y~xVWiq(vWmSz`{^Y zO3{!CF0xe}heH@FsP!#c5qdDXcX>~g{7b}ulXZ~8%YFBWqT}J0_1b_39AA9k8nF_} zBZPb%@ADj)MXdx11zmlm3ZT8 ze4sy#kQ!YPRNqBu^R|dnI#GvnX#%T~ zCwn(WtMAN(ipeBg$8o-EF_IEQ@MEd`Tgv}%coq!dFpj&jdMY&7C@H@=eU`rq*jG%# z-FDpCvB*?_*L(8I;G}GaPqO;?+Kvy>Mzw9M%rU9v(q{?noQML;Q1V(;o0`n3qg;oH zs6H)4AP>vMLnjkATaM;A1q{_Jy6ctf*I8*$&Rv5zrv4N_I+SJ*+6ipd-qpX+$m|5k7_QT#+qg< zBawc4GG&&GGbJ^7!pP}RHLGB2cj@j8Xe}3&w!WuYR2_vA6U1`ixab^U(^Ocb$-Y85A9U;Qg`zEO}WxBzH~&m;msty(I#Q<0;hz7MH3^_Woqgm;^lvdEJbnylTD<1 zpW^IlSyQ1td_L3R7+$vbrAN5A;I(e&(bms{b1r<6laRAGKIR zFTCM*lE6wKKx?Gnf9OY15OL;Pig3|f_{qgJo}X=0$qD(9oHDK3JN4`m;Wh6m{E)j% zXa*lhdMWd(3;sMVYH7_!%CD+ha%9VbX$=tw`h%_P!UlN|iBMrUz5A0HJu*aX zq)B%L)1BaVbz@bK$m40}eWEcxEmL~bhM+p-}q8)oONb~%^cY#_p^I}sOmWx16Zeau%7u>Ty!WyCxF+If?oae zcVnBqCjE(#tCi581mqFr3j;bU1&TC|3uenPJ@=g$Xjqr0`h;d%RW6 zYfQySDCq^EEg+3b2B!z7CV32kgNUad99uOusA-o1 zdP3BYoYU)QZUbW#bx0d?^@ik_I`|b`7XtvmQBl*6w7OUmTy>M0HT(F+7jfM)=cZBt z*w0<6?&@{7T?4Zm)$@{eS+Dr7MlAPCO%7}6+?%vj02L-gQl(3VE^=Y+oq=;DE-M_R z_h}#bz>FM9_@Yeyy1-O5^=T)ooOK)43)QVC6Isr}TaDWWAHIA|TqBx`VMImkZ&u(O zuw+vW(xWFE7N~U`10e5n;(&K`j&+ch$JW~cbT~$*`NXdWMKw3eH70!SFZ2blEwYI_ z(B#+9zOUL>U$=W#31S-@j?(sR3(X6ybX@&Bv~kO=O2btbuG4zkGCJyKuCnVz3{=US z4f)EO|0l%x@y>axSj;qmje_gfw171(a%%nF7qhk7en7Ab=*OF7z*02T>H1)beGm6} zL`IS|HAxyKkSIm0Mic!mItUjxjm`DSN`pwN%;a616@utP4;?emlqdpHFk^hl-d=-B z+zsFu2;4?(oL~|US08b)805i@rE6{o8DL5eCw!rD=5c&Dhj(c5=sxy5c$scqlgWQ- zUBZA9x`HN~IU_IF+0@P9yk5s)Ky&WcQZn|3D%?KWq;qT?mN=ZV-1mMZy z5$<1@7W#eJ0=E9wFWxyYgS{BvJ7r9K-WC;>c^erHg?wv=1?vvd*aM9ZfQIUsM;#BI zL_QcW&<;HXZff0_aWcB)@C9lIMUCEUyijz@o!i&L?gDUjCCwW%c0{BYQOmp%Y%A5l z**0*|iZ0c?m4J97CjJx`skLa$S-Aowqz^4it|NfL1mhKG=k?mvO|8e1wEi7D0I+FW zS;t>oGWZJX3}BWV8PG_yq2Wz!?L)8F5H)<LIZhjs}Jf<6B;c#?Mf*NWWoseKCLp+TL^#*(%1w4zK9!o9FJ>8s{z(Ajrm zfPw(z0&Zm-*vegh{~$CZ2Qj&)aoGrbu4=;REiT3c(v)KmctwY2g$F+S`6kE|apb7D z(g`=c8FD4$!I>1g*1Te=A&nyLMTu(PGycG%^sw!c1qWS9r{xjviorvU6`1ET-c?os z3;5}7KgVaX-{@=&Wf3eAUnxI_CkIRuGkOy9l)^MHyLL=^+Jlr(ByTy$%*?0y-IqvfcxB{KY)IvU*24 zRO|hadD2$1z#Y6j2aQVSsj4?a+}q;z*+l+u9D5h!Tob+Ct!9#stj3Y(kGZ{WI-Y)E zJpICvjq*SZeeGv^C0Ka}?Ripm{gE;0PU*f*#*CvPs?8K^KhK`&Ygx?f;`3={BF7Xg zr1=EHPs>7D$|;<8y6YFPQXCZPlgNVS$`4@?beV`TI)y)}c!J(|4Wf)g-r7YTJZ-x2 z&O$gC?$UQ{#<_JoC~)tN91Dx;|81_R+@QtgL6Wh+Y~CH^R2Fj>uKV#62VHVii3 z+$M)$WZ%Z{=+w8)IelsWHf2eXz=|`Gdi%Uje<%bZT!q6%%uR?0^-AFla=|GjR?<<0 zUF7yNDpwePOHlv_%k|Q!V-K|ZmDkBvYb&gU{WugQG%u-GkX=Zx;MwiiO>>MV(Vauih~os z50jCy!$FA9fyDuz!i`z$N$mFt_%B%nur>9~>Zkg+%>n&fB;F<0FdllEmmTMqo?sx2tW zZs*qvDS2zNTvL5ng`7m<;Pyv5^((yPsUx}mic+U0mE9ldVBSA5PBpF`d$!6`*Sl@N zL8hP!YFu@z`T+s`F+SkWttv)&l>N!sp;w#3NbWyU??hKVxv-$rXHZxw?5Z^0R)_d2 za`c#)Dx$?y`vy;q{ZhNL|JQCZ9{wri>$zs@uP90+Xec&o2U#-DEk0c1efDK;kXc5g z@Cb-QRFzl{IGRxyZE6SF1bPzp{8+}@t0D4P5+l<4F+lhl6#S%Hozz_=uHy0v6I1x) zkfkO6Y>3c~5|BCKUMa*P3&rR83jJQ{gHpnI)Y0x3LO>|GQe8zw>np_plXH4+SupRz zfFyw5JALmCKpumuQv!J@ar5Bl!%Oa?BN)pEBXzf(iPE(8<|_O7GAe+f>PVj+O|wf8 zj1Q?UO(aAGKuL>8EK6LMT?Um2?qw1fL^Fm;*?bl`-}3;Hyf7 zKu%oMj04+D;P_5u3{VpPK$s}iQ6UtFY2>9=67g$|9}KsJx$g^%wR+CiQ)UKq3%|Bt zlaRCK;NAPfX2IG=gNml54#6Ernx3|2vJ?AXV2lki%T)4&X--$@wB5rgDb9?w^NrAX zCkJ_yCav>c@_u~$DiHnV>j3%fx`P4nXfyOWnaosT8L>|%1V~jpsE|yK5Z&AArMP!# zFXsj932;yJtaHq5OnAi$4RzTi9E3CQf%vFO=>m2p{iNzM-2~gSMB4zOMBsZ2c(CFw z&CG7QewzN1YbT1c@J6~RRBc?1upyyH1|H~vIe{nKv~7!RF+!QF=S7V}hE=~Y{G*e$ z+VfkgsQ`~Bpkr_pmH^W`4eEOXpakj@v(uASQ;SwL4?1M_zb;V{qbL7MPwLF0)Wrt= z(&H9hs|hGHqH@Kpa^b@}JkY%a_ebic>jFW=AJa^C;4oUcL?hQ(a&W_FX!uK-z8^Jk zT01SIOZJ|$ayHeHF)IHM8gkK~9#=c_VCVrv7!ILKyAonY?u0Kx&F5%e(e|#i8C9vI zYjDGBnU0-9Pyr1*INO*LBv<~4O?ZYp92J0|tnQoNpyI7Ho@{uLAMcnp!b*L~OA{ZH z57ZpYnPR^SMDG-u?B}N9Q&xT@({niwFtm-oyM7at-Uy;Q_EBCggyE)cU>ZwM0YdJF zkJl>98ffBD-fE(cf~PRO?f9n@VyaXD7Zs*9Nt%T2I$c^i4j>Yzlu5GA#X)J~@eW6l zZ>8$3OJ@_LD!zfE?O(Cxk~v!siv|sC@j15|{#B3nHzjoSB6;xZ@Y$H}Gd+TzB#xi=+(~Rr(Izqg+0EK*L0@DbmK!EjBKzCI;(SBw0(t z|I{8BUGAoo3QxQY9;9BJz2~;}4$;{7Wd^#{YPK4uTANau&jkyg;91Ut zo7U9-22h@u#+I)bl>9;QC%{eGS>3b=NoB|Pt?eNL+U6Hj{b8#D1u;t4r2?T8s5LZ$ zA6D-#mdx>3v;keMRwE+_?af>LjNlm_!)p*;;j$u)H zR;*&IJc0?DP1$4F?dza0IVF1bRU(7Z7LrGi^z4jl-siNnbHqe;DKYF3(&8Doj6iX>-qIEA+k;g8!_SWs zsXNb{gc^HULF6>e7ar#3d)=^nBw9s^G|ci@XmHy*U!Bnud@vs1ZPqX-OxJKeVk%rU zV+37XSHtbok?&!5nIgsIG!IzlkzgDX_^%pKXONzDi0%d~6aMOxyyZEcF%zc!i#55d zopxI2cGo8qci~P~QH=7^MgG)-kw~{VdFRAOg8zk=hlRN-PAyGF$))m!`x8G2``23d z(twN$718n;J$p#_q^`wXS@VpubAS(O!-zKoaDDjO+=BV1(ML#d{aEb`$T1Qnhdlf1 zNdU}K$AbqzKi_KPLMI>~OF0;1*^_ei1ciH*=Z`pH&7~Q|_Mwhfk|Cuqo39Q&&b9}9 z25+;1#E)Wc)g~-;2Y}>n@xd5k%|_Te7cxQ1pXitJ24kV&+#aEis%|S&{S97xllbcI z&YCW+`h=VF&%dH86s`}ebq)lnLs_3jt9+0d>qj(((0j3S25=YIUlE2glfGO%PKS*V zzNuL7b1zu^Q(3wy%g<@ridaifY(^3M^MylR6bfi;lkpIB+e(N`o?>uT*%}m6Ck4+w z=b0bXc<4qt2j98$BhOMg94Ktzp?eVEKkEa55qtX(I5k1Ht_b*%w?dW|Q8%~5Ne6^? z>?=m@E}6h6AOz%wZ(oi`EY2aM&qXT{$4SqpiZQH~6K3{`4jDb->yWAiDa3WN*N{-gZw#ZRw40*C;Uir|Nj_Uq3*S=D0f8o!X5(_Pc=@Q=Xx*Q=7z3*9cXAue z?e+KO1ql4x-OqF}=>e5l|1GR{@6}29w3JSMZQW+XdX3>??P9m{j#gH4oKz_Nf{)5K z&UL`$^=On@V@MNLpY`te9M(m4uJT{q_2+y){A(JeBbw%e%&d3CKxEmX z1WoNV{;MP9nTS=HRO|jpR^$49R$~31j&Y3^I-pSI42+MGPPeR zXsZEP^M&AJcgKDk_xL68e1Bk?lF8MKQ$4in+9%8?X^z#t6=?p;*m#|6fYM%FuNixb zqbw-)D1G1dxftQc9)5bzn?i`}a}AlioI&Zu3>)N0_men2eN-hi5aNg}8mqi$6J4@c z^Bmtpj^tlQeRPT992jtz-pd4|D>al`puWI)tp9D|1s0$}mIbBu&2dl!5?nntvO=S; zt@xqx*#unQ2*TX3?hq#%zsX@d4x=sM29@zXg=Cr2+3=|0JI+?RnSAL6&a|1Upk$A# zqvz23g(DlO{P`v}rvccH*f5pzr~68Qb?Fc=TG1;qs0sB~v+RIW%mNZBy*rkiXYEn) zT;!5xDvDxXy@C99`(kjCXl zyo#R-Kp;k6tsc_&7nbdTSZcSS;i+okT$K@1DRR-pZb;6&(Hw1AaY7N$);9-u$HN87 z(vcYMdoYVg4z<^wg(!RvEXp2GUn}?Fl_Zs&NC@$<} zV&uY_wyF&Y3miNqSI;tNPtwst+8_N1w@8m1(CK_MIRV}!)~53W3HUYu2iltKGPAGy zQk$CmPAOyu_y*ya91|ck!EDO<;~*zK3usa`a$Yhn1ZGE{G0gdrXd!sWD9P99UC5Y? z+T7u2&?}*>6ilQAU{^VSJ&vtBdMzJa^4N3K9pQa-tAm+J!Rqg?S5+AGg6?6-#t5%R zi0wZtnT*BMW7;lY!7K*BFE)q=4jG=#XkLENyxQKS*b^BFDm}A&1Nnp#MVKUBYrul($-J zz6o>#C@5V%k)CN7oRB4ox)Fn3gQvQ0*f4@RKYe;#(N!?Paekb8b>4!)1J-9rVG%tu z=wI$x2}3;3I-4kETUwS@%pYuV2_t?Zgw{9b)f?A3DPUo^=D`4tadIT9*yzWNye$ry z6XxoTE~ggme5(8d2u@i%pC5haoMv(c>y4}zg?q?1`i`P~oGwL5k8D;7EP=Sck^Ipz z%F;V`H54dcIj+SFB2jdrjY-%t@3h0vjCJ)jhoboLuZF~ z?gGRtvuBfcV|CZ=mH?)>z1q|i4&Z-3lf*7e!U&fT_%5^8j=uRaznzQh%!%(@LMwm% zl0#_yiX;BM5hB8TA>$mNpk4?2^}DK)u(=zGXjb$I{}LaA&y{Gb2QEYczm8NUQ>yC1 z8rSVPjMCc#lAf3kjFf59?iH*vu$V$})r}{AYEAbR*f%<}n^mgm4PZI}<+z^-?FP{B zE~t?a8@6D7d99otFebfxm>PT6U@@{xLiC|o)p*o&HI)edJrH*vbo4binF^pathU_)2r((8Rg?bip#a*H!Stapt-`TvqT5XMy5_iB>z4yxNs+dJ>Vy_oJ~-TGvIB z_r$5^FWg+5(+Vbz~spcFf8SaMg zE4N@%e<))b=sM4pLI>yL5OJb~0=9CtmKfr{9Do24u4=pu%^q~{N@SvN4O3O=+BbCG z;@R_c$?bp(aDF)aqJLYFd7h$W4sh}8O{vOych#_wrl92wi;@g)Tq<^gfTF|!*{8y0 zp}&@CT@@~pWAO#3GPZV}h2pA%?+NA{>R^x9t82y{@ithRh?d3!95%l6DuMlI*`iJ5+Z$Z?~Kqct}Vnjy<1e)hqM!U!OGY+woZ~_f@y)T?0A;1UMZRanztAr2I{t ztLjVPYi^!%|H}ivJ2oMLIZ_V7g=#N)CY4M=^fKt){OMCUF+c-(RPx`9)bk%rj}Dg{H%ejl>Wv}hq3nC zE<@4ij4Yn^wn34V7$h4eWy9-PMAkB49p=>Ll`(Eutm0tkZs((52{YudL@A4M`a15Lh= zvPu|xSmB7B?_-O*0`D1AhT(}NaQhdE+UoDs3_09)pA$k-6_RPxB&)H#pfz0bUVXu} zN$>A533NvkmI!@W$B<(h6E%CjgCfh#nQ*DzFBvJA2A&U2)YhvXM*FIz=?Joue;-%z z`@n0OATNgz;)VLmZcL$c5 zR-xH_Q2WYXvZ-Dq@(J1mooIPjcf@Ponuo)-%zeS3otoy+!$aT=Fa_(zh>mdbaIs|kA^B_>(js5Ni+!HF&C?dy=$&}yl(>vpeT=Yj8ZyK6-QMv*d=Mf|omShkOh{-}8M9%OrqShgd6cMlrYwm;Ib;RTF47 z?}}74e&FbZq(d=pBf8~&eGI!%){mNww*uX-^mjyv%V-@gt!?nB$1T7)ra zqfO#0B6Te7ejOJI`TAkks1WRFi37EOHbwlLkHwuj(px&zFrhz7I7l!s+aa>kO)t1VRdMEgWl7eOAN=^df8OLjUi~eH zE+XSi24dAM};G+_%xD;Hh_d)(ocbuh1s7IYn;z z48{A-Vp^99B)szac+*L{QfewQX=U=D#Jk{2D3}TEE?t8@Q4nlKuyc zw|C+_Ryiaq*JCU~Yt=`#HEelmr-)CAE{Wavvh>Q}zkbYbnju_;Ugh9yd|~u#gmd7c zA5kJ%m>(BBV0WNUEZ__4R4RwAogOtWnTV26GnMe{QCsT<%o|?8HVR|}5WKAjG%V8k zZG7%706{>$zxlMl>#*h;hFWw-zFzR0$EcaiiOz7sP2#&Q?5fvp^PN@udNkN{U!!EX zIym-u(o`r*{7IaK7#9M;Dl13!Zyc`ylNhEgJg&yeL+RO#)Dw5&QTUTknU z6+rLT;ffF1@gsrJcp%Q5S-YOx&s%*lt~RAu=547~G1Hbz;v3V}!b}^VK(@XqmNN04 zHauX9diYfbR7vL|`#)eW?YQl(daWi?v@8T&Sk^(Fu*rr*>?=J5$|n4ZS`!weKXXam z--$NZjv&Vu4);N#LRpXGp?E&93ZOZD`krT|%Vj>}qp$$3x-B&ki-`sd;%`X!P`Rsj zkddcQLu2MdNc)U*EJ_h6z3E=`L8)qs*6sjh>O(Wu#N5I8$I!cr;0y9AW6`|TTr|Q=LHY038d_dum8Y) zn1cjnVEw=)`?TvjnvV)@RhHLRC}MFvBHAtk+H9Bh+DaBgLsUH#vB`dG*25DgAoYM* z2xi%k;Z(9HXiYB+wcwJpU89d;;zm@Iyg&Z+ z)x8@^0g;_C@m0?MCe+%@5lN>|B+jffY&#Ltw$t6q!big<{n0g;+BmYLVit>XFIZh^ z+c)GWLy5UjsYeVkQnH>=q0_|hOSb2o&^kd|O=X*G#8c?zw`CSgsdz|Ks21RWrMe~6 z=7%dn#0f#+-VPl$F%3_2HDdl%Fh1eT|4D3BZ44#f?k2(Is!#eAhc#&tA85$8cJ z1`V26F`hDrA+V7S8~8K@$(7DVzULAznl5OuZKDwRd7h^(ycUg+r>pK?un@yo3TZ8) zDRH3-J)7}G4Ji0rJb|>QWz2ahzQ?xpGp@JA>rN7ht`YE8XduQrX}I={ld6tKJ6*tE z6&2ACgV7p_M61v<$27m)QW8Gk6vqAz_}4Hs(&TZ-5&MDmbPp$kf%>_EQd|fZP3(?E znK9&(PD%CH{;2_v0V25<#|%?TNCD#DPq%sVBW9T-Kl1SU+sls=A5uYtTcFFFv5q*S zPYVmJTeX8*Ms0AmSmem{7c4ZlZN{HDT*;x%*ECE}`-Xyvw10MqASh7R>)DsFA=tF+ zG@@u@am+uNMP4DVssYjpUt8A$+-N`CsDPs@u8gOS#(#m)#7`V;&0?6 z(SUPJNyH)ToDdEaarHmUGV>bSfg2zpx=3xyb>>_bYmHvNKIjo)FhhVwwr_*WO(xqdfbnrx|f*xQ*cBT|kMl^-nP zkN2@C=m%jsuH#uAF`gt&;b8>Ww{siKl0;Z1l>#_TXN29xK%AP87Y>r$_$km8D` zJf8uEdhU%|IORyWOd$@gDCkw|65}W#iX1#FM6j3ZpX79lW;-TEjIS2~MZnYG0dD`g z%|Gj%KK0W|4vLWs5IJM*GS4AO_f|@$wJCQRp6*=HG=Hg(76(|cs2*#nybxIc#5c`7 zi>cSDuV|%CjCo_)+Nu+3E`arxw#^)*f%36zUq7Px_sDZ}vYhJadi~<+% z#}(P1UV&7|z68bad2@*=3Llo_@`^+i$dA!fR)R8I`7mV`? zVmzX&#^HaPz_yR#Lg8~OZhp1^eQp-FUZ>GJ;yKeckCTqMgsqtG0rAq}Uh{W)hL#n- zURB2Ml()#&08wZ`K(=Z5{=pkhYNL#?2>1S_@QY8ys5(u0wO@%E_QU+0L!UZ*DJ7}& zRz`)5WhHP_GJuRIEqs7iV3(RF zAxi9`kj!+(l44~BrHOrQ!3vM9Mt+1!5O{+CM+&^gC5|`*nJ8xT7C6}QJe4v93Ok;j z$GHbQaeFApMzfPxi9E5nCeZ4jz4d3e}{9=~+LOnsNZlb_21hY9hrn9#dR7SKuLz-g=`0#<>nO)j`}e z8WZS891fvn4&sHP+n)|UWF0-JXU%}|5g9#9u>dEsmt~a}LU|;+aC8TA55P#?NioIb z5Rdm0Qab0{#MI7JEt*e-lZEYH-czIDrU!nWQZNM?{AUcrKOAXlWHU^KT5*PHd=d8 zIZ0r1p6O%$66faLrft*+0JX;|_;K>38*Y`V(4A=oOV#sV$GGWQ;{j~lL$zUND&xh# zguflFK+lA*6~R=?^}dJYliA{P5Y~mc=sdX!!FeZHBR6CUM-^G5lFrYwv8H)`w3mVt z3@c43_7mEi(5b+?_0*P55_!{9#Jw+%)m#WX?Q+Y(s(BV|KPEghU1qHdkFARZR-c69 zAy~q%Ji{<|44#jJ>2SCQCpl*rV#^`BGjrvXW1DSiM_gXdo)L(GBZNcz(CGCPEio~D z7ewt>1hU*Hoej!Nw$5})1+WaoI>5jN)1U5i`qaWKvyh)O7>ll%N31~#};Eb;E1hd^N%+SK%`frVWRzeMf3>qRv4w8yXwye`CW>E35MKMCZe8PQC@R zDKC?v{ApQfu1;Hl%W!ENtz<*zRw<}HvjDqDkU&b2qWh~RwH8+6eNEk?a!)*pZhS`( zJ_Y7s>{Pmh9LXmo>0sgbzI{Mxyjfw{kCU_1t|0syD!sMzoIaS-w7@LKs;HL>--cL6 zu~AepyrQiKr8!-5T5P5LRWq5ZN&?u|ZFB4W!5}Htw9^g8jXe^0XZV_432O^Ml3BNb zHF^rm{g5(pOXsOWP;c?i@Ked|3}dH+x}RhMt=+#ce3_tjw*v^YV?$0IJAiOXHcYm9f+A;l1)hz7o%@i};v93Ds+(QR zp(4-6s4NEaFl+4)P}Eb?!FVbnu||J99KJ>HW=L^dLJw|!r#Hxv%crE-h}2?Oqp+Q6V52|v-^Bg?mu*arZq<@ZEz4GwyAcoKIZiwB#?kEpb- zzj^5^Krpwwi>B&XaDu-~V#bQ8ad_P|>%6eNagfrk!N?h=euNf3W2!V&k2c%-WL978 zN4g+sOpEdkrUPDLsz)S#S+pBQ))*ZW$mN0YQNiBgj4iQX=aTeyD%ex6i56e9bf!kA zx3rzG>cLXi($I9wsJEVzgp?Rwfd36IjnUvtK8*BA_B#4-Q%T$75(WRWebEv?Yl)o$ zGKxJsT1CL<{TE;@D(IZgCA7+ab;#)DG{nplQodT1{8wMPXBG!X#C?|VYHVAp9U(E0 z-X;%}3!ANfj~1n^{-TR6QeJ>jFWVA1H#^{QEk_hdijK$f;L*M#{E<^G2Yk|8u4^|* zHxQOA-93~z1Ku`U`DB@N9qa7-UzYAb$%~qnQa^1mz|l_F+o}Nz)@X$(XMLm6E#@|N zoCEAC{jXwuvno?Dgt_*4^)ZNrkOp{q;7LA3wvW`M_b~4*J8FArqHMj#I_4c zM1khWvc=31fJUQlpY9Mnk%So;_3F0pizBGq^p1}K&WWm@Z+EX&V6?={VE+%`gaL>v z(c@t<%!4^I1GKrJi&U(@vAjW9a`_)S_#42~HHQ;oR3t9W`1}}4x56zsu@va@s7bm) zgcKxJ_RNF*?8_V>34V~%o!(8bRYC4EJ}}HaK1}Akjs46}rqfm&-|0@05l|^4sE#5~ zkZ9K5GW$HKfoo|!7jbt34id1k31xu(5(D~N zwmB8*{XkG^Ap&~nY1nDM)JT-%^F*}7UKt2l-b!0%^jcY%`VVi*t+x9o0d(ZW9kSC5 zc6tJ}Ypi4_Xu`!fl@@S|R%z&zxYj>_dAG={=av$(xwWeZX9arf2~aI%U47c6O@3Q` zlCKd-lKM-4JAqeY!1z|0q$^PE6%Bap0*3hDOGfVh1rWRY8xj2wDKAOZJ1`bajDzqe zPeDl_a4I&sFU7IckJ;FCyLRF{!7gZ4?=`-7seVcpi@5fLepISjM=uw_-ZR#x&_qa^ z4gAraXkkNN>>^5#cu}Q(bBD{|5cD&?j)*dxuR>NP^ga+D(JmIxkMM2i+iJGDr<?gInm-4UsH1=8DwxR3Xc0ltW9(Htc`8Nj4r5UV4H;F zl4$vaw~6@TB~-wX9@YVs+R$jPbX>qqLvsPEaOfdjMtE% z3GYpLAL>zo_yg{$_o0z+GpBHc(o}@>J3V%?w@o4KBI!88LYsG#!g!14#}``H85yDT zJ&^IMLY)kGE}}904d}Cy zaa2;00)F6_JC5wC=u`&aOZ*w0F;jj8JIur>XvgnO*t04GJ_LUW-mOrUC@-%jf#D)Y=*7!QtFJiR}FMSP* z$SXt@B8P=HsYW;AIAb~dUzr?0va!7pQv!Q=Yzm8zmg9%QP>gl%lb}|9eQLn)i@^5% zUsE-@q+6z?yT$>kjm1P@hfxEfZfmf%UXRT>t~Ho~1y@N18y$m~uw#7=o&F}du!hU| zp8u>YRK>?@7hQ^LgMyGxEDkjNl5L^8&O^RA&?%lcM@CIS&>C6xJ~rUBj|pDLBEG8d z5D?zcyOWEByh*;agg!pEweh>ssRv&pihcWMgzy4=2c}Pp>Pr3Zp%S_^SZEhs*q0<` z4pA^aU$=Hx5hbEkrXk^~=u_ZMTRgVml698}ByZ%PyU84udx8_P6^U%r|MO#PK8;@hX zQB@CUye3T82tTNMY$P$RLlj<>+bULkong+HbWykD=FBa3`Req-s6R}(z6tB_4+S$Z zYrjTR)w|Q6QU;;Jq=tEk4en!X@?7eSy?;;^olp#-NLnxxUy!hep2i>xcQ?t0 zI4E8Gx{R|ErW?V=rRP0cqt>&SrB@4|uZF4*+XmU)Ctwf3y6RPomRW>l$kCZ^TPzd7 zjuZ9n?}KeCq;?D|#v9cFnUxm!%P9v1Wi|cX_d`=<{~kL%$@#M77o_om@MqX8K)Sck zxMZa7F!+xD3>$IlCbfb|4gcM<1OwH__kH@GuSddy@R;i_gwcu|`2$u2e^wU`%HKFW z(dP_7(0MOag{GMq$bH{Di4Ib|#P1;AM1RhTsj4bn@F;0p$n$oCUldFJS=qmO|1tkcBi=XJfPcEoBI3Y! z@QWa7&ZPO~=j_P5m@Abw@tG@pm6Zk>v^zv&hM1POCKq_`_MQ0!tLW^%k$(J=C3@6A z`!Kpe`q&ql&ScL!RR*RSf3O@Oi2ycRIZ4?3C5sM+8a`0OYm18yKiC3I!X}1c?1ggEFUib-X^(N_u$5+W#&@{;Um0PV2u9salwezj&M+yI^TuCO%eo zGtlvH=4<$o%gw5q>V-rTi}Ce)r3fz^iFq8=_Id0a(s8S9&+_Z?rg#6i@2;rFh<)_@N79_i(@H zquq)6kRpIQGkOu#n@ZsSd47p8R-a7#dC*cP@6wQ6;s#eapZK9{&rLr8ihG>4o*BpQ)Q1U! z>TeH>gL5iLK)RWg*f6ZMW6EJDKt8q0d^<#Jq&fvkUfvznh#DXAhd>6g|J4KBrrL0c zjXO6rRUQ8)EYmz~rO{kT+-IdxjJ~p`(T{U=7*brCl!OzyhO)Iw-jPQmoJT9V;d{PP zt;YpubUdd<>~QDDow0WXMpLRCVvI46?l z^cZY68|0(FV3b!Jd=S!bd^Gty$LQ`bI9o(GwF5<})M*_x2cfk*4@+$L!(s|+wwM>_ z#mvAI_A&7|Cc052p3wPaZbdC=J9a|BM8latvudsx$!@RM$`yr)U){_QeFIkx1>8;{ z)X9tzyd^(AkV{nz4*6{gFLO9a4qT4C?gH8?;O=gtW5b48wci)FLxjqDOzRd|J?PPu zRO!4d?}}e`_BIP59=Qm|SZuhzq)p8%W7{YOWN)bpYpzYlioeV3ac#M7-y*IQV_+?V7O&L*zGiR0K0qb0oc0$ zr98ZoPZ#U^TD@4yfeePtg%iXQw|4$kTs%YU>OEnIVT|4b(OKNiNcx`r&Mjk>!p@-m z$bgs~Q#xLFFQe5C?3wP%M~5&r>M>FiBW2Zr@K55b)Mu&Hlg8IR%q2+2*hs!KG}xOc6CpjvNo zQyuC=)fr&5#A5xyVSze4qP{h#>_;ZJGCXKnJ67#Z8~^2Wqg^p_z|GY+<99i`VD4sc73!_E1ANh(sMg_nLrI6 z?UXZv0SkaX`A+Y!P^1vtp#3bqk?&;xF#v@S9fB8+OClCyxtt>%u6q6!;esBR39~Gv z>uH{i^S_T?AQh*4yQVWK5Pg25&8CE9A=srvZ0@;$0`jEoCvD@^_zEdsu46_dcZ`+0 z9^ClLFHEPu@|$}-KQ5y2RkPQkR}-Yvn;ep=f@4D@Z@ zZR4G@WdRaJehbK+8MP7|5Bxs!eN0y!zs_0aDKG@y=b!Q^ z1+`c+B&g(o&L?~>sCBj$24KiOuAb}FV*JeZ1U;0;&N{iYe>bGYd=kP-_-F^Tb$+HIK6x`qRe|j{P0t&u2SE4t?JG?*@0e*U83f ziLVdiIcGX1I#a|1ktPSyhZp?xgS|o1?26U5#`v~MBZgB|O*+d22q*5^+&x2F8q70c zRPlG=v@1)cd_}Kg$T;oXeaH^42USn3(mf{VsESF0lb6_f(s<6cI2i>(7JsxB3 za`Q~RtA#1rS0nKOdEMH@k5Q^xzBga@cE$@>E%P?I78F{-VO?vl4R3Yg|5HrZHjNWz zgx-FIm;%frfikKM2)T#`bG;3pY^iDEP5Wrjb)_NR~pa?6?aAV_fH9tYBV9 zpp%96|7*b8z=}}JMfgoW0>Tb7!mT}OD8Q~=%TfwE!0{!`clYWmQkMAIJsrQ%#XXzloBA&T#vf{dqaHM z)nSohyQ)V3H^-xM-@Z>a;49f9LKEl#$^u<9FWEGTgMu?&0;wF1dV1M2il0Z^-P9#h z7q^EWSF>g$bqcbQhPE_EPZexi&lgJq0Dt_9o!Sk{Qc=SR0Qw}z%=j91P@$%M{%XO8 z6b+NOolW#r6!{g;u9I^Cv-V$_6bWtSdl7qemd;x*O{;Etlo9P?{lsF}NZ*ZwYR;El++))gZng*Ik2n5>Aw%0{cw&CrtHUm{KyPJfPwzJQ&|t0+5o zdvD~u-iw>wor*N_twf_>zf9*$9CLmH;AL!G&(LzygH1d*?ePK|i30`QGmLHNyPRZvVPJ`6Y3goNYAfSlW(62D-bY z5azhK*-|;d#3SR%oWof*GeIVx&{0}1$qPbu9SxZgTC)6V%pE_g2z44)U^3&|y1GtN z8;DzDKhavz3|N`H!Cmf0zT!{8jaluj-W1!_QPBiUYXeRgMTCajgNwD$ z)1|Eb3UgvtB_;oaM0;Ae6_^kE6KcQ^t*W&SOlIc!xN7VkXdINiqsG8Uf^O>`pq9y?e}s@y!aeEX~{T5pg;^TRoUed zw^k(0@fSLpK2!y*FsXR9g#(*1LF@k~_sIpAKws0~0)+wHUE<&2pu}LIj@o^PqW^A6 zwv+0wlp^;{(GT^KzY~A+;Z_=eIL{)|=E>g|WIEO*zSGKj0K;z?yvkM(HLhN@XB}#8 zQ*d*3Yy)DFFUSZlWD2+I1?wDPe;*BH4eLy8&HY+C|KE6mM-aEcp^xi_%eB%H6-VBD zn#Z(Qxw=q5wB%Pt!Z|<@(7v7bLx*i2AiK-R{dlj2;qP7%r?u0Ilho-iJpx?aZ57}Q zZOd3tweVdMFO7mjbjz8FmDrLzzWU6RH8bw4bNmJkb+^!WKQP zh%n-X3f?hWVd$*UquUuz;eLyU46FZ-{PiDUZ<(sj1?iqiP0EW{9(P{lK5W!^Kvc5i z^i!zDOkksEV?i0TwK`0g`0?p9?H@3-EU;Nr(skM2Q8cDE>02!Y)nJn!IG9XY+Inpz zm|s450Oha>|L$j|lvu_!eq{~|(L|W4eqx_3qCob#gCihVHsllchA+Z|yBm&xS<0{8 zhi*H!AYtN$$ZwYfvxn;O=s6?2(q!)0zY~g82uxL(xe$_tBj{)MkU8)^u;c!w(54TZtBtv1lHQ_a`SaKS{liSjlQe3PDqVkS{ z#9>0Po2AS!kUZUqk;qV!73PZ=!u#Yf|IX2RDk8 zI~{8o_fB2;sZX0KhfoXB>oYTFIPWliD|c5QLVuD|gRC!zf zfhxYbJ_@_Smzc4daBcMnnD>UJgHW;&%|N3c4tr8aTo>G`foKTp(%zf2Zvqy}`Rw&Y zMsjpq3GmA|`SMqrD!E_!Yy3IoMc8APV-lk3MrT68GzLnAuHiH|{OG=DzK~~VSkf}z zOBF%f6$tvDZID_XI+G&%-Txv8xpj_|RvparI`UON^?P%L9#f6*zPEEEx6?lr!p(}A z2RW=A)+yl4d91{!!V$J0M&+dO{=nQthpNP9N(N#1E38c;=B!wJ?12_i+^QH;EL{L! z+bZN{CodEtV4Rs^UjU*#1Yhk*7Vq3kYp583YwP8OI`L_<*5>Y(e7yZM$qb7qd%`J1hv%N)J?a;O=Zz z#G~>mP@WfC1RHYN-T&%Ozik1Z+4aOknXwPc_Yh`aae&|%*6va@#PQaXvuGF1fSlZ9 zL4cQy3XeH^5UbPD>sS3xtb+;LO(N}1$&VAqiBX9O?OJ;pi&~E@!zbx_n=6tCeT)9~ zY3RmprY2KAVg-kUh1aLPz7So*_Ce=5bMoWb4G4LKlhBD(3%bFE zwh;=AXA>9=c27Z&X>t0=;bB=dt>b+M*B4qTnt1S!4j*(qCRj4?%L2a%T6# z206YejxN!1zg^bnrlSUaO4m=)n=PR)RCB})V_Li{!; zCTti}FUSzGTC^9nzy69FH|~9BTQ4D(m->#()vFCYjVA^DG!j>cI7wP%>b=NLpPlF# zk$Hq;z$j;e+Jqo7YE*!lXzL*<>QrQ?>ahe14|>44pLyatAVhwxUlk#~_Fpy|hA z-3=|0JR0kKY~?M~2@Fb9)KS7ED#Lm5#=2!RDem^u1+fJ)D+w$Pmz;t^6d)5H7$r?IQQrIke^fR*oU|y zz2w0{P-1i4ATnc$v6zwZ(HCi{V0l}*yK1hs5EB44DSYSK{T%uC z_L_xIT*st_{BH8cxj(5hOAcC#7}kdSX13Fu>|h%%i1m|e0AueNO&y*-F+(<9G#HLL z{hs0+mFjweBeSGt9jXn{CS8$RwA{w^p~ioivu;cy==bK35&K+tmwV5szl`?d4LDj* z1)bUuqVl;CPW_xSv1PjqAvi-Mo+2_-cu%RYWRc<85W?_$2g_^YK7ZcwksIo_=(4k0 z$kAi48jLFAOfAcUA;f!+vmGXGXAXt@Zwwa7Y|2b0Aca?B0g`{v2BPO?BKD~Zn~26^ zO`j*@u{1xddEGc>8FiLr_So-ZV z_TH|Ynnz`B?&65&<5SfAP@gyT&H%BiCE=l0B`~F0#|Z20n;F`(bS5{MD9I_RLS7z3 z99B0>gw_1PIS4>1WG(O2PA;+)d2R@v6e$B8VZ$)@fGIQp|DA_iqD$zZ z>JPEOmpVXE%RYPp7CikD_;&pNBvCm&1Wr37`QUJIufiP zNP@r*>QzT%52EkhCR#`wK^FyF;h;+mTe-rA#JWE|A|23`m<7~c)%-_Sk)JXDRX=B= z$g$w7dEeKzIgtg`<$p;0o?3%44ztu!G#@F**%P&yazw)lAD=ZcZ4}tLohwDc={>Y*5 zm^g_e#Nf?GCmI%?K!%YlAhfIpS@z~do`ekUhvu@b!jpY22cAsg6IRT8R#?ep6LnUg zX(wQi;Z%e{i%nepqm#|s;R;J?+-Tf`wCJvHZvsx$W2@I%kJLTl+tipp*1JSl{*TS$ zI6H{Nuc1oA#zFvPFd-i0Pl6kqroO_F`|;ym=)jgq{$%^!%Dgo5@ikB#lCNtK=r1-( zy2)MBi@cN72FU7%?H3zoqUk+!fk)KFg`DdCQL%CRj~K^`RRyg)?HmuZ}?`_RvRI>x$#KPfP}q@{pXR85yDQC z8sm#W`}}HhP{=SoVp`+Q)x!}-KUi3KUrD*p@X~I{=T4RF`)e8`yG#)n_1_zT4SJl=R_DXqoMEnAtfMw`3Vj30ma=j~#gNMkFN z!L(Ap4q^UNfeVKeU`Y6J;TJenV^XK?BSz(|vq}AAuh-1=sp1u&c)^$9hyoFdBS|Wi zKa)=avM7OB@$gpA+uCCj1WH3iTbR-)GmQ2lC%1}5QpVJa4s21FvUb5J{FO_GO^%6) z%5MUo+==~{(m){*BGsAU@x6)3M9>@&1?kp-$Q{rn4YCjc?`I%?VZ2-xO%;|EMpm-% z5S!*e7|2F}P`lB}ZKUOEOrI!v^SNR%@U|}O+QZ;p`rj`IgjHxL2f^b?08$q3t9D_C zW+llp887`)k|?*h($m3U;u5oSqIQxz=i}bJ*$k~O-%pJInBQ(=#ByYfde2sN%ixgN z`9W2Fv{|+w(%aD}EygU}WAP+oo05J03ULK>9}S_z&5p1Yp9FPwlV zKU&gbJX184uPP(iEHhsK@Mse(rkDx>%pngflaUfZ{tGvX5G~3fJOs^oYHk`?66Mv> zLP7`+$U;muXd&)>{Q21v5AHv=>cLMDJPaZ7GOVgbmK|^)IpQ#-ueiNOGC=k=yZDdO zhpwqJGr9U0B^F98((npgVRCus(!kE&W52a`Yujj8EWah^aCkEFw{*YI|C^H(Af~`( z^QbB6fs%EoGYz(<{xBk4@cQ0u`r;0dD&!1R$<*MzLzsk1pXmosuSTkmu*bD6%6hhL z17y-YmyCv2a|(hQiWXbIB7B5-79b(`m4H1YBE{m~a z8`IQA$}smmHSgN#xi(aUsEekbtl4$-pd23@oOiEEWI~}|nKbC5pw{f5La%kvich@T z)tqUn^raYU83RhkU;TauPx5tHGlWfizC*Obg*r{*NNMIZZRwCd^BMY>?7!PJ@T^y} z%7aee!871$6Nk<=48eSsG3V%zldB5`E4I;dt?wqed>>9)P%wFMrf*~+iF&>+{5JrN zbNc7U;Q`T(8nF4nV2G#JQAi+;j{y-96nXJGv5J9>TdgLDYA1XfHBKaQ8N>^xN`^Dw zm_*0^d(i?{fV!xzcO=UypoQ?mdSmM2A1)&!7c{4x{&Wa#)vmkCX1|r304D2!pTtC* z=}Z5{lxF93cLvoR1v3=v`>2W3KD~->G)=-|?psFe&`()@coMm*k*Cr+yqPDUmCcxz z1#5*ez$!%6P)bA@x;AblXbJHJG4#;P{g1UlQRo9t}aUcOn=5iggYCUjvk2s?j}xYcY0iP9|pnTGM` z*D2q9uCF>iXw3;xamlXMU4m>EQ_M#)0J&?VlJ+a}Fa8zZ&PJ3YjLiOeodFiU)?@(V z3;O7U*9g60`Noq~RVlD!SjV7Dz}Iob&&E2C(fW>oU$d1Q-MzFJw6p&GNqCWuIFnc_ zxQni}9!Tb|Dz>#y_JvJ!6l6J(W!5W1Cu9$aWWL=NM!_%O!ah@0Khu9fMH6rAqgV#P zSFIDAx7v1P<`$jx-h{jdvK@G3B^xHJyFbX#H(2O*@hu*I96Eod2k}Y^^-N|1- zZPUG@Y!REhq9I;NwYRsrSkrb%l*EVAo?;F^4{g5fSZDf|$Ax{jKp++e5_{mtK|ji^ z@+Xev@x{KX2Tm@U;lY?PhpZ`d zjm(AVJ-}GS5IVCZp*wI7GjAL!`GK4NM3%)V^tCBOC@BSs1bcRVVMy|)v38Gxn`j&k zCmtyDWm%*!PF`pZX@B|iR3=c_3)~Y}irfbHeu!p?Dm@~%r7g{XGxNw7!!~R`o3)@A@upg!(f)G*RzU4BN8)9F72nF7_$8&-UB>EUK0Ah?!e%Gz!cHi7}ug9n_CU2%n(=2Q(Ti}swH@Z=mVi>-TU|84ZM!ACX>_UEA~_dqp?7~_c?+Ek{w^-e4AwH>ukw0oJNRXbLW-gsBVsAGKBXxegi zIHL3pN@Uo-5-AGA;`f)*APyk06febMG^gR!wih*=5tD&i<=pCS;S_&23(2Ik289S;J=xg5Na&8=V?OsXDM;?Df} z;tLC4pTVa$&+Za(RxlOYFbt>aLSkS-zJGC)RoBZ8Yp-rjX(cdVM68dBp=~tM8*}Xf z-fjS27nDLTH=1}7RdeXZiZ~BJDs&jt@<)!EbzykR3syp-L?(536j9KUd#PE9s|zLI zz>Uk}@i`l!UG!^AKXH{QBw1%5IF~}tY;QT##h9X&MAwqI9?Ib2P_O&} zobqraET2(;Qkk;xFQI(IQx7dC=Q%45)rc2e)~x6~Xw>Yn{hH7F`<$JDY0;0|kyS(& zgvmWSNVgVnsAOT^Dh}De#GNrL%1NJUH$KF-0rTwS`eTq9__$}IFwkkRM$wHjshaj*3&?O{|U3PdH|coW;~{a5qK`r>XDlB+I+NbiqmO3%qMZ%&aPowHdcr&6%M zR*)m%VfqNJoCtKcU@$?G*=YgiAIKY(;y$EodMe{W#$g=PL|ta6+~u5@EHb5#wzr{u zuvdCK^5og;+R#OVO4n7t;BPpXY}2QDH1hSUdoE$$91hz4p6dP|ZNtlo${r=YJ@$rq zNpj$tKD zi|yY$9Nruu#oTfQqBoAJ$$kNzI(k0_AtuWXqp7o`2CB zG$*(UyRFTM!=7n>%Yp)Y$#d|mP=s%-yc){7nRptkqX2=FJLmK=Qd;sC}a&BkO9Ptmw>`d8w% zCe=ssMi{?cvW&ID9WiMgH?M#@UHbkMxd18W-{UJMKS8CGA0KT7Xnf`U%?m$r=X<{$ zM?$(Rr4&y)U{K+KH-Ik2%%lFlL&4J(tVXR0&WSO-CIS<_q{(IohKHAd$A1BLZqReQ zw%_PtVO*@8iRt?=80+_`Zr4pAkaU!b=No<6K$wGBf}2DT4f1=Sx`0X*UHTpCN=@N} zn@?>n&5c&0d(rJ7Mlyu+??5a0$PN@$Hs{JQ2i`}eP?x%~5?<^Rc%%E-YU^$Q!bHl0 znX-k4Qkzfs!TRA-St=iM*`-vb1n4Oe9l*!2lx?^aY6HFcMgw&Q``;TgXd?m8GnvwJWWCxtSmyQ7IC@HS6uzio!E`&bWfr9fiu3fSfb1q{IUo0P~VHRd#pa;2^6$bw-u)gq_c1 zi}B)=oOkygeNe6op#=F?3ge1d{(u(f`Ve4AUyXYh3BlQGlXaWIFh!#cEteGqfu*-c zA7!)QMR;yp!u;|dqTy_v*z(hyJ`M^uGG_eWdJzNh?#cz_A90w#cTO8@q+}Ufr!@yQ z-19}md~Ilane8uFX`u~M-s1ormT*D`%1}=z9yEa zb1E1il1?K~Snp0k8gUk>dHNM>wbENc#)vm_oyA1{Bpsmj8n!>7T7k-pH7X5Yqv$E; zFUFJ#^p5fDqxd0jb3?5OZfJ=mdike23?{=O9?=S?`XE_Bm$<${G%wY9UvSLrQLd$H zJG0iYiIbY8-+{%pOt7;XVUK#dD19DYyrP}+slRQ^nkdtf)`F6gOmB)R+;IA-Tsl6+ zDW|KrM>+h?#w!C4IUL{o73VRoLhBED8QXP63Q~sG2JQNxD~j#>86cxqY_{bhGCF1y z>x)Y|Y6_Rsoo3o-ve6Z|5k1=MY)?!dz9aS+@NDL%gb{c*X|&FprxnV95VtNSyQ0i+ zKh^QvsJyY1@(Al1Vu_DeE@eZ|AK8QG%2&!|D3A+~)H;%-C^sgr38EbP-j*kj1&^B; zh+9PzEFWX*Md(Q&+Tiw!+5u0&mjQ**;YmsydV0d>*8Dc)Lr&)^3onOU3@cdT1p@Ou zW|khnNUNM#a>oWxO_dV?fPfoaF07FdiO2wCE#@|uPzY5Dg^#)H(L^Z<^0XLep}m3L zDIjYY-<0DBOd7IZM2ror{yWffsuSpErQbP!bYbY@5C(pFM)~YtLf%Q@7(0^4sa1BQ z$*`_zBCL)mBzzHfkaZjGjMMpY@*=f558WD-tE^|T56sDF4pDOrd6ttRJuq9aL$}+_ z@sx4@UL)S}XBu<7H5q;pA|6``EBGrX)Hm49Cf8a#9J9Wfv|4wy_}vCuoH(SpS|nLc z1)JJA+6uRHZzD&zl0A?*N!}4LZB$Cz>O*8Md(zA4$HM3g6ziZckIsLJ3-N#cmND3kYk*{4X_0XQ@Lhq?$FN zxa_ywGDNrtSpp)w9?Ks-l^cdCK`a&(V)5$o`#d~hMkaW2#+Tz(k$nQfetJq&W%5x> zbx6%H!U>@J)|1F(UxBA(Ju;jY4b>p3XqAw}`%-JwsRW_UMylA*?X0UvJ#mfkP zP}4~E9Yt~i{ZkkGPjUA}sUg-3rMAc4#;PIes% z*6$~E2h^fF`^*tnBPsMT=BUnprX%#`nF&36w7`5`uO><-O=3*!*HU96KrKK84<#10 zcJKX|w5887s9b*?RP@Q)UU5#m+^6p2GCn19xly&FP&jJ_EmK875z6IFm@3!esip+e)TbspxUPW#Ta*b?n^Z2~1a#@v$Uok0_=fiBzgBtXyC&Si zDf@TJ5jUgwVfieH5#Ak8A(oU%vJ51Zc?7^RoJf&gYYdM><;*9HV6#!Ac;|H7x&Wy_ zXk6M#3Td6#9AYkVTTl7X-b)=#$o;{;Ivk(HP&#Krc1K-8P}S0KI8P_!ef}I6ky=1(AlYN`VCmomppKfIQ3-ha_DeS>=k|yXPbAvZM|d*D*PO2ZYf`{yyv_#=7K{Ax zgF=gk-!2EMogEFC5>mm`#Q)owa@btyxp||$daL^n>l7LB1MIoSoTv(VdFZF2^LBOp zuqNNrNW%-Sh)0oK{;WLnv{ZISEk4#%htHOsw^?%OV(R+8heVN;P$rP@RJcKZUb|ka zb?O~ShFJ%c5^L4o*KeagvmQTRP(b_kC<1Ez;~@YsN;wnUe%u`uDu_g3vyE1l`VaB)YTOP zGKv`B;}A)LmQgF7)=E>NL9qt-CZifB<5F*Gw&U^3?(YL7XorxsMi;bPdG?-OQ*wu9 zu_+{_`~xY}z2mr86-}mCZsK}V_MJIJVwU)2cY%Bx#{ z{3fo3VySpYXetdlc}7MlCFzogxx&1h1lueyACJ!HiSxg`BPC29{EkQ9Md)^lT;dYo z5J4iP>8fw|=nTOCUJlRP3xucIyk(IMZD~upHC5^ZdYh(w)$>$|x*E8+Q_nrdA>--0 zTkPfDD5CRVBw9Y;Abs}{C${4BOd#GGLq7%-ge z$mZGt5iYd>m$IA#$8c+dH4Mis=>f6^mg8;1mrx0%oHu7H2h`H-N#K=;WAM;jGySMOZ?&tBV>X3H`4 zuN6y%9NTl;gE+z%c)nW>Lx{ylPIky5;V^-se8*DQkq3=>9|Hu9g#w4FBL5A*BzZH2 z)3jWT`&b@)imZp4i=Bnn2lwjBHf9&0S_t0cUBB$E81EEhm#t9w>x1o`AG^FqLE%0` zk6wE|?9~%4M7*+T7+}!k2e_{vuJ@d}~-5T0XT z@EW{Tz2mYX$!Nb{8y2fxSSRoKirpJB12hBk+MhdLI9EoXvd|+GQWh{$3ScReH-q-a z?1W=L{8Mq^#b<}JYBoMl)cIgfi;1xLLt6?%p-fLYTq)h+!pB+jX%$`pETVQASUx_G zgIopm5L%(s%0j2jAeltRSIjVh+^2G{8n%~M6g>kXkJN_s0QCXRK4a+-(y4+YGzZm5 zOe3rlj{Fe!T7r))kkL$-(Bijf1ME>3>}Dg=Y;KGO*m25NjE_KQsiUD$zRb;l4pKr3 z&`<|6=V3p={Q&tr6cfHz@?uXsd($H;aWK`RE7NV>8wD9JZP@+3v|GRfHTmfgy`I`! z(`0BeW*gvlb^H^(a&Q!5w2liN>lxqoVcN(&LYm|^%;niqJ#5A}kcA)`Ibc&i-P8pF zmtua8g(>==X>=OJQf|=@2hwgFrPeiW!ml-265aO~R-9_Vz5!*UtnkGcF4wavdtk7;seAZ@<9zlf(3zzOB14!p#R{JmV zhN0z+>z(2jiqLe(F@stc9%IK{N>`{r!ryX%X>5n1m$3vu&eTk6)3MsyuWfI1!6M`Y z-zq!iQJcBX2ffk_qS}bqFBsE58yvDR|3P$XEqE=lH_tDS@lJFYK{N<6hM?ab(JHR{ z4D8~^uCC01C>NEg-(s*#?gHFm-0XIFva{KBM4KdOJbzW*D)-kCozTNSpye->X#NmD zsflCt$O6tE!pLd+Pus3~ivxnd)>9}+X{to?N|DX`3n+&{U4LU9Auh>suY+|}{-8t1 ztw{)wAV&6!H@uz?#Vql3bGql@A9`6%%szlcfUF?M>I*V7Nbr+86?4Pfssft@e$P?k z33X(B?2<`Z|DVIF>vgzucP~R?*8+qpGsr-OLS8A)Z&u~($>q^)RcV^bRE#vQ6nz_M zTc;)0k#?${K0NH^VCe;WWspS46wV`gY~bc$8R`%26MGJ-mBoqw0mW8Xulk%miq7)V zMdk>_saViXRO7Vt_DFcCTyG(H#ehcZ{osAKoQ_s{$#h{M`_@nE)H)2@=CWswno_Uw z(A2xh4|^PT47L5pkRf{nMUO4;)sik$5p9}sjeVe<+U$Mkh276mF?Cxazp}rDdJ+Z9 z{ZOhGNLXV7UC7P$o=C1kAX!cB(;!U#1qM^xaqVYbYK4`6t`w?SNDpi$KU{}cpSB?| znkG^sLfMQ5u_X@#`@7k1zsA9Rm3vWewuD_D6LV^h5Z%w*f{;u_hylQ_cSdh_tU$jJ z+t7s)v3HBNiR`Ja0TI)Kn5PVw5y~7BgF_=#{DG+kL#o0Jp(5Z`^U5WOpf)EnT7()e z%-DPRxrcFc(;og={{qvpTHw{|5>b=+-ua;-pC0-t(S$QnjQRXCkMHnRTx@`nnW%cJ z#0A#0I8DF9)5v?(wRA5Z*?dV+oB1lb|Bbm7$~`_dz|G}QS7GGtVn-uF;JbeigoNpH zyEV=Qy0t4xvp_uJ{U?KiMm%O&jOB>eHuI4h4B(kZe!pxJg04NtE_IMWS|08r z!sb1}gFVA4KgUwzJ%9u1?u$=>XB1Oa9)yZy!x35fMJAJM@rK>NqpZnj5@-Q#PV|nL zeiEk)_>_J5E~ro>7+nX~$x|aoV~TcFn_K$G4BKf}5(_*xJELPVs4jIUUz{lU1U#9> z57{MgvIR-b>Zd$#k||nHB-3f8FG0Lm_N_hr%@`J)z1fZirr2mcsER^&P7EYIt@XAc z=#3!s_#hFgIPh)aqm61r7X*5SC?FS16Tqvz@vC@~IcZjlNf|NQjv|gZ$qJwp&XFku zuY-$GmeqmiLeV+nq1tM)(Uf^iHGI=Zy!C~Q2oen(p3fwBIOQ<@Tpnx_+7T-*KU36y zM&5+_{6Cx@fdoTq1K*X13!#({pxebW5CK(1}eCg8(jRDe~R5vNM{#6m5!}F?v z1+Rsw`3He-S)e?EU3Ssw>tpVXgF^y)K@^a&_pi_-vvQS`suy?zLh^Fs5CbTAL0U33 z1|selWZRayx{i9ZlxWfM^7s+wsY`=Amc(2QVK1-Me*ZHb{@NdG7FMJn`CVxO!!gl~>c}x`Ud|~-4kWn@ zTRHBPd@x+CrU0-WaL?zawbxMb@W4!N)5jZAXGc$6tJie2*iEAJ=b-p=0HVwvq5695 zHMFO$<0AMXr7EQnmvbbE5FS7Z*aL)enMz}E}!Ma!L71wAqg)z!wM_HJ98?uWG?v5%I_ytM@-9Xohhc_hGPMKHRc zNr0bmtbMUs4-hb{53&c@xjGRYy?hNsV*e($tDp{X} zbNgija_PmUCSH-#$+6sI25$Q8U@seO{Gd^#^Uc{3ejdZwUktAsh28~vpRr+A-meZH zWG&meRU$uWU%=A-1h)-;s}~=Fcw@7#w^QdZ97F5L&Vd5NpbCd@WoxIMslO>fNn8)V z>MX3$N&1xHsO3(3Ag(&YuNjH)*9e>W4emXIT0gcX=u-Mj_AtKdmniukwGCS8#kd`s z4IZBur^z;UM#>&VK`5;Ggy5d3X-`oUautu<`u z8xb9sX^j=*KnT()!^STz%cPtcx0VG@f*aQ>OTTPW@Kzb3sZ;Y)dy-;oy$0D~-9H2i z%j^=u+l<71NzCuX(Vc(&`^d-qG<-8YzJ#w;1jRTQx?}8PCI_@VnqHq*0jr5BUm;?2 z%ikJh#+cJ`JadEhnZXI0mFobYTEg1LG8e(FXvE+5@32y(l7$D7L+o24iQxwIp)il5 zGj=O0%>IX~ZYmS>`OSudLx7j{yd42|wYv#0uvFtWqnJPd*V_PC*&$}ho0{Nc8(aV2 zz(a*B=Jm^JZuMYQ?dj)YrRJsUM)5^pFN+U+Zsj(qFXyr|e_{ zj9!h1K^Es>XX67KeqvQEhfj&pZhFm5;iV#OQMTt==RS2oTFB|Jy6C*HcAki0L^YO)=u|OqEmd_y$22 zc;O`h^!zGJ|IFUz2#4Vk6*MoxYuB3u0>PszQdJcyd9G$4&Z}$1K27lc+NQ42ZBZU$ zrQ)mUj4MCFNh$iNuu{_m-ewMH;Lytxz2QJ?d|aN>iKLym_WZx$&b-2O_`DezG+la! z)K|p+yK$kmPG`t~R{F{M^@zP_kM47J0SpaAAsnJoYP(V;nAGl&=x}(_=wlXK-4t7) zxu~t;u;oenW2FCJG5XZ2hQ0;&O3QD~hVgUI9;vGSa(r;xJW|(0HKEprs=7mSnylT< zfD`LKag{KmO$vE55(WiIpN1#(Mwz?355+%%2)`9Yr{m>>An&HDm&d>9BGd3LSP*mo)*%MJAxj9t)Iw!Bt_(#br zx_bWtSy8PUbn8j+;3<)P>?LqnOZ~v#Dl<%q;8hm;qK8`5dKWp=?@J7yN-%gIEI}~J zzWNcEQ0F=DID~)8oQ_*31O+`kcnC4wSw|0vFY{~r3i8+-ZFF6|{oS%@0sK}aJ1StGblpxVdPgP@HPD0KNI`d~ zGeSfXOyuOLv*J*t*a1=VR-ouPbus_Z@w+Cx4}M8>uWsTRLLT7Ib;f>WyHSTu$M?*B zPe$6iYYWOzdh9S-JOqwgh~TPjA(D-yfOXu%s_-W?D7!`%iVcPxiMEfnG@Gqnp6h1v zgLuSYl(firh+<`L^aD1JKi1A1E3X1VZx|n4=XOK@izKcn_cpP0R^yTxy1Rl=A)`86 zNt2EMBCNo0a#^xAmtD|UWtekLITZ$nc=d7>HcLb)rys+S=_;d` zfX17pIBAA`7Ea;|gMJNZeuESWZ+X7`&I$?*Y4x6~(Ik`(2jV9#`WgHf@+StuJ}#Es z3x_VSNJP%)q`WjhaoJLzs+lbdTJWhn9M$kl|HuMRk7 zNX9QyZ1_AehkKZO2?)8oH63O=RJ6Nd&MhAwXPwWOEbt1EgHJRj=&xQP4uS9w()$f4XY z=LiHFkreK=0J6s)789!A^AsKSFM z4@Xtzz#4znwCi>*cBcw6iF=N*vgbacjO;D7M*7VH8^?QInNNlsHJi3TzlKX>$B2Q@WHeG^79KRU?B*ifYfj5}v{kjK`7YUu&zzbOPBI*C%X*&^Z#@=ihM=qH$7vezRhNb=-(|yrgWQtWv#=~Dp9O0 zTT4A(Lr4w96ClPtp!cP;sxO3Fk9P=!`)ZOI7<(d;UJ&HS_sXc=q~galn2u3|9=}7P zP5#dUNX}Msih_w>H8v1mW*%K^*5cAp9l}~k(4!`x@v3NB1<(G&)S&W$io7XOoysJz z{9G${SN^;RsG_Qsx2mNsZ7<{dHRpcnM)x(VZCK@~f9mPfF}hr@*mLfUp7Ql*>va?R ziXNOUwgop^-g9P*d#9t5D-Y_Un}9BH$SP5eA-PbZ@e2y0yc3B4r7)OrWvuAvnQf7t zmVWC1iuPLFsTVqQs9RO)G+$LYt&)jFxg87*j^sj-KX~{3jGlrT$%nl1rp>D~3WZ^p zEr}{Xs4+#po*6UhDVp-KIfwscg_C78X8RK7mcwa}-GL2n zCR&QfV{WMyIDQ z)(GkKk`Jl|QVRiTE3(HH@r8>>j&Tr1z=k_@E1rk|uelB3}aPJN^LioV0zutA84|LB`^k*V%%r18@A`3xA3)V_A zyt27HupyynDvj_LLJbY)X=28%Kn1wdLf~V&^OtlpnT?iIXQ3$Q&y58=a^+aEH)A`MA^-B< zKS6VSt!#0t;M^2A9r`Ei-gMHxHPuDxxK4f)m*?(XRC~K#z@GzE8M;@vps?)h&mo5d z+-}801PV+lWz0wOq%2wk%fKDgvI95pn#)=5obIE!n8|Cq-1glZ*Szabpv)>`NSQ=2 z=b4!y$mQ~IwH^ZhAYONK8JJ3eoXHJq4D6A*hN_mRpL-vo!^>Mt&WtAD&-$kjDd1Yo zB_^yht{n)Si&Oyk?)*6Em8|PDweOzi2T#%iaU$m=&0SAY8C|{}b4&&{ped^UAp68D za?E-gxkWi4OplNbc)fsW!RIq5PdLycb&DPQU4G*?A^fY3;^il2QH>eZFUDQ<##VJN z8bdgaQoO@U3!ni_;)P(7yh&VUlRQl&RSdh`k7-1MLwd`Dmw!;n@gfKSIb3 zGwJi}g<|zxEf0Hu@9l;I+Z}YzAcl9^05`M7)kQ+p@Ae^m&J0TB-~7i>zw(SY>FS#S zb|TRXBI!E5#Q;R!O^WMk1i6BfwtKP}GzCO^!l``Wl9uC49p{#U5>n6?rpIjevzMqF zzN|w%0Zm0;RB6SGRFZDhdi4JDC*gJOyK}45>(ue)bzT@=My(FjTO$}Ts{~-Af8?KnpD}jumZU#48#3y>U ze9oAuY=@;5TQfuYksoOuIZ(S->j}1O`VB6mrs`(gfROTF$Yo#mJc>HKggPI4asf@~ z6D8O~fJY^jiqL*p%s)06HXoPI$G30bggtx^d^QWnZ16y2;Rb-fPRb+7HqMan2*o-+ z@zF(j`9ffJgPvF$AqzhLY~QnJb8Ltp<2c%M%Cdu=k5N+T1_V+)8xE*frF^}VKO2&A zN&i6m{r}$7@Fy`q!h|_O*0r?|Nnih>=kR=9O*JvF7ySjHSL%x2zI%e8`}oBIuYQi8 zqg#>Xv9u8I0664lMOc+-z3xa`zAX-8fcejWOY(71{%`%Fxn@o46`{hFqpq; zJ>NY9czzD4Q&Jx#*JwX+Lz29H|FrDRs}l}-yD(}cSl--m$Za_OsFm5&CL2)z6p&Os zIb(yDIAGJ_Tt6?b8-TVQW7q0zts($JOQ_=8G%19Rv#%j*|w-igZ~HP%kI))#RvDudqOaDn->^U47U|7Ah24e*FIkEI3q8 zsCVecJD+;&>6F5vTyx7@x-?$`>M7Jj!(o}YhK&t`K&vuA%y3IY_&tn1FCLajhQWF7 za;R-GcQ}b{dZ#lbw4{NVwp520WNmtY@+So)c}0wdTr=%-Wf5! zr`sPEJR&0Gw%d+Qm#DQ;AUMUK_xL3boCmdxTD}b^)U($7xnxcngMli?^rxYzTU=@G z$LV=<|KOko_E<8BWg}{R9sV*S6=m(8(s#LP6zgHc0F6kC&y>bhBmgUn8%YIOw~U$M zQqoD57MjpYmC0UIK3QH8zqt>*V%k^h?Ek2#22!bZq&KKQ*ZLAAuO6HQ>Zu!H)-}J$lqJMmG_U<*`?wrSg>+-fM2m`V?qG442uUZn ztup3I10{j*TDw=uMhgLckkrII#FK%#6V0*<0`VUITw#LgOh}wn*oUJ#ZUm~U@w)YMtUv5 zPJE}z0(w8-K-y}At3w8krF(B;XtO?vEy0e)LaqWmEBw@P=~ z4IfzV&mrZDV{usQwn34f)eUE5XHGv35tg?O(4mAqShHNj!^E=tN%)htO>(Shi4hHI zV|UM#GGZ`G=0pMlg9Dt-=?*3oJV;}I!T5C~z5!L!CEvvh`@4;91V6pExL-8WQ!o7v z!k8khu$$B%<#)3KdCj&x=fNI;?DKe9S2yc)s}uG1WG&Ti%@sKoor*vq%Ca5; zi2DNQmc(9fgt@(&PHGg3DC+pr9E#49LDsQ3eC+jq=-+{^Ke}B~ry03NvLsQo%HcVK zSt$burt;JXb)X}BE*u7t!4nD-B%OUDDMR5b!t3Dzfgn-Ib%o5~G-MWD5{`iiFNlmr zCxBXhR7|$z4{-=|;?H9z*%i9d-04`aV{ZEvAn7ifr{66}Aw6|egaqVDP7SSF+bbA| z+LD*Rz_1Q2r!-7MM%yd8L~GY1*@bU;$+9NH{uyh<(bDqvuv2pec%&lO^vK1}SG?K& zSxqy*8K}c%{Z+pk0UVCOi6<23Sc|@4uU@_5%xPRCbrcsBOUHW1q%d!%mmVZ zR%hSLnmTdjV}16QF;^`WENe0%b^%N#fnf@4WVv1KZLl3Fc#xSmeJ+<#0R@d>Nsw+y z4vJKDh<^QZJcNtzT%N#d5&ijxLFw^kxo&$>%I#G5l|_OV$*TA8KuM;7xCWIqBoUvIUqeY`5AtX*?q@^T(lXUCnH?t6DW%W!2)C=^E#3!b{+$Xi4F+V6QZS-HDqyq&D~Pm?6DQFN_NKsrL~a(Icc zVGek98vPD^`k{~5T$ z<#9){&?I>dvN~J{4r!iVJ@;9Yz&r;<_KiqQs~rqfF<5Xf3#ea$X@eBcc}Wj z4#Xk~(2fWG*`xoI7ikEr-G~v84+}v%fRAmfN3v_F8G#XNU@BPxxB;s7>Zx!(7dIbE z{sp(Eyg??2*%zuA<1q1+Otbh$es4P7c4+5+n;`n6Sp z!!PuuE~e3m1iqkW-?uTEPi}0i$QtK=BJDa7P69|(;mWJ4BrI+ks&(kn0}8w7fJWz!=@=cXmRCjQT;ZY-*@PUXx(lGekfx^^5GhLA zp4%?_2?DNPCv3Y`d65k^i$06=V>bod6+4;b&F#S~Kje2yLSEB>(yt#kgC!19tJnaCDYK!wGwb_J@h@e)s3^~ttU!4z}f zGF@IhMZZ2et|(O@M4OTBP5Fvm3++Z+<$BQ(+r#@qpTMXg46#{@Vo3DagtgG*Ru6GGHOwsF8G z3dR?V=1Xck=|kg|M(RapUhlhUPGBUykHU)<9ohR@JQr0uHaWl#6Q7IpXL1yNQlrFE ze?GDwVMCkWBzit4W{rSKD?>=3PDoSw$6xt%V$@g+cr}=4OJr28#qXdSbF(3?-`4yU zF7>}uP2DeG-L7yZ>#vt;kvN~Pa7TAL{EdyANJSb&R>AY=0-XtTMsvBL{aXO zJ8J5NS<`-c{;Ov{R(^sUS^@36T=H0;aLTqj9UJYkVME=Yt+sP5xrbMwa_Ke*`THOComgDs7D#*fpYo#d^D6J^A;05&I&s zIy2Jw<7uWD3xw`1ICI=cXKj54u;W7W;_`$M`P!NPRGXGK<_ov$5 zaDD5@pJyLGlL<7ob3*>=l~Kn8mERUOf4n1)8&L$XmIaa@-^m>X!^4ERu< zSAv6v*F~BG!*qVcL97B`?5?rd^Bua&2)mX!qaTAYAklWPcYsp^AM;7JFgBEXfl=59 zp6`=#EaR=Be0{<$8Ak9uH>ap3nb}*YrOzl0EJVnaUUi1TAhpSGw=sdWHm1X@HBU7v z`|^IbwJueM28jMf#Pkq^F*pzQjmtz1=i{_ZjUS-YpuXLnroEyZq8+$SLQzC6681oS zuxx}n7QxX`fD&|JdA~x=L@glj7CqALO{^Rn8@Zix8K}KP|GQwwijx5F1O>B)zHVIV z;_a`n^ZjVW@+-aIa)k;;*0=D^u{A+K4D{k-|A+RkdPUgF)9wdAoqTb@%=dy3R6nb>JCM&ogfZO{T4C)WjQ-3P53CgO=^5m3Er!4~ zT~Q8D$hz5gBHU?L)pbh(Srjs?sKD(B=>h`S{c3g2N&gYic8!G@pY?BA3`F8I>u_Fl zR$?KDd{sLPHp+FAea_-Sl>6$p>Aeu>+2T9(vgc0~;^?nxAn*`a3w!g0neu)Ze*3;4 z9)gW9HIhDG>dzprY3<#!t(={X1dlX%mEjK=K%ZPhgYz+5_H96_4+2FWk(ykb>wBXT zHAOyv#*_4iDrt6(Rr5jrtx$4*%zHqHbAOWLxv~}bcYb_$PPZo~Nm|Z=Yux)8j}?j- z5sDgs24=bz1PXEC+DaC>aqi0v9JF(Scj7cP$!&h*G=|@vi`O^FLk^`l%;4?#q zHzTDlw1ZVqt=!3SF-?;4#;SX9Zv)1DXU*w&oVbFt9l_5^9yu+ttWbhv;;a7J;K@u^ z>&<(Hf(~8F9WdqnB!xX9()&z647veIs&9*%p&_cwgEMYO~Uv9cG_WZ89 zCR-6jVGYE>z>5kYV#)3|Lw;X5Tikk4!=T-cjcBV3MCw$BA~T#N}t(cmvB)9hbt(w zGtpaJWyb^Fb_2>Azx-_O8#lKQ27`sfhUxY<;RlrXn;!p%V$UP{aVG%Mzhie+;nZIjMIv;8YU*A#MdfTFuarfm7SypCD(%Gi?)XV`TGapDnU1 zsK0dXSXSUtI4bZcjl;8i&%ONpgO1A*BQDdfo_e2myB@0htr5-hV5$vZsDIi_lOzFx+c@uw+yoP^$iQ+?)9G4Ox>@A*$rQFPnwlabgt1v7E)Zlgu^^gb%s z8urFL3lhB=Dm~Q>beS8TcI>?R50ig4C&YzD>ICyB4cxOz__hd`1ADzRJ`Zm!rZyrM z`b&#CkA78vu0)TV0U<)UPv~@cjeIlR2BPj{EX7LTJ##FftPWCt-lE)%PL>qJLZ-etUFYbvT<&9DUF@dZXV zNdYZSzZbqXTmtFXr_)-O@4-#tk38nKi07Vm{eR%|MOO&bgCcu3$%tY4n=ZRwCEHX2 z;W2Vi#GBksV%dp@0XWdS-n{{hTDdez09QKv@_CT=d={1DvNpM~Z>c~Z*oLV<2iVpy zKWI+$HpJ~2V5KbxGjFe;phLw5Q5wtqU9Dp|`~u5qnsn=gH8%WxNVJm0FeQfuf4bm5v`{!AZ><&cnLTWcDOhy~n1=fe%zOfoY2XWSz(F zrB;VjZ>_|I%3`LaKP?;YlG)0ZL%T=e3&Lt%mwQ0J+tbL~FYI?sTmNFaIYOaNJJky< zG?%!tgYeWA1INQ2S9Z4Y*_q53N7Z{)5;tJS3pIW)u<%}3qJ6}r097OU8#Y~zo4TZK zbFgjWE(k`+5hwKKTFQbI;|}=1xM=W@*rYNJ2VN)*KMR7Ywfphq`kAB^Xe&FV?s^VJk0421gXzd|`HAg2L`+j@;j$Rw(>|bEe1~0E@Ex zQeDxS){d*SGy;9kk&95H1!oJDJjK2$ONWS=pf2@=VYp9I>EDr1|6~9>Q+T5t($fzG4kJa zLMvSW;CHa9-HvsR*~oPT>9X`K!)e-UBEm`-iO=iVDSZmmdIFwIT2IpYYu0KUop&^3 z@c7&fa)aD_{R+pM>E$~po|yJV<*mmASqR zAST+_)yBpI0%e}M;8^xiwQ~_?LUU-P>_?})Bpl0mocBf`Nb9s#zdV#}k&LV3X8T&O zRJtceBf*4w198O@(XO!>PL%upNthdbS}4FAY<7pIx``nm3=NA4Mgpq8bs2IY(4VgB zE6Nx_T?k|wU3ROyejB%@ll#b4}<96W95ilm4{nD-x{ z0TK|!7%1TVa_Ll1DLvP}Ugt7gn2+?3DQIin=K+NBL-dH#Dp7SO3{ag%iozqHHH zyH;pr4dM-U%$R{;r%HWsl=41_ZCq6YK3fY{?atj2YB0W+M!Uo(bedjf%U(B;;zgU| zDa6DQ))IJ7EiY(W5BzSWeTgkRN!z_B9p99qrkl97#omk(DSG-a>8@&q`*bCwu@sH} z+rdU``5LB?h|-)?^p6ZLZAc>z&UcNbWqJ7Rv~O`IU`nI#_UL??NC`-lrK9}yweLM# zI)kw4MAllFX`3OEf>ZSB30(-R1~oYzyZd+9>bQj?^>3ZXURNz-gnT0UpNaUQ_T+`# zrHg3IOww&c7w`hXWn}l>7A2axQZ+D;lKKsv?`cu)ugl3FuD}f|Aj)5Lj`f7qi!2R4 zA{}mo&EoeLZTQrBphdw}QeNf+Al5(3c8kp%+!&I4*!N{M*)j5pt`C^A&_cfN839w7 zZGu49=@OSJtq*DG4U#L}nd;|1G)Ly9UMsBM3~l&QkQnE8#SG_w!W^!s_&A-_(J7JJ zdbRalz^C{X&v@qR{5m1yStMwIN+kRrnwLDiULu}gns=UKBbEbRyoup;CfPX^E^w~y z0S_PW;C^$C(7(!QzSJ$SJX(zN7qIp1KTNm#@}vfa7dC76F>h4^NpO)A*eAGU60qD=w3;jn`t1))0A&esCal>@qpoV<`B|9c(@ zGzmQO=lQ_e(xd>iUlIbWYmxk>Jw^EXa|v1+AGrbO2;2D3A?DhQ5tMV_)wknMjeOct z{GoX|4v~7rc*(Mi&iG*z?S1Z?^x@W;j5Wt#!Or%TJinrQNnXzA(Iy^GHr)`cguk@0 zDQWP#E1@Bi@>}ev^y_w3cGf}4YpeKN&>?pmD##*h2XjSK7Fe&9)=?w0&U-m%N2jNb zPg(L9H9f|Sx}P3+eJTXFzT)_tlBFmKs&>{}F1y~}QOo~OH)*2zL2K49!&QSTT{-WB z!3iX>f2M(C|CF%8)mp2wL`~w|%(u;2&@FWT#mmU5jN0C#^(OyU(e!BBG^=dN-5D-x zISY_wqV^n}d;(FUI#KzH4S4n5035e(;$Lnzx!^G%;%(du=+l3C#h$M>CFA4iC0BSB z29{+Pv|n!!Xh_$tIn(?*Hc!*C8TIc_V+n`aY0yF;E$ zTG`&aoq%3@Tq!Nz@wZ{ykcly0c+m7kh^sOx4T+Erh3skJrt81PxuA&3XI`yvWwu)*rgQp1~J(QjnwBO!y4Xj_=~BE@XD| z%)eG$Kh@eluh}j66qPQ+u_4zE{W^c3BHWcO7`0XQY(z98G3f^1F1#a`LK*A{&GDY% z7DbTy3F*s*9}IFT`~^_7$|R$Mk?o1?NjX}=%O((CiUq3{nT6I0Y+o1IsBUQ7@0}7S zY7c=s`h;O3r@-R@iD+W*@A~VETA!LTYC@v{do1vctzjldX_Bz!B3IrtFG)lu1Pfr>8 zs+tcKk+(+N6!oeK_TqZK6Jp}5*bf;wZ0-X+gxLnSC3xF|ow1bbhg$eT@zE&(2aqD6 zy&W#uPL0|LNsptoE&pO@4H#mLsA-;GI6rY&%MS{yn`1w7+{=QiUdXB&h?c=7k|Eb`6+3(RVwbu;l8v7=9yaaW zyOt9ecDK%^Lm8BG+-IMk+{VhLff5lxPkrF!t3j543Ha>M73${8TS>EXb?xu}eu|@| z*icmhnc(N1Q_au|Y;pT@NXN@PYSWVST2^JK+5;!~T4)xS_zzjP+NZ=LVxF6@Q2GEN zE)O?$x^!{#$G<$-j*WD-yTSJ|j2!~sqbRD6m^aR>hiQ045(n=zsvi9sAl^yA6Ia<4 z!$&5QW5~#8=Dv??J7ln&cTIK$vshUzO zR6bCLXMeUkK+Z-%AUZb@Vuk3j=jic$D)v?=Kk^SlE~y%1;@XVM;Y=Xv<*Q`;d0Fja zI^PEf@@7^CerT>j{PeQ>K=ku!9~}=W&s>TqB1sfJ6qpO#0K^KZSQ0h0(L0&yh}>H^ zV#>DqnRuv|q@-mJnXf8B2rh`=zW7!ti1tWh|KvK0$70G#-$&NYw*RR8$!hWm*wm6; zIJRL;EG&6un2VII*Hb)mwjgI?BQ--R7;A3A@8;|7pLTCK zpdS8@9&+uUy$O$Z@LJfpy17xAD$^meq5%;9voAn4)xlAcls`N+55wh}CaPxW!A~PO zN5~}fe2>W;J-=~Z@E^Ty(r7+u7+s_A{$n_n2CtC-KMI%)-W0LfFcpTWylD5hRCW z`BkhPVwRiOSb=~iJB<7^gGPbq8{t%*fc~V4I_q3TA*+DFtuC1T?5arVXg|;cir$wr zL#d;tdb?o?p&kEek91jtAN`9{VutK2Oo+|k`8 zr=Rp*b$yKTO~Qud3l zujMwF)x{n}td$2Gs>dg(O3s+Ou}&y5DJ%|NyNq@YpIh+HTc;@_Fa+?kvoPhp`~C!=53BY@mBn@)0d`@2PbB@Av`UR1sYVyr;*S@ zqzFWRUL4kw0}_Gy-A(T)?YCc=%3rPvQp^^Rf1YP(^chuq;j(=g?gVAF@3*ERw@xv9 zFuGq*=OWb-#hKEdU9{C=j-!~4I*6hRR(-Jw{KxQ`y#f^x((^PpV(p+r_O@|HLXF8$ zK7s+$XQ=;ma4OmOi7B~q#!$VU7;i~cxn>q;Ko=pzxyBlWtrG|T$hW_A<8T&rTdALUGmQFO zf(!&h@rN}MXtn!_jTnYEE_y2(w^QJr_Q_7fQ@okUM{Lqd^h7%o>z*;>PW_UAY+wYN zh^$W4#ijvQK+--~Cg3r0UqupTS9xF6St-E{lKLdlK-6kADM_G!i^nb&2;@Jo(`V#e z6ig>X*m~352=mXjWjmfy*c3zVdQ*g`Zrn`PD$!}U^%-GAT$iID02)lP={cipekcR zb{orag>RwP{_|ZDEUI4DukHY5BR&n+SSFs-5HyXmLO;eSwC3Hg@by(J@BMcRtmz@$^5f{BHf`r*i3xs!EX_iW}QouIhIzpwh2LBd8(Dvr;95V8G3_h;6`f!qk6=o zg{i+g!cha+CYa-YGfMODi-052jp-mbNYbowxG@O^1~Ue)8oAjadiunkJXr$nLUH~e z#RV3fz7Jolb2sNEKTJsnI8y;ThX>{y6e?(;-A-KnxSqg#^5Gd&Ts_#|M>_BMSWK4+ zs+*#$l$2y_5r6y?prfZZ+dpjWzG(rpR3a6ZX*Z*?Sf+}(zWg-ZbbL6l935Dy#W}MJXpbK4 zmd2aYd%8#Mqv_;|w5BHA|aP2&3 znr2N-MrYhO@DQxPsd;~X3WNbxgHll)c9zKq52iIKBqrGkD@{L%Sd^=`ed?ZT9{B;y zn{gC#8)hoZ$Ls`_$5$w07dM*6=SKGI*tNT)eR4~K%D#b5g!m&khMLRl|1}5$f)Z#Y zdFQ%q%9(>mX5uk1`JvSMr5vQ}51PThAw33OOzs9frd?&t>HH&1iBSjUnHS2NQd4~sWzdPXyN48r& zN~x<}6QJ>5n4oH2<0w)IcVQ-;*~dafs7{iV)m41w^{GS@H)LR1yb3jDh8dBIYsURl z<#>~^cHDMB&u7PY32=ne_LK4LpL#c;WJz-4-0Tkow%VT{Rx^bq0Mu7b5OzgTO_T~QqVqZnbTX3W8JGXDi z=Dnw5_d8wm35|}d!Kk8iUtvgJ+!UVvn3k5rSv?u}m~wmSTKs{-z}UzmuI385k;%F| zaAp~|mV}xQp28hQ4+atk4R_3GlZ%Ki{DZ30Gaa1=brqsG&YjBb6*^AgQ5o=-z;E=q z)-c<{If=}HZ2ETA=QKaWt+cJOsZFNpmzRY=2b4JVYfve?C0>GSA|;T(dZ&rFVQ{oa zPY1Fz^@KOiASxw9DxZfibE&?O0xfP1cM(R!=s%8R$4r08u+6!NmiMKcWl#T(ZZXCL z{xqPEJ2sg`hNsRc5QWA;Mo6qVQ@hODMi%W!CRV_k4iKJ3xLEZsBog0?^>TyUo3Gfqku01SJOi z^9XnX*Fn~)I9qY@Oy&00tN)JV4i@`NH(@}Q@GZPAn+aH?^Y3RA*eQIc=k^wOtes+y zfKl$i3tzSfkc%{L0TMdH1~b7n+Jyg&=iz3z|B%c66&Q!xX1m9nJ-ybT3-uag7S<1& zgSyBrsIk0`2h#=*PHmkC69~K-kDf?kBa$3nV@iIC2{VV#86J=RQtOrs90QmhMtfWx2^=oTofpIi9z+-e1*X&ew!$Qo z19j~)@1%%_=;75fc>x~n&{8;N&lk^}`i-UKnZnnHGww;RspD@DLwis(#T8yJ>|dV# zaxk>xpq?UScw|kGd^;-izD{xCO7%cFL@>i_G*GwyL(kA#W|Wjy z{Y?{VQa^M%5k~|6g z=028}mvsd@EU;xAn$~$)ww5L^vdlcY=6c6bgv#RcDW*wKIqJSwN3*S)ToAoeeE?c7 zNdQs$#9OBd6OF+uM217xASWr~_NpuZ%2BUolzQeGsYZSXL!NpuUn4yLXx>n31IN6< zZ{7lmtSEnmEvp^%1IDF>cF+7V*tVjV@kmAf&^mkHC1w*02<^`-ogRK5>Z!UK{|mWsV`i?)*wh_@tB^y~j~7tYtl?7l zXGTU1?Bm|cy$lALt=bbJQ~dcmQDJYC`n8>MzXL;zlR(j+KR85e_&$W z62!Tb<_t~DTzCjr+bB^N>**qp{LJwg>$<$2F#iEXa5)U(^2~y%S+p2N6Z^gUs<}Lp zosysCy=g)EkrP0Tlnb+o^EAmI_Ddsk%`L(F-Q{_GuOLTYY=u&olSnTN8wv?K(_4T$vm?nL=fkS5L^ ztE8GOdP8`D$+>Rl0GX=9EWHaJ>z~qK7+wy_=Wg6jha&)*9QGH_{qbZHUbU+=+-zbc zdoQwCOI3I=)29!D(`sJf2Lk>Ji^Fyl5{St;^3{@-$0QPwru=t(cg?UB=k(TGs8(!3 z5u4U@YXhtPu+kg2T~DO3D^x~y!E1aHHwf11XfxPY)y0#V-Jl7t(C~3tbm6#K*bk+C zJ11UlRtvbXEYP4E#dlo1|2(AC^EK(hu-`xxE@-R9gl^V3W%W-A;kRkpoq1C;ow!XW zZz84Os}l;eMXV4uN&wa;Qn*&<7IZ?PTAPXKYKNB`hA(hVw2t4M!i?^Dud91ykH2c4 zkYEo2+}rst0)r}c=J7b7g;nX@Tk}P=C7qjFAJ0vB%ii7@yuiAqN2$_{;DYZ!vxxgp zjlE@x!0gP=LPhU-k_9wR_4`AcpOOL3}EZbP$Vf} z?`wkaY>>x1s^WTwigWDBgf7T=+L^}#E-zP|_)awX`N@G&v@4{d*D#55+(I^O9nFIk zLO2AMj(Qy!LIocM1A~LFR&D0DFOJLOa;G{nBToGXif==-ofGa0(Dz6^!0nNyCye^c zHH@}Hdo8EVZG&2;yum`cf^F74(haAH8w*&ov7!r~I^J<}FFI`Yov(*eTBNJCP7Y(k9Wg;Sf=RKEA!`GdATd$*zhYbTW z67pGWECHlGBGCo4jQ=3wTlX4H>S0mzU*ZoK(~RISHZ!xW0p-we4(*foNse}X^CdMW*2{(3nO8fJWXHDsS(@0IfEGsi)QLF zR(eXDcH2DzZ0ph|H{X90ixRC!Zf!76p9F_&w|)Tr7A_s0mG znT3xm=6$zp;&2bHbRHN;uriH14@aokQZ}Qy1k8VUOi%LkSm>|fQ}FJ#xOolnFsd+P z18goYuIzpm?^+JAgz4x{Egv0(qw@zU0^?A&_y|a5d;xqb>{Yq_#XE6{6GS@7HFvz9 z_xyBsI_h7<8xSncViP}gNXxNC$n+IC)jk;#I`$q%@z@oGh+>Mp^d6u%X1)0=%tW%Q zw+jJ6p(mG7Ab?ko*nH-NEsV%(2y(32^61F3>=o&Z{+U;yLrc93sZO)gaADPgB5hi$ z5+hiBfrHL4Cf6t=dJ6=DHoa>_Ic{oVBw$bWiuAWHgp)4<>LP9aYfxq}ubk?RFy3ue za^xi#jw?CecJS1c4!-MxF_Qn-Eb>=!ay1qKPB3!twA_9f=BOflpk{KaeNWJ>@fPsqbJaDNtui4pkH_OWD0VuWX1!JgC6-jc(2^)75)^#M zg0gSeruB}OhsGsfBhP^IxIdz@b>Mvej2oqO^)gAaC4rtq4qA0Z8g^|o=L^A(?j9ft z7?tpemx*OmE2>6ikXGN6k1fx4)@uQ3uq9}5@5TCYLk)qQ7tP#xMz;tCG1O zk7oO?D){3TNb$f5>d7fVC_z5PIDVKE3bVTAH7LWkAfQiXu4QrhUww)wV1eHj(}ft1 zF(*g_>X=psW>(dU#&H`!sQ9VZLCIx0kk%_5VFt8zJJD*F$JQ1B+yv^!)TSA*Mo5^T z3&`|zpX&c;juh3{c%5bPL1wNed6I|OPeD;5d1dRCsMWL|zPik|rTjzM`qV~(wGrex zvgBG+^=#Nm3-3cW-(^(IV_1a?^u*2<8CeOVRj&S*?^Ov`P@{9p~ z`qHgyt+mwHeyXC`9-;Tm+Np>4*=Zc--xlu~3+3th2R1s%n-ynY&6I&RFBWe`EN5)T z^QIxyYjW^%>)1c$SB|XhU&6#^Ds#vVWRDT8Tg@o>f$^3s?t|pR9FZG4xkZl~-bzZ*VyH$E6&V?G47EF03tmZjr#^ZQvEPKmQgI!G5ZbYTR1$2krH_h?|Xple4TG6O`30Z7^^;sqD}h+Z*m`Fi(XRT|D$968OgN-SZ+WeG#W(n(B@|lYSvf3x4Q{JthcXjx6GS9@-=a}mg4GMH77W{sA+SjP5W8CZL4& zmaDy9ljj0YLC?~mtWshSNQt>VLcGT~kH)6s`8OIbWm9_cq1h58N{8pz=Na4yKQ~sk zUm(ca43?wrd=MGLi(*NIaF%BEw&|>-!7j*{;@H$@m6&<%tDUh_mES>!!L(iqAtF@I za-s)Sf%;^y`0X>Fw^)MG8xL}Ujr9WTJ!kc^o(3%U!v+Tso&+~`YN{=((Rk{|kfpq= zEjgT#-bA7=aIcDGSjZ_?92yD{&O%q5h-+3iOw?feGPpD@w;RlW z*maV;kluOB;Doeuhd6wC!1s%`7G1CciGw)xvj^SZHFzrZtnu$mefT#322{QXI{9ut z?c~Y2x!G6GLg2ifPb1{AUl?GA>@fsYO1s6k&Jw0%Wr1??2c|*Dhl`R!J=rd^Z)#ip z@!h(JS8_@#l<8gD27{#%E18_)B;S_0#7f&;;K4^d9IjhM8dH+5`0_87_5KDA5u!V} zv^b;PYlT5p)YboIY~Q?z>EFK~4CHFMRHEo$-Tq6QB`2EB3ISNCwsc4yX(}-vgjtJ6 zuz@Ulx^wtjSU%`+s>j~|DF-IK@~Ns{hpIW45a=hN^cIwI2!dfvhagOrMF7%TYvs&oz_vBkNo|?YbLwTqkXI{?L9S@ZpeR8g zCda71J4eZZ>&Fqm7vl;Iw=Imjs<2%WPy&p0V`41pJ=GI*gOjZSrhaXvb=R=Byz!h@ zl}P2mHuDzirujxf3<_BfZ8W;8*7-IF_KM-ybh5*`%ePNGnU2+*GmLQM4-_LwISewA z=z{744nS(UazYzQi%`yoQ%jeZE5Bt0N`a)Lkm13ekE%2$<&3{T_)bFt`43>%o(K~; zOKu+dXINRu3?ROBs+fx;BsRDTHa!@136@Rye%3hTO5UYP=$bXdUXG5`HGCKMC7=KR DGzm}W literal 0 HcmV?d00001 diff --git a/apps/marketing/public/llms.txt b/apps/marketing/public/llms.txt new file mode 100644 index 0000000..699a900 --- /dev/null +++ b/apps/marketing/public/llms.txt @@ -0,0 +1,51 @@ +# mobench + +> Source-backed documentation for mobench 0.1.43: build Android and iOS runners, execute ordinary benchmarks on BrowserStack devices, and analyze stable reports or supported local native profiles. + +Canonical documentation: https://docs.mobench.org/ +Source: https://github.com/worldcoin/mobile-bench-rs/tree/v0.1.43 +Pinned release SHA: d1a3176f9144f35e777e83fd07045116144da257 + +## Capability boundary + +- Use the `mobench` executable for release 0.1.43. The published `cargo mobench` wrapper is unsupported. +- Ordinary mobile benchmarks execute through BrowserStack when devices are selected. +- `--local-only` is host preflight and does not measure Android or iOS execution. +- Local native profiling has a separate Android simpleperf and iOS simulator-host capability matrix. +- The release does not define an energy or battery measurement contract. + +## Documentation + +- [Outputs and metrics](https://docs.mobench.org/outputs/): Understand mobench JSON, Markdown, CSV, plots, and optional resource values. +- [Regression comparison](https://docs.mobench.org/regressions/): Compare compatible mobench summaries and gate meaningful slowdowns. +- [Local native profiling](https://docs.mobench.org/profiling/): Capture Android and iOS native stacks and compare profile manifests locally. +- [Basic benchmark crate](https://docs.mobench.org/basic-example/): Follow the minimal SDK example from registration to host and mobile execution. +- [FFI benchmark crate](https://docs.mobench.org/ffi-example/): Expose mobench benchmarks through UniFFI, the native C ABI, or BoltFFI. +- [Installation](https://docs.mobench.org/installation/): Install mobench 0.1.43 and prepare a Rust benchmark crate. +- [Quickstart](https://docs.mobench.org/quickstart/): Register a Rust benchmark, validate it on the host, and run it on a mobile device. +- [Troubleshooting](https://docs.mobench.org/troubleshooting/): Diagnose discovery, toolchain, BrowserStack, result, and profiling failures. +- [mobench documentation](https://docs.mobench.org/): Build, run, and analyze Rust benchmarks on Android and iOS. +- [CLI reference](https://docs.mobench.org/cli/): Find mobench commands and the flags that connect authoring, execution, CI, and profiling. +- [Configuration](https://docs.mobench.org/configuration/): Configure project builds separately from benchmark run and provider settings. +- [Device matrices](https://docs.mobench.org/device-matrices/): Select BrowserStack Android and iOS devices deterministically with tags. +- [Output schemas](https://docs.mobench.org/schemas/): Use the versioned mobench JSON contracts without depending on private implementation details. +- [Compatibility](https://docs.mobench.org/compatibility/): Match Rust, platform tools, devices, and generated runner backends to mobench 0.1.43. +- [Host-side preflight](https://docs.mobench.org/host-preflight/): Validate configuration, discovery, builds, and reports before using mobile devices. +- [BrowserStack device runs](https://docs.mobench.org/browserstack/): Build, upload, run, and fetch Rust benchmarks with BrowserStack App Automate. +- [CI runs](https://docs.mobench.org/ci/): Run repeatable mobile benchmarks and produce stable CI artifacts. +- [Benchmark functions](https://docs.mobench.org/benchmark-functions/): Register discoverable benchmark functions with the mobench SDK. +- [Setup and teardown](https://docs.mobench.org/setup-teardown/): Keep fixture creation, mutation, and cleanup outside measured samples. +- [Benchmark quality](https://docs.mobench.org/benchmark-quality/): Design mobile benchmarks that produce comparable, defensible results. + +## Stable command entry points + +```bash +cargo install mobench --version 0.1.43 +mobench list --crate-path bench-mobile +mobench run --target android --function bench_mobile::checksum --local-only --output target/mobench/preflight.json +mobench run --target android --function bench_mobile::checksum --devices "Google Pixel 7-13.0" --release --fetch --output target/mobench/results.json +mobench ci run --target android --function bench_mobile::checksum --devices "Google Pixel 7-13.0" --release --fetch --output-dir target/mobench/ci +mobench profile run --target android --provider local --backend android-native --function bench_mobile::checksum --output-dir target/mobench/profile +``` + +Full authored documentation: https://docs.mobench.org/llms-full.txt diff --git a/apps/marketing/public/og/landing.png b/apps/marketing/public/og/landing.png new file mode 100644 index 0000000000000000000000000000000000000000..97f1141fc5590025c83ad43174797234d14a4d7c GIT binary patch literal 22248 zcmd43bx@p5(>EF=NC>{Ty9aj&4#90%Jd3-#CSj4_1oz;!z~TOmq_T2M-=#Dk{imK6vm1_Ta%I zPt?cA8t?2##|IA{KTucJmc;>JWsC)Srr7HHye6UsFo;tz@zIen6H(BT9{*aTXQly% zs|m~V@JezNXGh`^V&M^C|Jj>QPmTPwJwruL?&t4B%S4Gsf$ zQh#)?HSg0$5(dCPPeTv920($^_q9I#TY#31lAMAB2?Zep;srJZscOjUf>ar~squ+% zQmzEV>T^hEwF-jiv<>q7a`t*i_ zi}|&(6gdqEF*zXky=PHjGORM^L%84c1e}VMG_lX8qZOK+5i^hInVtG-V5CXUOue%{ zsqP>}K#pr44@yi3v9)`{E90lY&v=hq3@l&yzK+aEMueJdb*o>df05Oj&H1dGqccgNi$Tlm3$xM z@UGG(7Vhrj>ku6o#4W;-6zl&n9%5>ympbg1lo%S>=DIN58yn%}lW!Im7p$(OxcOs@ zPnWF)?qkmnP7#V?`HE2hbvo)DCu9$t{~K}%PbMt~e> zr_3eH#==QIHrw_Cc_h%B74+O5Jix%a`#gM*o=NoJ0o4OV8A)yLxxFl}SNQT>x2M@9 z&TT%;`KS?XObQRi!kDTw=~z_IN*+Gti;&5C!Ui(?fIbGwmouySP~8h4MOaUsS+kAN zHGJjOie^w7FvHc#KD-I!Y4vNZ_432qZxT5lq4aIs4RG}ITzBKC)e;=3{xVN0`up?a zQ6bT=XA9WKUs&)*SfanF*ibQ$^}#S?#a-$Cfz+e-&nUdH0p8!=J)?j;rSSeP2~v3V zpFaPzM#Vrwy?=Dq>YvtN>W5#D1Kp4LpBd<=?gj$iwL%VbKW502C;yr5Z|h)~v-BMe z|Gn$~M(KZM6?pO=f>AO4S;QS}|Be&)_CI9*Gb=U#7yCbb{$E<;|3K-#v)=LiKP&kk z_&1srk|g3b^!askh`NyT(2(K%9HVRSbP+i-EkRepJ5JbQAKw0&2@>HJJ$r-su-EmE zs0!$dT@5dPC{!&t9=RJ;Eh{rYfxh2z!OI=#xPcd=T%)*%;b}fk$h1=2-E&{?w3^F4 zVP}TK@ETfeqbjFS%fq)% z{GwntjDyBti(y$5m6aEH;AFzCc7)^AyH`%PdP0#?XK-Ja5Gg@X$-7~>M>FXA#3kpxx#Rg@aITT!%oJK zvhaZDeE3_4=5jaxrp*d^aB(*CyQ0g)|Db!NLG~LPXZTBFw)(>@`FHuWa(vX4_ebcSE*u)o?iZP zqrQ7i)HX)|41Q2MqPg{6fm-b!0NFG4=-wrl|l2So@RK35+BVSl0 z76bX%l0phic&!iJ;t9>7OnKVmEzkGRB%@$I80tuKqtku8%|ESVE)8ZBC3`8hvh`G# z%)|SwXx6dNVkO@_9(8~mlM<*8Bn{|A{Zy`skC;(dQK*f!H$1$0ipY-n2)h`0`IU;+SkT5N(fiFd(AdQ2 zIV0~<#G_}~tRaOW+!?n)vp5>UwY9t$_*U2frD)~W-y1QAz+wf>2G1bJo{Eb7I3E?V ztW5ITJ(o?Yr9slqe4VQjN4c|h^)$(WQkeDdXwT&clZY#E16&q!V!f5F=n$q~}_J zTD}D$z4iI84PM&-@UES8FRq301%Dedu`Pxs{9MLxAK9OuZhBVf(P7sz zQdJ5&lHYfZf~gt{aW__?vaapX9>sbg7~`Imc%s_jw!bmP>*~)1lArZt!~i{LLgSsMEX1FIKp8U!A@nzFQ_>=G2nA@crQ0;54SO5@+&&EjSKd?DLA1YMEP}m zWu;TUzan{o0gs3!$ds4Dt}tWAADQh5qP#XRiJ?%YSOl>-8n(~n23_0mg=Y^s1Bbtx>HAbMt&8H>>Q^XxHQkNlD z&Cx$htOaFE!Vci+oMgFtBzxPObj2>jS79v}1e61V-*?oO0!^I=xBRiNuzoS1+Qs}V zRA6R^{CV)=^a(h+;I?~^mWAf%3MaRGn>!bCBYSnn-)5zo$@zP;F-RMztxx8~z4KGG zX8y&pTpbP6U>X6{bCY*-ReA6I-D@Jd>QWoj%2#);45STs9U%G44X*#1GnIcgt58%Fr;xu(?N@;G8-)*_Q0i#p)cRMQvUHQrGNVPnmSLk!e&>K*w zC$*gE_x;@yJn*9b_jgWbv}XKqFsa(W;9UB%+Vyf_8mJoy=9bH^s+HdIijsKPRfxV$ zoHI}~fP4gF2Zd4hecoVQ1WXqjh)WBtIC|A^@mZq~=G!+V&=GTrD!=2D&`s-hMndk; zu&?n`X`R_ZNBr(o5FmtxB_OY-IOhBcDM9@bzi5M(g7|TOkE1QyUAiMBGOR0g$#D?M zKoF@d6I+91Lwd*lSB&y7XLCUlx4hww5>)2r+ynpKdYmcYs&wEn@>W?Iby^hhRo;GZKxWaU92r~_!2 zDR0Y2zb+nNd5c4IYll&SUK(eT~=q%6Y+B*tM2<`h7&yi;(Zx`_jTo8>#4# zLB364F#_SlUxH?!Fkh{D+3{_y^7;2L*UjfyLv*DP(+R7(w|?&_yrY8XuvK@A#5D`3 z*?z+)fLR29Uywt9xXWTu#A=l{xch{Nf`RPA`o~RYC{Bu5M2*dMTC{xC))B|}-o9LcS90r)$U1mt+OTJnI=GW>DJ=9%_h^q9-UCSl{mfix#zeB@+B z!=IBBDLU9dasohOT)?BVM~tYfK;iKi-f#IKjnw*{wlPwm)wJ2bxl^_yuuJ!0K^K!G zNNCrpp0HnNHt^7|b5Dw0os_#CLxRE%3nk|LGw_rO*ogi%mNjkK}=p%P57!+ZOSs>fez@?7kaVulakyKBMo6Xf>ar z%S-#YT${qf`LlSu7Dtk7t9PeInP@2_9K+RtdOm754)Vo<-MOD_FgYD|=DE~=tYO~H z7i4FIDy=U5$uP;Bbn|f+y=S5kA%L3~2`C_IxppnI(!sjVe0nL|r_aQ^pTng>QLsd1 z`>y+qR!_A!AR*5&DZC@%PIEH$i90iH(N6HeI>27tq&rJeH=2J%&DSd`=cd>!vl!Lx zjR%Aen-~cM%5c`Nk8T$@0|kQ8dwrr{J=*dhuX|Hi-vfGkb@cttng(et1WR0R5N!y- z)Ah)~S<*=Bw#_!=^R39qC)%!#0KO+=gP7~03Lvy893Thx9mLs)aQ+%-68#19A=1b< z#Jv$2G&Zpq?*6CPraQ|DRdcxqIfQ7e-$tH=P(pr$zD1%U4%}p~{vA(`H%Z_Bmhk|D zSEa+(AiW%v)xS0P06m3uX!KNha}zbvNY0K7k?k=XCgb_`qYXar&dZYFZ%@a+2=4z| zDD;2Ad!)OEPniYxak`|l|84!QmN{Qm}&Y_r89C-L{c$FiASe?sq3?I;c)9dbAD z#eMN#B=-Mrkc&i#|5x$z|AV-9bk!&5py|OKWQRNj-(mKR8+h4<#=|?fjf5`m?>PDQ z`>y!6(scyWMspl;GhI_qyYl({GAYpwC_XMuohB>&Bh?dfA0urVvf^7b(dz{xB}Wp~ zf?E{E1sUXVMvg<~Bb{thiSsa|avF-ebZcBXWvt&iueC-a2V+l6#Etexh;_@i)1{5!ee=@tDt zIEbNR5ex9})UJ6dQnc@s7#*08`1nudaqSZ@fyH9p?cTUQD|&fBLEdx{mU|w|F*)v= zCN{9jsTP+GyocBYqDE#55+Zqe#}{@s$CGpmyZ2AQh1N0OZj-GMeOdc@<(ACCi?QMG z79rbcI%pMdD?S|e(LZa^2X%Ie*?wSxO63M$SI)ra)o076_hMyF9M?hVyGV!btNy zj3gXW1`kYc9)MhYrzP>^rkwrA0x@06zT7AU~Ca|&@nraBMz7QMXo44?knhi%`A zoAITcN{MI+>=2PIrOK7!TuH~a50wNh7z!tY12~c1CZzn9b(7{fIiFhAdlPt(LTIFe z?^e+F5~(xpW&fEmJ4U&)WL4VjPU6ej>Gw$Rjy#@jaWEF&VdGpETM$>P?o;G?yuVL@ zKuXEcg`}aOmy4TZHb8wc0G+7nbot5Qn z5x%RF->(9rld?kYb)v2qnEjKHuAWs;i3!F^SnXsqE8x|g_skgi9!p>`ABsJ;W4<~Q zo?2DDr>E8cL~k-?L)E%7Z93DQ?Z2i=e?N{@F|4GD;|kOX?208UsWzl#bLvH*q(thM z(P~i)c)H@`!Nv5koshpuMhFi(>Y(1%1}2h$*&FC~54Spf+XMHW*+QXDE3xmj=tiju zTF?1xjBa+0@z*33nW4 zy5CG>OZ3R0USh3fi+Ap30rxt_y8+GagPhx%{50B*yk@7t-KHbkq1mO$xixfPbm>Lk z%ZvB-SsEyMP4*BL61ifT*QcTXUAQEuz3<}ru@On%9A^7HV@FZI!w72%&k7g?!rD^$ zj%(SNaGGGbAh!xwAZ@Tb(lSJ@zXgWdcae8&M5e&0Pkm3Y9s%M}iWhjQDo82d&EvZ& z>}189OLAR|ofzLLk-ruFaPFK|eNc`a@5bNR%3vL1);HU>;A@@ybCi3RBouw;Vf1>Z zAv^ST+?wL;oxc1pO(}KfDf_E8k#D2BMcjSgnI`{L`bVk$myZ_tXfREnz(AUZ+TW&^ zh|nTcof&s^fm*uJi8^%3QTw|uDGeXl`%?OB)q&)EYPJ+KR!uu`NTLe5n{24!N7HZf zMRHr@uF7K%NbzI3Sdk zzgPEEZ1U(zq~8|Ch>J=eE@C1Z-jS0FA9v&kMgBz6jfIokU@vEEqda?`g5+fVyua?fq=wU{htBu9nm0?E0FBvNjn5lX`rN zo$O<*nW+|~1o_4S>uLL3{8&1RkE`PsG}irEnPhTx)Sg}G7*I6kde`pv zZ2Ys;Sze(oPq7@YYSiv*TM`Ll;4A%BOB|eOE!yQBd?#a&BD*oINu$rE*()x( zF)yEC%2;J~wYI%w6+nZd_w)ygwE&tbap9$-z%zGWC#UW3@NmnY+*r(&QceoS-~q{R zMIj$(X^Lh!pko1-DltDsGle%bPig!N@t6v7oY7|IPm+^Hol-oROvEi#ySs?jK8yz9 zEb6n1sj(>+n6wGyn|M3bpNWYT%bVw*e*6)DvPh&?1_`egMYG;q!VfM3c1!LyY)LHJaD6F~pEm&UVB)3C}>zu*T=-3Oyp^Bs~Gz_G+;eEM`_6_66`NahD@ zDavXp3B5u(`7;RzJL3=h{_8A06Jk0P3jWeVGL!>~0FNn<-f)i2&~K8XT#Xx6{lwBC z8e+m|>~p*mCe`raT?XAyV;(Yx-atA7;WST@8~7Vo_N4zZ!y;8ca6y~ZNnh_$yGwmbvnjLOZ#|;3gQ?9y^5N4pV zI)!tEC1R~&sm3H!HeT9H{hXUvk^!yK)&n5Nb(y;wQl&?VI+V|L&8lF&B)3fXE{ZDA zLGeUpVkBTo%`)m+4|MftJ<4Y0K)9O6b=<=#d|+T&G6Ar6$CgL9g=@{MwVz(}*8{Ln zqq{Un^N$saRV(brX)1Bx#rqLQu!nB{`ORVM@8`!lE-h)ON`*x@^%_6OB6MPZgR?Y2 zze=NO*eR{ppyUi2yiOMSVFPTqRgJ69dHScCCPAP>of1@5bx+eiUTQ9$p*WtNc}8d< z3+)FLC-YjWt%Pmih;7Hdpke8uuWVy+gzKrz^wsQTjBL&CRYL09gD=MEvI-7!J#{an zK#m;HaZoo5WgeoFXzTgepRqNhP+ym4@+Z*iWn+wPLp-dqEQ`SAY`phsNcIe(3F0iz za_d(BnWQEoYARWB{A8Mz3dAiF>~iB_;!*WfP+*O+SyzZO#_&hZS$b#)t?~oPVU1i> zE_YUx)blywZum7O37FqfK*l7MC;cQ!4QUi;4x*Qz(Yg^AH-p6eCj;H{sn`SvlMQv7 z>|0?REHx=KcFKr(R<`5*8L2L6%Z^!|qIIO-oZ>6L?yuOPY%W?=YPREUHeY0&KBu}6 zLV5FNyY-3|7#+N5na;%kALl}AmEOhEtxKSt5tLb*r)4v!Vv;E_)%&I~>wa@%%r~0# z<+N>Q_9j0LRW`WYiVsqMN(%(7;tdC0Q&g+yTL^8u0y#26V>IPHgjef<6s_pQhPPB& zG7@@<`a6>innT^!V<$&gR~a9z%`mgM5bb0rX9u3xs@-xZ%WjoLz$_DW_;k#5s^8Qa zsRoW(7+UQZBq)dQ<=b?2HO``cX4rw_P8HcNk9U7=`%^p+RJq+!x{@)<%byM>&JX3r zK|DEk`t`wvncyNk5?p|pI(;y1nJ+l~3WSov#8Mo2HhOIKb>_%+l-Xj4cz*NRfnA_c zm@N}#a~>UH^^+$rNvNXi(w*jHYq6zI6|LR`WKT3GE{V##IW{4Y&>TJu5pD#)4+X*9 znQ?zk`A00ld;;6RqDF~VY2>>^VX|GHgveI~R4?D3ryb{a1{WT_>ymO(tG;R_;+_M6 zv^f8);=_r=_y~me*B;YejHic<$~Kn@=~>Z1duV;4u(Vjpl_7jC`Zk(7D>o7PeNkw1 zd6?uuF)b=t|ftB^?{M;7ReXNsyj$$6t`AuQE6 zUotc|_i%gkU74Ltcj-LKx0zvV1hAABiSk)lX2Wj^I}j1 zx$%!z(2#mY!F*JnW7MbMlz&SBi+R;hQ*_+tBXN+0x1$g@I{Ywk&0-{6VvHZH{Ix~L zk#oMQX&7vzuk}sceiuK+VS(eA=iyh(cA1-!Bq@-_;r9cg=4;8({*(dVw^urce?Fn1 zgP%T686TA&_{>R)wu6DzHM!2AR8Q87kgD>Edrj+*n?A??Z!SQ3fxH>G+n8M^BVCKl zM6-xDv9wr2f**6WU~W{*4>F}nBF@|2#Q8xyJIXZZVUGi_L>^U9v-?oU6E+liNK7~@ zPd!fG%l)|4k!jn-6NA5a*Gh9lA>lisZJF&|0X{seqe<@L($;g z2jBiukTV$-KE)hDkLhSWlVIUVV?cS3jLykJF25~lV@b!>IhZ+TD3#OiN`GK8QT<&j zjp9Txlyq!~0*tAyxctD!@Is28o^HMez{6IW|4IoZfk=PhVN?vi;%sQlthV@T0t@r- zimZz~aJg_eHr3Bs12aGVDa$PK;GC+l`eSNU`*4jE z?a%ZA<$9UkH7MQ!_8WNxaLz&#mV*Z6`HWKfT_<7EC}7 zAO8$Q$$)gfxH(`=h4B^1!P5)Q>@c>x)7h%ZGq+{d+M%%YEo}@_BD<#N-H$b;ot9*~ z1=;woUocxf?1RtIYP~Peg6o(H>WFoH?eCI~h7=M-QK9X?7JmCTr>-zl7$h6{vUOg- zO~vPC&h!d?5K@Ku@HYo*T~{b-U6zd<@~MOAt4AqB$o56(vieo2%1lT?x@5+q*>6b>5Jfo2SIw4M z_`reIXlEI&{XkKU=v8Yy9II5hT}s%Z)c>~+P(I=^UhB%*q?^Z+7Oe7f5<<|;QQP-h zoR>le#o}(&ym{S!TMncFWXHF#CTb69q zSoQ&SrBnGmkLJC|Pnndj_<3yXv63K)u`oWfaxpkb1-IO6)gokU3NJZ+n_+P8^8?oE zr6KfkN(`Tm1i-ej63lC!-uc-*%I00(Y!9L?bm&8A11y#C zRYpa0@&qRM^6?Bmm<_UqqlPB2?GOh08Fo0Zd|G6HG^DWe8{YDgFu-lUd>T$*)Sly% zgSS|D5LnBBbjexRN)-k7WeAUzUg81;?BL^}wWp_$G?G6SSrZVxn0f2HhD?AsPr&;$ zX2mv`>16S!*Kf{>BG}Jo)T>a-%vYrf&sT<&D?(rkuRt0rt~0zgs61yg>XOwepw%Ij z<}4zsMi@=hjUhc2d42k?A|Cj*4G?5dC@`^W=rXARA3u$L>4hc-C$ZB3(PmptyKxJo zymYItg%EVT=;GrM%nr=c(XBnsd<3q5F!3C(llx5JCX1TVkJ$DwCsiJx<>M+Aj2COH@y1Lc~7n#ZTY5@1BYhO#UX1k zZfI*7GNyZ7h+~-hm}S`|4mbuEkv4`1VsgL*)&aYj>uI4IXU!0X4wA9j1Y&S~BL_6j zUUsM#kXpL#?v)H{FlguWF^uZB{h&o^%!><{_RUDE7d!!4apa1AE^3@Y?GfNPB}0L` z{xWh~Cyln{r-i;KQli`73zDqY5|wt!fkmBm#JxWKsktMOh+J4;G9s@bL^j9Fm$fBD zn!97BPJ@xN(5Vwv*BC8aQd3;QfklL~NeA|*^EJ`u>UwOwCpIA=8U@Dh3s?x4YCU0l zPPXT01e&Ojb9OJ=t|h^}KpIHx`oV2va2^08seq3Fz-~2hmBTaqJY^3rIcJQCW2;z5 znxhARB0EO~U9puev{eHY9=0$RSCRBUXW60Wi`wfC6fwK@W6PoHhzVx+02rmTH+3-R zfLhtX_0pSG?qTr^p?RK-*p7RL9$40Z5U2^=at7sJ>3$+1Jj4hjfxFs)jSwu;EeVm< zqFs?%gn*po^&=i%phVvY7&F3=l*6f3)a5M7R<~{uj;=+?t4<1M*+?a3p8N2w=&`#4 zK4Nld2-+=XoA>*}iGaT7Zp#QUoMbdwcWZ;crSlM<@RshlRLCBcyrZpD154DX+cIL? zd$|Jr3*8G@nqNJeF%6lFekPH3M;g^O0Yi9?*HT7jG zUl=7Ssd`64lJGyZ=)oH#yd{;KpqJduZJ9|AZ91`unA?2r`2{23!Rq^y@iK`;GCC;GzW(at_G;_zm!8&~R@?{isH{0Q=RDv? z27KF=7pwgtp4GA-N$Oqn2+h2(mu=ehI{dEOcL)eEAqO`-(c$|^=j0jOENvem;#sf1 zG4b4@_>vZ(OBQ{^ueYkQNf}R7eK_Z}WD&9NYXC`__`T*SNnj~I#-mEJ|?Y=#racM6wpT*S_HZ&A)TuTYXr z+YP1G^31ym^v3-r=&jKEyxNiLbPIl);Ff%hzP>-gP}NHZ)dvi@^oP^n7q_bks;nD~4b=fF=TL1p*Ty zU|mCrN$RpYa+hu1I^C`fgRpw6$VK=XeXcNJa;f3k^auFI9;PLJ{9z)7c=;J>wxY7W zD!{Tq3lAqx`8UPuel3p?Y+(G4EE8RqA*o)OqIP|JJI$^Ga8IKp3sCPyDiFYRVR6C? zW;FiPhH@rtwXxrFf_Zw)cPMPPU%}=& z(qD`)ub^HM9^7k@Q*9sI>v(y3iBZ1Y1}h@vOr1^18eV`ZnI>)pzEeE>oHxuF(C1_$ zej!sf_9*XAd_7*5k#8Z{++sSDxG_vw`#JrOpcD6@^#bzo3yv&LQ<_?CC9jN-V_r7` zjo?aE@2XdUGE{7J`!e8uW|!2ILN60fG6jeje7wIBip+XI|lKu%6)sa^ad}qa27X53kh*FIurnpBwP{oIBgLr|t=;vNA?gld3(V z^K5pkQwVEcY3fo7XLJT{qppktn!Tr-?4`a|!U=jS? z6;q@%LIW{5;G_L;U%JeYsj}D* z(ttFr`L5A6nAGHY!c!vQ62fj<_FvtO8L*y=#j+O44SR4jaK2a^;cP^mdx9Fdi2Yk5 z{~8e8MK{6>$Ib5M<-M#|`J;H@ppBQFV`@0%j4=|4jZh%1;umRwE&#wTi$jjbSuEKz z8V;7T>+>(L5yganT~Wd^YRu1W@=ee9p|d_Ket6(4!&=K>Lq*WEC8dv;Bmi;B=mRcn z3rIk>6BDW@Y`ol?HB(&*fel1anyTpP6>ol{Tl+jV7CpRP&n&$9@DmWiw`SH7v*bSbxDn`8NO#3~s15Fm1rJAAYKX^7Q{@*6 z(rMJIWH+ReZP?+hg#AntFR7+svwV`0d-0|6dCRrXlq*i}EIpfJlWi2OS*8ddW0Fb5 z7jvznVWsAId)YouaCP+jTAf>;p+%$7^9?dEF^UVn?)BK*yuO0O#1x6~NHV1assWT`6yG35NSv^rmn*u59Xv_Ra>zum?JoFnqoY#!&$T_o?$n}PEirumJ(5; z*4)af@XG+WQn9#DiRBF@s00;mcKL3yLHItK8+bW3)iB%~@{Y)W44tNQl=Ddj2E*0` z>UBU1%ZVOP)U~(rzjzZ^Kz)UDBdTDRgQ7v$nGwqmTS?H8klf&IJ%$-dZI5b=5@^+2 zZRnGoTa1zx>q($)ubV1vvU^`|ofwJi^b+2<(?#uogibdX=F9`|z)+;$B=?xVC({<1 z1*4@TvsEpu$wf<nu>T)4FFc)qzWm~Kks7g@frOLyQMuDbtlrq|= z1R7Em|B?D`m%4`_stv>K8lSoT%37p*L`fv_6xvyj zD+g-m~dZQhnQS-^v$U`-ZwO=&yNDsP|3L%Oe}yD-Wn0XP6L4}4Cx{c;fxDbPvS zx9UL?QhdEBr}2EQb)WXGYaUFAw|->|d{}%!v=V+}Xf?5jTp{)d=vSvzNJyy`?SRvz zm)3Q|Cr7RIKPCiIj1K039#y&mZC3AQx+%x%z-@RFqmbz`gE@1}Ln+)#6(!fRYs?mZ z+VS57{CQieV+@f(=CF(bkwaf4!a^~|g_IiRMbjv6u9dJVy!@w$Dn7iEWUq1-fB*JB z@M5Q{U+#`(nYGs#?NXs-40Ope%f7~W9ucTWl!h0V%Fk%B=36Ym9S*F0q*=^6ZSY9P zs=#kW(l6g25qkh!(5mI5I3e#8g*7=XcV+rxHTZ~c{V74C6J_$Rk4JwT_r6|gBvJ-( zigzmLOj;GJkd8Dhxf~pvTl&1?YQTOS8L4EJ=_z5FZOIeE%*pJWse@9qzQ727G+h z0XAwS7VWM~(PlVcQ6ChkGPTI*X zXiBw`j;gox_ptxQ#yM~Ry+-4iw2at&u(>%HCTv^3Hwj6ijZh~38%hp= zqtn=RmZ3$G{dxxW5$7z;r3TII`unAD5EC0&V>jp#y*X3AOOtb?hx+O7Iq)Ifc;B*_ zLtvuW)B3)ZJ7z1;^>IC^N^48+OQyfgD)k+7r^KPWhjGqY%t&_SA~P{L;1PC2c@D`{ zEYPM>y3U^DV^I1NBxmoEL%#?@hv}36QR|b>VtUA5to*TG?eKn$df)E_?P9*F^SWG% zTjpqPS?s2wjWBXArI7am3gN=|6dklW<$E^9AiAFpr>7IPoYKf0L=wUAs|&qiyoY}S z>j(@XC=~Q41(KruGusU_I1s`gA2cRQN{zN-vDR!vsgyz|q&`nhudDb~JkhNvrqU*E%0A(Rc7dReGT~Vf-2s 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 literal 0 HcmV?d00001 diff --git a/apps/marketing/public/og/landing.svg b/apps/marketing/public/og/landing.svg new file mode 100644 index 0000000..c22f271 --- /dev/null +++ b/apps/marketing/public/og/landing.svg @@ -0,0 +1 @@ +mmobenchRust benchmarks,measured on mobile.BUILD → BROWSERSTACK → COMPAREMOBILE RUNNER112 ms diff --git a/apps/marketing/public/robots.txt b/apps/marketing/public/robots.txt new file mode 100644 index 0000000..97b7ea2 --- /dev/null +++ b/apps/marketing/public/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +Sitemap: https://mobench.org/sitemap-index.xml diff --git a/apps/marketing/src/layouts/BaseLayout.astro b/apps/marketing/src/layouts/BaseLayout.astro new file mode 100644 index 0000000..45522cd --- /dev/null +++ b/apps/marketing/src/layouts/BaseLayout.astro @@ -0,0 +1,115 @@ +--- +import '../styles/global.css' + +interface Props { + title: string + description: string + canonicalPath?: string + image?: string + imageAlt?: string + noindex?: boolean +} + +const { + title, + description, + canonicalPath = Astro.url.pathname, + image = '/og/landing.png', + imageAlt = 'mobench — Rust benchmarks built for mobile', + noindex = false, +} = Astro.props +const canonical = new URL(canonicalPath, 'https://mobench.org') +const socialImage = new URL(image, 'https://mobench.org') +const structuredData = { + '@context': 'https://schema.org', + '@type': 'SoftwareSourceCode', + name: 'mobench', + description, + url: canonical.href, + codeRepository: 'https://github.com/worldcoin/mobile-bench-rs', + programmingLanguage: 'Rust', + runtimePlatform: ['Android', 'iOS'], + license: 'https://opensource.org/license/mit', +} +--- + + + + + + + + + + {noindex && } + + + + + + + + + + + + + + {title} + + + + + diff --git a/apps/marketing/src/pages/404.astro b/apps/marketing/src/pages/404.astro new file mode 100644 index 0000000..da558d8 --- /dev/null +++ b/apps/marketing/src/pages/404.astro @@ -0,0 +1,13 @@ +--- +import BaseLayout from '../layouts/BaseLayout.astro' +--- + + +

+ mmobench +

404 / route missing

This path did not finish the run.

The page may have moved to the canonical documentation host.

+
+ + diff --git a/apps/marketing/src/pages/index.astro b/apps/marketing/src/pages/index.astro new file mode 100644 index 0000000..b552a26 --- /dev/null +++ b/apps/marketing/src/pages/index.astro @@ -0,0 +1,301 @@ +--- +import BaseLayout from '../layouts/BaseLayout.astro' +import { site } from '@mobench/site-config' +import manifest from '@mobench/truth/manifest' + +const docs = { + quickstart: `${site.docsUrl}/quickstart/`, + browserstack: `${site.docsUrl}/browserstack/`, + profiling: `${site.docsUrl}/profiling/`, + authoring: `${site.docsUrl}/benchmark-functions/`, +} + +type CapabilityStatus = 'supported' | 'preview' | 'planned' | 'unsupported' + +const capabilityContracts = new Map(manifest.capabilities.map((capability) => [capability.id, capability])) +const capabilityRows = [ + { capability: 'Build an Android benchmark runner', mode: 'Local toolchain', ids: ['benchmark.build.android'] }, + { capability: 'Build an iOS benchmark runner', mode: 'macOS + Xcode', ids: ['benchmark.build.ios'] }, + { capability: 'Run ordinary mobile benchmarks', mode: 'BrowserStack App Automate', ids: ['benchmark.execute.browserstack.android', 'benchmark.execute.browserstack.ios'] }, + { capability: 'Capture native profiles', mode: 'Local Android or iOS tooling', ids: ['profile.local.android-native', 'profile.local.ios-instruments'] }, + { capability: 'Run ordinary benchmarks on a local device', mode: 'Attached device / emulator / simulator', ids: ['benchmark.execute.attached-device', 'benchmark.execute.android-emulator', 'benchmark.execute.ios-simulator'] }, + { capability: 'Use --local-only for mobile timing', mode: 'Host preflight only', ids: ['benchmark.execute.local-only'] }, +] as const + +const capabilities = capabilityRows.map((row) => { + const contracts = row.ids.map((id) => { + const contract = capabilityContracts.get(id) + if (!contract) throw new Error(`Pinned manifest is missing capability ${id}`) + return contract + }) + const statuses = new Set(contracts.map((contract) => contract.status)) + if (statuses.size !== 1) throw new Error(`Capability row has mixed statuses: ${row.ids.join(', ')}`) + const tone = contracts[0].status as CapabilityStatus + return { + ...row, + status: tone[0].toUpperCase() + tone.slice(1), + tone, + evidenceIds: [...new Set(contracts.flatMap((contract) => contract.evidence_ids))], + } +}) + +const fixtureRows = [ + { device: 'Google Pixel 8 · Android 14', benchmark: 'bench_fibonacci', median: 100, p95: 105, width: 71 }, + { device: 'Google Pixel 8 · Android 14', benchmark: 'bench_checksum', median: 145, p95: 151, width: 100 }, + { device: 'Galaxy S23 · Android 14', benchmark: 'bench_fibonacci', median: 94, p95: 98, width: 66 }, + { device: 'Galaxy S23 · Android 14', benchmark: 'bench_checksum', median: 136, p95: 140, width: 93 }, +] + +const faq = [ + ['Does mobench run benchmarks on my attached phone?', `Not for ordinary benchmark runs in v${site.crateVersion}. A normal run either builds artifacts or executes through BrowserStack when devices are selected. Local native profiling is a separate, narrower path.`], + ['What does --local-only do?', 'It skips mobile builds and writes host-side preflight/spec output without executing the requested benchmark. It is useful for checking discovery and report shape, but it is not a mobile performance measurement.'], + ['Why do the examples use mobench instead of cargo mobench?', `The v${site.crateVersion} Cargo wrapper forwards an injected argument and can fail. Use the mobench executable until a tested upstream release fixes the wrapper.`], + ['Do I have to write a mobile application?', 'No. You annotate Rust functions and mobench generates runner projects. Android and iOS still require their platform toolchains and targets.'], + ['What gets written after a CI run?', 'The stable CI output directory contains summary.json, summary.md, and results.csv. Optional fetched BrowserStack artifacts and profiling outputs live in their own directories.'], +] +--- + + + + +
+
+
+

Stable release {site.release}

+

Rust benchmarks, measured on mobile.

+

mobench turns annotated Rust functions into Android and iOS runners, executes ordinary benchmarks on BrowserStack devices, and writes reviewable CI results.

+

Current stable: local ordinary runs are build and host-preflight only. Local native profiling is supported separately.

+ +
+ cargo install mobench --version {site.crateVersion} + +
+
+ +
+ + + + + + +

Fixture-shaped output · remote Android execution

+
+
+ +
+
+

Designed around the tools mobile Rust teams already ship with

+
    +
  • Rust 1.85+
  • Android NDK
  • Xcode
  • BrowserStack
  • JSON · CSV · Markdown
  • +
+
+
+ +
+
+

Capability truth

Know exactly where the work runs.

+

mobench has three distinct paths today: mobile artifact builds, hosted ordinary benchmark execution, and local native profiling. Treating those as one “local run” hides important differences.

+
+
+ + + + + {capabilities.map((row) => )} + +
Capabilities in mobench {site.release}
CapabilityExecution mode{site.release}
{row.capability}{row.mode}{row.status}
+
+

Why this is explicit: --local-only skips the mobile build and writes host-side preflight/spec output. It does not execute or measure a benchmark.

+
+ +
+
+

The working loop

From one Rust function to a result you can review.

+
    +
  1. +
    01 Annotate
    +

    Mark the path that matters.

    +

    Keep the benchmark beside the Rust code. The macro registers it; the SDK owns timing and result types.

    +
    #[benchmark]
    +pub fn verify_proof() {
    +  black_box(run());
    +}
    + Benchmark authoring +
  2. +
  3. +
    02 Build
    +

    Generate the mobile runner.

    +

    Build Android APK/test APK outputs or iOS runner artifacts with the platform toolchain.

    +
    $ mobench build \
    +  --target android \
    +  --release
    + Build requirements +
  4. +
  5. +
    03 Run
    +

    Choose a hosted device.

    +

    Supplying a device selects the BrowserStack ordinary execution path in the current stable release.

    +
    $ mobench run \
    +  --target android \
    +  --function crate::verify_proof \
    +  --devices "Google Pixel 8-14.0"
    + BrowserStack setup +
  6. +
  7. +
    04 Compare
    +

    Commit to a stable contract.

    +

    CI mode writes machine-readable data and a Markdown summary into a predictable output directory.

    +
    $ mobench ci run \
    +  --target android \
    +  --function crate::verify_proof \
    +  --devices "Google Pixel 8-14.0" \
    +  --output-dir target/mobench/ci
    + Report artifacts +
  8. +
+
+
+ +
+
+
+

Evidence, not decoration

+

The output is made to be inspected.

+

This example is rendered from the checked-in examples/fixtures/basic/summary.json fixture in {site.release}. It demonstrates report shape and is not a product performance claim.

+
  • summary.jsonautomation and downstream tooling
  • summary.mdpull requests and human review
  • results.csvanalysis and dashboards
+ Inspect the source fixture +
+
+
Checked-in fixturebasic_benchmark
5 samplesAndroid 14
+ +
+ + + + {fixtureRows.map((row) => )} +
Exact values in the basic summary fixture
DeviceBenchmarkMedianp95
{row.device}{row.benchmark}{row.median} ms{row.p95} ms
+
+

Fixture data · values are intentionally deterministic for contract testing.

+
+
+
+ +
+
+ +
+

A concrete workload shape

+

Performance questions do not stop at the host boundary.

+

ProveKit is an open-source Rust proving system with Swift, Kotlin, and C-compatible FFI surfaces. World ID documents the product context where proof technology reaches mobile users. Together they illustrate why a host-only timing number is incomplete: compilation target, FFI, mobile scheduling, and device constraints all sit on the real execution path.

+

Source-backed context only. Mobench makes no device-coverage or performance claim from these links.

+
+ +
+
+ +
+

Pick the task

Start where your performance question starts.

+
+
01 / GET STARTED

Build the first runner

Install the CLI, register one benchmark, and verify the generated Android artifacts.

Open the quickstart
+
02 / HOSTED DEVICES

Run on BrowserStack

Configure credentials and move from generated artifacts to an ordinary benchmark on remote hardware.

Set up the first run
+
03 / NATIVE CAPTURE

Profile a local build

Use the narrower Android native or iOS Instruments path to generate capture and flamegraph artifacts.

Read profiling scope
+
+
+ +
+
+

Before you build

Platform tools stay platform tools.

mobench orchestrates the work; it does not replace the Android or Apple toolchains. Install only the path you need.

+
+
CORE

Rust project

  • Rust 1.85 or newer
  • mobench {site.crateVersion}
  • mobench-sdk and benchmark macro
  • A library crate suitable for mobile output
+
ANDROID

Android build

  • Android SDK and NDK
  • ANDROID_NDK_HOME
  • cargo-ndk
  • Required Rust Android targets
+
APPLE

iOS build

  • macOS and Xcode
  • Xcode command-line tools
  • Required Rust iOS targets
  • Signing when packaging for devices
+
EXECUTION

Hosted run

  • BrowserStack App Automate account
  • Username and access key in secrets
  • A valid device label or matrix
  • Generated application and test artifacts
+
+
+
+ +
+

One ecosystem, clear boundaries

Use the level of control the job needs.

+
+
$

mobench CLI

Build orchestration, hosted runs, CI contracts, reports, and profiling commands.

CLI API
+
{ }

mobench-sdk

Timing harness, registry, builders, runner APIs, shared types, and code generation.

SDK API
+
#

mobench-macros

The #[benchmark] attribute and registration layer used by normal benchmark crates.

Macro API
+
+
+ +
+
+

Focused answers

Before the first run.

Need command-level detail? The documentation is generated as static HTML and stays usable without client JavaScript.

Browse all documentation
+
{faq.map(([question, answer], index) =>
{question}

{answer}

)}
+
+
+ +
+

Ready when the toolchain is

Build the runner. Then choose where it runs.

+ +
+
+ + +
diff --git a/apps/marketing/src/pages/privacy.astro b/apps/marketing/src/pages/privacy.astro new file mode 100644 index 0000000..5c964da --- /dev/null +++ b/apps/marketing/src/pages/privacy.astro @@ -0,0 +1,13 @@ +--- +import BaseLayout from '../layouts/BaseLayout.astro' +--- + + +
+ mmobench +

Privacy

Minimal measurement, no search text.

Mobench may collect aggregate page and interaction counts to understand whether documentation paths work. Analytics events use fixed names and non-identifying properties.

What is never sent

  • Documentation search queries
  • Copied commands or page content
  • Benchmark data, credentials, or source code

External services

Links to GitHub, docs.rs, BrowserStack, and World Foundation leave this site and follow those services’ privacy terms.

← Return to mobench.org

+
+ +
diff --git a/apps/marketing/src/scripts/analytics.ts b/apps/marketing/src/scripts/analytics.ts new file mode 100644 index 0000000..7ee5e22 --- /dev/null +++ b/apps/marketing/src/scripts/analytics.ts @@ -0,0 +1,24 @@ +import { inject, track } from '@vercel/analytics' +import { analyticsEvents, type AnalyticsEvent } from '@mobench/site-config' + +const analyticsEnabled = window.location.hostname === 'mobench.org' +const allowedEvents = new Set(analyticsEvents) + +function emit(name?: string) { + if (!analyticsEnabled || !name || !allowedEvents.has(name)) return + track(name as AnalyticsEvent) +} + +if (analyticsEnabled) inject() + +document.addEventListener('click', (event) => { + const target = event.target instanceof Element + ? event.target.closest('[data-event]') + : null + const name = target?.dataset.event + if (name !== 'install_copied') emit(name) +}) + +document.addEventListener('mobench:analytics', (event) => { + emit((event as CustomEvent<{ name?: string }>).detail?.name) +}) diff --git a/apps/marketing/src/styles/global.css b/apps/marketing/src/styles/global.css new file mode 100644 index 0000000..7ca4038 --- /dev/null +++ b/apps/marketing/src/styles/global.css @@ -0,0 +1,294 @@ +:root { + --font-sans: 'Geist Variable', 'Geist', ui-sans-serif, system-ui, sans-serif; + --font-mono: 'Geist Mono Variable', 'Geist Mono', ui-monospace, monospace; +} + +@font-face { + font-family: 'Geist Variable'; + font-style: normal; + font-display: swap; + font-weight: 100 900; + src: url('/fonts/geist-latin-wght-normal.woff2') format('woff2-variations'); +} + +@font-face { + font-family: 'Geist Mono Variable'; + font-style: normal; + font-display: swap; + font-weight: 100 900; + src: url('/fonts/geist-mono-latin-wght-normal.woff2') format('woff2-variations'); +} + +:root { + color-scheme: light; + --cream: #f4efdd; + --cream-deep: #e9e1c9; + --paper: #fffdf5; + --paper-green: #e6efd8; + --ink: #271f16; + --ink-soft: #443c31; + --muted: #625a4c; + --faint: #6c6252; + --green: #356c28; + --green-bright: #4e8b37; + --green-deep: #263e20; + --line: rgba(39, 31, 22, 0.15); + --line-strong: rgba(39, 31, 22, 0.27); + --header: rgba(244, 239, 221, 0.88); + --shadow: rgba(55, 46, 30, 0.2); + --focus: #bd571d; + --max: 82rem; +} + +:root[data-theme='dark'] { + color-scheme: dark; + --cream: #11160f; + --cream-deep: #181e15; + --paper: #181f16; + --paper-green: #1c2918; + --ink: #f5efdd; + --ink-soft: #d8d0bc; + --muted: #b9b09c; + --faint: #a19783; + --green: #9bd17e; + --green-bright: #b4e298; + --green-deep: #ccedb8; + --line: rgba(245, 239, 221, 0.15); + --line-strong: rgba(245, 239, 221, 0.27); + --header: rgba(17, 22, 15, 0.9); + --shadow: rgba(0, 0, 0, 0.44); + --focus: #f3a064; +} + +* { box-sizing: border-box; } +html { scroll-behavior: smooth; scroll-padding-top: 6rem; } +body { margin: 0; background: var(--cream); color: var(--ink); font-family: var(--font-sans); font-size: 1rem; line-height: 1.55; -webkit-font-smoothing: antialiased; } +body::before { position: fixed; z-index: -1; inset: 0; pointer-events: none; background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 180 180' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='.45'/%3E%3C/svg%3E"); opacity: .025; content: ''; } +a { color: inherit; text-decoration-thickness: .08em; text-underline-offset: .2em; } +button, summary, a { -webkit-tap-highlight-color: transparent; } +button, summary { font: inherit; } +button:focus-visible, a:focus-visible, summary:focus-visible { outline: 3px solid var(--focus); outline-offset: 4px; } +code, pre { font-family: var(--font-mono); } +h1, h2, h3, p { margin-top: 0; } +h1, h2, h3 { text-wrap: balance; } +p { text-wrap: pretty; } +.shell { width: min(100% - 2.5rem, var(--max)); margin-inline: auto; } +.section { padding-block: clamp(5.5rem, 10vw, 9.5rem); } +.sr-only { position: absolute; overflow: hidden; width: 1px; height: 1px; clip: rect(0, 0, 0, 0); white-space: nowrap; clip-path: inset(50%); } +.skip-link { position: fixed; z-index: 100; top: .75rem; left: .75rem; padding: .7rem 1rem; background: var(--ink); color: var(--cream); transform: translateY(-180%); transition: transform .15s ease; } +.skip-link:focus { transform: translateY(0); } + +.site-header { position: sticky; z-index: 20; top: 0; border-bottom: 1px solid var(--line); background: var(--header); backdrop-filter: blur(18px); } +.header-inner { display: flex; min-height: 4.7rem; align-items: center; justify-content: space-between; gap: 2rem; } +.brand { display: inline-flex; align-items: center; gap: .65rem; color: var(--ink); font-size: 1.12rem; font-weight: 650; letter-spacing: -.035em; text-decoration: none; } +.brand-mark { display: grid; width: 2rem; height: 2rem; place-items: center; border-radius: .55rem; background: var(--green); color: var(--cream); font-family: var(--font-mono); font-size: 1.05rem; font-weight: 750; } +.version { padding: .16rem .38rem; border: 1px solid var(--line-strong); color: var(--muted); font-family: var(--font-mono); font-size: .64rem; font-weight: 500; letter-spacing: .02em; } +.desktop-nav { display: flex; margin-left: auto; align-items: center; gap: clamp(1.15rem, 2vw, 2rem); } +.desktop-nav a, .github-link { color: var(--muted); font-size: .86rem; font-weight: 540; text-decoration: none; } +.desktop-nav a:hover, .github-link:hover { color: var(--ink); } +.header-actions { display: flex; align-items: center; gap: .65rem; } +.icon-button { display: grid; width: 2.75rem; height: 2.75rem; place-items: center; border: 1px solid var(--line); border-radius: .65rem; background: transparent; color: var(--ink); cursor: pointer; transition: background .18s ease, transform .18s ease; } +.icon-button:hover { background: var(--paper); transform: translateY(-1px); } +.icon-button svg { width: 1.05rem; fill: none; stroke: currentColor; stroke-linecap: round; stroke-width: 1.7; } +.moon, [data-theme='dark'] .sun { display: none; } +[data-theme='dark'] .moon { display: block; } +.button { display: inline-flex; min-height: 3.15rem; align-items: center; justify-content: center; gap: .7rem; padding: .75rem 1.25rem; border: 1px solid var(--ink); border-radius: .7rem; background: var(--ink); color: var(--cream); font-size: .91rem; font-weight: 640; text-decoration: none; box-shadow: 0 .5rem 1.2rem -.9rem var(--shadow); transition: transform .18s ease, background .18s ease, box-shadow .18s ease; } +.button:hover { background: var(--green); border-color: var(--green); transform: translateY(-2px); box-shadow: 0 .8rem 1.5rem -1rem var(--shadow); } +.button:active { transform: translateY(0) scale(.985); } +.button-small { min-height: 2.65rem; padding: .5rem .9rem; font-size: .8rem; } +.text-link { color: var(--green); font-weight: 630; text-decoration: none; } +.text-link:hover { text-decoration: underline; } +.mobile-menu { display: none; position: relative; } +.mobile-menu summary { display: grid; width: 2.75rem; height: 2.75rem; padding: .7rem; align-content: center; gap: .25rem; border: 1px solid var(--line); border-radius: .65rem; cursor: pointer; list-style: none; } +.mobile-menu summary::-webkit-details-marker { display: none; } +.mobile-menu summary span { width: 100%; height: 1px; background: currentColor; } +.mobile-menu nav { position: absolute; top: calc(100% + .75rem); right: 0; display: grid; width: min(19rem, calc(100vw - 2.5rem)); padding: .7rem; border: 1px solid var(--line); border-radius: .8rem; background: var(--paper); box-shadow: 0 1.25rem 3rem -1.5rem var(--shadow); } +.mobile-menu nav a { padding: .8rem .7rem; border-bottom: 1px solid var(--line); color: var(--ink); text-decoration: none; } +.mobile-menu nav a:last-child { border-bottom: 0; } + +.hero { display: grid; min-height: calc(100svh - 4.7rem); padding-block: clamp(4rem, 7vw, 7rem); align-items: center; grid-template-columns: minmax(0, .95fr) minmax(24rem, .83fr); gap: clamp(3rem, 8vw, 8rem); } +.hero-copy { min-width: 0; padding-bottom: 1rem; } +.eyebrow { margin-bottom: 1.15rem; color: var(--green); font-family: var(--font-mono); font-size: .72rem; font-weight: 620; letter-spacing: .12em; text-transform: uppercase; } +.live-dot { display: inline-block; width: .48rem; height: .48rem; margin-right: .45rem; border-radius: 50%; background: var(--green); box-shadow: 0 0 0 .22rem color-mix(in srgb, var(--green) 16%, transparent); } +.hero h1 { max-width: 13ch; margin-bottom: 1.8rem; font-size: clamp(3.25rem, 6.5vw, 6.8rem); font-weight: 640; letter-spacing: -.072em; line-height: .9; } +.hero h1 em { color: var(--green); font-family: Georgia, 'Times New Roman', serif; font-weight: 400; letter-spacing: -.055em; } +.hero-lede { max-width: 39rem; margin-bottom: 1.15rem; color: var(--ink-soft); font-size: clamp(1.08rem, 1.65vw, 1.35rem); line-height: 1.48; } +.truth-note { max-width: 40rem; padding: .75rem 1rem; border-left: 3px solid var(--green); background: var(--paper-green); color: var(--muted); font-size: .88rem; } +.truth-note strong { color: var(--ink); } +.hero-actions { display: flex; margin-top: 2rem; align-items: center; flex-wrap: wrap; gap: 1.3rem; } +.install-row { display: flex; overflow: hidden; width: fit-content; max-width: 100%; margin-top: 1.2rem; align-items: stretch; border: 1px solid var(--line); border-radius: .65rem; background: color-mix(in srgb, var(--paper) 64%, transparent); } +.install-row code { overflow-x: auto; min-width: 0; max-width: calc(100% - 4.5rem); flex: 1 1 auto; padding: .78rem 1rem; color: var(--ink-soft); font-size: .76rem; white-space: nowrap; } +.install-row code:focus-visible { outline: 3px solid var(--focus); outline-offset: -3px; } +.install-row code span { color: var(--green); } +.install-row button { min-width: 4.5rem; flex: 0 0 4.5rem; border: 0; border-left: 1px solid var(--line); background: transparent; color: var(--green); font-size: .72rem; font-weight: 650; cursor: pointer; } +.install-row button:hover { background: var(--paper-green); } + +.hero-art { position: relative; min-height: 35rem; overflow: hidden; border: 1px solid var(--line); border-radius: 1.6rem; background: var(--paper-green); box-shadow: 0 3rem 6rem -4rem var(--shadow); isolation: isolate; } +.hero-legacy { position: absolute; z-index: 0; inset: 0; display: block; opacity: .17; } +.hero-legacy::after { position: absolute; inset: 0; background: linear-gradient(135deg, transparent, var(--paper-green) 72%); content: ''; } +.hero-legacy img { width: 100%; height: 100%; object-fit: cover; filter: saturate(.7) contrast(.9); } +.art-grid { position: absolute; inset: 0; background-image: linear-gradient(var(--line) 1px, transparent 1px), linear-gradient(90deg, var(--line) 1px, transparent 1px); background-size: 2.3rem 2.3rem; opacity: .36; mask-image: linear-gradient(to bottom, #000, transparent 88%); } +.code-ticket { position: absolute; z-index: 2; top: 12%; left: 7%; width: 52%; padding: 1rem; border: 1px solid var(--line-strong); border-radius: .75rem; background: color-mix(in srgb, var(--paper) 94%, transparent); box-shadow: 0 1.5rem 3rem -2rem var(--shadow); transform: rotate(-3deg); } +.ticket-label { margin-bottom: 1rem; padding-bottom: .55rem; border-bottom: 1px solid var(--line); color: var(--faint); font-family: var(--font-mono); font-size: .64rem; } +.code-ticket code { color: var(--ink-soft); font-size: clamp(.7rem, 1.1vw, .88rem); line-height: 1.75; } +.code-ticket code span { color: var(--green); } +.route-line { position: absolute; z-index: 1; top: 43%; left: 17%; width: 54%; color: var(--green); font-family: var(--font-mono); font-size: .6rem; letter-spacing: .07em; text-align: center; text-transform: uppercase; transform: rotate(7deg); } +.route-line span { display: block; height: 1px; margin-bottom: .4rem; background: repeating-linear-gradient(90deg, var(--green) 0 7px, transparent 7px 12px); } +.phone { position: absolute; z-index: 3; top: 19%; right: 7%; width: 41%; min-width: 11rem; padding: .55rem; border: .22rem solid var(--ink); border-radius: 2.1rem; background: var(--ink); box-shadow: 0 2.5rem 4rem -2rem var(--shadow); transform: rotate(5deg); } +.phone-sensor { position: absolute; z-index: 2; top: .9rem; left: 50%; width: 34%; height: .28rem; border-radius: 1rem; background: color-mix(in srgb, var(--cream) 18%, var(--ink)); transform: translateX(-50%); } +.phone-screen { min-height: 22rem; padding: 3rem 1.1rem 1.2rem; border-radius: 1.55rem; background: #182414; color: #f4efdd; } +.screen-kicker { color: #a8d88f; font-family: var(--font-mono); font-size: .58rem; letter-spacing: .13em; } +.screen-value { margin-block: 1.4rem 1rem; font-family: var(--font-mono); font-size: clamp(2rem, 5vw, 3.35rem); font-weight: 650; letter-spacing: -.08em; } +.screen-value span { font-size: .8rem; font-weight: 450; letter-spacing: 0; } +.screen-rule { height: 2.6rem; margin-bottom: 1.5rem; border-bottom: 1px solid rgba(244, 239, 221, .17); } +.screen-rule i { display: block; width: 73%; height: .42rem; border-radius: 1rem; background: #9bd17e; box-shadow: 0 .8rem 0 rgba(155, 209, 126, .35), 0 1.6rem 0 rgba(155, 209, 126, .18); } +.screen-meta { display: flex; padding-block: .55rem; justify-content: space-between; border-bottom: 1px solid rgba(244, 239, 221, .13); font-family: var(--font-mono); font-size: .65rem; } +.screen-meta span { color: #a9af9f; } +.bench { position: absolute; z-index: 2; right: 3%; bottom: 7%; left: 3%; transform: perspective(20rem) rotateX(13deg); } +.bench span { display: block; height: .8rem; margin-top: .42rem; border: 1px solid rgba(39, 31, 22, .25); border-radius: .2rem; background: #788f5c; box-shadow: 0 .3rem .5rem -.35rem var(--shadow); } +.bench::before, .bench::after { position: absolute; top: 100%; width: .7rem; height: 2.2rem; background: var(--ink); content: ''; } +.bench::before { left: 12%; }.bench::after { right: 12%; } +.art-caption { position: absolute; z-index: 4; bottom: .7rem; left: 1rem; color: var(--muted); font-family: var(--font-mono); font-size: .58rem; letter-spacing: .04em; } + +.signal-strip { border-block: 1px solid var(--line); background: var(--paper); } +.signal-inner { display: flex; min-height: 5rem; align-items: center; justify-content: space-between; gap: 2rem; } +.signal-inner p { margin: 0; color: var(--faint); font-family: var(--font-mono); font-size: .67rem; letter-spacing: .08em; text-transform: uppercase; } +.signal-inner ul { display: flex; margin: 0; padding: 0; align-items: center; flex-wrap: wrap; gap: 1.8rem; color: var(--ink-soft); font-family: var(--font-mono); font-size: .69rem; list-style: none; } +.signal-inner li + li::before { margin-right: 1.8rem; color: var(--line-strong); content: '/'; } + +.section-intro { max-width: 53rem; margin-bottom: 3.8rem; } +.section-intro h2, .results-copy h2, .faq-grid h2, .final-cta h2 { margin-bottom: 1.2rem; font-size: clamp(2.4rem, 4.7vw, 4.8rem); font-weight: 610; letter-spacing: -.06em; line-height: .98; } +.split-intro { display: grid; max-width: none; grid-template-columns: 1.05fr .75fr; gap: clamp(2rem, 8vw, 8rem); } +.split-intro > p { max-width: 35rem; margin: 1.9rem 0 0; color: var(--muted); font-size: 1.07rem; } +.table-wrap { overflow-x: auto; } +table { width: 100%; border-collapse: collapse; } +.capability-table { min-width: 44rem; border-top: 1px solid var(--line-strong); } +.capability-table th, .capability-table td { padding: 1.15rem .9rem; border-bottom: 1px solid var(--line); text-align: left; } +.capability-table thead th { color: var(--faint); font-family: var(--font-mono); font-size: .66rem; font-weight: 550; letter-spacing: .1em; text-transform: uppercase; } +.capability-table tbody th { width: 41%; font-size: .93rem; font-weight: 600; } +.capability-table tbody td { color: var(--muted); font-size: .9rem; } +.status { display: inline-flex; align-items: center; gap: .5rem; color: var(--ink); font-family: var(--font-mono); font-size: .69rem; font-weight: 600; text-transform: uppercase; white-space: nowrap; } +.status i { width: .52rem; height: .52rem; border-radius: 50%; background: var(--green); } +.status.unsupported i { border: 1px solid var(--faint); background: transparent; } +.table-note { margin: 1.5rem 0 0; padding: 1rem 1.2rem; border: 1px solid var(--line); background: var(--paper); color: var(--muted); font-size: .85rem; } +.table-note strong { color: var(--ink); } + +.workflow-section { border-block: 1px solid var(--line); background: var(--paper); } +.workflow { display: grid; margin: 0; padding: 0; grid-template-columns: repeat(2, minmax(0, 1fr)); border-top: 1px solid var(--line-strong); list-style: none; } +.workflow li { display: flex; min-height: 32rem; padding: 2rem; flex-direction: column; border-right: 1px solid var(--line); border-bottom: 1px solid var(--line); } +.workflow li:nth-child(2n) { border-right: 0; } +.step-index { display: flex; margin-bottom: 4rem; justify-content: space-between; color: var(--green); font-family: var(--font-mono); font-size: .68rem; letter-spacing: .09em; } +.step-index span { color: var(--faint); } +.workflow h3 { margin-bottom: .75rem; font-size: clamp(1.55rem, 2.6vw, 2.25rem); font-weight: 610; letter-spacing: -.045em; } +.workflow p { max-width: 32rem; color: var(--muted); font-size: .92rem; } +.workflow pre { overflow-x: auto; margin: auto 0 1.5rem; padding: 1.15rem; border: 1px solid var(--line); border-radius: .55rem; background: var(--cream); color: var(--ink-soft); font-size: .72rem; line-height: 1.7; } +.workflow a { color: var(--green); font-size: .82rem; font-weight: 640; text-decoration: none; } +.workflow a:hover { text-decoration: underline; } +.code-attr, .code-prompt { color: var(--green); } + +.results-section { padding-block: clamp(6rem, 11vw, 10rem); background: var(--green-deep); color: var(--cream); } +[data-theme='dark'] .results-section { background: #080c07; color: var(--ink); } +.results-grid { display: grid; grid-template-columns: .75fr 1.15fr; gap: clamp(3rem, 8vw, 8rem); align-items: center; } +.results-copy .eyebrow { color: #bce8a5; } +.results-copy > p:not(.eyebrow) { max-width: 33rem; color: color-mix(in srgb, var(--cream) 72%, transparent); } +[data-theme='dark'] .results-copy > p:not(.eyebrow) { color: var(--muted); } +.artifact-list { margin: 2rem 0; padding: 0; border-top: 1px solid color-mix(in srgb, var(--cream) 20%, transparent); list-style: none; } +.artifact-list li { display: grid; padding-block: .85rem; grid-template-columns: 9rem 1fr; gap: 1rem; border-bottom: 1px solid color-mix(in srgb, var(--cream) 20%, transparent); font-size: .79rem; } +.artifact-list span { color: color-mix(in srgb, var(--cream) 64%, transparent); } +[data-theme='dark'] .artifact-list span { color: var(--muted); } +.results-section .text-link { color: #bce8a5; } +.result-panel { min-width: 0; margin: 0; padding: clamp(1.2rem, 3vw, 2.2rem); border: 1px solid rgba(244, 239, 221, .18); border-radius: 1.1rem; background: #f4efdd; color: #271f16; box-shadow: 0 2rem 5rem -3rem rgba(0,0,0,.6); transform: rotate(.65deg); } +.result-panel figcaption { display: flex; padding-bottom: 1rem; justify-content: space-between; border-bottom: 1px solid rgba(39,31,22,.16); } +.result-panel figcaption div { display: grid; gap: .12rem; } +.result-panel figcaption span, .result-panel > p { color: #766b59; font-family: var(--font-mono); font-size: .58rem; letter-spacing: .07em; text-transform: uppercase; } +.result-panel figcaption strong { font-family: var(--font-mono); font-size: .74rem; } +.plot { padding-block: 1.5rem; } +.plot-row { display: grid; padding-block: .7rem; align-items: center; grid-template-columns: minmax(7.5rem, .9fr) 1.4fr 3.6rem; gap: .9rem; } +.plot-row > div:first-child { display: grid; } +.plot-row span { font-size: .68rem; font-weight: 630; }.plot-row small { color: #766b59; font-family: var(--font-mono); font-size: .54rem; } +.bar-track { height: .52rem; border-radius: 1rem; background: #ddd6c3; }.bar-track i { display: block; width: var(--bar); height: 100%; border-radius: inherit; background: #4c823a; } +.plot-row b { font-family: var(--font-mono); font-size: .65rem; text-align: right; } +.fixture-table-wrap { overflow-x: auto; border-top: 1px solid rgba(39,31,22,.16); } +.fixture-table-wrap table { min-width: 32rem; font-size: .62rem; } +.fixture-table-wrap th, .fixture-table-wrap td { padding: .5rem .35rem; border-bottom: 1px solid rgba(39,31,22,.1); text-align: left; }.fixture-table-wrap thead th { color: #766b59; font-family: var(--font-mono); font-weight: 520; }.fixture-table-wrap tbody th { font-weight: 620; } +.result-panel > p { margin: 1rem 0 0; } + +.context-section { padding-block: clamp(5rem, 9vw, 8rem); border-bottom: 1px solid var(--line); background: var(--paper); } +.context-grid { display: grid; grid-template-columns: .45fr 1.2fr .55fr; gap: clamp(2rem, 6vw, 6rem); align-items: start; } +.context-index { color: var(--green); font-family: var(--font-mono); font-size: clamp(1.5rem, 3vw, 2.8rem); font-weight: 650; letter-spacing: -.06em; line-height: 1.25; } +.context-grid h2 { max-width: 18ch; margin-bottom: 1.5rem; font-size: clamp(2.2rem, 4vw, 4rem); font-weight: 610; letter-spacing: -.058em; line-height: 1; } +.context-grid > div:nth-child(2) > p:not(.eyebrow) { max-width: 47rem; color: var(--muted); font-size: 1rem; } +.context-grid > div:nth-child(2) a { color: var(--green); font-weight: 620; } +.context-grid .source-note { padding-left: .9rem; border-left: 2px solid var(--green); font-family: var(--font-mono); font-size: .7rem !important; } +.context-grid aside { display: grid; border-top: 1px solid var(--line-strong); } +.context-grid aside span { padding-block: .8rem; color: var(--faint); font-family: var(--font-mono); font-size: .61rem; letter-spacing: .1em; } +.context-grid aside a { display: flex; padding-block: .85rem; justify-content: space-between; border-top: 1px solid var(--line); color: var(--ink); font-size: .76rem; font-weight: 590; text-decoration: none; } +.context-grid aside a:hover { color: var(--green); } + +.path-grid { display: grid; grid-template-columns: 1.1fr .95fr .95fr; border-top: 1px solid var(--line-strong); } +.path { display: flex; min-height: 25rem; padding: 2rem; flex-direction: column; border-right: 1px solid var(--line); border-bottom: 1px solid var(--line); } +.path:last-child { border-right: 0; } +.path-primary { background: var(--paper-green); } +.path > span, .requirements-grid article > span { color: var(--faint); font-family: var(--font-mono); font-size: .63rem; letter-spacing: .1em; } +.path h3 { margin: auto 0 .8rem; font-size: 2rem; font-weight: 610; letter-spacing: -.045em; } +.path p { color: var(--muted); font-size: .9rem; } +.path a { margin-top: 1rem; color: var(--green); font-size: .82rem; font-weight: 640; text-decoration: none; } + +.requirements-section { border-block: 1px solid var(--line); background: var(--cream-deep); } +.requirements-grid { display: grid; grid-template-columns: repeat(4, 1fr); border-top: 1px solid var(--line-strong); } +.requirements-grid article { padding: 1.7rem; border-right: 1px solid var(--line); } +.requirements-grid article:last-child { border-right: 0; } +.requirements-grid h3 { margin: 4rem 0 1rem; font-size: 1.35rem; letter-spacing: -.035em; } +.requirements-grid ul { margin: 0; padding: 0; color: var(--muted); font-size: .82rem; list-style: none; } +.requirements-grid li { padding-block: .55rem; border-top: 1px solid var(--line); } +.ecosystem-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 2rem; } +.ecosystem-grid article { display: grid; padding-top: 1.4rem; grid-template-columns: 3rem 1fr; gap: 1rem; border-top: 1px solid var(--line-strong); } +.eco-icon { display: grid; width: 2.5rem; height: 2.5rem; place-items: center; border-radius: .55rem; background: var(--paper-green); color: var(--green); font-family: var(--font-mono); font-size: .8rem; font-weight: 680; } +.ecosystem h3 { margin-bottom: .5rem; font-size: 1.35rem; letter-spacing: -.035em; }.ecosystem p { color: var(--muted); font-size: .86rem; }.ecosystem a { color: var(--green); font-size: .78rem; font-weight: 630; text-decoration: none; } + +.faq-section { padding-block: clamp(6rem, 10vw, 9rem); border-top: 1px solid var(--line); background: var(--paper); } +.faq-grid { display: grid; grid-template-columns: .65fr 1fr; gap: clamp(3rem, 8vw, 8rem); } +.faq-grid > div:first-child > p:not(.eyebrow) { max-width: 30rem; color: var(--muted); } +.faq-list { border-top: 1px solid var(--line-strong); } +.faq-list details { border-bottom: 1px solid var(--line); } +.faq-list summary { display: flex; min-height: 4.8rem; padding-block: 1rem; align-items: center; justify-content: space-between; gap: 1rem; font-weight: 600; cursor: pointer; list-style: none; } +.faq-list summary::-webkit-details-marker { display: none; } +.faq-list summary span { position: relative; width: 1.2rem; height: 1.2rem; flex: none; } +.faq-list summary span::before, .faq-list summary span::after { position: absolute; top: 50%; left: 50%; width: .8rem; height: 1px; background: var(--green); content: ''; transform: translate(-50%,-50%); }.faq-list summary span::after { transform: translate(-50%,-50%) rotate(90deg); transition: transform .15s ease; }.faq-list details[open] summary span::after { transform: translate(-50%,-50%); } +.faq-list details p { max-width: 48rem; padding: 0 3rem 1.4rem 0; color: var(--muted); font-size: .9rem; } + +.final-cta { display: grid; margin-block: 2rem; padding: clamp(3rem, 7vw, 6rem); grid-template-columns: 1fr auto; gap: 3rem; align-items: end; border-radius: 1.5rem; background: var(--green); color: var(--cream); } +.final-cta h2 { max-width: 13ch; margin: 0; }.final-cta .eyebrow { color: var(--cream); }.final-cta > div:last-child { display: grid; gap: 1.2rem; }.button-cream { border-color: var(--cream); background: var(--cream); color: var(--ink); }.button-cream:hover { border-color: var(--paper-green); background: var(--paper-green); color: #271f16; }.footer-github { color: inherit; font-size: .8rem; text-align: center; text-decoration: none; } +footer { border-top: 1px solid var(--line); }.footer-inner { display: flex; min-height: 7rem; align-items: center; gap: 2rem; }.footer-brand { margin-right: auto; }.footer-inner p { margin: 0; color: var(--muted); font-size: .76rem; }.footer-inner nav { display: flex; gap: 1.3rem; }.footer-inner nav a { color: var(--muted); font-size: .76rem; text-decoration: none; } + +@media (max-width: 70rem) { + .desktop-nav { display: none; }.mobile-menu { display: block; }.github-link { display: none; } + .hero { min-height: auto; grid-template-columns: 1fr 24rem; gap: 3rem; }.hero h1 { font-size: clamp(3.5rem, 7vw, 5.5rem); }.hero-art { min-height: 31rem; } + .requirements-grid { grid-template-columns: repeat(2, 1fr); }.requirements-grid article:nth-child(2) { border-right: 0; }.requirements-grid article:nth-child(-n+2) { border-bottom: 1px solid var(--line); } +} +@media (max-width: 52rem) { + .shell { width: min(100% - 2rem, var(--max)); } + .hero { padding-top: 4rem; grid-template-columns: 1fr; }.hero-copy { max-width: 46rem; }.hero h1 { font-size: clamp(3.4rem, 13vw, 6rem); }.hero-art { width: min(100%, 33rem); min-height: 34rem; margin-inline: auto; } + .signal-inner { padding-block: 1.3rem; align-items: flex-start; flex-direction: column; gap: .8rem; }.signal-inner ul { gap: .7rem 1rem; }.signal-inner li + li::before { display: none; } + .split-intro, .results-grid, .faq-grid, .context-grid { grid-template-columns: 1fr; gap: 2rem; }.split-intro > p { margin-top: 0; } + .context-index { display: none; }.context-grid aside { max-width: 24rem; } + .workflow { grid-template-columns: 1fr; }.workflow li { border-right: 0; }.workflow li:nth-child(2n) { border-right: 0; } + .path-grid { grid-template-columns: 1fr; }.path { min-height: 19rem; border-right: 0; }.path h3 { margin-top: 3rem; } + .ecosystem-grid { grid-template-columns: 1fr; } + .final-cta { grid-template-columns: 1fr; align-items: start; } + .footer-inner { padding-block: 2rem; align-items: flex-start; flex-direction: column; gap: 1rem; }.footer-brand { margin: 0; } +} +@media (max-width: 36rem) { + .header-inner { min-height: 4.1rem; }.version, .header-actions > .button-small { display: none; }.brand { font-size: 1rem; }.brand-mark { width: 1.8rem; height: 1.8rem; } + .hero { min-height: auto; padding-block: 3.5rem 4.5rem; }.hero h1 { font-size: clamp(3.25rem, 17vw, 5rem); }.hero-actions { align-items: flex-start; flex-direction: column; }.install-row { width: 100%; }.install-row code { flex: 1; } + .hero-art { min-height: 28rem; border-radius: 1.1rem; }.code-ticket { top: 8%; left: 4%; width: 58%; }.phone { top: 21%; right: 3%; width: 45%; min-width: 9.5rem; }.phone-screen { min-height: 18.5rem; padding-inline: .8rem; }.route-line { display: none; } + .section { padding-block: 5rem; }.section-intro { margin-bottom: 2.5rem; }.section-intro h2, .results-copy h2, .faq-grid h2, .final-cta h2 { font-size: 2.55rem; } + .workflow li { min-height: 29rem; padding: 1.25rem; }.step-index { margin-bottom: 3rem; } + .plot-row { grid-template-columns: 6.5rem 1fr 3.2rem; gap: .5rem; }.result-panel { transform: none; }.fixture-table-wrap { margin-inline: -.25rem; } + .requirements-grid { grid-template-columns: 1fr; }.requirements-grid article { border-right: 0; border-bottom: 1px solid var(--line); }.requirements-grid article:nth-child(2) { border-right: 0; }.requirements-grid h3 { margin-top: 2.5rem; } + .final-cta { margin-block: 1rem; padding: 2rem 1.4rem; border-radius: 1rem; } +} +@media (prefers-reduced-motion: reduce) { + html { scroll-behavior: auto; } + *, *::before, *::after { animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; } +} diff --git a/apps/marketing/tsconfig.json b/apps/marketing/tsconfig.json new file mode 100644 index 0000000..70fba30 --- /dev/null +++ b/apps/marketing/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "astro/tsconfigs/strict", + "include": [".astro/types.d.ts", "**/*"], + "exclude": ["dist"], + "compilerOptions": { + "baseUrl": "." + } +} diff --git a/apps/marketing/vercel.json b/apps/marketing/vercel.json new file mode 100644 index 0000000..cfaf5dd --- /dev/null +++ b/apps/marketing/vercel.json @@ -0,0 +1,353 @@ +{ + "$schema": "https://openapi.vercel.sh/vercel.json", + "framework": "astro", + "installCommand": "cd ../.. && bun install --frozen-lockfile", + "buildCommand": "cd ../.. && bun run generate && bun run build:marketing", + "outputDirectory": "dist", + "redirects": [ + { + "source": "/analyze-results/outputs", + "destination": "https://docs.mobench.org/outputs/", + "permanent": true + }, + { + "source": "/analyze-results/profiling", + "destination": "https://docs.mobench.org/profiling/", + "permanent": true + }, + { + "source": "/analyze-results/regressions", + "destination": "https://docs.mobench.org/regressions/", + "permanent": true + }, + { + "source": "/app-automate", + "destination": "https://docs.mobench.org/browserstack/", + "permanent": true + }, + { + "source": "/authoring", + "destination": "https://docs.mobench.org/benchmark-functions/", + "permanent": true + }, + { + "source": "/basic-example", + "destination": "https://docs.mobench.org/basic-example/", + "permanent": true + }, + { + "source": "/benchmark-functions", + "destination": "https://docs.mobench.org/benchmark-functions/", + "permanent": true + }, + { + "source": "/benchmark-quality", + "destination": "https://docs.mobench.org/benchmark-quality/", + "permanent": true + }, + { + "source": "/browserstack", + "destination": "https://docs.mobench.org/browserstack/", + "permanent": true + }, + { + "source": "/build", + "destination": "https://docs.mobench.org/compatibility/", + "permanent": true + }, + { + "source": "/build-artifacts", + "destination": "https://docs.mobench.org/compatibility/", + "permanent": true + }, + { + "source": "/ci", + "destination": "https://docs.mobench.org/ci/", + "permanent": true + }, + { + "source": "/cli", + "destination": "https://docs.mobench.org/cli/", + "permanent": true + }, + { + "source": "/cli-man-pages", + "destination": "https://docs.mobench.org/cli/", + "permanent": true + }, + { + "source": "/cli-reference", + "destination": "https://docs.mobench.org/cli/", + "permanent": true + }, + { + "source": "/codebase", + "destination": "https://docs.mobench.org/troubleshooting/", + "permanent": true + }, + { + "source": "/compatibility", + "destination": "https://docs.mobench.org/compatibility/", + "permanent": true + }, + { + "source": "/concepts", + "destination": "https://docs.mobench.org/configuration/", + "permanent": true + }, + { + "source": "/configuration", + "destination": "https://docs.mobench.org/configuration/", + "permanent": true + }, + { + "source": "/current-spec", + "destination": "https://docs.mobench.org/schemas/", + "permanent": true + }, + { + "source": "/device-matrices", + "destination": "https://docs.mobench.org/device-matrices/", + "permanent": true + }, + { + "source": "/diagrams", + "destination": "https://docs.mobench.org/device-matrices/", + "permanent": true + }, + { + "source": "/docs", + "destination": "https://docs.mobench.org/", + "permanent": true + }, + { + "source": "/docs/:path*", + "destination": "https://docs.mobench.org/:path*", + "permanent": true + }, + { + "source": "/examples", + "destination": "https://docs.mobench.org/basic-example/", + "permanent": true + }, + { + "source": "/examples/basic", + "destination": "https://docs.mobench.org/basic-example/", + "permanent": true + }, + { + "source": "/examples/ffi", + "destination": "https://docs.mobench.org/ffi-example/", + "permanent": true + }, + { + "source": "/ffi-example", + "destination": "https://docs.mobench.org/ffi-example/", + "permanent": true + }, + { + "source": "/get-started/installation", + "destination": "https://docs.mobench.org/installation/", + "permanent": true + }, + { + "source": "/get-started/quickstart", + "destination": "https://docs.mobench.org/quickstart/", + "permanent": true + }, + { + "source": "/help/troubleshooting", + "destination": "https://docs.mobench.org/troubleshooting/", + "permanent": true + }, + { + "source": "/home", + "destination": "https://docs.mobench.org/", + "permanent": true + }, + { + "source": "/host-preflight", + "destination": "https://docs.mobench.org/host-preflight/", + "permanent": true + }, + { + "source": "/install", + "destination": "https://docs.mobench.org/installation/", + "permanent": true + }, + { + "source": "/installation", + "destination": "https://docs.mobench.org/installation/", + "permanent": true + }, + { + "source": "/local-devices", + "destination": "https://docs.mobench.org/host-preflight/", + "permanent": true + }, + { + "source": "/outputs", + "destination": "https://docs.mobench.org/outputs/", + "permanent": true + }, + { + "source": "/outputs-and-reports", + "destination": "https://docs.mobench.org/outputs/", + "permanent": true + }, + { + "source": "/overview", + "destination": "https://docs.mobench.org/", + "permanent": true + }, + { + "source": "/profiling", + "destination": "https://docs.mobench.org/profiling/", + "permanent": true + }, + { + "source": "/public-api", + "destination": "https://docs.mobench.org/compatibility/", + "permanent": true + }, + { + "source": "/quickstart", + "destination": "https://docs.mobench.org/quickstart/", + "permanent": true + }, + { + "source": "/reference", + "destination": "https://docs.mobench.org/schemas/", + "permanent": true + }, + { + "source": "/reference/cli", + "destination": "https://docs.mobench.org/cli/", + "permanent": true + }, + { + "source": "/reference/compatibility", + "destination": "https://docs.mobench.org/compatibility/", + "permanent": true + }, + { + "source": "/reference/configuration", + "destination": "https://docs.mobench.org/configuration/", + "permanent": true + }, + { + "source": "/reference/device-matrices", + "destination": "https://docs.mobench.org/device-matrices/", + "permanent": true + }, + { + "source": "/reference/schemas", + "destination": "https://docs.mobench.org/schemas/", + "permanent": true + }, + { + "source": "/regressions", + "destination": "https://docs.mobench.org/regressions/", + "permanent": true + }, + { + "source": "/reports", + "destination": "https://docs.mobench.org/outputs/", + "permanent": true + }, + { + "source": "/run-benchmarks/browserstack", + "destination": "https://docs.mobench.org/browserstack/", + "permanent": true + }, + { + "source": "/run-benchmarks/ci", + "destination": "https://docs.mobench.org/ci/", + "permanent": true + }, + { + "source": "/run-benchmarks/preflight", + "destination": "https://docs.mobench.org/host-preflight/", + "permanent": true + }, + { + "source": "/schemas", + "destination": "https://docs.mobench.org/schemas/", + "permanent": true + }, + { + "source": "/sdk", + "destination": "https://docs.mobench.org/compatibility/", + "permanent": true + }, + { + "source": "/sdk-integration", + "destination": "https://docs.mobench.org/compatibility/", + "permanent": true + }, + { + "source": "/setup-and-teardown", + "destination": "https://docs.mobench.org/setup-teardown/", + "permanent": true + }, + { + "source": "/setup-teardown", + "destination": "https://docs.mobench.org/setup-teardown/", + "permanent": true + }, + { + "source": "/testing", + "destination": "https://docs.mobench.org/troubleshooting/", + "permanent": true + }, + { + "source": "/troubleshooting", + "destination": "https://docs.mobench.org/troubleshooting/", + "permanent": true + }, + { + "source": "/write-benchmarks/benchmark-functions", + "destination": "https://docs.mobench.org/benchmark-functions/", + "permanent": true + }, + { + "source": "/write-benchmarks/quality", + "destination": "https://docs.mobench.org/benchmark-quality/", + "permanent": true + }, + { + "source": "/write-benchmarks/setup-teardown", + "destination": "https://docs.mobench.org/setup-teardown/", + "permanent": true + }, + { + "source": "/writing", + "destination": "https://docs.mobench.org/benchmark-functions/", + "permanent": true + }, + { + "source": "/writing-benchmarks", + "destination": "https://docs.mobench.org/benchmark-functions/", + "permanent": true + } + ], + "headers": [ + { + "source": "/(.*)", + "headers": [ + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "Referrer-Policy", + "value": "strict-origin-when-cross-origin" + }, + { + "key": "Permissions-Policy", + "value": "camera=(), microphone=(), geolocation=()" + } + ] + } + ] +} diff --git a/bun.lock b/bun.lock index d7b1448..f62b8c6 100644 --- a/bun.lock +++ b/bun.lock @@ -4,125 +4,328 @@ "workspaces": { "": { "name": "mobench-org", + "devDependencies": { + "@axe-core/playwright": "4.12.1", + "@lhci/cli": "0.15.1", + "@playwright/test": "1.61.1", + "ajv": "8.20.0", + "yaml": "2.9.0", + }, + }, + "apps/docs": { + "name": "@mobench/docs", + "version": "1.0.0", + "dependencies": { + "@astrojs/sitemap": "^3.7.3", + "@astrojs/starlight": "^0.41.3", + "@mobench/site-config": "workspace:*", + "@vercel/analytics": "2.0.1", + "astro": "7.0.6", + "sharp": "0.35.3", + }, + "devDependencies": { + "@astrojs/check": "^0.9.6", + "typescript": "^6.0.3", + }, + }, + "apps/marketing": { + "name": "@mobench/marketing", + "version": "1.0.0", "dependencies": { - "@radix-ui/react-accordion": "^1.2.14", - "@radix-ui/react-slot": "^1.3.0", - "@tanstack/react-router": "^1.170.16", - "@tanstack/react-router-devtools": "^1.167.0", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "lucide-react": "^1.21.0", - "mermaid": "11.15.0", - "react": "^19.2.7", - "react-dom": "^19.2.7", - "tailwind-merge": "^3.6.0", - "tailwindcss-animate": "^1.0.7", + "@astrojs/sitemap": "^3.7.3", + "@mobench/site-config": "workspace:*", + "@mobench/truth": "workspace:*", + "@vercel/analytics": "2.0.1", + "astro": "7.0.6", + "sharp": "0.35.3", }, "devDependencies": { - "@tailwindcss/vite": "^4.3.1", - "@tanstack/router-plugin": "^1.168.18", - "@types/node": "^26.0.0", - "@types/react": "^19.2.17", - "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "^6.0.2", - "tailwindcss": "^4.3.1", + "@astrojs/check": "^0.9.6", "typescript": "^6.0.3", - "vite": "^8.0.16", }, }, + "packages/site-config": { + "name": "@mobench/site-config", + "version": "1.0.0", + "dependencies": { + "@mobench/truth": "workspace:*", + }, + }, + "packages/truth": { + "name": "@mobench/truth", + "version": "0.1.43", + }, }, "packages": { - "@antfu/install-pkg": ["@antfu/install-pkg@1.1.0", "", { "dependencies": { "package-manager-detector": "^1.3.0", "tinyexec": "^1.0.1" } }, "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ=="], + "@astrojs/check": ["@astrojs/check@0.9.9", "", { "dependencies": { "@astrojs/language-server": "^2.16.7", "chokidar": "^4.0.3", "kleur": "^4.1.5", "yargs": "^17.7.2" }, "peerDependencies": { "typescript": "^5.0.0 || ^6.0.0" }, "bin": { "astro-check": "bin/astro-check.js" } }, "sha512-A5UW8uIuErLWEoRQvzgXpO1gTjUFtK8r7nU2Z7GewAMxUb7bPvpk11qaKKgxqXlHJWlAvaaxy+Xg28A6bmQ1Tg=="], + + "@astrojs/compiler": ["@astrojs/compiler@2.13.1", "", {}, "sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg=="], + + "@astrojs/compiler-binding": ["@astrojs/compiler-binding@0.3.0", "", { "optionalDependencies": { "@astrojs/compiler-binding-darwin-arm64": "0.3.0", "@astrojs/compiler-binding-darwin-x64": "0.3.0", "@astrojs/compiler-binding-linux-arm64-gnu": "0.3.0", "@astrojs/compiler-binding-linux-arm64-musl": "0.3.0", "@astrojs/compiler-binding-linux-x64-gnu": "0.3.0", "@astrojs/compiler-binding-linux-x64-musl": "0.3.0", "@astrojs/compiler-binding-wasm32-wasi": "0.3.0", "@astrojs/compiler-binding-win32-arm64-msvc": "0.3.0", "@astrojs/compiler-binding-win32-x64-msvc": "0.3.0" } }, "sha512-zlsOT5COD9hRwplJCgQhS21unxON5AKirf0vgt1ijXwuseYIaZdm2ZOpF8fsz+DY9EyXx+I/ukxtg7uoBep68A=="], + + "@astrojs/compiler-binding-darwin-arm64": ["@astrojs/compiler-binding-darwin-arm64@0.3.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-3n0uu+uJpnCq8b4JFi3uGDsIisAvHctxSmH+cIO9Gbei1H1Y1QXaYboXyiWJugUmprr3OEYP7+LdodzpVFzLMQ=="], - "@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="], + "@astrojs/compiler-binding-darwin-x64": ["@astrojs/compiler-binding-darwin-x64@0.3.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-scxNGKjOBydMo1QR4LtK0FMgh7ubQomJDv953nz2msQFkPKke/0FpPv/cQM0T/kuZdReZQFU8Oz3iOrP/6WHEg=="], - "@babel/compat-data": ["@babel/compat-data@7.29.7", "", {}, "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg=="], + "@astrojs/compiler-binding-linux-arm64-gnu": ["@astrojs/compiler-binding-linux-arm64-gnu@0.3.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-NZrWLolVUANmrnl0zrFK/Sx5Sock1gEUT49ALfMTTCA5Ya2ec/BoJXMIg4KgE+wZcrdXJ8e+WyEhM7YLk/FJkA=="], - "@babel/core": ["@babel/core@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", "@babel/helper-compilation-targets": "^7.29.7", "@babel/helper-module-transforms": "^7.29.7", "@babel/helpers": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/template": "^7.29.7", "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA=="], + "@astrojs/compiler-binding-linux-arm64-musl": ["@astrojs/compiler-binding-linux-arm64-musl@0.3.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-PjwRmKgMFDsFhg82g0poXlIY8Qn3fMA3hXjaR0coJWJzTJsRH9ATU0j2ocigjtU1h3vL/yR7yLUxGj/lTCq73g=="], - "@babel/generator": ["@babel/generator@7.29.7", "", { "dependencies": { "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ=="], + "@astrojs/compiler-binding-linux-x64-gnu": ["@astrojs/compiler-binding-linux-x64-gnu@0.3.0", "", { "os": "linux", "cpu": "x64" }, "sha512-Dr69VJYlnSfyL8gzELW6S4mE41P7TDPn1IKjwMnjdZ7+dxgJI50oMLFSk1LVe26bHmWB3ktuh8fDVK1THI9e9A=="], - "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.29.7", "", { "dependencies": { "@babel/compat-data": "^7.29.7", "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g=="], + "@astrojs/compiler-binding-linux-x64-musl": ["@astrojs/compiler-binding-linux-x64-musl@0.3.0", "", { "os": "linux", "cpu": "x64" }, "sha512-AEt+bRw8PfImCcyRH1lpXVB8CdmQ1K/wPo5u99iec4/U/XdNvQZ715YVuNzIJpbJXelgQeZ5H2+Ea7XwRyWY5g=="], - "@babel/helper-globals": ["@babel/helper-globals@7.29.7", "", {}, "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA=="], + "@astrojs/compiler-binding-wasm32-wasi": ["@astrojs/compiler-binding-wasm32-wasi@0.3.0", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.1.6" }, "cpu": "none" }, "sha512-U80tA1j8V6LjhiTZzVCtG4E8hrNVVNXDGV5fCgJ94q8FU9CPH+XwdDDhLzBybfWhKfyItXmQiZNRPTiPCYTpVg=="], - "@babel/helper-module-imports": ["@babel/helper-module-imports@7.29.7", "", { "dependencies": { "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g=="], + "@astrojs/compiler-binding-win32-arm64-msvc": ["@astrojs/compiler-binding-win32-arm64-msvc@0.3.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-CpY1RII2r1XMpOUVD1VR/F2wtuRsiOCkFULS10Khyj8/DFZMtxVuUCAWGw+CW2Ka0h6eP3Xc1CA+glFlvXMPxA=="], - "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.29.7", "", { "dependencies": { "@babel/helper-module-imports": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7", "@babel/traverse": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg=="], + "@astrojs/compiler-binding-win32-x64-msvc": ["@astrojs/compiler-binding-win32-x64-msvc@0.3.0", "", { "os": "win32", "cpu": "x64" }, "sha512-qmFbs769oeeGrRebAnCW7aBk8m71vf85W/dX/jddfx5Z06/w0wf7TZCfJPOX1Fld2t+4N+iXzfGEJG+zJQ+bzg=="], + + "@astrojs/compiler-rs": ["@astrojs/compiler-rs@0.3.0", "", { "dependencies": { "@astrojs/compiler-binding": "0.3.0" } }, "sha512-J2qEVHtIDjEM9TxwmwuebOGmZNwhKu/dR7P7qBpnJKGmBBX0vdweQ/4cEXhj8fBbWVUB5V12xWChri3CgKNULQ=="], + + "@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.10.1", "", { "dependencies": { "@types/hast": "^3.0.4", "@types/mdast": "^4.0.4", "js-yaml": "^4.1.1", "picomatch": "^4.0.4", "retext-smartypants": "^6.2.0", "shiki": "^4.0.2", "smol-toml": "^1.6.0", "unified": "^11.0.5" } }, "sha512-5phcroT/vmOOrYuuAxtkbPixy5hePtlz9i8K4OeDv3dNK6/UQRuXPOSRTxIOBbUY5Sonw2UaxjbuVc43Mcir6Q=="], + + "@astrojs/language-server": ["@astrojs/language-server@2.16.11", "", { "dependencies": { "@astrojs/compiler": "^2.13.1", "@astrojs/yaml2ts": "^0.2.4", "@jridgewell/sourcemap-codec": "^1.5.5", "@volar/kit": "~2.4.28", "@volar/language-core": "~2.4.28", "@volar/language-server": "~2.4.28", "@volar/language-service": "~2.4.28", "muggle-string": "^0.4.1", "tinyglobby": "^0.2.16", "volar-service-css": "0.0.71", "volar-service-emmet": "0.0.71", "volar-service-html": "0.0.71", "volar-service-prettier": "0.0.71", "volar-service-typescript": "0.0.71", "volar-service-typescript-twoslash-queries": "0.0.71", "volar-service-yaml": "0.0.71", "vscode-html-languageservice": "^5.6.2", "vscode-uri": "^3.1.0" }, "peerDependencies": { "prettier": "^3.0.0", "prettier-plugin-astro": ">=0.11.0" }, "optionalPeers": ["prettier", "prettier-plugin-astro"], "bin": { "astro-ls": "./bin/nodeServer.js" } }, "sha512-sJ/EfnFp0+gurTrkvONtd9qRqmMZLT9bHelfI1SA35CaQVTrRrA74qteOcNT/al1b9Atg3IiH1Jk/qfckyC+fg=="], + + "@astrojs/markdown-remark": ["@astrojs/markdown-remark@7.2.1", "", { "dependencies": { "@astrojs/internal-helpers": "0.10.1", "@astrojs/prism": "4.0.2", "github-slugger": "^2.0.0", "hast-util-from-html": "^2.0.3", "hast-util-to-text": "^4.0.2", "mdast-util-definitions": "^6.0.0", "rehype-raw": "^7.0.0", "rehype-stringify": "^10.0.1", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "remark-smartypants": "^3.0.2", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.1.0", "unist-util-visit-parents": "^6.0.2", "vfile": "^6.0.3" } }, "sha512-jPVNIqTvk+yKviikszv/Y1U4jGUSKpp/Nw48QZV4qjWgp70j4Lkq3lhSDRbWwCfgKvEyO9GHuVbV1dM2WYXy1w=="], + + "@astrojs/markdown-satteri": ["@astrojs/markdown-satteri@0.3.3", "", { "dependencies": { "@astrojs/internal-helpers": "0.10.1", "@astrojs/prism": "4.0.2", "github-slugger": "^2.0.0", "satteri": "^0.9.1" } }, "sha512-Lje33Ittd8UQGgbIIWQvhPkj5X5c4b1sZnZWX3JQV/AWpfbuQGxVi2ONt6+ScydcwfR4egilslEWyczMclrJ1g=="], + + "@astrojs/mdx": ["@astrojs/mdx@7.0.2", "", { "dependencies": { "@astrojs/internal-helpers": "0.10.1", "@astrojs/markdown-remark": "7.2.1", "@mdx-js/mdx": "^3.1.1", "acorn": "^8.16.0", "es-module-lexer": "^2.0.0", "estree-util-visit": "^2.0.0", "hast-util-to-html": "^9.0.5", "piccolore": "^0.1.3", "rehype-raw": "^7.0.0", "remark-gfm": "^4.0.1", "remark-smartypants": "^3.0.2", "source-map": "^0.7.6", "unist-util-visit": "^5.1.0", "vfile": "^6.0.3" }, "peerDependencies": { "@astrojs/markdown-satteri": "^0.3.1", "astro": "^7.0.0" }, "optionalPeers": ["@astrojs/markdown-satteri"] }, "sha512-l+sJY5U1KkGZUdr+bIL4Y6BefeS549qoSHVSkUSs6A9INwdCND+/0+vN0NroPBXwl5Vcg5u78t7VQRsJjePxbw=="], + + "@astrojs/prism": ["@astrojs/prism@4.0.2", "", { "dependencies": { "prismjs": "^1.30.0" } }, "sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA=="], + + "@astrojs/sitemap": ["@astrojs/sitemap@3.7.3", "", { "dependencies": { "sitemap": "^9.0.0", "stream-replace-string": "^2.0.0", "zod": "^4.3.6" } }, "sha512-f8euLVsyeAmAkSm/1M2Kb8sL8byQmfgbvBNaHFItCheTj/IpiJYSEWVcqDHZ/yEHxiS7+w87mQkzwZaPHmk5GA=="], + + "@astrojs/starlight": ["@astrojs/starlight@0.41.3", "", { "dependencies": { "@astrojs/markdown-satteri": "^0.3.2", "@astrojs/mdx": "^7.0.0", "@astrojs/sitemap": "^3.7.2", "@pagefind/default-ui": "^1.3.0", "@types/hast": "^3.0.4", "@types/js-yaml": "^4.0.9", "@types/mdast": "^4.0.4", "astro-expressive-code": "^0.44.0", "bcp-47": "^2.1.0", "hast-util-from-html": "^2.0.3", "hast-util-select": "^6.0.4", "hast-util-to-string": "^3.0.1", "hastscript": "^9.0.1", "i18next": "^26.0.7", "js-yaml": "^4.1.1", "klona": "^2.0.6", "magic-string": "^0.30.21", "mdast-util-directive": "^3.1.0", "mdast-util-to-markdown": "^2.1.2", "mdast-util-to-string": "^4.0.0", "pagefind": "^1.5.2", "rehype": "^13.0.2", "rehype-format": "^5.0.1", "remark-directive": "^4.0.0", "satteri": "^0.9.1", "ultrahtml": "^1.6.0", "unified": "^11.0.5", "unist-util-visit": "^5.1.0", "vfile": "^6.0.3" }, "peerDependencies": { "@astrojs/markdown-remark": "^7.2.0", "astro": "^7.0.2" }, "optionalPeers": ["@astrojs/markdown-remark"] }, "sha512-8xsG6UpK581TJmtOc7/pnxHKEbP16rV06VLWaVa7FOyE/VEwnaHOsLtL+miifCEfuiuv0Wn+j8u3JSluRQesMQ=="], + + "@astrojs/telemetry": ["@astrojs/telemetry@3.3.2", "", { "dependencies": { "ci-info": "^4.4.0", "dset": "^3.1.4", "is-docker": "^4.0.0", "is-wsl": "^3.1.1", "which-pm-runs": "^1.1.0" } }, "sha512-j8DNruA8ors99Al39RYZPJK4DC1bKkoNm93mAMuBhY9TCNC4R8n1q7ovFnJ5qhGh5Lsh7pa1gpQVpYpsJPeTHQ=="], + + "@astrojs/yaml2ts": ["@astrojs/yaml2ts@0.2.4", "", { "dependencies": { "yaml": "^2.8.3" } }, "sha512-8oddpOae35pJsXPQXhTkM0ypfKPskVsh2bCxRtbf7e+/Epw2nReakFYpLKjZMEr75CsoF203PMnCocpfz0s69A=="], + + "@axe-core/playwright": ["@axe-core/playwright@4.12.1", "", { "dependencies": { "axe-core": "~4.12.1" }, "peerDependencies": { "playwright-core": ">= 1.0.0" } }, "sha512-rMd7xriptqKpP+w5265i4Hdkv2X5kbu6uiBi/B2I7uf3hieRBM3qDCfaKPtxfiYb2mKXfF+yLODJwIx+Jv1GDw=="], "@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], - "@babel/helper-validator-option": ["@babel/helper-validator-option@7.29.7", "", {}, "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw=="], + "@babel/parser": ["@babel/parser@7.29.7", "", { "dependencies": { "@babel/types": "^7.29.7" }, "bin": { "parser": "bin/babel-parser.js" } }, "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg=="], - "@babel/helpers": ["@babel/helpers@7.29.7", "", { "dependencies": { "@babel/template": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg=="], + "@babel/types": ["@babel/types@7.29.7", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA=="], - "@babel/parser": ["@babel/parser@7.29.7", "", { "dependencies": { "@babel/types": "^7.29.7" }, "bin": { "parser": "bin/babel-parser.js" } }, "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg=="], + "@bruits/satteri-darwin-arm64": ["@bruits/satteri-darwin-arm64@0.9.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-iw4nZgx9v30lWo/MTngQqi1pI78KI0DnkSm+lVJGYdmPLgAyDNJigVhpG42/Iq55A6c1Ll8q66ljyyRiQUxwow=="], - "@babel/template": ["@babel/template@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg=="], + "@bruits/satteri-darwin-x64": ["@bruits/satteri-darwin-x64@0.9.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-6T26Z5Kf3cFW2PSlk9p7zT7yVxvuBSiJvYyz9u8KjYwMTqZyIDOj2wDyNpxKV4+6yUVG7rddq2QwvG/8LJA2+Q=="], - "@babel/traverse": ["@babel/traverse@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", "@babel/helper-globals": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/template": "^7.29.7", "@babel/types": "^7.29.7", "debug": "^4.3.1" } }, "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw=="], + "@bruits/satteri-linux-arm64-gnu": ["@bruits/satteri-linux-arm64-gnu@0.9.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-u51id17uJwNEMK9nBlICsq6U31c+XVqQueVBkwRIzZG+gMpS8TOJctt5h5Wz33Z8xnMdTd+adtACVz0yHgGuOA=="], - "@babel/types": ["@babel/types@7.29.7", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA=="], + "@bruits/satteri-linux-arm64-musl": ["@bruits/satteri-linux-arm64-musl@0.9.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-v39HxiwGC5Rqm01HksP6+5Y+xKLPlsuVFgIgpEAo+SiQ22c+mJVhS3u7Z6ePAKdhL5NJoK1xq70kLz3L13AhpQ=="], + + "@bruits/satteri-linux-x64-gnu": ["@bruits/satteri-linux-x64-gnu@0.9.5", "", { "os": "linux", "cpu": "x64" }, "sha512-F3uO8uFp3pAP5ZGXttwvh57GS7s0lL953tnNdyI2gRyP4kOOkp6pyGojNJzCjkDvWI2Cvb9iNrKok3aqQPauAw=="], + + "@bruits/satteri-linux-x64-musl": ["@bruits/satteri-linux-x64-musl@0.9.5", "", { "os": "linux", "cpu": "x64" }, "sha512-bicEqglLlz++mWyADaZoP0JY20s4vDfLjaPYgQqC+NI4zZLTOOg1T4GB8aqtc822Pqji8SQBmSrTb7CrP8i08Q=="], + + "@bruits/satteri-wasm32-wasi": ["@bruits/satteri-wasm32-wasi@0.9.5", "", { "dependencies": { "@emnapi/core": "1.11.1", "@emnapi/runtime": "1.11.1", "@napi-rs/wasm-runtime": "^1.1.6" }, "cpu": "none" }, "sha512-zauAuMwfPnKPUkd4AFixRFpXdgKwP2mKgxrIIo2gJzW0/ZneF9dbHnLkojSpaBnCCp7VUL1hIi5WWZvB1CqmAQ=="], + + "@bruits/satteri-win32-arm64-msvc": ["@bruits/satteri-win32-arm64-msvc@0.9.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-SrfE7NEsgZjBvU3c+RR6oQRu0ToXY5uVJEbieXEF0YTctIV2zAVlbaMjWLts074QCgh3a+XHWkR/lWh2VH2LUg=="], + + "@bruits/satteri-win32-x64-msvc": ["@bruits/satteri-win32-x64-msvc@0.9.5", "", { "os": "win32", "cpu": "x64" }, "sha512-5Kw9ZAtTGS8WHizyn+CJhjjfIQrw+7jcZodpmpXJjefnO15M8UexIi6JR2E5thyvsmHyhL6ZDDMUNR4bKJPd4g=="], + + "@capsizecss/unpack": ["@capsizecss/unpack@4.0.1", "", { "dependencies": { "fontkitten": "^1.0.3" } }, "sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ=="], + + "@clack/core": ["@clack/core@1.4.3", "", { "dependencies": { "fast-wrap-ansi": "^0.2.0", "sisteransi": "^1.0.5" } }, "sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ=="], + + "@clack/prompts": ["@clack/prompts@1.7.0", "", { "dependencies": { "@clack/core": "1.4.3", "fast-string-width": "^3.0.2", "fast-wrap-ansi": "^0.2.0", "sisteransi": "^1.0.5" } }, "sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A=="], + + "@ctrl/tinycolor": ["@ctrl/tinycolor@4.2.0", "", {}, "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A=="], + + "@emmetio/abbreviation": ["@emmetio/abbreviation@2.3.3", "", { "dependencies": { "@emmetio/scanner": "^1.0.4" } }, "sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA=="], + + "@emmetio/css-abbreviation": ["@emmetio/css-abbreviation@2.1.8", "", { "dependencies": { "@emmetio/scanner": "^1.0.4" } }, "sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw=="], + + "@emmetio/css-parser": ["@emmetio/css-parser@0.4.1", "", { "dependencies": { "@emmetio/stream-reader": "^2.2.0", "@emmetio/stream-reader-utils": "^0.1.0" } }, "sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ=="], + + "@emmetio/html-matcher": ["@emmetio/html-matcher@1.3.0", "", { "dependencies": { "@emmetio/scanner": "^1.0.0" } }, "sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ=="], + + "@emmetio/scanner": ["@emmetio/scanner@1.0.4", "", {}, "sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA=="], + + "@emmetio/stream-reader": ["@emmetio/stream-reader@2.2.0", "", {}, "sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw=="], + + "@emmetio/stream-reader-utils": ["@emmetio/stream-reader-utils@0.1.0", "", {}, "sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A=="], + + "@emnapi/core": ["@emnapi/core@1.11.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" } }, "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ=="], + + "@emnapi/runtime": ["@emnapi/runtime@1.11.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw=="], + + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.28.1", "", { "os": "android", "cpu": "arm" }, "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.28.1", "", { "os": "android", "cpu": "arm64" }, "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.28.1", "", { "os": "android", "cpu": "x64" }, "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.28.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.28.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.28.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.28.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.28.1", "", { "os": "linux", "cpu": "arm" }, "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.28.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.28.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ=="], - "@braintree/sanitize-url": ["@braintree/sanitize-url@7.1.2", "", {}, "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA=="], + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.28.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ=="], - "@chevrotain/types": ["@chevrotain/types@11.1.2", "", {}, "sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw=="], + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ=="], - "@emnapi/core": ["@emnapi/core@1.10.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="], + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.28.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag=="], - "@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="], + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.28.1", "", { "os": "linux", "cpu": "x64" }, "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA=="], - "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="], + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw=="], - "@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="], + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.28.1", "", { "os": "none", "cpu": "x64" }, "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg=="], - "@iconify/utils": ["@iconify/utils@3.1.3", "", { "dependencies": { "@antfu/install-pkg": "^1.1.0", "@iconify/types": "^2.0.0", "import-meta-resolve": "^4.2.0" } }, "sha512-LPKOXPn/zV+zis1oOfGWogaXVpqUybF3ZS6SCZIsz8vg0ivVp9+fVqyYB7xq0aiST/VhUQYGO1qo6uoYSiEJqw=="], + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.28.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q=="], - "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.28.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw=="], - "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg=="], - "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.28.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.28.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.28.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.1", "", { "os": "win32", "cpu": "x64" }, "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A=="], + + "@expressive-code/core": ["@expressive-code/core@0.44.0", "", { "dependencies": { "@ctrl/tinycolor": "^4.0.4", "hast-util-select": "^6.0.2", "hast-util-to-html": "^9.0.1", "hast-util-to-text": "^4.0.1", "hastscript": "^9.0.0", "postcss": "^8.4.38", "postcss-nested": "^6.0.1", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.1" } }, "sha512-xgiF2P6tYUbrhi3+x0S8xHZWT1t3Bvb3U91tAtRbLb9HLejLvYc5GZUqKICKLaUN4iSGhhNJu2fM/aH8e5yCMg=="], + + "@expressive-code/plugin-frames": ["@expressive-code/plugin-frames@0.44.0", "", { "dependencies": { "@expressive-code/core": "^0.44.0" } }, "sha512-V6M6+zVc1GzqCvXkQHc2m5rcFOIVzJgMq5gnfrMnVf2gwtj/sg4H93c1f/mGeqHycubwkHFUDyParAOiGeDZeA=="], + + "@expressive-code/plugin-shiki": ["@expressive-code/plugin-shiki@0.44.0", "", { "dependencies": { "@expressive-code/core": "^0.44.0", "shiki": "^4.0.2" } }, "sha512-RZsdaqlbGqyAQKuoX4myQXxjmiE2l5KBpJ/gKPh62tCdIdpWyjbzVqSo8+5XsezZxkfi8AJ/J6EUaBTPROFX/Q=="], + + "@expressive-code/plugin-text-markers": ["@expressive-code/plugin-text-markers@0.44.0", "", { "dependencies": { "@expressive-code/core": "^0.44.0" } }, "sha512-0/m3A5b+lz2upyNq+wzZ1S69HRoJmyFs5LsR42lVZ9pmGRlBiSBYQpvqlji4DBj1+Riamxc0AvcCr5kuzOQeWA=="], + + "@formatjs/ecma402-abstract": ["@formatjs/ecma402-abstract@2.3.6", "", { "dependencies": { "@formatjs/fast-memoize": "2.2.7", "@formatjs/intl-localematcher": "0.6.2", "decimal.js": "^10.4.3", "tslib": "^2.8.0" } }, "sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw=="], + + "@formatjs/fast-memoize": ["@formatjs/fast-memoize@2.2.7", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ=="], + + "@formatjs/icu-messageformat-parser": ["@formatjs/icu-messageformat-parser@2.11.4", "", { "dependencies": { "@formatjs/ecma402-abstract": "2.3.6", "@formatjs/icu-skeleton-parser": "1.8.16", "tslib": "^2.8.0" } }, "sha512-7kR78cRrPNB4fjGFZg3Rmj5aah8rQj9KPzuLsmcSn4ipLXQvC04keycTI1F7kJYDwIXtT2+7IDEto842CfZBtw=="], + + "@formatjs/icu-skeleton-parser": ["@formatjs/icu-skeleton-parser@1.8.16", "", { "dependencies": { "@formatjs/ecma402-abstract": "2.3.6", "tslib": "^2.8.0" } }, "sha512-H13E9Xl+PxBd8D5/6TVUluSpxGNvFSlN/b3coUp0e0JpuWXXnQDiavIpY3NnvSp4xhEMoXyyBvVfdFX8jglOHQ=="], + + "@formatjs/intl-localematcher": ["@formatjs/intl-localematcher@0.6.2", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA=="], + + "@img/colour": ["@img/colour@1.1.0", "", {}, "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ=="], + + "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.35.3", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.3.2" }, "os": "darwin", "cpu": "arm64" }, "sha512-RMnFX7YQsMoh7lWfcM4NEHHymBX/rLuKNPVM84XE9ONPcaSCDgE7CHIHpSgPcO2xcRthgBy1HfNO319mwhIAkg=="], + + "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.35.3", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.3.2" }, "os": "darwin", "cpu": "x64" }, "sha512-Xo+5uFBtLN0BKqieTxiFzFPQAUlBbbH5iBKyRX/z1JrbnYsHTfKJnUfL8+p2TPXr1pXqao4eeL4Rl144uDpK9w=="], + + "@img/sharp-freebsd-wasm32": ["@img/sharp-freebsd-wasm32@0.35.3", "", { "dependencies": { "@img/sharp-wasm32": "0.35.3" }, "os": "freebsd" }, "sha512-lUxcqWIj2wMQ9BrwNjngcr1gWUr5xgaGThBRqPPalIC2n67Cqj1uPh8NnA/ZhAg8hUbKl+kVHKwgUIwe6ZYPrg=="], + + "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.3.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-9J6ypZFpQBj4YnePGoq/S38w6nz+vqg5WZLrLGY4YuSemdMq47GMLBPO42MzwdGwpg/agZ7xzZcFHa48xlywfg=="], + + "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.3.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-m2pW1n6cns9VaubNwsZ+c3CRYjxNQWgJ5gPlnL1nbBcpkBvFm6SCFN5o0psFHI8w9n11NKhFkeEDns98tiqbEw=="], + + "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.3.2", "", { "os": "linux", "cpu": "arm" }, "sha512-1eMLzy92I4J6rmi4mAT8yC3HxOtniyGELlzGbNMLLeqe052ahFQ0h6LFq+lh5DsDIdYViIDst08abvSbcEdLXQ=="], + + "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.3.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-dqVSFynCox4C/J8kT16V7SIFAns0IjgLwkvYT7p8LQVmJ5OS5b6tI9IGflxTeuBS//zXeFIUbwt5dwxyZ17cnA=="], + + "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.3.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-3z0NHDxD6n5I9gc05U1eW1AyRm+Gznzq3naMrthPNqE6oYykcogW0l/jfpJdjYnuNl8R7yI9pNbE1XiUeyq0Aw=="], + + "@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.3.2", "", { "os": "linux", "cpu": "none" }, "sha512-bsb4rI+NldGOsXuej2r8OdSS8+zXDVaCWxyWrcv6kneTOlgAHtZABRzBBCwdsPiD90J4myNJuHpg6kA20ImW/w=="], + + "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.3.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-/ABshyj8gCpyIrNXnHn4LorDJ0HHm1VhXPBlxZ8zAtfVPAaSafXPGn+sUSIRiwaSBy0mmFjSjiXI5mkcwdChKQ=="], + + "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.3.2", "", { "os": "linux", "cpu": "x64" }, "sha512-ITPEtgffGJ0S6G9dRyw/366tJQqFRcHWPHhC+Stpg3Z8AEMrDrTr2lhdz4f/Y/HMbRh//7Z5mBzEpVdi62Oc3w=="], + + "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.3.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-zE9EdiUzUmg5mDT5a1rk5fYJ6GWPloTwWBYDS14naqHsL+EaMpDj1AWnpLgh3u0YCORv2Tt50wrcrpYqkP97Kw=="], + + "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.3.2", "", { "os": "linux", "cpu": "x64" }, "sha512-m0lrLiUt+lBYnCFr8qV/65yMR4E/c7/wf78I5eKTdkEakFAlZ9QlzEM3QIhhAwVeUhLAHLcCq7a7Vszq/oFNZQ=="], + + "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.35.3", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.3.2" }, "os": "linux", "cpu": "arm" }, "sha512-affVWCTLooy8TSxbDx2qkzuDeaWLNVBA+P//FNBirHsXpP2fuBhk5AuboYUnrDnzoXes8GFjpTx0SBFOCRg+FA=="], + + "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.35.3", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.3.2" }, "os": "linux", "cpu": "arm64" }, "sha512-QgKDspHPnrU+GQ55XPhGwyhC8acLVOOSyAvo1oVfFmrIXLkDNmGWzAfDZ4xK8oSA1qBQrALcHX0G5UZni/SuFQ=="], + + "@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.35.3", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.3.2" }, "os": "linux", "cpu": "ppc64" }, "sha512-sMd8rDxmpLOwv/7N44klFjOD5DUO7FLdjiXDI0hoxYaf7Ar262dQIEkosE98bps+5HPLtp/EvNqeqQtOycP/IA=="], + + "@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.35.3", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.3.2" }, "os": "linux", "cpu": "none" }, "sha512-0Eob78yjlYPfL5vMNWAW55l3R9Y6BQS/gOfe0ZcP9mEz9ohhKSt4im1hayiknXgf8AWrFqMvJcKIdmLmEe7yeQ=="], + + "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.35.3", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.3.2" }, "os": "linux", "cpu": "s390x" }, "sha512-KgAxQ0DxpNOq1rG2t5cgTgShJFGSuU7XO45cqC+1NVOuZnP6tlgZRuSYOfNupGkHID0o3cJOsw4DVeJpMovcGw=="], + + "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.35.3", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.3.2" }, "os": "linux", "cpu": "x64" }, "sha512-8pqvxubL2PGdhlPy6GLqzDYMUjyRmKAwKHYKixpdJYBUK7PJ0C029XdsnpFIdgRZG68fZiGdHVWcKPvtiPB4cA=="], + + "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.35.3", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.3.2" }, "os": "linux", "cpu": "arm64" }, "sha512-Vz0iQjzzcSX3HCbfwFfCSG/9SCIqyO0mH2sXyiHaAYfBk0cRsCWXRyQYX0ovCK/PAQBbTzQ0dsPQHh5MAFL59w=="], + + "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.35.3", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.3.2" }, "os": "linux", "cpu": "x64" }, "sha512-6O1NPKcDVj9QEdg7Hx549EX8U0rp6yXQERqru6yRN7fGBn32UvIRJUlWnk+8xDCiG76hXVBbX82NZ/ZKr0euIg=="], + + "@img/sharp-wasm32": ["@img/sharp-wasm32@0.35.3", "", { "dependencies": { "@emnapi/runtime": "^1.11.1" } }, "sha512-cZ0XkcYGpHZkqW6iCkqTcmUC0CD9DhD5d/qeZlZkfRBn6GnHniZXLUo5+9xw8Iv76YE6LQFN9YNBlKREcCG76w=="], + + "@img/sharp-webcontainers-wasm32": ["@img/sharp-webcontainers-wasm32@0.35.3", "", { "dependencies": { "@img/sharp-wasm32": "0.35.3" }, "cpu": "none" }, "sha512-2rnq7bX3NzeR2T4YWgz8qiG4h3TSdMe+vN1iQXpJleSJ3SM5zQ8Fy2SyyXAWlbxpEZ2Y+Z4u1BePgJEYbSy80Q=="], + + "@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.35.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-4bPwFdMbeC4JQ8L8LOyWp6nsHcboP5fxkp6iPOXz2Vg49R42TuMs2whkJ5OAP4/Ul035qOzy0AecOF9VOscn4w=="], + + "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.35.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-r53mXsBN6lFUDiST764SvgwUdHAqM4rPAiDzAmf4fLoB6X/rkfyTrLCg6+g17wJJiCmB3JYgHuUldCWUIRFSXw=="], + + "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.35.3", "", { "os": "win32", "cpu": "x64" }, "sha512-D4y1vNeZrIIJCN+uHaWVtH86B+aCrdMYYjicy9pXHvbGZeGYLLSd3wdVuC37FxVXlU1ARsk84eKWfWMXGYEqvA=="], "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], - "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + "@lhci/cli": ["@lhci/cli@0.15.1", "", { "dependencies": { "@lhci/utils": "0.15.1", "chrome-launcher": "^0.13.4", "compression": "^1.7.4", "debug": "^4.3.1", "express": "^4.17.1", "inquirer": "^6.3.1", "isomorphic-fetch": "^3.0.0", "lighthouse": "12.6.1", "lighthouse-logger": "1.2.0", "open": "^7.1.0", "proxy-agent": "^6.4.0", "tmp": "^0.1.0", "uuid": "^8.3.1", "yargs": "^15.4.1", "yargs-parser": "^13.1.2" }, "bin": { "lhci": "./src/cli.js" } }, "sha512-yhC0oXnXqGHYy1xl4D8YqaydMZ/khFAnXGY/o2m/J3PqPa/D0nj3V6TLoH02oVMFeEF2AQim7UbmdXMiXx2tOw=="], - "@mermaid-js/parser": ["@mermaid-js/parser@1.1.1", "", { "dependencies": { "@chevrotain/types": "~11.1.1" } }, "sha512-VuHdsYMK1bT6X2JbcAaWAhugTRvRBRyuZgd+c22swUeI9g/ntaxF7CY7dYarhZovofCbUNO0G7JesfmNtjYOCw=="], + "@lhci/utils": ["@lhci/utils@0.15.1", "", { "dependencies": { "debug": "^4.3.1", "isomorphic-fetch": "^3.0.0", "js-yaml": "^3.13.1", "lighthouse": "12.6.1", "tree-kill": "^1.2.1" } }, "sha512-WclJnUQJeOMY271JSuaOjCv/aA0pgvuHZS29NFNdIeI14id8eiFsjith85EGKYhljgoQhJ2SiW4PsVfFiakNNw=="], - "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.5", "", { "dependencies": { "@tybys/wasm-util": "^0.10.2" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q=="], + "@mdx-js/mdx": ["@mdx-js/mdx@3.1.1", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdx": "^2.0.0", "acorn": "^8.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", "recma-build-jsx": "^1.0.0", "recma-jsx": "^1.0.0", "recma-stringify": "^1.0.0", "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "source-map": "^0.7.0", "unified": "^11.0.0", "unist-util-position-from-estree": "^2.0.0", "unist-util-stringify-position": "^4.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ=="], - "@oxc-project/types": ["@oxc-project/types@0.133.0", "", {}, "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA=="], + "@mobench/docs": ["@mobench/docs@workspace:apps/docs"], - "@radix-ui/primitive": ["@radix-ui/primitive@1.1.4", "", {}, "sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ=="], + "@mobench/marketing": ["@mobench/marketing@workspace:apps/marketing"], - "@radix-ui/react-accordion": ["@radix-ui/react-accordion@1.2.14", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-collapsible": "1.1.14", "@radix-ui/react-collection": "1.1.10", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-primitive": "2.1.6", "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-iE8YB9nmTBH8zd73ofBISZ8JCzgMoMkATJr7qDwa6u5F1+7mTM81V6fa71jgZ65rpjVpecDf1vSnwIFP9Ly1zw=="], + "@mobench/site-config": ["@mobench/site-config@workspace:packages/site-config"], - "@radix-ui/react-collapsible": ["@radix-ui/react-collapsible@1.1.14", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-presence": "1.1.6", "@radix-ui/react-primitive": "2.1.6", "@radix-ui/react-use-controllable-state": "1.2.3", "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-9bT+FvifX1FK2Mj6UEsTdyu0cN3JaA3KdfhaBao+ONrYFy/pyOy3TU1TNw7iOk1o+0hOEq67RojlUUmoFGwxyA=="], + "@mobench/truth": ["@mobench/truth@workspace:packages/truth"], - "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.10", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-primitive": "2.1.6", "@radix-ui/react-slot": "1.3.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-IVVz4EvBcKjrzKgof714qDnz/SzQAkLA2Emh5edlHbgcE6fNd3Un6CJLlaYcnm8N4JmAtzQgse4dOKxcD2yc9g=="], + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.6", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg=="], - "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.3", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA=="], + "@oslojs/encoding": ["@oslojs/encoding@1.1.0", "", {}, "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ=="], - "@radix-ui/react-context": ["@radix-ui/react-context@1.1.4", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg=="], + "@oxc-project/types": ["@oxc-project/types@0.133.0", "", {}, "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA=="], + + "@pagefind/darwin-arm64": ["@pagefind/darwin-arm64@1.5.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ=="], + + "@pagefind/darwin-x64": ["@pagefind/darwin-x64@1.5.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-IojxFWMEJe0RQ7PQ3KXQsPIImNsbpPYpoZ+QUDrL8fAl/O27IX+LVLs74/UzEZy5uA2LD8Nz1AiwKr72vrkZQw=="], + + "@pagefind/default-ui": ["@pagefind/default-ui@1.5.2", "", {}, "sha512-pm1LMnQg8N2B3n2TnjKlhaFihpz6zTiA4HiGQ6/slKO/+8K9CAU5kcjdSSPgpuk1PMuuN4hxLipUIifnrkl3Sg=="], - "@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-C3vFhbyi4SW3PmbAi6Awpu4OzJtd0MxGurvSsYtr7p7nM8RNB3VAF3CUmnp2j50knpkrRcB7+ycVXzgLgF6yNA=="], + "@pagefind/freebsd-x64": ["@pagefind/freebsd-x64@1.5.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-7EVzo9+0w+2cbe671BtMj10UlNo83I+HrLVLfRxO731svHRJKUfJ/mo05gU14pe9PCfpKNQT8FS3Xc/oDN6pOA=="], - "@radix-ui/react-id": ["@radix-ui/react-id@1.1.2", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA=="], + "@pagefind/linux-arm64": ["@pagefind/linux-arm64@1.5.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-Ovt9+K35sqzn8H3ZMXGwls4TD/wMJuvRtShHIsmUQREmaxjrDEX7gHckRCrwYJ4XE1H1p6HkLz3wukrAnsfXQw=="], - "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.6", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-zdTk4PlUO0E18HnZ3wYbW0KkJJxWCdiNYp6g6X1PtONFhxVkg01vliTJAmwIszU6mHiyBOoW9P0rAugl5/hULQ=="], + "@pagefind/linux-x64": ["@pagefind/linux-x64@1.5.2", "", { "os": "linux", "cpu": "x64" }, "sha512-V+tFqHKXhQKq/WqPBD67AFy7scn1/aZID00ws4fSDd+1daSi5UHR9VVlRrOUYKxn3VuFQYRD7lYXdZK1WED1YA=="], - "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.6", "", { "dependencies": { "@radix-ui/react-slot": "1.3.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-wetd0QI77DbvrPpTAvH1SqOxsYF2wZe5TNxqwOd5Ty4XDpV3dpV0s8K/1MGMJBeY5o7lg8ub5VIt1Ub+yVen6g=="], + "@pagefind/windows-arm64": ["@pagefind/windows-arm64@1.5.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-hN9Nh90fNW61nNRCW9ZyQrAj/mD0eRvmJ8NlTUzkbuW8kIzGJUi3cxjFkEcMZ5h/8FsKWD/VcouZl4yo1F7B6g=="], - "@radix-ui/react-slot": ["@radix-ui/react-slot@1.3.0", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-MojKku4U/miO8Av4Dkb+ctMAQx7JmY96LmtDQlAarCRtd7rN52QCSzBF+XAvr5S6coSVj9HEPBgHAHKEJVk/WA=="], + "@pagefind/windows-x64": ["@pagefind/windows-x64@1.5.2", "", { "os": "win32", "cpu": "x64" }, "sha512-Fa2Iyw7kaDRzGMfNYNUXNW2zbL5FQVDgSOcbDHdzBrDEdpqOqg8TcZ68F22ol6NJ9IGzvUdmeyZypLW5dyhqsg=="], - "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.2.3", "", { "dependencies": { "@radix-ui/react-use-effect-event": "0.0.3", "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA=="], + "@paulirish/trace_engine": ["@paulirish/trace_engine@0.0.53", "", { "dependencies": { "legacy-javascript": "latest", "third-party-web": "latest" } }, "sha512-PUl/vlfo08Oj804VI5nDPeSk9vyslnBlVzDDwFt8SUVxY8+KdGMkra/vrXjEEHe8gb7+RqVTfOIlGw0nyrEelA=="], - "@radix-ui/react-use-effect-event": ["@radix-ui/react-use-effect-event@0.0.3", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA=="], + "@playwright/test": ["@playwright/test@1.61.1", "", { "dependencies": { "playwright": "1.61.1" }, "bin": { "playwright": "cli.js" } }, "sha512-8nKv6+0RJSL9FE4jYOEGXnPeM/Hg12qZpmqzZjRh3qM0Y7c3z1mrOTfFLids72RDQYVh9WpLEfR5WdpNX4fkig=="], - "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA=="], + "@puppeteer/browsers": ["@puppeteer/browsers@2.13.2", "", { "dependencies": { "debug": "^4.4.3", "extract-zip": "^2.0.1", "progress": "^2.0.3", "proxy-agent": "^6.5.0", "semver": "^7.7.4", "tar-fs": "^3.1.1", "yargs": "^17.7.2" }, "bin": { "browsers": "lib/cjs/main-cli.js" } }, "sha512-5EUZSUIc37H6aIXyWO0Z4y8NlF8NnjgmqeQgOGiswAU7pY0HOo16ho4+alIWmSfdZnjqBRawMsP3I5YqLSn6kw=="], "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.3", "", { "os": "android", "cpu": "arm64" }, "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw=="], @@ -156,422 +359,1496 @@ "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="], - "@tailwindcss/node": ["@tailwindcss/node@4.3.1", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "5.21.6", "jiti": "^2.7.0", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.3.1" } }, "sha512-6NDaqRoAMSXD1mr/RXu0HBvNE9a2n5tHPsxu9XHLws8o4Twes5rBM2205SUUiJ9goAtadrN6xTGX0UDEwp/N4A=="], + "@rollup/pluginutils": ["@rollup/pluginutils@5.4.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg=="], - "@tailwindcss/oxide": ["@tailwindcss/oxide@4.3.1", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.3.1", "@tailwindcss/oxide-darwin-arm64": "4.3.1", "@tailwindcss/oxide-darwin-x64": "4.3.1", "@tailwindcss/oxide-freebsd-x64": "4.3.1", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.1", "@tailwindcss/oxide-linux-arm64-gnu": "4.3.1", "@tailwindcss/oxide-linux-arm64-musl": "4.3.1", "@tailwindcss/oxide-linux-x64-gnu": "4.3.1", "@tailwindcss/oxide-linux-x64-musl": "4.3.1", "@tailwindcss/oxide-wasm32-wasi": "4.3.1", "@tailwindcss/oxide-win32-arm64-msvc": "4.3.1", "@tailwindcss/oxide-win32-x64-msvc": "4.3.1" } }, "sha512-yVPyo8RNkabVr3O2EhHEE0Rewu7YKzc1DhIqfL46LKveFrmu9XbDazNOJY7/GRuvw1h6u3utWnR29H/p5JPlgA=="], + "@sentry-internal/tracing": ["@sentry-internal/tracing@7.120.4", "", { "dependencies": { "@sentry/core": "7.120.4", "@sentry/types": "7.120.4", "@sentry/utils": "7.120.4" } }, "sha512-Fz5+4XCg3akeoFK+K7g+d7HqGMjmnLoY2eJlpONJmaeT9pXY7yfUyXKZMmMajdE2LxxKJgQ2YKvSCaGVamTjHw=="], - "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.3.1", "", { "os": "android", "cpu": "arm64" }, "sha512-SVlyf61g374l5cHyg8x9kf5xmLcOaxvOTsbsqDnSsDJaKOEFZ7GCvi84VAVGpxojYOs1+3K6M0UjXfqPU8vmOQ=="], + "@sentry/core": ["@sentry/core@7.120.4", "", { "dependencies": { "@sentry/types": "7.120.4", "@sentry/utils": "7.120.4" } }, "sha512-TXu3Q5kKiq8db9OXGkWyXUbIxMMuttB5vJ031yolOl5T/B69JRyAoKuojLBjRv1XX583gS1rSSoX8YXX7ATFGA=="], - "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.3.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-hVnWLwv+e/l7c4WKyVtHVrIPvYdqWHjRB3MDIqARynzFtnQg85kmQEFCbV9Ja0VVx4xXTIiDWY60Y7iz/iNoDA=="], + "@sentry/integrations": ["@sentry/integrations@7.120.4", "", { "dependencies": { "@sentry/core": "7.120.4", "@sentry/types": "7.120.4", "@sentry/utils": "7.120.4", "localforage": "^1.8.1" } }, "sha512-kkBTLk053XlhDCg7OkBQTIMF4puqFibeRO3E3YiVc4PGLnocXMaVpOSCkMqAc1k1kZ09UgGi8DxfQhnFEjUkpA=="], - "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.3.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-Cf7abu0WVgbhU7ANgPUnSAvm7nCvMweusHb8FnaHlLfv/Caq4GYaEZg7ZImzzmjx4lIAfuS8q+eLIS7A7IzxIg=="], + "@sentry/node": ["@sentry/node@7.120.4", "", { "dependencies": { "@sentry-internal/tracing": "7.120.4", "@sentry/core": "7.120.4", "@sentry/integrations": "7.120.4", "@sentry/types": "7.120.4", "@sentry/utils": "7.120.4" } }, "sha512-qq3wZAXXj2SRWhqErnGCSJKUhPSlZ+RGnCZjhfjHpP49KNpcd9YdPTIUsFMgeyjdh6Ew6aVCv23g1hTP0CHpYw=="], - "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.3.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-ZZqzX2Y+GXtXXfqSfpJhDm60OoZfvLHLCgm+J7NVqgHHJjG/m9ugZI77RwTsVd4fnBJuCFP6Ae6kTJb71UdS8g=="], + "@sentry/types": ["@sentry/types@7.120.4", "", {}, "sha512-cUq2hSSe6/qrU6oZsEP4InMI5VVdD86aypE+ENrQ6eZEVLTCYm1w6XhW1NvIu3UuWh7gZec4a9J7AFpYxki88Q=="], - "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.3.1", "", { "os": "linux", "cpu": "arm" }, "sha512-/Ah/xik0LaMYfv9DZ0S/t4pBlBNYOcqtRwusjgovHkvT8ixueWCLyJjsaF5kQIckjb4IT8Q6K6p/iPmZMixYgg=="], + "@sentry/utils": ["@sentry/utils@7.120.4", "", { "dependencies": { "@sentry/types": "7.120.4" } }, "sha512-zCKpyDIWKHwtervNK2ZlaK8mMV7gVUijAgFeJStH+CU/imcdquizV3pFLlSQYRswG+Lbyd6CT/LGRh3IbtkCFw=="], - "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.3.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-gqdFoVJlw444GvpnheZLHmvTzSxI/cOUUh2KSNejQjTcYkW062SVD+En0rUgD+QV91bz1XGIGtt1HJd48xUGbQ=="], + "@shikijs/core": ["@shikijs/core@4.3.1", "", { "dependencies": { "@shikijs/primitive": "4.3.1", "@shikijs/types": "4.3.1", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-ANMDxuaPsNMdDC1m4vfvhlDmJweMwkE5XitTwrq2rWHx5jM+dlm4MmHt2PP6t0uejfR77SuhrhJ0zEijIF/uhA=="], - "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.3.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-Bwv9KwOvE0VKa86xPFif9b9c3Y1NxOV1P0gLti/IYaWEsQYZXDlxfGEtA8mdDZ7SG3wyNXAWYT5SIn3giL57oA=="], + "@shikijs/engine-javascript": ["@shikijs/engine-javascript@4.3.1", "", { "dependencies": { "@shikijs/types": "4.3.1", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.6" } }, "sha512-JBItcnPuYq7jVJdZo/vMj94r+szT7XEjHFX+mvFDGSEIbVAXAGyHAHzhbWzpGOwYidCZrErJLLgn2PVeiokHnQ=="], - "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.3.1", "", { "os": "linux", "cpu": "x64" }, "sha512-Ymi8O8T15HYQdOUWUtTI6ldN0neHP85FC+Qz32xTcZ7iJXtem/x8ITev0o1e9e5rkqj4lONZfTRLvkmin1+tKg=="], + "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@4.3.1", "", { "dependencies": { "@shikijs/types": "4.3.1", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-OXyNMzg0pews+msMj4cHeqT4xiYKKvbnn6VbdAXxfoFl3SSx4fJTc8FadECuc5/H9p3BzhNAoAUXKwAu9rWYhg=="], - "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.3.1", "", { "os": "linux", "cpu": "x64" }, "sha512-M+P/91qJ6uILLw4k2G93GMDRAXj61SMvFQYt39AqvUqYgExXpLL5aepfns7sj4HiAQeolirQF9E0lzRvdf4zPQ=="], + "@shikijs/langs": ["@shikijs/langs@4.3.1", "", { "dependencies": { "@shikijs/types": "4.3.1" } }, "sha512-m0l9nsDqgBHvbZbk7A0/kXz/impK3uB/c6rAn6Gpg/uPtdZRQ+alsN/17MU5thb68XTj/4DxkZAotrM0GGSpDQ=="], - "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.3.1", "", { "cpu": "none" }, "sha512-zsM8uOeqvVGHsAXsJxsT28ttosFahLJKCLOTUBqRAtKnVgGSRitds9T432QiT8b77Yga7JIBkulIRRlJPtYhRA=="], + "@shikijs/primitive": ["@shikijs/primitive@4.3.1", "", { "dependencies": { "@shikijs/types": "4.3.1", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-CXQRQOYy1leqQ8ceTeJdmXv/bsUY++6QyLpXJ94LZAAYj5X2SKRdc5ipguv4NPyGVKItB2PPwUpRNe0Sjh5S1A=="], - "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.3.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-aiNvSq9BsVk8V513lDKlrCFAgf8qBMPZTpgEhInL+NwQqs97mYmupVMrPrgBBSL8Pv/0zXu9MrMF9rMun1ZeNg=="], + "@shikijs/themes": ["@shikijs/themes@4.3.1", "", { "dependencies": { "@shikijs/types": "4.3.1" } }, "sha512-dgpoJ4WqNi2yTmizQHBJ5zcX6j2lE6icN/0yt4l1kkf16jrY/pwPLoTb1ETsWMz0OBLf9ZNvwmxft+cH+N9qSA=="], - "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.3.1", "", { "os": "win32", "cpu": "x64" }, "sha512-xDEyu1rg290472FEGaKHnzyDyh5QH+AlWvsU5hMoMtPpzmKlRI0jaYKCgSHDYtaQWZOYbMaduSyCwFwY4n1HmA=="], + "@shikijs/types": ["@shikijs/types@4.3.1", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-CHFxE0jztBIZRHH6gxXE7DXUCFXjReEGxZ/j0rfSLGKZuwp2xBYycEP14875DSa9KLL/6700oxIq6oO6ef9K2g=="], - "@tailwindcss/vite": ["@tailwindcss/vite@4.3.1", "", { "dependencies": { "@tailwindcss/node": "4.3.1", "@tailwindcss/oxide": "4.3.1", "tailwindcss": "4.3.1" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, "sha512-hItDHuIIlEV61R+faXu66s1K36aTurO/Qw0e45Vskz57gXl9pWOT6eg3zmcEui6CZXddbN7zd41bwmvag4JGwQ=="], + "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], - "@tanstack/history": ["@tanstack/history@1.162.0", "", {}, "sha512-79pf/RkhteYZTRgcR4F9kbk84P2N8rugQJswxfIqovlbRiT3yI7eBE+5QorIrZaOKktsgzRlXh1l/du/xpl4iA=="], + "@tootallnate/quickjs-emscripten": ["@tootallnate/quickjs-emscripten@0.23.0", "", {}, "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA=="], - "@tanstack/react-router": ["@tanstack/react-router@1.170.16", "", { "dependencies": { "@tanstack/history": "1.162.0", "@tanstack/react-store": "^0.9.3", "@tanstack/router-core": "1.171.13", "isbot": "^5.1.22" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-w6eq1IJklujs1tESazaK/FxH0+H2l8vm/QPuu1cD3oRW/ubgKneQpd7b64ti/8gUyEimzimJQZDmJr6YHfP5+g=="], + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg=="], - "@tanstack/react-router-devtools": ["@tanstack/react-router-devtools@1.167.0", "", { "dependencies": { "@tanstack/router-devtools-core": "1.168.0" }, "peerDependencies": { "@tanstack/react-router": "^1.170.0", "@tanstack/router-core": "^1.170.0", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-nGw095EG7IHx0h5NtlEmzf6vcCTaFNPWdTSuDKazajhN0ct/v/TkekJ9J6KYUCeV1a8/2ZmToc58M+0rrOyn7w=="], + "@types/debug": ["@types/debug@4.1.13", "", { "dependencies": { "@types/ms": "*" } }, "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw=="], - "@tanstack/react-store": ["@tanstack/react-store@0.9.3", "", { "dependencies": { "@tanstack/store": "0.9.3", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg=="], + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], - "@tanstack/router-core": ["@tanstack/router-core@1.171.13", "", { "dependencies": { "@tanstack/history": "1.162.0", "cookie-es": "^3.0.0", "seroval": "^1.5.4", "seroval-plugins": "^1.5.4" } }, "sha512-+NOwEj1kO/6IGmpHRIZHasYxYWpyBQGNIZAST9aNrk9Q3YlU9SgqVnl1pbLa9qAKfeNdXQIRve0RQb/0kyDeDA=="], + "@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="], - "@tanstack/router-devtools-core": ["@tanstack/router-devtools-core@1.168.0", "", { "dependencies": { "clsx": "^2.1.1", "goober": "^2.1.16" }, "peerDependencies": { "@tanstack/router-core": "^1.170.0", "csstype": "^3.0.10" } }, "sha512-wQoQhlBK7nlZgqzaqdYXKWNTpdHdsaREdaPhFZVH0/Ador+F+eM3/NF2i3f2LPeS0GgKraZUQXe1Q/1+KHyEYg=="], + "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], - "@tanstack/router-generator": ["@tanstack/router-generator@1.167.17", "", { "dependencies": { "@babel/types": "^7.28.5", "@tanstack/router-core": "1.171.13", "@tanstack/router-utils": "1.162.2", "@tanstack/virtual-file-routes": "1.162.0", "jiti": "^2.7.0", "magic-string": "^0.30.21", "prettier": "^3.5.0", "zod": "^4.4.3" } }, "sha512-xtB9tB2Ws0tWR6Pi7nc3Qk9IYgoh1mQCKWjHqIl9tf6BNUpKoqniJoPAQ4+LGrK8FeZYU0o0p/qlZEyj9FAulA=="], + "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], - "@tanstack/router-plugin": ["@tanstack/router-plugin@1.168.18", "", { "dependencies": { "@babel/core": "^7.28.5", "@babel/template": "^7.27.2", "@babel/types": "^7.28.5", "@tanstack/router-core": "1.171.13", "@tanstack/router-generator": "1.167.17", "@tanstack/router-utils": "1.162.2", "chokidar": "^5.0.0", "unplugin": "^3.0.0", "zod": "^4.4.3" }, "peerDependencies": { "@rsbuild/core": ">=1.0.2 || ^2.0.0", "@tanstack/react-router": "^1.170.15", "vite": ">=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0", "vite-plugin-solid": "^2.11.10 || ^3.0.0-0", "webpack": ">=5.92.0" }, "optionalPeers": ["@rsbuild/core", "vite-plugin-solid", "webpack"] }, "sha512-MofS28/axfnfnhOD2RSgJEaU882aX5RsAzhGz5Vc4XhAmvCjy919u9JrNs4QsTWFbTD1P7IJ8WFlFVsrg0pStg=="], + "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], - "@tanstack/router-utils": ["@tanstack/router-utils@1.162.2", "", { "dependencies": { "@babel/generator": "^7.28.5", "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "ansis": "^4.1.0", "babel-dead-code-elimination": "^1.0.12", "diff": "^8.0.2", "pathe": "^2.0.3", "tinyglobby": "^0.2.15" } }, "sha512-hTWqJtqIFFdvuCl8WXNyrodp2L9zo2G37xKRrcVmVRWpAB2h+U1LuRAfS4tsFTiWOIoE/B+WDVFB8JpoEdw6jQ=="], + "@types/mdx": ["@types/mdx@2.0.14", "", {}, "sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg=="], - "@tanstack/store": ["@tanstack/store@0.9.3", "", {}, "sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw=="], + "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], - "@tanstack/virtual-file-routes": ["@tanstack/virtual-file-routes@1.162.0", "", {}, "sha512-uhOeFyxLcU41HzvrxsGpiWdcMbScY1EDgbZ5K7DVRMYInbLYWAC0EA/kx9wXAoSM8q82bUG2hRl8+EAjE6XAbA=="], + "@types/nlcst": ["@types/nlcst@2.0.3", "", { "dependencies": { "@types/unist": "*" } }, "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA=="], - "@tybys/wasm-util": ["@tybys/wasm-util@0.10.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg=="], + "@types/node": ["@types/node@26.0.0", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-vf2YFi1iY9lHGwNJMs01biZFbKJkrZR1T6/MlzjhJLPdntOHLhTrDSnSVcdtvjihi4VQNlrFRIxLsDBlQpAipA=="], - "@types/d3": ["@types/d3@7.4.3", "", { "dependencies": { "@types/d3-array": "*", "@types/d3-axis": "*", "@types/d3-brush": "*", "@types/d3-chord": "*", "@types/d3-color": "*", "@types/d3-contour": "*", "@types/d3-delaunay": "*", "@types/d3-dispatch": "*", "@types/d3-drag": "*", "@types/d3-dsv": "*", "@types/d3-ease": "*", "@types/d3-fetch": "*", "@types/d3-force": "*", "@types/d3-format": "*", "@types/d3-geo": "*", "@types/d3-hierarchy": "*", "@types/d3-interpolate": "*", "@types/d3-path": "*", "@types/d3-polygon": "*", "@types/d3-quadtree": "*", "@types/d3-random": "*", "@types/d3-scale": "*", "@types/d3-scale-chromatic": "*", "@types/d3-selection": "*", "@types/d3-shape": "*", "@types/d3-time": "*", "@types/d3-time-format": "*", "@types/d3-timer": "*", "@types/d3-transition": "*", "@types/d3-zoom": "*" } }, "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww=="], + "@types/sax": ["@types/sax@1.2.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A=="], - "@types/d3-array": ["@types/d3-array@3.2.2", "", {}, "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw=="], + "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], - "@types/d3-axis": ["@types/d3-axis@3.0.6", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw=="], + "@types/yauzl": ["@types/yauzl@2.10.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q=="], - "@types/d3-brush": ["@types/d3-brush@3.0.6", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A=="], + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.2", "", {}, "sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA=="], - "@types/d3-chord": ["@types/d3-chord@3.0.6", "", {}, "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg=="], + "@vercel/analytics": ["@vercel/analytics@2.0.1", "", { "peerDependencies": { "@remix-run/react": "^2", "@sveltejs/kit": "^1 || ^2", "next": ">= 13", "nuxt": ">= 3", "react": "^18 || ^19 || ^19.0.0-rc", "svelte": ">= 4", "vue": "^3", "vue-router": "^4" }, "optionalPeers": ["@remix-run/react", "@sveltejs/kit", "next", "nuxt", "react", "svelte", "vue", "vue-router"] }, "sha512-MTQG6V9qQrt1tsDeF+2Uoo5aPjqbVPys1xvnIftXSJYG2SrwXRHnqEvVoYID7BTruDz4lCd2Z7rM1BdkUehk2g=="], - "@types/d3-color": ["@types/d3-color@3.1.3", "", {}, "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="], + "@volar/kit": ["@volar/kit@2.4.28", "", { "dependencies": { "@volar/language-service": "2.4.28", "@volar/typescript": "2.4.28", "typesafe-path": "^0.2.2", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" }, "peerDependencies": { "typescript": "*" } }, "sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg=="], - "@types/d3-contour": ["@types/d3-contour@3.0.6", "", { "dependencies": { "@types/d3-array": "*", "@types/geojson": "*" } }, "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg=="], + "@volar/language-core": ["@volar/language-core@2.4.28", "", { "dependencies": { "@volar/source-map": "2.4.28" } }, "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ=="], - "@types/d3-delaunay": ["@types/d3-delaunay@6.0.4", "", {}, "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw=="], + "@volar/language-server": ["@volar/language-server@2.4.28", "", { "dependencies": { "@volar/language-core": "2.4.28", "@volar/language-service": "2.4.28", "@volar/typescript": "2.4.28", "path-browserify": "^1.0.1", "request-light": "^0.7.0", "vscode-languageserver": "^9.0.1", "vscode-languageserver-protocol": "^3.17.5", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" } }, "sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw=="], - "@types/d3-dispatch": ["@types/d3-dispatch@3.0.7", "", {}, "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA=="], + "@volar/language-service": ["@volar/language-service@2.4.28", "", { "dependencies": { "@volar/language-core": "2.4.28", "vscode-languageserver-protocol": "^3.17.5", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" } }, "sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw=="], - "@types/d3-drag": ["@types/d3-drag@3.0.7", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ=="], + "@volar/source-map": ["@volar/source-map@2.4.28", "", {}, "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ=="], - "@types/d3-dsv": ["@types/d3-dsv@3.0.7", "", {}, "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g=="], + "@volar/typescript": ["@volar/typescript@2.4.28", "", { "dependencies": { "@volar/language-core": "2.4.28", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } }, "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw=="], - "@types/d3-ease": ["@types/d3-ease@3.0.2", "", {}, "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="], + "@vscode/emmet-helper": ["@vscode/emmet-helper@2.11.0", "", { "dependencies": { "emmet": "^2.4.3", "jsonc-parser": "^2.3.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-languageserver-types": "^3.15.1", "vscode-uri": "^3.0.8" } }, "sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw=="], - "@types/d3-fetch": ["@types/d3-fetch@3.0.7", "", { "dependencies": { "@types/d3-dsv": "*" } }, "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA=="], + "@vscode/l10n": ["@vscode/l10n@0.0.18", "", {}, "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ=="], - "@types/d3-force": ["@types/d3-force@3.0.10", "", {}, "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw=="], + "accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], - "@types/d3-format": ["@types/d3-format@3.0.4", "", {}, "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g=="], + "acorn": ["acorn@8.17.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg=="], - "@types/d3-geo": ["@types/d3-geo@3.1.0", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ=="], + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], - "@types/d3-hierarchy": ["@types/d3-hierarchy@3.1.7", "", {}, "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg=="], + "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], - "@types/d3-interpolate": ["@types/d3-interpolate@3.0.4", "", { "dependencies": { "@types/d3-color": "*" } }, "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA=="], + "ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="], - "@types/d3-path": ["@types/d3-path@3.1.1", "", {}, "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg=="], + "ajv-draft-04": ["ajv-draft-04@1.0.0", "", { "peerDependencies": { "ajv": "^8.5.0" }, "optionalPeers": ["ajv"] }, "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw=="], - "@types/d3-polygon": ["@types/d3-polygon@3.0.2", "", {}, "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA=="], + "ajv-i18n": ["ajv-i18n@4.2.0", "", { "peerDependencies": { "ajv": "^8.0.0-beta.0" } }, "sha512-v/ei2UkCEeuKNXh8RToiFsUclmU+G57LO1Oo22OagNMENIw+Yb8eMwvHu7Vn9fmkjJyv6XclhJ8TbuigSglPkg=="], - "@types/d3-quadtree": ["@types/d3-quadtree@3.0.6", "", {}, "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg=="], + "am-i-vibing": ["am-i-vibing@0.4.0", "", { "dependencies": { "process-ancestry": "^0.1.0" }, "bin": { "am-i-vibing": "dist/cli.mjs" } }, "sha512-MxT4XZL7pzLHpuvhDKdMaQHMGGkJDLluKBLsbstn+8wv9sWcFT6h+0ve9qkml95amVTZtZV83gQe2hY+ojgHLg=="], - "@types/d3-random": ["@types/d3-random@3.0.3", "", {}, "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ=="], + "ansi-colors": ["ansi-colors@4.1.3", "", {}, "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="], - "@types/d3-scale": ["@types/d3-scale@4.0.9", "", { "dependencies": { "@types/d3-time": "*" } }, "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw=="], + "ansi-escapes": ["ansi-escapes@3.2.0", "", {}, "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ=="], - "@types/d3-scale-chromatic": ["@types/d3-scale-chromatic@3.1.0", "", {}, "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ=="], + "ansi-regex": ["ansi-regex@4.1.1", "", {}, "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="], - "@types/d3-selection": ["@types/d3-selection@3.0.11", "", {}, "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w=="], + "ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], - "@types/d3-shape": ["@types/d3-shape@3.1.8", "", { "dependencies": { "@types/d3-path": "*" } }, "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w=="], + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], - "@types/d3-time": ["@types/d3-time@3.0.4", "", {}, "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="], + "arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="], - "@types/d3-time-format": ["@types/d3-time-format@4.0.3", "", {}, "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg=="], + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], - "@types/d3-timer": ["@types/d3-timer@3.0.2", "", {}, "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="], + "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], - "@types/d3-transition": ["@types/d3-transition@3.0.9", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg=="], + "array-flatten": ["array-flatten@1.1.1", "", {}, "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="], - "@types/d3-zoom": ["@types/d3-zoom@3.0.8", "", { "dependencies": { "@types/d3-interpolate": "*", "@types/d3-selection": "*" } }, "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw=="], + "array-iterate": ["array-iterate@2.0.1", "", {}, "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg=="], - "@types/geojson": ["@types/geojson@7946.0.16", "", {}, "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg=="], + "ast-types": ["ast-types@0.13.4", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w=="], - "@types/node": ["@types/node@26.0.0", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-vf2YFi1iY9lHGwNJMs01biZFbKJkrZR1T6/MlzjhJLPdntOHLhTrDSnSVcdtvjihi4VQNlrFRIxLsDBlQpAipA=="], + "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="], - "@types/react": ["@types/react@19.2.17", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw=="], + "astro": ["astro@7.0.6", "", { "dependencies": { "@astrojs/compiler-rs": "^0.3.0", "@astrojs/internal-helpers": "0.10.1", "@astrojs/markdown-satteri": "0.3.3", "@astrojs/telemetry": "3.3.2", "@capsizecss/unpack": "^4.0.0", "@clack/prompts": "^1.1.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.3.0", "am-i-vibing": "^0.4.0", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", "ci-info": "^4.4.0", "clsx": "^2.1.1", "common-ancestor-path": "^2.0.0", "cookie": "^1.1.1", "devalue": "^5.8.1", "diff": "^8.0.3", "dset": "^3.1.4", "es-module-lexer": "^2.0.0", "esbuild": "^0.28.0", "flattie": "^1.1.1", "fontace": "~0.4.1", "get-tsconfig": "5.0.0-beta.4", "github-slugger": "^2.0.0", "html-escaper": "3.0.3", "http-cache-semantics": "^4.2.0", "js-yaml": "^4.1.1", "jsonc-parser": "^3.3.1", "magic-string": "^0.30.21", "magicast": "^0.5.2", "mrmime": "^2.0.1", "neotraverse": "^0.6.18", "obug": "^2.1.1", "p-limit": "^7.3.0", "p-queue": "^9.1.0", "package-manager-detector": "^1.6.0", "piccolore": "^0.1.3", "picomatch": "^4.0.4", "semver": "^7.7.4", "shiki": "^4.0.2", "smol-toml": "^1.6.0", "svgo": "^4.0.1", "tinyclip": "^0.1.12", "tinyexec": "^1.0.4", "tinyglobby": "^0.2.15", "ultrahtml": "^1.6.0", "unifont": "~0.7.4", "unstorage": "^1.17.5", "vite": "^8.0.13", "vitefu": "^1.1.2", "xxhash-wasm": "^1.1.0", "yargs-parser": "^22.0.0", "zod": "^4.3.6" }, "optionalDependencies": { "sharp": "^0.34.0 || ^0.35.0" }, "peerDependencies": { "@astrojs/markdown-remark": "7.2.1" }, "optionalPeers": ["@astrojs/markdown-remark"], "bin": { "astro": "./bin/astro.mjs" } }, "sha512-Myw0sFia+zs/Y0yqfZEsUYXfDPh3ELcLf1f0Q/qQzVXBh/af1qO62WNT+P89DCcfGVV51nMoQhEfkBYqJmoUOQ=="], - "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="], + "astro-expressive-code": ["astro-expressive-code@0.44.0", "", { "dependencies": { "rehype-expressive-code": "^0.44.0", "url-extras": "^0.1.0" }, "peerDependencies": { "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta || ^7.0.0" } }, "sha512-b1wN/ZvbJprzxlGKIpIes2kQrCY5KRLwys2tWbZAZyjGZcW5ZtgneZnBwzNRiBna9/48d4mQl19KLjcRuhO1hw=="], - "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], + "axe-core": ["axe-core@4.12.1", "", {}, "sha512-s7iGf5GaVMxEG0ENN9x+xTr7GFZCb1ZP/1uATUpCEK2X78nDB3RwbtFCo9pGAf9ru+VwoQ464DkaLEeRM08wJA=="], - "@upsetjs/venn.js": ["@upsetjs/venn.js@2.0.0", "", { "optionalDependencies": { "d3-selection": "^3.0.0", "d3-transition": "^3.0.1" } }, "sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw=="], + "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], - "@vitejs/plugin-react": ["@vitejs/plugin-react@6.0.2", "", { "dependencies": { "@rolldown/pluginutils": "^1.0.0" }, "peerDependencies": { "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", "babel-plugin-react-compiler": "^1.0.0", "vite": "^8.0.0" }, "optionalPeers": ["@rolldown/plugin-babel", "babel-plugin-react-compiler"] }, "sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg=="], + "b4a": ["b4a@1.8.1", "", { "peerDependencies": { "react-native-b4a": "*" }, "optionalPeers": ["react-native-b4a"] }, "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw=="], - "ansis": ["ansis@4.3.1", "", {}, "sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA=="], + "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], - "babel-dead-code-elimination": ["babel-dead-code-elimination@1.0.12", "", { "dependencies": { "@babel/core": "^7.23.7", "@babel/parser": "^7.23.6", "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6" } }, "sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig=="], + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - "baseline-browser-mapping": ["baseline-browser-mapping@2.10.38", "", { "bin": "dist/cli.cjs" }, "sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw=="], + "bare-events": ["bare-events@2.9.1", "", { "peerDependencies": { "bare-abort-controller": "*" }, "optionalPeers": ["bare-abort-controller"] }, "sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg=="], - "browserslist": ["browserslist@4.28.2", "", { "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", "electron-to-chromium": "^1.5.328", "node-releases": "^2.0.36", "update-browserslist-db": "^1.2.3" }, "bin": "cli.js" }, "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg=="], + "bare-fs": ["bare-fs@4.7.4", "", { "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", "bare-stream": "^2.6.4", "bare-url": "^2.2.2", "fast-fifo": "^1.3.2" }, "peerDependencies": { "bare-buffer": "*" }, "optionalPeers": ["bare-buffer"] }, "sha512-y1kC+ffIx/tPLdTE693uNjHfzTfr+ravR5tvWlMXe25nELbkqV400S71qHDwbkAQ1FVEZobB1NFRzFbCCcyBCQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001799", "", {}, "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw=="], + "bare-path": ["bare-path@3.1.1", "", {}, "sha512-JprUlveX3QjApC1cTpsUOiscADftCGVWkzitbHsRqv84hzYwYHw2mbluddsq5TvI8mH/8Ov1f4BiMAdcB0oYnQ=="], - "chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], + "bare-stream": ["bare-stream@2.13.3", "", { "dependencies": { "b4a": "^1.8.1", "streamx": "^2.25.0", "teex": "^1.0.1" }, "peerDependencies": { "bare-abort-controller": "*", "bare-buffer": "*", "bare-events": "*" }, "optionalPeers": ["bare-abort-controller", "bare-buffer", "bare-events"] }, "sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ=="], - "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], + "bare-url": ["bare-url@2.4.5", "", { "dependencies": { "bare-path": "^3.0.0" } }, "sha512-K+y9xF1tN+CdPu4qWwr0QiK1Al07eFPGYK5M2pDXcmHdMdgC/tT/bpmMe1hrmRHaidKLkXrC+cRNYf3XVDUhSQ=="], - "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + "basic-ftp": ["basic-ftp@5.3.1", "", {}, "sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw=="], + + "bcp-47": ["bcp-47@2.1.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-KLw+H/gd2p4zly1X7Yh/qziuyae5/w/QFnvTng9eZL5fvszL7Whl3MBoWF8yxL7ksUjBfOD+OxkytiqbBpG+Fw=="], - "commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="], + "bcp-47-match": ["bcp-47-match@2.0.3", "", {}, "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ=="], - "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + "body-parser": ["body-parser@1.20.5", "", { "dependencies": { "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "~1.2.0", "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "on-finished": "~2.4.1", "qs": "~6.15.1", "raw-body": "~2.5.3", "type-is": "~1.6.18", "unpipe": "~1.0.0" } }, "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA=="], - "cookie-es": ["cookie-es@3.1.1", "", {}, "sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg=="], + "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], - "cose-base": ["cose-base@1.0.3", "", { "dependencies": { "layout-base": "^1.0.0" } }, "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg=="], + "brace-expansion": ["brace-expansion@1.1.16", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw=="], - "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], + "buffer-crc32": ["buffer-crc32@0.2.13", "", {}, "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="], - "cytoscape": ["cytoscape@3.34.0", "", {}, "sha512-62rNSrioXw93uliKFBwjukeQyeWwH2PqDrTac31r2P6464u3AUvTk0xS4LVvT251g7IgkFunrI48ZEZGjywSOg=="], + "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], - "cytoscape-cose-bilkent": ["cytoscape-cose-bilkent@4.1.0", "", { "dependencies": { "cose-base": "^1.0.0" }, "peerDependencies": { "cytoscape": "^3.2.0" } }, "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ=="], + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], - "cytoscape-fcose": ["cytoscape-fcose@2.2.0", "", { "dependencies": { "cose-base": "^2.2.0" }, "peerDependencies": { "cytoscape": "^3.2.0" } }, "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ=="], + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - "d3": ["d3@7.9.0", "", { "dependencies": { "d3-array": "3", "d3-axis": "3", "d3-brush": "3", "d3-chord": "3", "d3-color": "3", "d3-contour": "4", "d3-delaunay": "6", "d3-dispatch": "3", "d3-drag": "3", "d3-dsv": "3", "d3-ease": "3", "d3-fetch": "3", "d3-force": "3", "d3-format": "3", "d3-geo": "3", "d3-hierarchy": "3", "d3-interpolate": "3", "d3-path": "3", "d3-polygon": "3", "d3-quadtree": "3", "d3-random": "3", "d3-scale": "4", "d3-scale-chromatic": "3", "d3-selection": "3", "d3-shape": "3", "d3-time": "3", "d3-time-format": "4", "d3-timer": "3", "d3-transition": "3", "d3-zoom": "3" } }, "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA=="], + "camelcase": ["camelcase@5.3.1", "", {}, "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="], - "d3-array": ["d3-array@3.2.4", "", { "dependencies": { "internmap": "1 - 2" } }, "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="], + "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], - "d3-axis": ["d3-axis@3.0.0", "", {}, "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw=="], + "chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], - "d3-brush": ["d3-brush@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", "d3-interpolate": "1 - 3", "d3-selection": "3", "d3-transition": "3" } }, "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ=="], + "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="], - "d3-chord": ["d3-chord@3.0.1", "", { "dependencies": { "d3-path": "1 - 3" } }, "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g=="], + "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], - "d3-color": ["d3-color@3.1.0", "", {}, "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="], + "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], - "d3-contour": ["d3-contour@4.0.2", "", { "dependencies": { "d3-array": "^3.2.0" } }, "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA=="], + "character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="], - "d3-delaunay": ["d3-delaunay@6.0.4", "", { "dependencies": { "delaunator": "5" } }, "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A=="], + "chardet": ["chardet@0.7.0", "", {}, "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="], - "d3-dispatch": ["d3-dispatch@3.0.1", "", {}, "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg=="], + "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], - "d3-drag": ["d3-drag@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-selection": "3" } }, "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg=="], + "chrome-launcher": ["chrome-launcher@0.13.4", "", { "dependencies": { "@types/node": "*", "escape-string-regexp": "^1.0.5", "is-wsl": "^2.2.0", "lighthouse-logger": "^1.0.0", "mkdirp": "^0.5.3", "rimraf": "^3.0.2" } }, "sha512-nnzXiDbGKjDSK6t2I+35OAPBy5Pw/39bgkb/ZAFwMhwJbdYBp6aH+vW28ZgtjdU890Q7D+3wN/tB8N66q5Gi2A=="], - "d3-dsv": ["d3-dsv@3.0.1", "", { "dependencies": { "commander": "7", "iconv-lite": "0.6", "rw": "1" }, "bin": { "csv2json": "bin/dsv2json.js", "csv2tsv": "bin/dsv2dsv.js", "dsv2dsv": "bin/dsv2dsv.js", "dsv2json": "bin/dsv2json.js", "json2csv": "bin/json2dsv.js", "json2dsv": "bin/json2dsv.js", "json2tsv": "bin/json2dsv.js", "tsv2csv": "bin/dsv2dsv.js", "tsv2json": "bin/dsv2json.js" } }, "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q=="], + "chromium-bidi": ["chromium-bidi@14.0.0", "", { "dependencies": { "mitt": "^3.0.1", "zod": "^3.24.1" }, "peerDependencies": { "devtools-protocol": "*" } }, "sha512-9gYlLtS6tStdRWzrtXaTMnqcM4dudNegMXJxkR0I/CXObHalYeYcAMPrL19eroNZHtJ8DQmu1E+ZNOYu/IXMXw=="], - "d3-ease": ["d3-ease@3.0.1", "", {}, "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="], + "ci-info": ["ci-info@4.4.0", "", {}, "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg=="], - "d3-fetch": ["d3-fetch@3.0.1", "", { "dependencies": { "d3-dsv": "1 - 3" } }, "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw=="], + "cli-cursor": ["cli-cursor@2.1.0", "", { "dependencies": { "restore-cursor": "^2.0.0" } }, "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw=="], - "d3-force": ["d3-force@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-quadtree": "1 - 3", "d3-timer": "1 - 3" } }, "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg=="], + "cli-width": ["cli-width@2.2.1", "", {}, "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw=="], - "d3-format": ["d3-format@3.1.2", "", {}, "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg=="], + "cliui": ["cliui@6.0.0", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" } }, "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ=="], - "d3-geo": ["d3-geo@3.1.1", "", { "dependencies": { "d3-array": "2.5.0 - 3" } }, "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q=="], + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + + "collapse-white-space": ["collapse-white-space@2.1.0", "", {}, "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw=="], + + "color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + + "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], + + "commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="], + + "common-ancestor-path": ["common-ancestor-path@2.0.0", "", {}, "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng=="], + + "compressible": ["compressible@2.0.18", "", { "dependencies": { "mime-db": ">= 1.43.0 < 2" } }, "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg=="], - "d3-hierarchy": ["d3-hierarchy@3.1.2", "", {}, "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA=="], + "compression": ["compression@1.8.1", "", { "dependencies": { "bytes": "3.1.2", "compressible": "~2.0.18", "debug": "2.6.9", "negotiator": "~0.6.4", "on-headers": "~1.1.0", "safe-buffer": "5.2.1", "vary": "~1.1.2" } }, "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w=="], - "d3-interpolate": ["d3-interpolate@3.0.1", "", { "dependencies": { "d3-color": "1 - 3" } }, "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="], + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], - "d3-path": ["d3-path@3.1.0", "", {}, "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="], + "configstore": ["configstore@5.0.1", "", { "dependencies": { "dot-prop": "^5.2.0", "graceful-fs": "^4.1.2", "make-dir": "^3.0.0", "unique-string": "^2.0.0", "write-file-atomic": "^3.0.0", "xdg-basedir": "^4.0.0" } }, "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA=="], - "d3-polygon": ["d3-polygon@3.0.1", "", {}, "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg=="], + "content-disposition": ["content-disposition@0.5.4", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ=="], - "d3-quadtree": ["d3-quadtree@3.0.1", "", {}, "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw=="], + "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], - "d3-random": ["d3-random@3.0.1", "", {}, "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ=="], + "cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], - "d3-sankey": ["d3-sankey@0.12.3", "", { "dependencies": { "d3-array": "1 - 2", "d3-shape": "^1.2.0" } }, "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ=="], + "cookie-es": ["cookie-es@1.2.3", "", {}, "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw=="], - "d3-scale": ["d3-scale@4.0.2", "", { "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", "d3-interpolate": "1.2.0 - 3", "d3-time": "2.1.1 - 3", "d3-time-format": "2 - 4" } }, "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ=="], + "cookie-signature": ["cookie-signature@1.0.7", "", {}, "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA=="], - "d3-scale-chromatic": ["d3-scale-chromatic@3.1.0", "", { "dependencies": { "d3-color": "1 - 3", "d3-interpolate": "1 - 3" } }, "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ=="], + "crossws": ["crossws@0.3.5", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA=="], - "d3-selection": ["d3-selection@3.0.0", "", {}, "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ=="], + "crypto-random-string": ["crypto-random-string@2.0.0", "", {}, "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA=="], - "d3-shape": ["d3-shape@3.2.0", "", { "dependencies": { "d3-path": "^3.1.0" } }, "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA=="], + "csp_evaluator": ["csp_evaluator@1.1.5", "", {}, "sha512-EL/iN9etCTzw/fBnp0/uj0f5BOOGvZut2mzsiiBZ/FdT6gFQCKRO/tmcKOxn5drWZ2Ndm/xBb1SI4zwWbGtmIw=="], - "d3-time": ["d3-time@3.1.0", "", { "dependencies": { "d3-array": "2 - 3" } }, "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q=="], + "css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="], - "d3-time-format": ["d3-time-format@4.1.0", "", { "dependencies": { "d3-time": "1 - 3" } }, "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg=="], + "css-selector-parser": ["css-selector-parser@3.3.0", "", {}, "sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g=="], - "d3-timer": ["d3-timer@3.0.1", "", {}, "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="], + "css-tree": ["css-tree@3.2.1", "", { "dependencies": { "mdn-data": "2.27.1", "source-map-js": "^1.2.1" } }, "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA=="], - "d3-transition": ["d3-transition@3.0.1", "", { "dependencies": { "d3-color": "1 - 3", "d3-dispatch": "1 - 3", "d3-ease": "1 - 3", "d3-interpolate": "1 - 3", "d3-timer": "1 - 3" }, "peerDependencies": { "d3-selection": "2 - 3" } }, "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w=="], + "css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="], - "d3-zoom": ["d3-zoom@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", "d3-interpolate": "1 - 3", "d3-selection": "2 - 3", "d3-transition": "2 - 3" } }, "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw=="], + "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], - "dagre-d3-es": ["dagre-d3-es@7.0.14", "", { "dependencies": { "d3": "^7.9.0", "lodash-es": "^4.17.21" } }, "sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg=="], + "csso": ["csso@5.0.5", "", { "dependencies": { "css-tree": "~2.2.0" } }, "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ=="], - "dayjs": ["dayjs@1.11.21", "", {}, "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA=="], + "data-uri-to-buffer": ["data-uri-to-buffer@6.0.2", "", {}, "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw=="], "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], - "delaunator": ["delaunator@5.1.0", "", { "dependencies": { "robust-predicates": "^3.0.2" } }, "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ=="], + "decamelize": ["decamelize@1.2.0", "", {}, "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="], + + "decimal.js": ["decimal.js@10.6.0", "", {}, "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg=="], + + "decode-named-character-reference": ["decode-named-character-reference@1.3.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q=="], + + "define-lazy-prop": ["define-lazy-prop@2.0.0", "", {}, "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og=="], + + "defu": ["defu@6.1.7", "", {}, "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ=="], + + "degenerator": ["degenerator@5.0.1", "", { "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", "esprima": "^4.0.1" } }, "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ=="], + + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], + + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + + "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="], + + "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="], "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], + "devalue": ["devalue@5.8.1", "", {}, "sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw=="], + + "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], + + "devtools-protocol": ["devtools-protocol@0.0.1467305", "", {}, "sha512-LxwMLqBoPPGpMdRL4NkLFRNy3QLp6Uqa7GNp1v6JaBheop2QrB9Q7q0A/q/CYYP9sBfZdHOyszVx4gc9zyk7ow=="], + "diff": ["diff@8.0.4", "", {}, "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw=="], - "dompurify": ["dompurify@3.4.11", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw=="], + "direction": ["direction@2.0.1", "", { "bin": { "direction": "cli.js" } }, "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA=="], + + "dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="], + + "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], + + "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], + + "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], + + "dot-prop": ["dot-prop@5.3.0", "", { "dependencies": { "is-obj": "^2.0.0" } }, "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q=="], + + "dset": ["dset@3.1.4", "", {}, "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], + + "emmet": ["emmet@2.4.11", "", { "dependencies": { "@emmetio/abbreviation": "^2.3.3", "@emmetio/css-abbreviation": "^2.1.8" } }, "sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ=="], + + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], + + "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], - "electron-to-chromium": ["electron-to-chromium@1.5.376", "", {}, "sha512-cUVA7/RvbFTEuw/i3obUwDTRIXojaxkResf+ibByPFxjc6XK3VNtcQXV0NSbAlJ0FMjcJGgftVVB4Qo184EXvA=="], + "enquirer": ["enquirer@2.4.1", "", { "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" } }, "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ=="], - "enhanced-resolve": ["enhanced-resolve@5.21.6", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ=="], + "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], - "es-toolkit": ["es-toolkit@1.48.1", "", {}, "sha512-wfnXlwd5I75eXRtdD2vuEs50xHHESECDsGD7yiQnfFVNoa5522NwXEbmgo98LfiukSQHs+mBM7/YG3qKJB9/mQ=="], + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-module-lexer": ["es-module-lexer@2.3.0", "", {}, "sha512-KLdwQm2NvGLDkQDCGvmiQrhkd0JbMzXthwQAUgWjQuQdBLFa3eiBP5arXZyA+f8x+x7OXgud6bq2rxjGtHV2tw=="], + + "es-object-atoms": ["es-object-atoms@1.1.2", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="], + + "esast-util-from-estree": ["esast-util-from-estree@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "unist-util-position-from-estree": "^2.0.0" } }, "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ=="], + + "esast-util-from-js": ["esast-util-from-js@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "acorn": "^8.0.0", "esast-util-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw=="], + + "esbuild": ["esbuild@0.28.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.1", "@esbuild/android-arm": "0.28.1", "@esbuild/android-arm64": "0.28.1", "@esbuild/android-x64": "0.28.1", "@esbuild/darwin-arm64": "0.28.1", "@esbuild/darwin-x64": "0.28.1", "@esbuild/freebsd-arm64": "0.28.1", "@esbuild/freebsd-x64": "0.28.1", "@esbuild/linux-arm": "0.28.1", "@esbuild/linux-arm64": "0.28.1", "@esbuild/linux-ia32": "0.28.1", "@esbuild/linux-loong64": "0.28.1", "@esbuild/linux-mips64el": "0.28.1", "@esbuild/linux-ppc64": "0.28.1", "@esbuild/linux-riscv64": "0.28.1", "@esbuild/linux-s390x": "0.28.1", "@esbuild/linux-x64": "0.28.1", "@esbuild/netbsd-arm64": "0.28.1", "@esbuild/netbsd-x64": "0.28.1", "@esbuild/openbsd-arm64": "0.28.1", "@esbuild/openbsd-x64": "0.28.1", "@esbuild/openharmony-arm64": "0.28.1", "@esbuild/sunos-x64": "0.28.1", "@esbuild/win32-arm64": "0.28.1", "@esbuild/win32-ia32": "0.28.1", "@esbuild/win32-x64": "0.28.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw=="], "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], + + "escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "escodegen": ["escodegen@2.1.0", "", { "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2" }, "optionalDependencies": { "source-map": "~0.6.1" }, "bin": { "esgenerate": "bin/esgenerate.js", "escodegen": "bin/escodegen.js" } }, "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w=="], + + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "estree-util-attach-comments": ["estree-util-attach-comments@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw=="], + + "estree-util-build-jsx": ["estree-util-build-jsx@3.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-walker": "^3.0.0" } }, "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ=="], + + "estree-util-is-identifier-name": ["estree-util-is-identifier-name@3.0.0", "", {}, "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg=="], + + "estree-util-scope": ["estree-util-scope@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0" } }, "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ=="], + + "estree-util-to-js": ["estree-util-to-js@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "astring": "^1.8.0", "source-map": "^0.7.0" } }, "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg=="], + + "estree-util-visit": ["estree-util-visit@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^3.0.0" } }, "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww=="], + + "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], + + "eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="], + + "events-universal": ["events-universal@1.0.1", "", { "dependencies": { "bare-events": "^2.7.0" } }, "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw=="], + + "express": ["express@4.22.2", "", { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "~1.20.5", "content-disposition": "~0.5.4", "content-type": "~1.0.4", "cookie": "~0.7.1", "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "~1.3.1", "fresh": "~0.5.2", "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "~2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", "qs": "~6.15.1", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "~0.19.0", "serve-static": "~1.16.2", "setprototypeof": "1.2.0", "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q=="], + + "expressive-code": ["expressive-code@0.44.0", "", { "dependencies": { "@expressive-code/core": "^0.44.0", "@expressive-code/plugin-frames": "^0.44.0", "@expressive-code/plugin-shiki": "^0.44.0", "@expressive-code/plugin-text-markers": "^0.44.0" } }, "sha512-JXVWVNCKlLuZLMQH8cOiDUSosT0Bb+elwE/dbAkpwFwDFmyFyWlECoWZIohh2FkIF1iI67TQJ+Ts9k7oNDh2qA=="], + + "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], + + "external-editor": ["external-editor@3.1.0", "", { "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" } }, "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew=="], + + "extract-zip": ["extract-zip@2.0.1", "", { "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", "yauzl": "^2.10.0" }, "optionalDependencies": { "@types/yauzl": "^2.9.1" }, "bin": { "extract-zip": "cli.js" } }, "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-fifo": ["fast-fifo@1.3.2", "", {}, "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="], + + "fast-string-truncated-width": ["fast-string-truncated-width@3.0.3", "", {}, "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g=="], + + "fast-string-width": ["fast-string-width@3.0.2", "", { "dependencies": { "fast-string-truncated-width": "^3.0.2" } }, "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg=="], + + "fast-uri": ["fast-uri@3.1.3", "", {}, "sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg=="], + + "fast-wrap-ansi": ["fast-wrap-ansi@0.2.2", "", { "dependencies": { "fast-string-width": "^3.0.2" } }, "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q=="], + + "fd-slicer": ["fd-slicer@1.1.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="], + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" } }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], - "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "figures": ["figures@2.0.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA=="], + + "finalhandler": ["finalhandler@1.3.2", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "~2.4.1", "parseurl": "~1.3.3", "statuses": "~2.0.2", "unpipe": "~1.0.0" } }, "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg=="], + + "find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + + "flattie": ["flattie@1.1.1", "", {}, "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ=="], + + "fontace": ["fontace@0.4.1", "", { "dependencies": { "fontkitten": "^1.0.2" } }, "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw=="], + + "fontkitten": ["fontkitten@1.0.3", "", { "dependencies": { "tiny-inflate": "^1.0.3" } }, "sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw=="], + + "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], + + "fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], + + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + + "fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="], - "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + "get-tsconfig": ["get-tsconfig@5.0.0-beta.4", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ=="], - "goober": ["goober@2.1.19", "", { "peerDependencies": { "csstype": "^3.0.10" } }, "sha512-U7veizMqxyKlM58+Z5j2ngJBH/r9siDmxpvNxSw0PylF6WQvrASJEZrxh1hidRBJc2jqoBVSyOban5u8m+6Rxg=="], + "get-uri": ["get-uri@6.0.5", "", { "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", "debug": "^4.3.4" } }, "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg=="], + + "github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="], + + "glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], - "hachure-fill": ["hachure-fill@0.5.2", "", {}, "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg=="], + "h3": ["h3@1.15.11", "", { "dependencies": { "cookie-es": "^1.2.3", "crossws": "^0.3.5", "defu": "^6.1.6", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.4", "radix3": "^1.1.2", "ufo": "^1.6.3", "uncrypto": "^0.1.3" } }, "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg=="], - "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + "has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], - "import-meta-resolve": ["import-meta-resolve@4.2.0", "", {}, "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg=="], + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], - "internmap": ["internmap@1.0.1", "", {}, "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw=="], + "hasown": ["hasown@2.0.4", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A=="], - "isbot": ["isbot@5.1.43", "", {}, "sha512-drJhFmibra4LO6Wd7D3Oi6UICRK9244vSZkmxzhlZP0TTdwCA2ueK4PEkUkzPYeuqug9+cqqdWPgihjk5+83Cg=="], + "hast-util-embedded": ["hast-util-embedded@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-is-element": "^3.0.0" } }, "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA=="], - "jiti": ["jiti@2.7.0", "", { "bin": "lib/jiti-cli.mjs" }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="], + "hast-util-format": ["hast-util-format@1.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-embedded": "^3.0.0", "hast-util-minify-whitespace": "^1.0.0", "hast-util-phrasing": "^3.0.0", "hast-util-whitespace": "^3.0.0", "html-whitespace-sensitive-tag-names": "^3.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA=="], - "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + "hast-util-from-html": ["hast-util-from-html@2.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.1.0", "hast-util-from-parse5": "^8.0.0", "parse5": "^7.0.0", "vfile": "^6.0.0", "vfile-message": "^4.0.0" } }, "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw=="], - "jsesc": ["jsesc@3.1.0", "", { "bin": "bin/jsesc" }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + "hast-util-from-parse5": ["hast-util-from-parse5@8.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "hastscript": "^9.0.0", "property-information": "^7.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", "web-namespaces": "^2.0.0" } }, "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg=="], - "json5": ["json5@2.2.3", "", { "bin": "lib/cli.js" }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + "hast-util-has-property": ["hast-util-has-property@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA=="], - "katex": ["katex@0.16.47", "", { "dependencies": { "commander": "^8.3.0" }, "bin": { "katex": "cli.js" } }, "sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg=="], + "hast-util-is-body-ok-link": ["hast-util-is-body-ok-link@3.0.1", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ=="], - "khroma": ["khroma@2.1.0", "", {}, "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw=="], + "hast-util-is-element": ["hast-util-is-element@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g=="], - "layout-base": ["layout-base@1.0.2", "", {}, "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg=="], + "hast-util-minify-whitespace": ["hast-util-minify-whitespace@1.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-embedded": "^3.0.0", "hast-util-is-element": "^3.0.0", "hast-util-whitespace": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw=="], - "lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="], + "hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="], - "lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="], + "hast-util-phrasing": ["hast-util-phrasing@3.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-embedded": "^3.0.0", "hast-util-has-property": "^3.0.0", "hast-util-is-body-ok-link": "^3.0.0", "hast-util-is-element": "^3.0.0" } }, "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ=="], - "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="], + "hast-util-raw": ["hast-util-raw@9.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "@ungap/structured-clone": "^1.0.0", "hast-util-from-parse5": "^8.0.0", "hast-util-to-parse5": "^8.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "parse5": "^7.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw=="], - "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="], + "hast-util-select": ["hast-util-select@6.0.4", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "bcp-47-match": "^2.0.0", "comma-separated-tokens": "^2.0.0", "css-selector-parser": "^3.0.0", "devlop": "^1.0.0", "direction": "^2.0.0", "hast-util-has-property": "^3.0.0", "hast-util-to-string": "^3.0.0", "hast-util-whitespace": "^3.0.0", "nth-check": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw=="], - "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="], + "hast-util-to-estree": ["hast-util-to-estree@3.1.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-attach-comments": "^3.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w=="], - "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="], + "hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="], - "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="], + "hast-util-to-jsx-runtime": ["hast-util-to-jsx-runtime@2.3.6", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" } }, "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg=="], - "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="], + "hast-util-to-parse5": ["hast-util-to-parse5@8.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA=="], - "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="], + "hast-util-to-string": ["hast-util-to-string@3.0.1", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A=="], - "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="], + "hast-util-to-text": ["hast-util-to-text@4.0.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "hast-util-is-element": "^3.0.0", "unist-util-find-after": "^5.0.0" } }, "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A=="], - "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="], + "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], - "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="], + "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="], - "lodash-es": ["lodash-es@4.18.1", "", {}, "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A=="], + "html-escaper": ["html-escaper@3.0.3", "", {}, "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ=="], - "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="], - "lucide-react": ["lucide-react@1.21.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-reEZMXq8Qdd5jg5XYkQ5TR1fB/GiQ7ih4vcrthYDtgjSDwh0i6/YLiGjsWsIwgN49gpAnd4J2elSNzncMEEUUQ=="], + "html-whitespace-sensitive-tag-names": ["html-whitespace-sensitive-tag-names@3.0.1", "", {}, "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA=="], - "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + "http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="], - "marked": ["marked@16.4.2", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA=="], + "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], - "mermaid": ["mermaid@11.15.0", "", { "dependencies": { "@braintree/sanitize-url": "^7.1.1", "@iconify/utils": "^3.0.2", "@mermaid-js/parser": "^1.1.1", "@types/d3": "^7.4.3", "@upsetjs/venn.js": "^2.0.0", "cytoscape": "^3.33.1", "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-fcose": "^2.2.0", "d3": "^7.9.0", "d3-sankey": "^0.12.3", "dagre-d3-es": "7.0.14", "dayjs": "^1.11.19", "dompurify": "^3.3.1", "es-toolkit": "^1.45.1", "katex": "^0.16.25", "khroma": "^2.1.0", "marked": "^16.3.0", "roughjs": "^4.6.6", "stylis": "^4.3.6", "ts-dedent": "^2.2.0", "uuid": "^11.1.0 || ^12 || ^13 || ^14.0.0" } }, "sha512-pTMbcf3rWdtLiYGpmoTjHEpeY8seiy6sR+9nD7LOs8KfUbHE4lOUAprTRqRAcWSQ6MQpdX+YEsxShtGsINtPtw=="], + "http-link-header": ["http-link-header@1.1.3", "", {}, "sha512-3cZ0SRL8fb9MUlU3mKM61FcQvPfXx2dBrZW3Vbg5CXa8jFlK8OaEpePenLe1oEXQduhz8b0QjsqfS59QP4AJDQ=="], - "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + "http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="], - "nanoid": ["nanoid@3.3.14", "", { "bin": "bin/nanoid.cjs" }, "sha512-U9kYi5bpVMEI31yC8iw4bJJp0avcHXA0W8/wNfLfnvJYzihQo2ZRPYPvpAAd570HAcCBjCTN7vnr+v4StKl1IQ=="], + "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], - "node-releases": ["node-releases@2.0.48", "", {}, "sha512-1uz8041X6LoI6ZSdZacM9lVY28vuzDlSKitnpbSNK0RfKoIJkX29NBPVEFXhnuSuEOA9Ww0xnPJ+ILWbGAv8DA=="], + "i18next": ["i18next@26.3.5", "", { "peerDependencies": { "typescript": "^5 || ^6" }, "optionalPeers": ["typescript"] }, "sha512-cd5lgkvjYQAPDfP3bbrAIE1wJmjTIlsrsjDqlvsHn4wFAerP5O0NfAe8RiDcXRfukN5ETe7Tlmfp6DkyuqDn6Q=="], - "package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="], + "iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], - "path-data-parser": ["path-data-parser@0.1.0", "", {}, "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w=="], + "image-ssim": ["image-ssim@0.2.0", "", {}, "sha512-W7+sO6/yhxy83L0G7xR8YAc5Z5QFtYEXXRV6EaE8tuYBZJnA3gVgp3q7X7muhLZVodeb9UfvjSbwt9VJwjIYAg=="], - "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + "immediate": ["immediate@3.0.6", "", {}, "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="], - "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], - "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], - "points-on-curve": ["points-on-curve@0.2.0", "", {}, "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A=="], + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], - "points-on-path": ["points-on-path@0.2.1", "", { "dependencies": { "path-data-parser": "0.1.0", "points-on-curve": "0.2.0" } }, "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g=="], + "inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="], - "postcss": ["postcss@8.5.15", "", { "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A=="], + "inquirer": ["inquirer@6.5.2", "", { "dependencies": { "ansi-escapes": "^3.2.0", "chalk": "^2.4.2", "cli-cursor": "^2.1.0", "cli-width": "^2.0.0", "external-editor": "^3.0.3", "figures": "^2.0.0", "lodash": "^4.17.12", "mute-stream": "0.0.7", "run-async": "^2.2.0", "rxjs": "^6.4.0", "string-width": "^2.1.0", "strip-ansi": "^5.1.0", "through": "^2.3.6" } }, "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ=="], - "prettier": ["prettier@3.8.4", "", { "bin": "bin/prettier.cjs" }, "sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q=="], + "intl-messageformat": ["intl-messageformat@10.7.18", "", { "dependencies": { "@formatjs/ecma402-abstract": "2.3.6", "@formatjs/fast-memoize": "2.2.7", "@formatjs/icu-messageformat-parser": "2.11.4", "tslib": "^2.8.0" } }, "sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g=="], - "react": ["react@19.2.7", "", {}, "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ=="], + "ip-address": ["ip-address@10.2.0", "", {}, "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA=="], - "react-dom": ["react-dom@19.2.7", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.7" } }, "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ=="], + "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], - "readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], + "iron-webcrypto": ["iron-webcrypto@1.2.1", "", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="], - "robust-predicates": ["robust-predicates@3.0.3", "", {}, "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA=="], + "is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="], - "rolldown": ["rolldown@1.0.3", "", { "dependencies": { "@oxc-project/types": "=0.133.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.3", "@rolldown/binding-darwin-arm64": "1.0.3", "@rolldown/binding-darwin-x64": "1.0.3", "@rolldown/binding-freebsd-x64": "1.0.3", "@rolldown/binding-linux-arm-gnueabihf": "1.0.3", "@rolldown/binding-linux-arm64-gnu": "1.0.3", "@rolldown/binding-linux-arm64-musl": "1.0.3", "@rolldown/binding-linux-ppc64-gnu": "1.0.3", "@rolldown/binding-linux-s390x-gnu": "1.0.3", "@rolldown/binding-linux-x64-gnu": "1.0.3", "@rolldown/binding-linux-x64-musl": "1.0.3", "@rolldown/binding-openharmony-arm64": "1.0.3", "@rolldown/binding-wasm32-wasi": "1.0.3", "@rolldown/binding-win32-arm64-msvc": "1.0.3", "@rolldown/binding-win32-x64-msvc": "1.0.3" }, "bin": "bin/cli.mjs" }, "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g=="], + "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="], - "roughjs": ["roughjs@4.6.6", "", { "dependencies": { "hachure-fill": "^0.5.2", "path-data-parser": "^0.1.0", "points-on-curve": "^0.2.0", "points-on-path": "^0.2.1" } }, "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ=="], + "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="], - "rw": ["rw@1.3.3", "", {}, "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="], + "is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], - "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + "is-fullwidth-code-point": ["is-fullwidth-code-point@2.0.0", "", {}, "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w=="], - "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="], - "semver": ["semver@6.3.1", "", { "bin": "bin/semver.js" }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="], - "seroval": ["seroval@1.5.4", "", {}, "sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw=="], + "is-obj": ["is-obj@2.0.0", "", {}, "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="], - "seroval-plugins": ["seroval-plugins@1.5.4", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw=="], + "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], - "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + "is-typedarray": ["is-typedarray@1.0.0", "", {}, "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="], - "stylis": ["stylis@4.4.0", "", {}, "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA=="], + "is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], - "tailwind-merge": ["tailwind-merge@3.6.0", "", {}, "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w=="], + "isomorphic-fetch": ["isomorphic-fetch@3.0.0", "", { "dependencies": { "node-fetch": "^2.6.1", "whatwg-fetch": "^3.4.1" } }, "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA=="], - "tailwindcss": ["tailwindcss@4.3.1", "", {}, "sha512-hk+TB1m+K8CYNrP6rjQaq/Y+4Zylwpa87mLYBKCunwnnQ9p+fHb7kmSfGqyEJoxF/O6CDyABWVFEafNSYKll+Q=="], + "jiti": ["jiti@2.7.0", "", { "bin": "lib/jiti-cli.mjs" }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="], - "tailwindcss-animate": ["tailwindcss-animate@1.0.7", "", { "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders" } }, "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA=="], + "jpeg-js": ["jpeg-js@0.4.4", "", {}, "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg=="], - "tapable": ["tapable@2.3.3", "", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="], + "js-library-detector": ["js-library-detector@6.7.0", "", {}, "sha512-c80Qupofp43y4cJ7+8TTDN/AsDwLi5oOm/plBrWI+iQt485vKXCco+yVmOwEgdo9VOdsYTuV0UlTeetVPTriXA=="], - "tinyexec": ["tinyexec@1.2.4", "", {}, "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg=="], + "js-yaml": ["js-yaml@4.3.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q=="], - "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], + "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "ts-dedent": ["ts-dedent@2.3.0", "", {}, "sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg=="], + "jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="], - "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="], - "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], + "klona": ["klona@2.0.6", "", {}, "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA=="], - "undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], + "legacy-javascript": ["legacy-javascript@0.0.1", "", {}, "sha512-lPyntS4/aS7jpuvOlitZDFifBCb4W8L/3QU0PLbUTUj+zYah8rfVjYic88yG7ZKTxhS5h9iz7duT8oUXKszLhg=="], - "unplugin": ["unplugin@3.0.0", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg=="], + "lie": ["lie@3.1.1", "", { "dependencies": { "immediate": "~3.0.5" } }, "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw=="], - "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": "cli.js" }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], + "lighthouse": ["lighthouse@12.6.1", "", { "dependencies": { "@paulirish/trace_engine": "0.0.53", "@sentry/node": "^7.0.0", "axe-core": "^4.10.3", "chrome-launcher": "^1.2.0", "configstore": "^5.0.1", "csp_evaluator": "1.1.5", "devtools-protocol": "0.0.1467305", "enquirer": "^2.3.6", "http-link-header": "^1.1.1", "intl-messageformat": "^10.5.3", "jpeg-js": "^0.4.4", "js-library-detector": "^6.7.0", "lighthouse-logger": "^2.0.1", "lighthouse-stack-packs": "1.12.2", "lodash-es": "^4.17.21", "lookup-closest-locale": "6.2.0", "metaviewport-parser": "0.3.0", "open": "^8.4.0", "parse-cache-control": "1.0.1", "puppeteer-core": "^24.10.0", "robots-parser": "^3.0.1", "semver": "^5.3.0", "speedline-core": "^1.4.3", "third-party-web": "^0.26.6", "tldts-icann": "^6.1.16", "ws": "^7.0.0", "yargs": "^17.3.1", "yargs-parser": "^21.0.0" }, "bin": { "lighthouse": "cli/index.js", "smokehouse": "cli/test/smokehouse/frontends/smokehouse-bin.js", "chrome-debug": "core/scripts/manual-chrome-launcher.js" } }, "sha512-85WDkjcXAVdlFem9Y6SSxqoKiz/89UsDZhLpeLJIsJ4LlHxw047XTZhlFJmjYCB7K5S1erSBAf5cYLcfyNbH3A=="], - "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="], + "lighthouse-logger": ["lighthouse-logger@1.2.0", "", { "dependencies": { "debug": "^2.6.8", "marky": "^1.2.0" } }, "sha512-wzUvdIeJZhRsG6gpZfmSCfysaxNEr43i+QT+Hie94wvHDKFLi4n7C2GqZ4sTC+PH5b5iktmXJvU87rWvhP3lHw=="], - "uuid": ["uuid@14.0.1", "", { "bin": { "uuid": "dist-node/bin/uuid" } }, "sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew=="], + "lighthouse-stack-packs": ["lighthouse-stack-packs@1.12.2", "", {}, "sha512-Ug8feS/A+92TMTCK6yHYLwaFMuelK/hAKRMdldYkMNwv+d9PtWxjXEg6rwKtsUXTADajhdrhXyuNCJ5/sfmPFw=="], - "vite": ["vite@8.0.16", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.15", "rolldown": "1.0.3", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.18", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@vitejs/devtools", "esbuild", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": "bin/vite.js" }, "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw=="], + "lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="], + + "lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="], - "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="], - "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="], - "zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="], + + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="], + + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="], + + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="], + + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="], + + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="], + + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="], + + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="], + + "localforage": ["localforage@1.10.0", "", { "dependencies": { "lie": "3.1.1" } }, "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg=="], + + "locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], + + "lodash": ["lodash@4.18.1", "", {}, "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q=="], + + "lodash-es": ["lodash-es@4.18.1", "", {}, "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A=="], + + "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], + + "lookup-closest-locale": ["lookup-closest-locale@6.2.0", "", {}, "sha512-/c2kL+Vnp1jnV6K6RpDTHK3dgg0Tu2VVp+elEiJpjfS1UyY7AjOYHohRug6wT0OpoX2qFgNORndE9RqesfVxWQ=="], + + "lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="], + + "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + + "magicast": ["magicast@0.5.3", "", { "dependencies": { "@babel/parser": "^7.29.3", "@babel/types": "^7.29.0", "source-map-js": "^1.2.1" } }, "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw=="], + + "make-dir": ["make-dir@3.1.0", "", { "dependencies": { "semver": "^6.0.0" } }, "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw=="], + + "markdown-extensions": ["markdown-extensions@2.0.0", "", {}, "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q=="], + + "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="], + + "marky": ["marky@1.3.0", "", {}, "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "mdast-util-definitions": ["mdast-util-definitions@6.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ=="], + + "mdast-util-directive": ["mdast-util-directive@3.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q=="], + + "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg=="], + + "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.3", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q=="], + + "mdast-util-gfm": ["mdast-util-gfm@3.1.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", "mdast-util-gfm-footnote": "^2.0.0", "mdast-util-gfm-strikethrough": "^2.0.0", "mdast-util-gfm-table": "^2.0.0", "mdast-util-gfm-task-list-item": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ=="], + + "mdast-util-gfm-autolink-literal": ["mdast-util-gfm-autolink-literal@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-find-and-replace": "^3.0.0", "micromark-util-character": "^2.0.0" } }, "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ=="], + + "mdast-util-gfm-footnote": ["mdast-util-gfm-footnote@2.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0" } }, "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ=="], + + "mdast-util-gfm-strikethrough": ["mdast-util-gfm-strikethrough@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg=="], + + "mdast-util-gfm-table": ["mdast-util-gfm-table@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "markdown-table": "^3.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg=="], + + "mdast-util-gfm-task-list-item": ["mdast-util-gfm-task-list-item@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ=="], + + "mdast-util-mdx": ["mdast-util-mdx@3.0.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w=="], + + "mdast-util-mdx-expression": ["mdast-util-mdx-expression@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ=="], + + "mdast-util-mdx-jsx": ["mdast-util-mdx-jsx@3.2.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" } }, "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q=="], + + "mdast-util-mdxjs-esm": ["mdast-util-mdxjs-esm@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg=="], + + "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="], + + "mdast-util-to-hast": ["mdast-util-to-hast@13.2.1", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA=="], + + "mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA=="], + + "mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="], + + "mdn-data": ["mdn-data@2.27.1", "", {}, "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ=="], + + "media-typer": ["media-typer@0.3.0", "", {}, "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="], + + "merge-descriptors": ["merge-descriptors@1.0.3", "", {}, "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ=="], + + "metaviewport-parser": ["metaviewport-parser@0.3.0", "", {}, "sha512-EoYJ8xfjQ6kpe9VbVHvZTZHiOl4HL1Z18CrZ+qahvLXT7ZO4YTC2JMyt5FaUp9JJp6J4Ybb/z7IsCXZt86/QkQ=="], + + "methods": ["methods@1.1.2", "", {}, "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="], + + "micromark": ["micromark@4.0.2", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="], + + "micromark-core-commonmark": ["micromark-core-commonmark@2.0.3", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-destination": "^2.0.0", "micromark-factory-label": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-title": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-html-tag-name": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg=="], + + "micromark-extension-directive": ["micromark-extension-directive@4.0.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "parse-entities": "^4.0.0" } }, "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg=="], + + "micromark-extension-gfm": ["micromark-extension-gfm@3.0.0", "", { "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", "micromark-extension-gfm-footnote": "^2.0.0", "micromark-extension-gfm-strikethrough": "^2.0.0", "micromark-extension-gfm-table": "^2.0.0", "micromark-extension-gfm-tagfilter": "^2.0.0", "micromark-extension-gfm-task-list-item": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w=="], + + "micromark-extension-gfm-autolink-literal": ["micromark-extension-gfm-autolink-literal@2.1.0", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw=="], + + "micromark-extension-gfm-footnote": ["micromark-extension-gfm-footnote@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw=="], + + "micromark-extension-gfm-strikethrough": ["micromark-extension-gfm-strikethrough@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw=="], + + "micromark-extension-gfm-table": ["micromark-extension-gfm-table@2.1.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg=="], + + "micromark-extension-gfm-tagfilter": ["micromark-extension-gfm-tagfilter@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg=="], + + "micromark-extension-gfm-task-list-item": ["micromark-extension-gfm-task-list-item@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw=="], + + "micromark-extension-mdx-expression": ["micromark-extension-mdx-expression@3.0.1", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q=="], + + "micromark-extension-mdx-jsx": ["micromark-extension-mdx-jsx@3.0.2", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ=="], + + "micromark-extension-mdx-md": ["micromark-extension-mdx-md@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ=="], + + "micromark-extension-mdxjs": ["micromark-extension-mdxjs@3.0.0", "", { "dependencies": { "acorn": "^8.0.0", "acorn-jsx": "^5.0.0", "micromark-extension-mdx-expression": "^3.0.0", "micromark-extension-mdx-jsx": "^3.0.0", "micromark-extension-mdx-md": "^2.0.0", "micromark-extension-mdxjs-esm": "^3.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ=="], + + "micromark-extension-mdxjs-esm": ["micromark-extension-mdxjs-esm@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A=="], + + "micromark-factory-destination": ["micromark-factory-destination@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="], + + "micromark-factory-label": ["micromark-factory-label@2.0.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg=="], + + "micromark-factory-mdx-expression": ["micromark-factory-mdx-expression@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ=="], + + "micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-factory-title": ["micromark-factory-title@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw=="], + + "micromark-factory-whitespace": ["micromark-factory-whitespace@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ=="], + + "micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-util-chunked": ["micromark-util-chunked@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA=="], + + "micromark-util-classify-character": ["micromark-util-classify-character@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q=="], + + "micromark-util-combine-extensions": ["micromark-util-combine-extensions@2.0.1", "", { "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg=="], + + "micromark-util-decode-numeric-character-reference": ["micromark-util-decode-numeric-character-reference@2.0.2", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw=="], + + "micromark-util-decode-string": ["micromark-util-decode-string@2.0.1", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ=="], + + "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], + + "micromark-util-events-to-acorn": ["micromark-util-events-to-acorn@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg=="], + + "micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="], + + "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="], + + "micromark-util-resolve-all": ["micromark-util-resolve-all@2.0.1", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg=="], + + "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="], + + "micromark-util-subtokenize": ["micromark-util-subtokenize@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA=="], + + "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="], + + "mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], + + "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "mimic-fn": ["mimic-fn@1.2.0", "", {}, "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="], + + "minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "mitt": ["mitt@3.0.1", "", {}, "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="], + + "mkdirp": ["mkdirp@0.5.6", "", { "dependencies": { "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="], + + "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "muggle-string": ["muggle-string@0.4.1", "", {}, "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ=="], + + "mute-stream": ["mute-stream@0.0.7", "", {}, "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ=="], + + "nanoid": ["nanoid@3.3.14", "", { "bin": "bin/nanoid.cjs" }, "sha512-U9kYi5bpVMEI31yC8iw4bJJp0avcHXA0W8/wNfLfnvJYzihQo2ZRPYPvpAAd570HAcCBjCTN7vnr+v4StKl1IQ=="], + + "negotiator": ["negotiator@0.6.4", "", {}, "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w=="], + + "neotraverse": ["neotraverse@0.6.18", "", {}, "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA=="], + + "netmask": ["netmask@2.1.1", "", {}, "sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA=="], + + "nlcst-to-string": ["nlcst-to-string@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0" } }, "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA=="], + + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + + "node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="], + + "node-mock-http": ["node-mock-http@1.0.4", "", {}, "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], + + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], + + "obug": ["obug@2.1.3", "", {}, "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg=="], + + "ofetch": ["ofetch@1.5.1", "", { "dependencies": { "destr": "^2.0.5", "node-fetch-native": "^1.6.7", "ufo": "^1.6.1" } }, "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA=="], + + "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], + + "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], + + "on-headers": ["on-headers@1.1.0", "", {}, "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "onetime": ["onetime@2.0.1", "", { "dependencies": { "mimic-fn": "^1.0.0" } }, "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ=="], + + "oniguruma-parser": ["oniguruma-parser@0.12.2", "", {}, "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw=="], + + "oniguruma-to-es": ["oniguruma-to-es@4.3.6", "", { "dependencies": { "oniguruma-parser": "^0.12.2", "regex": "^6.1.0", "regex-recursion": "^6.0.2" } }, "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA=="], + + "open": ["open@7.4.2", "", { "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" } }, "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q=="], + + "os-tmpdir": ["os-tmpdir@1.0.2", "", {}, "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g=="], + + "p-limit": ["p-limit@7.3.0", "", { "dependencies": { "yocto-queue": "^1.2.1" } }, "sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw=="], + + "p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + + "p-queue": ["p-queue@9.3.1", "", { "dependencies": { "eventemitter3": "^5.0.4", "p-timeout": "^7.0.0" } }, "sha512-POWdiIPmsUPGwb4FeQ4OBg46aqmcInSWe45CKDsGHiOBiVQM9chqfQTuqhuTzcg2Vz9faTI65at0KkVyVEiCHw=="], + + "p-timeout": ["p-timeout@7.0.1", "", {}, "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg=="], + + "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], + + "pac-proxy-agent": ["pac-proxy-agent@7.2.0", "", { "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.1.2", "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.6", "pac-resolver": "^7.0.1", "socks-proxy-agent": "^8.0.5" } }, "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA=="], + + "pac-resolver": ["pac-resolver@7.0.1", "", { "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" } }, "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg=="], + + "package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="], + + "pagefind": ["pagefind@1.5.2", "", { "optionalDependencies": { "@pagefind/darwin-arm64": "1.5.2", "@pagefind/darwin-x64": "1.5.2", "@pagefind/freebsd-x64": "1.5.2", "@pagefind/linux-arm64": "1.5.2", "@pagefind/linux-x64": "1.5.2", "@pagefind/windows-arm64": "1.5.2", "@pagefind/windows-x64": "1.5.2" }, "bin": { "pagefind": "lib/runner/bin.cjs" } }, "sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q=="], + + "parse-cache-control": ["parse-cache-control@1.0.1", "", {}, "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg=="], + + "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], + + "parse-latin": ["parse-latin@7.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "@types/unist": "^3.0.0", "nlcst-to-string": "^4.0.0", "unist-util-modify-children": "^4.0.0", "unist-util-visit-children": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ=="], + + "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], + + "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], + + "path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], + + "path-to-regexp": ["path-to-regexp@0.1.13", "", {}, "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA=="], + + "pend": ["pend@1.2.0", "", {}, "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="], + + "piccolore": ["piccolore@0.1.3", "", {}, "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], + + "playwright": ["playwright@1.61.1", "", { "dependencies": { "playwright-core": "1.61.1" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ=="], + + "playwright-core": ["playwright-core@1.61.1", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg=="], + + "postcss": ["postcss@8.5.15", "", { "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A=="], + + "postcss-nested": ["postcss-nested@6.2.0", "", { "dependencies": { "postcss-selector-parser": "^6.1.1" }, "peerDependencies": { "postcss": "^8.2.14" } }, "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ=="], + + "postcss-selector-parser": ["postcss-selector-parser@6.1.4", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ=="], + + "prettier": ["prettier@3.8.4", "", { "bin": "bin/prettier.cjs" }, "sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q=="], + + "prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="], + + "process-ancestry": ["process-ancestry@0.1.0", "", {}, "sha512-tGqJW/UnclpYASFcM6Xh8D8l/BMtaQ9+CSG0vlJSJTcdMM4lDRv4c6H0Pdcsfted+bVczdYSfk2fdukg2gQkZg=="], + + "progress": ["progress@2.0.3", "", {}, "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="], + + "property-information": ["property-information@7.2.0", "", {}, "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg=="], + + "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], + + "proxy-agent": ["proxy-agent@6.5.0", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "http-proxy-agent": "^7.0.1", "https-proxy-agent": "^7.0.6", "lru-cache": "^7.14.1", "pac-proxy-agent": "^7.1.0", "proxy-from-env": "^1.1.0", "socks-proxy-agent": "^8.0.5" } }, "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A=="], + + "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], + + "pump": ["pump@3.0.4", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA=="], + + "puppeteer-core": ["puppeteer-core@24.43.1", "", { "dependencies": { "@puppeteer/browsers": "2.13.2", "chromium-bidi": "14.0.0", "debug": "^4.4.3", "devtools-protocol": "0.0.1608973", "typed-query-selector": "^2.12.2", "webdriver-bidi-protocol": "0.4.1", "ws": "^8.20.0" } }, "sha512-T5ScUMAsmhdNbgDR41AGESYeS6V9MSgetkSnVhhW+gXvzC42VesKCn5ld87gAZDJ6vLHL9GkRvY9WtQWSnwFbw=="], + + "qs": ["qs@6.15.3", "", { "dependencies": { "es-define-property": "^1.0.1", "side-channel": "^1.1.1" } }, "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A=="], + + "radix3": ["radix3@1.1.2", "", {}, "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="], + + "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + + "raw-body": ["raw-body@2.5.3", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "unpipe": "~1.0.0" } }, "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA=="], + + "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + + "recma-build-jsx": ["recma-build-jsx@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-build-jsx": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew=="], + + "recma-jsx": ["recma-jsx@1.0.1", "", { "dependencies": { "acorn-jsx": "^5.0.0", "estree-util-to-js": "^2.0.0", "recma-parse": "^1.0.0", "recma-stringify": "^1.0.0", "unified": "^11.0.0" }, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w=="], + + "recma-parse": ["recma-parse@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "esast-util-from-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ=="], + + "recma-stringify": ["recma-stringify@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-to-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g=="], + + "regex": ["regex@6.1.0", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg=="], + + "regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="], + + "regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="], + + "rehype": ["rehype@13.0.2", "", { "dependencies": { "@types/hast": "^3.0.0", "rehype-parse": "^9.0.0", "rehype-stringify": "^10.0.0", "unified": "^11.0.0" } }, "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A=="], + + "rehype-expressive-code": ["rehype-expressive-code@0.44.0", "", { "dependencies": { "expressive-code": "^0.44.0" } }, "sha512-5r74C5F2sMR3X+QJH8OKWgZBO/cqRw5W1fLT6GVlSfLqepk+4j8tGFkyPqZYWjwntsBHzKPDH2zI68sZ7ScLfA=="], + + "rehype-format": ["rehype-format@5.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-format": "^1.0.0" } }, "sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ=="], + + "rehype-parse": ["rehype-parse@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-from-html": "^2.0.0", "unified": "^11.0.0" } }, "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag=="], + + "rehype-raw": ["rehype-raw@7.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-raw": "^9.0.0", "vfile": "^6.0.0" } }, "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww=="], + + "rehype-recma": ["rehype-recma@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "hast-util-to-estree": "^3.0.0" } }, "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw=="], + + "rehype-stringify": ["rehype-stringify@10.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-to-html": "^9.0.0", "unified": "^11.0.0" } }, "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA=="], + + "remark-directive": ["remark-directive@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-directive": "^3.0.0", "micromark-extension-directive": "^4.0.0", "unified": "^11.0.0" } }, "sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA=="], + + "remark-gfm": ["remark-gfm@4.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", "micromark-extension-gfm": "^3.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg=="], + + "remark-mdx": ["remark-mdx@3.1.1", "", { "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" } }, "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg=="], + + "remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="], + + "remark-rehype": ["remark-rehype@11.1.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw=="], + + "remark-smartypants": ["remark-smartypants@3.0.2", "", { "dependencies": { "retext": "^9.0.0", "retext-smartypants": "^6.0.0", "unified": "^11.0.4", "unist-util-visit": "^5.0.0" } }, "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA=="], + + "remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="], + + "request-light": ["request-light@0.7.0", "", {}, "sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q=="], + + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + + "require-main-filename": ["require-main-filename@2.0.0", "", {}, "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="], + + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], + + "restore-cursor": ["restore-cursor@2.0.0", "", { "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" } }, "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q=="], + + "retext": ["retext@9.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "retext-latin": "^4.0.0", "retext-stringify": "^4.0.0", "unified": "^11.0.0" } }, "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA=="], + + "retext-latin": ["retext-latin@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "parse-latin": "^7.0.0", "unified": "^11.0.0" } }, "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA=="], + + "retext-smartypants": ["retext-smartypants@6.2.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ=="], + + "retext-stringify": ["retext-stringify@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", "unified": "^11.0.0" } }, "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA=="], + + "rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], + + "robots-parser": ["robots-parser@3.0.1", "", {}, "sha512-s+pyvQeIKIZ0dx5iJiQk1tPLJAWln39+MI5jtM8wnyws+G5azk+dMnMX0qfbqNetKKNgcWWOdi0sfm+FbQbgdQ=="], + + "rolldown": ["rolldown@1.0.3", "", { "dependencies": { "@oxc-project/types": "=0.133.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.3", "@rolldown/binding-darwin-arm64": "1.0.3", "@rolldown/binding-darwin-x64": "1.0.3", "@rolldown/binding-freebsd-x64": "1.0.3", "@rolldown/binding-linux-arm-gnueabihf": "1.0.3", "@rolldown/binding-linux-arm64-gnu": "1.0.3", "@rolldown/binding-linux-arm64-musl": "1.0.3", "@rolldown/binding-linux-ppc64-gnu": "1.0.3", "@rolldown/binding-linux-s390x-gnu": "1.0.3", "@rolldown/binding-linux-x64-gnu": "1.0.3", "@rolldown/binding-linux-x64-musl": "1.0.3", "@rolldown/binding-openharmony-arm64": "1.0.3", "@rolldown/binding-wasm32-wasi": "1.0.3", "@rolldown/binding-win32-arm64-msvc": "1.0.3", "@rolldown/binding-win32-x64-msvc": "1.0.3" }, "bin": "bin/cli.mjs" }, "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g=="], + + "run-async": ["run-async@2.4.1", "", {}, "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ=="], + + "rxjs": ["rxjs@6.6.7", "", { "dependencies": { "tslib": "^1.9.0" } }, "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + + "satteri": ["satteri@0.9.5", "", { "dependencies": { "@types/estree-jsx": "^1.0.5", "@types/hast": "^3.0.4", "@types/mdast": "^4.0.4", "@types/unist": "^3.0.3" }, "optionalDependencies": { "@bruits/satteri-darwin-arm64": "0.9.5", "@bruits/satteri-darwin-x64": "0.9.5", "@bruits/satteri-linux-arm64-gnu": "0.9.5", "@bruits/satteri-linux-arm64-musl": "0.9.5", "@bruits/satteri-linux-x64-gnu": "0.9.5", "@bruits/satteri-linux-x64-musl": "0.9.5", "@bruits/satteri-wasm32-wasi": "0.9.5", "@bruits/satteri-win32-arm64-msvc": "0.9.5", "@bruits/satteri-win32-x64-msvc": "0.9.5" } }, "sha512-ZuWVl+vnM64y+/TtX8Kosv2c00W+hLQiiwnEL6H0UKVVrxFqMw4D2CJHHQaouVd89OAhtBBfjWLqhKi3TVUV4w=="], + + "sax": ["sax@1.6.0", "", {}, "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA=="], + + "semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], + + "send": ["send@0.19.2", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "~0.5.2", "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "~2.4.1", "range-parser": "~1.2.1", "statuses": "~2.0.2" } }, "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg=="], + + "serve-static": ["serve-static@1.16.3", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "~0.19.1" } }, "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA=="], + + "set-blocking": ["set-blocking@2.0.0", "", {}, "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="], + + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], + + "sharp": ["sharp@0.35.3", "", { "dependencies": { "@img/colour": "^1.1.0", "detect-libc": "^2.1.2", "semver": "^7.8.5" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.35.3", "@img/sharp-darwin-x64": "0.35.3", "@img/sharp-freebsd-wasm32": "0.35.3", "@img/sharp-libvips-darwin-arm64": "1.3.2", "@img/sharp-libvips-darwin-x64": "1.3.2", "@img/sharp-libvips-linux-arm": "1.3.2", "@img/sharp-libvips-linux-arm64": "1.3.2", "@img/sharp-libvips-linux-ppc64": "1.3.2", "@img/sharp-libvips-linux-riscv64": "1.3.2", "@img/sharp-libvips-linux-s390x": "1.3.2", "@img/sharp-libvips-linux-x64": "1.3.2", "@img/sharp-libvips-linuxmusl-arm64": "1.3.2", "@img/sharp-libvips-linuxmusl-x64": "1.3.2", "@img/sharp-linux-arm": "0.35.3", "@img/sharp-linux-arm64": "0.35.3", "@img/sharp-linux-ppc64": "0.35.3", "@img/sharp-linux-riscv64": "0.35.3", "@img/sharp-linux-s390x": "0.35.3", "@img/sharp-linux-x64": "0.35.3", "@img/sharp-linuxmusl-arm64": "0.35.3", "@img/sharp-linuxmusl-x64": "0.35.3", "@img/sharp-webcontainers-wasm32": "0.35.3", "@img/sharp-win32-arm64": "0.35.3", "@img/sharp-win32-ia32": "0.35.3", "@img/sharp-win32-x64": "0.35.3" } }, "sha512-ej0zVHuZGHCiABXcNxeYhpRnPNPAcvbG8RMdBAhDAxLKkCRVSpK3Iyu7qbqw3JMzoj0REeM6f3tJLtVwl0023Q=="], + + "shiki": ["shiki@4.3.1", "", { "dependencies": { "@shikijs/core": "4.3.1", "@shikijs/engine-javascript": "4.3.1", "@shikijs/engine-oniguruma": "4.3.1", "@shikijs/langs": "4.3.1", "@shikijs/themes": "4.3.1", "@shikijs/types": "4.3.1", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-oR+qDVi2OjX1tmDpyv+3KviX01KzO6Af+0NNnKnsp9491UEGz2YpxTuJboS/6VhYpTdqzmuJBuiTlrAWWJAssw=="], + + "side-channel": ["side-channel@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4", "side-channel-list": "^1.0.1", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ=="], + + "side-channel-list": ["side-channel-list@1.0.1", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4" } }, "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w=="], + + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], + + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + + "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], + + "sitemap": ["sitemap@9.0.1", "", { "dependencies": { "@types/node": "^24.9.2", "@types/sax": "^1.2.1", "arg": "^5.0.0", "sax": "^1.4.1" }, "bin": { "sitemap": "dist/esm/cli.js" } }, "sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ=="], + + "smart-buffer": ["smart-buffer@4.2.0", "", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="], + + "smol-toml": ["smol-toml@1.7.0", "", {}, "sha512-aqVvWoyO21L23mb+drl4RmMXbf6N7FdHjAhTRA9ZBL7apWBgfWC16KjrASI+1p9GAroljyMHj6fK67i0UiTNvQ=="], + + "socks": ["socks@2.8.9", "", { "dependencies": { "ip-address": "^10.1.1", "smart-buffer": "^4.2.0" } }, "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw=="], + + "socks-proxy-agent": ["socks-proxy-agent@8.0.5", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw=="], + + "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], + + "speedline-core": ["speedline-core@1.4.3", "", { "dependencies": { "@types/node": "*", "image-ssim": "^0.2.0", "jpeg-js": "^0.4.1" } }, "sha512-DI7/OuAUD+GMpR6dmu8lliO2Wg5zfeh+/xsdyJZCzd8o5JgFUjCeLsBDuZjIQJdwXS3J0L/uZYrELKYqx+PXog=="], + + "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], + + "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], + + "stream-replace-string": ["stream-replace-string@2.0.0", "", {}, "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w=="], + + "streamx": ["streamx@2.28.0", "", { "dependencies": { "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" } }, "sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw=="], + + "string-width": ["string-width@2.1.1", "", { "dependencies": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" } }, "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw=="], + + "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], + + "strip-ansi": ["strip-ansi@5.2.0", "", { "dependencies": { "ansi-regex": "^4.1.0" } }, "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA=="], + + "style-to-js": ["style-to-js@1.1.21", "", { "dependencies": { "style-to-object": "1.0.14" } }, "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ=="], + + "style-to-object": ["style-to-object@1.0.14", "", { "dependencies": { "inline-style-parser": "0.2.7" } }, "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw=="], + + "supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "svgo": ["svgo@4.0.1", "", { "dependencies": { "commander": "^11.1.0", "css-select": "^5.1.0", "css-tree": "^3.0.1", "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.1.1", "sax": "^1.5.0" }, "bin": "./bin/svgo.js" }, "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w=="], + + "tar-fs": ["tar-fs@3.1.3", "", { "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" }, "optionalDependencies": { "bare-fs": "^4.0.1", "bare-path": "^3.0.0" } }, "sha512-/hU4AXnIdZu+Gvl1pk0oI5f5HxWsCJRtY2aFaJdk9VvyL48DWU6iU5WAIPG+wIi1YvWA6eTJvIviP/tMAZZNwQ=="], + + "tar-stream": ["tar-stream@3.2.0", "", { "dependencies": { "b4a": "^1.6.4", "bare-fs": "^4.5.5", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg=="], + + "teex": ["teex@1.0.1", "", { "dependencies": { "streamx": "^2.12.5" } }, "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg=="], + + "text-decoder": ["text-decoder@1.2.7", "", { "dependencies": { "b4a": "^1.6.4" } }, "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ=="], + + "third-party-web": ["third-party-web@0.26.7", "", {}, "sha512-buUzX4sXC4efFX6xg2bw6/eZsCUh8qQwSavC4D9HpONMFlRbcHhD8Je5qwYdCpViR6q0qla2wPP+t91a2vgolg=="], + + "through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="], + + "tiny-inflate": ["tiny-inflate@1.0.3", "", {}, "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="], + + "tinyclip": ["tinyclip@0.1.15", "", {}, "sha512-uo33abH+Ays0xYaDysoBt494Hb3hsEczMpcC0MwFl773pazORx4fmvKhclhR1wonUbB6vvpRsvVMwnhfqeMc+A=="], + + "tinyexec": ["tinyexec@1.2.4", "", {}, "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg=="], + + "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], + + "tldts-core": ["tldts-core@6.1.86", "", {}, "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA=="], + + "tldts-icann": ["tldts-icann@6.1.86", "", { "dependencies": { "tldts-core": "^6.1.86" } }, "sha512-NFxmRT2lAEMcCOBgeZ0NuM0zsK/xgmNajnY6n4S1mwAKocft2s2ise1O3nQxrH3c+uY6hgHUV9GGNVp7tUE4Sg=="], + + "tmp": ["tmp@0.1.0", "", { "dependencies": { "rimraf": "^2.6.3" } }, "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw=="], + + "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + + "tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="], + + "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], + + "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], + + "tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], + + "type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="], + + "typed-query-selector": ["typed-query-selector@2.12.2", "", {}, "sha512-EOPFbyIub4ngnEdqi2yOcNeDLaX/0jcE1JoAXQDDMIthap7FoN795lc/SHfIq2d416VufXpM8z/lD+WRm2gfOQ=="], + + "typedarray-to-buffer": ["typedarray-to-buffer@3.1.5", "", { "dependencies": { "is-typedarray": "^1.0.0" } }, "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q=="], + + "typesafe-path": ["typesafe-path@0.2.2", "", {}, "sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA=="], + + "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], + + "typescript-auto-import-cache": ["typescript-auto-import-cache@0.3.6", "", { "dependencies": { "semver": "^7.3.8" } }, "sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ=="], + + "ufo": ["ufo@1.6.4", "", {}, "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA=="], + + "ultrahtml": ["ultrahtml@1.6.0", "", {}, "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw=="], + + "uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="], + + "undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], + + "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], + + "unifont": ["unifont@0.7.4", "", { "dependencies": { "css-tree": "^3.1.0", "ofetch": "^1.5.1", "ohash": "^2.0.11" } }, "sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg=="], + + "unique-string": ["unique-string@2.0.0", "", { "dependencies": { "crypto-random-string": "^2.0.0" } }, "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg=="], + + "unist-util-find-after": ["unist-util-find-after@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ=="], + + "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="], + + "unist-util-modify-children": ["unist-util-modify-children@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "array-iterate": "^2.0.0" } }, "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw=="], + + "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], + + "unist-util-position-from-estree": ["unist-util-position-from-estree@2.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ=="], + + "unist-util-remove-position": ["unist-util-remove-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q=="], + + "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], + + "unist-util-visit": ["unist-util-visit@5.1.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg=="], + + "unist-util-visit-children": ["unist-util-visit-children@3.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA=="], + + "unist-util-visit-parents": ["unist-util-visit-parents@6.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="], + + "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], + + "unstorage": ["unstorage@1.17.5", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^5.0.0", "destr": "^2.0.5", "h3": "^1.15.10", "lru-cache": "^11.2.7", "node-fetch-native": "^1.6.7", "ofetch": "^1.5.1", "ufo": "^1.6.3" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", "@azure/cosmos": "^4.2.0", "@azure/data-tables": "^13.3.0", "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", "@capacitor/preferences": "^6 || ^7 || ^8", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", "@vercel/kv": "^1 || ^2 || ^3", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", "ioredis": "^5.4.2", "uploadthing": "^7.4.4" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/functions", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg=="], + + "url-extras": ["url-extras@0.1.0", "", {}, "sha512-8tzwTeXFPuX/5PHuCDQE5Dd9Ts4rwoq2t9aIT+HS4iAVpmj5l4Ao7Q+BuuFjvWRqrLswBhQDk8O96ZicgCqQqw=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="], + + "uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], + + "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], + + "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], + + "vfile-location": ["vfile-location@5.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg=="], + + "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], + + "vite": ["vite@8.0.16", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.15", "rolldown": "1.0.3", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.18", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@vitejs/devtools", "esbuild", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": "bin/vite.js" }, "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw=="], + + "vitefu": ["vitefu@1.1.3", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["vite"] }, "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg=="], + + "volar-service-css": ["volar-service-css@0.0.71", "", { "dependencies": { "vscode-css-languageservice": "^6.3.0", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-wRRFt9BpjMKCazcgOh67MSjUjiWUCAh99DyYSDIOTuxaRjEtDC7PpB0k1Y1wbJIW/pVtMUSVbpPo3UGSm0Byxw=="], + + "volar-service-emmet": ["volar-service-emmet@0.0.71", "", { "dependencies": { "@emmetio/css-parser": "^0.4.1", "@emmetio/html-matcher": "^1.3.0", "@vscode/emmet-helper": "^2.9.3", "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-zqjzt6bN95e3CUstBm0PBFAJnrfz0ZAARka87fart46/gNCLLuP3Vujy8V/J8HEziTFLnfkgIASLFYPUhonJcA=="], + + "volar-service-html": ["volar-service-html@0.0.71", "", { "dependencies": { "vscode-html-languageservice": "^5.3.0", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-e8tHPhgQ7ooLfudAEIku+kgd9pWkq3SSz8RbnQDI1+Eb8wbenkLGHqoirLqz5ORLV6wIMr2Iv08RWBG5eOcgpw=="], + + "volar-service-prettier": ["volar-service-prettier@0.0.71", "", { "dependencies": { "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0", "prettier": "^2.2 || ^3.0" }, "optionalPeers": ["@volar/language-service", "prettier"] }, "sha512-Rz7JVH3qD108UCdmIEiZvOBNljMt2nLFdbN8AXcDfn7xD9F5I2aCIsDVqBbXw21PsnxG0b7MfwtNF+zPS/NKUg=="], + + "volar-service-typescript": ["volar-service-typescript@0.0.71", "", { "dependencies": { "path-browserify": "^1.0.1", "semver": "^7.6.2", "typescript-auto-import-cache": "^0.3.5", "vscode-languageserver-textdocument": "^1.0.11", "vscode-nls": "^5.2.0", "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-yTtM/BVT6hoyEYnDtaCyAtNhdNeS/mhTTABlBOdw3NNiRBUin3IznFJpgfjer4c6RYopiPjjQjc9VFhxVl1mLw=="], + + "volar-service-typescript-twoslash-queries": ["volar-service-typescript-twoslash-queries@0.0.71", "", { "dependencies": { "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-9K2k72s4n7rV9s4bX0MyjbX9iBribvKZbBJKuEmTCZfeWJXs6Yh7bGpY4eoc7UufAjvpheBqwyZCOIPBvxCv0A=="], + + "volar-service-yaml": ["volar-service-yaml@0.0.71", "", { "dependencies": { "vscode-uri": "^3.0.8", "yaml-language-server": "~1.23.0" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-qYGWGuVpUTnZGu5P/CR4KLK4aIR8RrcVnmfZ2eRcj9q/I8VZCoC5yy9FtEvfNvnDp4MU17yhdJcvpQPIqhJS2Q=="], + + "vscode-css-languageservice": ["vscode-css-languageservice@6.3.10", "", { "dependencies": { "@vscode/l10n": "^0.0.18", "vscode-languageserver-textdocument": "^1.0.12", "vscode-languageserver-types": "3.17.5", "vscode-uri": "^3.1.0" } }, "sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA=="], + + "vscode-html-languageservice": ["vscode-html-languageservice@5.6.2", "", { "dependencies": { "@vscode/l10n": "^0.0.18", "vscode-languageserver-textdocument": "^1.0.12", "vscode-languageserver-types": "^3.17.5", "vscode-uri": "^3.1.0" } }, "sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg=="], + + "vscode-json-languageservice": ["vscode-json-languageservice@4.1.8", "", { "dependencies": { "jsonc-parser": "^3.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-languageserver-types": "^3.16.0", "vscode-nls": "^5.0.0", "vscode-uri": "^3.0.2" } }, "sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg=="], + + "vscode-jsonrpc": ["vscode-jsonrpc@9.0.1", "", {}, "sha512-rfuA6T75H6m5EkbhtEPzre9pT0HPcDI2MMy4+nPFIBks5J8JBAUHD4tRYSgaBOijIEC7SRkC1kKyXTLqbmh9jw=="], + + "vscode-languageserver": ["vscode-languageserver@9.0.1", "", { "dependencies": { "vscode-languageserver-protocol": "3.17.5" }, "bin": { "installServerIntoExtension": "bin/installServerIntoExtension" } }, "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g=="], + + "vscode-languageserver-protocol": ["vscode-languageserver-protocol@3.18.2", "", { "dependencies": { "vscode-jsonrpc": "9.0.1", "vscode-languageserver-types": "3.18.0" } }, "sha512-XRyDbT0Pp3sSNti3JmxVEUMySWCSi1hhM+/KUlCy1hV1zmrqpM1OwO12EAki8blhmLuIMpaJrYbo0OzGVfK2Qg=="], + + "vscode-languageserver-textdocument": ["vscode-languageserver-textdocument@1.0.12", "", {}, "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA=="], + + "vscode-languageserver-types": ["vscode-languageserver-types@3.18.0", "", {}, "sha512-8TsGPNMIMiiBdkORgRSvLjuiEIiAFtO+KssmYWxQ+uSVvlf7RjK8YKCOjPzZ+YA04jXEV7+7LvkSmHkhpNS99g=="], + + "vscode-nls": ["vscode-nls@5.2.0", "", {}, "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng=="], + + "vscode-uri": ["vscode-uri@3.1.0", "", {}, "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ=="], + + "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="], + + "webdriver-bidi-protocol": ["webdriver-bidi-protocol@0.4.1", "", {}, "sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw=="], + + "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + + "whatwg-fetch": ["whatwg-fetch@3.6.20", "", {}, "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg=="], + + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + + "which-module": ["which-module@2.0.1", "", {}, "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ=="], + + "which-pm-runs": ["which-pm-runs@1.1.0", "", {}, "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA=="], + + "wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "write-file-atomic": ["write-file-atomic@3.0.3", "", { "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q=="], + + "ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], + + "xdg-basedir": ["xdg-basedir@4.0.0", "", {}, "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q=="], + + "xxhash-wasm": ["xxhash-wasm@1.1.0", "", {}, "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA=="], + + "y18n": ["y18n@4.0.3", "", {}, "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="], + + "yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="], + + "yaml-language-server": ["yaml-language-server@1.23.0", "", { "dependencies": { "@vscode/l10n": "^0.0.18", "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "ajv-i18n": "^4.2.0", "prettier": "^3.8.1", "request-light": "^0.5.7", "vscode-json-languageservice": "4.1.8", "vscode-languageserver": "^9.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-languageserver-types": "^3.16.0", "vscode-uri": "^3.0.2", "yaml": "2.8.3" }, "bin": { "yaml-language-server": "bin/yaml-language-server" } }, "sha512-3qVyCOexLCWw06PQa5kRPwvMWMZ/eZeCRWUvgD6a0OkqL/4iCnxy2WumbWifa937Uo5xhyWJ0uxlU39ljhNh7A=="], + + "yargs": ["yargs@15.4.1", "", { "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", "find-up": "^4.1.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^18.1.2" } }, "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A=="], + + "yargs-parser": ["yargs-parser@13.1.2", "", { "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } }, "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg=="], + + "yauzl": ["yauzl@2.10.0", "", { "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g=="], + + "yocto-queue": ["yocto-queue@1.2.2", "", {}, "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ=="], + + "zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], + + "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + + "@astrojs/check/yargs": ["yargs@17.7.3", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g=="], + + "@astrojs/telemetry/is-docker": ["is-docker@4.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA=="], + + "@astrojs/telemetry/is-wsl": ["is-wsl@3.1.1", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="], + + "@emnapi/core/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@emnapi/runtime/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@emnapi/wasi-threads/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@formatjs/ecma402-abstract/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@formatjs/fast-memoize/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@formatjs/icu-messageformat-parser/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@formatjs/icu-skeleton-parser/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@formatjs/intl-localematcher/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@lhci/utils/js-yaml": ["js-yaml@3.15.0", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog=="], + + "@mdx-js/mdx/estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "@paulirish/trace_engine/third-party-web": ["third-party-web@0.29.2", "", {}, "sha512-fegtha91tq2DHphyoiBXVHjVi2YG9zFaRnboT9C28tO1en9Y3wJsfspuy40F+u5wl3hHVbw7cnd1b67kEGHb8g=="], + + "@puppeteer/browsers/yargs": ["yargs@17.7.3", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g=="], + + "@rolldown/binding-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.10.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="], + + "@rolldown/binding-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="], + + "@rolldown/binding-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.5", "", { "dependencies": { "@tybys/wasm-util": "^0.10.2" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q=="], + + "@tybys/wasm-util/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@vscode/emmet-helper/jsonc-parser": ["jsonc-parser@2.3.1", "", {}, "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg=="], + + "accepts/negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], + + "anymatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], + + "ast-types/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "astro/yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="], + + "body-parser/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "chromium-bidi/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + + "cliui/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "compression/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="], + + "dom-serializer/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "enquirer/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "escodegen/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "estree-util-build-jsx/estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "express/cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], + + "express/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "external-editor/tmp": ["tmp@0.0.33", "", { "dependencies": { "os-tmpdir": "~1.0.2" } }, "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw=="], + + "finalhandler/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "intl-messageformat/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "is-inside-container/is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], + + "lighthouse/chrome-launcher": ["chrome-launcher@1.2.1", "", { "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", "is-wsl": "^2.2.0", "lighthouse-logger": "^2.0.1" }, "bin": { "print-chrome-path": "bin/print-chrome-path.cjs" } }, "sha512-qmFR5PLMzHyuNJHwOloHPAHhbaNglkfeV/xDtt5b7xiFFyU1I+AZZX0PYseMuhenJSSirgxELYIbswcoc+5H4A=="], + + "lighthouse/lighthouse-logger": ["lighthouse-logger@2.0.2", "", { "dependencies": { "debug": "^4.4.1", "marky": "^1.2.2" } }, "sha512-vWl2+u5jgOQuZR55Z1WM0XDdrJT6mzMP8zHUct7xTlWhuQs+eV0g+QL0RQdFjT54zVmbhLCP8vIVpy1wGn/gCg=="], + + "lighthouse/open": ["open@8.4.2", "", { "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ=="], + + "lighthouse/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], + + "lighthouse/yargs": ["yargs@17.7.3", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g=="], + + "lighthouse/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "lighthouse-logger/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "make-dir/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "mdast-util-find-and-replace/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], + + "mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + + "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], + + "puppeteer-core/devtools-protocol": ["devtools-protocol@0.0.1608973", "", {}, "sha512-Tpm17fxYzt+J7VrGdc1k8YdRqS3YV7se/M6KeemEqvUbq/n7At1rWVuXMxQgpWkdwSdIEKYbU//Bve+Shm4YNQ=="], + + "puppeteer-core/ws": ["ws@8.21.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g=="], + + "send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "sitemap/@types/node": ["@types/node@24.13.3", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q=="], + + "string-width/strip-ansi": ["strip-ansi@4.0.0", "", { "dependencies": { "ansi-regex": "^3.0.0" } }, "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow=="], + + "tmp/rimraf": ["rimraf@2.7.1", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "./bin.js" } }, "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w=="], + + "unstorage/chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], + + "unstorage/lru-cache": ["lru-cache@11.5.2", "", {}, "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g=="], + + "vite/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "vscode-css-languageservice/vscode-languageserver-types": ["vscode-languageserver-types@3.17.5", "", {}, "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg=="], + + "vscode-languageserver/vscode-languageserver-protocol": ["vscode-languageserver-protocol@3.17.5", "", { "dependencies": { "vscode-jsonrpc": "8.2.0", "vscode-languageserver-types": "3.17.5" } }, "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg=="], + + "wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "wrap-ansi/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "wrap-ansi/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "yaml-language-server/request-light": ["request-light@0.5.8", "", {}, "sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg=="], + + "yaml-language-server/yaml": ["yaml@2.8.3", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg=="], + + "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "yargs/yargs-parser": ["yargs-parser@18.1.3", "", { "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } }, "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ=="], + + "@astrojs/check/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "@astrojs/check/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "@astrojs/check/yargs/y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "@astrojs/check/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "@lhci/utils/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + + "@puppeteer/browsers/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "@puppeteer/browsers/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "@puppeteer/browsers/yargs/y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "@puppeteer/browsers/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "@rolldown/binding-wasm32-wasi/@emnapi/core/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="], + + "@rolldown/binding-wasm32-wasi/@emnapi/core/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@rolldown/binding-wasm32-wasi/@emnapi/runtime/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@rolldown/binding-wasm32-wasi/@napi-rs/wasm-runtime/@tybys/wasm-util": ["@tybys/wasm-util@0.10.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg=="], + + "body-parser/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "cliui/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "compression/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="], + + "enquirer/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "express/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "finalhandler/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "lighthouse-logger/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "lighthouse/chrome-launcher/escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "lighthouse/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "lighthouse/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "lighthouse/yargs/y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "sitemap/@types/node/undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="], + + "string-width/strip-ansi/ansi-regex": ["ansi-regex@3.0.1", "", {}, "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw=="], + + "unstorage/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], + + "vscode-languageserver/vscode-languageserver-protocol/vscode-jsonrpc": ["vscode-jsonrpc@8.2.0", "", {}, "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA=="], + + "vscode-languageserver/vscode-languageserver-protocol/vscode-languageserver-types": ["vscode-languageserver-types@3.17.5", "", {}, "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg=="], + + "wrap-ansi/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "wrap-ansi/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "yargs/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "@astrojs/check/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "@astrojs/check/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "@astrojs/check/yargs/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "@astrojs/check/yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "@puppeteer/browsers/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "@puppeteer/browsers/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "@puppeteer/browsers/yargs/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "@puppeteer/browsers/yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "@rolldown/binding-wasm32-wasi/@napi-rs/wasm-runtime/@tybys/wasm-util/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "lighthouse/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "lighthouse/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "lighthouse/yargs/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "lighthouse/yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "wrap-ansi/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "@astrojs/check/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "@astrojs/check/yargs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@astrojs/check/yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "@puppeteer/browsers/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "@puppeteer/browsers/yargs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@puppeteer/browsers/yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "lighthouse/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "lighthouse/yargs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "lighthouse/yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "cytoscape-fcose/cose-base": ["cose-base@2.2.0", "", { "dependencies": { "layout-base": "^2.0.0" } }, "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g=="], + "@astrojs/check/yargs/cliui/wrap-ansi/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], - "d3-dsv/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], + "@puppeteer/browsers/yargs/cliui/wrap-ansi/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], - "d3-sankey/d3-array": ["d3-array@2.12.1", "", { "dependencies": { "internmap": "^1.0.0" } }, "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ=="], + "lighthouse/yargs/cliui/wrap-ansi/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], - "d3-sankey/d3-shape": ["d3-shape@1.3.7", "", { "dependencies": { "d3-path": "1" } }, "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw=="], + "@astrojs/check/yargs/cliui/wrap-ansi/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], - "cytoscape-fcose/cose-base/layout-base": ["layout-base@2.0.1", "", {}, "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg=="], + "@puppeteer/browsers/yargs/cliui/wrap-ansi/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], - "d3-sankey/d3-shape/d3-path": ["d3-path@1.0.9", "", {}, "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="], + "lighthouse/yargs/cliui/wrap-ansi/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], } } diff --git a/components.json b/components.json deleted file mode 100644 index d3184c8..0000000 --- a/components.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema.json", - "style": "new-york", - "rsc": false, - "tsx": true, - "tailwind": { - "config": "", - "css": "src/styles.css", - "baseColor": "stone", - "cssVariables": true, - "prefix": "" - }, - "aliases": { - "components": "@/components", - "utils": "@/lib/utils", - "ui": "@/components/ui", - "lib": "@/lib", - "hooks": "@/hooks" - }, - "iconLibrary": "lucide" -} diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 0000000..ab6a371 --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,46 @@ +# Architecture + +## Boundaries + +The workspace contains two independent static outputs: + +| Surface | Canonical origin | Responsibility | +| --- | --- | --- | +| Marketing | `https://mobench.org` | Product story, capability summary, proof, requirements, and task entry points | +| Documentation | `https://docs.mobench.org` | Guides, search, examples, generated reference, release applicability, and troubleshooting | + +The marketing application must not render documentation aliases. The documentation application must not mirror the marketing landing page. Redirects enforce the boundary at the edge. + +## Truth flow + +```text +mobile-bench-rs release tests + -> mobench-site-manifest-v1.json release asset + -> pinned manifest + checksum in packages/truth + -> generated reference, validation, llms files, and capability copy + -> both static Astro builds +``` + +The website build is offline and deterministic. A release-sync command may download an explicitly requested release into a temporary directory, validate it, and prepare a reviewable update. It must never read an unpinned upstream branch during a production build. + +Capabilities use exactly four states: `supported`, `preview`, `planned`, and `unsupported`. Each entry cites an upstream test or source identifier. Authored prose may explain a capability but cannot override its state. + +## Rendering + +- Astro emits complete HTML, metadata, canonical URLs, structured data, navigation, highlighted code, diagrams, sitemaps, and AI-readable text. +- Starlight supplies the documentation shell and Pagefind index. +- Framework-free scripts progressively enhance theme selection, mobile controls, copy, and tabs. +- Diagrams are accessible SVG or semantic HTML with adjacent text summaries. Mermaid is never shipped to browsers. +- Media declares dimensions and responsive sources. Font files are self-hosted and subset. + +## URL contract + +- Documentation home: `https://docs.mobench.org/` +- Documentation page: `https://docs.mobench.org//` +- Marketing documentation paths, `/docs`, `/overview`, and legacy documentation aliases return permanent redirects. +- Unknown paths return a branded HTTP 404 response. +- Sitemaps contain canonical URLs only. + +## Analytics contract + +Analytics are aggregate and non-identifying. Allowed events have fixed names and enum-like properties. Search queries, copied text, credentials, repository names, benchmark names, device IDs, and user-provided URLs are never transmitted. diff --git a/docs/AUTHORING.md b/docs/AUTHORING.md new file mode 100644 index 0000000..d7bad65 --- /dev/null +++ b/docs/AUTHORING.md @@ -0,0 +1,62 @@ +# Documentation authoring + +Documentation lives in `apps/docs/src/content/docs` as MDX. Prefer task-oriented prose and executable examples over feature inventories. + +## Required frontmatter + +Every page declares: + +```yaml +--- +title: First BrowserStack run +slug: first-browserstack-run +description: Build an Android runner and execute it on one hosted device. +section: Run benchmarks +order: 1 +audience: [benchmark-author, ci-engineer] +release: 0.1.43 +lastVerified: 2026-07-15 +sourceRefs: + - label: BrowserStack execution path + url: https://github.com/worldcoin/mobile-bench-rs/blob/d1a3176f9144f35e777e83fd07045116144da257/crates/mobench/src/browserstack.rs + evidence: source-browserstack-run +aliases: + - /app-automate +draft: false +--- +``` + +The required `slug` is the flat canonical route, independent of the authoring folder. Aliases begin with `/`, cannot collide with a canonical slug or another alias, and always redirect to a canonical page. + +## Commands and claims + +- Use `mobench` for stable `0.1.43` commands. Do not publish `cargo mobench` until the wrapper fix appears in the pinned release manifest and passes both invocation smokes. +- Ordinary mobile benchmark execution is a BrowserStack capability in the current release. +- `--local-only` is build/preflight behavior; it does not execute a benchmark on an attached phone, emulator, or simulator. +- Describe local profiling only where the manifest marks the exact platform/backend combination supported. +- Copy option names, defaults, artifact names, and configuration keys from the pinned upstream manifest. +- Never invent coverage percentages, energy metrics, benchmark results, or device-support claims. Link to a fixture, test, case study, or upstream source. + +All `bash`, `console`, and `sh` fences containing a `mobench` command are parser-tested against the pinned command tree. Use ordinary fenced blocks: + +````md +```console +mobench ci run --target android --output-dir target/mobench/ci --fetch +``` +```` + +JSON examples that represent an upstream schema use `test=schema:` and are validated during `bun run check`. + +TOML examples for published Mobench configuration use `test=config:mobench.toml` or `test=config:bench-config.toml`. Every tagged key must exist in the pinned manifest. + +## Links and media + +- Prefer canonical internal links without hostnames. +- External behavioral claims need a `sourceRefs` entry and a nearby human-readable link. +- Give meaningful images alt text, fixed dimensions, and responsive sources. +- Give every chart a table or definition list containing the same information. +- Give every diagram a visible summary that remains useful without the image. + +## Copy Markdown + +The Copy Markdown action returns the authored page body with headings, links, lists, and code fences intact. It must not copy navigation, analytics data, generated prompts, or hidden provider payloads. Assistant links, if present, contain only a short prompt and the canonical page URL. diff --git a/docs/DEPLOYMENT.md b/docs/DEPLOYMENT.md new file mode 100644 index 0000000..fa6571f --- /dev/null +++ b/docs/DEPLOYMENT.md @@ -0,0 +1,33 @@ +# Deployment and smoke checks + +## Vercel projects + +Configure two projects from the same repository: + +| Project | Root directory | Production domain | +| --- | --- | --- | +| Marketing | `apps/marketing` | `mobench.org` | +| Documentation | `apps/docs` | `docs.mobench.org` | + +Both projects use Bun and static Astro output. Preserve the previous successful deployment until the live smoke passes. + +## Preview gate + +- Run the complete Bun validation suite from the repository root. +- Confirm full HTML, unique metadata, canonical tags, `og:image:alt`, structured data, and navigation with JavaScript disabled. +- Exercise keyboard navigation, Pagefind search, copy success/failure, theme controls, mobile drawers, hashes, and browser history at 375, 768, 1024, 1280, and 1440 pixels. +- Run axe and screen-reader smoke checks; verify visible focus, focus restoration, reduced motion, target sizes, 200%/400% zoom, and semantic chart/diagram alternatives. +- Inspect responsive screenshots for the landing page, documentation home, search, a long reference page, both 404s, and both themes. +- Enforce initial JavaScript and hero budgets from the root test configuration. + +## HTTP smoke + +- Canonical marketing and documentation pages return `200` with complete HTML. +- Cross-host duplicates and legacy aliases return `308` to their one canonical URL. +- Unknown paths return `404` and use the matching surface's metadata. +- `robots.txt` is plain text and each sitemap is valid canonical-only XML. +- Hydration or progressive enhancement does not change titles, descriptions, canonicals, or structured data. + +## Live check and rollback + +Repeat the HTTP and critical browser smokes on both production domains. Roll back if canonical routing, Quickstart, search, copy, mobile navigation, or error status behavior regresses. After launch, monitor Core Web Vitals, 404s, redirect failures, search zero-result counts, and aggregate Quickstart exits without collecting raw query text or personal data. diff --git a/docs/RELEASE_SYNC.md b/docs/RELEASE_SYNC.md new file mode 100644 index 0000000..81c0df4 --- /dev/null +++ b/docs/RELEASE_SYNC.md @@ -0,0 +1,41 @@ +# Upstream release sync + +The site follows the latest stable mobench release. It does not consume `mobile-bench-rs/main` during builds. + +## Inputs + +A release update requires: + +1. A signed or otherwise verified upstream tag and commit SHA. +2. `mobench-site-manifest-v1.json` from that release. +3. The manifest SHA-256 checksum. +4. Referenced JSON schemas and deterministic fixtures. +5. Successful direct-executable and Cargo-wrapper smoke results recorded by upstream. + +## Update flow + +1. Download the manifest checksum asset from the upstream release, then run the sync command with an explicit tag and expected checksum: + + ```bash + gh release download vX.Y.Z \ + --repo worldcoin/mobile-bench-rs \ + --pattern 'mobench-site-manifest-v1.json.sha256' \ + --dir /tmp/mobench-release + bun run sync:release -- \ + --tag vX.Y.Z \ + --expected-manifest-sha256 "$(awk '{print $1}' /tmp/mobench-release/mobench-site-manifest-v1.json.sha256)" + ``` + + The command resolves the tag object to its commit, requires the manifest release identity to match, fetches schemas and fixtures from that immutable commit, validates their checksums and JSON contracts, and updates the offline truth package. It never fetches `main`. + +2. Review manifest and schema diffs. Capability changes require source evidence. +3. Run `bun install`, then `bun run generate` to rebuild the generated CLI/configuration references, Pagefind inputs, sitemaps, OG inputs, `llms.txt`, and `llms-full.txt`. +4. Run command parsing, schema validation, content, type, unit, E2E, accessibility, visual, HTTP, and performance checks. +5. Open a pull request showing the old/new release, commit SHA, checksum, capability changes, route changes, and screenshots. +6. Merge only after both preview deployments pass smoke checks. + +The scheduled `.github/workflows/release-sync.yml` watcher performs the same checksum-gated sync and opens an `automation/mobench-release-*` pull request. It never commits directly to the default branch and cannot silently relax a capability state because content validation rechecks every evidence identifier, command, configuration key, schema, and fixture. + +## Cargo wrapper rule + +`cargo mobench` becomes publishable only when the pinned manifest reports it supported and upstream tests prove that Cargo's injected leading `mobench` argument is removed while direct `mobench` invocation remains unchanged. Until then, generated examples use `mobench`. diff --git a/docs/licenses/Geist-OFL.txt b/docs/licenses/Geist-OFL.txt new file mode 100644 index 0000000..5971548 --- /dev/null +++ b/docs/licenses/Geist-OFL.txt @@ -0,0 +1,94 @@ +Copyright 2024 The Geist Project Authors (https://github.com/vercel/geist-font) +Geist-Italic[wght].ttf: Copyright 2024 The Geist Project Authors +(https://github.com/vercel/geist-font) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/index.html b/index.html deleted file mode 100644 index 40982a1..0000000 --- a/index.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - mobench - Rust mobile benchmarking CLI and SDK - - - - - - - - - - - - - - - - -
- - - diff --git a/lighthouserc.docs.cjs b/lighthouserc.docs.cjs new file mode 100644 index 0000000..bdce86f --- /dev/null +++ b/lighthouserc.docs.cjs @@ -0,0 +1,25 @@ +module.exports = { + ci: { + collect: { + staticDistDir: './apps/docs/dist', + url: ['http://localhost/', 'http://localhost/quickstart/', 'http://localhost/cli/'], + numberOfRuns: 1, + settings: { + preset: 'desktop', + chromeFlags: '--headless --no-sandbox --disable-dev-shm-usage', + }, + }, + assert: { + assertions: { + 'categories:performance': ['error', { minScore: 0.9 }], + 'categories:accessibility': ['error', { minScore: 0.95 }], + 'categories:best-practices': ['error', { minScore: 0.9 }], + 'categories:seo': ['error', { minScore: 0.95 }], + 'largest-contentful-paint': ['error', { maxNumericValue: 2500 }], + 'cumulative-layout-shift': ['error', { maxNumericValue: 0.1 }], + 'total-blocking-time': ['error', { maxNumericValue: 200 }], + }, + }, + upload: { target: 'filesystem', outputDir: '.lighthouseci/docs' }, + }, +} diff --git a/lighthouserc.marketing.cjs b/lighthouserc.marketing.cjs new file mode 100644 index 0000000..e6261d7 --- /dev/null +++ b/lighthouserc.marketing.cjs @@ -0,0 +1,25 @@ +module.exports = { + ci: { + collect: { + staticDistDir: './apps/marketing/dist', + url: ['http://localhost/', 'http://localhost/privacy/'], + numberOfRuns: 1, + settings: { + preset: 'desktop', + chromeFlags: '--headless --no-sandbox --disable-dev-shm-usage', + }, + }, + assert: { + assertions: { + 'categories:performance': ['error', { minScore: 0.9 }], + 'categories:accessibility': ['error', { minScore: 0.95 }], + 'categories:best-practices': ['error', { minScore: 0.9 }], + 'categories:seo': ['error', { minScore: 0.95 }], + 'largest-contentful-paint': ['error', { maxNumericValue: 2500 }], + 'cumulative-layout-shift': ['error', { maxNumericValue: 0.1 }], + 'total-blocking-time': ['error', { maxNumericValue: 200 }], + }, + }, + upload: { target: 'filesystem', outputDir: '.lighthouseci/marketing' }, + }, +} diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 70762fa..0000000 --- a/package-lock.json +++ /dev/null @@ -1,2636 +0,0 @@ -{ - "name": "mobench-org", - "version": "0.3.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "mobench-org", - "version": "0.3.0", - "dependencies": { - "@radix-ui/react-accordion": "^1.2.14", - "@radix-ui/react-slot": "^1.3.0", - "@tanstack/react-router": "^1.170.16", - "@tanstack/react-router-devtools": "^1.167.0", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "lucide-react": "^1.21.0", - "react": "^19.2.7", - "react-dom": "^19.2.7", - "tailwind-merge": "^3.6.0", - "tailwindcss-animate": "^1.0.7" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.3.1", - "@tanstack/router-plugin": "^1.168.18", - "@types/node": "^26.0.0", - "@types/react": "^19.2.17", - "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "^6.0.2", - "tailwindcss": "^4.3.1", - "typescript": "^6.0.3", - "vite": "^8.0.16" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", - "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.29.7", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", - "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", - "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-compilation-targets": "^7.29.7", - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helpers": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", - "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.29.7", - "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", - "dependencies": { - "@babel/compat-data": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", - "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.29.7", - "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", - "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", - "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.29.7", - "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", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "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", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.29.7", - "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", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", - "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.7" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/template": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", - "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", - "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@emnapi/core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", - "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", - "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "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", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "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.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.5.tgz", - "integrity": "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@tybys/wasm-util": "^0.10.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1" - } - }, - "node_modules/@oxc-project/types": { - "version": "0.133.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz", - "integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@radix-ui/primitive": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.4.tgz", - "integrity": "sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-accordion": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.14.tgz", - "integrity": "sha512-iE8YB9nmTBH8zd73ofBISZ8JCzgMoMkATJr7qDwa6u5F1+7mTM81V6fa71jgZ65rpjVpecDf1vSnwIFP9Ly1zw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collapsible": "1.1.14", - "@radix-ui/react-collection": "1.1.10", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-use-controllable-state": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collapsible": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.14.tgz", - "integrity": "sha512-9bT+FvifX1FK2Mj6UEsTdyu0cN3JaA3KdfhaBao+ONrYFy/pyOy3TU1TNw7iOk1o+0hOEq67RojlUUmoFGwxyA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collection": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.10.tgz", - "integrity": "sha512-IVVz4EvBcKjrzKgof714qDnz/SzQAkLA2Emh5edlHbgcE6fNd3Un6CJLlaYcnm8N4JmAtzQgse4dOKxcD2yc9g==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-slot": "1.3.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.3.tgz", - "integrity": "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.4.tgz", - "integrity": "sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-direction": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.2.tgz", - "integrity": "sha512-C3vFhbyi4SW3PmbAi6Awpu4OzJtd0MxGurvSsYtr7p7nM8RNB3VAF3CUmnp2j50knpkrRcB7+ycVXzgLgF6yNA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-id": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.2.tgz", - "integrity": "sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-presence": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.6.tgz", - "integrity": "sha512-zdTk4PlUO0E18HnZ3wYbW0KkJJxWCdiNYp6g6X1PtONFhxVkg01vliTJAmwIszU6mHiyBOoW9P0rAugl5/hULQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-primitive": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.6.tgz", - "integrity": "sha512-wetd0QI77DbvrPpTAvH1SqOxsYF2wZe5TNxqwOd5Ty4XDpV3dpV0s8K/1MGMJBeY5o7lg8ub5VIt1Ub+yVen6g==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.3.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slot": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.0.tgz", - "integrity": "sha512-MojKku4U/miO8Av4Dkb+ctMAQx7JmY96LmtDQlAarCRtd7rN52QCSzBF+XAvr5S6coSVj9HEPBgHAHKEJVk/WA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.3.tgz", - "integrity": "sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.3", - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.3.tgz", - "integrity": "sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.2.tgz", - "integrity": "sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", - "integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz", - "integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz", - "integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz", - "integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz", - "integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz", - "integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz", - "integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz", - "integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz", - "integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz", - "integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz", - "integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz", - "integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz", - "integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "1.10.0", - "@emnapi/runtime": "1.10.0", - "@napi-rs/wasm-runtime": "^1.1.4" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz", - "integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz", - "integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tailwindcss/node": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.1.tgz", - "integrity": "sha512-6NDaqRoAMSXD1mr/RXu0HBvNE9a2n5tHPsxu9XHLws8o4Twes5rBM2205SUUiJ9goAtadrN6xTGX0UDEwp/N4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.5", - "enhanced-resolve": "5.21.6", - "jiti": "^2.7.0", - "lightningcss": "1.32.0", - "magic-string": "^0.30.21", - "source-map-js": "^1.2.1", - "tailwindcss": "4.3.1" - } - }, - "node_modules/@tailwindcss/oxide": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.1.tgz", - "integrity": "sha512-yVPyo8RNkabVr3O2EhHEE0Rewu7YKzc1DhIqfL46LKveFrmu9XbDazNOJY7/GRuvw1h6u3utWnR29H/p5JPlgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 20" - }, - "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.3.1", - "@tailwindcss/oxide-darwin-arm64": "4.3.1", - "@tailwindcss/oxide-darwin-x64": "4.3.1", - "@tailwindcss/oxide-freebsd-x64": "4.3.1", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.1", - "@tailwindcss/oxide-linux-arm64-gnu": "4.3.1", - "@tailwindcss/oxide-linux-arm64-musl": "4.3.1", - "@tailwindcss/oxide-linux-x64-gnu": "4.3.1", - "@tailwindcss/oxide-linux-x64-musl": "4.3.1", - "@tailwindcss/oxide-wasm32-wasi": "4.3.1", - "@tailwindcss/oxide-win32-arm64-msvc": "4.3.1", - "@tailwindcss/oxide-win32-x64-msvc": "4.3.1" - } - }, - "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.1.tgz", - "integrity": "sha512-SVlyf61g374l5cHyg8x9kf5xmLcOaxvOTsbsqDnSsDJaKOEFZ7GCvi84VAVGpxojYOs1+3K6M0UjXfqPU8vmOQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.1.tgz", - "integrity": "sha512-hVnWLwv+e/l7c4WKyVtHVrIPvYdqWHjRB3MDIqARynzFtnQg85kmQEFCbV9Ja0VVx4xXTIiDWY60Y7iz/iNoDA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.1.tgz", - "integrity": "sha512-Cf7abu0WVgbhU7ANgPUnSAvm7nCvMweusHb8FnaHlLfv/Caq4GYaEZg7ZImzzmjx4lIAfuS8q+eLIS7A7IzxIg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.1.tgz", - "integrity": "sha512-ZZqzX2Y+GXtXXfqSfpJhDm60OoZfvLHLCgm+J7NVqgHHJjG/m9ugZI77RwTsVd4fnBJuCFP6Ae6kTJb71UdS8g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.1.tgz", - "integrity": "sha512-/Ah/xik0LaMYfv9DZ0S/t4pBlBNYOcqtRwusjgovHkvT8ixueWCLyJjsaF5kQIckjb4IT8Q6K6p/iPmZMixYgg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.1.tgz", - "integrity": "sha512-gqdFoVJlw444GvpnheZLHmvTzSxI/cOUUh2KSNejQjTcYkW062SVD+En0rUgD+QV91bz1XGIGtt1HJd48xUGbQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.1.tgz", - "integrity": "sha512-Bwv9KwOvE0VKa86xPFif9b9c3Y1NxOV1P0gLti/IYaWEsQYZXDlxfGEtA8mdDZ7SG3wyNXAWYT5SIn3giL57oA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.1.tgz", - "integrity": "sha512-Ymi8O8T15HYQdOUWUtTI6ldN0neHP85FC+Qz32xTcZ7iJXtem/x8ITev0o1e9e5rkqj4lONZfTRLvkmin1+tKg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.1.tgz", - "integrity": "sha512-M+P/91qJ6uILLw4k2G93GMDRAXj61SMvFQYt39AqvUqYgExXpLL5aepfns7sj4HiAQeolirQF9E0lzRvdf4zPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.1.tgz", - "integrity": "sha512-zsM8uOeqvVGHsAXsJxsT28ttosFahLJKCLOTUBqRAtKnVgGSRitds9T432QiT8b77Yga7JIBkulIRRlJPtYhRA==", - "bundleDependencies": [ - "@napi-rs/wasm-runtime", - "@emnapi/core", - "@emnapi/runtime", - "@tybys/wasm-util", - "@emnapi/wasi-threads", - "tslib" - ], - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.10.0", - "@emnapi/runtime": "^1.10.0", - "@emnapi/wasi-threads": "^1.2.1", - "@napi-rs/wasm-runtime": "^1.1.4", - "@tybys/wasm-util": "^0.10.2", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.1.tgz", - "integrity": "sha512-aiNvSq9BsVk8V513lDKlrCFAgf8qBMPZTpgEhInL+NwQqs97mYmupVMrPrgBBSL8Pv/0zXu9MrMF9rMun1ZeNg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.1.tgz", - "integrity": "sha512-xDEyu1rg290472FEGaKHnzyDyh5QH+AlWvsU5hMoMtPpzmKlRI0jaYKCgSHDYtaQWZOYbMaduSyCwFwY4n1HmA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/vite": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.1.tgz", - "integrity": "sha512-hItDHuIIlEV61R+faXu66s1K36aTurO/Qw0e45Vskz57gXl9pWOT6eg3zmcEui6CZXddbN7zd41bwmvag4JGwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tailwindcss/node": "4.3.1", - "@tailwindcss/oxide": "4.3.1", - "tailwindcss": "4.3.1" - }, - "peerDependencies": { - "vite": "^5.2.0 || ^6 || ^7 || ^8" - } - }, - "node_modules/@tanstack/history": { - "version": "1.162.0", - "resolved": "https://registry.npmjs.org/@tanstack/history/-/history-1.162.0.tgz", - "integrity": "sha512-79pf/RkhteYZTRgcR4F9kbk84P2N8rugQJswxfIqovlbRiT3yI7eBE+5QorIrZaOKktsgzRlXh1l/du/xpl4iA==", - "license": "MIT", - "engines": { - "node": ">=20.19" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/react-router": { - "version": "1.170.16", - "resolved": "https://registry.npmjs.org/@tanstack/react-router/-/react-router-1.170.16.tgz", - "integrity": "sha512-w6eq1IJklujs1tESazaK/FxH0+H2l8vm/QPuu1cD3oRW/ubgKneQpd7b64ti/8gUyEimzimJQZDmJr6YHfP5+g==", - "license": "MIT", - "dependencies": { - "@tanstack/history": "1.162.0", - "@tanstack/react-store": "^0.9.3", - "@tanstack/router-core": "1.171.13", - "isbot": "^5.1.22" - }, - "engines": { - "node": ">=20.19" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": ">=18.0.0 || >=19.0.0", - "react-dom": ">=18.0.0 || >=19.0.0" - } - }, - "node_modules/@tanstack/react-router-devtools": { - "version": "1.167.0", - "resolved": "https://registry.npmjs.org/@tanstack/react-router-devtools/-/react-router-devtools-1.167.0.tgz", - "integrity": "sha512-nGw095EG7IHx0h5NtlEmzf6vcCTaFNPWdTSuDKazajhN0ct/v/TkekJ9J6KYUCeV1a8/2ZmToc58M+0rrOyn7w==", - "license": "MIT", - "dependencies": { - "@tanstack/router-devtools-core": "1.168.0" - }, - "engines": { - "node": ">=20.19" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "@tanstack/react-router": "^1.170.0", - "@tanstack/router-core": "^1.170.0", - "react": ">=18.0.0 || >=19.0.0", - "react-dom": ">=18.0.0 || >=19.0.0" - }, - "peerDependenciesMeta": { - "@tanstack/router-core": { - "optional": true - } - } - }, - "node_modules/@tanstack/react-store": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.9.3.tgz", - "integrity": "sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg==", - "license": "MIT", - "dependencies": { - "@tanstack/store": "0.9.3", - "use-sync-external-store": "^1.6.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/@tanstack/router-core": { - "version": "1.171.13", - "resolved": "https://registry.npmjs.org/@tanstack/router-core/-/router-core-1.171.13.tgz", - "integrity": "sha512-+NOwEj1kO/6IGmpHRIZHasYxYWpyBQGNIZAST9aNrk9Q3YlU9SgqVnl1pbLa9qAKfeNdXQIRve0RQb/0kyDeDA==", - "license": "MIT", - "dependencies": { - "@tanstack/history": "1.162.0", - "cookie-es": "^3.0.0", - "seroval": "^1.5.4", - "seroval-plugins": "^1.5.4" - }, - "engines": { - "node": ">=20.19" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/router-devtools-core": { - "version": "1.168.0", - "resolved": "https://registry.npmjs.org/@tanstack/router-devtools-core/-/router-devtools-core-1.168.0.tgz", - "integrity": "sha512-wQoQhlBK7nlZgqzaqdYXKWNTpdHdsaREdaPhFZVH0/Ador+F+eM3/NF2i3f2LPeS0GgKraZUQXe1Q/1+KHyEYg==", - "license": "MIT", - "dependencies": { - "clsx": "^2.1.1", - "goober": "^2.1.16" - }, - "engines": { - "node": ">=20.19" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "@tanstack/router-core": "^1.170.0", - "csstype": "^3.0.10" - }, - "peerDependenciesMeta": { - "csstype": { - "optional": true - } - } - }, - "node_modules/@tanstack/router-generator": { - "version": "1.167.17", - "resolved": "https://registry.npmjs.org/@tanstack/router-generator/-/router-generator-1.167.17.tgz", - "integrity": "sha512-xtB9tB2Ws0tWR6Pi7nc3Qk9IYgoh1mQCKWjHqIl9tf6BNUpKoqniJoPAQ4+LGrK8FeZYU0o0p/qlZEyj9FAulA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.5", - "@tanstack/router-core": "1.171.13", - "@tanstack/router-utils": "1.162.2", - "@tanstack/virtual-file-routes": "1.162.0", - "jiti": "^2.7.0", - "magic-string": "^0.30.21", - "prettier": "^3.5.0", - "zod": "^4.4.3" - }, - "engines": { - "node": ">=20.19" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/router-plugin": { - "version": "1.168.18", - "resolved": "https://registry.npmjs.org/@tanstack/router-plugin/-/router-plugin-1.168.18.tgz", - "integrity": "sha512-MofS28/axfnfnhOD2RSgJEaU882aX5RsAzhGz5Vc4XhAmvCjy919u9JrNs4QsTWFbTD1P7IJ8WFlFVsrg0pStg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.5", - "@tanstack/router-core": "1.171.13", - "@tanstack/router-generator": "1.167.17", - "@tanstack/router-utils": "1.162.2", - "chokidar": "^5.0.0", - "unplugin": "^3.0.0", - "zod": "^4.4.3" - }, - "engines": { - "node": ">=20.19" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "@rsbuild/core": ">=1.0.2 || ^2.0.0", - "@tanstack/react-router": "^1.170.15", - "vite": ">=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0", - "vite-plugin-solid": "^2.11.10 || ^3.0.0-0", - "webpack": ">=5.92.0" - }, - "peerDependenciesMeta": { - "@rsbuild/core": { - "optional": true - }, - "@tanstack/react-router": { - "optional": true - }, - "vite": { - "optional": true - }, - "vite-plugin-solid": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/@tanstack/router-utils": { - "version": "1.162.2", - "resolved": "https://registry.npmjs.org/@tanstack/router-utils/-/router-utils-1.162.2.tgz", - "integrity": "sha512-hTWqJtqIFFdvuCl8WXNyrodp2L9zo2G37xKRrcVmVRWpAB2h+U1LuRAfS4tsFTiWOIoE/B+WDVFB8JpoEdw6jQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/generator": "^7.28.5", - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", - "ansis": "^4.1.0", - "babel-dead-code-elimination": "^1.0.12", - "diff": "^8.0.2", - "pathe": "^2.0.3", - "tinyglobby": "^0.2.15" - }, - "engines": { - "node": ">=20.19" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/store": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@tanstack/store/-/store-0.9.3.tgz", - "integrity": "sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/virtual-file-routes": { - "version": "1.162.0", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-file-routes/-/virtual-file-routes-1.162.0.tgz", - "integrity": "sha512-uhOeFyxLcU41HzvrxsGpiWdcMbScY1EDgbZ5K7DVRMYInbLYWAC0EA/kx9wXAoSM8q82bUG2hRl8+EAjE6XAbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.19" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", - "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/node": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.0.0.tgz", - "integrity": "sha512-vf2YFi1iY9lHGwNJMs01biZFbKJkrZR1T6/MlzjhJLPdntOHLhTrDSnSVcdtvjihi4VQNlrFRIxLsDBlQpAipA==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~8.3.0" - } - }, - "node_modules/@types/react": { - "version": "19.2.17", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", - "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", - "devOptional": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.2.tgz", - "integrity": "sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rolldown/pluginutils": "^1.0.0" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", - "babel-plugin-react-compiler": "^1.0.0", - "vite": "^8.0.0" - }, - "peerDependenciesMeta": { - "@rolldown/plugin-babel": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true - } - } - }, - "node_modules/ansis": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.3.1.tgz", - "integrity": "sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - } - }, - "node_modules/babel-dead-code-elimination": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/babel-dead-code-elimination/-/babel-dead-code-elimination-1.0.12.tgz", - "integrity": "sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" - } - }, - "node_modules/baseline-browser-mapping": { - "version": "2.10.38", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.38.tgz", - "integrity": "sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/browserslist": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", - "update-browserslist-db": "^1.2.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001799", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", - "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/class-variance-authority": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", - "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", - "license": "Apache-2.0", - "dependencies": { - "clsx": "^2.1.1" - }, - "funding": { - "url": "https://polar.sh/cva" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "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-es": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-3.1.1.tgz", - "integrity": "sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==", - "license": "MIT" - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", - "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.376", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.376.tgz", - "integrity": "sha512-cUVA7/RvbFTEuw/i3obUwDTRIXojaxkResf+ibByPFxjc6XK3VNtcQXV0NSbAlJ0FMjcJGgftVVB4Qo184EXvA==", - "dev": true, - "license": "ISC" - }, - "node_modules/enhanced-resolve": { - "version": "5.21.6", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.6.tgz", - "integrity": "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.3.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/goober": { - "version": "2.1.19", - "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.19.tgz", - "integrity": "sha512-U7veizMqxyKlM58+Z5j2ngJBH/r9siDmxpvNxSw0PylF6WQvrASJEZrxh1hidRBJc2jqoBVSyOban5u8m+6Rxg==", - "license": "MIT", - "peerDependencies": { - "csstype": "^3.0.10" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/isbot": { - "version": "5.1.43", - "resolved": "https://registry.npmjs.org/isbot/-/isbot-5.1.43.tgz", - "integrity": "sha512-drJhFmibra4LO6Wd7D3Oi6UICRK9244vSZkmxzhlZP0TTdwCA2ueK4PEkUkzPYeuqug9+cqqdWPgihjk5+83Cg==", - "license": "Unlicense", - "engines": { - "node": ">=18" - } - }, - "node_modules/jiti": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", - "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/lightningcss": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.32.0", - "lightningcss-darwin-arm64": "1.32.0", - "lightningcss-darwin-x64": "1.32.0", - "lightningcss-freebsd-x64": "1.32.0", - "lightningcss-linux-arm-gnueabihf": "1.32.0", - "lightningcss-linux-arm64-gnu": "1.32.0", - "lightningcss-linux-arm64-musl": "1.32.0", - "lightningcss-linux-x64-gnu": "1.32.0", - "lightningcss-linux-x64-musl": "1.32.0", - "lightningcss-win32-arm64-msvc": "1.32.0", - "lightningcss-win32-x64-msvc": "1.32.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lucide-react": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.21.0.tgz", - "integrity": "sha512-reEZMXq8Qdd5jg5XYkQ5TR1fB/GiQ7ih4vcrthYDtgjSDwh0i6/YLiGjsWsIwgN49gpAnd4J2elSNzncMEEUUQ==", - "license": "ISC", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.14", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.14.tgz", - "integrity": "sha512-U9kYi5bpVMEI31yC8iw4bJJp0avcHXA0W8/wNfLfnvJYzihQo2ZRPYPvpAAd570HAcCBjCTN7vnr+v4StKl1IQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/node-releases": { - "version": "2.0.48", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.48.tgz", - "integrity": "sha512-1uz8041X6LoI6ZSdZacM9lVY28vuzDlSKitnpbSNK0RfKoIJkX29NBPVEFXhnuSuEOA9Ww0xnPJ+ILWbGAv8DA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.12", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prettier": { - "version": "3.8.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.4.tgz", - "integrity": "sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/react": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", - "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", - "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.7" - } - }, - "node_modules/readdirp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", - "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/rolldown": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz", - "integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "=0.133.0", - "@rolldown/pluginutils": "^1.0.0" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.0.3", - "@rolldown/binding-darwin-arm64": "1.0.3", - "@rolldown/binding-darwin-x64": "1.0.3", - "@rolldown/binding-freebsd-x64": "1.0.3", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.3", - "@rolldown/binding-linux-arm64-gnu": "1.0.3", - "@rolldown/binding-linux-arm64-musl": "1.0.3", - "@rolldown/binding-linux-ppc64-gnu": "1.0.3", - "@rolldown/binding-linux-s390x-gnu": "1.0.3", - "@rolldown/binding-linux-x64-gnu": "1.0.3", - "@rolldown/binding-linux-x64-musl": "1.0.3", - "@rolldown/binding-openharmony-arm64": "1.0.3", - "@rolldown/binding-wasm32-wasi": "1.0.3", - "@rolldown/binding-win32-arm64-msvc": "1.0.3", - "@rolldown/binding-win32-x64-msvc": "1.0.3" - } - }, - "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/seroval": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.5.4.tgz", - "integrity": "sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/seroval-plugins": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.5.4.tgz", - "integrity": "sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "seroval": "^1.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tailwind-merge": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz", - "integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" - } - }, - "node_modules/tailwindcss": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.1.tgz", - "integrity": "sha512-hk+TB1m+K8CYNrP6rjQaq/Y+4Zylwpa87mLYBKCunwnnQ9p+fHb7kmSfGqyEJoxF/O6CDyABWVFEafNSYKll+Q==", - "license": "MIT" - }, - "node_modules/tailwindcss-animate": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", - "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", - "license": "MIT", - "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders" - } - }, - "node_modules/tapable": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", - "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD", - "optional": true - }, - "node_modules/typescript": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", - "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", - "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/unplugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-3.0.0.tgz", - "integrity": "sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.5", - "picomatch": "^4.0.3", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "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": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/use-sync-external-store": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", - "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/vite": { - "version": "8.0.16", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz", - "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "lightningcss": "^1.32.0", - "picomatch": "^4.0.4", - "postcss": "^8.5.15", - "rolldown": "1.0.3", - "tinyglobby": "^0.2.17" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.1.18", - "esbuild": "^0.27.0 || ^0.28.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/webpack-virtual-modules": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", - "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/zod": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", - "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - } - } -} diff --git a/package.json b/package.json index dd46858..864beb2 100644 --- a/package.json +++ b/package.json @@ -1,38 +1,38 @@ { - "name": "mobench-org", + "name": "mobench-site", "private": true, - "version": "0.3.0", - "type": "module", + "version": "1.0.0", + "packageManager": "bun@1.3.13", + "workspaces": [ + "apps/*", + "packages/*" + ], "scripts": { - "dev": "vite --port 3000", - "build": "vite build && node scripts/generate-route-html.mjs", - "og:generate": "python3 scripts/generate-og-images.py", - "serve": "vite preview", - "start": "vite" - }, - "dependencies": { - "@radix-ui/react-accordion": "^1.2.14", - "@radix-ui/react-slot": "^1.3.0", - "@tanstack/react-router": "^1.170.16", - "@tanstack/react-router-devtools": "^1.167.0", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "lucide-react": "^1.21.0", - "mermaid": "11.15.0", - "react": "^19.2.7", - "react-dom": "^19.2.7", - "tailwind-merge": "^3.6.0", - "tailwindcss-animate": "^1.0.7" + "dev": "bun run dev:marketing", + "dev:marketing": "bun run --cwd apps/marketing dev", + "dev:docs": "bun run --cwd apps/docs dev", + "build": "bun run build:marketing && bun run build:docs", + "build:marketing": "bun run --cwd apps/marketing build", + "build:docs": "bun run --cwd apps/docs build", + "generate": "bun scripts/generate-content.ts && bun scripts/generate-og.ts", + "generate:check": "bun scripts/generate-content.ts --check && bun scripts/generate-og.ts --check", + "sync:release": "bun scripts/sync-release.ts", + "check:sync": "bun scripts/sync-release.ts --help", + "validate:content": "bun scripts/validate-content.ts", + "check": "bun run check:sync && bun run validate:content && bun run generate:check && bun run check:marketing && bun run check:docs", + "check:marketing": "bun run --cwd apps/marketing check", + "check:docs": "bun run --cwd apps/docs check", + "test": "bun run build && bun test tests/build-contracts.test.ts --timeout 30000", + "test:e2e": "playwright test", + "test:lighthouse": "lhci autorun --config=lighthouserc.marketing.cjs && lhci autorun --config=lighthouserc.docs.cjs", + "preview:marketing": "bun run --cwd apps/marketing preview", + "preview:docs": "bun run --cwd apps/docs preview" }, "devDependencies": { - "@tailwindcss/vite": "^4.3.1", - "@tanstack/router-plugin": "^1.168.18", - "@types/node": "^26.0.0", - "@types/react": "^19.2.17", - "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "^6.0.2", - "tailwindcss": "^4.3.1", - "typescript": "^6.0.3", - "vite": "^8.0.16" + "@axe-core/playwright": "4.12.1", + "@lhci/cli": "0.15.1", + "@playwright/test": "1.61.1", + "ajv": "8.20.0", + "yaml": "2.9.0" } } diff --git a/packages/site-config/package.json b/packages/site-config/package.json new file mode 100644 index 0000000..478f41a --- /dev/null +++ b/packages/site-config/package.json @@ -0,0 +1,10 @@ +{ + "name": "@mobench/site-config", + "version": "1.0.0", + "private": true, + "type": "module", + "exports": "./src/index.ts", + "dependencies": { + "@mobench/truth": "workspace:*" + } +} diff --git a/packages/site-config/src/index.ts b/packages/site-config/src/index.ts new file mode 100644 index 0000000..e4b4afe --- /dev/null +++ b/packages/site-config/src/index.ts @@ -0,0 +1,22 @@ +import pin from '@mobench/truth/pin' + +export const site = { + marketingUrl: 'https://mobench.org', + docsUrl: 'https://docs.mobench.org', + repositoryUrl: 'https://github.com/worldcoin/mobile-bench-rs', + websiteRepositoryUrl: 'https://github.com/worldfnd/mobench.org', + release: pin.release, + crateVersion: pin.version, +} as const + +export const supportedPlatforms = ['android', 'ios'] as const + +export const analyticsEvents = [ + 'quickstart_opened', + 'install_copied', + 'github_opened', + 'search_result_opened', + 'search_zero_results', +] as const + +export type AnalyticsEvent = (typeof analyticsEvents)[number] diff --git a/packages/site-config/tsconfig.json b/packages/site-config/tsconfig.json new file mode 100644 index 0000000..2d384be --- /dev/null +++ b/packages/site-config/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "composite": true, + "declaration": true, + "emitDeclarationOnly": true, + "module": "ESNext", + "moduleResolution": "Bundler", + "strict": true, + "target": "ES2022" + }, + "include": ["src/**/*.ts"] +} diff --git a/packages/truth/README.md b/packages/truth/README.md new file mode 100644 index 0000000..c5ed32d --- /dev/null +++ b/packages/truth/README.md @@ -0,0 +1,7 @@ +# Pinned mobench truth + +This package is the offline input for both website builds. It pins upstream release `v0.1.43` at commit `d1a3176f9144f35e777e83fd07045116144da257` and the exact SHA-256 checksum of `mobench-site-manifest-v1.json`. + +Do not edit the manifest, schemas, or fixtures by hand. Regenerate them from a tagged `mobile-bench-rs` release, verify their checksums, and update them through the release-sync workflow documented in `docs/RELEASE_SYNC.md`. + +The canonical executable and Cargo-wrapper status come from the pinned manifest. Generated website commands must keep using the canonical supported binary until a later release changes that contract and the invocation smokes pass. diff --git a/packages/truth/fixtures/summary-basic.json b/packages/truth/fixtures/summary-basic.json new file mode 100644 index 0000000..ff47d09 --- /dev/null +++ b/packages/truth/fixtures/summary-basic.json @@ -0,0 +1,84 @@ +{ + "summary": { + "generated_at": "2026-03-26T00:00:00Z", + "generated_at_unix": 1774483200, + "target": "android", + "function": "multiple", + "iterations": 5, + "warmup": 1, + "devices": [ + "Google Pixel 8-14.0", + "Samsung Galaxy S23-14.0" + ], + "device_summaries": [ + { + "device": "Google Pixel 8-14.0", + "benchmarks": [ + { + "function": "basic_benchmark::bench_fibonacci", + "samples": 5, + "mean_ns": 100000000, + "median_ns": 100000000, + "p95_ns": 105000000, + "min_ns": 95000000, + "max_ns": 105000000 + }, + { + "function": "basic_benchmark::bench_checksum", + "samples": 5, + "mean_ns": 145000000, + "median_ns": 145000000, + "p95_ns": 151000000, + "min_ns": 140000000, + "max_ns": 151000000 + } + ] + }, + { + "device": "Samsung Galaxy S23-14.0", + "benchmarks": [ + { + "function": "basic_benchmark::bench_fibonacci", + "samples": 5, + "mean_ns": 94000000, + "median_ns": 94000000, + "p95_ns": 98000000, + "min_ns": 90000000, + "max_ns": 98000000 + }, + { + "function": "basic_benchmark::bench_checksum", + "samples": 5, + "mean_ns": 136000000, + "median_ns": 136000000, + "p95_ns": 140000000, + "min_ns": 132000000, + "max_ns": 140000000 + } + ] + } + ] + }, + "benchmark_results": { + "Google Pixel 8-14.0": [ + { + "function": "basic_benchmark::bench_fibonacci", + "samples": [95000000, 98000000, 100000000, 102000000, 105000000] + }, + { + "function": "basic_benchmark::bench_checksum", + "samples": [140000000, 142000000, 145000000, 147000000, 151000000] + } + ], + "Samsung Galaxy S23-14.0": [ + { + "function": "basic_benchmark::bench_fibonacci", + "samples": [90000000, 92000000, 94000000, 96000000, 98000000] + }, + { + "function": "basic_benchmark::bench_checksum", + "samples": [132000000, 134000000, 136000000, 138000000, 140000000] + } + ] + } +} diff --git a/packages/truth/fixtures/summary-ffi.json b/packages/truth/fixtures/summary-ffi.json new file mode 100644 index 0000000..be49897 --- /dev/null +++ b/packages/truth/fixtures/summary-ffi.json @@ -0,0 +1,84 @@ +{ + "summary": { + "generated_at": "2026-03-26T00:00:00Z", + "generated_at_unix": 1774483200, + "target": "android", + "function": "multiple", + "iterations": 5, + "warmup": 1, + "devices": [ + "Google Pixel 8 Pro-14.0", + "OnePlus 12-14.0" + ], + "device_summaries": [ + { + "device": "Google Pixel 8 Pro-14.0", + "benchmarks": [ + { + "function": "ffi_benchmark::bench_fibonacci", + "samples": 5, + "mean_ns": 112000000, + "median_ns": 112000000, + "p95_ns": 118000000, + "min_ns": 108000000, + "max_ns": 118000000 + }, + { + "function": "ffi_benchmark::bench_checksum", + "samples": 5, + "mean_ns": 159000000, + "median_ns": 159000000, + "p95_ns": 165000000, + "min_ns": 154000000, + "max_ns": 165000000 + } + ] + }, + { + "device": "OnePlus 12-14.0", + "benchmarks": [ + { + "function": "ffi_benchmark::bench_fibonacci", + "samples": 5, + "mean_ns": 103000000, + "median_ns": 103000000, + "p95_ns": 107000000, + "min_ns": 99000000, + "max_ns": 107000000 + }, + { + "function": "ffi_benchmark::bench_checksum", + "samples": 5, + "mean_ns": 149000000, + "median_ns": 149000000, + "p95_ns": 153000000, + "min_ns": 145000000, + "max_ns": 153000000 + } + ] + } + ] + }, + "benchmark_results": { + "Google Pixel 8 Pro-14.0": [ + { + "function": "ffi_benchmark::bench_fibonacci", + "samples": [108000000, 110000000, 112000000, 114000000, 118000000] + }, + { + "function": "ffi_benchmark::bench_checksum", + "samples": [154000000, 156000000, 159000000, 161000000, 165000000] + } + ], + "OnePlus 12-14.0": [ + { + "function": "ffi_benchmark::bench_fibonacci", + "samples": [99000000, 101000000, 103000000, 105000000, 107000000] + }, + { + "function": "ffi_benchmark::bench_checksum", + "samples": [145000000, 147000000, 149000000, 151000000, 153000000] + } + ] + } +} diff --git a/packages/truth/mobench-site-manifest-v1.json b/packages/truth/mobench-site-manifest-v1.json new file mode 100644 index 0000000..9333624 --- /dev/null +++ b/packages/truth/mobench-site-manifest-v1.json @@ -0,0 +1,9063 @@ +{ + "schema_version": 1, + "release": { + "version": "0.1.43", + "tag": "v0.1.43", + "sha": "d1a3176f9144f35e777e83fd07045116144da257", + "repository": "https://github.com/worldcoin/mobile-bench-rs" + }, + "msrv": "1.85", + "binaries": [ + { + "name": "mobench", + "invocation": "mobench ", + "canonical_for_release": true, + "status": "supported", + "note": "Canonical executable for the pinned v0.1.43 release." + }, + { + "name": "cargo-mobench", + "invocation": "cargo mobench ", + "canonical_for_release": false, + "status": "unsupported", + "note": "The published v0.1.43 wrapper forwards Cargo's injected `mobench` token. A source fix is integration-tested but requires a later release." + } + ], + "command_tree": { + "name": "mobench", + "path": "mobench", + "about": "Mobile Rust benchmarking orchestrator", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "version", + "long": "version", + "short": "V", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Version", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print version" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [ + { + "name": "build", + "path": "mobench build", + "about": "Build mobile artifacts from the resolved benchmark crate", + "options": [ + { + "id": "crate_path", + "long": "crate-path", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CRATE_PATH" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to the benchmark crate (default: auto-detect bench-mobile/ or crates/{crate})" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "ios_completion_timeout_secs", + "long": "ios-completion-timeout-secs", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": true, + "action": "Set", + "value_names": [ + "IOS_COMPLETION_TIMEOUT_SECS" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Deprecated compatibility flag for generated XCUITest harness timeout" + }, + { + "id": "ios_deployment_target", + "long": "ios-deployment-target", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "IOS_DEPLOYMENT_TARGET" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "iOS deployment target for generated app and XCUITest targets" + }, + { + "id": "ios_runner", + "long": "ios-runner", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "IOS_RUNNER" + ], + "possible_values": [ + "swiftui", + "uikit-legacy" + ], + "defaults": [], + "environment": null, + "help": "iOS runner template (swiftui or uikit-legacy)" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output_dir", + "long": "output-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT_DIR" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Output directory for mobile artifacts (default: target/mobench)" + }, + { + "id": "progress", + "long": "progress", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "PROGRESS" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Show simplified step-by-step progress output" + }, + { + "id": "project_root", + "long": "project-root", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PROJECT_ROOT" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Project root containing mobench.toml or the Cargo workspace" + }, + { + "id": "release", + "long": "release", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "RELEASE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Build in release mode" + }, + { + "id": "target", + "long": "target", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "TARGET" + ], + "possible_values": [ + "android", + "both", + "ios" + ], + "defaults": [], + "environment": null, + "help": null + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "check", + "path": "mobench check", + "about": "Check prerequisites for building mobile artifacts", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "format", + "long": "format", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FORMAT" + ], + "possible_values": [ + "json", + "text" + ], + "defaults": [ + "text" + ], + "environment": null, + "help": "Output format (text or json)" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help (see more with '--help')" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "target", + "long": "target", + "short": "t", + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "TARGET" + ], + "possible_values": [ + "android", + "both", + "ios" + ], + "defaults": [], + "environment": null, + "help": "Target platform (android or ios)" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "ci", + "path": "mobench ci", + "about": "CI helpers (workflow and action scaffolding)", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [ + { + "name": "check-run", + "path": "mobench ci check-run", + "about": "Create a GitHub Check Run with benchmark results", + "options": [ + { + "id": "annotation_path", + "long": "annotation-path", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "ANNOTATION_PATH" + ], + "possible_values": [], + "defaults": [ + "src/lib.rs" + ], + "environment": null, + "help": "File path used in Check Run annotations (relative to repo root)" + }, + { + "id": "baseline", + "long": "baseline", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "BASELINE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Optional baseline JSON for regression detection" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "name", + "long": "name", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "NAME" + ], + "possible_values": [], + "defaults": [ + "Mobench" + ], + "environment": null, + "help": "Check Run name displayed in the PR" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "regression_threshold_pct", + "long": "regression-threshold-pct", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "REGRESSION_THRESHOLD_PCT" + ], + "possible_values": [], + "defaults": [ + "5" + ], + "environment": null, + "help": "Regression threshold percentage" + }, + { + "id": "repo", + "long": "repo", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "REPO" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "GitHub repository (owner/repo format)" + }, + { + "id": "results", + "long": "results", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "RESULTS" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to summary JSON with benchmark results" + }, + { + "id": "results_dir", + "long": "results-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "RESULTS_DIR" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Directory containing summary JSON files (processes all)" + }, + { + "id": "sha", + "long": "sha", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "SHA" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Git commit SHA to annotate" + }, + { + "id": "token", + "long": "token", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": true, + "action": "Set", + "value_names": [ + "TOKEN" + ], + "possible_values": [], + "defaults": [], + "environment": "GITHUB_TOKEN", + "help": "GitHub App token (from GITHUB_TOKEN env var or actions/create-github-app-token)" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "help", + "path": "mobench ci help", + "about": "Print this message or the help of the given subcommand(s)", + "options": [], + "subcommands": [ + { + "name": "check-run", + "path": "mobench ci help check-run", + "about": "Create a GitHub Check Run with benchmark results", + "options": [], + "subcommands": [] + }, + { + "name": "help", + "path": "mobench ci help help", + "about": "Print this message or the help of the given subcommand(s)", + "options": [], + "subcommands": [] + }, + { + "name": "init", + "path": "mobench ci help init", + "about": "Generate GitHub Actions workflow + local action wrapper", + "options": [], + "subcommands": [] + }, + { + "name": "merge-split-runs", + "path": "mobench ci help merge-split-runs", + "about": "Merge one-sample CI summaries into a normal CI output set", + "options": [], + "subcommands": [] + }, + { + "name": "run", + "path": "mobench ci help run", + "about": "Run a full CI benchmark flow with stable output contract", + "options": [], + "subcommands": [] + }, + { + "name": "summarize", + "path": "mobench ci help summarize", + "about": "Summarize benchmark results with device metrics", + "options": [], + "subcommands": [] + } + ] + }, + { + "name": "init", + "path": "mobench ci init", + "about": "Generate GitHub Actions workflow + local action wrapper", + "options": [ + { + "id": "action_dir", + "long": "action-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "ACTION_DIR" + ], + "possible_values": [], + "defaults": [ + ".github/actions/mobench" + ], + "environment": null, + "help": "Directory to write the local GitHub Action" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "workflow", + "long": "workflow", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "WORKFLOW" + ], + "possible_values": [], + "defaults": [ + ".github/workflows/mobile-bench.yml" + ], + "environment": null, + "help": "Path to write the workflow file" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "merge-split-runs", + "path": "mobench ci merge-split-runs", + "about": "Merge one-sample CI summaries into a normal CI output set", + "options": [ + { + "id": "device", + "long": "device", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "DEVICE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Device label all samples must match" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "function", + "long": "function", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FUNCTION" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Fully-qualified benchmark function all samples must contain" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "iterations", + "long": "iterations", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "ITERATIONS" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Expected measured sample count" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output_dir", + "long": "output-dir", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT_DIR" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Directory to write merged summary.json, summary.md, and results.csv" + }, + { + "id": "samples_dir", + "long": "samples-dir", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "SAMPLES_DIR" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Directory containing sample-*/summary.json one-sample CI outputs" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "warmup", + "long": "warmup", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "WARMUP" + ], + "possible_values": [], + "defaults": [ + "0" + ], + "environment": null, + "help": "Warmup count reported in merged CI summaries" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "run", + "path": "mobench ci run", + "about": "Run a full CI benchmark flow with stable output contract", + "options": [ + { + "id": "android_benchmark_timeout_secs", + "long": "android-benchmark-timeout-secs", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "ANDROID_BENCHMARK_TIMEOUT_SECS" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Android benchmark watchdog timeout in seconds for the generated harness" + }, + { + "id": "android_heartbeat_interval_secs", + "long": "android-heartbeat-interval-secs", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "ANDROID_HEARTBEAT_INTERVAL_SECS" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Android benchmark heartbeat interval in seconds for the generated harness" + }, + { + "id": "baseline", + "long": "baseline", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "BASELINE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Baseline summary source (path|url|artifact:)" + }, + { + "id": "config", + "long": "config", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CONFIG" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Optional path to config file" + }, + { + "id": "crate_path", + "long": "crate-path", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CRATE_PATH" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to the benchmark crate directory containing Cargo.toml" + }, + { + "id": "device_matrix", + "long": "device-matrix", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "DEVICE_MATRIX" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Device matrix YAML file to load device names from" + }, + { + "id": "device_tags", + "long": "device-tags", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Append", + "value_names": [ + "DEVICE_TAGS" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Device tags to select from the device matrix (comma-separated or repeatable)" + }, + { + "id": "devices", + "long": "devices", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Append", + "value_names": [ + "DEVICES" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Device identifiers or labels (BrowserStack devices)" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "fetch", + "long": "fetch", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "FETCH" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Fetch BrowserStack artifacts after the run completes" + }, + { + "id": "fetch_output_dir", + "long": "fetch-output-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FETCH_OUTPUT_DIR" + ], + "possible_values": [], + "defaults": [ + "target/browserstack" + ], + "environment": null, + "help": null + }, + { + "id": "fetch_poll_interval_secs", + "long": "fetch-poll-interval-secs", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FETCH_POLL_INTERVAL_SECS" + ], + "possible_values": [], + "defaults": [ + "5" + ], + "environment": null, + "help": null + }, + { + "id": "fetch_timeout_secs", + "long": "fetch-timeout-secs", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FETCH_TIMEOUT_SECS" + ], + "possible_values": [], + "defaults": [ + "300" + ], + "environment": null, + "help": null + }, + { + "id": "function", + "long": "function", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FUNCTION" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Fully-qualified Rust function to benchmark (single function)" + }, + { + "id": "functions", + "long": "functions", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Append", + "value_names": [ + "FUNCTIONS" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Multiple benchmark functions (comma-separated or JSON array). Runs each in sequence." + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "ios_app", + "long": "ios-app", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "IOS_APP" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to iOS app bundle (.ipa or zipped .app) for BrowserStack XCUITest" + }, + { + "id": "ios_completion_timeout_secs", + "long": "ios-completion-timeout-secs", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": true, + "action": "Set", + "value_names": [ + "IOS_COMPLETION_TIMEOUT_SECS" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Deprecated compatibility flag for generated XCUITest harness timeout" + }, + { + "id": "ios_deployment_target", + "long": "ios-deployment-target", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "IOS_DEPLOYMENT_TARGET" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "iOS deployment target for generated app and XCUITest targets" + }, + { + "id": "ios_runner", + "long": "ios-runner", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "IOS_RUNNER" + ], + "possible_values": [ + "swiftui", + "uikit-legacy" + ], + "defaults": [], + "environment": null, + "help": "iOS runner template (swiftui or uikit-legacy)" + }, + { + "id": "ios_test_suite", + "long": "ios-test-suite", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "IOS_TEST_SUITE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to iOS XCUITest test suite package (.zip or .ipa)" + }, + { + "id": "iterations", + "long": "iterations", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "ITERATIONS" + ], + "possible_values": [], + "defaults": [ + "100" + ], + "environment": null, + "help": null + }, + { + "id": "junit", + "long": "junit", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "JUNIT" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Write JUnit XML report to the given path" + }, + { + "id": "local_only", + "long": "local-only", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "LOCAL_ONLY" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Skip mobile builds and write host-side preflight/spec output without mobile execution" + }, + { + "id": "mobench_ref", + "long": "mobench-ref", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "MOBENCH_REF" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Metadata: git ref/sha for this mobench invocation" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output_dir", + "long": "output-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT_DIR" + ], + "possible_values": [], + "defaults": [ + "target/mobench/ci" + ], + "environment": null, + "help": "Output directory for CI contract files" + }, + { + "id": "plots", + "long": "plots", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PLOTS" + ], + "possible_values": [ + "auto", + "off", + "require" + ], + "defaults": [ + "auto" + ], + "environment": null, + "help": null + }, + { + "id": "pr_number", + "long": "pr-number", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PR_NUMBER" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Metadata: pull request number" + }, + { + "id": "progress", + "long": "progress", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "PROGRESS" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Show simplified step-by-step progress output" + }, + { + "id": "regression_threshold_pct", + "long": "regression-threshold-pct", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "REGRESSION_THRESHOLD_PCT" + ], + "possible_values": [], + "defaults": [ + "5" + ], + "environment": null, + "help": "Regression threshold percentage when comparing to baseline" + }, + { + "id": "release", + "long": "release", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "RELEASE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Build in release mode (recommended for BrowserStack to reduce APK size and upload time)" + }, + { + "id": "request_command", + "long": "request-command", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "REQUEST_COMMAND" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Metadata: original command requested by the caller" + }, + { + "id": "requested_by", + "long": "requested-by", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "REQUESTED_BY" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Metadata: user or actor that requested the run" + }, + { + "id": "target", + "long": "target", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "TARGET" + ], + "possible_values": [ + "android", + "both", + "ios" + ], + "defaults": [], + "environment": null, + "help": null + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "warmup", + "long": "warmup", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "WARMUP" + ], + "possible_values": [], + "defaults": [ + "10" + ], + "environment": null, + "help": null + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "summarize", + "path": "mobench ci summarize", + "about": "Summarize benchmark results with device metrics", + "options": [ + { + "id": "build_id", + "long": "build-id", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "BUILD_ID" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "BrowserStack build ID to enrich results with device metrics (requires --results-dir)" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help (see more with '--help')" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output_file", + "long": "output-file", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT_FILE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Write output to file in addition to stdout" + }, + { + "id": "output_format", + "long": "output-format", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT_FORMAT" + ], + "possible_values": [ + "json", + "markdown", + "table" + ], + "defaults": [ + "table" + ], + "environment": null, + "help": "Output format: table (terminal), markdown, or json" + }, + { + "id": "platform", + "long": "platform", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PLATFORM" + ], + "possible_values": [ + "android", + "ios" + ], + "defaults": [], + "environment": null, + "help": "Platform filter (show only one platform)" + }, + { + "id": "results_dir", + "long": "results-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "RESULTS_DIR" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Directory containing summary.json/CSV results (offline mode)" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + } + ] + }, + { + "name": "compare", + "path": "mobench compare", + "about": "Compare two run summaries for regressions", + "options": [ + { + "id": "baseline", + "long": "baseline", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "BASELINE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Baseline JSON summary to compare against" + }, + { + "id": "candidate", + "long": "candidate", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CANDIDATE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Candidate JSON summary to compare" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output", + "long": "output", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Optional output path for markdown report" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "config", + "path": "mobench config", + "about": "Validate run configuration and associated files", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [ + { + "name": "help", + "path": "mobench config help", + "about": "Print this message or the help of the given subcommand(s)", + "options": [], + "subcommands": [ + { + "name": "help", + "path": "mobench config help help", + "about": "Print this message or the help of the given subcommand(s)", + "options": [], + "subcommands": [] + }, + { + "name": "validate", + "path": "mobench config help validate", + "about": "Validate bench-config.toml and referenced matrix/settings", + "options": [], + "subcommands": [] + } + ] + }, + { + "name": "validate", + "path": "mobench config validate", + "about": "Validate bench-config.toml and referenced matrix/settings", + "options": [ + { + "id": "config", + "long": "config", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CONFIG" + ], + "possible_values": [], + "defaults": [ + "bench-config.toml" + ], + "environment": null, + "help": null + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "format", + "long": "format", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FORMAT" + ], + "possible_values": [ + "json", + "text" + ], + "defaults": [ + "text" + ], + "environment": null, + "help": null + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + } + ] + }, + { + "name": "devices", + "path": "mobench devices", + "about": "List available BrowserStack devices for testing", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help (see more with '--help')" + }, + { + "id": "json", + "long": "json", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "JSON" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Output as JSON" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "platform", + "long": "platform", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PLATFORM" + ], + "possible_values": [ + "android", + "ios" + ], + "defaults": [], + "environment": null, + "help": "Filter by platform (android or ios)" + }, + { + "id": "validate", + "long": "validate", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Append", + "value_names": [ + "VALIDATE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Validate device specs against available devices" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [ + { + "name": "help", + "path": "mobench devices help", + "about": "Print this message or the help of the given subcommand(s)", + "options": [], + "subcommands": [ + { + "name": "help", + "path": "mobench devices help help", + "about": "Print this message or the help of the given subcommand(s)", + "options": [], + "subcommands": [] + }, + { + "name": "resolve", + "path": "mobench devices help resolve", + "about": "Resolve devices from a matrix deterministically for CI usage", + "options": [], + "subcommands": [] + } + ] + }, + { + "name": "resolve", + "path": "mobench devices resolve", + "about": "Resolve devices from a matrix deterministically for CI usage", + "options": [ + { + "id": "config", + "long": "config", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CONFIG" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to run config file (optional source for matrix/tags)" + }, + { + "id": "device_matrix", + "long": "device-matrix", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "DEVICE_MATRIX" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to device matrix YAML file" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "format", + "long": "format", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FORMAT" + ], + "possible_values": [ + "json", + "text" + ], + "defaults": [ + "text" + ], + "environment": null, + "help": null + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "platform", + "long": "platform", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PLATFORM" + ], + "possible_values": [ + "android", + "ios" + ], + "defaults": [], + "environment": null, + "help": null + }, + { + "id": "profile", + "long": "profile", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PROFILE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Device profile/tag to resolve (defaults to `default`)" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + } + ] + }, + { + "name": "doctor", + "path": "mobench doctor", + "about": "Validate local + CI prerequisites and configuration", + "options": [ + { + "id": "browserstack", + "long": "browserstack", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "BROWSERSTACK" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "true" + ], + "environment": null, + "help": "Validate BrowserStack credentials" + }, + { + "id": "config", + "long": "config", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CONFIG" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Optional path to run config file to validate" + }, + { + "id": "device_matrix", + "long": "device-matrix", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "DEVICE_MATRIX" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Optional path to device matrix YAML file to validate" + }, + { + "id": "device_tags", + "long": "device-tags", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Append", + "value_names": [ + "DEVICE_TAGS" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Device tags to select from the device matrix (comma-separated or repeatable)" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "format", + "long": "format", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FORMAT" + ], + "possible_values": [ + "json", + "text" + ], + "defaults": [ + "text" + ], + "environment": null, + "help": null + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "target", + "long": "target", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "TARGET" + ], + "possible_values": [ + "android", + "both", + "ios" + ], + "defaults": [ + "both" + ], + "environment": null, + "help": null + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "fetch", + "path": "mobench fetch", + "about": "Fetch BrowserStack build artifacts (logs, session JSON) for CI", + "options": [ + { + "id": "build_id", + "long": "build-id", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "BUILD_ID" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": null + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help (see more with '--help')" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output_dir", + "long": "output-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT_DIR" + ], + "possible_values": [], + "defaults": [ + "target/browserstack" + ], + "environment": null, + "help": null + }, + { + "id": "poll_interval_secs", + "long": "poll-interval-secs", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "POLL_INTERVAL_SECS" + ], + "possible_values": [], + "defaults": [ + "10" + ], + "environment": null, + "help": null + }, + { + "id": "target", + "long": "target", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "TARGET" + ], + "possible_values": [ + "android", + "ios" + ], + "defaults": [], + "environment": null, + "help": null + }, + { + "id": "timeout_secs", + "long": "timeout-secs", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "TIMEOUT_SECS" + ], + "possible_values": [], + "defaults": [ + "1800" + ], + "environment": null, + "help": null + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "wait", + "long": "wait", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "WAIT" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "true" + ], + "environment": null, + "help": null + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "fixture", + "path": "mobench fixture", + "about": "Fixture lifecycle helpers for reproducible CI setup", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [ + { + "name": "build", + "path": "mobench fixture build", + "about": "Build fixture artifacts using existing build commands", + "options": [ + { + "id": "crate_path", + "long": "crate-path", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CRATE_PATH" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to benchmark crate" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output_dir", + "long": "output-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT_DIR" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Output directory for mobile artifacts" + }, + { + "id": "progress", + "long": "progress", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "PROGRESS" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Show simplified step-by-step progress output" + }, + { + "id": "release", + "long": "release", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "RELEASE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Build in release mode" + }, + { + "id": "target", + "long": "target", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "TARGET" + ], + "possible_values": [ + "android", + "both", + "ios" + ], + "defaults": [ + "both" + ], + "environment": null, + "help": null + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "cache-key", + "path": "mobench fixture cache-key", + "about": "Compute deterministic fixture cache key from config/toolchain inputs", + "options": [ + { + "id": "config", + "long": "config", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CONFIG" + ], + "possible_values": [], + "defaults": [ + "bench-config.toml" + ], + "environment": null, + "help": null + }, + { + "id": "device_matrix", + "long": "device-matrix", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "DEVICE_MATRIX" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": null + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "format", + "long": "format", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FORMAT" + ], + "possible_values": [ + "json", + "text" + ], + "defaults": [ + "text" + ], + "environment": null, + "help": null + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "profile", + "long": "profile", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PROFILE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Device profile/tag for keying" + }, + { + "id": "target", + "long": "target", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "TARGET" + ], + "possible_values": [ + "android", + "both", + "ios" + ], + "defaults": [ + "both" + ], + "environment": null, + "help": null + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "help", + "path": "mobench fixture help", + "about": "Print this message or the help of the given subcommand(s)", + "options": [], + "subcommands": [ + { + "name": "build", + "path": "mobench fixture help build", + "about": "Build fixture artifacts using existing build commands", + "options": [], + "subcommands": [] + }, + { + "name": "cache-key", + "path": "mobench fixture help cache-key", + "about": "Compute deterministic fixture cache key from config/toolchain inputs", + "options": [], + "subcommands": [] + }, + { + "name": "help", + "path": "mobench fixture help help", + "about": "Print this message or the help of the given subcommand(s)", + "options": [], + "subcommands": [] + }, + { + "name": "init", + "path": "mobench fixture help init", + "about": "Create starter fixture files for CI runs", + "options": [], + "subcommands": [] + }, + { + "name": "verify", + "path": "mobench fixture help verify", + "about": "Verify fixture files and optional profile filtering", + "options": [], + "subcommands": [] + }, + { + "name": "verify-plots", + "path": "mobench fixture help verify-plots", + "about": "Render and verify checked-in plot fixtures", + "options": [], + "subcommands": [] + } + ] + }, + { + "name": "init", + "path": "mobench fixture init", + "about": "Create starter fixture files for CI runs", + "options": [ + { + "id": "config", + "long": "config", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CONFIG" + ], + "possible_values": [], + "defaults": [ + "bench-config.toml" + ], + "environment": null, + "help": null + }, + { + "id": "device_matrix", + "long": "device-matrix", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "DEVICE_MATRIX" + ], + "possible_values": [], + "defaults": [ + "device-matrix.yaml" + ], + "environment": null, + "help": null + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "force", + "long": "force", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "FORCE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Overwrite existing fixture files" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "verify", + "path": "mobench fixture verify", + "about": "Verify fixture files and optional profile filtering", + "options": [ + { + "id": "config", + "long": "config", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CONFIG" + ], + "possible_values": [], + "defaults": [ + "bench-config.toml" + ], + "environment": null, + "help": null + }, + { + "id": "device_matrix", + "long": "device-matrix", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "DEVICE_MATRIX" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": null + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "format", + "long": "format", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FORMAT" + ], + "possible_values": [ + "json", + "text" + ], + "defaults": [ + "text" + ], + "environment": null, + "help": null + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "profile", + "long": "profile", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PROFILE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Device profile/tag to verify" + }, + { + "id": "target", + "long": "target", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "TARGET" + ], + "possible_values": [ + "android", + "both", + "ios" + ], + "defaults": [ + "both" + ], + "environment": null, + "help": null + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "verify-plots", + "path": "mobench fixture verify-plots", + "about": "Render and verify checked-in plot fixtures", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "fixture", + "long": null, + "short": null, + "positional_index": 1, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FIXTURE" + ], + "possible_values": [ + "basic", + "ffi" + ], + "defaults": [], + "environment": null, + "help": null + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output_dir", + "long": "output-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT_DIR" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Output directory for rendered fixture artifacts (defaults under target/mobench/plot-fixtures)" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + } + ] + }, + { + "name": "help", + "path": "mobench help", + "about": "Print this message or the help of the given subcommand(s)", + "options": [], + "subcommands": [ + { + "name": "build", + "path": "mobench help build", + "about": "Build mobile artifacts from the resolved benchmark crate", + "options": [], + "subcommands": [] + }, + { + "name": "check", + "path": "mobench help check", + "about": "Check prerequisites for building mobile artifacts", + "options": [], + "subcommands": [] + }, + { + "name": "ci", + "path": "mobench help ci", + "about": "CI helpers (workflow and action scaffolding)", + "options": [], + "subcommands": [ + { + "name": "check-run", + "path": "mobench help ci check-run", + "about": "Create a GitHub Check Run with benchmark results", + "options": [], + "subcommands": [] + }, + { + "name": "init", + "path": "mobench help ci init", + "about": "Generate GitHub Actions workflow + local action wrapper", + "options": [], + "subcommands": [] + }, + { + "name": "merge-split-runs", + "path": "mobench help ci merge-split-runs", + "about": "Merge one-sample CI summaries into a normal CI output set", + "options": [], + "subcommands": [] + }, + { + "name": "run", + "path": "mobench help ci run", + "about": "Run a full CI benchmark flow with stable output contract", + "options": [], + "subcommands": [] + }, + { + "name": "summarize", + "path": "mobench help ci summarize", + "about": "Summarize benchmark results with device metrics", + "options": [], + "subcommands": [] + } + ] + }, + { + "name": "compare", + "path": "mobench help compare", + "about": "Compare two run summaries for regressions", + "options": [], + "subcommands": [] + }, + { + "name": "config", + "path": "mobench help config", + "about": "Validate run configuration and associated files", + "options": [], + "subcommands": [ + { + "name": "validate", + "path": "mobench help config validate", + "about": "Validate bench-config.toml and referenced matrix/settings", + "options": [], + "subcommands": [] + } + ] + }, + { + "name": "devices", + "path": "mobench help devices", + "about": "List available BrowserStack devices for testing", + "options": [], + "subcommands": [ + { + "name": "resolve", + "path": "mobench help devices resolve", + "about": "Resolve devices from a matrix deterministically for CI usage", + "options": [], + "subcommands": [] + } + ] + }, + { + "name": "doctor", + "path": "mobench help doctor", + "about": "Validate local + CI prerequisites and configuration", + "options": [], + "subcommands": [] + }, + { + "name": "fetch", + "path": "mobench help fetch", + "about": "Fetch BrowserStack build artifacts (logs, session JSON) for CI", + "options": [], + "subcommands": [] + }, + { + "name": "fixture", + "path": "mobench help fixture", + "about": "Fixture lifecycle helpers for reproducible CI setup", + "options": [], + "subcommands": [ + { + "name": "build", + "path": "mobench help fixture build", + "about": "Build fixture artifacts using existing build commands", + "options": [], + "subcommands": [] + }, + { + "name": "cache-key", + "path": "mobench help fixture cache-key", + "about": "Compute deterministic fixture cache key from config/toolchain inputs", + "options": [], + "subcommands": [] + }, + { + "name": "init", + "path": "mobench help fixture init", + "about": "Create starter fixture files for CI runs", + "options": [], + "subcommands": [] + }, + { + "name": "verify", + "path": "mobench help fixture verify", + "about": "Verify fixture files and optional profile filtering", + "options": [], + "subcommands": [] + }, + { + "name": "verify-plots", + "path": "mobench help fixture verify-plots", + "about": "Render and verify checked-in plot fixtures", + "options": [], + "subcommands": [] + } + ] + }, + { + "name": "help", + "path": "mobench help help", + "about": "Print this message or the help of the given subcommand(s)", + "options": [], + "subcommands": [] + }, + { + "name": "init", + "path": "mobench help init", + "about": "Scaffold a base config file for the CLI", + "options": [], + "subcommands": [] + }, + { + "name": "init-sdk", + "path": "mobench help init-sdk", + "about": "Initialize a new benchmark project with the SDK templates", + "options": [], + "subcommands": [] + }, + { + "name": "list", + "path": "mobench help list", + "about": "List all discovered benchmark functions", + "options": [], + "subcommands": [] + }, + { + "name": "package-ipa", + "path": "mobench help package-ipa", + "about": "Package iOS app as IPA for distribution or testing", + "options": [], + "subcommands": [] + }, + { + "name": "package-xcuitest", + "path": "mobench help package-xcuitest", + "about": "Package XCUITest runner for BrowserStack testing", + "options": [], + "subcommands": [] + }, + { + "name": "plan", + "path": "mobench help plan", + "about": "Generate a sample device matrix file", + "options": [], + "subcommands": [] + }, + { + "name": "profile", + "path": "mobench help profile", + "about": "Profiling helpers for native profile capture and summary rendering", + "options": [], + "subcommands": [ + { + "name": "diff", + "path": "mobench help profile diff", + "about": "Generate a differential flamegraph bundle from two normalized profile manifests", + "options": [], + "subcommands": [] + }, + { + "name": "run", + "path": "mobench help profile run", + "about": "Plan or execute a native profiling session; local android-native and ios-instruments now attempt real native capture", + "options": [], + "subcommands": [] + }, + { + "name": "summarize", + "path": "mobench help profile summarize", + "about": "Render markdown or JSON from a normalized profile manifest", + "options": [], + "subcommands": [] + } + ] + }, + { + "name": "report", + "path": "mobench help report", + "about": "Reporting helpers for CI summaries and PR comments", + "options": [], + "subcommands": [ + { + "name": "github", + "path": "mobench help report github", + "about": "Generate/publish sticky GitHub PR comment from summary output", + "options": [], + "subcommands": [] + }, + { + "name": "summarize", + "path": "mobench help report summarize", + "about": "Generate markdown summary from standardized output JSON", + "options": [], + "subcommands": [] + } + ] + }, + { + "name": "run", + "path": "mobench help run", + "about": "Build mobile artifacts, write host preflight output, or run on BrowserStack devices", + "options": [], + "subcommands": [] + }, + { + "name": "summary", + "path": "mobench help summary", + "about": "Display summary statistics from a benchmark report JSON file", + "options": [], + "subcommands": [] + }, + { + "name": "verify", + "path": "mobench help verify", + "about": "Verify benchmark setup: registry, spec, artifacts, and optional smoke test", + "options": [], + "subcommands": [] + } + ] + }, + { + "name": "init", + "path": "mobench init", + "about": "Scaffold a base config file for the CLI", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help (see more with '--help')" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output", + "long": "output", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT" + ], + "possible_values": [], + "defaults": [ + "bench-config.toml" + ], + "environment": null, + "help": null + }, + { + "id": "target", + "long": "target", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "TARGET" + ], + "possible_values": [ + "android", + "ios" + ], + "defaults": [ + "android" + ], + "environment": null, + "help": null + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "init-sdk", + "path": "mobench init-sdk", + "about": "Initialize a new benchmark project with the SDK templates", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "examples", + "long": "examples", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "EXAMPLES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Generate example benchmarks" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output_dir", + "long": "output-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT_DIR" + ], + "possible_values": [], + "defaults": [ + "." + ], + "environment": null, + "help": null + }, + { + "id": "project_name", + "long": "project-name", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PROJECT_NAME" + ], + "possible_values": [], + "defaults": [ + "bench-project" + ], + "environment": null, + "help": null + }, + { + "id": "target", + "long": "target", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "TARGET" + ], + "possible_values": [ + "android", + "both", + "ios" + ], + "defaults": [], + "environment": null, + "help": null + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "list", + "path": "mobench list", + "about": "List all discovered benchmark functions", + "options": [ + { + "id": "crate_path", + "long": "crate-path", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CRATE_PATH" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to the benchmark crate directory containing Cargo.toml" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "project_root", + "long": "project-root", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PROJECT_ROOT" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Project root containing mobench.toml or the Cargo workspace" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "package-ipa", + "path": "mobench package-ipa", + "about": "Package iOS app as IPA for distribution or testing", + "options": [ + { + "id": "crate_path", + "long": "crate-path", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CRATE_PATH" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to the benchmark crate directory containing Cargo.toml" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help (see more with '--help')" + }, + { + "id": "method", + "long": "method", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "METHOD" + ], + "possible_values": [ + "adhoc", + "development" + ], + "defaults": [ + "adhoc" + ], + "environment": null, + "help": "Signing method" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output_dir", + "long": "output-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT_DIR" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Output directory for mobile artifacts (default: target/mobench)" + }, + { + "id": "project_root", + "long": "project-root", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PROJECT_ROOT" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Project root containing mobench.toml or the Cargo workspace" + }, + { + "id": "scheme", + "long": "scheme", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "SCHEME" + ], + "possible_values": [], + "defaults": [ + "BenchRunner" + ], + "environment": null, + "help": "Xcode scheme to build" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "package-xcuitest", + "path": "mobench package-xcuitest", + "about": "Package XCUITest runner for BrowserStack testing", + "options": [ + { + "id": "crate_path", + "long": "crate-path", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CRATE_PATH" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to the benchmark crate directory containing Cargo.toml" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help (see more with '--help')" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output_dir", + "long": "output-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT_DIR" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Output directory for mobile artifacts (default: target/mobench)" + }, + { + "id": "project_root", + "long": "project-root", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PROJECT_ROOT" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Project root containing mobench.toml or the Cargo workspace" + }, + { + "id": "scheme", + "long": "scheme", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "SCHEME" + ], + "possible_values": [], + "defaults": [ + "BenchRunner" + ], + "environment": null, + "help": "Xcode scheme to build" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "plan", + "path": "mobench plan", + "about": "Generate a sample device matrix file", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output", + "long": "output", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT" + ], + "possible_values": [], + "defaults": [ + "device-matrix.yaml" + ], + "environment": null, + "help": null + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "profile", + "path": "mobench profile", + "about": "Profiling helpers for native profile capture and summary rendering", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [ + { + "name": "diff", + "path": "mobench profile diff", + "about": "Generate a differential flamegraph bundle from two normalized profile manifests", + "options": [ + { + "id": "baseline", + "long": "baseline", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "BASELINE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to the baseline profile.json manifest" + }, + { + "id": "candidate", + "long": "candidate", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CANDIDATE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to the candidate profile.json manifest" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "normalize", + "long": "normalize", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NORMALIZE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Normalize baseline sample counts to candidate totals before diffing" + }, + { + "id": "output_dir", + "long": "output-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT_DIR" + ], + "possible_values": [], + "defaults": [ + "target/mobench/profile/diff" + ], + "environment": null, + "help": "Output directory for differential profile artifacts" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "help", + "path": "mobench profile help", + "about": "Print this message or the help of the given subcommand(s)", + "options": [], + "subcommands": [ + { + "name": "diff", + "path": "mobench profile help diff", + "about": "Generate a differential flamegraph bundle from two normalized profile manifests", + "options": [], + "subcommands": [] + }, + { + "name": "help", + "path": "mobench profile help help", + "about": "Print this message or the help of the given subcommand(s)", + "options": [], + "subcommands": [] + }, + { + "name": "run", + "path": "mobench profile help run", + "about": "Plan or execute a native profiling session; local android-native and ios-instruments now attempt real native capture", + "options": [], + "subcommands": [] + }, + { + "name": "summarize", + "path": "mobench profile help summarize", + "about": "Render markdown or JSON from a normalized profile manifest", + "options": [], + "subcommands": [] + } + ] + }, + { + "name": "run", + "path": "mobench profile run", + "about": "Plan or execute a native profiling session; local android-native and ios-instruments now attempt real native capture", + "options": [ + { + "id": "backend", + "long": "backend", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "BACKEND" + ], + "possible_values": [ + "android-native", + "auto", + "ios-instruments", + "rust-tracing" + ], + "defaults": [ + "auto" + ], + "environment": null, + "help": null + }, + { + "id": "config", + "long": "config", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CONFIG" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Optional path to config file" + }, + { + "id": "crate_path", + "long": "crate-path", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CRATE_PATH" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to the benchmark crate directory containing Cargo.toml" + }, + { + "id": "device", + "long": "device", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "DEVICE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Explicit BrowserStack device name to resolve for this profiling request" + }, + { + "id": "device_matrix", + "long": "device-matrix", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "DEVICE_MATRIX" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to device matrix YAML file used with --profile or config-based device tags" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "format", + "long": "format", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FORMAT" + ], + "possible_values": [ + "both", + "native", + "processed" + ], + "defaults": [ + "both" + ], + "environment": null, + "help": null + }, + { + "id": "function", + "long": "function", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FUNCTION" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Fully-qualified Rust function to profile" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help (see more with '--help')" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "os_version", + "long": "os-version", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OS_VERSION" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "OS version for --device (for example `16` or `14.0`)" + }, + { + "id": "output_dir", + "long": "output-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT_DIR" + ], + "possible_values": [], + "defaults": [ + "target/mobench/profile" + ], + "environment": null, + "help": null + }, + { + "id": "profile", + "long": "profile", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PROFILE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Device profile/tag to resolve (for example `high-spec`)" + }, + { + "id": "provider", + "long": "provider", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PROVIDER" + ], + "possible_values": [ + "browserstack", + "local" + ], + "defaults": [ + "local" + ], + "environment": null, + "help": null + }, + { + "id": "target", + "long": "target", + "short": null, + "positional_index": null, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "TARGET" + ], + "possible_values": [ + "android", + "ios" + ], + "defaults": [], + "environment": null, + "help": null + }, + { + "id": "trace_events_output", + "long": "trace-events-output", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "TRACE_EVENTS_OUTPUT" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Write machine-readable trace/event JSON to this path for downstream consumers" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "warmup_mode", + "long": "warmup-mode", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "WARMUP_MODE" + ], + "possible_values": [ + "cold", + "warm" + ], + "defaults": [], + "environment": null, + "help": "Warm or cold capture mode for local native profiling (defaults to warm for local Android/iOS native backends)" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "summarize", + "path": "mobench profile summarize", + "about": "Render markdown or JSON from a normalized profile manifest", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output", + "long": "output", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": null + }, + { + "id": "output_format", + "long": "output-format", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT_FORMAT" + ], + "possible_values": [ + "json", + "markdown" + ], + "defaults": [ + "markdown" + ], + "environment": null, + "help": null + }, + { + "id": "profile", + "long": "profile", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PROFILE" + ], + "possible_values": [], + "defaults": [ + "target/mobench/profile/profile.json" + ], + "environment": null, + "help": null + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + } + ] + }, + { + "name": "report", + "path": "mobench report", + "about": "Reporting helpers for CI summaries and PR comments", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [ + { + "name": "github", + "path": "mobench report github", + "about": "Generate/publish sticky GitHub PR comment from summary output", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "marker", + "long": "marker", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "MARKER" + ], + "possible_values": [], + "defaults": [ + "" + ], + "environment": null, + "help": null + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output", + "long": "output", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Write generated comment body to file" + }, + { + "id": "pr", + "long": "pr", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PR" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Pull request number (auto-detected from GITHUB_REF if omitted)" + }, + { + "id": "publish", + "long": "publish", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "PUBLISH" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Publish via GitHub API using GITHUB_TOKEN" + }, + { + "id": "summary", + "long": "summary", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "SUMMARY" + ], + "possible_values": [], + "defaults": [ + "target/mobench/ci/summary.json" + ], + "environment": null, + "help": null + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "help", + "path": "mobench report help", + "about": "Print this message or the help of the given subcommand(s)", + "options": [], + "subcommands": [ + { + "name": "github", + "path": "mobench report help github", + "about": "Generate/publish sticky GitHub PR comment from summary output", + "options": [], + "subcommands": [] + }, + { + "name": "help", + "path": "mobench report help help", + "about": "Print this message or the help of the given subcommand(s)", + "options": [], + "subcommands": [] + }, + { + "name": "summarize", + "path": "mobench report help summarize", + "about": "Generate markdown summary from standardized output JSON", + "options": [], + "subcommands": [] + } + ] + }, + { + "name": "summarize", + "path": "mobench report summarize", + "about": "Generate markdown summary from standardized output JSON", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output", + "long": "output", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Write markdown output to file" + }, + { + "id": "plots", + "long": "plots", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PLOTS" + ], + "possible_values": [ + "auto", + "off", + "require" + ], + "defaults": [ + "auto" + ], + "environment": null, + "help": null + }, + { + "id": "summary", + "long": "summary", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "SUMMARY" + ], + "possible_values": [], + "defaults": [ + "target/mobench/ci/summary.json" + ], + "environment": null, + "help": null + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + } + ] + }, + { + "name": "run", + "path": "mobench run", + "about": "Build mobile artifacts, write host preflight output, or run on BrowserStack devices", + "options": [ + { + "id": "android_benchmark_timeout_secs", + "long": "android-benchmark-timeout-secs", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "ANDROID_BENCHMARK_TIMEOUT_SECS" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Android benchmark watchdog timeout in seconds for the generated harness" + }, + { + "id": "android_heartbeat_interval_secs", + "long": "android-heartbeat-interval-secs", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "ANDROID_HEARTBEAT_INTERVAL_SECS" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Android benchmark heartbeat interval in seconds for the generated harness" + }, + { + "id": "baseline", + "long": "baseline", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "BASELINE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Baseline summary source (path|url|artifact:)" + }, + { + "id": "ci", + "long": "ci", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "CI" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Enable CI mode (job summary, optional JUnit, regression exit codes)" + }, + { + "id": "config", + "long": "config", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CONFIG" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Optional path to config file" + }, + { + "id": "crate_path", + "long": "crate-path", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CRATE_PATH" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to the benchmark crate directory containing Cargo.toml" + }, + { + "id": "device_matrix", + "long": "device-matrix", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "DEVICE_MATRIX" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Device matrix YAML file to load device names from" + }, + { + "id": "device_tags", + "long": "device-tags", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Append", + "value_names": [ + "DEVICE_TAGS" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Device tags to select from the device matrix (comma-separated or repeatable)" + }, + { + "id": "devices", + "long": "devices", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Append", + "value_names": [ + "DEVICES" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Device identifiers or labels (BrowserStack devices)" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "fetch", + "long": "fetch", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "FETCH" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Fetch BrowserStack artifacts after the run completes" + }, + { + "id": "fetch_output_dir", + "long": "fetch-output-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FETCH_OUTPUT_DIR" + ], + "possible_values": [], + "defaults": [ + "target/browserstack" + ], + "environment": null, + "help": null + }, + { + "id": "fetch_poll_interval_secs", + "long": "fetch-poll-interval-secs", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FETCH_POLL_INTERVAL_SECS" + ], + "possible_values": [], + "defaults": [ + "5" + ], + "environment": null, + "help": null + }, + { + "id": "fetch_timeout_secs", + "long": "fetch-timeout-secs", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FETCH_TIMEOUT_SECS" + ], + "possible_values": [], + "defaults": [ + "300" + ], + "environment": null, + "help": null + }, + { + "id": "function", + "long": "function", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FUNCTION" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Fully-qualified Rust function to benchmark" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help (see more with '--help')" + }, + { + "id": "ios_app", + "long": "ios-app", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "IOS_APP" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to iOS app bundle (.ipa or zipped .app) for BrowserStack XCUITest" + }, + { + "id": "ios_completion_timeout_secs", + "long": "ios-completion-timeout-secs", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": true, + "action": "Set", + "value_names": [ + "IOS_COMPLETION_TIMEOUT_SECS" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Deprecated compatibility flag for generated XCUITest harness timeout" + }, + { + "id": "ios_deployment_target", + "long": "ios-deployment-target", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "IOS_DEPLOYMENT_TARGET" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "iOS deployment target for generated app and XCUITest targets" + }, + { + "id": "ios_runner", + "long": "ios-runner", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "IOS_RUNNER" + ], + "possible_values": [ + "swiftui", + "uikit-legacy" + ], + "defaults": [], + "environment": null, + "help": "iOS runner template (swiftui or uikit-legacy)" + }, + { + "id": "ios_test_suite", + "long": "ios-test-suite", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "IOS_TEST_SUITE" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to iOS XCUITest test suite package (.zip or .ipa)" + }, + { + "id": "iterations", + "long": "iterations", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "ITERATIONS" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": null + }, + { + "id": "junit", + "long": "junit", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "JUNIT" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Write JUnit XML report to the given path" + }, + { + "id": "local_only", + "long": "local-only", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "LOCAL_ONLY" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Skip mobile builds and write host-side preflight/spec output without mobile execution" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output", + "long": "output", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Optional output path for JSON report" + }, + { + "id": "progress", + "long": "progress", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "PROGRESS" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Show simplified step-by-step progress output" + }, + { + "id": "project_root", + "long": "project-root", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PROJECT_ROOT" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Project root containing mobench.toml or the Cargo workspace" + }, + { + "id": "regression_threshold_pct", + "long": "regression-threshold-pct", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "REGRESSION_THRESHOLD_PCT" + ], + "possible_values": [], + "defaults": [ + "5" + ], + "environment": null, + "help": "Regression threshold percentage when comparing to baseline" + }, + { + "id": "release", + "long": "release", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "RELEASE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Build in release mode (recommended for BrowserStack to reduce APK size and upload time)" + }, + { + "id": "summary_csv", + "long": "summary-csv", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "SUMMARY_CSV" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Write CSV summary alongside JSON" + }, + { + "id": "target", + "long": "target", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "TARGET" + ], + "possible_values": [ + "android", + "ios" + ], + "defaults": [], + "environment": null, + "help": null + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "warmup", + "long": "warmup", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "WARMUP" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": null + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "summary", + "path": "mobench summary", + "about": "Display summary statistics from a benchmark report JSON file", + "options": [ + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "format", + "long": "format", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FORMAT" + ], + "possible_values": [ + "csv", + "json", + "text" + ], + "defaults": [], + "environment": null, + "help": "Output format: text (default), json, or csv" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help (see more with '--help')" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "report", + "long": null, + "short": null, + "positional_index": 1, + "required": true, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "REPORT" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to the benchmark report JSON file" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + }, + { + "name": "verify", + "path": "mobench verify", + "about": "Verify benchmark setup: registry, spec, artifacts, and optional smoke test", + "options": [ + { + "id": "check_artifacts", + "long": "check-artifacts", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "CHECK_ARTIFACTS" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Check that build artifacts exist" + }, + { + "id": "crate_path", + "long": "crate-path", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "CRATE_PATH" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to the benchmark crate directory containing Cargo.toml" + }, + { + "id": "dry_run", + "long": "dry-run", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "DRY_RUN" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print what would be done without actually doing it" + }, + { + "id": "function", + "long": "function", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "FUNCTION" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Function name to verify/smoke test" + }, + { + "id": "help", + "long": "help", + "short": "h", + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Help", + "value_names": [], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Print help (see more with '--help')" + }, + { + "id": "non_interactive", + "long": "non-interactive", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "NON_INTERACTIVE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Disable interactive prompts (fail instead)" + }, + { + "id": "output_dir", + "long": "output-dir", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "OUTPUT_DIR" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Output directory for mobile artifacts (default: target/mobench)" + }, + { + "id": "project_root", + "long": "project-root", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "PROJECT_ROOT" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Project root containing mobench.toml or the Cargo workspace" + }, + { + "id": "smoke_test", + "long": "smoke-test", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "SMOKE_TEST" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Run a local smoke test with minimal iterations" + }, + { + "id": "spec_path", + "long": "spec-path", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "SPEC_PATH" + ], + "possible_values": [], + "defaults": [], + "environment": null, + "help": "Path to bench_spec.json to validate" + }, + { + "id": "target", + "long": "target", + "short": null, + "positional_index": null, + "required": false, + "global": false, + "hidden": false, + "action": "Set", + "value_names": [ + "TARGET" + ], + "possible_values": [ + "android", + "both", + "ios" + ], + "defaults": [], + "environment": null, + "help": "Target platform to verify artifacts for" + }, + { + "id": "verbose", + "long": "verbose", + "short": "v", + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "VERBOSE" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Print verbose output including all commands" + }, + { + "id": "yes", + "long": "yes", + "short": null, + "positional_index": null, + "required": false, + "global": true, + "hidden": false, + "action": "SetTrue", + "value_names": [ + "YES" + ], + "possible_values": [ + "false", + "true" + ], + "defaults": [ + "false" + ], + "environment": null, + "help": "Assume yes to prompts and allow overwriting files" + } + ], + "subcommands": [] + } + ] + }, + "config": [ + { + "file": "mobench.toml", + "keys": [ + { + "path": "project.crate", + "value_type": "string|null", + "required": false, + "default": null, + "evidence_id": "source-mobench-config" + }, + { + "path": "project.library_name", + "value_type": "string|null", + "required": false, + "default": null, + "evidence_id": "source-mobench-config" + }, + { + "path": "project.output_dir", + "value_type": "path|null", + "required": false, + "default": null, + "evidence_id": "source-mobench-config" + }, + { + "path": "android.package", + "value_type": "string", + "required": false, + "default": "dev.world.bench", + "evidence_id": "source-mobench-config" + }, + { + "path": "android.min_sdk", + "value_type": "integer", + "required": false, + "default": 24, + "evidence_id": "source-mobench-config" + }, + { + "path": "android.target_sdk", + "value_type": "integer", + "required": false, + "default": 34, + "evidence_id": "source-mobench-config" + }, + { + "path": "android.abis", + "value_type": "string[]|null", + "required": false, + "default": null, + "evidence_id": "source-mobench-config" + }, + { + "path": "ios.bundle_id", + "value_type": "string", + "required": false, + "default": "dev.world.bench", + "evidence_id": "source-mobench-config" + }, + { + "path": "ios.deployment_target", + "value_type": "string", + "required": false, + "default": "15.0", + "evidence_id": "source-mobench-config" + }, + { + "path": "ios.team_id", + "value_type": "string|null", + "required": false, + "default": null, + "evidence_id": "source-mobench-config" + }, + { + "path": "benchmarks.default_function", + "value_type": "string|null", + "required": false, + "default": null, + "evidence_id": "source-mobench-config" + }, + { + "path": "benchmarks.default_iterations", + "value_type": "integer", + "required": false, + "default": 100, + "evidence_id": "source-mobench-config" + }, + { + "path": "benchmarks.default_warmup", + "value_type": "integer", + "required": false, + "default": 10, + "evidence_id": "source-mobench-config" + }, + { + "path": "browserstack.ios_completion_timeout_secs", + "value_type": "integer|null", + "required": false, + "default": null, + "evidence_id": "source-mobench-config" + } + ] + }, + { + "file": "bench-config.toml", + "keys": [ + { + "path": "target", + "value_type": "android|ios", + "required": true, + "default": null, + "evidence_id": "source-bench-config" + }, + { + "path": "function", + "value_type": "string", + "required": true, + "default": null, + "evidence_id": "source-bench-config" + }, + { + "path": "iterations", + "value_type": "integer", + "required": true, + "default": null, + "evidence_id": "source-bench-config" + }, + { + "path": "warmup", + "value_type": "integer", + "required": true, + "default": null, + "evidence_id": "source-bench-config" + }, + { + "path": "device_matrix", + "value_type": "path", + "required": true, + "default": null, + "evidence_id": "source-bench-config" + }, + { + "path": "device_tags", + "value_type": "string[]|null", + "required": false, + "default": null, + "evidence_id": "source-bench-config" + }, + { + "path": "browserstack.app_automate_username", + "value_type": "string", + "required": true, + "default": null, + "evidence_id": "source-bench-config" + }, + { + "path": "browserstack.app_automate_access_key", + "value_type": "string", + "required": true, + "default": null, + "evidence_id": "source-bench-config" + }, + { + "path": "browserstack.project", + "value_type": "string|null", + "required": false, + "default": null, + "evidence_id": "source-bench-config" + }, + { + "path": "browserstack.ios_completion_timeout_secs", + "value_type": "integer|null", + "required": false, + "default": null, + "evidence_id": "source-bench-config" + }, + { + "path": "browserstack.android_benchmark_timeout_secs", + "value_type": "integer|null", + "required": false, + "default": null, + "evidence_id": "source-bench-config" + }, + { + "path": "browserstack.android_heartbeat_interval_secs", + "value_type": "integer|null", + "required": false, + "default": null, + "evidence_id": "source-bench-config" + }, + { + "path": "ios_xcuitest.app", + "value_type": "path", + "required": false, + "default": null, + "evidence_id": "source-bench-config" + }, + { + "path": "ios_xcuitest.test_suite", + "value_type": "path", + "required": false, + "default": null, + "evidence_id": "source-bench-config" + } + ] + } + ], + "artifacts": [ + { + "id": "benchmark-spec", + "path_pattern": "target/mobench/{android|ios}/**/bench_spec.json", + "produced_by": [ + "mobench run", + "mobench build" + ], + "description": "Resolved benchmark request embedded in generated runners.", + "evidence_id": "source-run-artifacts" + }, + { + "id": "benchmark-metadata", + "path_pattern": "target/mobench/{android|ios}/**/bench_meta.json", + "produced_by": [ + "mobench run", + "mobench build" + ], + "description": "Build metadata embedded beside the benchmark spec.", + "evidence_id": "source-run-artifacts" + }, + { + "id": "android-app", + "path_pattern": "target/mobench/android/app/build/outputs/apk/{debug|release}/*.apk", + "produced_by": [ + "mobench build", + "mobench run" + ], + "description": "Generated Android app and instrumentation packages.", + "evidence_id": "source-build-artifacts" + }, + { + "id": "ios-framework", + "path_pattern": "target/mobench/ios/.xcframework", + "produced_by": [ + "mobench build", + "mobench run" + ], + "description": "Generated iOS xcframework.", + "evidence_id": "source-build-artifacts" + }, + { + "id": "ios-app", + "path_pattern": "target/mobench/ios/BenchRunner.ipa", + "produced_by": [ + "mobench package-ipa", + "mobench run" + ], + "description": "Packaged iOS benchmark application.", + "evidence_id": "source-build-artifacts" + }, + { + "id": "ios-test-suite", + "path_pattern": "target/mobench/ios/BenchRunnerUITests.zip", + "produced_by": [ + "mobench package-xcuitest", + "mobench run" + ], + "description": "Packaged XCUITest suite for BrowserStack.", + "evidence_id": "source-build-artifacts" + }, + { + "id": "ci-summary-json", + "path_pattern": "/summary.json", + "produced_by": [ + "mobench ci run", + "mobench ci merge-split-runs" + ], + "description": "Machine-readable benchmark summary.", + "evidence_id": "test-ci-artifacts" + }, + { + "id": "ci-summary-markdown", + "path_pattern": "/summary.md", + "produced_by": [ + "mobench ci run", + "mobench ci merge-split-runs" + ], + "description": "Human-readable benchmark summary.", + "evidence_id": "test-ci-artifacts" + }, + { + "id": "ci-results-csv", + "path_pattern": "/results.csv", + "produced_by": [ + "mobench ci run", + "mobench ci merge-split-runs" + ], + "description": "Tabular benchmark results.", + "evidence_id": "test-ci-artifacts" + }, + { + "id": "profile-manifest", + "path_pattern": "//profile.json", + "produced_by": [ + "mobench profile run" + ], + "description": "Normalized profile manifest, plus a latest convenience copy.", + "evidence_id": "test-profile-artifacts" + }, + { + "id": "profile-summary", + "path_pattern": "//summary.md", + "produced_by": [ + "mobench profile run" + ], + "description": "Profile summary, plus a latest convenience copy.", + "evidence_id": "test-profile-artifacts" + }, + { + "id": "profile-folded-stacks", + "path_pattern": "//artifacts/processed/stacks.folded", + "produced_by": [ + "mobench profile run" + ], + "description": "Processed native stack samples when capture succeeds.", + "evidence_id": "test-profile-artifacts" + }, + { + "id": "profile-native-report", + "path_pattern": "//artifacts/processed/native-report.txt", + "produced_by": [ + "mobench profile run" + ], + "description": "Symbolized native profiler report when available.", + "evidence_id": "test-profile-artifacts" + }, + { + "id": "profile-flamegraphs", + "path_pattern": "//artifacts/processed/flamegraph.{full|focused}.svg", + "produced_by": [ + "mobench profile run" + ], + "description": "Full and benchmark-focused flamegraph SVGs when capture succeeds.", + "evidence_id": "test-profile-artifacts" + }, + { + "id": "profile-viewer", + "path_pattern": "//artifacts/processed/flamegraph.html", + "produced_by": [ + "mobench profile run" + ], + "description": "Standalone profile viewer when capture succeeds.", + "evidence_id": "test-profile-artifacts" + }, + { + "id": "trace-events", + "path_pattern": "", + "produced_by": [ + "mobench profile run" + ], + "description": "Machine-readable structured trace-event contract.", + "evidence_id": "test-trace-events" + } + ], + "schemas": [ + { + "id": "summary-v1", + "path": "docs/schemas/summary-v1.schema.json", + "checksum_sha256": "dd67ff6dbf57e06acd3516b1f41f1b76654baf351a2a2fbc9ade2db1406a70fc" + }, + { + "id": "ci-contract-v1", + "path": "docs/schemas/ci-contract-v1.schema.json", + "checksum_sha256": "eff1ddfc6800a6a990cd85a3bf02feb03e0c71aac9ea64cd499e41790703e962" + }, + { + "id": "trace-events-v1", + "path": "docs/schemas/trace-events-v1.schema.json", + "checksum_sha256": "da8309604422fa31f653be40c0fafdcbc5dfbc8c001da78fc5f7e185f7c861ac" + }, + { + "id": "mobench-site-manifest-v1", + "path": "docs/schemas/mobench-site-manifest-v1.schema.json", + "checksum_sha256": "84bd1985e3a0025d56df39392a08f8f52631676b6ecc0173990d12be8828bb27" + } + ], + "capabilities": [ + { + "id": "benchmark.build.android", + "status": "supported", + "summary": "Build generated Android benchmark artifacts.", + "evidence_ids": [ + "source-build-artifacts" + ] + }, + { + "id": "benchmark.build.ios", + "status": "supported", + "summary": "Build generated iOS benchmark artifacts.", + "evidence_ids": [ + "source-build-artifacts" + ] + }, + { + "id": "benchmark.execute.browserstack.android", + "status": "supported", + "summary": "Execute Android benchmarks through BrowserStack App Automate when devices and credentials are provided.", + "evidence_ids": [ + "source-browserstack-run" + ] + }, + { + "id": "benchmark.execute.browserstack.ios", + "status": "supported", + "summary": "Execute iOS benchmarks through BrowserStack XCUITest when devices, credentials, and packages are provided.", + "evidence_ids": [ + "source-browserstack-run" + ] + }, + { + "id": "benchmark.execute.local-only", + "status": "unsupported", + "summary": "`--local-only` writes preflight/spec outputs but skips the mobile build and does not execute the requested benchmark in v0.1.43.", + "evidence_ids": [ + "source-local-only" + ] + }, + { + "id": "benchmark.execute.attached-device", + "status": "unsupported", + "summary": "Ordinary `mobench run` does not execute on an attached phone in v0.1.43.", + "evidence_ids": [ + "source-browserstack-run" + ] + }, + { + "id": "benchmark.execute.android-emulator", + "status": "unsupported", + "summary": "Ordinary `mobench run` has no Android emulator execution provider in v0.1.43.", + "evidence_ids": [ + "source-browserstack-run" + ] + }, + { + "id": "benchmark.execute.ios-simulator", + "status": "unsupported", + "summary": "Ordinary `mobench run` has no iOS simulator execution provider in v0.1.43.", + "evidence_ids": [ + "source-browserstack-run" + ] + }, + { + "id": "benchmark.build-without-devices", + "status": "supported", + "summary": "With no BrowserStack devices, `mobench run` builds artifacts and skips upload/execution.", + "evidence_ids": [ + "source-browserstack-run" + ] + }, + { + "id": "profile.local.android-native", + "status": "supported", + "summary": "Attempt local Android simpleperf capture, symbolization, and flamegraph generation when required tools and a device are available.", + "evidence_ids": [ + "source-android-profile", + "test-android-profile" + ] + }, + { + "id": "profile.local.ios-instruments", + "status": "supported", + "summary": "Attempt local iOS simulator-host sample capture and flamegraph generation when required tools are available.", + "evidence_ids": [ + "source-ios-profile", + "test-ios-profile" + ] + }, + { + "id": "profile.local.rust-tracing", + "status": "planned", + "summary": "The manifest/trace contract exists, but local rust-tracing capture is not implemented.", + "evidence_ids": [ + "source-rust-tracing" + ] + }, + { + "id": "profile.browserstack.android-native", + "status": "unsupported", + "summary": "BrowserStack native Android stack capture is not implemented.", + "evidence_ids": [ + "test-browserstack-profile" + ] + }, + { + "id": "profile.browserstack.ios-instruments", + "status": "unsupported", + "summary": "BrowserStack native iOS Instruments capture is not implemented.", + "evidence_ids": [ + "test-browserstack-profile" + ] + }, + { + "id": "profile.browserstack.rust-tracing", + "status": "unsupported", + "summary": "BrowserStack rust-tracing capture is not implemented.", + "evidence_ids": [ + "source-rust-tracing" + ] + } + ], + "evidence": [ + { + "id": "source-mobench-config", + "kind": "source", + "reference": "crates/mobench/src/config.rs#MobenchConfig" + }, + { + "id": "source-bench-config", + "kind": "source", + "reference": "crates/mobench/src/lib.rs#BenchConfig" + }, + { + "id": "source-run-artifacts", + "kind": "source", + "reference": "crates/mobench/src/lib.rs#persist_mobile_spec" + }, + { + "id": "source-build-artifacts", + "kind": "source", + "reference": "crates/mobench/src/lib.rs#cmd_build" + }, + { + "id": "source-browserstack-run", + "kind": "source", + "reference": "crates/mobench/src/lib.rs#run_from" + }, + { + "id": "source-local-only", + "kind": "source", + "reference": "crates/mobench/src/lib.rs#run_from:local_only" + }, + { + "id": "source-android-profile", + "kind": "source", + "reference": "crates/mobench/src/profile.rs#execute_local_android_capture" + }, + { + "id": "source-ios-profile", + "kind": "source", + "reference": "crates/mobench/src/profile.rs#execute_local_ios_capture" + }, + { + "id": "source-rust-tracing", + "kind": "source", + "reference": "crates/mobench/src/profile.rs#execute_capture" + }, + { + "id": "test-ci-artifacts", + "kind": "test", + "reference": "crates/mobench/src/split_runs.rs#merge_split_run_summaries" + }, + { + "id": "test-profile-artifacts", + "kind": "test", + "reference": "crates/mobench/src/profile.rs#profile_run_writes_run_scoped_and_latest_manifest_files" + }, + { + "id": "test-trace-events", + "kind": "test", + "reference": "crates/mobench/tests/profile_cli.rs#profile_run_dry_run_writes_trace_events_output_for_downstream_consumers" + }, + { + "id": "test-android-profile", + "kind": "test", + "reference": "crates/mobench/src/profile.rs#android_backend_builds_capture_plan_with_flamegraph_artifacts" + }, + { + "id": "test-ios-profile", + "kind": "test", + "reference": "crates/mobench/src/profile.rs#ios_backend_allocates_sample_and_flamegraph_artifacts" + }, + { + "id": "test-browserstack-profile", + "kind": "test", + "reference": "crates/mobench/tests/profile_cli.rs#browserstack_profile_run_reports_unsupported_native_capture" + }, + { + "id": "test-cargo-wrapper", + "kind": "test", + "reference": "crates/mobench/tests/invocation_cli.rs#cargo_mobench_invocation_works_through_cargo" + } + ] +} diff --git a/packages/truth/package.json b/packages/truth/package.json new file mode 100644 index 0000000..a82ae3c --- /dev/null +++ b/packages/truth/package.json @@ -0,0 +1,12 @@ +{ + "name": "@mobench/truth", + "version": "0.1.43", + "private": true, + "type": "module", + "exports": { + "./manifest": "./mobench-site-manifest-v1.json", + "./pin": "./pin.json", + "./fixtures/basic": "./fixtures/summary-basic.json", + "./fixtures/ffi": "./fixtures/summary-ffi.json" + } +} diff --git a/packages/truth/pin.json b/packages/truth/pin.json new file mode 100644 index 0000000..b4b084b --- /dev/null +++ b/packages/truth/pin.json @@ -0,0 +1,10 @@ +{ + "schemaVersion": 1, + "repository": "https://github.com/worldcoin/mobile-bench-rs", + "release": "v0.1.43", + "version": "0.1.43", + "commitSha": "d1a3176f9144f35e777e83fd07045116144da257", + "manifestSha256": "b2de1cc240f21e7bde6f6386ac8d7aaee1ef2710b2bbf26c5e2d7fde95e561f5", + "syncedAt": "2026-07-15", + "buildPolicy": "offline-pinned" +} diff --git a/packages/truth/schemas/ci-contract-v1.schema.json b/packages/truth/schemas/ci-contract-v1.schema.json new file mode 100644 index 0000000..6d1d5a4 --- /dev/null +++ b/packages/truth/schemas/ci-contract-v1.schema.json @@ -0,0 +1,36 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://world.org/mobench/schemas/ci-contract-v1.schema.json", + "title": "Mobench CI Contract v1", + "type": "object", + "required": ["ci"], + "properties": { + "ci": { + "type": "object", + "required": ["metadata", "outputs"], + "properties": { + "metadata": { + "type": "object", + "required": ["requested_by", "request_command", "mobench_version"], + "properties": { + "requested_by": { "type": "string" }, + "pr_number": { "type": ["string", "null"] }, + "request_command": { "type": "string" }, + "mobench_ref": { "type": ["string", "null"] }, + "mobench_version": { "type": "string" } + } + }, + "outputs": { + "type": "object", + "required": ["summary_json", "summary_md", "results_csv"], + "properties": { + "summary_json": { "type": "string" }, + "summary_md": { "type": "string" }, + "results_csv": { "type": "string" } + } + } + } + } + }, + "additionalProperties": true +} diff --git a/packages/truth/schemas/mobench-site-manifest-v1.schema.json b/packages/truth/schemas/mobench-site-manifest-v1.schema.json new file mode 100644 index 0000000..74adf44 --- /dev/null +++ b/packages/truth/schemas/mobench-site-manifest-v1.schema.json @@ -0,0 +1,152 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://mobench.org/schemas/mobench-site-manifest-v1.schema.json", + "title": "Mobench website release manifest v1", + "type": "object", + "additionalProperties": false, + "required": [ + "schema_version", + "release", + "msrv", + "binaries", + "command_tree", + "config", + "artifacts", + "schemas", + "capabilities", + "evidence" + ], + "properties": { + "schema_version": { "const": 1 }, + "release": { + "type": "object", + "additionalProperties": false, + "required": ["version", "tag", "sha", "repository"], + "properties": { + "version": { "type": "string", "minLength": 1 }, + "tag": { "type": "string", "pattern": "^v" }, + "sha": { "type": "string", "pattern": "^[0-9a-fA-F]{40}$" }, + "repository": { "type": "string", "format": "uri" } + } + }, + "msrv": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+" }, + "binaries": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/binary" } }, + "command_tree": { "$ref": "#/$defs/command" }, + "config": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/config" } }, + "artifacts": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/artifact" } }, + "schemas": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/schema" } }, + "capabilities": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/capability" } }, + "evidence": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/evidence" } } + }, + "$defs": { + "status": { "enum": ["supported", "preview", "planned", "unsupported"] }, + "binary": { + "type": "object", + "additionalProperties": false, + "required": ["name", "invocation", "canonical_for_release", "status", "note"], + "properties": { + "name": { "type": "string" }, + "invocation": { "type": "string" }, + "canonical_for_release": { "type": "boolean" }, + "status": { "$ref": "#/$defs/status" }, + "note": { "type": "string" } + } + }, + "command": { + "type": "object", + "additionalProperties": false, + "required": ["name", "path", "about", "options", "subcommands"], + "properties": { + "name": { "type": "string" }, + "path": { "type": "string" }, + "about": { "type": ["string", "null"] }, + "options": { "type": "array", "items": { "$ref": "#/$defs/option" } }, + "subcommands": { "type": "array", "items": { "$ref": "#/$defs/command" } } + } + }, + "option": { + "type": "object", + "additionalProperties": false, + "required": ["id", "long", "short", "positional_index", "required", "global", "hidden", "action", "value_names", "possible_values", "defaults", "environment", "help"], + "properties": { + "id": { "type": "string" }, + "long": { "type": ["string", "null"] }, + "short": { "type": ["string", "null"], "maxLength": 1 }, + "positional_index": { "type": ["integer", "null"], "minimum": 1 }, + "required": { "type": "boolean" }, + "global": { "type": "boolean" }, + "hidden": { "type": "boolean" }, + "action": { "type": "string" }, + "value_names": { "type": "array", "items": { "type": "string" } }, + "possible_values": { "type": "array", "items": { "type": "string" } }, + "defaults": { "type": "array", "items": { "type": "string" } }, + "environment": { "type": ["string", "null"] }, + "help": { "type": ["string", "null"] } + } + }, + "config": { + "type": "object", + "additionalProperties": false, + "required": ["file", "keys"], + "properties": { + "file": { "type": "string" }, + "keys": { "type": "array", "items": { "$ref": "#/$defs/configKey" } } + } + }, + "configKey": { + "type": "object", + "additionalProperties": false, + "required": ["path", "value_type", "required", "default", "evidence_id"], + "properties": { + "path": { "type": "string" }, + "value_type": { "type": "string" }, + "required": { "type": "boolean" }, + "default": {}, + "evidence_id": { "type": "string" } + } + }, + "artifact": { + "type": "object", + "additionalProperties": false, + "required": ["id", "path_pattern", "produced_by", "description", "evidence_id"], + "properties": { + "id": { "type": "string" }, + "path_pattern": { "type": "string" }, + "produced_by": { "type": "array", "items": { "type": "string" } }, + "description": { "type": "string" }, + "evidence_id": { "type": "string" } + } + }, + "schema": { + "type": "object", + "additionalProperties": false, + "required": ["id", "path", "checksum_sha256"], + "properties": { + "id": { "type": "string" }, + "path": { "type": "string" }, + "checksum_sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" } + } + }, + "capability": { + "type": "object", + "additionalProperties": false, + "required": ["id", "status", "summary", "evidence_ids"], + "properties": { + "id": { "type": "string" }, + "status": { "$ref": "#/$defs/status" }, + "summary": { "type": "string" }, + "evidence_ids": { "type": "array", "minItems": 1, "items": { "type": "string" } } + } + }, + "evidence": { + "type": "object", + "additionalProperties": false, + "required": ["id", "kind", "reference"], + "properties": { + "id": { "type": "string" }, + "kind": { "enum": ["source", "test"] }, + "reference": { "type": "string" } + } + } + } +} diff --git a/packages/truth/schemas/summary-v1.schema.json b/packages/truth/schemas/summary-v1.schema.json new file mode 100644 index 0000000..9f452ae --- /dev/null +++ b/packages/truth/schemas/summary-v1.schema.json @@ -0,0 +1,75 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://world.org/mobench/schemas/summary-v1.schema.json", + "title": "Mobench Summary v1", + "type": "object", + "required": ["summary"], + "properties": { + "summary": { + "type": "object", + "required": [ + "generated_at", + "generated_at_unix", + "target", + "function", + "iterations", + "warmup", + "devices", + "device_summaries" + ], + "properties": { + "generated_at": { "type": "string" }, + "generated_at_unix": { "type": "integer" }, + "target": { "type": "string", "enum": ["android", "ios"] }, + "function": { "type": "string" }, + "iterations": { "type": "integer" }, + "warmup": { "type": "integer" }, + "devices": { + "type": "array", + "items": { "type": "string" } + }, + "device_summaries": { + "type": "array", + "items": { + "type": "object", + "required": ["device", "benchmarks"], + "properties": { + "device": { "type": "string" }, + "benchmarks": { + "type": "array", + "items": { + "type": "object", + "required": ["function", "samples"], + "properties": { + "function": { "type": "string" }, + "samples": { "type": "integer" }, + "mean_ns": { "type": ["integer", "null"] }, + "median_ns": { "type": ["integer", "null"] }, + "p95_ns": { "type": ["integer", "null"] }, + "min_ns": { "type": ["integer", "null"] }, + "max_ns": { "type": ["integer", "null"] }, + "resource_usage": { + "type": ["object", "null"], + "properties": { + "cpu_total_ms": { "type": ["integer", "null"] }, + "cpu_median_ms": { "type": ["integer", "null"] }, + "peak_memory_kb": { "type": ["integer", "null"] }, + "peak_memory_growth_kb": { "type": ["integer", "null"] }, + "process_peak_memory_kb": { "type": ["integer", "null"] }, + "total_pss_kb": { "type": ["integer", "null"] }, + "private_dirty_kb": { "type": ["integer", "null"] }, + "native_heap_kb": { "type": ["integer", "null"] }, + "java_heap_kb": { "type": ["integer", "null"] } + } + } + } + } + } + } + } + } + } + } + }, + "additionalProperties": true +} diff --git a/packages/truth/schemas/trace-events-v1.schema.json b/packages/truth/schemas/trace-events-v1.schema.json new file mode 100644 index 0000000..73e866e --- /dev/null +++ b/packages/truth/schemas/trace-events-v1.schema.json @@ -0,0 +1,59 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://world.org/mobench/schemas/trace-events-v1.schema.json", + "title": "Mobench Trace Events v1", + "type": "object", + "required": ["source", "total_duration_ns", "lanes"], + "properties": { + "source": { + "type": "object", + "required": ["kind", "profiler", "origin"], + "properties": { + "kind": { "type": "string" }, + "profiler": { "type": "string" }, + "origin": { "type": "string", "enum": ["local", "browserstack"] } + }, + "additionalProperties": false + }, + "total_duration_ns": { "type": "integer", "minimum": 0 }, + "lanes": { + "type": "array", + "items": { + "type": "object", + "required": ["id", "label", "events"], + "properties": { + "id": { "type": "string" }, + "label": { "type": "string" }, + "events": { + "type": "array", + "items": { + "type": "object", + "required": [ + "event_kind", + "start_offset_ns", + "end_offset_ns", + "frames", + "phase", + "iteration" + ], + "properties": { + "event_kind": { "type": "string" }, + "start_offset_ns": { "type": "integer", "minimum": 0 }, + "end_offset_ns": { "type": ["integer", "null"], "minimum": 0 }, + "frames": { + "type": "array", + "items": { "type": "string" } + }, + "phase": { "type": ["string", "null"] }, + "iteration": { "type": ["integer", "null"], "minimum": 0 } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false +} diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000..a7ace35 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,34 @@ +import { defineConfig } from '@playwright/test' + +export default defineConfig({ + testDir: './tests/e2e', + timeout: 30_000, + fullyParallel: false, + forbidOnly: true, + retries: 0, + reporter: [['list']], + snapshotPathTemplate: '{testDir}/__screenshots__/{testFilePath}/{arg}{ext}', + expect: { + timeout: 8_000, + toHaveScreenshot: { maxDiffPixelRatio: 0.01 }, + }, + use: { + browserName: 'chromium', + trace: 'retain-on-failure', + screenshot: 'only-on-failure', + }, + webServer: [ + { + command: 'bun run --cwd apps/marketing preview --host 127.0.0.1', + url: 'http://127.0.0.1:3000', + reuseExistingServer: true, + timeout: 30_000, + }, + { + command: 'bun run --cwd apps/docs preview --host 127.0.0.1', + url: 'http://127.0.0.1:3001', + reuseExistingServer: true, + timeout: 30_000, + }, + ], +}) diff --git a/scripts/generate-content.ts b/scripts/generate-content.ts new file mode 100644 index 0000000..b548a45 --- /dev/null +++ b/scripts/generate-content.ts @@ -0,0 +1,378 @@ +import { parse as parseYaml } from 'yaml' +import { mkdir, readFile, readdir, writeFile } from 'node:fs/promises' +import { dirname, join, relative, resolve } from 'node:path' + +const root = resolve(import.meta.dir, '..') +const docsRoot = join(root, 'apps/docs/src/content/docs') +const docsPublic = join(root, 'apps/docs/public') +const marketingPublic = join(root, 'apps/marketing/public') +const truthRoot = join(root, 'packages/truth') +const checkOnly = process.argv.includes('--check') + +type Frontmatter = { + slug: string + title: string + description: string + section?: string + order?: number + release?: string | number + draft?: boolean + aliases?: string[] + sourceRefs?: Array<{ label: string; url: string; evidence?: string }> +} +type Page = Frontmatter & { route: string; authoringRoute: string; body: string; file: string } + +type Redirect = { source: string; destination: string; permanent: true } + +type ManifestOption = { + id: string + long: string | null + short: string | null + positional_index: number | null + required: boolean + global: boolean + hidden: boolean + action: string + value_names: string[] + possible_values: string[] + defaults: string[] + environment: string | null + help: string | null +} +type ManifestCommand = { + name: string + path: string + about: string | null + options: ManifestOption[] + subcommands: ManifestCommand[] +} +type Manifest = { + release: { version: string; tag: string; sha: string; repository: string } + command_tree: ManifestCommand + config: Array<{ + file: string + keys: Array<{ path: string; value_type: string; required: boolean; default: unknown; evidence_id: string }> + }> + binaries: Array<{ name: string; canonical_for_release: boolean; status: string; note: string }> +} +type Pin = { version: string; release: string; commitSha: string } + +const legacyAliases = new Map([ + ['/home/', '/'], + ['/diagrams/', '/device-matrices/'], +]) + +async function filesUnder(directory: string): Promise { + const entries = await readdir(directory, { withFileTypes: true }) + return (await Promise.all(entries.map(async (entry) => { + const path = join(directory, entry.name) + return entry.isDirectory() ? filesUnder(path) : [path] + }))).flat().sort() +} + +async function loadPages(): Promise { + const pages: Page[] = [] + for (const file of (await filesUnder(docsRoot)).filter((path) => /\.mdx?$/.test(path))) { + const source = await readFile(file, 'utf8') + const match = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?/.exec(source) + if (!match) throw new Error(`${file} has no frontmatter`) + const data = parseYaml(match[1]) as Frontmatter + if (data.draft) continue + const route = data.slug === 'index' ? '/' : `/${data.slug}/` + const authoredSlug = relative(docsRoot, file).replaceAll('\\', '/').replace(/\.mdx?$/, '') + const authoringRoute = authoredSlug === 'index' ? '/' : `/${authoredSlug.replace(/\/index$/, '')}/` + pages.push({ ...data, file, route, authoringRoute, body: source.slice(match[0].length).trim() }) + } + return pages.sort((a, b) => (a.section ?? '').localeCompare(b.section ?? '') || (a.order ?? 999) - (b.order ?? 999) || a.title.localeCompare(b.title)) +} + +function normalizeRoute(pathname: string) { + return pathname === '/' ? '/' : `/${pathname.replace(/^\/+|\/+$/g, '')}/` +} + +function markdownCell(value: unknown) { + if (value === null || value === undefined || value === '') return '—' + const rendered = typeof value === 'string' ? value : JSON.stringify(value) + return rendered + .replaceAll('&', '&') + .replaceAll('<', '<') + .replaceAll('>', '>') + .replaceAll('{', '{') + .replaceAll('}', '}') + .replaceAll('|', '\\|') + .replaceAll('\n', ' ') +} + +function commandRows(rootCommand: ManifestCommand) { + const rows: ManifestCommand[] = [] + const visit = (command: ManifestCommand) => { + if (command.path !== rootCommand.path && !command.path.split(' ').includes('help')) rows.push(command) + for (const subcommand of command.subcommands) visit(subcommand) + } + visit(rootCommand) + return rows +} + +function flagLabel(option: ManifestOption) { + const names = [option.short ? `\`-${option.short}\`` : '', option.long ? `\`--${option.long}\`` : ''].filter(Boolean) + if (names.length) return names.join(', ') + return `\`<${option.value_names[0] ?? option.id}>\`` +} + +function valueContract(option: ManifestOption) { + if (option.action === 'SetTrue' || option.action === 'SetFalse') return 'boolean' + const values = option.possible_values.length ? option.possible_values.join(' | ') : option.value_names.join(', ') + return values ? `\`${values.replaceAll('|', '\\|')}\`` : 'boolean' +} + +function generatedCliReference(manifest: Manifest) { + const commands = commandRows(manifest.command_tree) + const globalOptions = manifest.command_tree.options.filter((option) => !option.hidden && option.long !== 'help' && option.long !== 'version') + const localOptions = new Map(commands.map((command) => [ + command.path, + command.options.filter((option) => !option.hidden && !option.global && option.long !== 'help'), + ])) + return [ + '{/* BEGIN GENERATED CLI REFERENCE */}', + '{/* Generated from @mobench/truth. Do not edit this section by hand. */}', + '', + '## Global flags', + '', + '| Flag | Value | Default | Purpose |', + '| --- | --- | --- | --- |', + ...globalOptions.map((option) => `| ${flagLabel(option)} | ${valueContract(option)} | ${markdownCell(option.defaults.join(', '))} | ${markdownCell(option.help)} |`), + '', + 'The generated CLI also provides `--help`, `-h`, `--version`, and `-V` where Clap exposes them.', + '', + '## Command index', + '', + '| Command | Purpose |', + '| --- | --- |', + ...commands.map((command) => `| \`${command.path}\` | ${markdownCell(command.about)} |`), + '', + '## Complete command flag index', + '', + 'Global flags above are omitted from each command row. Positional arguments use angle brackets.', + '', + ...commands.flatMap((command) => { + const options = localOptions.get(command.path) ?? [] + if (!options.length) return [] + return [ + `### \`${command.path}\``, + '', + '| Flag or argument | Value | Requirement | Purpose |', + '| --- | --- | --- | --- |', + ...options.map((option) => { + const requirement = option.required + ? 'required' + : option.defaults.length + ? `default: ${markdownCell(option.defaults.join(', '))}` + : 'optional' + return `| ${flagLabel(option)} | ${valueContract(option)} | ${requirement} | ${markdownCell(option.help)} |` + }), + '', + ] + }), + '', + '{/* END GENERATED CLI REFERENCE */}', + ].join('\n') +} + +function generatedConfigReference(manifest: Manifest) { + const lines = [ + '{/* BEGIN GENERATED CONFIG REFERENCE */}', + '{/* Generated from @mobench/truth. Do not edit this section by hand. */}', + '', + '## Published configuration keys', + '', + 'These are the complete configuration keys in the pinned release contract. Example files below may use only a task-specific subset.', + '', + ] + for (const config of manifest.config) { + lines.push( + `### \`${config.file}\``, + '', + '| Key | Value | Required | Default | Evidence |', + '| --- | --- | --- | --- | --- |', + ...config.keys.map((key) => `| \`${key.path}\` | \`${key.value_type}\` | ${key.required ? 'yes' : 'no'} | ${markdownCell(key.default)} | \`${key.evidence_id}\` |`), + '', + ) + } + lines.push('{/* END GENERATED CONFIG REFERENCE */}') + return lines.join('\n') +} + +async function syncGeneratedSection(path: string, label: string, generated: string) { + const source = await readFile(path, 'utf8') + const pattern = new RegExp(`\\{\\/\\* BEGIN GENERATED ${label} \\*\\/\\}[\\s\\S]*?\\{\\/\\* END GENERATED ${label} \\*\\/\\}`) + if (!pattern.test(source)) throw new Error(`${relative(root, path)} is missing the generated ${label.toLowerCase()} markers`) + await emit(path, source.replace(pattern, generated)) +} + +function vercelSource(route: string) { + return route === '/' ? '/' : route.replace(/\/$/, '') +} + +function routeAliases(pages: Page[]) { + const aliases = new Map(legacyAliases) + for (const page of pages) { + if (page.authoringRoute !== page.route) aliases.set(page.authoringRoute, page.route) + for (const alias of page.aliases ?? []) aliases.set(normalizeRoute(alias), page.route) + } + return aliases +} + +function redirectsForDocs(pages: Page[]): Redirect[] { + return [...routeAliases(pages)] + .filter(([source, destination]) => source !== destination) + .sort(([left], [right]) => left.localeCompare(right)) + .map(([source, destination]) => ({ + source: vercelSource(source), + destination, + permanent: true as const, + })) +} + +function redirectsForMarketing(pages: Page[]): Redirect[] { + const redirects = new Map() + redirects.set('/docs/:path*', 'https://docs.mobench.org/:path*') + for (const page of pages) { + if (page.route !== '/') redirects.set(vercelSource(page.route), `https://docs.mobench.org${page.route}`) + } + for (const [source, destination] of routeAliases(pages)) { + redirects.set(vercelSource(source), `https://docs.mobench.org${destination}`) + } + return [...redirects] + .sort(([left], [right]) => left.localeCompare(right)) + .map(([source, destination]) => ({ source, destination, permanent: true as const })) +} + +function vercelConfig(surface: 'marketing' | 'docs', redirects: Redirect[]) { + return { + $schema: 'https://openapi.vercel.sh/vercel.json', + framework: 'astro', + installCommand: 'cd ../.. && bun install --frozen-lockfile', + buildCommand: `cd ../.. && bun run generate && bun run build:${surface}`, + outputDirectory: 'dist', + redirects, + headers: [{ + source: '/(.*)', + headers: [ + { key: 'X-Content-Type-Options', value: 'nosniff' }, + { key: 'Referrer-Policy', value: 'strict-origin-when-cross-origin' }, + { key: 'Permissions-Policy', value: 'camera=(), microphone=(), geolocation=()' }, + ], + }], + } +} + +function renderIndex(pages: Page[], manifest: Manifest, pin: Pin) { + const canonicalBinary = manifest.binaries.find((binary) => binary.canonical_for_release) + const cargoWrapper = manifest.binaries.find((binary) => binary.name === 'cargo-mobench') + const lines = [ + '# mobench', + '', + `> Source-backed documentation for mobench ${pin.version}: build Android and iOS runners, execute ordinary benchmarks on BrowserStack devices, and analyze stable reports or supported local native profiles.`, + '', + 'Canonical documentation: https://docs.mobench.org/', + `Source: ${manifest.release.repository}/tree/${pin.release}`, + `Pinned release SHA: ${pin.commitSha}`, + '', + '## Capability boundary', + '', + `- Use the \`${canonicalBinary?.name ?? 'mobench'}\` executable for release ${pin.version}.${cargoWrapper?.status === 'unsupported' ? ' The published `cargo mobench` wrapper is unsupported.' : ''}`, + '- Ordinary mobile benchmarks execute through BrowserStack when devices are selected.', + '- `--local-only` is host preflight and does not measure Android or iOS execution.', + '- Local native profiling has a separate Android simpleperf and iOS simulator-host capability matrix.', + '- The release does not define an energy or battery measurement contract.', + '', + '## Documentation', + '', + ] + for (const page of pages) { + lines.push(`- [${page.title}](https://docs.mobench.org${page.route}): ${page.description}`) + } + lines.push( + '', + '## Stable command entry points', + '', + '```bash', + `cargo install mobench --version ${pin.version}`, + 'mobench list --crate-path bench-mobile', + 'mobench run --target android --function bench_mobile::checksum --local-only --output target/mobench/preflight.json', + 'mobench run --target android --function bench_mobile::checksum --devices "Google Pixel 7-13.0" --release --fetch --output target/mobench/results.json', + 'mobench ci run --target android --function bench_mobile::checksum --devices "Google Pixel 7-13.0" --release --fetch --output-dir target/mobench/ci', + 'mobench profile run --target android --provider local --backend android-native --function bench_mobile::checksum --output-dir target/mobench/profile', + '```', + '', + 'Full authored documentation: https://docs.mobench.org/llms-full.txt', + '', + ) + return lines.join('\n') +} + +function renderFull(pages: Page[], pin: Pin) { + return [ + '# mobench documentation — full authored text', + '', + `Release: ${pin.version}`, + 'Canonical origin: https://docs.mobench.org/', + '', + ...pages.flatMap((page) => [ + `# ${page.title}`, + '', + `Canonical URL: https://docs.mobench.org${page.route}`, + `Description: ${page.description}`, + ...(page.sourceRefs ?? []).map((source) => `Source: ${source.label} — ${source.url}${source.evidence ? ` — ${source.evidence}` : ''}`), + '', + page.body, + '', + ]), + ].join('\n') +} + +async function emit(path: string, content: string) { + const normalized = content.endsWith('\n') ? content : `${content}\n` + if (checkOnly) { + let existing = '' + try { existing = await readFile(path, 'utf8') } catch {} + if (existing !== normalized) throw new Error(`${relative(root, path)} is stale; run bun run generate`) + return + } + await mkdir(dirname(path), { recursive: true }) + await writeFile(path, normalized) +} + +const manifest = JSON.parse(await readFile(join(truthRoot, 'mobench-site-manifest-v1.json'), 'utf8')) as Manifest +const pin = JSON.parse(await readFile(join(truthRoot, 'pin.json'), 'utf8')) as Pin +await syncGeneratedSection( + join(docsRoot, 'reference/cli.mdx'), + 'CLI REFERENCE', + generatedCliReference(manifest), +) +await syncGeneratedSection( + join(docsRoot, 'reference/configuration.mdx'), + 'CONFIG REFERENCE', + generatedConfigReference(manifest), +) +const pages = await loadPages() +const index = renderIndex(pages, manifest, pin) +await emit(join(docsPublic, 'llms.txt'), index) +await emit(join(marketingPublic, 'llms.txt'), index) +await emit(join(docsPublic, 'llms-full.txt'), renderFull(pages, pin)) +for (const schema of ['summary-v1.schema.json', 'ci-contract-v1.schema.json', 'trace-events-v1.schema.json', 'mobench-site-manifest-v1.schema.json']) { + await emit(join(docsPublic, 'schemas', schema), await readFile(join(truthRoot, 'schemas', schema), 'utf8')) +} +await emit(join(docsPublic, 'manifests', 'mobench-site-manifest-v1.json'), await readFile(join(truthRoot, 'mobench-site-manifest-v1.json'), 'utf8')) +for (const fixture of ['summary-basic.json', 'summary-ffi.json']) { + await emit(join(docsPublic, 'fixtures', fixture), await readFile(join(truthRoot, 'fixtures', fixture), 'utf8')) +} +await emit( + join(root, 'apps/marketing/vercel.json'), + JSON.stringify(vercelConfig('marketing', redirectsForMarketing(pages)), null, 2), +) +await emit( + join(root, 'apps/docs/vercel.json'), + JSON.stringify(vercelConfig('docs', redirectsForDocs(pages)), null, 2), +) +console.log(`${checkOnly ? 'Checked' : 'Generated'} llms, truth assets, and redirect contracts from ${pages.length} authored pages.`) diff --git a/scripts/generate-og-images.py b/scripts/generate-og-images.py deleted file mode 100644 index c28fe12..0000000 --- a/scripts/generate-og-images.py +++ /dev/null @@ -1,240 +0,0 @@ -#!/usr/bin/env python3 -import json -from pathlib import Path - -from PIL import Image, ImageDraw, ImageFilter, ImageFont - - -ROOT = Path(__file__).resolve().parents[1] -OUT_DIR = ROOT / "public" / "og" -DATA = json.loads((ROOT / "src" / "og-pages.json").read_text()) -ARTWORK = Image.open(ROOT / "public" / "assets" / "mobench-bench.png").convert("RGB") - -W, H = 1200, 630 -PALETTE = { - "cream": "#f4efdd", - "cream_hi": "#fff9e9", - "ink": "#33271a", - "soft": "#46402f", - "muted": "#6e6453", - "faint": "#998c6f", - "green": "#3f7a2e", - "leaf": "#e6f1d5", - "line": "#d5cbb5", -} - -GROUP_ACCENTS = { - "Start": "#3f7a2e", - "Authoring": "#c2521d", - "Guides": "#287a8a", - "Reference": "#5e6f2f", - "Specs": "#9a6411", - "Codebase": "#356b26", - "Help": "#a7432a", -} - -SHORT_DESCRIPTIONS = { - "landing": "Benchmark Rust workloads on real Android and iOS devices.", - "docs": "Install, author, run, profile, and ship mobile Rust benchmarks.", - "overview": "What mobench is, why it exists, and where to go next.", - "quickstart": "Install mobench and run your first mobile benchmark.", - "install": "Set up Rust, Android, iOS, BrowserStack, and mobench.", - "concepts": "Understand runners, providers, reports, schemas, and profiling.", - "authoring": "Write #[benchmark] functions mobile runners can discover.", - "setup-teardown": "Keep setup and cleanup outside measured benchmark samples.", - "sdk": "Use mobench-sdk, runner backends, and native FFI exports.", - "build": "Generate and verify Android and iOS runner artifacts.", - "local-devices": "Run on attached devices, emulators, and simulators.", - "browserstack": "Run hosted real-device benchmarks in BrowserStack CI.", - "app-automate": "Upload Espresso and XCUITest suites to App Automate.", - "profiling": "Capture native traces, phases, flamegraphs, and profile diffs.", - "reports": "Read JSON summaries, Markdown reports, CSV rows, and artifacts.", - "cli-reference": "Every mobench command, flag, input, output, and example.", - "schemas": "Contracts for CI, summaries, traces, and fixtures.", - "examples": "Walk through benchmark and FFI examples.", - "diagrams": "Architecture, lifecycle, CI, profiling, and responsibility maps.", - "current-spec": f"Current behavior and API contracts for release {DATA['site']['version']}.", - "codebase": "Workspace layout, runtime layers, templates, and integrations.", - "testing": "Host tests, smoke checks, fixtures, CI, and profiling validation.", - "public-api": "Crates, feature flags, contracts, semver, MSRV, and releases.", - "troubleshooting": "Fix setup, build, provider, schema, and result issues.", -} - - -def font(size: int, bold: bool = False): - candidates = [ - "/System/Library/Fonts/Supplemental/Arial Bold.ttf" if bold else "/System/Library/Fonts/Supplemental/Arial.ttf", - "/System/Library/Fonts/Helvetica.ttc", - "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf" if bold else "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", - ] - for candidate in candidates: - try: - return ImageFont.truetype(candidate, size=size) - except OSError: - pass - return ImageFont.load_default(size=size) - - -FONT_LABEL = font(22, True) -FONT_BRAND = font(34, True) -FONT_VERSION = font(19) -FONT_PATH = font(19) -FONT_CHIP = font(18, True) - - -def text_width(draw: ImageDraw.ImageDraw, text: str, fnt: ImageFont.FreeTypeFont) -> int: - box = draw.textbbox((0, 0), text, font=fnt) - return box[2] - box[0] - - -def wrap(draw: ImageDraw.ImageDraw, text: str, fnt: ImageFont.FreeTypeFont, max_width: int, max_lines: int): - words = text.split() - lines = [] - line = "" - for word in words: - candidate = f"{line} {word}".strip() - if line and text_width(draw, candidate, fnt) > max_width: - lines.append(line) - line = word - else: - line = candidate - if len(lines) == max_lines: - break - if line and len(lines) < max_lines: - lines.append(line) - return lines - - -def rounded_paste(base: Image.Image, image: Image.Image, xy, radius: int): - mask = Image.new("L", image.size, 0) - mask_draw = ImageDraw.Draw(mask) - mask_draw.rounded_rectangle((0, 0, image.size[0], image.size[1]), radius=radius, fill=255) - base.paste(image, xy, mask) - - -def crop_artwork(size=(396, 486)): - target_w, target_h = size - src_w, src_h = ARTWORK.size - scale = max(target_w / src_w, target_h / src_h) - resized = ARTWORK.resize((round(src_w * scale), round(src_h * scale)), Image.Resampling.LANCZOS) - left = (resized.size[0] - target_w) // 2 - top = (resized.size[1] - target_h) // 2 - return resized.crop((left, top, left + target_w, top + target_h)) - - -def draw_background(draw: ImageDraw.ImageDraw, accent: str): - draw.rectangle((0, 0, W, H), fill=PALETTE["cream"]) - for x in range(0, W, 44): - draw.line((x, 0, x, H), fill="#e7dec8", width=1) - for y in range(0, H, 44): - draw.line((0, y, W, y), fill="#e7dec8", width=1) - draw.ellipse((858, -182, 1294, 254), fill="#dcebc9") - draw.ellipse((930, -28, 1214, 256), outline="#b7cba3", width=2) - draw.arc((-90, 438, 740, 740), 192, 350, fill="#c0d0a8", width=4) - draw.rounded_rectangle((38, 38, 1162, 592), radius=36, outline="#ded4bd", width=2) - draw.rounded_rectangle((54, 54, 1146, 576), radius=28, outline="#f8f2df", width=1) - - -def draw_artwork_card(base: Image.Image): - shadow = Image.new("RGBA", (510, 598), (0, 0, 0, 0)) - shadow_draw = ImageDraw.Draw(shadow) - shadow_draw.rounded_rectangle((36, 36, 472, 562), radius=38, fill=(51, 39, 26, 88)) - shadow = shadow.filter(ImageFilter.GaussianBlur(22)) - base.alpha_composite(shadow, (674, 20)) - - card = Image.new("RGBA", (436, 526), PALETTE["cream_hi"]) - card_draw = ImageDraw.Draw(card) - card_draw.rounded_rectangle((0, 0, 435, 525), radius=38, fill=PALETTE["cream_hi"], outline="#d7ccb7", width=2) - photo = crop_artwork() - rounded_paste(card, photo.convert("RGBA"), (20, 20), 30) - card_draw.rounded_rectangle((20, 20, 416, 506), radius=30, outline=(255, 255, 255, 136), width=2) - base.alpha_composite(card, (710, 52)) - - -def draw_chips(draw: ImageDraw.ImageDraw, items, accent: str): - x = 70 - for index, item in enumerate(items[:4]): - width = max(96, text_width(draw, item, FONT_CHIP) + 34) - fill = accent if index == 0 else PALETTE["leaf"] - text = "#fffdf4" if index == 0 else PALETTE["ink"] - outline = accent if index != 0 else None - draw.rounded_rectangle((x, 512, x + width, 554), radius=21, fill=fill, outline=outline, width=1) - draw.text((x + 17, 523), item, font=FONT_CHIP, fill=text) - x += width + 16 - - -def draw_card(filename: str, title: str, eyebrow: str, description: str, page_path: str, accent: str, chip_items): - canvas = Image.new("RGBA", (W, H), PALETTE["cream"]) - draw = ImageDraw.Draw(canvas) - draw_background(draw, accent) - draw_artwork_card(canvas) - - draw.text((70, 74), eyebrow.upper(), font=FONT_LABEL, fill=accent) - draw.text((70, 119), "mobench", font=FONT_BRAND, fill=PALETTE["ink"]) - version_x = 70 + text_width(draw, "mobench", FONT_BRAND) + 22 - draw.text((version_x, 133), DATA["site"]["version"], font=FONT_VERSION, fill=PALETTE["muted"]) - - title_font = font(76, True) - title_lines = wrap(draw, title, title_font, 610, 2) - if len(title_lines) == 1: - title_font = font(84, True) - title_lines = wrap(draw, title, title_font, 610, 1) - title_y = 194 - desc_y = 352 - else: - title_y = 184 - desc_y = 374 - - for i, line in enumerate(title_lines): - draw.text((70, title_y + i * 82), line, font=title_font, fill=PALETTE["ink"]) - - desc_font = font(34, True) - desc_lines = wrap(draw, description, desc_font, 620, 2) - for i, line in enumerate(desc_lines): - draw.text((73, desc_y + i * 44), line, font=desc_font, fill=PALETTE["soft"]) - - draw_chips(draw, chip_items, accent) - draw.text((70, 570), page_path, font=FONT_PATH, fill=PALETTE["faint"]) - canvas.convert("RGB").save(OUT_DIR / f"{filename}.jpg", quality=92, optimize=True, progressive=True) - - -def main(): - OUT_DIR.mkdir(parents=True, exist_ok=True) - for old_svg in OUT_DIR.glob("*.svg"): - old_svg.unlink() - - draw_card( - "landing", - "Benchmark Rust on real mobile", - DATA["landing"]["eyebrow"], - SHORT_DESCRIPTIONS["landing"], - "/", - PALETTE["green"], - ["Rust", "Android", "iOS", "BrowserStack"], - ) - draw_card( - "docs", - "Docs for mobile Rust benchmarking", - DATA["docsRoot"]["eyebrow"], - SHORT_DESCRIPTIONS["docs"], - "/docs", - PALETTE["green"], - ["CLI", "SDK", "Reports", "Profiling"], - ) - - for page in DATA["docsPages"]: - draw_card( - page["id"], - page["label"], - f'{page["group"]} / docs', - SHORT_DESCRIPTIONS.get(page["id"], page["description"]), - "/docs" if page["id"] == "overview" else f'/{page["id"]}', - GROUP_ACCENTS.get(page["group"], PALETTE["green"]), - [page["group"], "mobench", DATA["site"]["version"]], - ) - - print(f"Generated {2 + len(DATA['docsPages'])} OG JPGs in public/og") - - -if __name__ == "__main__": - main() diff --git a/scripts/generate-og.ts b/scripts/generate-og.ts new file mode 100644 index 0000000..fc78754 --- /dev/null +++ b/scripts/generate-og.ts @@ -0,0 +1,90 @@ +import sharp from 'sharp' +import { parse as parseYaml } from 'yaml' +import { mkdir, readFile, readdir, writeFile } from 'node:fs/promises' +import { dirname, join, relative, resolve } from 'node:path' +import pin from '@mobench/truth/pin' + +const root = resolve(import.meta.dir, '..') +const docsRoot = join(root, 'apps/docs/src/content/docs') +const checkOnly = process.argv.includes('--check') + +type Page = { title: string; description: string; section?: string; slug: string; release: string | number; draft?: boolean } + +async function filesUnder(directory: string): Promise { + const entries = await readdir(directory, { withFileTypes: true }) + return (await Promise.all(entries.map(async (entry) => { + const path = join(directory, entry.name) + return entry.isDirectory() ? filesUnder(path) : [path] + }))).flat().sort() +} + +function escapeXml(value: string) { + return value.replaceAll('&', '&').replaceAll('<', '<').replaceAll('>', '>').replaceAll('"', '"') +} + +function wrapTitle(title: string, max = 26) { + const lines: string[] = [] + let line = '' + for (const word of title.split(/\s+/)) { + if (line && `${line} ${word}`.length > max) { + lines.push(line) + line = word + } else { + line = line ? `${line} ${word}` : word + } + } + if (line) lines.push(line) + return lines.slice(0, 3) +} + +function artwork(page: Page) { + const title = wrapTitle(page.title) + const titleLines = title.map((line, index) => `${escapeXml(line)}`).join('') + return ` + + + + + + m + mobench docs + + v${escapeXml(String(page.release))} + ${escapeXml((page.section ?? 'DOCUMENTATION').toUpperCase())} + ${titleLines} + + + + MOBILE RUNNER + RUST + + docs.mobench.org/${page.slug === 'index' ? '' : escapeXml(page.slug)} + ` +} + +async function emit(path: string, output: Buffer) { + if (checkOnly) { + let existing: Buffer | undefined + try { existing = await readFile(path) } catch {} + if (!existing?.equals(output)) throw new Error(`${relative(root, path)} is stale; run bun run generate`) + } else { + await mkdir(dirname(path), { recursive: true }) + await writeFile(path, output) + } +} + +const pages: Page[] = [] +for (const file of (await filesUnder(docsRoot)).filter((path) => /\.mdx?$/.test(path))) { + const source = await readFile(file, 'utf8') + const frontmatter = /^---\r?\n([\s\S]*?)\r?\n---/.exec(source) + if (!frontmatter) throw new Error(`${file} has no frontmatter`) + const page = parseYaml(frontmatter[1]) as Page + if (!page.draft) pages.push(page) +} +for (const page of pages) { + const png = await sharp(Buffer.from(artwork(page))).png({ compressionLevel: 9, palette: true }).toBuffer() + await emit(join(root, 'apps/docs/public/og', `${page.slug}.png`), png) +} +const landing: Page = { title: 'Rust benchmarks, measured on mobile.', description: '', section: 'mobench', slug: 'landing', release: pin.version } +await emit(join(root, 'apps/marketing/public/og/landing.png'), await sharp(Buffer.from(artwork(landing))).png({ compressionLevel: 9, palette: true }).toBuffer()) +console.log(`${checkOnly ? 'Checked' : 'Generated'} ${pages.length + 1} responsive social images.`) diff --git a/scripts/generate-route-html.mjs b/scripts/generate-route-html.mjs deleted file mode 100644 index c9b8f0f..0000000 --- a/scripts/generate-route-html.mjs +++ /dev/null @@ -1,82 +0,0 @@ -import fs from 'node:fs' -import path from 'node:path' - -const root = process.cwd() -const distDir = path.join(root, 'dist') -const data = JSON.parse(fs.readFileSync(path.join(root, 'src/og-pages.json'), 'utf8')) -const baseHtml = fs.readFileSync(path.join(distDir, 'index.html'), 'utf8') - -function absoluteUrl(base, routePath) { - return `${base}${routePath.startsWith('/') ? routePath : `/${routePath}`}` -} - -function replaceAttr(html, selector, attr, value) { - const escaped = value.replaceAll('&', '&').replaceAll('"', '"') - if (selector.startsWith('title')) { - return html.replace(/.*?<\/title>/, `<title>${escaped}`) - } - - if (selector.startsWith('link')) { - return html.replace(//, ``) - } - - const key = selector.match(/\[(name|property)="([^"]+)"\]/) - if (!key) return html - const [_, kind, name] = key - const pattern = new RegExp(``) - return html.replace(pattern, ``) -} - -function pageHtml({ title, description, url, image }) { - let html = baseHtml - html = replaceAttr(html, 'title', 'content', title) - html = replaceAttr(html, 'meta[name="description"]', 'content', description) - html = replaceAttr(html, 'link[rel="canonical"]', 'href', url) - html = replaceAttr(html, 'meta[property="og:title"]', 'content', title) - html = replaceAttr(html, 'meta[property="og:description"]', 'content', description) - html = replaceAttr(html, 'meta[property="og:url"]', 'content', url) - html = replaceAttr(html, 'meta[property="og:image"]', 'content', image) - html = replaceAttr(html, 'meta[name="twitter:title"]', 'content', title) - html = replaceAttr(html, 'meta[name="twitter:description"]', 'content', description) - html = replaceAttr(html, 'meta[name="twitter:image"]', 'content', image) - return html -} - -function writeRoute(routePath, target) { - const clean = routePath.replace(/^\/+|\/+$/g, '') - const outputDir = clean ? path.join(distDir, clean) : distDir - fs.mkdirSync(outputDir, { recursive: true }) - fs.writeFileSync(path.join(outputDir, 'index.html'), pageHtml(target)) -} - -writeRoute('/docs', { - title: 'mobench docs - Rust mobile benchmark documentation', - description: data.docsRoot.description, - url: absoluteUrl(data.site.docsUrl, '/docs'), - image: absoluteUrl(data.site.docsUrl, data.docsRoot.image), -}) - -for (const page of data.docsPages) { - const routePath = page.id === 'overview' ? '/overview' : `/${page.id}` - writeRoute(routePath, { - title: `${page.label} - mobench docs`, - description: page.description, - url: absoluteUrl(data.site.docsUrl, routePath), - image: absoluteUrl(data.site.docsUrl, `/og/${page.id}.jpg`), - }) -} - -for (const [alias, id] of Object.entries(data.aliases)) { - if (alias === 'docs') continue - const page = data.docsPages.find((candidate) => candidate.id === id) - if (!page) continue - const routePath = `/${alias}` - writeRoute(routePath, { - title: `${page.label} - mobench docs`, - description: page.description, - url: absoluteUrl(data.site.docsUrl, routePath), - image: absoluteUrl(data.site.docsUrl, `/og/${page.id}.jpg`), - }) -} - -console.log('Generated static route HTML for docs Open Graph metadata') diff --git a/scripts/sync-release.ts b/scripts/sync-release.ts new file mode 100644 index 0000000..e1ef86c --- /dev/null +++ b/scripts/sync-release.ts @@ -0,0 +1,221 @@ +import Ajv2020 from 'ajv/dist/2020' +import { createHash } from 'node:crypto' +import { mkdir, readFile, readdir, writeFile } from 'node:fs/promises' +import { basename, dirname, join, resolve } from 'node:path' + +const root = resolve(import.meta.dir, '..') +const truthRoot = join(root, 'packages/truth') +const upstreamRepository = 'https://github.com/worldcoin/mobile-bench-rs' +const upstreamSlug = 'worldcoin/mobile-bench-rs' +const manifestName = 'mobench-site-manifest-v1.json' + +const usage = `Usage: + bun run sync:release -- --tag vX.Y.Z --expected-manifest-sha256 + +Downloads the manifest release asset, resolves the exact tag commit, verifies all +schema and fixture snapshots against that commit, then updates the offline truth +package. The command never reads mobile-bench-rs/main. + +Required: + --tag Explicit stable release tag + --expected-manifest-sha256 Trusted SHA-256 from the release checksum asset + +Environment: + GH_TOKEN or GITHUB_TOKEN Optional for local use; required in GitHub Actions +` + +type Arguments = { tag?: string; expectedManifestSha256?: string; help: boolean } +type ReleaseAsset = { name: string; url: string } +type Release = { tag_name: string; draft: boolean; prerelease: boolean; assets: ReleaseAsset[] } +type GitObject = { type: 'commit' | 'tag'; sha: string } +type GitRef = { object: GitObject } +type GitTag = { object: GitObject } +type Manifest = { + schema_version: number + release: { version: string; tag: string; sha: string; repository: string } + schemas: Array<{ id: string; path: string; checksum_sha256: string }> +} +type Pin = { + schemaVersion: number + repository: string + release: string + version: string + commitSha: string + manifestSha256: string + syncedAt: string + buildPolicy: string +} + +function parseArguments(argv: string[]): Arguments { + const parsed: Arguments = { help: false } + for (let index = 0; index < argv.length; index += 1) { + const argument = argv[index] + if (argument === '--help' || argument === '-h') { + parsed.help = true + continue + } + const value = argv[index + 1] + if (!value || value.startsWith('--')) throw new Error(`${argument} requires a value`) + if (argument === '--tag') parsed.tag = value + else if (argument === '--expected-manifest-sha256') parsed.expectedManifestSha256 = value.toLowerCase() + else throw new Error(`Unknown argument: ${argument}`) + index += 1 + } + return parsed +} + +function sha256(bytes: Uint8Array | string) { + return createHash('sha256').update(bytes).digest('hex') +} + +function requestHeaders(accept = 'application/vnd.github+json') { + const token = process.env.GH_TOKEN ?? process.env.GITHUB_TOKEN + return { + Accept: accept, + 'User-Agent': 'mobench-site-release-sync', + 'X-GitHub-Api-Version': '2022-11-28', + ...(token ? { Authorization: `Bearer ${token}` } : {}), + } +} + +async function fetchBytes(url: string, accept?: string) { + const response = await fetch(url, { headers: requestHeaders(accept), redirect: 'follow' }) + if (!response.ok) throw new Error(`${response.status} ${response.statusText} while fetching ${url}`) + return new Uint8Array(await response.arrayBuffer()) +} + +async function fetchJson(url: string): Promise { + return JSON.parse(new TextDecoder().decode(await fetchBytes(url))) as T +} + +function githubApi(path: string) { + return `https://api.github.com/repos/${upstreamSlug}${path}` +} + +async function resolveTagCommit(tag: string) { + const reference = await fetchJson(githubApi(`/git/ref/tags/${encodeURIComponent(tag)}`)) + let object = reference.object + for (let depth = 0; object.type === 'tag' && depth < 4; depth += 1) { + object = (await fetchJson(githubApi(`/git/tags/${object.sha}`))).object + } + if (object.type !== 'commit') throw new Error(`Tag ${tag} did not resolve to a commit`) + return object.sha +} + +async function filesUnder(directory: string): Promise { + const entries = await readdir(directory, { withFileTypes: true }) + return (await Promise.all(entries.map(async (entry) => { + const path = join(directory, entry.name) + return entry.isDirectory() ? filesUnder(path) : [path] + }))).flat().sort() +} + +async function verifiedReleaseInputs(tag: string, expectedChecksum: string) { + const release = await fetchJson(githubApi(`/releases/tags/${encodeURIComponent(tag)}`)) + if (release.tag_name !== tag || release.draft || release.prerelease) throw new Error(`${tag} is not a published stable release`) + const asset = release.assets.find((candidate) => candidate.name === manifestName) + if (!asset) throw new Error(`${tag} does not publish ${manifestName}`) + const manifestBytes = await fetchBytes(asset.url, 'application/octet-stream') + const actualChecksum = sha256(manifestBytes) + if (actualChecksum !== expectedChecksum) { + throw new Error(`Manifest checksum mismatch: expected ${expectedChecksum}, received ${actualChecksum}`) + } + const manifest = JSON.parse(new TextDecoder().decode(manifestBytes)) as Manifest + const version = tag.replace(/^v/, '') + const commitSha = await resolveTagCommit(tag) + if (manifest.schema_version !== 1) throw new Error(`Unsupported manifest schema ${manifest.schema_version}`) + if (manifest.release.tag !== tag || manifest.release.version !== version) throw new Error('Manifest release identity does not match the requested tag') + if (manifest.release.sha !== commitSha) throw new Error('Manifest commit does not match the resolved release tag') + if (manifest.release.repository !== upstreamRepository) throw new Error(`Unexpected manifest repository: ${manifest.release.repository}`) + + const snapshots = new Map() + for (const schema of manifest.schemas) { + const bytes = await fetchBytes(`https://raw.githubusercontent.com/${upstreamSlug}/${commitSha}/${schema.path}`) + if (sha256(bytes) !== schema.checksum_sha256) throw new Error(`Schema checksum mismatch for ${schema.id}`) + snapshots.set(`schemas/${basename(schema.path)}`, bytes) + } + for (const [source, target] of [ + ['examples/fixtures/basic/summary.json', 'fixtures/summary-basic.json'], + ['examples/fixtures/ffi/summary.json', 'fixtures/summary-ffi.json'], + ] as const) { + snapshots.set(target, await fetchBytes(`https://raw.githubusercontent.com/${upstreamSlug}/${commitSha}/${source}`)) + } + + const manifestSchema = snapshots.get('schemas/mobench-site-manifest-v1.schema.json') + const summarySchema = snapshots.get('schemas/summary-v1.schema.json') + if (!manifestSchema || !summarySchema) throw new Error('Manifest does not reference the required website and summary schemas') + const ajv = new Ajv2020({ allErrors: true, strict: false, validateFormats: false }) + const validateManifest = ajv.compile(JSON.parse(new TextDecoder().decode(manifestSchema))) + if (!validateManifest(manifest)) throw new Error(`Manifest schema errors: ${ajv.errorsText(validateManifest.errors)}`) + const validateSummary = ajv.compile(JSON.parse(new TextDecoder().decode(summarySchema))) + for (const fixture of ['fixtures/summary-basic.json', 'fixtures/summary-ffi.json']) { + const value = JSON.parse(new TextDecoder().decode(snapshots.get(fixture)!)) + if (!validateSummary(value)) throw new Error(`${fixture} schema errors: ${ajv.errorsText(validateSummary.errors)}`) + } + return { manifest, manifestBytes, snapshots, version, commitSha, actualChecksum } +} + +function replaceReleaseIdentity(source: string, previous: Pin, next: Pin) { + return source + .replaceAll(previous.commitSha, next.commitSha) + .replaceAll(previous.release, next.release) + .replaceAll(previous.version, next.version) + .replace(/^lastVerified:\s*\d{4}-\d{2}-\d{2}$/gm, `lastVerified: ${next.syncedAt}`) +} + +async function writeVerifiedInputs(input: Awaited>, previous: Pin) { + const next: Pin = { + schemaVersion: 1, + repository: upstreamRepository, + release: input.manifest.release.tag, + version: input.manifest.release.version, + commitSha: input.commitSha, + manifestSha256: input.actualChecksum, + syncedAt: new Date().toISOString().slice(0, 10), + buildPolicy: 'offline-pinned', + } + await writeFile(join(truthRoot, manifestName), input.manifestBytes) + for (const [relativePath, bytes] of input.snapshots) { + const path = join(truthRoot, relativePath) + await mkdir(dirname(path), { recursive: true }) + await writeFile(path, bytes) + } + await writeFile(join(truthRoot, 'pin.json'), `${JSON.stringify(next, null, 2)}\n`) + + const packagePath = join(truthRoot, 'package.json') + const packageJson = JSON.parse(await readFile(packagePath, 'utf8')) as Record + packageJson.version = next.version + await writeFile(packagePath, `${JSON.stringify(packageJson, null, 2)}\n`) + + const versionedFiles = [ + ...(await filesUnder(join(root, 'apps/docs/src/content/docs'))).filter((path) => /\.mdx?$/.test(path)), + join(root, 'apps/marketing/src/pages/index.astro'), + join(root, 'README.md'), + join(root, 'docs/AUTHORING.md'), + join(root, 'packages/truth/README.md'), + ] + for (const path of versionedFiles) { + const source = await readFile(path, 'utf8') + const updated = replaceReleaseIdentity(source, previous, next) + if (updated !== source) await writeFile(path, updated) + } + console.log(`Pinned mobench ${next.release} at ${next.commitSha} (${next.manifestSha256}).`) + console.log('Run bun install, bun run generate, and the complete validation suite before opening a pull request.') +} + +async function main() { + const args = parseArguments(process.argv.slice(2)) + if (args.help) { + console.log(usage) + return + } + if (!args.tag || !/^v\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/.test(args.tag)) throw new Error('--tag must be an explicit vX.Y.Z release tag') + if (!args.expectedManifestSha256 || !/^[0-9a-f]{64}$/.test(args.expectedManifestSha256)) { + throw new Error('--expected-manifest-sha256 must be a 64-character hexadecimal checksum') + } + const previous = JSON.parse(await readFile(join(truthRoot, 'pin.json'), 'utf8')) as Pin + const input = await verifiedReleaseInputs(args.tag, args.expectedManifestSha256) + await writeVerifiedInputs(input, previous) +} + +await main() diff --git a/scripts/validate-content.ts b/scripts/validate-content.ts new file mode 100644 index 0000000..f09c8f7 --- /dev/null +++ b/scripts/validate-content.ts @@ -0,0 +1,303 @@ +import { parse as parseYaml } from 'yaml' +import Ajv2020 from 'ajv/dist/2020' +import { createHash } from 'node:crypto' +import { readFile, readdir } from 'node:fs/promises' +import { extname, join, relative, resolve } from 'node:path' + +const root = resolve(import.meta.dir, '..') +const docsRoot = join(root, 'apps/docs/src/content/docs') +const manifestPath = join(root, 'packages/truth/mobench-site-manifest-v1.json') +const pinPath = join(root, 'packages/truth/pin.json') + +type OptionContract = { long: string | null } +type CommandContract = { + name: string + path: string + options: OptionContract[] + subcommands: CommandContract[] +} +type Manifest = { + schema_version: number + release: { version: string; tag: string; sha: string; repository: string } + binaries: Array<{ name: string; canonical_for_release: boolean; status: string }> + command_tree: CommandContract + schemas: Array<{ id: string; path: string; checksum_sha256: string }> + config: Array<{ + file: string + keys: Array<{ path: string; evidence_id: string }> + }> + capabilities: Array<{ id: string; status: string; evidence_ids: string[] }> + evidence: Array<{ id: string }> +} +type Frontmatter = { + slug?: string + title?: string + description?: string + release?: string | number + lastVerified?: string | Date + sourceRefs?: Array<{ label?: string; url?: string; evidence?: string }> + aliases?: string[] + draft?: boolean +} +type Page = { + file: string + route: string + data: Frontmatter + body: string +} + +const failures: string[] = [] +const fail = (message: string) => failures.push(message) + +async function filesUnder(directory: string): Promise { + const entries = await readdir(directory, { withFileTypes: true }) + const nested = await Promise.all(entries.map(async (entry) => { + const path = join(directory, entry.name) + return entry.isDirectory() ? filesUnder(path) : [path] + })) + return nested.flat().sort() +} + +function parsePage(file: string, source: string): Page { + const match = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?/.exec(source) + if (!match) throw new Error('missing YAML frontmatter') + const data = parseYaml(match[1]) as Frontmatter + const path = relative(docsRoot, file).replaceAll('\\', '/').replace(/\.mdx?$/, '') + const slug = data.slug ?? (path === 'index' ? 'index' : path.replace(/\/index$/, '')) + return { file, route: slug === 'index' ? '/' : `/${slug}/`, data, body: source.slice(match[0].length) } +} + +function shellTokens(command: string): string[] { + return command.match(/(?:"[^"]*"|'[^']*'|[^\s])+/g)?.map((token) => token.replace(/^(?:"|')|(?:"|')$/g, '')) ?? [] +} + +function commandLines(body: string): string[] { + const commands: string[] = [] + const fence = /```(?:bash|console|sh)(?:[^\n]*)\n([\s\S]*?)```/g + for (const block of body.matchAll(fence)) { + let pending = '' + for (const rawLine of block[1].split(/\r?\n/)) { + const line = rawLine.trim().replace(/^\$\s+/, '') + if (!line || line.startsWith('#')) continue + if (/^(export|unset)\s/.test(line)) continue + pending += `${pending ? ' ' : ''}${line.replace(/\\$/, '').trim()}` + if (!line.endsWith('\\')) { + if (pending.startsWith('mobench ')) commands.push(pending) + pending = '' + } + } + if (pending.startsWith('mobench ')) commands.push(pending) + } + return commands +} + +function taggedJsonExamples(body: string) { + return [...body.matchAll(/```json[^\n]*\btest=schema:([^\s]+)[^\n]*\n([\s\S]*?)```/g)] + .map((match) => ({ schemaId: match[1], source: match[2] })) +} + +function taggedConfigExamples(body: string) { + return [...body.matchAll(/```toml[^\n]*\btest=config:([^\s]+)[^\n]*\n([\s\S]*?)```/g)] + .map((match) => ({ file: match[1], source: match[2] })) +} + +function tomlKeyPaths(source: string) { + const keys: string[] = [] + let section = '' + for (const rawLine of source.split(/\r?\n/)) { + const line = rawLine.replace(/\s+#.*$/, '').trim() + const sectionMatch = /^\[([A-Za-z0-9_.-]+)\]$/.exec(line) + if (sectionMatch) { + section = sectionMatch[1] + continue + } + const keyMatch = /^([A-Za-z0-9_.-]+)\s*=/.exec(line) + if (keyMatch) keys.push(section ? `${section}.${keyMatch[1]}` : keyMatch[1]) + } + return keys +} + +function validateCommand(command: string, rootCommand: CommandContract, context: string) { + const tokens = shellTokens(command) + if (tokens[0] !== 'mobench') return + let current = rootCommand + const chain = [rootCommand] + for (const token of tokens.slice(1)) { + if (token.startsWith('-')) continue + const next = current.subcommands.find((candidate) => candidate.name === token) + if (!next) continue + current = next + chain.push(next) + } + const allowed = new Set(chain.flatMap((node) => node.options.flatMap((option) => option.long ? [`--${option.long}`] : []))) + for (const token of tokens.slice(1)) { + if (!token.startsWith('--')) continue + const flag = token.split('=', 1)[0] + if (!allowed.has(flag)) fail(`${context}: unknown option ${flag} in \`${command}\``) + } + const commandPath = chain.map((node) => node.name).join(' ') + const flags = new Set(tokens.filter((token) => token.startsWith('--')).map((token) => token.split('=', 1)[0])) + if (commandPath === 'mobench ci run' && flags.has('--browserstack')) fail(`${context}: ci run does not accept --browserstack`) + if (commandPath === 'mobench ci run' && flags.has('--output')) fail(`${context}: ci run requires --output-dir`) + if (commandPath === 'mobench profile run' && flags.has('--output')) fail(`${context}: profile run requires --output-dir`) +} + +function normalizeRoute(pathname: string) { + if (extname(pathname)) return pathname + return pathname === '/' ? '/' : `${pathname.replace(/\/$/, '')}/` +} + +function validateLinks(page: Page, canonicalRoutes: Set, aliasRoutes: Set) { + for (const match of page.body.matchAll(/\[[^\]]+\]\(([^)]+)\)/g)) { + const href = match[1].trim().replace(/^<|>$/g, '') + if (!href || href.startsWith('#') || /^[a-z][a-z0-9+.-]*:/i.test(href)) continue + const resolved = new URL(href, `https://docs.mobench.org${page.route}`) + const route = normalizeRoute(resolved.pathname) + if (!canonicalRoutes.has(route) && !aliasRoutes.has(route)) { + fail(`${relative(root, page.file)}: internal link ${href} resolves to missing ${route}`) + } + } +} + +async function main() { + const [manifestSource, pinSource] = await Promise.all([ + readFile(manifestPath, 'utf8'), + readFile(pinPath, 'utf8'), + ]) + const manifest = JSON.parse(manifestSource) as Manifest + const pin = JSON.parse(pinSource) as { + release: string + version: string + commitSha: string + manifestSha256: string + } + const manifestChecksum = createHash('sha256').update(manifestSource).digest('hex') + if (manifestChecksum !== pin.manifestSha256) fail('pinned manifest checksum does not match pin.json') + if (manifest.schema_version !== 1) fail(`unsupported manifest schema ${manifest.schema_version}`) + if (manifest.release.tag !== pin.release || manifest.release.version !== pin.version || manifest.release.sha !== pin.commitSha) { + fail('manifest release identity does not match pin.json') + } + if (manifest.release.repository !== 'https://github.com/worldcoin/mobile-bench-rs') fail('unexpected upstream repository') + const ajv = new Ajv2020({ allErrors: true, strict: false, validateFormats: false }) + const manifestSchemaSource = await readFile(join(root, 'packages/truth/schemas/mobench-site-manifest-v1.schema.json'), 'utf8') + const validateManifest = ajv.compile(JSON.parse(manifestSchemaSource)) + if (!validateManifest(manifest)) fail(`manifest JSON Schema errors: ${ajv.errorsText(validateManifest.errors)}`) + const schemaValidators = new Map>() + for (const schema of manifest.schemas) { + const source = await readFile(join(root, 'packages/truth/schemas', schema.path.split('/').at(-1)!), 'utf8') + const checksum = createHash('sha256').update(source).digest('hex') + if (checksum !== schema.checksum_sha256) fail(`schema checksum mismatch for ${schema.id}`) + schemaValidators.set( + schema.id, + schema.id === 'mobench-site-manifest-v1' ? validateManifest : ajv.compile(JSON.parse(source)), + ) + } + const validateSummary = schemaValidators.get('summary-v1')! + for (const fixture of ['summary-basic.json', 'summary-ffi.json']) { + const value = JSON.parse(await readFile(join(root, 'packages/truth/fixtures', fixture), 'utf8')) + if (!validateSummary(value)) fail(`${fixture} schema errors: ${ajv.errorsText(validateSummary.errors)}`) + } + const canonicalBinary = manifest.binaries.find((binary) => binary.canonical_for_release) + if (canonicalBinary?.name !== 'mobench' || canonicalBinary.status !== 'supported') fail('mobench must be the supported canonical release binary') + const cargoWrapper = manifest.binaries.find((binary) => binary.name === 'cargo-mobench') + if (!cargoWrapper) fail('manifest must describe the cargo-mobench wrapper') + if (cargoWrapper?.canonical_for_release) fail('cargo-mobench must not replace the canonical mobench executable') + const evidenceIds = new Set(manifest.evidence.map((item) => item.id)) + for (const capability of manifest.capabilities) { + if (!['supported', 'preview', 'planned', 'unsupported'].includes(capability.status)) fail(`invalid capability status for ${capability.id}`) + if (!capability.evidence_ids.length || capability.evidence_ids.some((id) => !evidenceIds.has(id))) fail(`capability ${capability.id} has invalid evidence`) + } + const configKeys = new Map(manifest.config.map((entry) => [ + entry.file, + new Set(entry.keys.map((key) => key.path)), + ])) + + const pages: Page[] = [] + for (const file of (await filesUnder(docsRoot)).filter((path) => /\.mdx?$/.test(path))) { + try { + pages.push(parsePage(file, await readFile(file, 'utf8'))) + } catch (error) { + fail(`${relative(root, file)}: ${error instanceof Error ? error.message : error}`) + } + } + const canonicalRoutes = new Set() + const aliasRoutes = new Set() + let cliPage: Page | undefined + let configurationPage: Page | undefined + for (const page of pages) { + const name = relative(root, page.file) + if (canonicalRoutes.has(page.route)) fail(`${name}: duplicate route ${page.route}`) + canonicalRoutes.add(page.route) + if (!page.data.title || !page.data.description) fail(`${name}: title and description are required`) + if (String(page.data.release) !== pin.version) fail(`${name}: release must be ${pin.version}`) + if (!page.data.lastVerified) fail(`${name}: lastVerified is required`) + if (!page.data.sourceRefs?.length) fail(`${name}: at least one sourceRefs entry is required`) + for (const source of page.data.sourceRefs ?? []) { + if (!source.label || !source.url || !source.evidence) fail(`${name}: each source reference needs label, url, and evidence`) + if (source.url?.includes('github.com/worldfnd/mobile-bench-rs')) fail(`${name}: source URL uses the wrong GitHub organization`) + } + for (const alias of page.data.aliases ?? []) { + const route = normalizeRoute(alias) + if (aliasRoutes.has(route)) fail(`${name}: duplicate alias ${route}`) + aliasRoutes.add(route) + } + const copy = `${page.data.title}\n${page.data.description}\n${page.body}` + if (cargoWrapper?.status !== 'supported' && /cargo\s+mobench\b/.test(copy)) fail(`${name}: stable examples must use the mobench executable`) + if (/--local(?!-only)\b/.test(copy)) fail(`${name}: invalid --local option`) + if (/95\s*[%–-]\s*99\s*%|95%\s*(?:to|[-–])\s*99%/i.test(copy)) fail(`${name}: unsupported device-coverage percentage`) + if (/(?:runs?|exercises?) (?:only )?the host harness/i.test(copy)) fail(`${name}: --local-only must not imply benchmark execution`) + for (const command of commandLines(page.body)) validateCommand(command, manifest.command_tree, name) + for (const example of taggedConfigExamples(page.body)) { + const allowed = configKeys.get(example.file) + if (!allowed) { + fail(`${name}: unknown configuration contract ${example.file}`) + continue + } + for (const key of tomlKeyPaths(example.source)) { + if (!allowed.has(key)) fail(`${name}: ${key} is not published in ${example.file}`) + } + } + for (const example of taggedJsonExamples(page.body)) { + const validate = schemaValidators.get(example.schemaId) + if (!validate) { + fail(`${name}: unknown schema contract ${example.schemaId}`) + continue + } + try { + const value = JSON.parse(example.source) + if (!validate(value)) fail(`${name}: ${example.schemaId} errors: ${ajv.errorsText(validate.errors)}`) + } catch (error) { + fail(`${name}: invalid JSON for ${example.schemaId}: ${error instanceof Error ? error.message : error}`) + } + } + if (page.route === '/cli/') cliPage = page + if (page.route === '/configuration/') configurationPage = page + } + if (!cliPage?.body.includes('Generated from @mobench/truth')) fail('CLI reference must contain the generated truth section') + if (!configurationPage?.body.includes('Generated from @mobench/truth')) fail('configuration reference must contain the generated truth section') + const visitCommand = (command: CommandContract) => { + if (command.path !== 'mobench' && !command.path.split(' ').includes('help') && !cliPage?.body.includes(`\`${command.path}\``)) { + fail(`CLI reference is missing generated command ${command.path}`) + } + for (const subcommand of command.subcommands) visitCommand(subcommand) + } + visitCommand(manifest.command_tree) + for (const config of manifest.config) { + for (const key of config.keys) { + if (!configurationPage?.body.includes(`\`${key.path}\``)) fail(`configuration reference is missing generated key ${key.path}`) + } + } + for (const alias of aliasRoutes) { + if (canonicalRoutes.has(alias)) fail(`alias ${alias} collides with a canonical route`) + } + for (const page of pages) validateLinks(page, canonicalRoutes, aliasRoutes) + + if (failures.length) { + console.error(`Content contract failed with ${failures.length} issue(s):`) + for (const issue of failures) console.error(`- ${issue}`) + process.exit(1) + } + console.log(`Validated ${pages.length} docs pages, ${manifest.capabilities.length} capabilities, and the pinned ${pin.release} manifest.`) +} + +await main() diff --git a/src/components/app-head.tsx b/src/components/app-head.tsx deleted file mode 100644 index 898faf1..0000000 --- a/src/components/app-head.tsx +++ /dev/null @@ -1,110 +0,0 @@ -import { useEffect } from 'react' -import { useRouterState } from '@tanstack/react-router' -import ogPages from '@/og-pages.json' - -type DocsPageOg = { - id: string - label: string - group: string - description: string -} - -type OgTarget = { - title: string - description: string - url: string - image: string -} - -const LANDING_TITLE = 'mobench - Rust mobile benchmarking CLI and SDK' -const DOCS_TITLE = 'mobench docs - Rust mobile benchmark documentation' - -function absoluteUrl(base: string, path: string) { - return `${base}${path.startsWith('/') ? path : `/${path}`}` -} - -function setMeta(selector: string, attr: 'content' | 'href', value: string) { - let element = document.head.querySelector(selector) - - if (!element) { - if (selector.startsWith('link')) { - element = document.createElement('link') - element.setAttribute('rel', 'canonical') - } else { - element = document.createElement('meta') - const property = selector.match(/property="([^"]+)"/)?.[1] - const name = selector.match(/name="([^"]+)"/)?.[1] - if (property) element.setAttribute('property', property) - if (name) element.setAttribute('name', name) - } - document.head.appendChild(element) - } - - element.setAttribute(attr, value) -} - -function docsPageForPath(pathname: string): DocsPageOg | null { - const slug = pathname.replace(/^\/+|\/+$/g, '').toLowerCase() - if (!slug) return null - if (slug === 'docs') return null - - const aliased = (ogPages.aliases as Record)[slug] ?? slug - return ogPages.docsPages.find((page) => page.id === aliased) ?? null -} - -function ogForPath(pathname: string): OgTarget { - const isDocsSubdomain = typeof window !== 'undefined' && window.location.hostname === 'docs.mobench.org' - const docsPage = docsPageForPath(pathname) - - if (docsPage) { - const path = `/${docsPage.id}` - return { - title: `${docsPage.label} - mobench docs`, - description: docsPage.description, - url: absoluteUrl(ogPages.site.docsUrl, path), - image: absoluteUrl(ogPages.site.docsUrl, `/og/${docsPage.id}.jpg`), - } - } - - if (pathname === '/docs' || pathname === '/docs/' || (isDocsSubdomain && pathname === '/')) { - return { - title: DOCS_TITLE, - description: ogPages.docsRoot.description, - url: absoluteUrl(ogPages.site.docsUrl, isDocsSubdomain ? '/' : '/docs'), - image: absoluteUrl(ogPages.site.docsUrl, ogPages.docsRoot.image), - } - } - - return { - title: LANDING_TITLE, - description: ogPages.landing.description, - url: absoluteUrl(ogPages.site.landingUrl, '/'), - image: absoluteUrl(ogPages.site.landingUrl, ogPages.landing.image), - } -} - -export function AppHead() { - const pathname = useRouterState({ select: (state) => state.location.pathname }) - - useEffect(() => { - const target = ogForPath(pathname) - - document.title = target.title - setMeta('meta[name="description"]', 'content', target.description) - setMeta('link[rel="canonical"]', 'href', target.url) - setMeta('meta[property="og:type"]', 'content', 'website') - setMeta('meta[property="og:site_name"]', 'content', 'mobench') - setMeta('meta[property="og:title"]', 'content', target.title) - setMeta('meta[property="og:description"]', 'content', target.description) - setMeta('meta[property="og:url"]', 'content', target.url) - setMeta('meta[property="og:image"]', 'content', target.image) - setMeta('meta[property="og:image:width"]', 'content', '1200') - setMeta('meta[property="og:image:height"]', 'content', '630') - setMeta('meta[name="twitter:card"]', 'content', 'summary_large_image') - setMeta('meta[name="twitter:title"]', 'content', target.title) - setMeta('meta[name="twitter:description"]', 'content', target.description) - setMeta('meta[name="twitter:image"]', 'content', target.image) - }, [pathname]) - - return null -} diff --git a/src/components/code-highlight.tsx b/src/components/code-highlight.tsx deleted file mode 100644 index 3e45cd2..0000000 --- a/src/components/code-highlight.tsx +++ /dev/null @@ -1,315 +0,0 @@ -import { useEffect, useRef, type ReactNode } from 'react' -import { cn } from '@/lib/utils' - -const KEYWORDS = new Set([ - 'as', - 'async', - 'await', - 'const', - 'crate', - 'else', - 'enum', - 'false', - 'fn', - 'for', - 'if', - 'impl', - 'in', - 'let', - 'match', - 'mod', - 'move', - 'mut', - 'pub', - 'ref', - 'return', - 'self', - 'Self', - 'static', - 'struct', - 'super', - 'trait', - 'true', - 'type', - 'use', - 'where', - 'while', -]) - -const TYPES = new Set([ - 'AndroidBuilder', - 'BenchError', - 'BenchmarkBuilder', - 'BenchSample', - 'BenchSpec', - 'BenchSummary', - 'BuildConfig', - 'BuildProfile', - 'BuildResult', - 'DeviceSelection', - 'IosBuilder', - 'MobileTarget', - 'Option', - 'Report', - 'Result', - 'RunRequest', - 'RunResult', - 'RunnerReport', - 'SemanticPhase', - 'SigningMethod', - 'String', - 'Target', - 'Vec', -]) - -function escapeHtml(value: string) { - return value - .replace(/&/g, '&') - .replace(//g, '>') - .replace(/"/g, '"') - .replace(/'/g, ''') -} - -function span(className: string, value: string) { - return `${escapeHtml(value)}` -} - -function highlightText(value: string) { - let html = '' - const tokenPattern = /--[A-Za-z0-9_-]+|[A-Za-z_][A-Za-z0-9_]*!?|\d[\d_]*(?:\.\d+)?|::|->|=>|==|!=|<=|>=|[{}()[\].,;:=<>+\-*/&|?]|\s+|./g - - for (const match of value.matchAll(tokenPattern)) { - const token = match[0] - const index = match.index ?? 0 - - if (/^\s+$/.test(token)) { - html += token - } else if (token.startsWith('--')) { - html += span('code-flag', token) - } else if (/^\d/.test(token)) { - html += span('code-number', token) - } else if (/^[A-Za-z_][A-Za-z0-9_]*!?$/.test(token)) { - const bare = token.endsWith('!') ? token.slice(0, -1) : token - const following = value.slice(index + token.length).trimStart() - - if (token.endsWith('!')) { - html += span('code-macro', token) - } else if (KEYWORDS.has(token)) { - html += span('code-keyword', token) - } else if (TYPES.has(token) || /^[A-Z]/.test(token)) { - html += span('code-type', token) - } else if (following.startsWith('(')) { - html += span('code-function', token) - } else if (bare === 'cargo' || bare === 'rustup' || bare === 'export' || bare === 'println') { - html += span('code-command', token) - } else { - html += escapeHtml(token) - } - } else if (/^(::|->|=>|==|!=|<=|>=|[{}()[\].,;:=<>+\-*/&|?])$/.test(token)) { - html += span('code-operator', token) - } else { - html += escapeHtml(token) - } - } - - return html -} - -function splitRustSegments(line: string) { - const segments: { kind: 'text' | 'string' | 'comment' | 'attribute'; value: string }[] = [] - let cursor = 0 - - while (cursor < line.length) { - if (line.startsWith('//', cursor)) { - segments.push({ kind: 'comment', value: line.slice(cursor) }) - break - } - - if (line.startsWith('#[', cursor)) { - const end = line.indexOf(']', cursor + 2) - segments.push({ kind: 'attribute', value: line.slice(cursor, end === -1 ? line.length : end + 1) }) - cursor = end === -1 ? line.length : end + 1 - continue - } - - if (line[cursor] === '"') { - let end = cursor + 1 - while (end < line.length) { - if (line[end] === '\\') { - end += 2 - continue - } - if (line[end] === '"') { - end += 1 - break - } - end += 1 - } - segments.push({ kind: 'string', value: line.slice(cursor, end) }) - cursor = end - continue - } - - let next = cursor + 1 - while (next < line.length && !line.startsWith('//', next) && !line.startsWith('#[', next) && line[next] !== '"') { - next += 1 - } - segments.push({ kind: 'text', value: line.slice(cursor, next) }) - cursor = next - } - - return segments -} - -function highlightShellText(value: string) { - const tokenPattern = /\$[A-Za-z_][A-Za-z0-9_]*|\$\{[^}]+}|%[A-Za-z_][A-Za-z0-9_]*%|--?[A-Za-z0-9][A-Za-z0-9_-]*|[A-Za-z0-9_.+/@:-]+|\d[\d_]*(?:\.\d+)?|[|&;()=<>]+|\s+|./g - let html = '' - let sawCommand = false - - for (const match of value.matchAll(tokenPattern)) { - const token = match[0] - const previous = value.slice(0, match.index ?? 0) - const commandPosition = !sawCommand && !/^\s*$/.test(token) && /(^|\|\s*|&&\s*|;\s*)$/.test(previous) - - if (/^\s+$/.test(token)) { - html += token - } else if (/^(\$[A-Za-z_][A-Za-z0-9_]*|\$\{[^}]+}|%[A-Za-z_][A-Za-z0-9_]*%)$/.test(token)) { - html += span('code-key', token) - } else if (/^--?[A-Za-z0-9][A-Za-z0-9_-]*$/.test(token)) { - html += span('code-flag', token) - } else if (/^\d/.test(token)) { - html += span('code-number', token) - } else if (commandPosition && /^[A-Za-z0-9_.+/@:-]+$/.test(token)) { - sawCommand = true - html += span('code-command', token) - } else if (/^[|&;()=<>]+$/.test(token)) { - html += span('code-operator', token) - if (/^(\||&&|;)$/.test(token)) sawCommand = false - } else { - html += escapeHtml(token) - } - } - - return html -} - -function splitShellSegments(line: string) { - const segments: { kind: 'text' | 'string' | 'comment'; value: string }[] = [] - let cursor = 0 - - while (cursor < line.length) { - if (line[cursor] === '#') { - segments.push({ kind: 'comment', value: line.slice(cursor) }) - break - } - - if (line[cursor] === '"' || line[cursor] === "'") { - const quote = line[cursor] - let end = cursor + 1 - while (end < line.length) { - if (line[end] === '\\') { - end += 2 - continue - } - if (line[end] === quote) { - end += 1 - break - } - end += 1 - } - segments.push({ kind: 'string', value: line.slice(cursor, end) }) - cursor = end - continue - } - - let next = cursor + 1 - while (next < line.length && line[next] !== '#' && line[next] !== '"' && line[next] !== "'") { - next += 1 - } - segments.push({ kind: 'text', value: line.slice(cursor, next) }) - cursor = next - } - - return segments -} - -function highlightShellSegments(line: string) { - return splitShellSegments(line) - .map((segment) => { - if (segment.kind === 'string') return span('code-string', segment.value) - if (segment.kind === 'comment') return span('code-comment', segment.value) - return highlightShellText(segment.value) - }) - .join('') -} - -function highlightLine(line: string, language = '') { - const shellLike = /^(bash|zsh|sh|shell|powershell)$/i.test(language) - if (shellLike) { - if (/^\s*\$/.test(line)) { - const [, indent = '', rest = ''] = line.match(/^(\s*)\$\s?(.*)$/) ?? [] - return `${escapeHtml(indent)}${span('code-prompt', '$')}${rest ? ` ${highlightShellSegments(rest)}` : ''}` - } - - return highlightShellSegments(line) - } - - if (/^\s*\$/.test(line)) { - const [, indent = '', rest = ''] = line.match(/^(\s*)\$\s?(.*)$/) ?? [] - return `${escapeHtml(indent)}${span('code-prompt', '$')}${rest ? ` ${highlightText(rest)}` : ''}` - } - - if (/^\s*[A-Za-z0-9_.-]+\s*=/.test(line)) { - const [, indent = '', key = '', rest = ''] = line.match(/^(\s*)([A-Za-z0-9_.-]+)(\s*=.*)$/) ?? [] - return `${escapeHtml(indent)}${span('code-key', key)}${highlightRustSegments(rest)}` - } - - return highlightRustSegments(line) -} - -function highlightRustSegments(line: string) { - return splitRustSegments(line) - .map((segment) => { - if (segment.kind === 'string') return span('code-string', segment.value) - if (segment.kind === 'comment') return span('code-comment', segment.value) - if (segment.kind === 'attribute') return span('code-attribute', segment.value) - return highlightText(segment.value) - }) - .join('') -} - -function getCodeLines(element: HTMLElement) { - const children = Array.from(element.children) - if (children.length === 0) { - return element.textContent?.split('\n') ?? [] - } - return children.map((child) => child.textContent ?? '') -} - -export function SyntaxHighlightedCode({ - children, - className, -}: { - children: ReactNode - className?: string -}) { - const ref = useRef(null) - - useEffect(() => { - const element = ref.current - if (!element) return - - const lines = getCodeLines(element) - const language = Array.from(element.classList) - .find((className) => className.startsWith('language-')) - ?.replace('language-', '') ?? '' - element.innerHTML = lines.map((line) => `
${highlightLine(line, language)}
`).join('') - }, [children, className]) - - return ( -
- {children} -
- ) -} diff --git a/src/components/icons.tsx b/src/components/icons.tsx deleted file mode 100644 index 64aed38..0000000 --- a/src/components/icons.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import type { SVGProps } from 'react' - -export function GithubIcon(props: SVGProps) { - return ( - - - - ) -} - -export function WorldMark(props: SVGProps) { - return ( - - - - ) -} - -export function Wordmark({ tag }: { tag?: string }) { - return ( - - - mobench - - {tag ? ( - - {tag} - - ) : null} - - ) -} - -export const GITHUB_URL = 'https://github.com/worldcoin/mobile-bench-rs' -export const WORLD_URL = 'https://world.org' -export const BROWSERSTACK_URL = 'https://www.browserstack.com/' -export const MOBENCH_VERSION = '0.1.43' diff --git a/src/components/theme-toggle.tsx b/src/components/theme-toggle.tsx deleted file mode 100644 index 7b07193..0000000 --- a/src/components/theme-toggle.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import { useEffect, useState } from 'react' -import { Moon, Sun } from 'lucide-react' -import { cn } from '@/lib/utils' - -type Theme = 'light' | 'dark' - -const STORAGE_KEY = 'mobench-theme' - -function systemTheme(): Theme { - if (typeof window === 'undefined') return 'light' - return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light' -} - -function applyTheme(theme: Theme) { - document.documentElement.dataset.theme = theme - document.documentElement.style.colorScheme = theme -} - -function storedTheme(): Theme | null { - if (typeof window === 'undefined') return null - try { - const value = window.localStorage?.getItem?.(STORAGE_KEY) - return value === 'light' || value === 'dark' ? value : null - } catch { - return null - } -} - -export function ThemeToggle({ className }: { className?: string }) { - const [theme, setTheme] = useState(() => { - if (typeof document === 'undefined') return 'light' - return document.documentElement.dataset.theme === 'dark' ? 'dark' : 'light' - }) - - useEffect(() => { - const media = window.matchMedia('(prefers-color-scheme: dark)') - - const syncTheme = () => { - const next = storedTheme() ?? (media.matches ? 'dark' : 'light') - applyTheme(next) - setTheme(next) - } - - syncTheme() - media.addEventListener('change', syncTheme) - window.addEventListener('storage', syncTheme) - - return () => { - media.removeEventListener('change', syncTheme) - window.removeEventListener('storage', syncTheme) - } - }, []) - - const nextTheme = theme === 'dark' ? 'light' : 'dark' - const Icon = theme === 'dark' ? Sun : Moon - - return ( - - ) -} diff --git a/src/components/ui/accordion.tsx b/src/components/ui/accordion.tsx deleted file mode 100644 index e96bf84..0000000 --- a/src/components/ui/accordion.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import * as React from 'react' -import * as AccordionPrimitive from '@radix-ui/react-accordion' -import { cn } from '@/lib/utils' - -function Accordion({ - ...props -}: React.ComponentProps) { - return -} - -function AccordionItem({ - className, - ...props -}: React.ComponentProps) { - return ( - - ) -} - -function AccordionTrigger({ - className, - children, - ...props -}: React.ComponentProps) { - return ( - - - {children} - - - ) -} - -function AccordionContent({ - className, - children, - ...props -}: React.ComponentProps) { - return ( - -
{children}
-
- ) -} - -export { Accordion, AccordionItem, AccordionTrigger, AccordionContent } diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx deleted file mode 100644 index 862f08e..0000000 --- a/src/components/ui/button.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import * as React from 'react' -import { Slot } from '@radix-ui/react-slot' -import { cva, type VariantProps } from 'class-variance-authority' -import { cn } from '@/lib/utils' - -const buttonVariants = cva( - "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-[10px] text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 outline-none focus-visible:ring-2 focus-visible:ring-green/40 cursor-pointer [&_svg]:pointer-events-none [&_svg]:shrink-0", - { - variants: { - variant: { - default: 'bg-green text-cream hover:bg-green-dark', - ink: 'bg-ink text-cream hover:bg-ink/90', - outline: - 'border border-[rgba(20,18,12,0.18)] bg-white text-ink hover:border-green/50', - ghost: 'text-ink hover:bg-[rgba(63,122,46,0.06)]', - link: 'text-green underline-offset-4 hover:underline', - }, - size: { - default: 'h-11 px-[22px] py-3.5', - sm: 'h-9 px-4', - lg: 'h-12 px-6 text-base', - }, - }, - defaultVariants: { - variant: 'default', - size: 'default', - }, - }, -) - -function Button({ - className, - variant, - size, - asChild = false, - ...props -}: React.ComponentProps<'button'> & - VariantProps & { asChild?: boolean }) { - const Comp = asChild ? Slot : 'button' - return ( - - ) -} - -export { Button, buttonVariants } diff --git a/src/lib/utils.ts b/src/lib/utils.ts deleted file mode 100644 index fed2fe9..0000000 --- a/src/lib/utils.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { clsx, type ClassValue } from 'clsx' -import { twMerge } from 'tailwind-merge' - -export function cn(...inputs: ClassValue[]) { - return twMerge(clsx(inputs)) -} diff --git a/src/main.tsx b/src/main.tsx deleted file mode 100644 index 4b1c74f..0000000 --- a/src/main.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { StrictMode } from 'react' -import { createRoot } from 'react-dom/client' -import { RouterProvider, createRouter } from '@tanstack/react-router' -import { routeTree } from './routeTree.gen' -import './styles.css' - -const router = createRouter({ - routeTree, - defaultPreload: 'intent', - scrollRestoration: true, -}) - -declare module '@tanstack/react-router' { - interface Register { - router: typeof router - } -} - -const rootElement = document.getElementById('app')! -if (!rootElement.innerHTML) { - const root = createRoot(rootElement) - root.render( - - - , - ) -} diff --git a/src/og-pages.json b/src/og-pages.json deleted file mode 100644 index c6cd62a..0000000 --- a/src/og-pages.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "site": { - "name": "mobench", - "version": "0.1.43", - "landingUrl": "https://mobench.org", - "docsUrl": "https://docs.mobench.org" - }, - "landing": { - "id": "landing", - "path": "/", - "image": "/og/landing.jpg", - "title": "mobench", - "eyebrow": "Rust mobile benchmarking", - "description": "Benchmark intense Rust workloads on real Android and iOS devices with CLI, SDK, BrowserStack CI, reports, and profiling." - }, - "docsRoot": { - "id": "docs", - "path": "/docs", - "image": "/og/docs.jpg", - "title": "mobench docs", - "eyebrow": "Technical documentation", - "description": "Architecture, install paths, CLI man pages, SDK integration, BrowserStack App Automate, profiling, schemas, and examples." - }, - "docsPages": [ - { "id": "overview", "label": "Overview", "group": "Start", "description": "mobench is a Rust mobile benchmarking toolkit for Android and iOS, with a CLI, SDK runtime, macro-based benchmarks, generated mobile runners, CI reports, and profiling artifacts." }, - { "id": "quickstart", "label": "Quickstart", "group": "Start", "description": "Install the CLI, register a benchmark, build mobile runners, and run locally, on emulators or simulators, or on BrowserStack." }, - { "id": "install", "label": "Installation", "group": "Start", "description": "Set up the Rust workspace, mobile toolchains, BrowserStack credentials when needed, and the project configuration file." }, - { "id": "concepts", "label": "Concepts", "group": "Start", "description": "Understand benchmark definitions, generated runners, local and hosted providers, reports, schemas, and profiling output." }, - { "id": "authoring", "label": "Writing benchmarks", "group": "Authoring", "description": "Use the benchmark macro, setup inputs, teardown functions, and registry discovery rules to expose Rust functions to mobench." }, - { "id": "setup-teardown", "label": "Setup & teardown", "group": "Authoring", "description": "Keep expensive initialization and cleanup outside measured samples while still giving every iteration the input shape it needs." }, - { "id": "sdk", "label": "SDK integration", "group": "Guides", "description": "Add mobench-sdk to a crate, configure runner backends, export native C ABI when needed, and use public runtime types." }, - { "id": "build", "label": "Build artifacts", "group": "Guides", "description": "Generate Android and iOS runner projects, understand runner backends, and verify outputs under target/mobench." }, - { "id": "local-devices", "label": "Local devices", "group": "Guides", "description": "Run against connected phones, Android emulators via Android Studio and ADB, and iOS simulators or connected devices via Xcode." }, - { "id": "browserstack", "label": "BrowserStack CI", "group": "Guides", "description": "Use hosted real devices, matrix resolution, split-sample merging, PR reporting, artifact fetching, and normalized resource metrics." }, - { "id": "app-automate", "label": "App Automate setup", "group": "Guides", "description": "Set up BrowserStack App Automate for mobench Android Espresso and iOS XCUITest runs, including API uploads, build execution, devices, trial limits, and pricing expectations." }, - { "id": "profiling", "label": "Profiling", "group": "Guides", "description": "Run local native profiling, produce trace events, semantic phase summaries, flamegraphs, and profile diffs." }, - { "id": "reports", "label": "Outputs & reports", "group": "Reference", "description": "Understand summary JSON, Markdown summaries, CSV rows, split-run outputs, BrowserStack artifacts, PR comments, and profiling bundles." }, - { "id": "cli-reference", "label": "CLI man pages", "group": "Reference", "description": "Exhaustive command reference for mobench: commands, subcommands, flags, expected inputs, outputs, defaults, and common examples." }, - { "id": "schemas", "label": "Schemas", "group": "Reference", "description": "Machine-readable contracts for CI metadata, benchmark summaries, trace events, and fixture payloads." }, - { "id": "examples", "label": "Examples explained", "group": "Reference", "description": "What the basic benchmark and native C ABI / FFI examples demonstrate, and how their fixture outputs map to reports." }, - { "id": "diagrams", "label": "Diagrams", "group": "Reference", "description": "Architecture, benchmark lifecycle, BrowserStack CI, profiling artifacts, and SDK versus CLI responsibility diagrams." }, - { "id": "current-spec", "label": "Current behavior", "group": "Specs", "description": "Current behavior and API contract for release 0.1.43: CLI, config, runners, public APIs, schemas, and compatibility boundaries." }, - { "id": "codebase", "label": "Codebase architecture", "group": "Codebase", "description": "Workspace layout, runtime layers, generated templates, integrations, stack, and ownership boundaries." }, - { "id": "testing", "label": "Testing strategy", "group": "Codebase", "description": "Host tests, CLI smoke checks, split-run merge validation, CI contract checks, BrowserStack smoke tests, and profiling checks." }, - { "id": "public-api", "label": "Public API", "group": "Codebase", "description": "Published crates, feature flags, serialized contracts, error boundaries, semver policy, MSRV, and release readiness." }, - { "id": "troubleshooting", "label": "Troubleshooting", "group": "Help", "description": "Common setup, build, discovery, BrowserStack, profiling, schema, and result-quality issues." } - ], - "aliases": { - "docs": "overview", - "home": "overview", - "installation": "install", - "writing": "authoring", - "writing-benchmarks": "authoring", - "setup-and-teardown": "setup-teardown", - "sdk-integration": "sdk", - "build-artifacts": "build", - "outputs-and-reports": "reports", - "cli-man-pages": "cli-reference", - "reference": "cli-reference" - } -} diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts deleted file mode 100644 index 1f3cdd3..0000000 --- a/src/routeTree.gen.ts +++ /dev/null @@ -1,95 +0,0 @@ -/* eslint-disable */ - -// @ts-nocheck - -// noinspection JSUnusedGlobalSymbols - -// This file was automatically generated by TanStack Router. -// You should NOT make any changes in this file as it will be overwritten. -// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. - -import { Route as rootRouteImport } from './routes/__root' -import { Route as DocsRouteImport } from './routes/docs' -import { Route as DocSlugRouteImport } from './routes/$docSlug' -import { Route as IndexRouteImport } from './routes/index' - -const DocsRoute = DocsRouteImport.update({ - id: '/docs', - path: '/docs', - getParentRoute: () => rootRouteImport, -} as any) -const DocSlugRoute = DocSlugRouteImport.update({ - id: '/$docSlug', - path: '/$docSlug', - getParentRoute: () => rootRouteImport, -} as any) -const IndexRoute = IndexRouteImport.update({ - id: '/', - path: '/', - getParentRoute: () => rootRouteImport, -} as any) - -export interface FileRoutesByFullPath { - '/': typeof IndexRoute - '/$docSlug': typeof DocSlugRoute - '/docs': typeof DocsRoute -} -export interface FileRoutesByTo { - '/': typeof IndexRoute - '/$docSlug': typeof DocSlugRoute - '/docs': typeof DocsRoute -} -export interface FileRoutesById { - __root__: typeof rootRouteImport - '/': typeof IndexRoute - '/$docSlug': typeof DocSlugRoute - '/docs': typeof DocsRoute -} -export interface FileRouteTypes { - fileRoutesByFullPath: FileRoutesByFullPath - fullPaths: '/' | '/$docSlug' | '/docs' - fileRoutesByTo: FileRoutesByTo - to: '/' | '/$docSlug' | '/docs' - id: '__root__' | '/' | '/$docSlug' | '/docs' - fileRoutesById: FileRoutesById -} -export interface RootRouteChildren { - IndexRoute: typeof IndexRoute - DocSlugRoute: typeof DocSlugRoute - DocsRoute: typeof DocsRoute -} - -declare module '@tanstack/react-router' { - interface FileRoutesByPath { - '/docs': { - id: '/docs' - path: '/docs' - fullPath: '/docs' - preLoaderRoute: typeof DocsRouteImport - parentRoute: typeof rootRouteImport - } - '/$docSlug': { - id: '/$docSlug' - path: '/$docSlug' - fullPath: '/$docSlug' - preLoaderRoute: typeof DocSlugRouteImport - parentRoute: typeof rootRouteImport - } - '/': { - id: '/' - path: '/' - fullPath: '/' - preLoaderRoute: typeof IndexRouteImport - parentRoute: typeof rootRouteImport - } - } -} - -const rootRouteChildren: RootRouteChildren = { - IndexRoute: IndexRoute, - DocSlugRoute: DocSlugRoute, - DocsRoute: DocsRoute, -} -export const routeTree = rootRouteImport - ._addFileChildren(rootRouteChildren) - ._addFileTypes() diff --git a/src/routes/$docSlug.tsx b/src/routes/$docSlug.tsx deleted file mode 100644 index 12251e9..0000000 --- a/src/routes/$docSlug.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { createFileRoute, Link } from '@tanstack/react-router' -import { AlertTriangle } from 'lucide-react' -import { Docs, getDocsPageBySlug } from './docs' - -export const Route = createFileRoute('/$docSlug')({ - component: DocsSlugRoute, -}) - -function DocsSlugRoute() { - const { docSlug } = Route.useParams() - const page = getDocsPageBySlug(docSlug) - - if (!page) { - return - } - - return -} - -function DocsNotFound({ slug }: { slug: string }) { - return ( -
-
-
- -
-

404

-

Docs page not found

-

- No Mobench docs page matches /{slug}. -

-
- - Go to docs - - - Go home - -
-
-
- ) -} diff --git a/src/routes/__root.tsx b/src/routes/__root.tsx deleted file mode 100644 index b4c5b5b..0000000 --- a/src/routes/__root.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { createRootRoute, Link, Outlet } from '@tanstack/react-router' -import { AlertTriangle } from 'lucide-react' -import { AppHead } from '@/components/app-head' - -export const Route = createRootRoute({ - component: () => ( - <> - - - - ), - notFoundComponent: RootNotFound, -}) - -function RootNotFound() { - return ( -
-
-
- -
-

404

-

Page not found

-

That URL does not match an existing Mobench page.

-
- - Go to docs - - - Go home - -
-
-
- ) -} diff --git a/src/routes/docs.tsx b/src/routes/docs.tsx deleted file mode 100644 index 858b21b..0000000 --- a/src/routes/docs.tsx +++ /dev/null @@ -1,3625 +0,0 @@ -import { isValidElement, useEffect, useMemo, useRef, useState, type ComponentType, type MouseEvent, type ReactNode, type SVGProps } from 'react' -import { createFileRoute, Link, useNavigate } from '@tanstack/react-router' -import { - Activity, - AlertTriangle, - BarChart3, - BookOpen, - Boxes, - Check, - ChevronDown, - Cloud, - Code2, - Compass, - Copy, - Cpu, - Database, - ExternalLink, - FileCode2, - FileJson, - Layers, - ListChecks, - Maximize2, - MessageCircle, - Network, - PackageCheck, - Rocket, - Search, - ShieldCheck, - Smartphone, - Terminal, - TestTube2, - Workflow, - Wrench, - X, -} from 'lucide-react' -import { SyntaxHighlightedCode } from '@/components/code-highlight' -import { ThemeToggle } from '@/components/theme-toggle' -import { MOBENCH_VERSION } from '@/components/icons' -import { cn } from '@/lib/utils' - -export const Route = createFileRoute('/docs')({ - component: Docs, -}) - -type Icon = ComponentType> - -type PageId = - | 'overview' - | 'quickstart' - | 'install' - | 'concepts' - | 'authoring' - | 'setup-teardown' - | 'sdk' - | 'build' - | 'local-devices' - | 'browserstack' - | 'app-automate' - | 'profiling' - | 'reports' - | 'cli-reference' - | 'schemas' - | 'examples' - | 'diagrams' - | 'current-spec' - | 'codebase' - | 'testing' - | 'public-api' - | 'troubleshooting' - -type PageDef = { - id: PageId - label: string - group: string - description: string - icon: Icon - toc: string[] -} - -type Section = { -title: string -body?: ReactNode[] -bullets?: ReactNode[] -image?: { - src: string - alt: string - caption?: string -} -codeVariants?: readonly { - id: string - label: string - language: string - value: string -}[] -code?: { -language: string -value: string -} -} - -const DOCSRS = { - mobench: 'https://docs.rs/mobench/latest/mobench/', - sdk: 'https://docs.rs/mobench-sdk/latest/mobench_sdk/', - macros: 'https://docs.rs/mobench-macros/latest/mobench_macros/', -} - -const LANDING_URL = 'https://mobench.org' -const GITHUB_REPO = 'https://github.com/worldcoin/mobile-bench-rs' -const DEEPWIKI_URL = 'https://deepwiki.com/worldcoin/mobile-bench-rs' -const DEEPWIKI_OVERVIEW_URL = 'https://deepwiki.com/worldcoin/mobile-bench-rs/1-overview' -const EXTERNAL_DOCS = { - rust: 'https://www.rust-lang.org/tools/install', - browserstack: 'https://www.browserstack.com/', - appAutomate: 'https://www.browserstack.com/app-automate', - appAutomateApi: 'https://www.browserstack.com/docs/app-automate/api-reference/introduction', - appAutomateEspresso: 'https://www.browserstack.com/docs/app-automate/espresso/getting-started', - appAutomateXcuitest: 'https://www.browserstack.com/docs/app-automate/xcuitest', - espresso: 'https://developer.android.com/training/testing/espresso', - xctest: 'https://developer.apple.com/documentation/xctest', - uniffi: 'https://github.com/mozilla/uniffi-rs', - boltffi: 'https://github.com/boltffi/boltffi', - androidStudio: 'https://developer.android.com/studio', - android: 'https://developer.android.com/', - xcode: 'https://developer.apple.com/xcode/', - ios: 'https://developer.apple.com/ios/', - worldApp: 'http://world.org/world-app', - worldId: 'https://docs.world.org/world-id', - provekit: 'https://provekit.org/', -} as const - -type BrandLogoName = 'rust' | 'browserstack' | 'androidStudio' | 'android' | 'xcode' | 'ios' - -const BRAND_LOGOS: Record = { - rust: { src: '/assets/logo-rust.svg', alt: 'Rust' }, - browserstack: { src: '/assets/logo-browserstack.svg', alt: 'BrowserStack' }, - androidStudio: { src: '/assets/logo-android-studio.svg', alt: 'Android Studio' }, - android: { src: '/assets/logo-android.svg', alt: 'Android' }, - xcode: { src: '/assets/logo-xcode.svg', alt: 'Xcode' }, - ios: { src: '/assets/logo-apple.svg', alt: 'Apple' }, -} - -const INSTALL_COMMANDS = [ - { - id: 'mac', - label: 'Mac', - language: 'bash', - value: `# macOS without Homebrew -# Xcode/iOS support is macOS-only and may require App Store sign-in. -xcode-select --install || true -open "macappstore://apps.apple.com/app/xcode/id497799835" - -# Android Studio installs the Android SDK, emulator, and SDK manager UI. -open "https://developer.android.com/studio" - -# Rust and mobench. -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -. "$HOME/.cargo/env" -cargo install mobench - -# After Android Studio installs Platform Tools, reopen the terminal and verify. -adb version -mobench --version`, - }, - { - id: 'brew', - label: 'Brew', - language: 'bash', - value: `# macOS with Homebrew -if ! command -v brew >/dev/null 2>&1; then - /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" -fi - -brew install android-platform-tools -brew install --cask android-studio -xcode-select --install || true -open "macappstore://apps.apple.com/app/xcode/id497799835" - -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -. "$HOME/.cargo/env" -cargo install mobench - -adb version -mobench --version`, - }, - { - id: 'windows', - label: 'Windows', - language: 'powershell', - value: `# Windows PowerShell -winget install -e --id Rustlang.Rustup -winget install -e --id Google.PlatformTools -winget install -e --id Google.AndroidStudio - -# Open a new PowerShell after winget finishes so PATH refreshes. -cargo install mobench - -adb version -mobench --version`, - }, - { - id: 'linux', - label: 'Linux', - language: 'bash', - value: `# Linux: Debian/Ubuntu, Fedora, or Arch -if command -v apt-get >/dev/null 2>&1; then - sudo apt-get update - sudo apt-get install -y curl build-essential pkg-config libssl-dev unzip adb -elif command -v dnf >/dev/null 2>&1; then - sudo dnf install -y curl gcc gcc-c++ make openssl-devel unzip android-tools -elif command -v pacman >/dev/null 2>&1; then - sudo pacman -Syu --needed curl base-devel openssl unzip android-tools -else - echo "Install curl, compiler toolchain, OpenSSL headers, unzip, and Android platform-tools for your distro." -fi - -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -. "$HOME/.cargo/env" -cargo install mobench - -adb version -mobench --version`, - }, -] as const - -const PAGES: PageDef[] = [ - { - id: 'overview', - label: 'Overview', - group: 'Start', - description: 'mobench is a Rust mobile benchmarking toolkit for Android and iOS, with a CLI, SDK runtime, macro-based benchmarks, generated mobile runners, CI reports, and profiling artifacts.', - icon: BookOpen, - toc: ['Why mobench exists', 'What mobench provides', 'How pieces fit', 'Where to go next'], - }, - { - id: 'quickstart', - label: 'Quickstart', - group: 'Start', - description: 'Install the CLI, register a benchmark, build mobile runners, and run locally, on emulators or simulators, or on BrowserStack.', - icon: Rocket, - toc: ['Command path', 'Local targets', 'First benchmark'], - }, - { - id: 'install', - label: 'Installation', - group: 'Start', - description: 'Set up the Rust workspace, mobile toolchains, BrowserStack credentials when needed, and the project configuration file.', - icon: PackageCheck, - toc: ['Copy-paste install', 'Rust and CLI', 'Android and iOS', 'BrowserStack credentials'], - }, - { - id: 'concepts', - label: 'Concepts', - group: 'Start', - description: 'Understand benchmark definitions, generated runners, local and hosted providers, reports, schemas, and profiling output.', - icon: Compass, - toc: ['Product surfaces', 'Crates', 'Artifact flow'], - }, - { - id: 'authoring', - label: 'Writing benchmarks', - group: 'Authoring', - description: 'Use the benchmark macro, setup inputs, teardown functions, and registry discovery rules to expose Rust functions to mobench.', - icon: Code2, - toc: ['Macro shape', 'Discovery', 'Best practices'], - }, - { - id: 'setup-teardown', - label: 'Setup & teardown', - group: 'Authoring', - description: 'Keep expensive initialization and cleanup outside measured samples while still giving every iteration the input shape it needs.', - icon: Wrench, - toc: ['Setup modes', 'Teardown', 'Compatibility'], - }, - { - id: 'sdk', - label: 'SDK integration', - group: 'Guides', - description: 'Add mobench-sdk to a crate, configure runner backends, export native C ABI when needed, and use public runtime types.', - icon: FileCode2, - toc: ['Dependencies', 'Runtime APIs', 'Choosing an FFI backend', 'Native C ABI'], - }, - { - id: 'build', - label: 'Build artifacts', - group: 'Guides', - description: 'Generate Android and iOS runner projects, understand runner backends, and verify outputs under target/mobench.', - icon: Terminal, - toc: ['Prerequisites', 'Build commands', 'Outputs'], - }, - { - id: 'local-devices', - label: 'Local devices', - group: 'Guides', - description: 'Run against connected phones, Android emulators via Android Studio and ADB, and iOS simulators or connected devices via Xcode.', - icon: Smartphone, - toc: ['Android', 'iOS', 'Host-only smoke runs'], - }, - { - id: 'browserstack', - label: 'BrowserStack CI', - group: 'Guides', - description: 'Use hosted real devices, matrix resolution, split-sample merging, PR reporting, artifact fetching, and normalized resource metrics.', - icon: Cloud, - toc: ['Credentials', 'Device resolution', 'CI contract', 'Split-sample merge'], - }, - { - id: 'app-automate', - label: 'App Automate setup', - group: 'Guides', - description: 'Set up BrowserStack App Automate for mobench Android Espresso and iOS XCUITest runs, including API uploads, build execution, devices, trial limits, and pricing expectations.', - icon: Layers, - toc: ['Account and pricing', 'Espresso on Android', 'XCUITest on iOS', 'API lifecycle', 'Devices'], - }, - - { - id: 'profiling', - label: 'Profiling', - group: 'Guides', - description: 'Run local native profiling, produce trace events, semantic phase summaries, flamegraphs, and profile diffs.', - icon: Activity, - toc: ['Capability matrix', 'Artifacts', 'Flamegraph viewer', 'Phases'], - }, - { - id: 'reports', - label: 'Outputs & reports', - group: 'Reference', - description: 'Understand summary JSON, Markdown summaries, CSV rows, split-run outputs, BrowserStack artifacts, PR comments, and profiling bundles.', - icon: BarChart3, - toc: ['Output layout', 'Split-run outputs', 'Report helpers', 'Fixtures'], - }, - { - id: 'cli-reference', - label: 'CLI man pages', - group: 'Reference', - description: 'Exhaustive command reference for mobench: commands, subcommands, flags, expected inputs, outputs, defaults, and common examples.', - icon: Terminal, - toc: ['Command model', 'Benchmark runs', 'Build and project setup', 'CI commands', 'Device and config helpers', 'Reports and profiling', 'Outputs and contracts'], - }, - { - id: 'schemas', - label: 'Schemas', - group: 'Reference', - description: 'Machine-readable contracts for CI metadata, benchmark summaries, trace events, and fixture payloads.', - icon: FileJson, - toc: ['CI contract', 'Summary', 'Trace events'], - }, - { - id: 'examples', - label: 'Examples explained', - group: 'Reference', - description: 'What the basic benchmark and native C ABI / FFI examples demonstrate, and how their fixture outputs map to reports.', - icon: Boxes, - toc: ['Basic benchmark', 'FFI benchmark', 'Fixture outputs'], - }, - { - id: 'diagrams', - label: 'Diagrams', - group: 'Reference', - description: 'Architecture, benchmark lifecycle, BrowserStack CI, profiling artifacts, and SDK versus CLI responsibility diagrams.', - icon: Workflow, - toc: ['Crate architecture', 'Benchmark lifecycle', 'Provider flow'], - }, - { - id: 'current-spec', - label: 'Current behavior', - group: 'Specs', - description: 'Current behavior and API contract for release 0.1.43: CLI, config, runners, public APIs, schemas, and compatibility boundaries.', - icon: ListChecks, - toc: ['Scope', 'Contracts', 'Compatibility'], - }, - { - id: 'codebase', - label: 'Codebase architecture', - group: 'Codebase', - description: 'Workspace layout, runtime layers, generated templates, integrations, stack, and ownership boundaries.', - icon: Network, - toc: ['Workspace', 'Runtime layers', 'Integrations'], - }, - { - id: 'testing', - label: 'Testing strategy', - group: 'Codebase', - description: 'Host tests, CLI smoke checks, split-run merge validation, CI contract checks, BrowserStack smoke tests, and profiling checks.', - icon: TestTube2, - toc: ['Test taxonomy', 'CI checks', 'Profiling checks'], - }, - { - id: 'public-api', - label: 'Public API', - group: 'Codebase', - description: 'Published crates, feature flags, serialized contracts, error boundaries, semver policy, MSRV, and release readiness.', - icon: ShieldCheck, - toc: ['Crates', 'Feature flags', 'Release checks'], - }, - { - id: 'troubleshooting', - label: 'Troubleshooting', - group: 'Help', - description: 'Common setup, build, discovery, BrowserStack, profiling, schema, and result-quality issues.', - icon: AlertTriangle, - toc: ['Setup', 'Runs', 'Reports'], - }, -] - -const DOCS_PAGE_ALIASES: Partial> = { - docs: 'overview', - overview: 'overview', - home: 'overview', - installation: 'install', - install: 'install', - authoring: 'authoring', - writing: 'authoring', - 'writing-benchmarks': 'authoring', - 'setup-and-teardown': 'setup-teardown', - 'sdk-integration': 'sdk', - 'build-artifacts': 'build', - 'local-devices': 'local-devices', - 'browserstack-ci': 'browserstack', - browserstack: 'browserstack', - 'app-automate-setup': 'app-automate', - 'outputs-and-reports': 'reports', - 'cli-man-pages': 'cli-reference', - reference: 'cli-reference', -} - -export function docsPathForPage(id: PageId) { - return id === 'overview' ? '/docs' : `/${id}` -} - -export function getDocsPageBySlug(slug: string | undefined) { - const normalized = (slug ?? 'docs').toLowerCase().replace(/^\/+|\/+$/g, '') - const aliased = DOCS_PAGE_ALIASES[normalized] - const id = aliased ?? (PAGES.some((page) => page.id === normalized) ? normalized as PageId : null) - return id ? PAGES.find((page) => page.id === id) ?? null : null -} - -const CONTENT: Record = { - overview: [ - { - title: 'Why mobench exists', - body: [ - <>mobench came from an internal need to benchmark intense Rust workloads in mobile environments representative of real World App users. That means runs cannot only target flagship phones; the matrix also needs medium-tier devices, low-end devices, and even older 32-bit devices that may still be in circulation roughly a decade later., - <>The practical goal was confidence across the device range that matters for ProveKit, the cryptography library that powers World ID. mobench helps teams measure whether heavy cryptographic paths hold up for the 95%-99% of users whose real phones define production performance, thermal behavior, and reliability., - ], - }, - { - title: 'What mobench provides', - body: [ - <>mobench keeps benchmark definitions in Rust and runs them in places mobile code actually pays its costs: Android iOS runners, host-only smoke runs, connected local devices, emulators simulators, BrowserStack devices, profiling flows., - ], - bullets: [ - <>A cargo mobench CLI for build, run, CI, reporting, BrowserStack, device resolution, profiling commands., - <>A mobench-sdk runtime with timing, registry, runner builders, mobile builders, profiling helpers, UniFFI compatibility, BoltFFI support, and native C ABI support., - <>A mobench-macros crate registers #[benchmark] functions through inventory., - <>Stable output artifacts: JSON summaries, Markdown summaries, CSV rows, optional plots, profiling manifests, trace-event JSON, and flamegraph bundles., - ], - }, - { - title: 'How the pieces fit', - body: [ - <>The CLI resolves project configuration, builds generated Android or iOS runner projects, invokes a local or hosted provider, fetches artifacts, and writes normalized reports. The SDK owns benchmark execution, timing, registry lookup, setup and teardown handling, runner reports, and public types., - ], - code: { - language: 'text', - value: `benchmark crate - -> mobench-sdk registry and timing - -> generated Android / iOS runner - -> local device, emulator, simulator, host-only, or BrowserStack provider - -> summary.json, summary.md, results.csv, plots, profile artifacts`, - }, - }, - { - title: 'Where to go next', - bullets: [ - <>Start with Quickstart for the smallest working path., - <>Use Local devices when you want connected phones, Android Studio emulators, ADB, Xcode simulators, or connected iOS devices., - <>Use BrowserStack CI for hosted real-device runs and PR reporting., - <>Use Outputs, Schemas, and Examples when wiring downstream tooling., - ], - }, - { - title: 'External AI documentation', - body: [ - <> - DeepWiki by Cognition indexes the upstream repository into an external technical wiki that can be used as AI-readable context for Devin and other coding assistants. Use it when you want repo-wide navigation, source-linked explanations, or a fast second view beside these authored docs. - , - ], - bullets: [ - <> - DeepWiki overview summarizes purpose, crate architecture, generated runner flow, reporting, and native profiling. - , - <> - DeepWiki index exposes the topic map for system architecture, CLI, SDK, macros, BrowserStack, templates, profiling, CI, examples, dependencies, and glossary pages. - , - <>The “Copy page” action copies this authored page or sends it to an assistant; pair that with DeepWiki when you want an AI to answer from both local docs and source-indexed context., - ], - }, - ], - quickstart: [ - { - title: 'Command path', - body: [ - <>The fast path is install, initialize config, check prerequisites, build a target runner, then run locally or through a provider., - ], - code: { - language: 'bash', - value: `cargo install mobench -cargo mobench init -cargo mobench doctor -cargo mobench build --target android --release -cargo mobench run --local --function fibonacci_30 --iterations 100 --warmup 10 -cargo mobench ci run --target android --browserstack --output target/mobench/ci`, - }, - }, - { - title: 'Local targets', - body: [ - <>Local does not only mean a physical phone. Android can run through connected devices or Android emulators managed by Android Studio and ADB. iOS can run through Xcode-managed simulators or connected iOS devices. BrowserStack is the hosted-device path, useful for shared CI and reproducible remote devices., - ], - }, - { - title: 'First benchmark', - code: { - language: 'rust', - value: `use mobench_sdk::benchmark; - -#[benchmark] -pub fn fibonacci_30() { - let result = fibonacci(30); - std::hint::black_box(result); -} - -fn setup_data() -> Vec { - vec![42; 1024 * 1024] -} - -#[benchmark(setup = setup_data)] -pub fn checksum(data: &Vec) { - let sum: u64 = data.iter().map(|byte| *byte as u64).sum(); - std::hint::black_box(sum); -}`, - }, - }, - ], - install: [ - { - title: 'Copy-paste install', - body: [ - <>Use the matching section for your operating system to install ADB/platform tools, Android Studio, Rust, and mobench. Xcode and iOS simulator support are macOS-only; the command opens Apple installers where an interactive sign-in is required., - ], - codeVariants: INSTALL_COMMANDS, - }, - { - title: 'Rust and CLI', - bullets: [ - <>Install Rust with rustup. Use Rust 2024-compatible toolchains; current workspace release line is 0.1.43 and documented MSRV is Rust 1.85., - <>Install CLI cargo install mobench or build from repository when developing mobench itself., - <>Add mobench-sdk, inventory, and required crate types to benchmark crates., - ], - code: { - language: 'toml', - value: `[dependencies] -mobench-sdk = "0.1.43" -inventory = "0.3" - -[lib] -crate-type = ["cdylib", "staticlib", "lib"]`, - }, - }, - { - title: 'Android and iOS', - bullets: [ - <>Android Studio is the normal route for installing Android SDKs, managing emulators, and exposing devices through ADB., - <>Xcode provides command-line tools, simulators, signing, and connected-device support for iOS generated runner projects., - <>Use cargo mobench check --target android and cargo mobench check --target ios before chasing build failures., - ], - }, - { - title: 'BrowserStack credentials', - body: [ - <>BrowserStack is optional local development, but required hosted real-device CI jobs. mobench uses App Automate when runs need BrowserStack Android Espresso or iOS XCUITest execution., - ], - code: { - language: 'bash', - value: `export BROWSERSTACK_USERNAME="your_username" -export BROWSERSTACK_ACCESS_KEY="your_access_key" -export BROWSERSTACK_PROJECT="mobile-benchmarks"`, - }, - }, - ], - concepts: [ - { - title: 'Product surfaces', - bullets: [ - <>Benchmark execution builds mobile artifacts, runs benchmarks host-only, locally, or on BrowserStack, and writes report artifacts., - <>Local native profiling runs capture plans and produces normalized profile manifests, flamegraph artifacts, semantic phase summaries, and diffs., - ], - }, - { - title: 'Crates', - bullets: [ - <>mobench: CLI, BrowserStack client, CI and reporting entry points, and programmatic command types., - <>mobench-sdk: timing harness, benchmark registry, generated runner support, mobile builders, profiling helpers, UniFFI, and native C ABI., - <>mobench-macros: the #[benchmark] proc macro., - ], - }, - { - title: 'Artifact flow', - body: [ - <>Runs produce normalized artifacts under target/mobench/. BrowserStack fetches also place raw provider artifacts under a BrowserStack output root. Profiling creates trace events and flamegraph-ready bundles., - ], - }, - ], - authoring: [ - { - title: 'Macro shape', - body: [ - <>Simple benchmark functions take no parameters, return (), and should use std::hint::black_box for values the optimizer might otherwise erase., - ], - code: { - language: 'rust', - value: `use mobench_sdk::benchmark; - -#[benchmark] -pub fn checksum_bench() { - let data = [1u8; 1024]; - let sum: u64 = data.iter().map(|b| *b as u64).sum(); - std::hint::black_box(sum); -}`, - }, - }, - { - title: 'Discovery', - bullets: [ - <>Benchmarks are registered at compile time through inventory., - <>Generated runners discover registered functions through SDK registry APIs., - <>Macro validation rejects unsupported signatures early, including parameters on simple benchmarks or non-unit returns., - ], - }, - { - title: 'Best practices', - bullets: [ - <>Keep input generation outside measured work unless the input generation is itself what you are benchmarking., - <>Use per-iteration setup for mutable or consumed input., - <>Prefer stable iterations and warmup settings in config so CI reports are comparable., - ], - }, - ], - 'setup-teardown': [ - { - title: 'Setup modes', - body: [ - <>Setup runs before measured samples and passes the setup value into the benchmark. Per-iteration setup runs before each measured iteration and is useful for mutable input., - ], - code: { - language: 'rust', - value: `fn create_input() -> Vec { - vec![42; 1024 * 1024] -} - -#[benchmark(setup = create_input)] -pub fn process_data(data: &Vec) { - std::hint::black_box(data.iter().sum::()); -} - -fn unsorted_vec() -> Vec { - (0..1000).rev().collect() -} - -#[benchmark(setup = unsorted_vec, per_iteration)] -pub fn sort_vec(mut data: Vec) { - data.sort(); - std::hint::black_box(data); -}`, - }, - }, - { - title: 'Teardown', - body: [ - <>Teardown receives setup state after measured execution and is intended for cleanup such as temporary files, handles, connections, or test data. Teardown itself is outside the measured sample., - ], - code: { - language: 'rust', - value: `#[benchmark(setup = setup_temp_file, teardown = cleanup_temp_file)] -pub fn parse_file(input: &TempFile) { - parse(input.path()); -}`, - }, - }, - { - title: 'Compatibility', - bullets: [ - <>Simple benchmarks keep their existing behavior., - <>Setup benchmarks accept one input compatible with the setup return type., - <>Native runner paths serialize specs and reports through the same public contracts., - ], - }, - ], - sdk: [ - { - title: 'Dependencies', - body: [ - <>Use the full SDK for normal benchmark crates. Runtime-only registry crates can use narrower feature flags., - ], - code: { - language: 'toml', - value: `[dependencies] -mobench-sdk = "0.1.43" -inventory = "0.3" - -# Narrow registry-only form: -mobench-sdk = { version = "0.1.43", default-features = false, features = ["registry"] }`, - }, - }, - { - title: 'Runtime APIs', - bullets: [ - <>BenchSpec names the benchmark and sets measured iterations and warmup iterations., - <>BenchSample records wall-clock duration plus optional CPU and memory measurements., - <>BenchReport contains samples, statistics helpers, semantic phases, and timeline spans., - <>Target, FfiBackend, builders, and runner report types shape generated runner behavior., - ], - }, - { - title: 'Choosing an FFI backend', - body: [ - <>If you need generated bindings, choose between BoltFFI and UniFFI based on maturity versus overhead., - <>The practical recommendation for performance-sensitive mobile benchmarks is still to write native FFI bindings for the benchmark boundary. AI agents make those bindings much easier to build, test, review, and maintain, and native bindings keep benchmark overhead explicit instead of hiding it inside a general-purpose binding layer., - ], - bullets: [ - <>BoltFFI: fast, newer, and designed for smaller overhead than UniFFI, but not as mature yet., - <>UniFFI: more mature and battle-tested, but usually carries larger binding overhead., - <>Native FFI: recommended for serious benchmark paths because Android/iOS callers can use the narrow ABI the benchmark actually needs., - ], - }, - { - title: 'Native C ABI', - body: [ - <>The native C ABI lets generated runners call the benchmark crate directly without UniFFI bindings in the measured path., - ], - code: { - language: 'rust', - value: `mobench_sdk::export_native_c_abi!(); - -// Exports: -// mobench_run_benchmark_json(spec_ptr, spec_len, out) -> i32 -// mobench_free_buf(buf) -// mobench_last_error_message() -> *const c_char`, - }, - }, - ], - build: [ - { - title: 'Prerequisites', - bullets: [ - <>Android: install SDK tooling, make ADB available, and create emulator profiles in Android Studio when simulator-style local runs are needed., - <>iOS: install Xcode command-line tools and use Xcode to manage simulators, signing, and connected devices., - <>Run cargo mobench check for target-specific diagnostics before build commands., - ], - }, - { - title: 'Build commands', - code: { - language: 'bash', - value: `cargo mobench check --target android -cargo mobench check --target ios -cargo mobench build --target android --progress -cargo mobench build --target ios --progress -cargo mobench build --target both --release`, - }, - }, - { - title: 'Outputs', - bullets: [ - <>Android builds produce generated projects, APK or test APK artifacts, native libraries, and runner metadata., - <>iOS builds produce generated Xcode projects, simulator and device slices, test bundles, and runner metadata., - <>Outputs default to target/mobench/; release builds are smaller and better suited for uploads., - ], - }, - ], - 'local-devices': [ - { - title: 'Android', - bullets: [ - <>Use physical phones through ADB when you need device-specific CPU, memory, thermal, or ABI behavior., - <>Use Android Studio emulators for fast local iteration, SDK compatibility checks, and repeatable development smoke runs., - <>ADB is the local control layer for listing devices, installing generated APKs, and running generated Android test harnesses., - ], - code: { - language: 'bash', - value: `adb devices -cargo mobench build --target android -cargo mobench run --target android --local --function my_crate::checksum_bench`, - }, - }, - { - title: 'iOS', - bullets: [ - <>Use Xcode simulators for local iteration without requiring a physical iPhone., - <>Use connected iOS devices when hardware behavior, signing, device OS version, or performance fidelity matters., - <>Xcode owns simulator runtimes, device trust, signing, XCUITest execution generated iOS harnesses., - ], - }, - { - title: 'Host-only smoke runs', - body: [ - <>Host-only runs are useful for verifying benchmark discovery and report wiring without building mobile artifacts. They are not a replacement for measuring mobile FFI and scheduler behavior., - ], - code: { - language: 'bash', - value: `cargo mobench run \\ - --target android \\ - --function my_bench_crate::checksum_bench \\ - --local-only \\ - --iterations 100 \\ - --warmup 10`, - }, - }, - ], - browserstack: [ - { - title: 'Credentials', - body: [ - <>BrowserStack credentials can come from environment variables or local configuration. For mobench CI, they enable App Automate hosted real-device runs. Keep credentials out of committed files., - ], - code: { - language: 'bash', - value: `export BROWSERSTACK_USERNAME="your_username" -export BROWSERSTACK_ACCESS_KEY="your_access_key" -export BROWSERSTACK_PROJECT="mobile-benchmarks"`, - }, - }, - { - title: 'Device resolution', - bullets: [ - <>Use explicit BrowserStack App Automate devices for one-off runs., - <>Use matrix files and tags when CI jobs need stable cross-device coverage., - <>Resolution commands help validate BrowserStack availability before running expensive hosted-device jobs., - ], - code: { - language: 'bash', - value: `cargo mobench devices --platform android -cargo mobench devices resolve --platform android --device-matrix .github/mobench-devices.yml -cargo mobench ci run --target android --device-matrix .github/mobench-devices.yml --fetch`, - }, - }, - { - title: 'CI contract', - bullets: [ - <>CI runs write summary.json, summary.md, and results.csv., - <>PR reporting can post sticky summaries and compare baselines., - <>Fetch commands retrieve raw BrowserStack artifacts after hosted runs., - <>Use App Automate REST API docs when wiring custom artifact fetchers or provider debugging., - ], - }, - { - title: 'Split-sample merge', - body: [ - <>For long or fragile BrowserStack lanes, run each measured sample as a separate ci run job, store the outputs as sample-*/summary.json, then merge them back into the standard CI contract., - ], - bullets: [ - <>Every input must contain exactly one device, one benchmark, and one measured sample., - <>The command validates the requested function, device, target consistency, and exact measured sample count., - <>Merged timing statistics, raw samples_ns, and resource columns are recomputed for downstream reports, plots, comparisons, and PR comments., - ], - code: { - language: 'bash', - value: `cargo mobench ci merge-split-runs \\ - --samples-dir target/mobench/ci/android/sample_fns__fibonacci/device/split \\ - --output-dir target/mobench/ci/android/sample_fns__fibonacci/device \\ - --function sample_fns::fibonacci \\ - --device "Google Pixel 7-13.0" \\ - --iterations 5 \\ - --warmup 1`, - }, - }, -], -'app-automate': [ - { - title: 'Account and pricing', - body: [ - <>BrowserStack App Automate is hosted real-device automation product mobench uses generated Android Espresso and iOS XCUITest harnesses instead local devices., - <>Create a BrowserStack account, then copy username and access key into CI secrets or local environment variables. Pricing and trial limits change over time, so use BrowserStack's own product and pricing pages as the source of truth., - ], - bullets: [ - <>Product page: BrowserStack App Automate., - <>Pricing page: BrowserStack pricing., - <>Trial FAQ: trial entitlements., - ], - code: { - language: 'bash', - value: `export BROWSERSTACK_USERNAME="your_username" -export BROWSERSTACK_ACCESS_KEY="your_access_key" -export BROWSERSTACK_PROJECT="mobench"`, - }, - }, - { - title: 'Espresso on Android', - body: [ - <>Espresso is Google's Android UI testing framework. In mobench, generated Android runner packaged application under test plus Android instrumentation test APK. BrowserStack Espresso App Automate receives both files, runs suite on real Android devices, exposes status, logs, video, device logs, artifacts through App Automate dashboard API., - ], - bullets: [ - <>Upload app as .apk or .aab to POST /app-automate/espresso/v2/app., - <>Upload Espresso test suite APK to POST /app-automate/espresso/v2/test-suite., - <>Start execution with POST /app-automate/espresso/v2/build, passing app, testSuite, and Android devices., - ], - code: { - language: 'bash', - value: `# Upload Android app -curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \\ - -X POST "https://api-cloud.browserstack.com/app-automate/espresso/v2/app" \\ - -F "file=@target/mobench/android/app-release.apk" \\ - -F "custom_id=mobench-android-app" - -# Upload Espresso test APK -curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \\ - -X POST "https://api-cloud.browserstack.com/app-automate/espresso/v2/test-suite" \\ - -F "file=@target/mobench/android/app-release-androidTest.apk" \\ - -F "custom_id=mobench-android-tests" - -# Start an Espresso build -curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \\ - -X POST "https://api-cloud.browserstack.com/app-automate/espresso/v2/build" \\ - -H "Content-Type: application/json" \\ - -d '{"app":"mobench-android-app","testSuite":"mobench-android-tests","project":"mobench","devices":["Google Pixel 7-13.0"]}'`, - }, - }, - { - title: 'XCUITest on iOS', - body: [ - <>XCUITest is Apple's UI testing framework for iOS apps built with Xcode. In mobench, generated iOS runner is built into installable app XCUITest bundle archive. BrowserStack XCUITest App Automate runs suite on real iOS devices returns build IDs plus per-session logs media., - ], - bullets: [ - <>Upload iOS app as an .ipa to POST /app-automate/xcuitest/v2/app., - <>Upload XCUITest suite as .zip to POST /app-automate/xcuitest/v2/test-suite., - <>Start execution with POST /app-automate/xcuitest/v2/build, passing app, testSuite, and iOS devices., - ], - code: { - language: 'bash', - value: `# Upload iOS app -curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \\ - -X POST "https://api-cloud.browserstack.com/app-automate/xcuitest/v2/app" \\ - -F "file=@target/mobench/ios/MobenchRunner.ipa" \\ - -F "custom_id=mobench-ios-app" - -# Upload XCUITest bundle -curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \\ - -X POST "https://api-cloud.browserstack.com/app-automate/xcuitest/v2/test-suite" \\ - -F "file=@target/mobench/ios/MobenchRunnerUITests.zip" \\ - -F "custom_id=mobench-ios-tests" - -# Start an XCUITest build -curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \\ - -X POST "https://api-cloud.browserstack.com/app-automate/xcuitest/v2/build" \\ - -H "Content-Type: application/json" \\ - -d '{"app":"mobench-ios-app","testSuite":"mobench-ios-tests","project":"mobench","devices":["iPhone 14-16"]}'`, - }, - }, - { - title: 'API lifecycle', - body: [ - <>The App Automate REST API uses JSON over the base URL https://api-cloud.browserstack.com/. The usual CI lifecycle uploads app and test-suite artifacts, creates a build, polls build or session status, fetches logs and media, then normalizes results into mobench summaries., - ], - bullets: [ - <>Authentication uses BrowserStack username and access key over basic auth., - <>Uploads return bs://... URLs and optional custom_id aliases. Use custom IDs in CI when scripts should refer to the latest uploaded app or test suite without rewriting every build request., - <>A build represents execution of a framework-specific test suite on one or more devices; BrowserStack returns build_id for status and artifact lookup., - <>CI should avoid upload loops and respect BrowserStack API limits., - ], - code: { - language: 'bash', - value: `curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \\ - -X GET "https://api-cloud.browserstack.com/app-automate/devices.json" - -curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \\ - -X GET "https://api-cloud.browserstack.com/app-automate/espresso/v2/builds" - -curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \\ - -X GET "https://api-cloud.browserstack.com/app-automate/xcuitest/v2/builds"`, - }, - }, - { - title: 'Devices', - body: [ - <>BrowserStack App Automate runs on physical devices hosted by BrowserStack, not emulators or simulators. Pick exact names and OS versions from BrowserStack App Automate devices, then keep CI matrices small enough for your plan's parallel capacity., - ], - bullets: [ - <>Use GET /app-automate/devices.json when generating or validating mobench device matrices., - <>The device API response includes OS, OS version, device name, real-device flag, tier, and limit fields., - ], - }, -], -profiling: [ - { - title: 'Capability matrix', - bullets: [ - <>Local native profiling is the supported path for native stack capture and flamegraph-style artifacts., - <>BrowserStack benchmark runs can still report timing and resource metrics, but native stack capture and flamegraph generation are local capabilities., - <>Profile commands use the same target, device, matrix, and function concepts as benchmark runs., - ], - }, - { - title: 'Artifacts', - body: [ - <>Each profiling session writes a run-specific directory under target/mobench/profile/<run-id>/ and refreshes convenience copies under target/mobench/profile/., - ], - bullets: [ - <>profile.json: normalized manifest with capture metadata, native capture records, semantic phases, and viewer hints., - <>summary.md: human-readable profile summary., - <>artifacts/processed/stacks.folded: folded stack input used for flamegraph rendering., - <>artifacts/processed/native-report.txt: backend-specific native profiling report., - <>artifacts/processed/flamegraph.full.svg: full-process static flamegraph., - <>artifacts/processed/flamegraph.focused.svg: benchmark-focused static flamegraph., - <>artifacts/processed/flamegraph.html: interactive viewer with mode switching, timeline, search, selection, and legend controls., - <>artifacts/semantic/phases.json: semantic phase data when benchmarks emit phase markers., - ], - code: { - language: 'bash', - value: `cargo mobench profile run \\ - --target android \\ - --function sample_fns::fibonacci \\ - --provider local \\ - --backend android-native \\ - --trace-events-output target/mobench/profile/trace-events.json - -cargo mobench profile summarize \\ - --profile target/mobench/profile/profile.json - -cargo mobench profile diff \\ - --baseline target/mobench/profile/baseline/profile.json \\ - --candidate target/mobench/profile/candidate/profile.json \\ - --normalize`, - }, - }, - { - title: 'Flamegraph viewer', - body: [ - <>Open artifacts/processed/flamegraph.html after profile run or profile diff to inspect the interactive flamegraph. The viewer combines the full-process stack view, a benchmark-focused view, optional harness timeline spans, source-link metadata when symbolization can recover it, and a right-side self-time frame list., - <>For differential profiles, red means a frame is hotter in the candidate profile and blue means it is hotter in the baseline. Frame widths follow candidate sample counts, so the widest red frames are usually the first places to inspect., - ], - bullets: [ - <>Benchmark Only: focus the flamegraph on frames below mobench benchmark anchors, hiding unrelated process/runtime work., - <>Full Process: show all sampled stacks captured by the backend, useful for spotting runtime, FFI, allocator, or harness overhead., - <>Timeline: show chronological harness spans such as warmup, measured benchmark iterations, teardown, and exact harness duration., - <>Back, Forward, and Reset: navigate zoom history and return to the full root., - <>Fullscreen: expand the viewer when frame labels or deep stacks need more room., - <>Legend: explain color semantics, differential heat, and sample-width meaning., - <>Search: find frames by function/module text, then zoom or inspect matching stacks., - <>Self time: use the right rail to inspect the highest self-sample frames; click a frame in the graph to update selection details., - ], - image: { - src: '/assets/flamegraph-viewer.png', - alt: 'Screenshot of the mobench flamegraph viewer showing benchmark-only and full-process modes, timeline spans, search controls, and the self-time frame list.', - caption: 'The generated flamegraph viewer lets you switch between benchmark-only and full-process views, inspect timeline spans, search stack frames, and use the self-time rail to find hot functions.', - }, - code: { - language: 'bash', - value: `# Open the latest interactive viewer after profile run. -open target/mobench/profile/artifacts/processed/flamegraph.html - -# Open a specific run's viewer. -open target/mobench/profile//artifacts/processed/flamegraph.html - -# Open a differential viewer after profile diff. -open target/mobench/profile/diff/artifacts/processed/flamegraph.html`, - }, - }, - { - title: 'Phases', - body: [ - <>Semantic phases label meaningful periods inside benchmark execution so trace-event summaries and the viewer timeline can distinguish setup, warmup, measured iterations, teardown, and runner overhead., - ], - code: { - language: 'rust', - value: `use mobench_sdk::{benchmark, profile_phase}; - -#[benchmark] -pub fn prove_and_verify() { - let proof = profile_phase("prove", || prove()); - profile_phase("verify", || verify(&proof)); -}`, - }, - }, -], - reports: [ - { - title: 'Output layout', - bullets: [ - <>summary.json: normalized machine-readable summary., - <>summary.md: human-readable run summary for CI and PR comments., - <>results.csv: rows for spreadsheet and dashboard ingestion., - <>Optional plot SVGs and profiling bundles live beside run outputs when requested., - ], - }, - { - title: 'Split-run outputs', - bullets: [ - <>Release 0.1.43 can merge sample-*/summary.json inputs from one-sample CI jobs into the same summary.json, summary.md, and results.csv contract., - <>The merged JSON preserves raw samples, recomputes min, max, mean, median, and p95 timing statistics, and combines available resource measurements., - <>Existing report, plot, comparison, and PR-comment tooling can consume merged output without a separate format adapter., - ], - }, - { - title: 'Report helpers', - code: { - language: 'bash', - value: `cargo mobench summary target/mobench/results.json -cargo mobench summary --format json target/mobench/results.json -cargo mobench summary --format csv target/mobench/results.json -cargo mobench report summarize --summary target/mobench/ci/summary.json -cargo mobench report github --pr 123 --summary target/mobench/ci/summary.json`, - }, - }, - { - title: 'Fixtures', - body: [ - <>The repository examples include basic, FFI, and profiling fixtures so downstream tooling can validate summary and trace-event parsing without running device jobs., - ], - }, - ], - 'cli-reference': [ - { - title: 'Command model', - body: [ - <>Use mobench directly, or cargo mobench when installed as a Cargo subcommand. Commands share the same global flags and most commands resolve project layout from explicit flags, config files, Cargo metadata, or workspace defaults., - ], - bullets: [ - <>--dry-run: print the actions that would run without mutating files, invoking providers, or publishing reports., - <>-v / --verbose: print verbose command output and invoked tool commands., - <>--yes: assume yes for overwrite prompts., - <>--non-interactive: disable prompts and fail instead of asking., - <>Common targets: android, ios, or both where supported. BrowserStack run targets use android or ios., - <>Common output formats: text, json, csv, table, markdown, depending on command., - ], - code: { - language: 'text', - value: `mobench [GLOBAL OPTIONS] -cargo mobench [GLOBAL OPTIONS] - -Global options: - --dry-run Print what would be done without doing it. - -v, --verbose Print verbose command/tool output. - --yes Assume yes for overwrite prompts. - --non-interactive Disable prompts and fail instead. - -h, --help Print command help. - -V, --version Print version. - -Top-level commands: - run, init, plan, config, doctor, ci, fetch, compare, init-sdk, build, - package-ipa, package-xcuitest, list, verify, summary, devices, fixture, - report, profile, check`, - }, - }, - { - title: 'Benchmark runs', - body: [ - <>Use run for a one-off benchmark execution and ci run for the stable CI contract. Both can build mobile artifacts, run host-only smoke tests, target BrowserStack devices, fetch artifacts, compare baselines, and write machine-readable outputs., - ], - code: { - language: 'text', - value: `mobench run -Purpose: - Build, package, execute, and optionally fetch benchmark results for a single run. - -Usage: - mobench run [OPTIONS] - -Inputs and flags: - --target Platform to run. - --function Fully-qualified Rust benchmark function. - --project-root Root containing mobench.toml or Cargo workspace. - --crate-path Benchmark crate containing Cargo.toml. - --iterations Measured iterations. Default: command/config dependent. - --warmup Warmup iterations. Default: command/config dependent. - --devices BrowserStack device label; repeatable. - --device-matrix YAML device matrix. - --device-tags Device matrix tags; repeatable. - --config Run config file. - --output JSON report path. - --summary-csv Write CSV summary beside JSON. - --ci Enable CI behavior: summaries, JUnit, regression exits. - --baseline Baseline summary source. - --regression-threshold-pct Regression threshold. Default: 5. - --junit JUnit XML output path. - --local-only Skip mobile builds and run host harness only. - --release Release mobile build; recommended for BrowserStack. - --ios-app Existing .ipa or zipped .app for BrowserStack XCUITest. - --ios-test-suite Existing XCUITest .zip or .ipa. - --ios-deployment-target Generated iOS app/test deployment target. - --ios-runner Generated iOS runner template. - --android-benchmark-timeout-secs Android harness watchdog timeout. - --android-heartbeat-interval-secs Android harness heartbeat interval. - --fetch Fetch BrowserStack artifacts after run. - --fetch-output-dir Default: target/browserstack. - --fetch-poll-interval-secs Default: 5. - --fetch-timeout-secs Default: 300. - --progress Simplified step-by-step progress. - -Outputs: - JSON report at --output when provided. - Optional CSV when --summary-csv is set. - Optional JUnit XML when --junit is set. - BrowserStack raw artifacts under --fetch-output-dir when --fetch is set. - Provider logs, status, and normalized benchmark summaries. - -Examples: - cargo mobench run --target android --function sample_fns::fibonacci --local-only - cargo mobench run --target android --function sample_fns::fibonacci --devices "Google Pixel 7-13.0" --release --fetch - -mobench ci run -Purpose: - Run the stable CI contract for one or more benchmark functions. - -Usage: - mobench ci run --target [OPTIONS] - -Additional CI flags: - --functions Multiple benchmark functions; comma-separated. - --output-dir CI contract output directory. Default: target/mobench/ci. - --requested-by Metadata: actor/user that requested run. - --pr-number Metadata: pull request number. - --request-command Metadata: original command. - --mobench-ref Metadata: mobench git ref/sha. - --plots Plot behavior. Default: auto. - -Outputs: - target/mobench/ci/summary.json Machine-readable CI summary. - target/mobench/ci/summary.md Markdown summary for logs or PR comments. - target/mobench/ci/results.csv Tabular result rows. - Optional JUnit XML, plots, fetched BrowserStack artifacts. - -Examples: - cargo mobench ci run --target android --function sample_fns::fibonacci --local-only - cargo mobench ci run --target both --functions sample_fns::fibonacci,sample_fns::sort --device-tags smoke --release --fetch`, - }, - }, - { - title: 'Build and project setup', - body: [ - <>These commands create config files, project templates, generated mobile runners, packaging artifacts, and validation reports before a benchmark run., - ], - code: { - language: 'text', - value: `mobench init -Purpose: - Scaffold a base run config. -Usage: - mobench init [--output ] [--target ] -Defaults: - --output bench-config.toml - --target android -Outputs: - A TOML config file suitable for run/ci workflows. - -mobench plan -Purpose: - Generate a sample BrowserStack device matrix. -Usage: - mobench plan [--output ] -Default: - --output device-matrix.yaml -Outputs: - YAML device matrix with platform/profile entries. - -mobench init-sdk -Purpose: - Generate an SDK benchmark project template. -Usage: - mobench init-sdk --target [--project-name ] [--output-dir ] [--examples] -Defaults: - --project-name bench-project - --output-dir . -Outputs: - Cargo project files, mobile integration scaffolding, optional example benchmarks. - -mobench build -Purpose: - Build generated Android/iOS benchmark artifacts from a resolved benchmark crate. -Usage: - mobench build --target [OPTIONS] -Flags: - --release Release build. - --project-root Root containing mobench.toml or Cargo workspace. - --output-dir Default: target/mobench. - --crate-path Benchmark crate; default auto-detects bench-mobile/ or crates/{crate}. - --ios-deployment-target Generated iOS deployment target. - --ios-runner Generated iOS runner template. - --progress Simplified progress output. -Outputs: - Android Gradle runner, APK/test APKs, native libs, bench_spec.json. - iOS Xcode runner, xcframework/native libs, app/test artifacts. - -mobench package-ipa -Purpose: - Package generated iOS app as an IPA for distribution testing or BrowserStack. -Usage: - mobench package-ipa [--scheme ] [--method ] [--project-root ] [--crate-path ] [--output-dir ] -Defaults: - --scheme BenchRunner - --method adhoc - --output-dir target/mobench -Outputs: - IPA or zipped app artifact under the iOS output directory. - -mobench package-xcuitest -Purpose: - Package generated XCUITest runner for BrowserStack upload. -Usage: - mobench package-xcuitest [--scheme ] [--project-root ] [--crate-path ] [--output-dir ] -Defaults: - --scheme BenchRunner - --output-dir target/mobench -Outputs: - target/mobench/ios/BenchRunnerUITests.zip by default. - -mobench check -Purpose: - Validate prerequisites before mobile builds. -Usage: - mobench check --target [--format ] -Checks: - Android: ANDROID_NDK_HOME, cargo-ndk, Android Rust targets. - iOS: Xcode, xcodegen, iOS Rust targets. - Both: cargo, rustup. -Outputs: - Text diagnostics or JSON diagnostics. - -mobench doctor -Purpose: - Validate local and CI configuration, including optional BrowserStack credentials. -Usage: - mobench doctor [--target ] [--config ] [--device-matrix ] [--device-tags ] [--browserstack [true|false]] [--format ] -Defaults: - --target both - --browserstack true - --format text -Outputs: - Human-readable or JSON preflight diagnostics.`, - }, - }, - { - title: 'CI commands', - body: [ - <>CI helpers scaffold workflows, summarize offline results, and create GitHub Check Runs. Use ci run for the actual benchmark execution contract., - ], - code: { - language: 'text', - value: `mobench ci init -Purpose: - Generate a GitHub Actions workflow and local action wrapper. -Usage: - mobench ci init [--workflow ] [--action-dir ] -Defaults: - --workflow .github/workflows/mobile-bench.yml - --action-dir .github/actions/mobench -Outputs: - Workflow YAML and local composite/action files. - -mobench ci summarize -Purpose: - Summarize benchmark results and optional BrowserStack metrics. -Usage: - mobench ci summarize [--build-id ] [--results-dir ] [--output-format ] [--output-file ] [--platform ] -Defaults: - --output-format table -Inputs: - --results-dir should contain summary.json/CSV results. - --build-id enriches with BrowserStack device metrics when paired with --results-dir. -Outputs: - Terminal table, Markdown, or JSON summary; optional output file. - -mobench ci merge-split-runs -Purpose: - Merge one-measured-sample CI summaries into the standard CI output contract. -Usage: - mobench ci merge-split-runs --samples-dir --output-dir --function --device