From 30ebca133718896679cc61fbc909c83577b35f0d Mon Sep 17 00:00:00 2001 From: thomas Date: Sat, 15 Aug 2026 09:07:11 +0200 Subject: [PATCH 01/17] feat(website): add new Angular documentation website Co-Authored-By: Claude Fable 5 --- website/.editorconfig | 17 + website/.gitignore | 51 + website/.postcssrc.json | 5 + website/.prettierrc | 12 + website/.vscode/extensions.json | 4 + website/.vscode/launch.json | 20 + website/.vscode/tasks.json | 42 + website/README.md | 59 + website/SPEC.md | 150 + website/angular.json | 81 + website/api/ssr.js | 19 + website/package.json | 51 + website/pnpm-lock.yaml | 5626 +++++++++++++++++ website/pnpm-workspace.yaml | 1 + website/public/angular-challenge.ico | Bin 0 -> 15406 bytes website/public/angular-challenge.webp | Bin 0 -> 5386 bytes .../public/docs-assets/4/unknown-person.png | Bin 0 -> 48272 bytes .../public/docs-assets/4/unknown-student.png | Bin 0 -> 46530 bytes .../public/docs-assets/PR-code-btn-modal.png | Bin 0 -> 26148 bytes website/public/docs-assets/PR-header.png | Bin 0 -> 26895 bytes .../public/docs-assets/angular-challenge.webp | Bin 0 -> 5386 bytes website/public/docs-assets/codespaces.png | Bin 0 -> 32721 bytes website/public/docs-assets/fork-sync.png | Bin 0 -> 10722 bytes website/public/docs-assets/header-github.png | Bin 0 -> 10391 bytes .../public/docs-assets/new-pull-request.png | Bin 0 -> 60954 bytes .../performance/34/profiler-record.png | Bin 0 -> 131843 bytes .../performance/35/memoize-profiler.png | Bin 0 -> 89089 bytes .../docs-assets/performance/profiler-tab.png | Bin 0 -> 54993 bytes .../public/docs-assets/rxjs/49/prototype.gif | Bin 0 -> 106408 bytes .../public/docs-assets/sync-fork-update.png | Bin 0 -> 72374 bytes website/src/app/app.config.server.ts | 12 + website/src/app/app.config.ts | 26 + website/src/app/app.css | 0 website/src/app/app.html | 1 + website/src/app/app.routes.server.ts | 40 + website/src/app/app.routes.ts | 51 + website/src/app/app.ts | 12 + website/src/app/auth.ts | 33 + website/src/app/doc.model.ts | 61 + website/src/app/layout/docs-layout.html | 122 + website/src/app/layout/docs-layout.ts | 54 + website/src/app/layout/site-header.html | 76 + website/src/app/layout/site-header.ts | 29 + .../src/app/pages/coming-soon/coming-soon.ts | 18 + website/src/app/pages/docs/doc-page.html | 167 + website/src/app/pages/docs/doc-page.ts | 63 + website/src/app/pages/docs/doc-resolver.ts | 20 + website/src/app/pages/landing/landing.html | 212 + website/src/app/pages/landing/landing.ts | 90 + .../app/pages/leaderboard/leaderboard.html | 46 + .../src/app/pages/leaderboard/leaderboard.ts | 74 + website/src/app/pages/not-found/not-found.ts | 25 + .../app/pages/solutions/diff-highlighter.ts | 89 + .../src/app/pages/solutions/diff-parser.ts | 89 + .../app/pages/solutions/solution-diff.html | 161 + .../src/app/pages/solutions/solution-diff.ts | 124 + .../src/app/pages/solutions/solution.model.ts | 37 + .../app/pages/solutions/solutions-list.html | 78 + .../src/app/pages/solutions/solutions-list.ts | 39 + website/src/app/shared/comments.ts | 61 + .../src/content/authors/Ioannis-Tsironis.json | 5 + .../src/content/authors/devesh-chaudhari.json | 4 + website/src/content/authors/lance-finney.json | 6 + .../content/authors/stanislav-gavrilov.json | 5 + website/src/content/authors/sven-brodny.json | 5 + .../src/content/authors/thomas-laforge.json | 6 + .../src/content/authors/timothy-alcaide.json | 7 + .../content/authors/wandrille-guesdon.json | 5 + .../challenges/angular/1-projection.md | 51 + .../angular/10-utility-wrapper-pipe.md | 39 + .../angular/13-highly-customizable-css.md | 24 + .../angular/16-master-dependency-injection.md | 30 + .../angular/21-anchor-navigation.md | 21 + .../challenges/angular/22-router-input.md | 31 + .../angular/31-module-to-standalone.md | 29 + .../angular/32-change-detection-bug.md | 46 + .../angular/33-decoupling-components.md | 35 + .../challenges/angular/39-injection-token.md | 38 + .../angular/4-typed-context-outlet.md | 46 + .../challenges/angular/44-view-transition.md | 84 + .../challenges/angular/45-react-in-angular.md | 81 + .../angular/46-simple-animations.md | 49 + .../challenges/angular/5-crud-application.md | 56 + .../angular/52-lazy-load-component.md | 48 + .../angular/55-back-button-navigation.md | 56 + .../angular/57-content-projection-default.md | 36 + .../58-content-projection-condition.md | 38 + .../angular/59-content-projection-defer.md | 27 + .../angular/6-structural-directive.md | 63 + .../challenges/angular/60-async-redirect.md | 22 + .../content/challenges/angular/8-pure-pipe.md | 41 + .../angular/9-wrap-function-pipe.md | 42 + .../forms/41-control-value-accessor.md | 43 + .../forms/48-avoid-losing-form-data.md | 40 + .../forms/61-simplest-signal-form.md | 58 + .../62-crossfield-validation-signal-form.md | 92 + .../challenges/forms/63-child-forms.md | 63 + .../content/challenges/forms/64-form-array.md | 70 + .../forms/65-signal-form-edition.md | 63 + .../challenges/nx/25-generator-lib-ext.md | 56 + .../challenges/nx/26-generator-comp.md | 148 + .../challenges/nx/27-forbid-enum-rule.md | 27 + .../nx/42-static-vs-dynamic-import.md | 31 + .../12-optimize-change-detection.md | 41 + .../performance/34-default-vs-onpush.md | 57 + .../challenges/performance/35-memoization.md | 51 + .../performance/36-ngfor-optimization.md | 34 + .../performance/37-optimize-big-list.md | 39 + .../challenges/performance/40-web-worker.md | 36 + .../content/challenges/performance/index.mdx | 71 + .../rxjs/11-high-order-operator-bug.md | 32 + .../challenges/rxjs/14-race-condition.md | 30 + .../challenges/rxjs/38-rxjs-catch-error.md | 37 + .../challenges/rxjs/49-hold-to-save-button.md | 46 + .../signal/30-interop-rxjs-signal.md | 22 + .../challenges/signal/43-signal-input.md | 55 + .../challenges/signal/50-bug-effect-signal.md | 40 + .../signal/51-function-call-effect.md | 25 + .../signal/53-big-signal-performance.md | 24 + .../signal/54-pipe-observable-to-signal.md | 22 + .../challenges/signal/56-forms-and-signal.md | 27 + .../content/challenges/testing/17-router.md | 28 + .../testing/18-nested-components.md | 32 + .../challenges/testing/19-input-output.md | 33 + .../content/challenges/testing/20-modal.md | 37 + .../content/challenges/testing/23-harness.md | 30 + .../challenges/testing/24-harness-creation.md | 48 + .../content/challenges/testing/28-checkbox.md | 30 + .../testing/29-real-life-application.md | 38 + .../src/content/challenges/testing/index.mdx | 74 + .../typescript/15-function-overload.md | 27 + .../typescript/47-enums-vs-union-types.md | 80 + website/src/content/guides/checkout-answer.md | 57 + website/src/content/guides/contribute.md | 25 + .../src/content/guides/create-challenge.md | 66 + website/src/content/guides/faq.md | 20 + website/src/content/guides/getting-started.md | 82 + website/src/content/guides/rebase.md | 57 + .../src/content/guides/resolve-challenge.md | 110 + website/src/index.html | 22 + website/src/main.server.ts | 8 + website/src/main.ts | 6 + website/src/server.ts | 83 + website/src/server/auth.ts | 82 + website/src/server/github-api.ts | 450 ++ website/src/styles.css | 167 + website/tools/generate-content.mjs | 294 + website/tsconfig.app.json | 16 + website/tsconfig.json | 31 + website/tsconfig.spec.json | 14 + website/vercel.json | 7 + 151 files changed, 12558 insertions(+) create mode 100644 website/.editorconfig create mode 100644 website/.gitignore create mode 100644 website/.postcssrc.json create mode 100644 website/.prettierrc create mode 100644 website/.vscode/extensions.json create mode 100644 website/.vscode/launch.json create mode 100644 website/.vscode/tasks.json create mode 100644 website/README.md create mode 100644 website/SPEC.md create mode 100644 website/angular.json create mode 100644 website/api/ssr.js create mode 100644 website/package.json create mode 100644 website/pnpm-lock.yaml create mode 100644 website/pnpm-workspace.yaml create mode 100644 website/public/angular-challenge.ico create mode 100644 website/public/angular-challenge.webp create mode 100644 website/public/docs-assets/4/unknown-person.png create mode 100644 website/public/docs-assets/4/unknown-student.png create mode 100644 website/public/docs-assets/PR-code-btn-modal.png create mode 100644 website/public/docs-assets/PR-header.png create mode 100644 website/public/docs-assets/angular-challenge.webp create mode 100644 website/public/docs-assets/codespaces.png create mode 100644 website/public/docs-assets/fork-sync.png create mode 100644 website/public/docs-assets/header-github.png create mode 100644 website/public/docs-assets/new-pull-request.png create mode 100644 website/public/docs-assets/performance/34/profiler-record.png create mode 100644 website/public/docs-assets/performance/35/memoize-profiler.png create mode 100644 website/public/docs-assets/performance/profiler-tab.png create mode 100644 website/public/docs-assets/rxjs/49/prototype.gif create mode 100644 website/public/docs-assets/sync-fork-update.png create mode 100644 website/src/app/app.config.server.ts create mode 100644 website/src/app/app.config.ts create mode 100644 website/src/app/app.css create mode 100644 website/src/app/app.html create mode 100644 website/src/app/app.routes.server.ts create mode 100644 website/src/app/app.routes.ts create mode 100644 website/src/app/app.ts create mode 100644 website/src/app/auth.ts create mode 100644 website/src/app/doc.model.ts create mode 100644 website/src/app/layout/docs-layout.html create mode 100644 website/src/app/layout/docs-layout.ts create mode 100644 website/src/app/layout/site-header.html create mode 100644 website/src/app/layout/site-header.ts create mode 100644 website/src/app/pages/coming-soon/coming-soon.ts create mode 100644 website/src/app/pages/docs/doc-page.html create mode 100644 website/src/app/pages/docs/doc-page.ts create mode 100644 website/src/app/pages/docs/doc-resolver.ts create mode 100644 website/src/app/pages/landing/landing.html create mode 100644 website/src/app/pages/landing/landing.ts create mode 100644 website/src/app/pages/leaderboard/leaderboard.html create mode 100644 website/src/app/pages/leaderboard/leaderboard.ts create mode 100644 website/src/app/pages/not-found/not-found.ts create mode 100644 website/src/app/pages/solutions/diff-highlighter.ts create mode 100644 website/src/app/pages/solutions/diff-parser.ts create mode 100644 website/src/app/pages/solutions/solution-diff.html create mode 100644 website/src/app/pages/solutions/solution-diff.ts create mode 100644 website/src/app/pages/solutions/solution.model.ts create mode 100644 website/src/app/pages/solutions/solutions-list.html create mode 100644 website/src/app/pages/solutions/solutions-list.ts create mode 100644 website/src/app/shared/comments.ts create mode 100644 website/src/content/authors/Ioannis-Tsironis.json create mode 100644 website/src/content/authors/devesh-chaudhari.json create mode 100644 website/src/content/authors/lance-finney.json create mode 100644 website/src/content/authors/stanislav-gavrilov.json create mode 100644 website/src/content/authors/sven-brodny.json create mode 100644 website/src/content/authors/thomas-laforge.json create mode 100644 website/src/content/authors/timothy-alcaide.json create mode 100644 website/src/content/authors/wandrille-guesdon.json create mode 100644 website/src/content/challenges/angular/1-projection.md create mode 100644 website/src/content/challenges/angular/10-utility-wrapper-pipe.md create mode 100644 website/src/content/challenges/angular/13-highly-customizable-css.md create mode 100644 website/src/content/challenges/angular/16-master-dependency-injection.md create mode 100644 website/src/content/challenges/angular/21-anchor-navigation.md create mode 100644 website/src/content/challenges/angular/22-router-input.md create mode 100644 website/src/content/challenges/angular/31-module-to-standalone.md create mode 100644 website/src/content/challenges/angular/32-change-detection-bug.md create mode 100644 website/src/content/challenges/angular/33-decoupling-components.md create mode 100644 website/src/content/challenges/angular/39-injection-token.md create mode 100644 website/src/content/challenges/angular/4-typed-context-outlet.md create mode 100644 website/src/content/challenges/angular/44-view-transition.md create mode 100644 website/src/content/challenges/angular/45-react-in-angular.md create mode 100644 website/src/content/challenges/angular/46-simple-animations.md create mode 100644 website/src/content/challenges/angular/5-crud-application.md create mode 100644 website/src/content/challenges/angular/52-lazy-load-component.md create mode 100644 website/src/content/challenges/angular/55-back-button-navigation.md create mode 100644 website/src/content/challenges/angular/57-content-projection-default.md create mode 100644 website/src/content/challenges/angular/58-content-projection-condition.md create mode 100644 website/src/content/challenges/angular/59-content-projection-defer.md create mode 100644 website/src/content/challenges/angular/6-structural-directive.md create mode 100644 website/src/content/challenges/angular/60-async-redirect.md create mode 100644 website/src/content/challenges/angular/8-pure-pipe.md create mode 100644 website/src/content/challenges/angular/9-wrap-function-pipe.md create mode 100644 website/src/content/challenges/forms/41-control-value-accessor.md create mode 100644 website/src/content/challenges/forms/48-avoid-losing-form-data.md create mode 100644 website/src/content/challenges/forms/61-simplest-signal-form.md create mode 100644 website/src/content/challenges/forms/62-crossfield-validation-signal-form.md create mode 100644 website/src/content/challenges/forms/63-child-forms.md create mode 100644 website/src/content/challenges/forms/64-form-array.md create mode 100644 website/src/content/challenges/forms/65-signal-form-edition.md create mode 100644 website/src/content/challenges/nx/25-generator-lib-ext.md create mode 100644 website/src/content/challenges/nx/26-generator-comp.md create mode 100644 website/src/content/challenges/nx/27-forbid-enum-rule.md create mode 100644 website/src/content/challenges/nx/42-static-vs-dynamic-import.md create mode 100644 website/src/content/challenges/performance/12-optimize-change-detection.md create mode 100644 website/src/content/challenges/performance/34-default-vs-onpush.md create mode 100644 website/src/content/challenges/performance/35-memoization.md create mode 100644 website/src/content/challenges/performance/36-ngfor-optimization.md create mode 100644 website/src/content/challenges/performance/37-optimize-big-list.md create mode 100644 website/src/content/challenges/performance/40-web-worker.md create mode 100644 website/src/content/challenges/performance/index.mdx create mode 100644 website/src/content/challenges/rxjs/11-high-order-operator-bug.md create mode 100644 website/src/content/challenges/rxjs/14-race-condition.md create mode 100644 website/src/content/challenges/rxjs/38-rxjs-catch-error.md create mode 100644 website/src/content/challenges/rxjs/49-hold-to-save-button.md create mode 100644 website/src/content/challenges/signal/30-interop-rxjs-signal.md create mode 100644 website/src/content/challenges/signal/43-signal-input.md create mode 100644 website/src/content/challenges/signal/50-bug-effect-signal.md create mode 100644 website/src/content/challenges/signal/51-function-call-effect.md create mode 100644 website/src/content/challenges/signal/53-big-signal-performance.md create mode 100644 website/src/content/challenges/signal/54-pipe-observable-to-signal.md create mode 100644 website/src/content/challenges/signal/56-forms-and-signal.md create mode 100644 website/src/content/challenges/testing/17-router.md create mode 100644 website/src/content/challenges/testing/18-nested-components.md create mode 100644 website/src/content/challenges/testing/19-input-output.md create mode 100644 website/src/content/challenges/testing/20-modal.md create mode 100644 website/src/content/challenges/testing/23-harness.md create mode 100644 website/src/content/challenges/testing/24-harness-creation.md create mode 100644 website/src/content/challenges/testing/28-checkbox.md create mode 100644 website/src/content/challenges/testing/29-real-life-application.md create mode 100644 website/src/content/challenges/testing/index.mdx create mode 100644 website/src/content/challenges/typescript/15-function-overload.md create mode 100644 website/src/content/challenges/typescript/47-enums-vs-union-types.md create mode 100644 website/src/content/guides/checkout-answer.md create mode 100644 website/src/content/guides/contribute.md create mode 100644 website/src/content/guides/create-challenge.md create mode 100644 website/src/content/guides/faq.md create mode 100644 website/src/content/guides/getting-started.md create mode 100644 website/src/content/guides/rebase.md create mode 100644 website/src/content/guides/resolve-challenge.md create mode 100644 website/src/index.html create mode 100644 website/src/main.server.ts create mode 100644 website/src/main.ts create mode 100644 website/src/server.ts create mode 100644 website/src/server/auth.ts create mode 100644 website/src/server/github-api.ts create mode 100644 website/src/styles.css create mode 100644 website/tools/generate-content.mjs create mode 100644 website/tsconfig.app.json create mode 100644 website/tsconfig.json create mode 100644 website/tsconfig.spec.json create mode 100644 website/vercel.json diff --git a/website/.editorconfig b/website/.editorconfig new file mode 100644 index 000000000..f166060da --- /dev/null +++ b/website/.editorconfig @@ -0,0 +1,17 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ts] +quote_type = single +ij_typescript_use_double_quotes = false + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/website/.gitignore b/website/.gitignore new file mode 100644 index 000000000..7201e6eab --- /dev/null +++ b/website/.gitignore @@ -0,0 +1,51 @@ +# See https://docs.github.com/get-started/getting-started-with-git/ignoring-files for more about ignoring files. + +# Compiled output +/dist +/tmp +/out-tsc +/bazel-out + +# Node +/node_modules +npm-debug.log +yarn-error.log + +# IDEs and editors +.idea/ +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# Visual Studio Code +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/mcp.json +.history/* + +# Miscellaneous +/.angular/cache +.sass-cache/ +/connect.lock +/coverage +/libpeerconnection.log +testem.log +/typings +__screenshots__/ + +# System files +.DS_Store +Thumbs.db +.vercel +.env* + +# generated content +src/app/generated/ +.vercel +.env.local diff --git a/website/.postcssrc.json b/website/.postcssrc.json new file mode 100644 index 000000000..e092dc7c1 --- /dev/null +++ b/website/.postcssrc.json @@ -0,0 +1,5 @@ +{ + "plugins": { + "@tailwindcss/postcss": {} + } +} diff --git a/website/.prettierrc b/website/.prettierrc new file mode 100644 index 000000000..d6c16d7ee --- /dev/null +++ b/website/.prettierrc @@ -0,0 +1,12 @@ +{ + "printWidth": 100, + "singleQuote": true, + "overrides": [ + { + "files": "*.html", + "options": { + "parser": "angular" + } + } + ] +} diff --git a/website/.vscode/extensions.json b/website/.vscode/extensions.json new file mode 100644 index 000000000..77b374577 --- /dev/null +++ b/website/.vscode/extensions.json @@ -0,0 +1,4 @@ +{ + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846 + "recommendations": ["angular.ng-template"] +} diff --git a/website/.vscode/launch.json b/website/.vscode/launch.json new file mode 100644 index 000000000..925af8370 --- /dev/null +++ b/website/.vscode/launch.json @@ -0,0 +1,20 @@ +{ + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "ng serve", + "type": "chrome", + "request": "launch", + "preLaunchTask": "npm: start", + "url": "http://localhost:4200/" + }, + { + "name": "ng test", + "type": "chrome", + "request": "launch", + "preLaunchTask": "npm: test", + "url": "http://localhost:9876/debug.html" + } + ] +} diff --git a/website/.vscode/tasks.json b/website/.vscode/tasks.json new file mode 100644 index 000000000..244306f98 --- /dev/null +++ b/website/.vscode/tasks.json @@ -0,0 +1,42 @@ +{ + // For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558 + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "start", + "isBackground": true, + "problemMatcher": { + "owner": "typescript", + "pattern": "$tsc", + "background": { + "activeOnStart": true, + "beginsPattern": { + "regexp": "Changes detected" + }, + "endsPattern": { + "regexp": "bundle generation (complete|failed)" + } + } + } + }, + { + "type": "npm", + "script": "test", + "isBackground": true, + "problemMatcher": { + "owner": "typescript", + "pattern": "$tsc", + "background": { + "activeOnStart": true, + "beginsPattern": { + "regexp": "Changes detected" + }, + "endsPattern": { + "regexp": "bundle generation (complete|failed)" + } + } + } + } + ] +} diff --git a/website/README.md b/website/README.md new file mode 100644 index 000000000..79d57f4b3 --- /dev/null +++ b/website/README.md @@ -0,0 +1,59 @@ +# AngularChallengesWebsite + +This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 22.1.4. + +## Development server + +To start a local development server, run: + +```bash +ng serve +``` + +Once the server is running, open your browser and navigate to `http://localhost:4200/`. The application will automatically reload whenever you modify any of the source files. + +## Code scaffolding + +Angular CLI includes powerful code scaffolding tools. To generate a new component, run: + +```bash +ng generate component component-name +``` + +For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run: + +```bash +ng generate --help +``` + +## Building + +To build the project run: + +```bash +ng build +``` + +This will compile your project and store the build artifacts in the `dist/` directory. By default, the production build optimizes your application for performance and speed. + +## Running unit tests + +To execute unit tests with the [Vitest](https://vitest.dev/) test runner, use the following command: + +```bash +ng test +``` + +## Running end-to-end tests + +For end-to-end (e2e) testing, run: + +```bash +ng e2e +``` + +Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs. + +## Additional Resources + +For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page. diff --git a/website/SPEC.md b/website/SPEC.md new file mode 100644 index 000000000..5f72e1e74 --- /dev/null +++ b/website/SPEC.md @@ -0,0 +1,150 @@ +# Angular Challenges Website — Rework Spec + +Replacement of the Astro/Starlight docs (`docs/`) with a fully standalone **Angular v22 SSR** application living in `website/`. English only for v1. Deployed as a **new Vercel project**. + +## Goals + +1. Modern landing page. +2. Same documentation structure as today: left sidebar with **Guides**, **Leaderboard**, **Challenges**. +3. **Main goal:** browse community solutions directly on the website — list of solution PRs per challenge, and a GitHub-like **split diff viewer** when you open one. +4. (Phase 2 — later) Embedded editor to solve a challenge in the browser and submit it as a PR. + +## Tech stack + +| Concern | Choice | +|---|---| +| Framework | Angular v22, standalone components, signals, zoneless | +| SSR | `@angular/ssr` with Express server (server routes for API + OAuth) | +| Styling | Tailwind CSS v4 | +| Content | Markdown files (copied from `docs/src/content/docs`, English only), rendered server-side with `marked` + `shiki` for syntax highlighting | +| Diff rendering | PR patches from GitHub API, parsed and rendered with a custom split-diff component (Shiki-highlighted) | +| Package manager | pnpm (own workspace, standalone from the Nx monorepo — allows Angular v22 while the monorepo stays on 21.x) | +| Hosting | Vercel (SSR server as a Vercel serverless function, static assets on the CDN) | +| Analytics | Google Analytics (same tag `G-6BXJ62W6G5`), Google AdSense (same client id) | +| Comments | giscus (same repo/category config as today) | +| Newsletter | SendPulse embedded form (same form id) | + +## Directory layout + +``` +website/ + SPEC.md + package.json # standalone, not part of the Nx workspace + angular.json + vercel.json + src/ + server.ts # Express + Angular SSR + API routes + main.ts / main.server.ts + content/ + guides/*.md # copied from docs (en only) + challenges//*.md + leaderboard/*.md # intro texts + app/ + layout/ # shell: header, sidebar, footer, mobile menu + pages/ + landing/ + guides/ + leaderboard/ + challenges/ + challenge-detail/ + solutions-list/ + solution-diff/ + shared/ # markdown renderer, diff viewer, github api client, ui bits + public/ +``` + +## Routes (Angular Router, SSR) + +| Route | Render mode | Description | +|---|---|---| +| `/` | prerender | Landing page | +| `/guides/:slug` | prerender | 7 guides (getting-started, resolve-challenge, checkout-answer, create-challenge, contribute, rebase, faq) | +| `/leaderboard/answers` `/leaderboard/challenges` `/leaderboard/commit` | SSR | Leaderboards from GitHub API | +| `/challenges/:category/:slug` | prerender (ISR-refreshable) | Challenge doc page | +| `/challenges/:category/:slug/solutions` | SSR | **NEW** — list of solution PRs | +| `/challenges/:category/:slug/solutions/:prNumber` | SSR | **NEW** — split diff view of one PR | +| `/auth/authorize`, `/auth/callback`, `/auth/logout` | server route | GitHub OAuth flow | +| `/api/*` | server route | JSON endpoints backing the pages (GitHub proxy + cache) | + +Prerendered content pages get correct SEO meta (title, description, og tags) from the markdown frontmatter, matching what Starlight produces today. + +## Layout & pages + +### Landing page (rework) + +Modern Tailwind design, dark-mode first (with light mode toggle), keeping today's content blocks: + +- Sponsor banner (sponsor avatars via `/api/sponsors`, "Become a sponsor" CTA) — sponsors fetched with the server token, same as the current `api/sponsors.js`. +- Hero: logo, tagline "Start now and become an Angular Expert!", CTAs: *Get Started*, *Latest challenge*, *GitHub star*. +- Live GitHub stats strip (stars, forks, contributors, PRs merged) — cached server-side. +- Card grid: 65+ challenges, newsletter subscription, OSS maintainer, learn alongside others, contribute, interview prep. +- Footer: social links (GitHub, LinkedIn, X), attribution. + +### Docs shell + +- Left sidebar identical in structure to today: **Guides** (flat list), **Leaderboard** (3 entries, collapsible), **Challenges** (grouped by category: Angular, Forms, Nx, Performance, RxJS, …, ordered by `sidebar.order` / challenge number), with active-route highlighting, search-free v1 (see Open questions), mobile drawer. +- Right column: table of contents generated from markdown headings (desktop only). +- Header: logo + title, GitHub/LinkedIn/X icons, theme toggle, **Sign in with GitHub** button (avatar + logout when connected). + +### Challenge detail page + +- Markdown body (same content as today, including HTML `
` tips blocks). +- Info asides: how to get started, `npx nx serve ` with copy-to-clipboard. +- Footer metadata: author + contributors (avatars linking to GitHub), video/blog links when present in frontmatter. +- **NEW prominent "Browse solutions" button** → solutions list. +- giscus comment section (mapping: title, same as today). + +### Solutions list (NEW — main goal) + +`GET /api/challenges/:number/solutions` → GitHub search: PRs in `tomalaforge/angular-challenges` with labels `` + `answer` (and `answer author` surfaced separately as the author's solution), sorted by 👍 reactions. + +UI: card list — author avatar/login, PR title, state (open/merged), 👍 count, comments count, created date, link to GitHub. Clicking a card opens the in-site diff view. + +### Solution diff view (NEW — like the attached screenshot) + +`GET /api/pulls/:number/files` → GitHub `pulls/:number/files` (per-file `patch`). + +- **Split (side-by-side) view** like the screenshot: old/new line numbers, red removed / green added line backgrounds with char-level emphasis, collapsed unchanged regions with "N unmodified lines" expanders. +- Unified view toggle for mobile. +- File list header (tree or flat list) with per-file +/− counts; syntax highlighting via Shiki. +- Header: PR title, author, link to the PR on GitHub, 👍 reaction count. A reaction button ("this solution helped me 👍") when signed in. +- Handles GitHub API caveats: files without patches (binary/too large) show a "view on GitHub" fallback; >300 files pagination (never happens for challenges, but no crash). + +### Leaderboards + +Same three boards as today (challenges answered, challenges created, contributions), fed by cached server endpoints instead of client-side GitHub calls, so they render on the server and work for anonymous visitors without burning user rate limits. + +## Authentication & GitHub API strategy + +- **Reuse the existing GitHub OAuth app** (`GITHUB_CLIENT_ID` / `GITHUB_CLIENT_SECRET` env vars) — one new callback URL must be added to it: `https:///auth/callback`. +- Token stored in an **httpOnly secure cookie** (improvement over today's localStorage), refresh handled server-side like today's `auth/refresh`. +- Signing in unlocks: reacting to solutions, higher rate limits for browsing, and (Phase 2) submitting challenges. Read-only browsing works anonymously. +- Server holds a **read-only PAT** (`GITHUB_TOKEN`) used for anonymous traffic, with an in-memory + `Cache-Control`/Vercel CDN cache (solutions list: 5 min; diffs: 1 h; leaderboards/stats/sponsors: 15 min) to stay far below rate limits. + +## Vercel deployment + +- New Vercel project (suggested name: `angular-challenges-website`) rooted at `website/`. +- Build: `pnpm build` (Angular SSR build) + `vercel.json` routing all non-static paths to the SSR function (Node 22 runtime). +- Env vars: `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET`, `GITHUB_TOKEN`. +- Old docs project untouched; when the new site is validated, swap the domain over and retire `docs/`. + +## Phase 2 (out of scope for now, spec'd later) + +- "Try this challenge" button → embedded editor (StackBlitz WebContainers or Monaco — TBD). +- Submit flow: fork → branch → commit → PR from the user's account with correct title/labels (counts for the leaderboard). + +## Milestones + +1. **Scaffold**: Angular v22 SSR + Tailwind + Express server + Vercel deploy of a hello-world shell. ✅ deployable from day one. +2. **Content**: markdown pipeline, guides + challenge pages, sidebar, TOC, SEO meta. +3. **Solutions**: API endpoints + solutions list + split diff viewer. +4. **GitHub extras**: OAuth sign-in, leaderboards, stats, sponsors, reactions. +5. **Landing page** rework + giscus + newsletter + analytics. +6. Polish: 404, loading states, mobile, dark/light, redirects from old URLs. + +## Open questions + +1. **Search**: Starlight ships Pagefind search. v1 without search, or include a simple client-side search over titles? *(default: include a lightweight title/description search in the sidebar — cheap to do)* +2. **Old URL compatibility**: keep the exact Starlight paths (`/challenges/forms/48-avoid-losing-form-data/`) so existing links keep working when the domain swaps — assumed **yes**. +3. **Vercel access**: `vercel` CLI is not installed/authenticated on this machine, and login is interactive. Either run `vercel login` once in this workspace terminal, or create a token (vercel.com → Settings → Tokens) and provide it (`VERCEL_TOKEN`), and I'll create/link/deploy the project myself. +4. **Server PAT**: a fine-grained read-only `GITHUB_TOKEN` is needed for anonymous-traffic caching — to be created by Thomas and added to Vercel env (I'll list exact scopes: public repo read only). diff --git a/website/angular.json b/website/angular.json new file mode 100644 index 000000000..87434cdc1 --- /dev/null +++ b/website/angular.json @@ -0,0 +1,81 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "cli": { + "packageManager": "pnpm" + }, + "newProjectRoot": "projects", + "projects": { + "angular-challenges-website": { + "projectType": "application", + "schematics": {}, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular/build:application", + "options": { + "browser": "src/main.ts", + "tsConfig": "tsconfig.app.json", + "assets": [ + { + "glob": "**/*", + "input": "public" + } + ], + "styles": [ + "src/styles.css" + ], + "server": "src/main.server.ts", + "outputMode": "server", + "security": { + "allowedHosts": [] + }, + "ssr": { + "entry": "src/server.ts" + } + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kB", + "maximumError": "1MB" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "4kB", + "maximumError": "8kB" + } + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular/build:dev-server", + "configurations": { + "production": { + "buildTarget": "angular-challenges-website:build:production" + }, + "development": { + "buildTarget": "angular-challenges-website:build:development" + } + }, + "defaultConfiguration": "development" + }, + "test": { + "builder": "@angular/build:unit-test" + } + } + } + } +} diff --git a/website/api/ssr.js b/website/api/ssr.js new file mode 100644 index 000000000..f06333e53 --- /dev/null +++ b/website/api/ssr.js @@ -0,0 +1,19 @@ +// Vercel serverless entry: delegates every non-static request to the Angular SSR server. +// CommonJS on purpose — Vercel's Node launcher require()s the handler, and CJS can +// still dynamic-import the ESM server bundle. +let handlerPromise; + +module.exports = async (req, res) => { + try { + handlerPromise ??= import( + '../dist/angular-challenges-website/server/server.mjs' + ); + const { reqHandler } = await handlerPromise; + return reqHandler(req, res); + } catch (error) { + console.error('SSR handler failed', error); + res.statusCode = 500; + res.setHeader('content-type', 'text/plain'); + res.end('Internal server error'); + } +}; diff --git a/website/package.json b/website/package.json new file mode 100644 index 000000000..117d0fe62 --- /dev/null +++ b/website/package.json @@ -0,0 +1,51 @@ +{ + "name": "angular-challenges-website", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "pnpm generate && ng serve", + "generate": "node tools/generate-content.mjs", + "build": "pnpm generate && ng build", + "watch": "ng build --watch --configuration development", + "deploy": "vercel pull --yes --environment=production && vercel build --prod && vercel deploy --prebuilt --prod --yes", + "test": "ng test", + "serve:ssr:angular-challenges-website": "node dist/angular-challenges-website/server/server.mjs" + }, + "private": true, + "packageManager": "pnpm@10.23.0", + "dependencies": { + "@angular/common": "^22.1.0", + "@angular/compiler": "^22.1.0", + "@angular/core": "^22.1.0", + "@angular/forms": "^22.1.0", + "@angular/platform-browser": "^22.1.0", + "@angular/platform-server": "^22.1.0", + "@angular/router": "^22.1.0", + "@angular/ssr": "^22.1.4", + "@shikijs/langs": "4.4.3", + "@shikijs/themes": "4.4.3", + "@tailwindcss/postcss": "^4.3.3", + "express": "^5.1.0", + "postcss": "^8.5.26", + "rxjs": "~7.8.0", + "tailwindcss": "^4.3.3", + "tslib": "^2.3.0" + }, + "devDependencies": { + "@angular/build": "^22.1.4", + "@angular/cli": "^22.1.4", + "@angular/compiler-cli": "^22.1.0", + "@tailwindcss/typography": "^0.5.20", + "@types/express": "^5.0.1", + "@types/node": "^20.17.19", + "github-slugger": "^2.0.0", + "gray-matter": "^4.0.3", + "jsdom": "^28.0.0", + "marked": "^18.0.9", + "playwright": "^1.62.1", + "prettier": "^3.8.1", + "shiki": "^4.4.3", + "typescript": "~6.0.2", + "vitest": "^4.0.8" + } +} \ No newline at end of file diff --git a/website/pnpm-lock.yaml b/website/pnpm-lock.yaml new file mode 100644 index 000000000..589754422 --- /dev/null +++ b/website/pnpm-lock.yaml @@ -0,0 +1,5626 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@angular/common': + specifier: ^22.1.0 + version: 22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2) + '@angular/compiler': + specifier: ^22.1.0 + version: 22.1.2 + '@angular/core': + specifier: ^22.1.0 + version: 22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2) + '@angular/forms': + specifier: ^22.1.0 + version: 22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(@angular/platform-browser@22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2)))(rxjs@7.8.2) + '@angular/platform-browser': + specifier: ^22.1.0 + version: 22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2)) + '@angular/platform-server': + specifier: ^22.1.0 + version: 22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@22.1.2)(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(@angular/platform-browser@22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2)))(rxjs@7.8.2) + '@angular/router': + specifier: ^22.1.0 + version: 22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(@angular/platform-browser@22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2)))(rxjs@7.8.2) + '@angular/ssr': + specifier: ^22.1.4 + version: 22.1.4(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(@angular/platform-server@22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@22.1.2)(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(@angular/platform-browser@22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2)))(rxjs@7.8.2))(@angular/router@22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(@angular/platform-browser@22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2)))(rxjs@7.8.2)) + '@shikijs/langs': + specifier: 4.4.3 + version: 4.4.3 + '@shikijs/themes': + specifier: 4.4.3 + version: 4.4.3 + '@tailwindcss/postcss': + specifier: ^4.3.3 + version: 4.3.3 + express: + specifier: ^5.1.0 + version: 5.2.1 + postcss: + specifier: ^8.5.26 + version: 8.5.26 + rxjs: + specifier: ~7.8.0 + version: 7.8.2 + tailwindcss: + specifier: ^4.3.3 + version: 4.3.3 + tslib: + specifier: ^2.3.0 + version: 2.8.1 + devDependencies: + '@angular/build': + specifier: ^22.1.4 + version: 22.1.4(7294df6f0b8344c299db30de3d3b64fb) + '@angular/cli': + specifier: ^22.1.4 + version: 22.1.4(@types/node@20.19.43)(chokidar@5.0.0) + '@angular/compiler-cli': + specifier: ^22.1.0 + version: 22.1.2(@angular/compiler@22.1.2)(typescript@6.0.3) + '@tailwindcss/typography': + specifier: ^0.5.20 + version: 0.5.20(tailwindcss@4.3.3) + '@types/express': + specifier: ^5.0.1 + version: 5.0.6 + '@types/node': + specifier: ^20.17.19 + version: 20.19.43 + github-slugger: + specifier: ^2.0.0 + version: 2.0.0 + gray-matter: + specifier: ^4.0.3 + version: 4.0.3 + jsdom: + specifier: ^28.0.0 + version: 28.1.0 + marked: + specifier: ^18.0.9 + version: 18.0.9 + playwright: + specifier: ^1.62.1 + version: 1.62.1 + prettier: + specifier: ^3.8.1 + version: 3.9.6 + shiki: + specifier: ^4.4.3 + version: 4.4.3 + typescript: + specifier: ~6.0.2 + version: 6.0.3 + vitest: + specifier: ^4.0.8 + version: 4.1.10(@types/node@20.19.43)(jsdom@28.1.0)(vite@8.1.5(@types/node@20.19.43)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.101.0)) + +packages: + + '@acemir/cssom@0.9.31': + resolution: {integrity: sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==} + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@angular-devkit/architect@0.2201.4': + resolution: {integrity: sha512-a2J9hdBYFobhMx9G0KwCdo6+LrWIOOyIeijrA/QSZiPOjg8dAprhMh7BEQkF3eT6R1q7wDGP+IElVR9LsBlXQw==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + hasBin: true + + '@angular-devkit/core@22.1.4': + resolution: {integrity: sha512-40jG/6chng9fQuWtpg1kadPO17sRTurNh0aav6Uxebn65PfNpTpvhPIYVIcRgv4tCKdMd++YH95A8SiaIOwqig==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + chokidar: ^5.0.0 + peerDependenciesMeta: + chokidar: + optional: true + + '@angular-devkit/schematics@22.1.4': + resolution: {integrity: sha512-UBJ7jc7B0vRfmrVwlvpmuudo1D7AfpO6ugf1BxvkM4sw5m8cJpZtaIJFKBorv0QZo78CyDOroQfQdXaijjB2ZA==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + + '@angular/build@22.1.4': + resolution: {integrity: sha512-y5wxiyUu1DjYNG5jiFjjgFp7O5bkyYjWzy2kfyTGq+DjKMEveTzNH3tBkZrE33EJ4wYyfx+rQ01IG9nZbhfdvA==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + '@angular/compiler': ^22.0.0 + '@angular/compiler-cli': ^22.0.0 + '@angular/core': ^22.0.0 + '@angular/localize': ^22.0.0 + '@angular/platform-browser': ^22.0.0 + '@angular/platform-server': ^22.0.0 + '@angular/service-worker': ^22.0.0 + '@angular/ssr': ^22.1.4 + istanbul-lib-instrument: ^6.0.0 + karma: ^6.4.0 + less: ^4.2.0 + ng-packagr: ^22.0.0 + postcss: ^8.4.0 + rollup: ^4.0.0 + tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0 + tslib: ^2.3.0 + typescript: '>=6.0 <6.1' + vitest: ^4.0.8 + peerDependenciesMeta: + '@angular/core': + optional: true + '@angular/localize': + optional: true + '@angular/platform-browser': + optional: true + '@angular/platform-server': + optional: true + '@angular/service-worker': + optional: true + '@angular/ssr': + optional: true + istanbul-lib-instrument: + optional: true + karma: + optional: true + less: + optional: true + ng-packagr: + optional: true + postcss: + optional: true + rollup: + optional: true + tailwindcss: + optional: true + vitest: + optional: true + + '@angular/cli@22.1.4': + resolution: {integrity: sha512-Yt6q7a1vXh0ICFHnRdUOmx/gEXZ87zpkvE1eUWREUqeQ3ARkwqNZVzF3IP+s9NpDDrnc+EB9cqel9SnGZ/0z2Q==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + hasBin: true + + '@angular/common@22.1.2': + resolution: {integrity: sha512-8TzyYPBDvSItV8Vqq8k5u8a9fWaomC9bMEr8z1vVLRZDIPhNQ/UcCyuTYbC7GZkeqrrKGu5m8tjUrA09RCwuaQ==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} + peerDependencies: + '@angular/core': 22.1.2 + rxjs: ^6.5.3 || ^7.4.0 + + '@angular/compiler-cli@22.1.2': + resolution: {integrity: sha512-GWRtvQQz/LvKejF/Zpls+hGnnJkvaPPtd3TZnxfZQ1fYCs7b7gpi0YM9PP02TJz51vhlsgkPYJwgtJAKDJEHNQ==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} + hasBin: true + peerDependencies: + '@angular/compiler': 22.1.2 + typescript: '>=6.0 <6.1' + peerDependenciesMeta: + typescript: + optional: true + + '@angular/compiler@22.1.2': + resolution: {integrity: sha512-aQv0p5MeXuguCeftUUxK4H8Hbw1hC5Zyu+cFsGbsi025LZ9Ngw+BW+iUHDQZAcqHvWDw2wgGOdKh4e7IkcfRyQ==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} + + '@angular/core@22.1.2': + resolution: {integrity: sha512-t7BrgfdeqbdSbFe3CsGX8ySMeKDlZNBPxFMCOanAAqd6W0H1Kh1WFILBs3DIg0NfjpybfSRJAzKcagOFQWNtiw==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} + peerDependencies: + '@angular/compiler': 22.1.2 + rxjs: ^6.5.3 || ^7.4.0 + zone.js: ~0.15.0 || ~0.16.0 + peerDependenciesMeta: + '@angular/compiler': + optional: true + zone.js: + optional: true + + '@angular/forms@22.1.2': + resolution: {integrity: sha512-pKDYSNKje/jox74KzswBdX4sL7kJ8OFkJwLnqng8oc7a/NVl/Vf4/Xq4kyowRAdtPcZfLTUnZG6s0qbegfV5mg==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} + peerDependencies: + '@angular/common': 22.1.2 + '@angular/core': 22.1.2 + '@angular/platform-browser': 22.1.2 + rxjs: ^6.5.3 || ^7.4.0 + + '@angular/platform-browser@22.1.2': + resolution: {integrity: sha512-MQO735ve/tk4gLsWbw8NyBD/DxPfbbmf1pM/vp6K7tZz2xyysMXilqF/k8PBdQBZVOofST8S13inZHQ35nHuRA==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} + peerDependencies: + '@angular/animations': 22.1.2 + '@angular/common': 22.1.2 + '@angular/core': 22.1.2 + peerDependenciesMeta: + '@angular/animations': + optional: true + + '@angular/platform-server@22.1.2': + resolution: {integrity: sha512-RRKARqF95NTK1MCxa6HgU1tZsv8goLdgwnGZRN+8+Q2ujZmbblXo+3nnIsbwUvMr2KyexHnQ3sslfXBgq6B1Dg==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} + peerDependencies: + '@angular/common': 22.1.2 + '@angular/compiler': 22.1.2 + '@angular/core': 22.1.2 + '@angular/platform-browser': 22.1.2 + rxjs: ^6.5.3 || ^7.4.0 + + '@angular/router@22.1.2': + resolution: {integrity: sha512-C2c6NJ9HZUfb1L07M554Zpgvi0TvpOBO6Og9L36v/jsv42m7tpOenvqQVPa8R3va7eqLEszCL7wLFcWeJ8naew==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} + peerDependencies: + '@angular/common': 22.1.2 + '@angular/core': 22.1.2 + '@angular/platform-browser': 22.1.2 + rxjs: ^6.5.3 || ^7.4.0 + + '@angular/ssr@22.1.4': + resolution: {integrity: sha512-9F+st3Wu6D1fjXFLMkeuVxSZc6yDnBak/5/lw2nssgQU2/ph5isTOkXRQ8GA5wTZkJGOjQZabctCUx4IOTYs3w==} + peerDependencies: + '@angular/common': ^22.0.0 + '@angular/core': ^22.0.0 + '@angular/platform-server': ^22.0.0 + '@angular/router': ^22.0.0 + peerDependenciesMeta: + '@angular/platform-server': + optional: true + + '@asamuzakjp/css-color@5.1.11': + resolution: {integrity: sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + '@asamuzakjp/dom-selector@6.8.1': + resolution: {integrity: sha512-MvRz1nCqW0fsy8Qz4dnLIvhOlMzqDVBabZx6lH+YywFDdjXhMY37SmpV1XFX3JzG5GWHn63j6HX6QPr3lZXHvQ==} + + '@asamuzakjp/generational-cache@1.0.1': + resolution: {integrity: sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + '@asamuzakjp/nwsapi@2.3.9': + resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} + + '@babel/code-frame@8.0.0': + resolution: {integrity: sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/compat-data@8.0.0': + resolution: {integrity: sha512-DOjnob/cXOUgDOozCDeq/aK2p5y8dUIVdf6tNhEV1HQRd6I8aQ4f4fbtHRVEvb6lP3BGomrKHiS8ICAASSVQSw==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/core@8.0.1': + resolution: {integrity: sha512-5FgxM4dLQpMJHSiVATk8foW263dVHQHBVpXYiimNECVWG01f4nFyEbQixeT6Mwvg7TayREJ2gpKl3o2RoMdnqw==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/generator@8.0.0': + resolution: {integrity: sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-annotate-as-pure@8.0.0': + resolution: {integrity: sha512-NSpMkMsvvZqzThJ0p1B02cbtA2ObEyfBvq950bmNkyxsxvcxwhvvCB036rKhlEnuBBo30bOrk13u3FzlKSoRrw==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-compilation-targets@8.0.0': + resolution: {integrity: sha512-JwculLABZvyPvyLBpwU/E/IbH2uM3mnxNtIJpxnIfb24y1PrdVxK5Dqjle4DpgqpGRnwgC7G8IkzPdSXZrO1Ew==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-globals@8.0.0': + resolution: {integrity: sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-split-export-declaration@7.24.7': + resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@8.0.0': + resolution: {integrity: sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@8.0.4': + resolution: {integrity: sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-validator-option@8.0.0': + resolution: {integrity: sha512-U4Dybxh4WESWHt5XhBeExi4DrY0/DNK1aHpQbsrQXCUbFHuMweT0TpLEWKvaraV2Y6fS+ZXunsZ8zIuZIgvF2Q==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helpers@8.0.0': + resolution: {integrity: sha512-wfbi91pM3py96oIiJEz7qIpyXDytgr9zQC1HEWwlGNVRAEmItuU/0a41ZUKu1sJGyhhOIpc4t5vk4PYzt8wpsg==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/parser@8.0.4': + resolution: {integrity: sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g==} + engines: {node: ^22.18.0 || >=24.11.0} + hasBin: true + + '@babel/template@8.0.0': + resolution: {integrity: sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/traverse@8.0.4': + resolution: {integrity: sha512-bZnmqzGG8UZneG1lLxBoWIH0G6Gr1D846Yu4/3XnY6FhCndMR49u26nTY08u/dAxWmLWF9vGQOuC+84FfIUoeg==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} + engines: {node: '>=6.9.0'} + + '@babel/types@8.0.4': + resolution: {integrity: sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@bramus/specificity@2.4.2': + resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} + hasBin: true + + '@csstools/color-helpers@6.1.0': + resolution: {integrity: sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg==} + engines: {node: '>=20.19.0'} + + '@csstools/css-calc@3.3.0': + resolution: {integrity: sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/css-color-parser@4.1.10': + resolution: {integrity: sha512-UZhQLIUyJaaMepqehrCODwCg2KW25vFvLWBmqYFaPclYvvxzj/sG8LBOhBFCp11i9uE7t1EyS+RAoV9tztPFyw==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/css-parser-algorithms@4.0.0': + resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/css-syntax-patches-for-csstree@1.1.7': + resolution: {integrity: sha512-fQ+05118eQS1cofO3aJpB5efgpBZMvIzwr/sbC8kDLVA5XLG8q1kJV5yzrUAI1f7lvhPnm8fgIjzFB8/O/5Dig==} + peerDependencies: + css-tree: ^3.2.1 + peerDependenciesMeta: + css-tree: + optional: true + + '@csstools/css-tokenizer@4.0.0': + resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} + engines: {node: '>=20.19.0'} + + '@emnapi/core@1.11.1': + resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} + + '@emnapi/core@1.11.2': + resolution: {integrity: sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==} + + '@emnapi/runtime@1.11.1': + resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} + + '@emnapi/runtime@1.11.2': + resolution: {integrity: sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==} + + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + + '@esbuild/aix-ppc64@0.28.2': + resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.28.2': + resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.28.2': + resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.28.2': + resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.28.2': + resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.28.2': + resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.28.2': + resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.28.2': + resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.28.2': + resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.28.2': + resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.28.2': + resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.28.2': + resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.28.2': + resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.28.2': + resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.28.2': + resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.28.2': + resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.28.2': + resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.28.2': + resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.2': + resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.28.2': + resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.2': + resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.28.2': + resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.28.2': + resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.28.2': + resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.28.2': + resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.28.2': + resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@exodus/bytes@1.15.1': + resolution: {integrity: sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@noble/hashes': ^1.8.0 || ^2.0.0 + peerDependenciesMeta: + '@noble/hashes': + optional: true + + '@harperfast/extended-iterable@1.0.3': + resolution: {integrity: sha512-sSAYhQca3rDWtQUHSAPeO7axFIUJOI6hn1gjRC5APVE1a90tuyT8f5WIgRsFhhWA7htNkju2veB9eWL6YHi/Lw==} + + '@hono/node-server@2.1.1': + resolution: {integrity: sha512-ELuehkj5VCBdgEw9zs+ivkKwyzzUCSQuE96YmiPvn1ECBoZCczbFXJLeEGMTYjphP6gydh4pHMqEYPVMYUVgQg==} + engines: {node: '>=20'} + peerDependencies: + hono: ^4 + + '@inquirer/ansi@2.0.7': + resolution: {integrity: sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + + '@inquirer/checkbox@5.2.1': + resolution: {integrity: sha512-b6xmA/VlTe0ZgDQHDui+Nav470u7u49nRd8/iuhOcQPO9Ch7lGuogydhi2VOmNlZ+zXcM8IcPuNSwQcdJaF/kw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/confirm@6.1.1': + resolution: {integrity: sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@11.2.1': + resolution: {integrity: sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/editor@5.2.2': + resolution: {integrity: sha512-ZRVd/oD+sYsUd5zVm0NflqEzlqfYCyHNsqkHl2oWXEUHs12tCbcSFi+wVFEvD8+LGRaMUsVrE7qeo6lSG/S1Vg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/expand@5.1.1': + resolution: {integrity: sha512-YmQpenjbFSHAK3sOd44puHh3V1KXXr+JiNpUztoSQ4drLh2rTVzTap/YtlAVu/5xavifIlBfNEzJ/neZJ1a/1g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/external-editor@3.0.3': + resolution: {integrity: sha512-6thf5I8q7lZwzGLAxPaaGEREEkZ3nyePPDQ1oyobblxmEE8mqTLguScP7pDjUTAibiyb4hfXl+qjUEJ+di/aNA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@2.0.7': + resolution: {integrity: sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + + '@inquirer/input@5.1.2': + resolution: {integrity: sha512-9K/DDBSQpOyZSkt6sOVP9Vo0TR7atX2kuILsUu0x3wVcVbe97lJwIJKMLdMw25tDYuXl/qp6erT0Xs1rfmcfZg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/number@4.1.1': + resolution: {integrity: sha512-XF4IXAbPnGPgw0wsbC/i2tPcyfdZgDpUlhsqU0SfT4IRIGWha6Xm9VRgN5yYxJq+jnyXlfXI/nQ3ulfk0iEICA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/password@5.1.1': + resolution: {integrity: sha512-3XBfF7DAsp5qeDsvN5Rd1HmbNokVvEQoUM0QLrRcybC9nX96w3Pbmu7qUsb3IT3J3jBvs2+mTXaKHOUsgHMLzg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/prompts@8.5.2': + resolution: {integrity: sha512-IYR/3C/paEVVQYQvdDlFZVjRCJVYHHON0XXMH91KO9GSxs0TdKYWlUdvfQl2EfAHDxUaN3IBffkE/BDTh5nJ6g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/rawlist@5.3.1': + resolution: {integrity: sha512-QqdTqQddL3qPX/PPrjobpsO25NZ4dWXgTLenrR445L2ptLEYE6Z+PD5c5CNDJNx4ugRgELAIpSIJxZaO2jJ2Og==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/search@4.2.1': + resolution: {integrity: sha512-xJj8QWKRSrfKoBIITLZK61dD3zwo0Rz11fgDImku30/Oe81zMdIdGgrLY2h6RkJ+KZ/GhNYIRMKnH/62qBTA5g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/select@5.2.1': + resolution: {integrity: sha512-FlDndEUww8m7BfukO2nJa25vhD+H5jxxCv4oGioKqzyWz3nPHhhw4LKdYRSlXuAx7DsdWia7iyaBPKKS95Evfw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/type@4.0.7': + resolution: {integrity: sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@listr2/prompt-adapter-inquirer@4.2.4': + resolution: {integrity: sha512-/KRI2DMD7JGSYaREF0Ygl7AefJ/2ase4Gc5cBiKqT5l4tFjsSJfhFGcc5nSkgl0Sp9LkCQNzl/cqbVJYP2L3dw==} + engines: {node: '>=22.13.0'} + peerDependencies: + '@inquirer/prompts': '>= 3 < 9' + listr2: 10.2.1 + + '@lmdb/lmdb-darwin-arm64@3.5.6': + resolution: {integrity: sha512-mY5FG4TjPAkY4P0w+OhHaUka5mDh2TX2WKYIwuKzJ1zeW3VvRgxdam/lGJTquI+bthTx5CSHDW+BAQCnNAzkEA==} + cpu: [arm64] + os: [darwin] + + '@lmdb/lmdb-darwin-x64@3.5.6': + resolution: {integrity: sha512-foa+pwitysO8k+xhs7psBFfTKnVgR69NlZRRTHaFVDqphh7AdGpLeyRzKw/ofatr/sN6TiHRRW6mmop0ZrrppQ==} + cpu: [x64] + os: [darwin] + + '@lmdb/lmdb-linux-arm64@3.5.6': + resolution: {integrity: sha512-HmiyFFdJa38s1heCMSooSPaBSFTHJ3C+ERPp28xAPlDX1YiALJVOgbry065nXd8Y7KISWjnw05zpG1RX8IfftA==} + cpu: [arm64] + os: [linux] + + '@lmdb/lmdb-linux-arm@3.5.6': + resolution: {integrity: sha512-QR4YRyR5h5Z8eGXrNQjiyo2NNDfqi3tCc9dQG5Is1blCt+qWw1ZoBWhlWAr5d+jshkifMIJjVHzHGKbkKzF8Tw==} + cpu: [arm] + os: [linux] + + '@lmdb/lmdb-linux-x64@3.5.6': + resolution: {integrity: sha512-ADzCuCF2cTNiX9kDScqcz1fjnAkxPpQNneV3KFTdV3wWtVlI2sTGzySoMTgDpinkMMFj1NTJlxA6XR8fwc4hlA==} + cpu: [x64] + os: [linux] + + '@lmdb/lmdb-win32-arm64@3.5.6': + resolution: {integrity: sha512-J7A9aEQsQiv0TYtBGL7NDIPp2lOS8nnl+zm4sWZm1xlsTTaQ4PgD096Adzdrk27rw3UxCkDXdCUa4ax41oztBQ==} + cpu: [arm64] + os: [win32] + + '@lmdb/lmdb-win32-x64@3.5.6': + resolution: {integrity: sha512-1g7G0knRX2iV/voDu54yxrGqw5Dk0w2oIYb7dgJq8IkOi+m7wbD8Q3QpPFjh0C01G58S88dqGn03len6UPCXsg==} + cpu: [x64] + os: [win32] + + '@modelcontextprotocol/sdk@1.30.0': + resolution: {integrity: sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==} + engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true + + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4': + resolution: {integrity: sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ==} + cpu: [arm64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4': + resolution: {integrity: sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w==} + cpu: [x64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4': + resolution: {integrity: sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw==} + cpu: [arm64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4': + resolution: {integrity: sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw==} + cpu: [arm] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4': + resolution: {integrity: sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ==} + cpu: [x64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4': + resolution: {integrity: sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ==} + cpu: [x64] + os: [win32] + + '@napi-rs/nice-android-arm-eabi@1.1.1': + resolution: {integrity: sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@napi-rs/nice-android-arm64@1.1.1': + resolution: {integrity: sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@napi-rs/nice-darwin-arm64@1.1.1': + resolution: {integrity: sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/nice-darwin-x64@1.1.1': + resolution: {integrity: sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/nice-freebsd-x64@1.1.1': + resolution: {integrity: sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@napi-rs/nice-linux-arm-gnueabihf@1.1.1': + resolution: {integrity: sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/nice-linux-arm64-gnu@1.1.1': + resolution: {integrity: sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/nice-linux-arm64-musl@1.1.1': + resolution: {integrity: sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/nice-linux-ppc64-gnu@1.1.1': + resolution: {integrity: sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==} + engines: {node: '>= 10'} + cpu: [ppc64] + os: [linux] + + '@napi-rs/nice-linux-riscv64-gnu@1.1.1': + resolution: {integrity: sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + + '@napi-rs/nice-linux-s390x-gnu@1.1.1': + resolution: {integrity: sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==} + engines: {node: '>= 10'} + cpu: [s390x] + os: [linux] + + '@napi-rs/nice-linux-x64-gnu@1.1.1': + resolution: {integrity: sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/nice-linux-x64-musl@1.1.1': + resolution: {integrity: sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/nice-openharmony-arm64@1.1.1': + resolution: {integrity: sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [openharmony] + + '@napi-rs/nice-win32-arm64-msvc@1.1.1': + resolution: {integrity: sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@napi-rs/nice-win32-ia32-msvc@1.1.1': + resolution: {integrity: sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@napi-rs/nice-win32-x64-msvc@1.1.1': + resolution: {integrity: sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/nice@1.1.1': + resolution: {integrity: sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==} + engines: {node: '>= 10'} + + '@napi-rs/wasm-runtime@1.2.3': + resolution: {integrity: sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} + peerDependencies: + '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4 + '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4 + + '@oxc-parser/binding-android-arm-eabi@0.142.0': + resolution: {integrity: sha512-ZiRGDutGsv1G6bL/ozy/koC0Sv39T1DqyoC4KD1DOy9ZoACm1O5UWhEK2c02Qdk+4lfLVkvFa/mQ0fm/4h1BtQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxc-parser/binding-android-arm64@0.142.0': + resolution: {integrity: sha512-WZkvGRLNQTz8lR9zP5nLjUdlroRCopBu3g9zF1p/laE6DzT1UbQo8Rdz5MWhaJUPYg/6gp+jo7HUgsyKaN1FtQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxc-parser/binding-darwin-arm64@0.142.0': + resolution: {integrity: sha512-l4khS8LQOOVYsGRVARo1gSaCT/aBSceUVXgtovWc2+drnxVuDr082WA3OCHVdVzIz5JIrP/y9CWsSKxBDNmYGg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxc-parser/binding-darwin-x64@0.142.0': + resolution: {integrity: sha512-QBsNF3nqlXmcH2B1YOPqQYmCJoy4HuIjUxGbBO/k5JAJUl68ghU2psRY2zPk+RyBaWqKP/qfL4oaFgEMCdwskA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxc-parser/binding-freebsd-x64@0.142.0': + resolution: {integrity: sha512-b7Q7m4Cqc6XqNhri3R+QhU+GVy646Pn+bkdhrDdWym/Fdi0ZUa+d73H9dm5H91JtbtAQ/z1d8XKMW3oOV8a4tQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxc-parser/binding-linux-arm-gnueabihf@0.142.0': + resolution: {integrity: sha512-3riVS5IhdH3uCZj1Y9ftDQlR0dvLsIlw/edrRqk8JhgNd5K0XSs+UBtgh50N13CAlW9/TXj6sVGXaKNBocd0Yg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm-musleabihf@0.142.0': + resolution: {integrity: sha512-NmXUOpgpTSkhl795TiXmWppTwmSJ92RC1qvD6e4XOF+slgmo3e6Ah+kEu+6AN8s7NAOEwqGmir58MgSQSWmBSA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm64-gnu@0.142.0': + resolution: {integrity: sha512-gc0EXsKtXgerujmU2Bql3u1L1HsSQ2774R83idq/FoNMPVV/RY/1ErFsvnit7KoiP/sLvzQixeUo4Ut0ic0wmw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxc-parser/binding-linux-arm64-musl@0.142.0': + resolution: {integrity: sha512-F2XvmWSE0uWpie+jHKKIFgdVOe9ypGhkEZxKx5DuW215K6cbAC274yYaPkcM7EqY4Df3Weyhpcz3lsURyH2LVg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxc-parser/binding-linux-ppc64-gnu@0.142.0': + resolution: {integrity: sha512-wLMbT21U/QxknQsk+VvNF0b9D2/aGWhcaQQQ+VYlE8FwD5+GoWZIPPXNzyHmkYyhm0KB3itL+TBavjMatqNnYA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxc-parser/binding-linux-riscv64-gnu@0.142.0': + resolution: {integrity: sha512-+G8F/4ckwT7FCJV4H2bt09xEzJbjNCfuL4Sp1AYNaFtFMVtgIGMuJlteT82U+K0UIZ/DzAR/LDlMFnEuajG7Kw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxc-parser/binding-linux-riscv64-musl@0.142.0': + resolution: {integrity: sha512-hTsHtTLxMAfCo+rpF5K3qZJKW2NpPN/CHd4mYB3y7XlSdspHkd2gehDIofP64AacA9nWQw2tY3O7wR6UY8IVOA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxc-parser/binding-linux-s390x-gnu@0.142.0': + resolution: {integrity: sha512-6y7qYY3TCUDYjqswImdTGl92y+KA/80twALegQPN27kfY+bG7Ib1+L3jbmrCZQx6wrVnai9IPsEZp07I0hx7JQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxc-parser/binding-linux-x64-gnu@0.142.0': + resolution: {integrity: sha512-i69kAWU+2LgoH5bR+zWiiu+UzAw7Oxkwv7COeJTeY19pn4e70nKQcr9Pm6cL2Z0Z54d+gl9qADlK/0yyuCPiBA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxc-parser/binding-linux-x64-musl@0.142.0': + resolution: {integrity: sha512-4SQs678MmjYVrmhAgCWD4o0vpaFszXw9xLX5p2Z9MMFcltxiLkA88wQjh80YHjPrXtpyZ2CWI5m+1yNKM0m2Pw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxc-parser/binding-openharmony-arm64@0.142.0': + resolution: {integrity: sha512-YHpx9N7Ln3a++Tc8rv+H7mrK1zyJQOAwCFg8LZ3lTs1T5afGWeZrLPhPT9HLnIwSjCyJqPWVMIrMxbjcmBr2oQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxc-parser/binding-wasm32-wasi@0.142.0': + resolution: {integrity: sha512-3pLDyY3+oogW73RM5uehNgAiR/Xfb7fvO2Q1Z1gIqZ2+50XDVQmBVlRkHXZTU4gKnQHpwETNsYQVsJ3joVB2iA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@oxc-parser/binding-win32-arm64-msvc@0.142.0': + resolution: {integrity: sha512-Had/VeVY28Oyb0K+Q4FV8KCzoBycIh93oDK6pCbya9lkzdq+ikMHMgBubsdqqlybjJmQRawCQRrnBRHyQwYvcQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-parser/binding-win32-ia32-msvc@0.142.0': + resolution: {integrity: sha512-GGi3+YphVHavvgs6gum2UXoNCqzHAmPt/nXkn8ZQZstV2Q1qZD1Mn8fz/nWrDkefHQtrG/+1/XrbMxsBTo6Svw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxc-parser/binding-win32-x64-msvc@0.142.0': + resolution: {integrity: sha512-Ny/Wv4Us1LGC/ljwNTp+Hx3r/pH15EFfeDF0p+n898gt+TtRd6C9SccHcuUhDiNTb8s5tt7jdeAMDRQZ4Vq6hg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxc-project/types@0.139.0': + resolution: {integrity: sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==} + + '@oxc-project/types@0.140.0': + resolution: {integrity: sha512-h5LUOzGArYemnW1NMz/DuuQhBi96J6JL2Bk8zE4kvqxB5Sg3jxmCiH4uyOWHDkiKSt5vWlG4FIwCR/DbstcNRQ==} + + '@oxc-project/types@0.142.0': + resolution: {integrity: sha512-7W+2q5AKQVU36fkaryontrHn3YDt1RyUYXatw9i5H8ocYe2sPKSFB6eS8WNPeRKiN1qAWWZUPm7gwFzJGrccqQ==} + + '@parcel/watcher-android-arm64@2.6.0': + resolution: {integrity: sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.6.0': + resolution: {integrity: sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.6.0': + resolution: {integrity: sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.6.0': + resolution: {integrity: sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.6.0': + resolution: {integrity: sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm-musl@2.6.0': + resolution: {integrity: sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.6.0': + resolution: {integrity: sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.6.0': + resolution: {integrity: sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.6.0': + resolution: {integrity: sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.6.0': + resolution: {integrity: sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-win32-arm64@2.6.0': + resolution: {integrity: sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-x64@2.6.0': + resolution: {integrity: sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.6.0': + resolution: {integrity: sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==} + engines: {node: '>= 10.0.0'} + + '@rolldown/binding-android-arm64@1.1.5': + resolution: {integrity: sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-android-arm64@1.2.0': + resolution: {integrity: sha512-9yB1l95IrJuNGDFdOYe79vdApdz6WWBCObE+rQ2LUliYUlcyFwSYIb2xb5/Ifw7dAtMy2ZqNyd8QTSOc7duAKw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.1.5': + resolution: {integrity: sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-arm64@1.2.0': + resolution: {integrity: sha512-pexNaW9ACLUOaBITOpU6qVu4VrsOFIjTv6bzgu0YUATo4eUJx0V605PxwZfndpPOn0ilqGqvGQ0M8UW0IE24jg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.1.5': + resolution: {integrity: sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.2.0': + resolution: {integrity: sha512-NqKYaq0355ZmNMG4QGpxtEDxsc7tGDhjhCm4PpE0cwnBW+5Il95LJyq414niEiaKLVjnVHBEjSo1wngKxJNiFw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.1.5': + resolution: {integrity: sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-freebsd-x64@1.2.0': + resolution: {integrity: sha512-3vPoHzh6eBTz9IbB0/qZdSr0Qeks2echn+I4cHu2joV74VriPDdldswksEDzrl1mBB+oPRi+67+3Ib59paxIPQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.1.5': + resolution: {integrity: sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm-gnueabihf@1.2.0': + resolution: {integrity: sha512-E6NNefZ1bUVmKJq2tJkf45J4Zyczj7qm9rUT7NY+Xo2474Y13qWAwc2tvBt0BAVbmtXR1llkxXg0Ou1jbDf2SQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.1.5': + resolution: {integrity: sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.2.0': + resolution: {integrity: sha512-D+TgkdgM1vu+7/Fpf8+v0ARW+RXEP9Ccazgm8zQ4JFFd9Q7SrYQ2TakU5S5ihazQDgpKyAgZDOcIFsvoHmTZ8w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.1.5': + resolution: {integrity: sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.2.0': + resolution: {integrity: sha512-wUqdwJBbAv0APN87GecstdMUtLjjNTs0hBALpxETD73mccFxdmt/XeizXDtN5RAlBwNKmI+Tg+blect2G+8IeQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-ppc64-gnu@1.1.5': + resolution: {integrity: sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@rolldown/binding-linux-ppc64-gnu@1.2.0': + resolution: {integrity: sha512-9DtF35qR9/NrfhM4oxLplCzVVjE+KKm8Pjemi0i/sdhAWkUasjmSo8WTTubNJClhSHCfyk2yeyoXDQEDPtDAAw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@rolldown/binding-linux-s390x-gnu@1.1.5': + resolution: {integrity: sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@rolldown/binding-linux-s390x-gnu@1.2.0': + resolution: {integrity: sha512-RzuHrBh8X8Hntd2N4VR02QGEciq/9JhcZoTpR/Cee6otRrlILGCf3cg2ygHuih+ZebUnWmMrDX6ITI85btO6rQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.1.5': + resolution: {integrity: sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.2.0': + resolution: {integrity: sha512-MK7L0018jjh1jR3mh21G2j1zAVcpscJBlPo2z19pRjv2XOYGRhaV4LyiD8HO6nCDdZln9IFgCMIV5yt4E3klGQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.1.5': + resolution: {integrity: sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.2.0': + resolution: {integrity: sha512-gyrxLQ9NfGb/9LoVnC4kb9miUghw1mghnkfYvNHSnVIXriabnfgGPUP4RLcJm87q3KgYz4FYUG8IDiWUT+CpSw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.1.5': + resolution: {integrity: sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-openharmony-arm64@1.2.0': + resolution: {integrity: sha512-/6VFMQGRmrhP77KXDC+StIxGzcNp5JOIyYtw0CQ8gPlzhpiIRucYfoM5FaFamHd5BJYIdH86yfP46l1p3WdrFA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.1.5': + resolution: {integrity: sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@rolldown/binding-wasm32-wasi@1.2.0': + resolution: {integrity: sha512-rwdbUL465kisF24WEJLvP3JrEG6E5GRuIHt5wpMwHGERtHe4Wm2CIvtf5gTBgr2tGOHKh5NdKEAFS2VkOPE91g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.1.5': + resolution: {integrity: sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-arm64-msvc@1.2.0': + resolution: {integrity: sha512-+5suHwRiKGmhwyUaNT8a5QbrBvLFh2DbO910TEmGRH1aSxwrCezodvGQnulv4uiWEIv1Kq4ypRsJ5+O+ry1DiA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.1.5': + resolution: {integrity: sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.2.0': + resolution: {integrity: sha512-WfFv6/qGufotqBSBzBYwgpCkJBk8Nj7697LL9vTz/XWc67e0r3oewu8iMRwQj3AUL45GVD7wVsPjCsAAtW66Wg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + + '@schematics/angular@22.1.4': + resolution: {integrity: sha512-uiYKuiCnkTEbs4eOU1QJlM5NPw6BR1qgpct8VlrhS4n861WCCjTy5cxiAWJ3Doc0R72d44j3uoBfAEp7KEVn2w==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + + '@shikijs/core@4.4.3': + resolution: {integrity: sha512-QCR4q2ZO/ILJEuwiBMel4wdcTDb1JGwfjKTxPDF6x8ixOaluPrVqIn06C99AcRPhmYlBR56d/Fb+GN58GzExpg==} + engines: {node: '>=20'} + + '@shikijs/engine-javascript@4.4.3': + resolution: {integrity: sha512-FbOjFJp9VLdo1Wevs10BBtVxiTWwNLqZh5Gkhjgda/ioL15YOgeSl9n+6XMa3qRlPQzfhFNe641SrynFHYG0nQ==} + engines: {node: '>=20'} + + '@shikijs/engine-oniguruma@4.4.3': + resolution: {integrity: sha512-EcOQkxdxGQrc1Row/cC2c96/v1dbZqGnEVu1qTuT/MJmp6+cXCvQussowVmCv5Tqr3KuY3c7IbM6HTW3LJ1k9w==} + engines: {node: '>=20'} + + '@shikijs/langs@4.4.3': + resolution: {integrity: sha512-ePic0yfAJGOF83D5wBHK/00EjK65oahBYxFk5epgq33WRv7X9UuxLEV8PtR0szC0z8dl7INIpIodB99JRFlR+A==} + engines: {node: '>=20'} + + '@shikijs/primitive@4.4.3': + resolution: {integrity: sha512-m0wBeLDQDeIxRdUmrCPdQqfuUamDwRL5isCfYbguKD6NiaKpVbsv+3J81DyIKgNW5h4WAIIr8T4EkgQrBBxvaQ==} + engines: {node: '>=20'} + + '@shikijs/themes@4.4.3': + resolution: {integrity: sha512-w8UHjeUnIR965KMWJHUPXOc2mNJUnK3vpVLYLvw5IYU2mnTTJ89E24OrJDBNiJDQ0qzb0tc4l7mrIXx5cFeIyw==} + engines: {node: '>=20'} + + '@shikijs/types@4.4.3': + resolution: {integrity: sha512-UEJxmRR++MAGR6hugn0vgVS2W/6lWAts84FFSrnlH9sP0LNol7E5+NQ792pH8liWUhyMyjhTgSUH3k7iD7tc5g==} + engines: {node: '>=20'} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@tailwindcss/node@4.3.3': + resolution: {integrity: sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==} + + '@tailwindcss/oxide-android-arm64@4.3.3': + resolution: {integrity: sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.3.3': + resolution: {integrity: sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.3.3': + resolution: {integrity: sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.3.3': + resolution: {integrity: sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3': + resolution: {integrity: sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.3': + resolution: {integrity: sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.3.3': + resolution: {integrity: sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.3.3': + resolution: {integrity: sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.3.3': + resolution: {integrity: sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.3.3': + resolution: {integrity: sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.3': + resolution: {integrity: sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.3.3': + resolution: {integrity: sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.3.3': + resolution: {integrity: sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==} + engines: {node: '>= 20'} + + '@tailwindcss/postcss@4.3.3': + resolution: {integrity: sha512-JTSZZGQi1AyKirbLN3azmjVzef92tcX7h+iSqPdaeStyFpGpDlKvvpxeOE8njhbUanbRwr3z8DyzhICWnMtQeg==} + + '@tailwindcss/typography@0.5.20': + resolution: {integrity: sha512-hwbzQuNUfcPvbegQFatVPl/MY/tcM9KLl963hQ5laJKPh81TEZ1+dNG9PirGvcaDBkp+BCshExAyKVPW91dozw==} + peerDependencies: + tailwindcss: '>=3.0.0 || >=4.0.0 || insiders' + + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/express-serve-static-core@5.1.3': + resolution: {integrity: sha512-dPfW8NFiOF4wOHc7+N/QSxlY9cfSsenewGbAz8C8U/MULPd/YZ27LvJUIlzaXie7e6Ove9YunJGgC9tbHD2cKw==} + + '@types/express@5.0.6': + resolution: {integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==} + + '@types/gensync@1.0.5': + resolution: {integrity: sha512-MbsRCT7mTikHwKZ0X+LVUTLRrZZRLipTuXEO9qOYO+zmjMVk81axyClMROf6uoPD9MRVu46bx8zoR0Ad9q3NAg==} + + '@types/hast@3.0.5': + resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==} + + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + + '@types/jsesc@2.5.1': + resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/node@20.19.43': + resolution: {integrity: sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==} + + '@types/qs@6.15.1': + resolution: {integrity: sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/send@1.2.1': + resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} + + '@types/serve-static@2.2.0': + resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@ungap/structured-clone@1.3.3': + resolution: {integrity: sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==} + + '@vitejs/plugin-basic-ssl@2.3.0': + resolution: {integrity: sha512-bdyo8rB3NnQbikdMpHaML9Z1OZPBu6fFOBo+OtxsBlvMJtysWskmBcnbIDhUqgC8tcxNv/a+BcV5U+2nQMm1OQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + peerDependencies: + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@vitest/expect@4.1.10': + resolution: {integrity: sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==} + + '@vitest/mocker@4.1.10': + resolution: {integrity: sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@4.1.10': + resolution: {integrity: sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==} + + '@vitest/runner@4.1.10': + resolution: {integrity: sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==} + + '@vitest/snapshot@4.1.10': + resolution: {integrity: sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==} + + '@vitest/spy@4.1.10': + resolution: {integrity: sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==} + + '@vitest/utils@4.1.10': + resolution: {integrity: sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==} + + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + agent-base@9.0.0: + resolution: {integrity: sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==} + engines: {node: '>= 20'} + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + + ansi-escapes@7.3.0: + resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} + engines: {node: '>=18'} + + ansi-regex@6.3.0: + resolution: {integrity: sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==} + engines: {node: '>=12'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + baseline-browser-mapping@2.11.14: + resolution: {integrity: sha512-JyJ954WzuIR8/FFzX0o5krdSTrBAkcCSRfWSleRsIHSWV+cZe2FI1PKggVkFke1hBldRs+LRxUczzE9iPmgZww==} + engines: {node: '>=6.0.0'} + hasBin: true + + beasties@0.4.3: + resolution: {integrity: sha512-fIIeLOcbAB/K1kb1HBVJoiq1alHL4RCYBSo5e7HzrNkkgMggXR1Vqt/Z9JWnkfe/qdCo66Ux3QRwZioAIBdWRA==} + engines: {node: '>=18.0.0'} + + bidi-js@1.0.3: + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + + body-parser@2.3.0: + resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} + engines: {node: '>=18'} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + browserslist@4.28.8: + resolution: {integrity: sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + caniuse-lite@1.0.30001809: + resolution: {integrity: sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + chardet@2.2.0: + resolution: {integrity: sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==} + + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-spinners@3.4.0: + resolution: {integrity: sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==} + engines: {node: '>=18.20'} + + cli-truncate@5.2.0: + resolution: {integrity: sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==} + engines: {node: '>=20'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + cliui@9.0.1: + resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} + engines: {node: '>=20'} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + content-disposition@1.1.0: + resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} + engines: {node: '>=18'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + content-type@2.1.0: + resolution: {integrity: sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==} + engines: {node: '>=18'} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} + engines: {node: '>= 0.10'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-select@6.0.0: + resolution: {integrity: sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==} + + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@7.0.0: + resolution: {integrity: sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssstyle@6.2.0: + resolution: {integrity: sha512-Fm5NvhYathRnXNVndkUsCCuR63DCLVVwGOOwQw782coXFi5HhkXdu289l59HlXZBawsyNccXfWRYvLzcDCdDig==} + engines: {node: '>=20'} + + data-urls@7.0.0: + resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.406: + resolution: {integrity: sha512-hWH5ORBi3d0IipnMh7BN5GDTaAmrSSSWmznwt2zltdiRNEWoEQyTwF0FFSBxzHO7hLSRT6loQu3IQGV0wg/Tvg==} + + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + + empathic@2.0.1: + resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} + engines: {node: '>=14'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + enhanced-resolve@5.24.5: + resolution: {integrity: sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + entities@8.0.0: + resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} + engines: {node: '>=20.19.0'} + + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@2.3.1: + resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} + + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + esbuild@0.28.2: + resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + + eventsource-parser@3.1.1: + resolution: {integrity: sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==} + engines: {node: '>=18.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + + expect-type@1.4.0: + resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} + engines: {node: '>=12.0.0'} + + express-rate-limit@8.6.2: + resolution: {integrity: sha512-YH4ru+eOJxQABscKFfRCy9R7x9QFGdezclVMwwgFFndzS2Xnm0uo6B0ABZsLhcpeptGv2qvuJVWlQr9gQZoC3A==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + + express@5.2.1: + resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} + engines: {node: '>= 18'} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + + fast-uri@3.1.5: + resolution: {integrity: sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==} + + fast-wrap-ansi@0.2.2: + resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + finalhandler@2.1.1: + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} + engines: {node: '>=18'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hono@4.13.2: + resolution: {integrity: sha512-JydRilDRkYBQMt9qR9U92mXxmbGqsqSn/IKOrh4e7/gEbn+0zSr8igTu0obwJoNGN4sez28DIql7FBHWydoJpA==} + engines: {node: '>=16.9.0'} + + hosted-git-info@10.1.1: + resolution: {integrity: sha512-DeOnSPAvOndYKfw075gt8yZzQ7S2hNztw34zBTfhIzLhmBTswIBg5/y+pqu/VD5cYWm5goAFTusDmUEmKZ0PEQ==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} + + html-encoding-sniffer@6.0.0: + resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + htmlparser2@10.1.0: + resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + https-proxy-agent@9.1.0: + resolution: {integrity: sha512-ag87y7cJJ9/3+GxFr8Oy4O5faDsGRGnBGsJj/YjOSsSx/5eadKLYTMPlzuR6obgoCDDm0abAAZitXXQkMOPSpA==} + engines: {node: '>= 20'} + + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} + engines: {node: '>=0.10.0'} + + immutable@5.1.9: + resolution: {integrity: sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==} + + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ip-address@10.5.0: + resolution: {integrity: sha512-R5SnVLJmgYYvf2F2ZgwSBnelz5G4q5AxIC277GDfUaNbrZKNANcBC7RHqYYePlszf4kBolVkJauG0ZjHHFh55g==} + engines: {node: '>= 12'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@5.1.0: + resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} + engines: {node: '>=18'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + + jose@6.2.8: + resolution: {integrity: sha512-Bsdjwm3Qsd/P0jR+BHDe3LytDfY7WBq2HmCCLIwuVRHMuEC9ae7/R474GIUdF1NgCyZjzVo/A9DOiOBtXq8ZoQ==} + + js-tokens@10.0.0: + resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} + + js-yaml@3.15.1: + resolution: {integrity: sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag==} + hasBin: true + + jsdom@28.1.0: + resolution: {integrity: sha512-0+MoQNYyr2rBHqO1xilltfDjV9G7ymYGlAUazgcDLQaUf8JDHbuGwsxN6U9qWaElZ4w1B2r7yEGIL3GdeW3Rug==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema-typed@8.0.2: + resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} + engines: {node: '>= 12.0.0'} + + listr2@10.2.2: + resolution: {integrity: sha512-JtNtbZj8q5BnDMR7trpwvwk3RIrANtIVzEUm8w7amp6xelLgyuq+4WZoTH913XaQAoH/cNdYhaNzBPA2U3xbDw==} + engines: {node: '>=22.13.0'} + + lmdb@3.5.6: + resolution: {integrity: sha512-j3uE8ReKNyUWDjhfEFSJqE/1DLtfTR5Z8yFzVHvBjAk37wNg7HdScjcv8ttPHRvrdgPQMPWxFFI0SsdBzI5lBw==} + hasBin: true + + log-symbols@7.0.1: + resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} + engines: {node: '>=18'} + + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} + + lru-cache@11.5.2: + resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} + engines: {node: 20 || >=22} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magic-string@1.0.0: + resolution: {integrity: sha512-CGvjzMN08iv6w1mm4/x3Gh1hLb4VnyRUA15FFpl6CsCIGGoe36k7kY5KNz9QDbSBN5I/fWHM6ZlIkUTa5xdUEA==} + + marked@18.0.9: + resolution: {integrity: sha512-/Sa4qiiHZxf0/FQdBBowr9q4r10krCwMvpK48FUBdXdUXScDxiQGR9zCPrFgRVR5LU3iySOiIjy09ZQvADir1w==} + engines: {node: '>= 20'} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + + media-typer@1.1.1: + resolution: {integrity: sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==} + engines: {node: '>= 0.8'} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + msgpackr-extract@3.0.4: + resolution: {integrity: sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw==} + hasBin: true + + msgpackr@1.12.1: + resolution: {integrity: sha512-4EUH9tQHnMmEgzW/MdAP0KIfa1T9AF+htl0ffe2n5vb2EKn9y2co8ccpgWko6S52Jy1PQZKwRnx5/KkYjtd9MQ==} + + mute-stream@3.0.0: + resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==} + engines: {node: ^20.17.0 || >=22.9.0} + + nanoid@3.3.18: + resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-gyp-build-optional-packages@5.2.2: + resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} + hasBin: true + + node-releases@2.0.53: + resolution: {integrity: sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==} + engines: {node: '>=18'} + + npm-package-arg@14.0.0: + resolution: {integrity: sha512-69XQh3k+dtGa1p+7RaR57IuG3rCko96xr/nUfN4yDYBXbTYICiWcOpsFKLN2GtGE9cyIljE+f1exnaYt9MvM+Q==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + obug@2.1.4: + resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} + engines: {node: '>=12.20.0'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + oniguruma-parser@0.12.2: + resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} + + oniguruma-to-es@4.3.6: + resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} + + ora@9.4.1: + resolution: {integrity: sha512-6VlU9MLXbjVQD04AZCMX28hVtA5bUoadvUqO76MUCVA0ilwJbMiHsITRPfyVm6p/BC0Av/BXMujx39WCe1LEqw==} + engines: {node: '>=20'} + + ordered-binary@1.6.1: + resolution: {integrity: sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w==} + + oxc-parser@0.142.0: + resolution: {integrity: sha512-kKR+jPiRJYJDexVoziIg/FVGvr1fT1FZSSJOk6tVoMKKSlsf1Cso+cgGCJkOEDWOP174vRntCPFKg+AS7InWvw==} + engines: {node: ^20.19.0 || >=22.12.0} + + parse5-html-rewriting-stream@8.0.1: + resolution: {integrity: sha512-NaRku2aMpUN1Sh1Gyk1KWUh2A7EJx2c6qYzvwsPtqhoHoaURshdrceYK3LunVCm3WHhm6FS7Vcczbvdh3/UIVw==} + + parse5-sax-parser@8.0.0: + resolution: {integrity: sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw==} + + parse5@8.0.1: + resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-to-regexp@8.4.2: + resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + engines: {node: '>=12'} + + piscina@5.2.0: + resolution: {integrity: sha512-DszUCKeVN/5G5QKo6jAVHL8fmKnkJvQ0ACiVgY7YGCq3TUB2oznAOayvZPIAdEThvhczkXR+qm3IHsNXpFCYfA==} + engines: {node: '>=20.x'} + + pkce-challenge@5.0.1: + resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} + engines: {node: '>=16.20.0'} + + playwright-core@1.62.1: + resolution: {integrity: sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==} + engines: {node: '>=20'} + hasBin: true + + playwright@1.62.1: + resolution: {integrity: sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg==} + engines: {node: '>=20'} + hasBin: true + + postcss-media-query-parser@0.2.3: + resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} + + postcss-safe-parser@7.0.1: + resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: ^8.4.31 + + postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + + postcss@8.5.26: + resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} + engines: {node: ^10 || ^12 || >=14} + + prettier@3.9.6: + resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==} + engines: {node: '>=14'} + hasBin: true + + proc-log@7.0.0: + resolution: {integrity: sha512-FYgfaA69XZ93zaXLoMNQ+ViDXGGBgR8aLh03txzcFhV+9xOXx7+8DLCULrKKpR9+GsH9ZfHm82aSUPpozX0Ztg==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} + + property-information@7.2.0: + resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-agent-negotiate@1.1.0: + resolution: {integrity: sha512-N8IBcM3UgCVzz2L2Lqv8DVntDnnC8/hiV4nEDUPkqq72TPUgYWjQc+bdZlBPZK9LzPAvOY//gAt0S0DApoOXWQ==} + engines: {node: '>= 20'} + peerDependencies: + kerberos: ^2.0.0 + peerDependenciesMeta: + kerberos: + optional: true + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.15.3: + resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} + engines: {node: '>=0.6'} + + range-parser@1.3.0: + resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} + engines: {node: '>= 0.6'} + + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} + + readdirp@5.1.1: + resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} + engines: {node: '>= 20.19.0'} + + reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rolldown@1.1.5: + resolution: {integrity: sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + rolldown@1.2.0: + resolution: {integrity: sha512-u7tgm5l4Yw1iTqUL4EcYOAt7fFvCgQMLeidrnD4GALlC6aOznCjezYajgxeyKw27u0Q5N7fwgCzjVyPIWzwuBA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sass@1.101.0: + resolution: {integrity: sha512-OL3GoQyoUdDt843DpVmDO6y2k1sc5IhUDSpu8XucEI+35neq5QivZ1iuegnpraEVTJXlQGK1gl27zKcTLEPbQw==} + engines: {node: '>=20.19.0'} + hasBin: true + + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + engines: {node: '>= 18'} + + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} + engines: {node: '>= 18'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shiki@4.4.3: + resolution: {integrity: sha512-Mb/GvXPHBAXdgGIcnfU5L3ldpn1XcxrGkPHwqgRx17/I2XRfqlFKk2vGkHWINn1kdXvzJZeuO3is6I9KLPFm0g==} + engines: {node: '>=20'} + + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slice-ansi@7.1.2: + resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} + engines: {node: '>=18'} + + slice-ansi@8.0.0: + resolution: {integrity: sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==} + engines: {node: '>=20'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + std-env@4.2.0: + resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} + + stdin-discarder@0.3.2: + resolution: {integrity: sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==} + engines: {node: '>=18'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string-width@8.2.2: + resolution: {integrity: sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==} + engines: {node: '>=20'} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + tailwindcss@4.3.3: + resolution: {integrity: sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==} + + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@1.3.0: + resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==} + engines: {node: '>=18'} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + tinyrainbow@3.1.1: + resolution: {integrity: sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==} + engines: {node: '>=14.0.0'} + + tldts-core@7.4.10: + resolution: {integrity: sha512-KnQjp53ZekKgm/r3l+u8kJGGzYgrWdP8+Mql7a4vijh2WE0IrZWspQj/TpTxDho/YxO+AnOZnIjQcCD+q6iJsw==} + + tldts@7.4.10: + resolution: {integrity: sha512-GgouD1B+sWwvkaEq8vXC15DjQitxbvs12oIXELpconwm+Tg3zfcEv4jgzq3vtKverDXsg3VI8aRgNL2Nra0Iog==} + hasBin: true + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tough-cookie@6.0.2: + resolution: {integrity: sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==} + engines: {node: '>=16'} + + tr46@6.0.0: + resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} + engines: {node: '>=20'} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-is@2.1.0: + resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} + engines: {node: '>= 18'} + + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + undici@7.29.0: + resolution: {integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==} + engines: {node: '>=20.18.1'} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + update-browserslist-db@1.3.1: + resolution: {integrity: sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + validate-npm-package-name@8.0.0: + resolution: {integrity: sha512-SCv6OOV6Xj2/3cXy3dGmADluJTNcL3o7hZAglNPTe+WYuEuvxgJzxPrSDLZhF+CwyQOubqgecjMmTJGMVLWjYQ==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite@8.1.5: + resolution: {integrity: sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.3.0 + 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 + + vitest@4.1.10: + resolution: {integrity: sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.1.10 + '@vitest/browser-preview': 4.1.10 + '@vitest/browser-webdriverio': 4.1.10 + '@vitest/coverage-istanbul': 4.1.10 + '@vitest/coverage-v8': 4.1.10 + '@vitest/ui': 4.1.10 + happy-dom: '*' + jsdom: '*' + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + + watchpack@2.5.2: + resolution: {integrity: sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==} + engines: {node: '>=10.13.0'} + + weak-lru-cache@1.2.2: + resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==} + + webidl-conversions@8.0.1: + resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} + engines: {node: '>=20'} + + whatwg-mimetype@5.0.0: + resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} + engines: {node: '>=20'} + + whatwg-url@16.0.1: + resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + wrap-ansi@10.0.0: + resolution: {integrity: sha512-SGcvg80f0wUy2/fXES19feHMz8E0JoXv2uNgHOu4Dgi2OrCy1lqwFYEJz1BLbDI0exjPMe/ZdzZ/YpGECBG/aQ==} + engines: {node: '>=20'} + + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xhr2@0.2.1: + resolution: {integrity: sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw==} + engines: {node: '>= 6'} + + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + + yargs@18.1.0: + resolution: {integrity: sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + + yoctocolors@2.2.0: + resolution: {integrity: sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==} + engines: {node: '>=18'} + + zod-to-json-schema@3.25.2: + resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} + peerDependencies: + zod: ^3.25.28 || ^4 + + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@acemir/cssom@0.9.31': {} + + '@alloc/quick-lru@5.2.0': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@angular-devkit/architect@0.2201.4(chokidar@5.0.0)': + dependencies: + '@angular-devkit/core': 22.1.4(chokidar@5.0.0) + rxjs: 7.8.2 + transitivePeerDependencies: + - chokidar + + '@angular-devkit/core@22.1.4(chokidar@5.0.0)': + dependencies: + ajv: 8.20.0 + ajv-formats: 3.0.1(ajv@8.20.0) + jsonc-parser: 3.3.1 + picomatch: 4.0.5 + rxjs: 7.8.2 + source-map: 0.7.6 + optionalDependencies: + chokidar: 5.0.0 + + '@angular-devkit/schematics@22.1.4(chokidar@5.0.0)': + dependencies: + '@angular-devkit/core': 22.1.4(chokidar@5.0.0) + jsonc-parser: 3.3.1 + magic-string: 1.0.0 + ora: 9.4.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - chokidar + + '@angular/build@22.1.4(7294df6f0b8344c299db30de3d3b64fb)': + dependencies: + '@ampproject/remapping': 2.3.0 + '@angular-devkit/architect': 0.2201.4(chokidar@5.0.0) + '@angular/compiler': 22.1.2 + '@angular/compiler-cli': 22.1.2(@angular/compiler@22.1.2)(typescript@6.0.3) + '@babel/core': 8.0.1 + '@babel/helper-annotate-as-pure': 8.0.0 + '@babel/helper-split-export-declaration': 7.24.7 + '@inquirer/confirm': 6.1.1(@types/node@20.19.43) + '@vitejs/plugin-basic-ssl': 2.3.0(vite@8.1.5(@types/node@20.19.43)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.101.0)) + beasties: 0.4.3 + browserslist: 4.28.8 + esbuild: 0.28.2 + https-proxy-agent: 9.1.0 + jsonc-parser: 3.3.1 + listr2: 10.2.2 + magic-string: 1.0.0 + mrmime: 2.0.1 + oxc-parser: 0.142.0 + parse5-html-rewriting-stream: 8.0.1 + picomatch: 4.0.5 + piscina: 5.2.0 + rolldown: 1.2.0 + sass: 1.101.0 + semver: 7.8.5 + source-map-support: 0.5.21 + tinyglobby: 0.2.17 + tslib: 2.8.1 + typescript: 6.0.3 + vite: 8.1.5(@types/node@20.19.43)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.101.0) + watchpack: 2.5.2 + optionalDependencies: + '@angular/core': 22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2) + '@angular/platform-browser': 22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2)) + '@angular/platform-server': 22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@22.1.2)(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(@angular/platform-browser@22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2)))(rxjs@7.8.2) + '@angular/ssr': 22.1.4(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(@angular/platform-server@22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@22.1.2)(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(@angular/platform-browser@22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2)))(rxjs@7.8.2))(@angular/router@22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(@angular/platform-browser@22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2)))(rxjs@7.8.2)) + lmdb: 3.5.6 + postcss: 8.5.26 + tailwindcss: 4.3.3 + vitest: 4.1.10(@types/node@20.19.43)(jsdom@28.1.0)(vite@8.1.5(@types/node@20.19.43)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.101.0)) + transitivePeerDependencies: + - '@types/node' + - '@vitejs/devtools' + - chokidar + - jiti + - kerberos + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + '@angular/cli@22.1.4(@types/node@20.19.43)(chokidar@5.0.0)': + dependencies: + '@angular-devkit/architect': 0.2201.4(chokidar@5.0.0) + '@angular-devkit/core': 22.1.4(chokidar@5.0.0) + '@angular-devkit/schematics': 22.1.4(chokidar@5.0.0) + '@inquirer/prompts': 8.5.2(@types/node@20.19.43) + '@listr2/prompt-adapter-inquirer': 4.2.4(@inquirer/prompts@8.5.2(@types/node@20.19.43))(@types/node@20.19.43)(listr2@10.2.2) + '@modelcontextprotocol/sdk': 1.30.0(zod@4.4.3) + '@schematics/angular': 22.1.4(chokidar@5.0.0) + jsonc-parser: 3.3.1 + listr2: 10.2.2 + npm-package-arg: 14.0.0 + parse5-html-rewriting-stream: 8.0.1 + semver: 7.8.5 + yargs: 18.1.0 + zod: 4.4.3 + transitivePeerDependencies: + - '@cfworker/json-schema' + - '@types/node' + - chokidar + - supports-color + + '@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2)': + dependencies: + '@angular/core': 22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2) + rxjs: 7.8.2 + tslib: 2.8.1 + + '@angular/compiler-cli@22.1.2(@angular/compiler@22.1.2)(typescript@6.0.3)': + dependencies: + '@angular/compiler': 22.1.2 + '@babel/core': 8.0.1 + '@jridgewell/sourcemap-codec': 1.5.5 + chokidar: 5.0.0 + convert-source-map: 1.9.0 + reflect-metadata: 0.2.2 + semver: 7.8.5 + tslib: 2.8.1 + yargs: 18.1.0 + optionalDependencies: + typescript: 6.0.3 + + '@angular/compiler@22.1.2': + dependencies: + tslib: 2.8.1 + + '@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2)': + dependencies: + rxjs: 7.8.2 + tslib: 2.8.1 + optionalDependencies: + '@angular/compiler': 22.1.2 + + '@angular/forms@22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(@angular/platform-browser@22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2)))(rxjs@7.8.2)': + dependencies: + '@angular/common': 22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2) + '@angular/core': 22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2) + '@angular/platform-browser': 22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2)) + '@standard-schema/spec': 1.1.0 + rxjs: 7.8.2 + tslib: 2.8.1 + zod: 4.4.3 + + '@angular/platform-browser@22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))': + dependencies: + '@angular/common': 22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2) + '@angular/core': 22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2) + tslib: 2.8.1 + + '@angular/platform-server@22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@22.1.2)(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(@angular/platform-browser@22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2)))(rxjs@7.8.2)': + dependencies: + '@angular/common': 22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2) + '@angular/compiler': 22.1.2 + '@angular/core': 22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2) + '@angular/platform-browser': 22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2)) + rxjs: 7.8.2 + tslib: 2.8.1 + xhr2: 0.2.1 + + '@angular/router@22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(@angular/platform-browser@22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2)))(rxjs@7.8.2)': + dependencies: + '@angular/common': 22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2) + '@angular/core': 22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2) + '@angular/platform-browser': 22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2)) + rxjs: 7.8.2 + tslib: 2.8.1 + + '@angular/ssr@22.1.4(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(@angular/platform-server@22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@22.1.2)(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(@angular/platform-browser@22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2)))(rxjs@7.8.2))(@angular/router@22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(@angular/platform-browser@22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2)))(rxjs@7.8.2))': + dependencies: + '@angular/common': 22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2) + '@angular/core': 22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2) + '@angular/router': 22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(@angular/platform-browser@22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2)))(rxjs@7.8.2) + tslib: 2.8.1 + optionalDependencies: + '@angular/platform-server': 22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@22.1.2)(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(@angular/platform-browser@22.1.2(@angular/common@22.1.2(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.2(@angular/compiler@22.1.2)(rxjs@7.8.2)))(rxjs@7.8.2) + + '@asamuzakjp/css-color@5.1.11': + dependencies: + '@asamuzakjp/generational-cache': 1.0.1 + '@csstools/css-calc': 3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-color-parser': 4.1.10(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + + '@asamuzakjp/dom-selector@6.8.1': + dependencies: + '@asamuzakjp/nwsapi': 2.3.9 + bidi-js: 1.0.3 + css-tree: 3.2.1 + is-potential-custom-element-name: 1.0.1 + lru-cache: 11.5.2 + + '@asamuzakjp/generational-cache@1.0.1': {} + + '@asamuzakjp/nwsapi@2.3.9': {} + + '@babel/code-frame@8.0.0': + dependencies: + '@babel/helper-validator-identifier': 8.0.4 + js-tokens: 10.0.0 + + '@babel/compat-data@8.0.0': {} + + '@babel/core@8.0.1': + dependencies: + '@babel/code-frame': 8.0.0 + '@babel/generator': 8.0.0 + '@babel/helper-compilation-targets': 8.0.0 + '@babel/helpers': 8.0.0 + '@babel/parser': 8.0.4 + '@babel/template': 8.0.0 + '@babel/traverse': 8.0.4 + '@babel/types': 8.0.4 + '@types/gensync': 1.0.5 + convert-source-map: 2.0.0 + empathic: 2.0.1 + gensync: 1.0.0-beta.2 + import-meta-resolve: 4.2.0 + json5: 2.2.3 + obug: 2.1.4 + semver: 7.8.5 + + '@babel/generator@8.0.0': + dependencies: + '@babel/parser': 8.0.4 + '@babel/types': 8.0.4 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@types/jsesc': 2.5.1 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@8.0.0': + dependencies: + '@babel/types': 8.0.4 + + '@babel/helper-compilation-targets@8.0.0': + dependencies: + '@babel/compat-data': 8.0.0 + '@babel/helper-validator-option': 8.0.0 + browserslist: 4.28.8 + lru-cache: 11.5.2 + semver: 7.8.5 + + '@babel/helper-globals@8.0.0': {} + + '@babel/helper-split-export-declaration@7.24.7': + dependencies: + '@babel/types': 7.29.8 + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-string-parser@8.0.0': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/helper-validator-identifier@8.0.4': {} + + '@babel/helper-validator-option@8.0.0': {} + + '@babel/helpers@8.0.0': + dependencies: + '@babel/template': 8.0.0 + '@babel/types': 8.0.4 + + '@babel/parser@8.0.4': + dependencies: + '@babel/types': 8.0.4 + + '@babel/template@8.0.0': + dependencies: + '@babel/code-frame': 8.0.0 + '@babel/parser': 8.0.4 + '@babel/types': 8.0.4 + + '@babel/traverse@8.0.4': + dependencies: + '@babel/code-frame': 8.0.0 + '@babel/generator': 8.0.0 + '@babel/helper-globals': 8.0.0 + '@babel/parser': 8.0.4 + '@babel/template': 8.0.0 + '@babel/types': 8.0.4 + obug: 2.1.4 + + '@babel/types@7.29.8': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@babel/types@8.0.4': + dependencies: + '@babel/helper-string-parser': 8.0.0 + '@babel/helper-validator-identifier': 8.0.4 + + '@bramus/specificity@2.4.2': + dependencies: + css-tree: 3.2.1 + + '@csstools/color-helpers@6.1.0': {} + + '@csstools/css-calc@3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + + '@csstools/css-color-parser@4.1.10(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/color-helpers': 6.1.0 + '@csstools/css-calc': 3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + + '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/css-tokenizer': 4.0.0 + + '@csstools/css-syntax-patches-for-csstree@1.1.7(css-tree@3.2.1)': + optionalDependencies: + css-tree: 3.2.1 + + '@csstools/css-tokenizer@4.0.0': {} + + '@emnapi/core@1.11.1': + dependencies: + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.8.1 + optional: true + + '@emnapi/core@1.11.2': + dependencies: + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.11.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.11.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.28.2': + optional: true + + '@esbuild/android-arm64@0.28.2': + optional: true + + '@esbuild/android-arm@0.28.2': + optional: true + + '@esbuild/android-x64@0.28.2': + optional: true + + '@esbuild/darwin-arm64@0.28.2': + optional: true + + '@esbuild/darwin-x64@0.28.2': + optional: true + + '@esbuild/freebsd-arm64@0.28.2': + optional: true + + '@esbuild/freebsd-x64@0.28.2': + optional: true + + '@esbuild/linux-arm64@0.28.2': + optional: true + + '@esbuild/linux-arm@0.28.2': + optional: true + + '@esbuild/linux-ia32@0.28.2': + optional: true + + '@esbuild/linux-loong64@0.28.2': + optional: true + + '@esbuild/linux-mips64el@0.28.2': + optional: true + + '@esbuild/linux-ppc64@0.28.2': + optional: true + + '@esbuild/linux-riscv64@0.28.2': + optional: true + + '@esbuild/linux-s390x@0.28.2': + optional: true + + '@esbuild/linux-x64@0.28.2': + optional: true + + '@esbuild/netbsd-arm64@0.28.2': + optional: true + + '@esbuild/netbsd-x64@0.28.2': + optional: true + + '@esbuild/openbsd-arm64@0.28.2': + optional: true + + '@esbuild/openbsd-x64@0.28.2': + optional: true + + '@esbuild/openharmony-arm64@0.28.2': + optional: true + + '@esbuild/sunos-x64@0.28.2': + optional: true + + '@esbuild/win32-arm64@0.28.2': + optional: true + + '@esbuild/win32-ia32@0.28.2': + optional: true + + '@esbuild/win32-x64@0.28.2': + optional: true + + '@exodus/bytes@1.15.1': {} + + '@harperfast/extended-iterable@1.0.3': + optional: true + + '@hono/node-server@2.1.1(hono@4.13.2)': + dependencies: + hono: 4.13.2 + + '@inquirer/ansi@2.0.7': {} + + '@inquirer/checkbox@5.2.1(@types/node@20.19.43)': + dependencies: + '@inquirer/ansi': 2.0.7 + '@inquirer/core': 11.2.1(@types/node@20.19.43) + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@20.19.43) + optionalDependencies: + '@types/node': 20.19.43 + + '@inquirer/confirm@6.1.1(@types/node@20.19.43)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@20.19.43) + '@inquirer/type': 4.0.7(@types/node@20.19.43) + optionalDependencies: + '@types/node': 20.19.43 + + '@inquirer/core@11.2.1(@types/node@20.19.43)': + dependencies: + '@inquirer/ansi': 2.0.7 + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@20.19.43) + cli-width: 4.1.0 + fast-wrap-ansi: 0.2.2 + mute-stream: 3.0.0 + signal-exit: 4.1.0 + optionalDependencies: + '@types/node': 20.19.43 + + '@inquirer/editor@5.2.2(@types/node@20.19.43)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@20.19.43) + '@inquirer/external-editor': 3.0.3(@types/node@20.19.43) + '@inquirer/type': 4.0.7(@types/node@20.19.43) + optionalDependencies: + '@types/node': 20.19.43 + + '@inquirer/expand@5.1.1(@types/node@20.19.43)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@20.19.43) + '@inquirer/type': 4.0.7(@types/node@20.19.43) + optionalDependencies: + '@types/node': 20.19.43 + + '@inquirer/external-editor@3.0.3(@types/node@20.19.43)': + dependencies: + chardet: 2.2.0 + iconv-lite: 0.7.3 + optionalDependencies: + '@types/node': 20.19.43 + + '@inquirer/figures@2.0.7': {} + + '@inquirer/input@5.1.2(@types/node@20.19.43)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@20.19.43) + '@inquirer/type': 4.0.7(@types/node@20.19.43) + optionalDependencies: + '@types/node': 20.19.43 + + '@inquirer/number@4.1.1(@types/node@20.19.43)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@20.19.43) + '@inquirer/type': 4.0.7(@types/node@20.19.43) + optionalDependencies: + '@types/node': 20.19.43 + + '@inquirer/password@5.1.1(@types/node@20.19.43)': + dependencies: + '@inquirer/ansi': 2.0.7 + '@inquirer/core': 11.2.1(@types/node@20.19.43) + '@inquirer/type': 4.0.7(@types/node@20.19.43) + optionalDependencies: + '@types/node': 20.19.43 + + '@inquirer/prompts@8.5.2(@types/node@20.19.43)': + dependencies: + '@inquirer/checkbox': 5.2.1(@types/node@20.19.43) + '@inquirer/confirm': 6.1.1(@types/node@20.19.43) + '@inquirer/editor': 5.2.2(@types/node@20.19.43) + '@inquirer/expand': 5.1.1(@types/node@20.19.43) + '@inquirer/input': 5.1.2(@types/node@20.19.43) + '@inquirer/number': 4.1.1(@types/node@20.19.43) + '@inquirer/password': 5.1.1(@types/node@20.19.43) + '@inquirer/rawlist': 5.3.1(@types/node@20.19.43) + '@inquirer/search': 4.2.1(@types/node@20.19.43) + '@inquirer/select': 5.2.1(@types/node@20.19.43) + optionalDependencies: + '@types/node': 20.19.43 + + '@inquirer/rawlist@5.3.1(@types/node@20.19.43)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@20.19.43) + '@inquirer/type': 4.0.7(@types/node@20.19.43) + optionalDependencies: + '@types/node': 20.19.43 + + '@inquirer/search@4.2.1(@types/node@20.19.43)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@20.19.43) + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@20.19.43) + optionalDependencies: + '@types/node': 20.19.43 + + '@inquirer/select@5.2.1(@types/node@20.19.43)': + dependencies: + '@inquirer/ansi': 2.0.7 + '@inquirer/core': 11.2.1(@types/node@20.19.43) + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@20.19.43) + optionalDependencies: + '@types/node': 20.19.43 + + '@inquirer/type@4.0.7(@types/node@20.19.43)': + optionalDependencies: + '@types/node': 20.19.43 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@listr2/prompt-adapter-inquirer@4.2.4(@inquirer/prompts@8.5.2(@types/node@20.19.43))(@types/node@20.19.43)(listr2@10.2.2)': + dependencies: + '@inquirer/prompts': 8.5.2(@types/node@20.19.43) + '@inquirer/type': 4.0.7(@types/node@20.19.43) + listr2: 10.2.2 + transitivePeerDependencies: + - '@types/node' + + '@lmdb/lmdb-darwin-arm64@3.5.6': + optional: true + + '@lmdb/lmdb-darwin-x64@3.5.6': + optional: true + + '@lmdb/lmdb-linux-arm64@3.5.6': + optional: true + + '@lmdb/lmdb-linux-arm@3.5.6': + optional: true + + '@lmdb/lmdb-linux-x64@3.5.6': + optional: true + + '@lmdb/lmdb-win32-arm64@3.5.6': + optional: true + + '@lmdb/lmdb-win32-x64@3.5.6': + optional: true + + '@modelcontextprotocol/sdk@1.30.0(zod@4.4.3)': + dependencies: + '@hono/node-server': 2.1.1(hono@4.13.2) + ajv: 8.20.0 + ajv-formats: 3.0.1(ajv@8.20.0) + content-type: 1.0.5 + cors: 2.8.6 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.1.1 + express: 5.2.1 + express-rate-limit: 8.6.2(express@5.2.1) + hono: 4.13.2 + jose: 6.2.8 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 4.4.3 + zod-to-json-schema: 3.25.2(zod@4.4.3) + transitivePeerDependencies: + - supports-color + + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4': + optional: true + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4': + optional: true + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4': + optional: true + + '@napi-rs/nice-android-arm-eabi@1.1.1': + optional: true + + '@napi-rs/nice-android-arm64@1.1.1': + optional: true + + '@napi-rs/nice-darwin-arm64@1.1.1': + optional: true + + '@napi-rs/nice-darwin-x64@1.1.1': + optional: true + + '@napi-rs/nice-freebsd-x64@1.1.1': + optional: true + + '@napi-rs/nice-linux-arm-gnueabihf@1.1.1': + optional: true + + '@napi-rs/nice-linux-arm64-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-arm64-musl@1.1.1': + optional: true + + '@napi-rs/nice-linux-ppc64-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-riscv64-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-s390x-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-x64-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-x64-musl@1.1.1': + optional: true + + '@napi-rs/nice-openharmony-arm64@1.1.1': + optional: true + + '@napi-rs/nice-win32-arm64-msvc@1.1.1': + optional: true + + '@napi-rs/nice-win32-ia32-msvc@1.1.1': + optional: true + + '@napi-rs/nice-win32-x64-msvc@1.1.1': + optional: true + + '@napi-rs/nice@1.1.1': + optionalDependencies: + '@napi-rs/nice-android-arm-eabi': 1.1.1 + '@napi-rs/nice-android-arm64': 1.1.1 + '@napi-rs/nice-darwin-arm64': 1.1.1 + '@napi-rs/nice-darwin-x64': 1.1.1 + '@napi-rs/nice-freebsd-x64': 1.1.1 + '@napi-rs/nice-linux-arm-gnueabihf': 1.1.1 + '@napi-rs/nice-linux-arm64-gnu': 1.1.1 + '@napi-rs/nice-linux-arm64-musl': 1.1.1 + '@napi-rs/nice-linux-ppc64-gnu': 1.1.1 + '@napi-rs/nice-linux-riscv64-gnu': 1.1.1 + '@napi-rs/nice-linux-s390x-gnu': 1.1.1 + '@napi-rs/nice-linux-x64-gnu': 1.1.1 + '@napi-rs/nice-linux-x64-musl': 1.1.1 + '@napi-rs/nice-openharmony-arm64': 1.1.1 + '@napi-rs/nice-win32-arm64-msvc': 1.1.1 + '@napi-rs/nice-win32-ia32-msvc': 1.1.1 + '@napi-rs/nice-win32-x64-msvc': 1.1.1 + optional: true + + '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@tybys/wasm-util': 0.10.3 + optional: true + + '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': + dependencies: + '@emnapi/core': 1.11.2 + '@emnapi/runtime': 1.11.2 + '@tybys/wasm-util': 0.10.3 + optional: true + + '@oxc-parser/binding-android-arm-eabi@0.142.0': + optional: true + + '@oxc-parser/binding-android-arm64@0.142.0': + optional: true + + '@oxc-parser/binding-darwin-arm64@0.142.0': + optional: true + + '@oxc-parser/binding-darwin-x64@0.142.0': + optional: true + + '@oxc-parser/binding-freebsd-x64@0.142.0': + optional: true + + '@oxc-parser/binding-linux-arm-gnueabihf@0.142.0': + optional: true + + '@oxc-parser/binding-linux-arm-musleabihf@0.142.0': + optional: true + + '@oxc-parser/binding-linux-arm64-gnu@0.142.0': + optional: true + + '@oxc-parser/binding-linux-arm64-musl@0.142.0': + optional: true + + '@oxc-parser/binding-linux-ppc64-gnu@0.142.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-gnu@0.142.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-musl@0.142.0': + optional: true + + '@oxc-parser/binding-linux-s390x-gnu@0.142.0': + optional: true + + '@oxc-parser/binding-linux-x64-gnu@0.142.0': + optional: true + + '@oxc-parser/binding-linux-x64-musl@0.142.0': + optional: true + + '@oxc-parser/binding-openharmony-arm64@0.142.0': + optional: true + + '@oxc-parser/binding-wasm32-wasi@0.142.0': + dependencies: + '@emnapi/core': 1.11.2 + '@emnapi/runtime': 1.11.2 + '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.142.0': + optional: true + + '@oxc-parser/binding-win32-ia32-msvc@0.142.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.142.0': + optional: true + + '@oxc-project/types@0.139.0': {} + + '@oxc-project/types@0.140.0': {} + + '@oxc-project/types@0.142.0': {} + + '@parcel/watcher-android-arm64@2.6.0': + optional: true + + '@parcel/watcher-darwin-arm64@2.6.0': + optional: true + + '@parcel/watcher-darwin-x64@2.6.0': + optional: true + + '@parcel/watcher-freebsd-x64@2.6.0': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.6.0': + optional: true + + '@parcel/watcher-linux-arm-musl@2.6.0': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.6.0': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.6.0': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.6.0': + optional: true + + '@parcel/watcher-linux-x64-musl@2.6.0': + optional: true + + '@parcel/watcher-win32-arm64@2.6.0': + optional: true + + '@parcel/watcher-win32-x64@2.6.0': + optional: true + + '@parcel/watcher@2.6.0': + dependencies: + detect-libc: 2.1.2 + is-glob: 4.0.3 + node-addon-api: 7.1.1 + picomatch: 4.0.5 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.6.0 + '@parcel/watcher-darwin-arm64': 2.6.0 + '@parcel/watcher-darwin-x64': 2.6.0 + '@parcel/watcher-freebsd-x64': 2.6.0 + '@parcel/watcher-linux-arm-glibc': 2.6.0 + '@parcel/watcher-linux-arm-musl': 2.6.0 + '@parcel/watcher-linux-arm64-glibc': 2.6.0 + '@parcel/watcher-linux-arm64-musl': 2.6.0 + '@parcel/watcher-linux-x64-glibc': 2.6.0 + '@parcel/watcher-linux-x64-musl': 2.6.0 + '@parcel/watcher-win32-arm64': 2.6.0 + '@parcel/watcher-win32-x64': 2.6.0 + optional: true + + '@rolldown/binding-android-arm64@1.1.5': + optional: true + + '@rolldown/binding-android-arm64@1.2.0': + optional: true + + '@rolldown/binding-darwin-arm64@1.1.5': + optional: true + + '@rolldown/binding-darwin-arm64@1.2.0': + optional: true + + '@rolldown/binding-darwin-x64@1.1.5': + optional: true + + '@rolldown/binding-darwin-x64@1.2.0': + optional: true + + '@rolldown/binding-freebsd-x64@1.1.5': + optional: true + + '@rolldown/binding-freebsd-x64@1.2.0': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.1.5': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.2.0': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.1.5': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.2.0': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.1.5': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.2.0': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.1.5': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.2.0': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.1.5': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.2.0': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.1.5': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.2.0': + optional: true + + '@rolldown/binding-linux-x64-musl@1.1.5': + optional: true + + '@rolldown/binding-linux-x64-musl@1.2.0': + optional: true + + '@rolldown/binding-openharmony-arm64@1.1.5': + optional: true + + '@rolldown/binding-openharmony-arm64@1.2.0': + optional: true + + '@rolldown/binding-wasm32-wasi@1.1.5': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + optional: true + + '@rolldown/binding-wasm32-wasi@1.2.0': + dependencies: + '@emnapi/core': 1.11.2 + '@emnapi/runtime': 1.11.2 + '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.1.5': + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.2.0': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.1.5': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.2.0': + optional: true + + '@rolldown/pluginutils@1.0.1': {} + + '@schematics/angular@22.1.4(chokidar@5.0.0)': + dependencies: + '@angular-devkit/core': 22.1.4(chokidar@5.0.0) + '@angular-devkit/schematics': 22.1.4(chokidar@5.0.0) + jsonc-parser: 3.3.1 + typescript: 6.0.3 + transitivePeerDependencies: + - chokidar + + '@shikijs/core@4.4.3': + dependencies: + '@shikijs/primitive': 4.4.3 + '@shikijs/types': 4.4.3 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@4.4.3': + dependencies: + '@shikijs/types': 4.4.3 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.6 + + '@shikijs/engine-oniguruma@4.4.3': + dependencies: + '@shikijs/types': 4.4.3 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@4.4.3': + dependencies: + '@shikijs/types': 4.4.3 + + '@shikijs/primitive@4.4.3': + dependencies: + '@shikijs/types': 4.4.3 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + + '@shikijs/themes@4.4.3': + dependencies: + '@shikijs/types': 4.4.3 + + '@shikijs/types@4.4.3': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@standard-schema/spec@1.1.0': {} + + '@tailwindcss/node@4.3.3': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.24.5 + jiti: 2.7.0 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.3.3 + + '@tailwindcss/oxide-android-arm64@4.3.3': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.3.3': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.3.3': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.3.3': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.3': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.3.3': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.3.3': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.3.3': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.3.3': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.3': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.3.3': + optional: true + + '@tailwindcss/oxide@4.3.3': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.3.3 + '@tailwindcss/oxide-darwin-arm64': 4.3.3 + '@tailwindcss/oxide-darwin-x64': 4.3.3 + '@tailwindcss/oxide-freebsd-x64': 4.3.3 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.3 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.3 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.3 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.3 + '@tailwindcss/oxide-linux-x64-musl': 4.3.3 + '@tailwindcss/oxide-wasm32-wasi': 4.3.3 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.3 + + '@tailwindcss/postcss@4.3.3': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.3.3 + '@tailwindcss/oxide': 4.3.3 + postcss: 8.5.26 + tailwindcss: 4.3.3 + + '@tailwindcss/typography@0.5.20(tailwindcss@4.3.3)': + dependencies: + postcss-selector-parser: 6.0.10 + tailwindcss: 4.3.3 + + '@tybys/wasm-util@0.10.3': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/body-parser@1.19.6': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 20.19.43 + + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 20.19.43 + + '@types/deep-eql@4.0.2': {} + + '@types/estree@1.0.9': {} + + '@types/express-serve-static-core@5.1.3': + dependencies: + '@types/node': 20.19.43 + '@types/qs': 6.15.1 + '@types/range-parser': 1.2.7 + '@types/send': 1.2.1 + + '@types/express@5.0.6': + dependencies: + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 5.1.3 + '@types/serve-static': 2.2.0 + + '@types/gensync@1.0.5': {} + + '@types/hast@3.0.5': + dependencies: + '@types/unist': 3.0.3 + + '@types/http-errors@2.0.5': {} + + '@types/jsesc@2.5.1': {} + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/node@20.19.43': + dependencies: + undici-types: 6.21.0 + + '@types/qs@6.15.1': {} + + '@types/range-parser@1.2.7': {} + + '@types/send@1.2.1': + dependencies: + '@types/node': 20.19.43 + + '@types/serve-static@2.2.0': + dependencies: + '@types/http-errors': 2.0.5 + '@types/node': 20.19.43 + + '@types/unist@3.0.3': {} + + '@ungap/structured-clone@1.3.3': {} + + '@vitejs/plugin-basic-ssl@2.3.0(vite@8.1.5(@types/node@20.19.43)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.101.0))': + dependencies: + vite: 8.1.5(@types/node@20.19.43)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.101.0) + + '@vitest/expect@4.1.10': + dependencies: + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.1.10 + '@vitest/utils': 4.1.10 + chai: 6.2.2 + tinyrainbow: 3.1.1 + + '@vitest/mocker@4.1.10(vite@8.1.5(@types/node@20.19.43)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.101.0))': + dependencies: + '@vitest/spy': 4.1.10 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 8.1.5(@types/node@20.19.43)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.101.0) + + '@vitest/pretty-format@4.1.10': + dependencies: + tinyrainbow: 3.1.1 + + '@vitest/runner@4.1.10': + dependencies: + '@vitest/utils': 4.1.10 + pathe: 2.0.3 + + '@vitest/snapshot@4.1.10': + dependencies: + '@vitest/pretty-format': 4.1.10 + '@vitest/utils': 4.1.10 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@4.1.10': {} + + '@vitest/utils@4.1.10': + dependencies: + '@vitest/pretty-format': 4.1.10 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.1 + + accepts@2.0.0: + dependencies: + mime-types: 3.0.2 + negotiator: 1.0.0 + + agent-base@7.1.4: {} + + agent-base@9.0.0: {} + + ajv-formats@3.0.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.5 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-escapes@7.3.0: + dependencies: + environment: 1.1.0 + + ansi-regex@6.3.0: {} + + ansi-styles@6.2.3: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + assertion-error@2.0.1: {} + + baseline-browser-mapping@2.11.14: {} + + beasties@0.4.3: + dependencies: + css-select: 6.0.0 + css-what: 7.0.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + htmlparser2: 10.1.0 + picocolors: 1.1.1 + postcss: 8.5.26 + postcss-media-query-parser: 0.2.3 + postcss-safe-parser: 7.0.1(postcss@8.5.26) + + bidi-js@1.0.3: + dependencies: + require-from-string: 2.0.2 + + body-parser@2.3.0: + dependencies: + bytes: 3.1.2 + content-type: 2.1.0 + debug: 4.4.3 + http-errors: 2.0.1 + iconv-lite: 0.7.3 + on-finished: 2.4.1 + qs: 6.15.3 + raw-body: 3.0.2 + type-is: 2.1.0 + transitivePeerDependencies: + - supports-color + + boolbase@1.0.0: {} + + browserslist@4.28.8: + dependencies: + baseline-browser-mapping: 2.11.14 + caniuse-lite: 1.0.30001809 + electron-to-chromium: 1.5.406 + node-releases: 2.0.53 + update-browserslist-db: 1.3.1(browserslist@4.28.8) + + buffer-from@1.1.2: {} + + bytes@3.1.2: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + caniuse-lite@1.0.30001809: {} + + ccount@2.0.1: {} + + chai@6.2.2: {} + + chalk@5.6.2: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + chardet@2.2.0: {} + + chokidar@5.0.0: + dependencies: + readdirp: 5.1.1 + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-spinners@3.4.0: {} + + cli-truncate@5.2.0: + dependencies: + slice-ansi: 8.0.0 + string-width: 8.2.2 + + cli-width@4.1.0: {} + + cliui@9.0.1: + dependencies: + string-width: 7.2.0 + strip-ansi: 7.2.0 + wrap-ansi: 9.0.2 + + comma-separated-tokens@2.0.3: {} + + content-disposition@1.1.0: {} + + content-type@1.0.5: {} + + content-type@2.1.0: {} + + convert-source-map@1.9.0: {} + + convert-source-map@2.0.0: {} + + cookie-signature@1.2.2: {} + + cookie@0.7.2: {} + + cors@2.8.6: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-select@6.0.0: + dependencies: + boolbase: 1.0.0 + css-what: 7.0.0 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-tree@3.2.1: + dependencies: + mdn-data: 2.27.1 + source-map-js: 1.2.1 + + css-what@7.0.0: {} + + cssesc@3.0.0: {} + + cssstyle@6.2.0: + dependencies: + '@asamuzakjp/css-color': 5.1.11 + '@csstools/css-syntax-patches-for-csstree': 1.1.7(css-tree@3.2.1) + css-tree: 3.2.1 + lru-cache: 11.5.2 + + data-urls@7.0.0: + dependencies: + whatwg-mimetype: 5.0.0 + whatwg-url: 16.0.1 + transitivePeerDependencies: + - '@noble/hashes' + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decimal.js@10.6.0: {} + + depd@2.0.0: {} + + dequal@2.0.3: {} + + detect-libc@2.1.2: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.406: {} + + emoji-regex@10.6.0: {} + + empathic@2.0.1: {} + + encodeurl@2.0.0: {} + + enhanced-resolve@5.24.5: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.3 + + entities@4.5.0: {} + + entities@7.0.1: {} + + entities@8.0.0: {} + + environment@1.1.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@2.3.1: {} + + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + esbuild@0.28.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.2 + '@esbuild/android-arm': 0.28.2 + '@esbuild/android-arm64': 0.28.2 + '@esbuild/android-x64': 0.28.2 + '@esbuild/darwin-arm64': 0.28.2 + '@esbuild/darwin-x64': 0.28.2 + '@esbuild/freebsd-arm64': 0.28.2 + '@esbuild/freebsd-x64': 0.28.2 + '@esbuild/linux-arm': 0.28.2 + '@esbuild/linux-arm64': 0.28.2 + '@esbuild/linux-ia32': 0.28.2 + '@esbuild/linux-loong64': 0.28.2 + '@esbuild/linux-mips64el': 0.28.2 + '@esbuild/linux-ppc64': 0.28.2 + '@esbuild/linux-riscv64': 0.28.2 + '@esbuild/linux-s390x': 0.28.2 + '@esbuild/linux-x64': 0.28.2 + '@esbuild/netbsd-arm64': 0.28.2 + '@esbuild/netbsd-x64': 0.28.2 + '@esbuild/openbsd-arm64': 0.28.2 + '@esbuild/openbsd-x64': 0.28.2 + '@esbuild/openharmony-arm64': 0.28.2 + '@esbuild/sunos-x64': 0.28.2 + '@esbuild/win32-arm64': 0.28.2 + '@esbuild/win32-ia32': 0.28.2 + '@esbuild/win32-x64': 0.28.2 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + esprima@4.0.1: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.9 + + etag@1.8.1: {} + + eventemitter3@5.0.4: {} + + eventsource-parser@3.1.1: {} + + eventsource@3.0.7: + dependencies: + eventsource-parser: 3.1.1 + + expect-type@1.4.0: {} + + express-rate-limit@8.6.2(express@5.2.1): + dependencies: + debug: 4.4.3 + express: 5.2.1 + ip-address: 10.5.0 + transitivePeerDependencies: + - supports-color + + express@5.2.1: + dependencies: + accepts: 2.0.0 + body-parser: 2.3.0 + content-disposition: 1.1.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.1 + fresh: 2.0.0 + http-errors: 2.0.1 + merge-descriptors: 2.0.0 + mime-types: 3.0.2 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.15.3 + range-parser: 1.3.0 + router: 2.2.0 + send: 1.2.1 + serve-static: 2.2.1 + statuses: 2.0.2 + type-is: 2.1.0 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + fast-deep-equal@3.1.3: {} + + fast-string-truncated-width@3.0.3: {} + + fast-string-width@3.0.2: + dependencies: + fast-string-truncated-width: 3.0.3 + + fast-uri@3.1.5: {} + + fast-wrap-ansi@0.2.2: + dependencies: + fast-string-width: 3.0.2 + + fdir@6.5.0(picomatch@4.0.5): + optionalDependencies: + picomatch: 4.0.5 + + finalhandler@2.1.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + forwarded@0.2.0: {} + + fresh@2.0.0: {} + + fsevents@2.3.2: + optional: true + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.6.0: {} + + 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.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + + github-slugger@2.0.0: {} + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + gray-matter@4.0.3: + dependencies: + js-yaml: 3.15.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + + has-symbols@1.1.0: {} + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.5 + + hono@4.13.2: {} + + hosted-git-info@10.1.1: + dependencies: + lru-cache: 11.5.2 + + html-encoding-sniffer@6.0.0: + dependencies: + '@exodus/bytes': 1.15.1 + transitivePeerDependencies: + - '@noble/hashes' + + html-void-elements@3.0.0: {} + + htmlparser2@10.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 7.0.1 + + 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 + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@9.1.0: + dependencies: + agent-base: 9.0.0 + debug: 4.4.3 + proxy-agent-negotiate: 1.1.0 + transitivePeerDependencies: + - kerberos + - supports-color + + iconv-lite@0.7.3: + dependencies: + safer-buffer: 2.1.2 + + immutable@5.1.9: {} + + import-meta-resolve@4.2.0: {} + + inherits@2.0.4: {} + + ip-address@10.5.0: {} + + ipaddr.js@1.9.1: {} + + is-extendable@0.1.1: {} + + is-extglob@2.1.1: + optional: true + + is-fullwidth-code-point@5.1.0: + dependencies: + get-east-asian-width: 1.6.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + optional: true + + is-interactive@2.0.0: {} + + is-potential-custom-element-name@1.0.1: {} + + is-promise@4.0.0: {} + + is-unicode-supported@2.1.0: {} + + isexe@2.0.0: {} + + jiti@2.7.0: {} + + jose@6.2.8: {} + + js-tokens@10.0.0: {} + + js-yaml@3.15.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + jsdom@28.1.0: + dependencies: + '@acemir/cssom': 0.9.31 + '@asamuzakjp/dom-selector': 6.8.1 + '@bramus/specificity': 2.4.2 + '@exodus/bytes': 1.15.1 + cssstyle: 6.2.0 + data-urls: 7.0.0 + decimal.js: 10.6.0 + html-encoding-sniffer: 6.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + parse5: 8.0.1 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 6.0.2 + undici: 7.29.0 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 8.0.1 + whatwg-mimetype: 5.0.0 + whatwg-url: 16.0.1 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - '@noble/hashes' + - supports-color + + jsesc@3.1.0: {} + + json-schema-traverse@1.0.0: {} + + json-schema-typed@8.0.2: {} + + json5@2.2.3: {} + + jsonc-parser@3.3.1: {} + + kind-of@6.0.3: {} + + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-android-arm64@1.33.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.33.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.33.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.33.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.33.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.33.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.33.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.33.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.33.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.33.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.33.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + 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 + + lightningcss@1.33.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 + + listr2@10.2.2: + dependencies: + cli-truncate: 5.2.0 + eventemitter3: 5.0.4 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 10.0.0 + + lmdb@3.5.6: + dependencies: + '@harperfast/extended-iterable': 1.0.3 + msgpackr: 1.12.1 + node-addon-api: 6.1.0 + node-gyp-build-optional-packages: 5.2.2 + ordered-binary: 1.6.1 + weak-lru-cache: 1.2.2 + optionalDependencies: + '@lmdb/lmdb-darwin-arm64': 3.5.6 + '@lmdb/lmdb-darwin-x64': 3.5.6 + '@lmdb/lmdb-linux-arm': 3.5.6 + '@lmdb/lmdb-linux-arm64': 3.5.6 + '@lmdb/lmdb-linux-x64': 3.5.6 + '@lmdb/lmdb-win32-arm64': 3.5.6 + '@lmdb/lmdb-win32-x64': 3.5.6 + optional: true + + log-symbols@7.0.1: + dependencies: + is-unicode-supported: 2.1.0 + yoctocolors: 2.2.0 + + log-update@6.1.0: + dependencies: + ansi-escapes: 7.3.0 + cli-cursor: 5.0.0 + slice-ansi: 7.1.2 + strip-ansi: 7.2.0 + wrap-ansi: 9.0.2 + + lru-cache@11.5.2: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magic-string@1.0.0: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + marked@18.0.9: {} + + math-intrinsics@1.1.0: {} + + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.3 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + + mdn-data@2.27.1: {} + + media-typer@1.1.1: {} + + merge-descriptors@2.0.0: {} + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-encode@2.0.1: {} + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + mime-db@1.54.0: {} + + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 + + mimic-function@5.0.1: {} + + mrmime@2.0.1: {} + + ms@2.1.3: {} + + msgpackr-extract@3.0.4: + dependencies: + node-gyp-build-optional-packages: 5.2.2 + optionalDependencies: + '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.4 + '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.4 + '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.4 + '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.4 + '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.4 + '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.4 + optional: true + + msgpackr@1.12.1: + optionalDependencies: + msgpackr-extract: 3.0.4 + optional: true + + mute-stream@3.0.0: {} + + nanoid@3.3.18: {} + + negotiator@1.0.0: {} + + node-addon-api@6.1.0: + optional: true + + node-addon-api@7.1.1: + optional: true + + node-gyp-build-optional-packages@5.2.2: + dependencies: + detect-libc: 2.1.2 + optional: true + + node-releases@2.0.53: {} + + npm-package-arg@14.0.0: + dependencies: + hosted-git-info: 10.1.1 + proc-log: 7.0.0 + semver: 7.8.5 + validate-npm-package-name: 8.0.0 + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + obug@2.1.4: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + oniguruma-parser@0.12.2: {} + + oniguruma-to-es@4.3.6: + dependencies: + oniguruma-parser: 0.12.2 + regex: 6.1.0 + regex-recursion: 6.0.2 + + ora@9.4.1: + dependencies: + chalk: 5.6.2 + cli-cursor: 5.0.0 + cli-spinners: 3.4.0 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 7.0.1 + stdin-discarder: 0.3.2 + string-width: 8.2.2 + + ordered-binary@1.6.1: + optional: true + + oxc-parser@0.142.0: + dependencies: + '@oxc-project/types': 0.142.0 + optionalDependencies: + '@oxc-parser/binding-android-arm-eabi': 0.142.0 + '@oxc-parser/binding-android-arm64': 0.142.0 + '@oxc-parser/binding-darwin-arm64': 0.142.0 + '@oxc-parser/binding-darwin-x64': 0.142.0 + '@oxc-parser/binding-freebsd-x64': 0.142.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.142.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.142.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.142.0 + '@oxc-parser/binding-linux-arm64-musl': 0.142.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.142.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.142.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.142.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.142.0 + '@oxc-parser/binding-linux-x64-gnu': 0.142.0 + '@oxc-parser/binding-linux-x64-musl': 0.142.0 + '@oxc-parser/binding-openharmony-arm64': 0.142.0 + '@oxc-parser/binding-wasm32-wasi': 0.142.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.142.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.142.0 + '@oxc-parser/binding-win32-x64-msvc': 0.142.0 + + parse5-html-rewriting-stream@8.0.1: + dependencies: + entities: 8.0.0 + parse5: 8.0.1 + parse5-sax-parser: 8.0.0 + + parse5-sax-parser@8.0.0: + dependencies: + parse5: 8.0.1 + + parse5@8.0.1: + dependencies: + entities: 8.0.0 + + parseurl@1.3.3: {} + + path-key@3.1.1: {} + + path-to-regexp@8.4.2: {} + + pathe@2.0.3: {} + + picocolors@1.1.1: {} + + picomatch@4.0.5: {} + + piscina@5.2.0: + optionalDependencies: + '@napi-rs/nice': 1.1.1 + + pkce-challenge@5.0.1: {} + + playwright-core@1.62.1: {} + + playwright@1.62.1: + dependencies: + playwright-core: 1.62.1 + optionalDependencies: + fsevents: 2.3.2 + + postcss-media-query-parser@0.2.3: {} + + postcss-safe-parser@7.0.1(postcss@8.5.26): + dependencies: + postcss: 8.5.26 + + postcss-selector-parser@6.0.10: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss@8.5.26: + dependencies: + nanoid: 3.3.18 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prettier@3.9.6: {} + + proc-log@7.0.0: {} + + property-information@7.2.0: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + proxy-agent-negotiate@1.1.0: {} + + punycode@2.3.1: {} + + qs@6.15.3: + dependencies: + es-define-property: 1.0.1 + side-channel: 1.1.1 + + range-parser@1.3.0: {} + + raw-body@3.0.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.7.3 + unpipe: 1.0.0 + + readdirp@5.1.1: {} + + reflect-metadata@0.2.2: {} + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + + require-from-string@2.0.2: {} + + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + rfdc@1.4.1: {} + + rolldown@1.1.5: + dependencies: + '@oxc-project/types': 0.139.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.1.5 + '@rolldown/binding-darwin-arm64': 1.1.5 + '@rolldown/binding-darwin-x64': 1.1.5 + '@rolldown/binding-freebsd-x64': 1.1.5 + '@rolldown/binding-linux-arm-gnueabihf': 1.1.5 + '@rolldown/binding-linux-arm64-gnu': 1.1.5 + '@rolldown/binding-linux-arm64-musl': 1.1.5 + '@rolldown/binding-linux-ppc64-gnu': 1.1.5 + '@rolldown/binding-linux-s390x-gnu': 1.1.5 + '@rolldown/binding-linux-x64-gnu': 1.1.5 + '@rolldown/binding-linux-x64-musl': 1.1.5 + '@rolldown/binding-openharmony-arm64': 1.1.5 + '@rolldown/binding-wasm32-wasi': 1.1.5 + '@rolldown/binding-win32-arm64-msvc': 1.1.5 + '@rolldown/binding-win32-x64-msvc': 1.1.5 + + rolldown@1.2.0: + dependencies: + '@oxc-project/types': 0.140.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.2.0 + '@rolldown/binding-darwin-arm64': 1.2.0 + '@rolldown/binding-darwin-x64': 1.2.0 + '@rolldown/binding-freebsd-x64': 1.2.0 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.0 + '@rolldown/binding-linux-arm64-gnu': 1.2.0 + '@rolldown/binding-linux-arm64-musl': 1.2.0 + '@rolldown/binding-linux-ppc64-gnu': 1.2.0 + '@rolldown/binding-linux-s390x-gnu': 1.2.0 + '@rolldown/binding-linux-x64-gnu': 1.2.0 + '@rolldown/binding-linux-x64-musl': 1.2.0 + '@rolldown/binding-openharmony-arm64': 1.2.0 + '@rolldown/binding-wasm32-wasi': 1.2.0 + '@rolldown/binding-win32-arm64-msvc': 1.2.0 + '@rolldown/binding-win32-x64-msvc': 1.2.0 + + router@2.2.0: + dependencies: + debug: 4.4.3 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.4.2 + transitivePeerDependencies: + - supports-color + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + safer-buffer@2.1.2: {} + + sass@1.101.0: + dependencies: + chokidar: 5.0.0 + immutable: 5.1.9 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.6.0 + + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + + section-matter@1.0.0: + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + + semver@7.8.5: {} + + send@1.2.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.3.0 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.1: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.1 + transitivePeerDependencies: + - supports-color + + setprototypeof@1.2.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shiki@4.4.3: + dependencies: + '@shikijs/core': 4.4.3 + '@shikijs/engine-javascript': 4.4.3 + '@shikijs/engine-oniguruma': 4.4.3 + '@shikijs/langs': 4.4.3 + '@shikijs/themes': 4.4.3 + '@shikijs/types': 4.4.3 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + 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 + + siginfo@2.0.0: {} + + signal-exit@4.1.0: {} + + slice-ansi@7.1.2: + dependencies: + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 + + slice-ansi@8.0.0: + dependencies: + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.7.6: {} + + space-separated-tokens@2.0.2: {} + + sprintf-js@1.0.3: {} + + stackback@0.0.2: {} + + statuses@2.0.2: {} + + std-env@4.2.0: {} + + stdin-discarder@0.3.2: {} + + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.6.0 + strip-ansi: 7.2.0 + + string-width@8.2.2: + dependencies: + get-east-asian-width: 1.6.0 + strip-ansi: 7.2.0 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.3.0 + + strip-bom-string@1.0.0: {} + + symbol-tree@3.2.4: {} + + tailwindcss@4.3.3: {} + + tapable@2.3.3: {} + + tinybench@2.9.0: {} + + tinyexec@1.3.0: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + + tinyrainbow@3.1.1: {} + + tldts-core@7.4.10: {} + + tldts@7.4.10: + dependencies: + tldts-core: 7.4.10 + + toidentifier@1.0.1: {} + + tough-cookie@6.0.2: + dependencies: + tldts: 7.4.10 + + tr46@6.0.0: + dependencies: + punycode: 2.3.1 + + trim-lines@3.0.1: {} + + tslib@2.8.1: {} + + type-is@2.1.0: + dependencies: + content-type: 2.1.0 + media-typer: 1.1.1 + mime-types: 3.0.2 + + typescript@6.0.3: {} + + undici-types@6.21.0: {} + + undici@7.29.0: {} + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + unpipe@1.0.0: {} + + update-browserslist-db@1.3.1(browserslist@4.28.8): + dependencies: + browserslist: 4.28.8 + escalade: 3.2.0 + picocolors: 1.1.1 + + util-deprecate@1.0.2: {} + + validate-npm-package-name@8.0.0: {} + + vary@1.1.2: {} + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + vite@8.1.5(@types/node@20.19.43)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.101.0): + dependencies: + lightningcss: 1.33.0 + picomatch: 4.0.5 + postcss: 8.5.26 + rolldown: 1.1.5 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 20.19.43 + esbuild: 0.28.2 + fsevents: 2.3.3 + jiti: 2.7.0 + sass: 1.101.0 + + vitest@4.1.10(@types/node@20.19.43)(jsdom@28.1.0)(vite@8.1.5(@types/node@20.19.43)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.101.0)): + dependencies: + '@vitest/expect': 4.1.10 + '@vitest/mocker': 4.1.10(vite@8.1.5(@types/node@20.19.43)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.101.0)) + '@vitest/pretty-format': 4.1.10 + '@vitest/runner': 4.1.10 + '@vitest/snapshot': 4.1.10 + '@vitest/spy': 4.1.10 + '@vitest/utils': 4.1.10 + es-module-lexer: 2.3.1 + expect-type: 1.4.0 + magic-string: 0.30.21 + obug: 2.1.4 + pathe: 2.0.3 + picomatch: 4.0.5 + std-env: 4.2.0 + tinybench: 2.9.0 + tinyexec: 1.3.0 + tinyglobby: 0.2.17 + tinyrainbow: 3.1.1 + vite: 8.1.5(@types/node@20.19.43)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.101.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 20.19.43 + jsdom: 28.1.0 + transitivePeerDependencies: + - msw + + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + + watchpack@2.5.2: + dependencies: + graceful-fs: 4.2.11 + + weak-lru-cache@1.2.2: + optional: true + + webidl-conversions@8.0.1: {} + + whatwg-mimetype@5.0.0: {} + + whatwg-url@16.0.1: + dependencies: + '@exodus/bytes': 1.15.1 + tr46: 6.0.0 + webidl-conversions: 8.0.1 + transitivePeerDependencies: + - '@noble/hashes' + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + wrap-ansi@10.0.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 8.2.2 + strip-ansi: 7.2.0 + + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.2.0 + + wrappy@1.0.2: {} + + xhr2@0.2.1: {} + + xml-name-validator@5.0.0: {} + + xmlchars@2.2.0: {} + + y18n@5.0.8: {} + + yargs-parser@22.0.0: {} + + yargs@18.1.0: + dependencies: + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 8.2.2 + y18n: 5.0.8 + yargs-parser: 22.0.0 + + yoctocolors@2.2.0: {} + + zod-to-json-schema@3.25.2(zod@4.4.3): + dependencies: + zod: 4.4.3 + + zod@4.4.3: {} + + zwitch@2.0.4: {} diff --git a/website/pnpm-workspace.yaml b/website/pnpm-workspace.yaml new file mode 100644 index 000000000..3334c0e43 --- /dev/null +++ b/website/pnpm-workspace.yaml @@ -0,0 +1 @@ +packages: [] diff --git a/website/public/angular-challenge.ico b/website/public/angular-challenge.ico new file mode 100644 index 0000000000000000000000000000000000000000..29d85cde0ee0ccb0cf9caa419e365d8649da54fd GIT binary patch literal 15406 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 TH{WgWKZTq;Ze{VgogeUjhSt)m literal 0 HcmV?d00001 diff --git a/website/public/docs-assets/4/unknown-person.png b/website/public/docs-assets/4/unknown-person.png new file mode 100644 index 0000000000000000000000000000000000000000..9ab0a2e7d2547cf77191c75afe83954b998d0624 GIT binary patch literal 48272 zcmZVk1z225vo;Ll?i$=BXmA_c3GVLh&fvk_69^t8xVy_haF^f?!QK6v>}NmcocI6d zx_Y`-ua?zSUDZ{0SCq1%G%6Ay5(ESUs;rEJDg*>H09^i!00;iZ>5WK(fIup<5f@jM z6&EL0c6G9}vA2MLkcs-12CuAki1+2)cb15m0!mfPX+{s?BSixQ(u}CO7#2B(7y=A# zdtFN~V{|kELvR%meG7x+Nu;TXO3ebS4$N1NT5<-4b13n}HJv9Jk7up>!tZ?V ztAT&?A?W4wqa=wY^C0%%!Lx6~rLwq*--Ab#9Y1-$;$Nk(*({7x&0B=N8X zL#J>#1w$v#PAESR8c~N?1o?%|t#yVPVhE*wa_A2Yh4)Ynf?mv{7#j#HbZvHK<`IER zdJ!f{)NeQHWh}INSN2J70>)dBg-3Qmty3OpUGMuxOqaCx+`-Fk8U^ai^*#g@*Sa}j zoLYvVbU}Fq^sn{2CIJ_m$d4(PDOpU{3EwRZX$3qp9`(;f9(AW*e%L7DJh|?A*YR%6 zG7a4zW?I_#l=xLke9Yt;*FPNVs+&V-71rrV+Mkp~OUU?RZ?gMhGa-+PoE2p<`l_l^ z(h(4}IB92TWaNErlOA}eHI!66E{ArXc0Z9_YD8{1zB?A1x-ftbd>-qU7}}xHF}&)e z&d2cX5ZR@>x3Y{FUa+Jf+Z|iRcqAxth88O#s1fDIpkRPS!3YI-LnqQ`r*cgr2pH7q zGsw$LnARi`(HcAV14j8!^z8KXAZX8y=k_mhguKxyp5h2L!cibrM+OH6C&wOwaUgla zZp2QqFA1cfetdbT#=SD1Ir+G;YXE|vREFXFfz}Wt^a&EL2agv@YZK8=1OfqWiyV## z4v>g4lQ@zV{LPqT2pZOyaS>5Yl#dr8{)^crj5Ul^FO4(qDok^);026(h|mQgN=Sk+ zN-#OGL{Ld0e<3u1*q=n^{?JtlGI|80Fw-AEdPFR7c59jjNQN)bKU7Pg%7O!e6vfki z94ph^ARGn3<#|ove}GLfA*_HU>ec*&ZP^>-%-eyW7|gLr%!|JcmDcm^LZt<=3uYtq zym#%w4hRFQOpQbGGp0_2O~qdQ69eA2$mD#@f-99@C35P_Wd!r#Z6QZesChyKwbl$7 zK}{m<`LENM)};K`VP)NAW31H#k=%6f13VIJ*Fy8TJ*sU zK`o&*xHaOi&#&LK*1dx5H{x+ZTyK%FmNAdnz3Ficer@)m;Rym-gxX;G&Z=`SFAEED zTEt46Ky>?;W652u+$Vb%%!33S?+Oj;!pCL z6q!j&yS#O=9btao{gPfHUvk9qKBxdb)_!Fg!IQ(?W8dT3OM%kpRShcW(b6tZE}Hr= z_47h1>4$a6kg9&g_X6z-pz3Anb|RMOuuN2CzlLt5dXc;CVbDw@yT+0fpEjR@cfD)l zmB$_=ZdP|m5sPnz4AEsu7HZyesBxam4Q35!%Qa=u zWu3N#N9^+}&o`{~4VJZ*h?Wi+8Up2Zze|?wxsc{1xv)|T^2BpPNrIaTu0}P7_&*lVo5QY zX=|x17-<#h<*noi6j@c^=QSHvE1stdspOXCmUN4EO9n2A3>xS3%7qYy42Hvq7n#&; zvGj5GsZf~}&=#YsUA*bWfy5bqG~6w~5hqo<&x$fdLwX{#04lpPw*u2|Njhv?Ml zq%SeMEv`=MTX!vVxS?6bUlU(ujqsr}4dF4x*vAmYkbZ8nNZj)ol^W&Igww3mT&Y;D z=+YC=j;TP`6|PmOMXb?rnzg^4_&t_trDy585O2C~*E~=)d{)`n+SwD3`zj7!)(41) zLt{qUAkHTK8Q&Nmq6nvWspy+U`pISt~zj0IV`T>uv3H^l{X0MrwBS3is`J4!CzjH$bnF{yB)OqZ=vjXYYMquZNNciHEOGfcyDtg{#U-k~_Bxy)Cb4vK_L6?(ug> z>6pG9b(e7HEGSLb2DoJCKB&*oMlk8HvLPA!z1L8G9CGj7ySDr;Uj~dZ#t_#@UzqxN zsi}6ypiY7lVJ(mi!!kyl#TqnO}u@zea6ae*kC_>`-?C}GG>xlMIU6~ z%1(++hHFIf{*7p?ayOpZ8S9Q3<$AHhpku*L=?(4eM~{Ls^?{Q6XC^sf8Q0ItIh@~5 zlJv6x)aJ;a!<^J!)JD{#)I!wIi{oSRB|K~%8Xg*EO>teyTDS}Z{B?Ya`}LFQ4kw(4 z7t`68P`{FngtFsXa9d0#_Ldk}Qa+3RPC3mnNPV@j*_}xl{hAh)*2v1E*Ja}!81FPO z$vDLbWYpC>s?u++v%}sNH^|VGwosam~cQAChTcnx67D8HVt%bQ zthA$t)$ESLk9W2by~eQa6PP*JL?t;Q$tT&lvhU!u*t?k2z0)^ABT$XMf}eIyd6s;7 z#Dd6Rv+Pjgdwf>?bNJ`|NXN+0o%PvLgOxjLpwoiTq<`a{?jG!((H-)=aK%NrbqQw~ zlh7BzME}jb-k}f&VUEBm{z8|M&8gv4jRqJ`D{GJ5BuGJzRAey#+4PPGr|Y zzt!zj^i-s)8F|s-N8`JnXx`GE>7bMvvdnWT1TBEJN`j3--H^80>z`J?uP(0P%+7i9 zZ@Pc3w{v?X80CnVJj!7fDE6tk09^W=JzgU7;Y+c|v7i~qwau;6748l19gKSE;Wv2d zBX+o+mYvU!I#e_vFRWH&cb>Vv-k|=88_103AzCI`J`VJFXzc2%E!aw(tt?uZXwDSa z_sluJI%snre4dzZ&uZs6AMal97T$jAgLgr1BfBC)17HdIJo7$ZE~Ydpu_;~WeiUR3 zsCw+U;+fqzY9nc%yanDjbR+m)7N#vcKi!XQbl>fD6?QP4EgV)8){yWD90&lP=RsQj z)il+E;a6|UZ)TH3DLln*H!t=6ygn`Gl{cpk?c?Y38)R?B?|Bx~=DUxB4GCrikGXTg zB#&b+t9LXGp3B zdnp5%o=@pYVpz%`-V;j+-dH`}XM>|EQbyk`-(h>HVHx$l$GwA%*JulESxW^42nKK& z0Rje+5CRrlf&?caNTUBKOF_~@K>t$@1pyIZ0|E1I8%1#b_m>DxfBXC=hfWTMfCoQe zffMit)PGw;1AajNw+!(c{0>4?O&008;HMF$Ia6LO$~y`vjHP>}MU z7X0Ay-)dG$@_(AR+X+%?D=3qTJGokrbF+M6`9vv%L{3f)a5cB&SCx?Zw>$VrkkZ=S z-I<@2)yvC^#fyW*$<>OLjgOCy^%FZQJ3BMD1+$yCqq_-^+0l*aKZE>t90?0IGgljD zcN-^1^1tJnm^yj53sO@4o#=ml|M^Y}pw0izfju_ z$^QA-f&b~j>2D5B9<9vcjNK3rA`r3?qUu1%69ZUn4OyaqQ!!;oTuI53v$HeZg)?n| zg&xHd?e_L(Bezpdd1o;gZ9fr@bf3Lbj^PTq`pPj0Py@5e+Xvs;XuD~nQK zOkl`teaFCcwZf?9_uFHs@&O=Qaj4I#Akf3$Kp{bfeGwC(_<<3LfFPj~O1GO(>Nm?W zq+imY1OGmj`{lS8En}}d_6HRPl@F)9y#Y2_)8)n9F^_vjBbwp45KJeuh8noH^8X!7 z1R<1RD+-H-LDhVS_DjIqCb!VT(~Ig4uk6l7|NH>w4mUbW`3a8Tp<&uTTg_4CfIZaQO5HxLI3R>WP}GP39PuW#@(vLN`!RpQ$)cU zhzS|2?zotFHh^eUZ~A|y`Xbiz0kRxB2e4;L>G8Y66o;r?Vo0^3BT~52jpV*Mi;K{I zqipHIZ`%p*_%8Ox466XQ#ge$663&Q9`Gphoss)Iu79&v)g=qL(w(1>z?n<%Vz#Ua! zC+D3Uo*|tS`T^1JhSk_Y zX6h!-SE4P>3>w`xem*DC>md2PU67J(JoXH%t1zY{8N?JD?*5m)k-G8^qJMmwxyDIQg`R7n>519UnqeD67 zyZn942Otyv)V9@KjM`VAr_}&RML^Z{#Zk$Z#P(kO(>s41X=WBPw{&Ium|4`mvl%X# zACI~9_(r01rcZ?>5#ySSHGJ{)D!E9J_3HcLO}Xg>@!($a#Za4(P}g8Ka&iCnkL;EU zLo?f=r*R086|B|06oC1ad+FK@y+rpv?TJStkjC%r21l>vsb%lNt4ZE!~yN0 z)DeVijCRfIlEYgd;Vg*4djeyh^!9Zttw29KhSZaOB zDZc@3)&zX?bKBb+OiAF4bxF(ryZc2XME-I$aMq_(Lb;=%F}H@eiVrn8D&!c?bao6= z*Xty_b)(LoIy*9`I#<|4WrO{-V>k zO6Lwl5>MiC0PtS3|2A|#q#0j|o0)kC9^aB#6>U76Kqh>@@A<=8MXa^iAr)_^w2#+{ z;#s+Zfrk~VCZnTa`ioBaIlnm@NUXZS&{ks~Du6oMAM~39`(LWeuH|?R6ngHsY@K z*K#$`P=Z_OYxPminm_1xkl`D8zZLjy$rS$NNy0~~Z{z7dMW&MgFJaX>@BMT|D~VN@ zq4_LI6?Hjk7to9cx(s5PH4+yCVin7TtV(PWXB+fWA)`T3of z|J0E9_v8vr0BiT&LHWkN!Wdux6JP@>pu-dO4&_lK?OzpQjzyUKde^w=vO{@O=AOKI zVd}rROqFjZ8_Y|Ah)#6ct}$fI?H)98d*O>7V!M{AQ{ZfT>Q~R7g-HzRBVAZl(vLTn zu!lm<_1nk`Y$V1jhlv0SAf7;7Vr#%Q#8&o%Skj2>}OzMlJI9mALeBWU0EC0 zb~Dn3v+qOo62L_r(T$O}36$N$lcfri_b5tl<6C|EbPg#z0)r57;40o}s5p|=bWT(% zJf9`-^(Bdx*`!n{cG2Y`s*vurJb4EOSv2|kkHw1{y(Tim>?}!Ex_2GBJf0mUT93)I z4fYB3kN>J>1Y8)LEks;xjbgBJ6M+#YSH;M|^3ct*ZSUHihM|>Z^Y{Es3GmBNsIJ=` z9;e2sUW1zFzrk-kro9=wbSPJ_{g5n51MoSV%`8s%R3>Y~!PU0)E)ciaM06T}3=nYzF|d;4r27LgKz zx?R!1k8tcRmJ3o9#A{SNZBJ0;n50K@odGJqPGH$NDeCF~mDghirIT&(GDx9G1-3i1 zQw`~cg4LCH;&dr=kLvw~k*(`%#WQ?ag9mncxzugX;TlmKg9M${Y(Y~JqivlYl00bE z|BiM`@o6P(vM@SrxCDK+-^m~%U-?#w(pR+mw-o8J{4rcA9?PH`{_nCAeST({h&o$T z_5bd{F%0FLXleOTA^{WIXo!mo-VQ5AZDqmimKT~JX(xWskCg2YK#>YjJ3`bBLZgpeF;j-V z_PP6Th8m++p;>5&J$C}o{;G5JU2}gjX~^hj6+L?FMFS}x83EE)jN7N_4k%DGW8rWP z+3A}u#ZlKyO9-3$Z$%N&gi0Hdy`SSanBO%2*|NfaWk)z6??@E9TO%J3B(y<&Qwd8h z8bD$*P>tiZh>2HUguN~jlPLX0M>+k~txsGS^vc${MPFWqN`aL4-8QaDldSZW?VmEf z4>hz~TO78(V~;~p1b&AMKAYV@72XO++%DJpe^=UHfWd>S=0hU#l~xIxoO-nCh2fta z%p6*h?(lh1-aXb>e!!Uf6(V4rvr*P?7M6^%t5nMVNymj%iFjGsW*jEedw&(ES3gBTa5H!Rs-e z6ts;gL4$ieX2Tax!{V{_`l_^XRYlk9t=8G^o$pu{Bl7No@-eGFSvtYX~Hj<_j{qk_a zy*v0CBEE6+v0vO0)@NL`g(=|t3@tM>>g9Ys^x}e|++lzPkDK>tVv#h0M&5$R3&(I3 z%I)*`>7rDb)F7lxW_co}W-0>uf|W<3rFapQSx_=z`i>vLdY4~3^zk3~10Ow~@RVCG zrtgt!qgF$OZ4Cc$Z$uEll0^seqm&k`mU>ttL_%o+!q=QwG#*mRSz*SXZB1E8*TV*H zV=`nyP(mv@)i%kJF%ive51pWR{igg zU{8Y>?3#?Rsqp0HuUH4i>KYD~?&4B~GK-2RM( z7ZgyfclpN@DP-ydLd+M4^~izAVn#!*!2@3Ne>`6VCxlS$t&h452tGHTh<|r_p6XU; z*Rpqr8h?BI>NrLEGt(W%U*Y(HC}+LX56mBo4U1-epF88!NJIS7MPOG^uKC0oD?gz0C?@V^V~MhK!m;bYL9WEoQWry1(&V!F$YCKNGZwy(3ncn+Kd{34PbN7f+_IP5l&<1ch+2??Z=RnmcTux_?J$YjV^zVvTCK>0#AARbwFV7Yx({c2SZ*~wY-@~ zOb%{Cp*Fe!U$C#)Mc|rNDw>?!AmyE9Tnv@F{+zKligMO%JP#)$8jrS3=PEH*qO$e) zAVj*}5^AQW30k>sttc~4K%CrJ(MoIvojWV$;tDwdT<&LVP7K(nrd%wnD3UJBnROx4 z5fjX9I4FE#wSk`Jv@B%nVI02PBaYCWa)Y=V-GPHn-ScP-jxxx03stBB0($!Go~Tw6 zS(54OKa&K!92ZvvHkay)ANF%kdA-iEex2>~M}?^Vl%tf6CzeShr`Ya~Vn%oZ8;`P- z9th1&8{D?|VD`>c8!7FQ2nRql+RjVlOGG*Ejo>nA*I+ze?~DJ6{$^}PM26352m*y6 z$1RV-r1Z#rW1uh_h;{Zl zISSEa^9w(T#WyFm#&@j^n9{mksj8WIiS^!FW`ihzYpJzyReR=sx1gAdiIM=n1Z&363#Qf`ER8JOO&9Yv4QTF)qP^^Pk0|B< z_@oj@ExuZ1EH*h1$(Cx`EPYfh>={a;YG@F;x;a#%mQ99{w>0PVJmD=;%4JE}J~}yx z?ec$)Y$e2fpz%Ce46+za)nmZ&9?#$s2d9QBA|A({@ydkMCQI{+@RUeQ0mUx{LM?uH z$WM)+w8`AqBa{_)Je7jMo>_qfj7b*E?G-w1hW-AtUnw>Py%z?(hwiO0KhmG=woM7Cw@m7KW7Km7(-O!wCHonCV!un+wj|I? z08x&->-lp#JYl_w)oZkMpuYV4jRALc4K?)n_IQCB)hAr5+7J=cpNuc7&+WJ> zVfg2FRKQJW#81tNvNU!Jxk?tT?b`G?=jQ}6;oy0Gi%2rzF5Uuq!cIHl^$u^ULK!AL zxm+PZb0KU}TA@@iZLA!V%n3}FC>9y6&s5&mb8sTF~GwZ!NZ#K zVg4N851m}7$Ql{!yCx=e#JHE~@e2$Qx`6Qn4l%W~iK=14wz31em6K`SI+t{n?ySU6 zX*^Jr1{I^1dm&F+;(a|WR&!tzb?kE&>>PecP; zG?+!9R_ApDVqtOny`i+!YZ*aB=ZYDBU9(p%<& zO&g0p!$4~dD55zJH<1M%-KT#63+>LIbgE?lAL!gr$<>>MCfkfK4YZ=g+Q9Dva@*v`$Hy)(v-F@9CdK1-U>Qf;|U-+?f$@|vcKEJCACW_ zRk3LNjqr(b;B$h&_qisYAO45Pk5l82b_r1xV87V7)mO{EHu4y8@{~im*7?i3Vu#Ki z1beU?5X!pBVl>+!SBsUc%|({kNC~KY>uBu&&G!{I8GH$VrnV4W_%qv6C!rdQIzTUw z;+~azr}+c3#UA8US^bB!e^3*m=g`)%kgW!ND~!fhHpZ>iske+aZK^$7X*Lqk5YJ*o zM1SZ0Bx}sG$X+vNzS#pwS(-LCbk$Sk|9mI;XAI7DrVvqfpZ)-G^6N)6m#babtsezm z=Z5)y6Ipz`zzd9-LYH5O6yg#&nVCeS-~&4KtVRJFUNi7`epG}(GJHe&`R-J?#n~h& zgWrQtF^e~k74Nc!8ekc6%#O5R9XsOi9GS&s=CcC|a?mZ60?O3!pWFvaaa-D#Uk|p> z&ex?POBr%lY>|0Dw{yU4~Adw`GmV$O3H2*?)f+{4QykonWhe74dXr85f+G^m`bxb+!nD zYjVRo^f)0Wro~}(vE=*UMc@76EOJEEDx#QESu_`h@?<|Dea1beZfJx9_SHTQ(}=gr zXv`{E7{$9l*nxzjJU$!vA|mXHxjp8Oo@G3>Z2Y@pOV^}(D>4-cX0e3g$I#9%4L_V| zzp~@YW{*q;(*zYBj+o?jpq;B(JQx*5?KMFTzrCytzRh5Xqm0R>WVcoRrByO!Ji z-7v#e9&Ii=1JO-XQn5IJ@ZMLuqRo!sk6`;vv7}43k5eL2QzrRIIPydXa>Sn8KeTmkF8DVlJIR@6Eur{2L5Gf+E+MkVn@iqR7KW^bDy*%%wDsmS$N;+m6ZZk6Whn{|MTG2{z2Oi@Eli+Dnf!!li z91Su|JV?PUlbtc}y$apg-boj;TpdQZ5*If~a$2!HDx2vY*0-&r;wLQK&|;U;j*?{7 z`VUSEOUK$Z$1Raoa!D{Dgz6ZV#nqkD{%0GMRYGE9khk(;@H=4Df4bZ#9)`5{t8jnP z=nJ!6)5`@M;oUQGdQ2+zZP8Rbi?7bk4@|6O8d80#=5!a=tA_Mx^9%RIMS@#-D z*Z3imYw>K7G6ZQq+RqD%6D$T?Tro(~A%Z>vF};JY1y+xVsC_KMz9!KrIih?pPOQn| zbA#)PXxA&dQ}a%~sF@9hgoewwZFE1xO7ePnaFNfnOspA_b69Q=oz9mWYv40)?P#)F zAeC3W!O9U0f!jG-Yo8JjPTUQj-z!q&l3}4nEYoXdDbwI6(HRMVZa3@zvMCd_^epR^ zGa3EjFPZtRU@rsnd;iXR$HlsjvND<)aMEC`TfEWeN8qyIDJ#MH+74YVMf4eAiNp9c z0FK=)R%Q;5QjNH6?1x+7kRH`aZ|&~1I+waSQf~yIdi21U!X{mBT>RvHQSIi2 zd87CrI4m%7i4lY?N@j{sREeO3Ac8EG0_Kdz(VQq)5%;6qovnS25ehj{Ggg}^x5(aT zhqW8L7bParyD>7WA=*?ZUJ@iE@aTofpRDuGfd7~p3!uE8Fl5ceWP4&d`ctVctxu-U zAHvs(${_os2)4!wUh=y4X7OS9NYz19gWK^-U>Q2bA11jo^LyH492ik4D{H}5YvdB# zdh{9xa5S&3w%l*8!O@}O0Y;)GUWLG{y2+{gi}Yj`qaU|_im9h~4r&~*9ek3zJ({0g z<*gsJPy^*v6V0?x1NMSJuH6wf=2KLH|9AW2(`k%%<+{;9h0qBaP=Y!I$o$w$+Q<}(+UYel?5(0JVO79#>IZEZHSp) zg+kt+%*AJL3z|n9XHR4Dp7J@Nq&VGi>BtcrsDEzm@pRkh_LmIqA5P*<5PfwVd_gqU znqij#^#!JIw9lt4EpvSW^?fUxQ^m5q^smWSmsE8^Em5kxHkJZI=d{LUPt{>yaA51) zn*oIVmLsb@CWDzXCCUf3lJ6M}Uf~7}&c0|wV6OZ|%N_cW>+v?qbsCIyyAqjc#8n5+ zLc)Hhtx;!4^pz$8ikJmMR#%)_mh8rsLzo(XXK!}n4~vJ6v^D)%0XWT@ry)r-slNLD zWnLOXpsUh3sj_)?8aoGU)R?V>c3I9QIr=F46feRJ0n3Prc=vpS#OxPpuqOhSYWe&v z7#0}paxv9U%5+| z25vD=JAzzg8kN!GRb<@DYT~PalD|wY5~G*Q^O_HqDGqWgd61Vp>xf zp9rC#VXtrF5)r@B9jN*VtvYMVZI3teNFu~rV(ZBPl~ihM!%1ka{PC$8QK@#BSvl{U zsDss7ix97L+4K{Jpe0jn!Fc;ZkSvfirTvItw@H_5u`AeXcIoHc-KNL+O1?^=u)@y-gw~ z1d8Fa#Y$#N*Dpeb8{MJs#qVrxlcncWvIC$Rg$zQn z4#6!KO99g*>R`1$rZUN`2>H`#Ecb5D8}q>XqoghZe{^Zdkq!;x^9*Pg><_VfLJu85 z_bEg`cSrR3KzntgT<|Dx!*$=jIMlgEl5()Dcaj^O-Lv-XoG6yv85n8wI}ocy`|k9g zirbm&Y%y(h{n_m7Dr3Q>`rm+pJZ~Ph6VVwXh3~usNSdXr zisyF$uTagyN-v66BBnm{X#qL04pIEfTN#4FuPViKJYUJehVF)na9g~VR$YSai4rD^ zO6F!RsC>TbS6v}4>I`?ke;ecD_ErB!2TP#n2(*nxeT%QDn{S$nK}99P)SF=VwVS&Z+n1IktV2CLkL) z$IHKgcc3qeud(hi_Ky@cdjz zky*fMB(z0ZI(MSSMU$wdpkOZB zA|Y-?;WDOPxVvwGU|nq6Y;qY;!6=}~3an5>=zQqWTxm?T`O8~DV$U?9ApSYl{Fwo- ztfL(&gC!)vQ8O_cdQ~e@^i!%n)jOXT5rKL!&fYuM)<^A1in6A2x<97FXvLaoc|&To zP4qklQ-?GFKZGMN{7K}kU`7-}Xn?}70O?(TO)?AL{$WCQRU|SM?abJ7rn910t6OjJ z9DP;DOC5X>`B;(P6R^^9Ri?q%8<^n7t$6*1Id)l(5fcm4Hv#!)ES>{L1q=hbgS)YUa;*(B@=3 z#&P5diiBq_+vxuFh`N*5JpD_qWi(zH#baOYZ+<0IcU8w&0&v6eHx zxxnQLb-9FFP$?M#JipuXLi((%y3nh3VxA;Za~y-6tw!wvwGd-5&Gu(!1=fWINFpe- zlGIsFqS~Q)x#uXxM1a3$J^Mt9c&KHSo?AUx51T+0(z*Bv`~1L!p}?5p#<1ti`&zwe zkhilr3f;u$9%V{Y!6q<<8sMQq~jCr6sLz-|JQ_F(4?nk{QCVtNo z@w6q7ul4eW=7C(0oBa+}hf*5Qt~hZTJ92`tWzN zXy~)~J#hB7oC)CVFi6jeH7hfyvmfIMK(vuRWq2G{acu4u(}V+sz~FNTV1N%+2BRb!pWifU+4R| zIGEqm{*=>h%gYuJAzvh>zGT`OKWO0I z`!P{5H9ibT&9^PNg68#pjTY_kJqma?k?%xH=tOGRCrzf*{}b@6zH~6kP3xIZ8pE2q z9>aeXLZhWq=8hw~e(3AHkJ8m~FG^{P&Da%$z`nF3T-s_+S>*%jBk;>*JggtUXz*qwY z?WF4xl3>5i#qh}9yYWR~cCB}YYW4>mzHMW&aG&?#3D^sc7|Fv9uzmKaAhlX7 z-M$W!auj6EVY?r^_HnK8$Pwl{UfD7vz3$%=%(9k{YBA=jKxo|&iJNss`s%xom#GG%T5^q-RV;- ziGb$DNyH_Ubi8qIFl>HKfJ^7~mw;IX}MummrZeMGZjN$>1u-q>@6ZfouWv?Mh#yI?NEz5H-w~!CIz( zxcOhTNO3X{>mUPJC8S~npl zfzX-kCd()YuihXGLxxU)xO^1wLqmT*t>s@CO!$+T{{|fjppE+MtiBB7Y$`TsCnNyo zfWffY-%d>aQ3SIWLOL-Q7usNd8wX4IwT0=@q%&sI{;;d;!Dr9-MD;|=MWj=zfVFlN1qn43o`;pt(`!QsfN?nG$ zfOcfe1T9_ffjZ_*)u9?U3=9G=YRTQ!1I(KyO|;$>#G@lr>T2+`XK;4*91G|5u!M#pk|28O8yy0sodR zKm*Ox1*|r-o`$SB zw&P$Q9vuHcy>}64$;6giRRoT-Ncqz$YiC7>h_q#5;3A|Tz#HWC=6iEMks(oVO>6q} zdf=B2JG|iZmI>$bGGX~3CLEdD{k{AEjKsah6tl(UgrRu&#)@@~z(w^%Roc~fnhNWL z4qcHRASNX2BgZ;w!jVPkyU~jZtZJ;>;$DsxhPTRi{g#o*MPwxfs!SGVtSm1_ckRIk zlGV>eyzB7~>;HcKR-LB+TwHVdDHpB~JY6vO#Q^G^KC(}2Vals;Bbc9@%700zY^-$( zxQX-RAWvW4f7_?$H1^3DQ7m#%pBYa6n+I&9s32a}ObU zmRzQ-H>cPTZlM>ze-Gs`x*%soyPrA%SQNB>>T(LzigOm#OijX$T2)obW)j@n_-W;P z&3)YzQu4)Wmp_qs_=kXv8#7r}hrxJ~zMDgi8%blHqcCKAEITBf9`l{e-jG7aJDuz8 z-(CLjqU*OTB};2}ug~Z(r9{F3S=K^+56%>|(<=yZWWtaqE(&C}^JS9BSx1DeGijIi z*kp?WZbcSExwHxyAC@j)2KgcbvVQdIkknt1b;b^HHTxeUULQ*2RZo3c^EO30oVCrQbyrnH4PZ+ zy@uoc6i|$uC#y($ml_MeSb4v~LFjh&pGbgHofbd)M$P6fir`kOwD}2P61#um{l)Dp z{0X6%w#3nBB_=x96d+p)D%>wa_fZ8g7;zj*e}`V#K-t3X|JdON#5c?MhVAky-PeVk zIC_qfVbRCG1Mp`%2hpNmZf^JR-Pn2LzdzsC{> z3`Ct^zxU|wSgF?j%B7!e391}lhsgUac!-8BfVqF3<5`E>JsO2 zfZhIw6KF55dx+;6b?2J{6(*yuRaKRmtD8_OU^YmKAyz&>+Nqlo&q)5mPZ(zQPIw@J03O_K5BAVmWH5o)Of!<)N04d5PjCUD>o9) zytuI3jK&=edxdL%K3#47Tp~JBX7G_?+6!4$v6^@dS+gCnx>ra?&ZK(Sv2khk>;4XW zZw|wK(obhTzlz!QcU>vJ~B?@Nr%$mA_m!!hHaid!)wQ4a%9@|TYV7}cE2mc zBx4=C3d{FU99u|hOLLJIS^CRlIrl8q7R19kD{+xVDinM( ztP!Ryweb=}^BKM3?6MmP9E)UnX4gVa zG?Z*^YO;i+AL-aXU6OV^X3<+oqt^R82`kA0ALJuUZjt_)c&EXu%^z~k4@rn>Z0((N z%so+&w%F`&!U@1IYoUWRNeEkG0MMaVDNwp|qzGFw=}>U$EcdKKE4{(TT4FVOoy-uX zE)Enaq8P(t_hAf$yJ#|%nJ8O5XUii7=Lp4PxI!=(y zs-bko_WcPKU4D-Zg!1kWFk3&$q`-)tC#QgPI;-kZif$D@+--ae5nWQ-A}O0DACK#; ztT}B-5F+|Y_dy6XK;AG|4v$^KI!^u3?w}nL4XGn%6{fsjR)fnQwzG1&_waPAqswJ2 z-=P?(ol1=k(FbudsI)SaN5Fq$smw$4Dhn=Z=xz(nm)5_PYny@sP-JW4O4`SrMfoiT zMhsW}>_p3PO|9h95WjHSId%Gp7tKhunR!D7xa!^`Y}N>X(I%|6+Zqwe~Be&N8oYT&)a7yaRrTp&qhD(!^4FBuOA}U zwY&Dc#)AcPEIuGJStMLT#L22(YN5!ss4(3_#;$ADDMLX+AgdOQPpeLXS4O!DlckMVR`^l2xXjhSF6U(ZaC`+xlJt3?-p_j+UR7_`z_sPM7JC(Of{(r zzijzJ8*lyCcVtB%b*nD+E5I4ODGWZ925~z?3^c@elYRNYGoFMUYksMi+Tr0zBB>^P zA1fN+j6hddcQ)Blr-*(T)*>8th=518mI9h?!GV37Qi`fj^khLZI8+KG6E(f}9GNS; zX80>g-158Kr{67|WLkEGHp5h6%}6KZ)Vx||F}*KrPLLJ0bqvsLIOBR{$d1Y7biD1u zQYX5a=lpGx+k77m5DI;kE37><#(&d=MU+ucGr&zwax;Ev&(o&@vKB3K*0FYY*As9L z@qq!8HK8)+y}qKLyG|tjZvm9t53+PV{4&n>p6NX`<%a>4EpVh!G^O$C(g0 zxOUKYdA)jUF}z|3Ag`H9?*cdmg2_?(%NPnkfYN)WaN{@mz18(JJ&uD!64XkxTK&my zIwW#Wv#&^>G0w$YRs62=lSCwihC%*7xqb1Gr@GWu8n?EqKb1cmh^WaP9`5W;`c;O zXw%S?0~z2MnbRmfIF}M9RZeZLP8bB3d!DgS>%fqC$VU~H6#pANpLcM-y|T}DeHz`| z18h`{Jy81MFD^bPw>uvWxYhF_$aZF4_m&S@*YtwNXdi?<&;bBAAwC_>8_DKa_8b8xGMD51rSj)kP+_dI^Qh z-?eW(gjOCb#%zz_`FiNjilBU~kNPuvwE=Ea9FM|HCQ!__i$eLw z(j#m~){D%MVe(hO5)G{k;B!?XH>qd{UrZrmXO-WB!nLWo%dHficOTpSY_&g37Dx#O z2QhhW&q!-Gg+ZZ$b$q1bm)@1bq%u1iW%~ z{d+baYK$DGAQ*?l2G1+ALd=>Y9REs~9VB8yr^n>|^pR1#*|e}}baLe+??Wd_=fOXD zov&`U?-~m%Tn{wypQ~N{ZQufLVYYbTom?RNcZB17MDZ>@rSTtbz}_s`xGVeeq4G(+ zEO+1Za+0<0*s0Rjub}d#(+GeV2|sE5s5UvREmBelDXN8>Q;?Mj1j=feB9j~W{RuK>=r*Uvho-_pv9DINX=K)UY41clQA2(~z!H)7}A ziAIsX{72Ipc4Utvb}mF|ht#Q|EQ`NeuKH5+QTjt3Ufr@AV*MgIX@dvT7he-sN9_+T zG%HZE@4|Ex0z1owe_TENz4;6Pe90SzKE7fQzFYY~yy0Q#P5^EWdQB}Hj~HHev!oA0 zUUc_zAZB{vi!0C!9SRiR2;>yaDCA_Von8-D+_$viJFpW*$H|gKMC+@exQr_aiun6} zX*@9S;%UK!242OEqJ)xw7Bz`ImbFLwTM1-+{R<*77qbIpK2re6*JGTK!d5Y{KJxdU z_>gp%*W+C7@NhQ*0I*3XIFZxAkb7}EjK~ygku(=J1{o3SADBAhKQQ%z6ad%Zrp_8) z+*;Sth_b=ldvKnL4$DQET)kT@pdcY-oZZP<2D-YyBV6D@(RI!(v7lLUCg~#gWQeEaH|d;J4k#okjYe?eP20 z89b|7;qJdl=Gwc&5d2R!QSYR(Taw${`iuHIu9wM}CQ0FkJky+Ae^7g8c!bQlVJogF zUA=E`*jcqOqZ#%DIq#qsyOiN?`PuY5cuoQ2APQ;e2|S34YYyXe2U3G;pG!m_2_9El zW<>+|Ri5U3Mf*RF#r(&yJ2Mz>0oY&mzf8-hpLHQX8+^ot{etcuYZL5Y2-XS3y$2}g z5{xG-8~ncd)2;_*b|FRLymH!PpIEjBaOlkKayC)^Xt&Aw@8TZjPD5>zsN~=feJMH@ z;Hgrusu2hg7Z~b$Z!;jd!OCn?{nebur%XcXP;491BDP3EgSX2Ql0%Ld6CGbepw{XC^$ayEKAm<02URya0|9y*=x z=$F&#szye|Z)GdgDYK|NeHtIFf;9A!38+(5;CB$qW~fkfqr}Zdb{RCFbB4lti^w~E zw($t1#e1Om`^T4GHN1h!8(_=-0^fumHQ#~ZF7FOg7EYc9xu_kP6ryhD=ir5`*|;V% z8BfM&BPgjC9UNzJ^l$}RIIe+eGmJd)rFD@Rz6M8Lw&8WQkrsR}PhIdq4fg3B@Yedg zi=}&`FOfn2<7*?;H?9TJPBj)7&ge(~r9FUI+zBZtHhn|to5q$R0s$%s`Wyd&hTmBf z^c8LG)0rk(_NNcL1Slo2@|-@LmX@Y(yn+v5BX5ijvNs||;I?o|b)G=CcaV2NdeF8+ z`SFw(iA%HB?@ty*ANSA8gdOhe0{G<3V=5j{d|@Nk-3b+kc$TU@i%TCu{do6|&HYUa z;8Ta%>;;Dq8+p)oWWa7`{nFAm?vce?I(&xT!)51RaQ{UGc`oc^%}e0?^V`rQ^v2xC z%`H6o7ikNa5AkL`l$W{X$lE3JKm~(GvE|7B@>GC2`QMl-Uc4}D2taGMdPIR5Ua@`I z+W%$Q(LjAgdM^q3YV&Ts?w>=Ug0R{>KI=yfQGn8bR7Do&;n5Kt73g4sutHwhrSyNe z4SHyA4*ywFekKW^`eA7S*Qg81#W5h{mNNXyzzF>WE7IZ+`N`=yEzIZA{qpm;iq=0x zsD@Bvoq^(L*{A}Z^9uix0{Y&+c{d;=xA;wW;A!TqpGXVnx;Xvo3)GD_?{o@~vI)FB zw|u}e@*=+emM{M;&wDHXD!|X?{#Fh_^5z(jgk|`DeR&MHYO?0hdOqvTmtaW1{=Pvc zg@*r9wI#xVZV`9gTe14qhx!oT$`LKuV*kfeV{hIiz(^|i#|f2h7v=5US7i!#lisS1L>u~6O*Lc8{2eM|%K(b8(E`?LVvZ^*Kr|#%mo-Te>D&Q| zlQIw+?p=KV-rB*w-%y*cd$M$GCG0ngVgC7ycdd(z;lfSpKGwzBPP2xO1gn@$N9gam z?Nm0G8Z{^YYV=01>7QVsJvm80t@8*myS3A3u&QDf1%07`hV{(D1L zmc;S7UPUgMs<{NdQJVs{!&0P!B7Z#hU>-JxZ)EQ3Dgq0v$Y4w>=Q_h#g?=GyglA zv+LMyw?YBm#WM!2=}~1Oc#;_D2o5{Ff`OhC$d(=4+M;#+ipC*E9@f!6&y>R7>)mTe zT`7uwV-x%s38+@?7ydLZF$KgLF!pmK&%b%y}NPeImoqJD<(4r5nAfU z!MrqL)wikktw@S3by5k1M0PPNWU7@8f3c@cD-vxI%L_aKgotm}G~4?K(MbsR6kh z5b#c%iL3^sXhy2rGa4$Wf!Qb8=wR7u&cEzu^;<=?U*32{ zisLY@A`FCL5Dzz`i1lHnp-!?;Zg}#AEEXKM`Whne_xM`P#ULf|n9v3T00r>l1Fbgv zBH8nzIS6D5L!`45pzL1pgVvMQ>-7N|Mb7qT0zFLAU*2eGzaz5ei#6K;s*cQEE-8!! zT=4OYzdd)%V@dOj=`~K3tYF-hBq;w!FB^5dDN{HoEE6?B8O-159n>Okx3hQJ0Ftz{ zEEd`*8FOP)f>F#D>le4Yy;ze=W2{~qw2Gk@b7wW!iT%3u^Y-KD!h8P7^PQV#X^{N` zam8t~cnmIrs14=}d$`QHE#Mdt`;vns=P}v5t*!5AX zDkO1$xta$*&ZChYSu43Eh+cux$G*S6Ox|aDczT>7c5@T<3db6GVlm}a-IKqM>Kemt94Qd0Kh>LBJVWQ?}f^z$^%F~R#N&@F%quS`0x zdb9(8Qzu>@W5%!-#~Z|g!|8M+u-h*&xN`xXvP2T?eq(NTeq_cPrGngW!2~v&FgEA|5~kQo`@3 z8)aNJ+nce`A}x-x^&_|lyW`+s$i)epIVMmt6Ls*6_MktLqUg6Tynj0+amV zh(r<#KG9lhv>EBAL#G>%9 zn2Fah&QHKm(vVGBJGU*`2^0GBlbqK?Anl&-z$$e3c`L7pRVb+|L$;wJJn`B&B-duF zwr}u7Eyi~UTqV*HD@V?yU&5X0ESJ|eT5IkP=!15=Kl)SrDrT@px5L*gGQlUQsJA&? zeQ=ge`^_+PyAw1gHgfCNxi5f{rfRdY+>ofvY^+m|I!pd^YK{F7c2kduyD%*UJ1>wN z9#m68>jqYHS~W96M-bV8VG9bso|r=)k_}*E3OS=wN>Shua67{SP!3dwuEO2JB1roQ zo$1QilEzqp7N1HD{?(~nn=dj9(KkVQ0@MB{^F~WlE|fY~C`)X=d=>L+a56bDD$uhI zpv&NRSU5j5C28mkesPbjuoV!ABATr{!Dj@?*We*fcDx7_mLWU`Bbp!`(G?@<^0fwv z&^F+i2%FvGC?AE(K8SN)9}7*k_z4izSi4lo#H{gW znHsOJ@CO}SPtD2mll}unicVROz;Tx_{yURg)=nV&#l}IiHO1UGc@ltQP$yrLI^JK= zQAmcaU2E5_Z*%&YFcHp3#>P8z9CnpJ<4V6rr;?RB|LR;|y4mg33$RR}Nm=P~p(-Yu z2wRl3S~HRx+84&MqkH6LV$ur$?t6`eAnrI>s zPZyQEKvtN1w=j!wNl5VAV1CJ#@2=AMxo)_8x|teYwYqA4Rvd(3pqk?fy1(;Fe%3?J z4!t1yq+o*YA`+Cm&Ne1P{xre#k4{mBUHA%5kzh+2J`&V=A*nA+yYVQ!<6ujr`Tq9+ z4qpF9Z+%vg+IUh*-e_0$)R~3NjfI(9`oB59_Aye%!}CR>AX>OhdJBJkA?WmikqP8v zSoefqmBY1T{S`@sv~HD*Nio{USdw<})Z`%0?ZrlQ4`e8k=v4fHWLa&{^~J@HHm8G& zKYP;B{pFqdZ=v?59}kN2cb7W=zJ)*{feI;qnoOG5^?V}=1_e>?36LiG!%VyxSNFgr z5`iTz0dM@0r$Gq5>U$mZ=POKla4Ors>^~lsjVD_Z?Nio}tdEspZ@>eG$z2WW7E~bzIzdiA2PJ>?!(wDp4cL9LX`^mqsOh5;X3a}r&UB{!aQ(UK^Wp7s9iU-$`pGVlR+Bzt6t)_nRU*N?E2(Z0ENh4p zH;F#r?aNkh=N5;2C=TGtr;H}Br!$A)r5!l|#j0%Hzuwpul7{@9H`pdmb^7{RYh568 zz=!@V6vG#-u5pDT)%NysHbcdt3qOw9F8ziA`4P2U)UV$C+F9=arMq_WBZP^JwO)$M zuL6uc>^LH6An!v(TW5Zd04Yu0X%Qm8bn3IR#IwzIDiH%{N+iM^AZSe@`2WJyoy^&q z9;X*k?dgld4hj3#8V@y(^IU;TL7gAB8KRs2CrM)5o6JZiUAula|CT(s)a7cIbnI|e zdlM0`Z;aXabpT;*>C!q-M0#KTR2?6sdV1}tF9ufrb~!^rDp6yOJ?Wwr%4%w*z#q{O z+J_3II=h6>K&!A=6fHpn8PK{)XlW58n;=euPyA{@2zD4w7hfZvyeE}}zcv8py4EJo zLU{K8Vpd$zszPr{RQvLhD}SGQ2|do0ES9EHQ2!O83ir4i!W9QHB~9$Ktj6RaWOa9= z;S}*D0AGf;&65zH3Wa?HK@z~X7(X&os9d)?1Z}K>C@jWE8dwU<=s{CFWhmtA1W-J> z_gh!V6bwX#-FL8^vpL+-a#65+ZBCHi+OKZ?NCDu9=R?Py+X7Ww00Z`UTTKjyyRHn~ zA6LeVs4goUi#;SyB=P2a6C{g=M{oP*`q&SY@+p#5SKus^V779>DO_y7S1fQC&H4L) zvaZeR?mFcIEN_82&)b3P=l+S$#;JfV*YmheyrctRGZ=Gwi4yhlRz&VxhhG@IXIJ9r z==H@uj}{C!d@D2@PdVLMw|B0?@*aWsYJa@H&M3I4e+hd&)}Mlb;97SCFJ&Zx?jCVd zi)TW+KYyJ%(!){8I3lbHsV6Ijuj^v!3Q5T+$aD7ljG)oKul0WBMDSA{XHE9>|9dWbxy=ObzN%;ynNC92id zI?+rPQ}eA>U7` zFNqccz`roy+JiEi)&t>jJM1@jrZ0-Dq(DqI+4*H3>Px%zE8xEF$#2H|p6e60heb(< z8N@-^LMl7N4WXe~vBgvOj_S|8M1o9YfF2B{j?N+vcgtpmMenHN2S8+H;@vaB6B6jG zIPr-Nt#xiJWyIC9BR=f$El+l(;vIVgg--s-XHKzU%B>J9rwbU_k0R>DE)^xR1-3DY zLuzf&5;-I;c}*CP7A8NfS_GSrpG6;rPb*TtBKXh}hKUV~+DzM0I6GqR&34Q+l=@S` zp{Uh2eol|XMy;e9EH@^ASF;M#Tn`SvbBS*r10Y=kdoUFP#?&|5hv8cL$3+nTg1HLW zO_t(}`hGW?hxAslJ~Os*(0l;a;!M7g_wDT5e_iSuYA}(Svj{3beF$$)K{@Tq?>%jD z^+O}-%EIEo{P?8hL;h#lr_Zr<5G~i}$bND4Wi|1fAh-p`Tw#IMyGVXzN!D5Io$t{*$~` zSs1xSlavr%mCi`KxLD$^;bp1zCiEhUpUhK_3NBr%ZwS@n`pcXg?TF!UKV6%`BX_nE znQ;(3%HUvvxVCTmJu7GRB5u6G;=Bl0BM+NRb_v?(F_|M3;7C5nH9S9edCYowbHON!BYg zI85UF{m#$bNDlO7=2Y|M_laHVqF-=Xqbhox3&da7$I6p2etW-&;jO*ULq3@p!$@A%`s93Quw=SM%) zhG8JwL>%-5ljB?*Rn?4Pt7R#&-blAaaL;X(Iq>9nk0dgJ;c3VZtrm zx&2O06HPE-l;pfdz4y4`nGJvY>R8=U)tjm35~R&06!75oK;Hls=iEGlpQa(OS#c23PVh&E;1UYy<=aj1A6UWP@Gc@t0*pC_5;1 zzch&Wh573`vOb-E{>m0$6Z9eWdT{P4!>8B7;8j4Kd##paZZjwQ;>m7CpJ2IDThAJs zd9x8=gzcE@j~jDVFku8$+I(H&H0X!%E{%#PrcD|fJj}ubN4e_1V6Y(`vA-T zkM&>*95AIM+pjP5)Y}g+!QRy7N4}#H-eNU>ifVAO;pC?^#}x`@1zFY$GLp3t2kt!6 z9_4iRSk!E-$i;J)P7AkRsRYC7!ZUr7R=qG$b&~R8ds4@Y$zTqlg2q zV35ic;x9UHyu#ubkv5xbo!F<|*U0s4^mkd9Ot0q5ssTwt=m&?_kL+00Tz|sV-QkB)oHH7P z%=Dc;&v*>OZ7#>jX?ew!%*jA9b0dFuJc?85Ua`^WZ55lY%_*l z1Ia+4DH*;QWQ34A$(ipcYrFQwOpI$e8`H2T6{x2l4VGAvcYg^+B6_zgY~orVdh_vt zS(2i|gnkR7Bk(oX%lIPkgTwqOaN%L`%K>B!S$dAFJVOQ)g^Cn)d-p}pB}j%{E7?C& zO<@8|yI?@Iy^K$RFSGVVyUj?z`t;iY`oY8R%epVN_E!{baR=wM!U2k}+Suz7IP=Bc zz-nDA3`bjT;e2siOPxc9UHBvTO6M$|PEonX6XW^uXOSFt4#(&Av>cBpTZnju+7T5! z$CT%S+*{jUGe}f?Gg}@Q55$ zA>J4Os;Kjc_v8HNA`%A3HeIvJ$iQy8cd>NHiz}5SvdesKXG5h+Exx76nFK=JH$1S% z0PpO+U$Ol83%;*BG4i*h=5Dqpocel5S_^mKnO>GEt6}TYk@(0?lX6&Uh_HAnjB9d5< z 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 literal 0 HcmV?d00001 diff --git a/website/public/docs-assets/4/unknown-student.png b/website/public/docs-assets/4/unknown-student.png new file mode 100644 index 0000000000000000000000000000000000000000..247a29e91240f3b13cd98340afc273591119b9cc GIT binary patch literal 46530 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�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 T>?#Wf{JfM>dQl|t=HveXe>v{M literal 0 HcmV?d00001 diff --git a/website/public/docs-assets/PR-code-btn-modal.png b/website/public/docs-assets/PR-code-btn-modal.png new file mode 100644 index 0000000000000000000000000000000000000000..2cc4b1b279ca35a8f47462bddfe57a637a2a6af7 GIT binary patch literal 26148 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 NSwT&{Le?zk{{e6e3YY)@ literal 0 HcmV?d00001 diff --git a/website/public/docs-assets/PR-header.png b/website/public/docs-assets/PR-header.png new file mode 100644 index 0000000000000000000000000000000000000000..bb76c8cf648869bfe00d48cc1e5fc2204cc1b6fb GIT binary patch literal 26895 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 literal 0 HcmV?d00001 diff --git a/website/public/docs-assets/angular-challenge.webp b/website/public/docs-assets/angular-challenge.webp new file mode 100644 index 0000000000000000000000000000000000000000..743d5aaabee9093abd61a3610183f22da3cb514f GIT binary patch literal 5386 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 TH{WgWKZTq;Ze{VgogeUjhSt)m literal 0 HcmV?d00001 diff --git a/website/public/docs-assets/codespaces.png b/website/public/docs-assets/codespaces.png new file mode 100644 index 0000000000000000000000000000000000000000..2b8e8a43cec127c3c7b1034e247c9855e5ef6310 GIT binary patch literal 32721 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 literal 0 HcmV?d00001 diff --git a/website/public/docs-assets/fork-sync.png b/website/public/docs-assets/fork-sync.png new file mode 100644 index 0000000000000000000000000000000000000000..7374facc026f0f9185873599be6dfbc51907ee76 GIT binary patch literal 10722 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 literal 0 HcmV?d00001 diff --git a/website/public/docs-assets/new-pull-request.png b/website/public/docs-assets/new-pull-request.png new file mode 100644 index 0000000000000000000000000000000000000000..085acccee9bf1393f54c4c1f6b0ca649a98d69bc GIT binary patch literal 60954 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 DzbBd9 literal 0 HcmV?d00001 diff --git a/website/public/docs-assets/performance/34/profiler-record.png b/website/public/docs-assets/performance/34/profiler-record.png new file mode 100644 index 0000000000000000000000000000000000000000..febcbd2a00a93b227c971e8c7f3cb1a4da6e3a50 GIT binary patch literal 131843 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�ychl+b(I5DLeEkA7 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%0D<4*c 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 z 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

+ + + + @if (menuOpen()) { + + } + + +
+ +
+
diff --git a/website/src/app/layout/docs-layout.ts b/website/src/app/layout/docs-layout.ts new file mode 100644 index 000000000..26325e09e --- /dev/null +++ b/website/src/app/layout/docs-layout.ts @@ -0,0 +1,54 @@ +import { Component, computed, inject, signal } from '@angular/core'; +import { NavigationEnd, Router, RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router'; +import { toSignal } from '@angular/core/rxjs-interop'; +import { filter, map } from 'rxjs'; +import { MANIFEST } from '../generated/manifest'; +import { SiteHeader } from './site-header'; + +@Component({ + selector: 'app-docs-layout', + imports: [RouterOutlet, RouterLink, RouterLinkActive, SiteHeader], + templateUrl: './docs-layout.html', +}) +export class DocsLayout { + private readonly router = inject(Router); + + protected readonly manifest = MANIFEST; + protected readonly menuOpen = signal(false); + protected readonly query = signal(''); + + protected readonly currentUrl = toSignal( + this.router.events.pipe( + filter((e) => e instanceof NavigationEnd), + map((e) => e.urlAfterRedirects.split('#')[0].split('?')[0]), + ), + { initialValue: this.router.url.split('#')[0].split('?')[0] }, + ); + + protected readonly searchResults = computed(() => { + const q = this.query().trim().toLowerCase(); + if (q.length < 2) { + return []; + } + const all = [ + ...this.manifest.guides, + ...this.manifest.challenges.flatMap((g) => g.items), + ]; + return all + .filter( + (item) => + item.title.toLowerCase().includes(q) || + item.description.toLowerCase().includes(q), + ) + .slice(0, 10); + }); + + protected isCategoryOpen(category: string): boolean { + return this.currentUrl().startsWith(`/challenges/${category}`); + } + + protected closeMenu(): void { + this.menuOpen.set(false); + this.query.set(''); + } +} diff --git a/website/src/app/layout/site-header.html b/website/src/app/layout/site-header.html new file mode 100644 index 000000000..5136e4b5f --- /dev/null +++ b/website/src/app/layout/site-header.html @@ -0,0 +1,76 @@ +
+ +
diff --git a/website/src/app/layout/site-header.ts b/website/src/app/layout/site-header.ts new file mode 100644 index 000000000..8e278d1e3 --- /dev/null +++ b/website/src/app/layout/site-header.ts @@ -0,0 +1,29 @@ +import { Component, PLATFORM_ID, computed, inject, output } from '@angular/core'; +import { isPlatformBrowser } from '@angular/common'; +import { httpResource } from '@angular/common/http'; +import { RouterLink } from '@angular/router'; +import { Auth } from '../auth'; + +@Component({ + selector: 'app-site-header', + imports: [RouterLink], + templateUrl: './site-header.html', +}) +export class SiteHeader { + readonly menuToggled = output(); + protected readonly auth = inject(Auth); + + private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID)); + + private readonly statsResource = httpResource<{ stars: number }>(() => + this.isBrowser ? '/api/stats' : undefined, + ); + + protected readonly stars = computed(() => { + const stars = this.statsResource.value()?.stars; + if (!stars) { + return null; + } + return stars >= 1000 ? `${(stars / 1000).toFixed(1)}k` : `${stars}`; + }); +} diff --git a/website/src/app/pages/coming-soon/coming-soon.ts b/website/src/app/pages/coming-soon/coming-soon.ts new file mode 100644 index 000000000..15b5bbc73 --- /dev/null +++ b/website/src/app/pages/coming-soon/coming-soon.ts @@ -0,0 +1,18 @@ +import { Component, input } from '@angular/core'; + +@Component({ + selector: 'app-coming-soon', + template: ` +
+

{{ title() }}

+

+ This page is being rebuilt and will land here soon. In the meantime it is still available on + the current docs site. +

+
+ `, +}) +export class ComingSoon { + readonly title = input.required(); + readonly fallback = input.required(); +} diff --git a/website/src/app/pages/docs/doc-page.html b/website/src/app/pages/docs/doc-page.html new file mode 100644 index 000000000..778ef5b30 --- /dev/null +++ b/website/src/app/pages/docs/doc-page.html @@ -0,0 +1,167 @@ +
+
+ @if (doc().collection === 'challenges' && doc().challengeNumber) { +
+ + +
+ + {{ doc().categoryLabel }} + + + Challenge #{{ doc().challengeNumber }} + + @if (doc().difficulty; as difficulty) { + + + {{ difficulty }} + + } +
+ +

{{ doc().title }}

+ +
+ + + + + Browse solutions + + @if (doc().blogLink; as blog) { + + + + + Blog post + + } + @for (video of doc().videoLinks ?? []; track video.link) { + + + + + Video + @if (videoFlag(video.flag); as flag) { + + } + + } +
+
+ } @else { +

{{ doc().title }}

+ } + +
+ + @if (npxCommand(); as command) { + + } + + @if (doc().author || doc().contributors.length > 0) { +
+
+ @if (doc().author; as author) { +
+ Author: + @if (author.githubLogin; as login) { + + + {{ author.name }} + + } @else { + {{ author.name }} + } +
+ } + @if (doc().contributors.length > 0) { +
+ Contributors: +
+ @for (contributor of doc().contributors; track contributor) { + + + + } +
+
+ } +
+
+ } + + @if (!doc().noComments) { + + } +
+ + + @if (doc().toc.length > 0) { + + } +
diff --git a/website/src/app/pages/docs/doc-page.ts b/website/src/app/pages/docs/doc-page.ts new file mode 100644 index 000000000..820f70883 --- /dev/null +++ b/website/src/app/pages/docs/doc-page.ts @@ -0,0 +1,63 @@ +import { Component, computed, effect, inject, input, signal } from '@angular/core'; +import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { Meta, Title } from '@angular/platform-browser'; +import { RouterLink } from '@angular/router'; +import { Doc } from '../../doc.model'; +import { Comments } from '../../shared/comments'; + +@Component({ + selector: 'app-doc-page', + imports: [RouterLink, Comments], + templateUrl: './doc-page.html', +}) +export class DocPage { + private readonly sanitizer = inject(DomSanitizer); + private readonly title = inject(Title); + private readonly meta = inject(Meta); + + /** Provided by the route resolver via component input binding. */ + readonly doc = input.required(); + + protected readonly html = computed(() => + this.sanitizer.bypassSecurityTrustHtml(this.doc().html), + ); + + protected readonly npxCommand = computed(() => + this.doc().command ? `npx nx serve ${this.doc().command}` : null, + ); + + protected readonly copied = signal(false); + + protected readonly difficultyClasses: Record = { + easy: 'bg-emerald-500/10 text-emerald-400 ring-1 ring-inset ring-emerald-500/30', + medium: 'bg-amber-500/10 text-amber-400 ring-1 ring-inset ring-amber-500/30', + hard: 'bg-rose-500/10 text-rose-400 ring-1 ring-inset ring-rose-500/30', + }; + + protected videoFlag(flag?: string): string | null { + return { FR: '🇫🇷', ES: '🇪🇸' }[flag ?? ''] ?? null; + } + + constructor() { + effect(() => { + const doc = this.doc(); + this.title.setTitle(`${doc.title} | Angular Challenges`); + this.meta.updateTag({ name: 'description', content: doc.description }); + this.meta.updateTag({ property: 'og:title', content: doc.title }); + this.meta.updateTag({ property: 'og:description', content: doc.description }); + }); + } + + protected copyCommand(): void { + const command = this.npxCommand(); + if (command) { + navigator.clipboard?.writeText(command); + this.copied.set(true); + setTimeout(() => this.copied.set(false), 2000); + } + } + + protected avatar(login: string): string { + return `https://github.com/${login}.png?size=64`; + } +} diff --git a/website/src/app/pages/docs/doc-resolver.ts b/website/src/app/pages/docs/doc-resolver.ts new file mode 100644 index 000000000..2e57824a2 --- /dev/null +++ b/website/src/app/pages/docs/doc-resolver.ts @@ -0,0 +1,20 @@ +import { ResolveFn, RedirectCommand, Router } from '@angular/router'; +import { inject } from '@angular/core'; +import { Doc } from '../../doc.model'; +import { CONTENT_MAP } from '../../generated/content-map'; + +export const docResolver: ResolveFn = async (route) => { + let segments = route.url.map((s) => s.path); + // Solution routes resolve the underlying challenge doc. + const solutionsIndex = segments.indexOf('solutions'); + if (solutionsIndex !== -1) { + segments = segments.slice(0, solutionsIndex); + } + const url = '/' + segments.join('/'); + const load = CONTENT_MAP[url.replace(/\/$/, '')]; + if (!load) { + const router = inject(Router); + return new RedirectCommand(router.parseUrl('/not-found'), { skipLocationChange: true }); + } + return load(); +}; diff --git a/website/src/app/pages/landing/landing.html b/website/src/app/pages/landing/landing.html new file mode 100644 index 000000000..82b05a60e --- /dev/null +++ b/website/src/app/pages/landing/landing.html @@ -0,0 +1,212 @@ +
+ + + + + + +
+
+
+ This project is sustained by its sponsors + @if (sponsors().length > 0) { + + @for (sponsor of sponsors(); track sponsor.login) { + + + + } + + } +
+ + + + + Become a sponsor + +
+
+ + +
+
+ +

+ + Free & open source — {{ challengeCount }}+ challenges and counting +

+

+ Start now and become an + Angular Expert +

+

+ Real-world challenges on Angular, Nx, RxJS, NgRx and TypeScript. + Solve them, browse community solutions and climb the leaderboard. +

+ + + +
+
+
{{ challengeCount }}
+
Challenges
+
+
+
+ {{ statsResource.value()?.stars ?? '—' }} +
+
GitHub stars
+
+
+
+ {{ statsResource.value()?.forks ?? '—' }} +
+
Forks
+
+
+
+ + +
+ @for (card of cards; track card.title) { +
+
+ + @switch (card.icon) { + @case ('zap') { + + } + @case ('code') { + + } + @case ('branch') { + + } + @case ('users') { + + } + @case ('plus') { + + } + @case ('briefcase') { + + } + } + +
+

{{ card.title }}

+

{{ card.body }}

+
+ } +
+ + +
+ +

Never miss a new challenge

+

+ Subscribe to get notified when a new challenge lands. +

+
+
+
+
+ +
+
+ +
+
+
+
+
+
+ + + +
diff --git a/website/src/app/pages/landing/landing.ts b/website/src/app/pages/landing/landing.ts new file mode 100644 index 000000000..9e3a58719 --- /dev/null +++ b/website/src/app/pages/landing/landing.ts @@ -0,0 +1,90 @@ +import { + Component, + PLATFORM_ID, + afterNextRender, + computed, + inject, +} from '@angular/core'; +import { isPlatformBrowser } from '@angular/common'; +import { httpResource } from '@angular/common/http'; +import { RouterLink } from '@angular/router'; +import { MANIFEST } from '../../generated/manifest'; +import { SiteHeader } from '../../layout/site-header'; + +interface Sponsor { + login: string; + avatar: string; +} + +@Component({ + selector: 'app-landing', + imports: [RouterLink, SiteHeader], + templateUrl: './landing.html', +}) +export class Landing { + private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID)); + + protected readonly challengeCount = MANIFEST.challenges + .flatMap((g) => g.items) + .filter((i) => i.challengeNumber).length; + + protected readonly latestChallengeUrl = MANIFEST.challenges + .flatMap((g) => g.items) + .filter((i) => i.challengeNumber) + .sort((a, b) => (b.challengeNumber ?? 0) - (a.challengeNumber ?? 0))[0]?.url; + + protected readonly statsResource = httpResource<{ stars: number; forks: number }>(() => + this.isBrowser ? '/api/stats' : undefined, + ); + + protected readonly sponsorsResource = httpResource<{ sponsors: Sponsor[] }>(() => + this.isBrowser ? '/api/sponsors' : undefined, + ); + + protected readonly sponsors = computed( + () => this.sponsorsResource.value()?.sponsors ?? [], + ); + + protected readonly cards = [ + { + icon: 'zap', + title: `${this.challengeCount} Challenges`, + body: 'Real-life issues and specific features on Angular, Nx, RxJS, NgRx and TypeScript to elevate your skills.', + }, + { + icon: 'code', + title: 'Browse every solution', + body: 'Every community pull request is browsable right here — compare approaches with a side-by-side diff without leaving the site.', + }, + { + icon: 'branch', + title: 'Become an OSS maintainer', + body: 'These challenges lower the barrier to open source: you learn the fork/PR/review workflow used by every OSS project.', + }, + { + icon: 'users', + title: 'Learn alongside others', + body: 'Anyone can comment or offer assistance. Learning alone is great, but learning alongside others will get you further.', + }, + { + icon: 'plus', + title: 'Contribute', + body: 'An issue, an interesting bug, or an idea? Create your own challenge and get on the leaderboard.', + }, + { + icon: 'briefcase', + title: 'Prepare for interviews', + body: 'Completing these challenges gets you ready for the technical questions of your next Angular interview.', + }, + ]; + + constructor() { + // SendPulse newsletter embed script (same form as the previous site). + afterNextRender(() => { + const script = document.createElement('script'); + script.src = '//web.webformscr.com/apps/fc3/build/default-handler.js?1705909791474'; + script.async = true; + document.body.appendChild(script); + }); + } +} diff --git a/website/src/app/pages/leaderboard/leaderboard.html b/website/src/app/pages/leaderboard/leaderboard.html new file mode 100644 index 000000000..f2e0a629d --- /dev/null +++ b/website/src/app/pages/leaderboard/leaderboard.html @@ -0,0 +1,46 @@ +
+

{{ config().title }}

+

+ {{ config().intro }} + guide. +

+ + @if (myPosition(); as position) { +
+ You are ranked #{{ position }} — + jump to my position +
+ } + + @if (boardResource.isLoading()) { +
+ @for (i of [1, 2, 3, 4, 5, 6, 7, 8]; track i) { +
+ } +
+ } @else if (boardResource.error()) { +
+ Could not load the leaderboard from GitHub right now — please try again in a few minutes. +
+ } @else { +
    + @for (entry of entries(); track entry.login) { +
  1. + + + {{ medal($index) ?? '#' + ($index + 1) }} + + + {{ entry.login }} + + {{ entry.count }} {{ config().unit }} + + +
  2. + } +
+ } +
diff --git a/website/src/app/pages/leaderboard/leaderboard.ts b/website/src/app/pages/leaderboard/leaderboard.ts new file mode 100644 index 000000000..82c02b303 --- /dev/null +++ b/website/src/app/pages/leaderboard/leaderboard.ts @@ -0,0 +1,74 @@ +import { Component, PLATFORM_ID, computed, effect, inject, input } from '@angular/core'; +import { isPlatformBrowser } from '@angular/common'; +import { httpResource } from '@angular/common/http'; +import { Title } from '@angular/platform-browser'; +import { RouterLink } from '@angular/router'; +import { Auth } from '../../auth'; + +interface LeaderboardEntry { + login: string; + avatar: string; + count: number; +} + +const BOARDS: Record = { + answers: { + title: 'Challenges answered', + unit: 'challenges solved', + intro: 'Join the list and start your Angular Challenges journey by reading the', + link: '/guides/getting-started', + }, + challenges: { + title: 'Challenges created', + unit: 'challenges created', + intro: 'A challenge is missing? Create your own one and get on the leaderboard — read the', + link: '/guides/create-challenge', + }, + commit: { + title: 'Contributions', + unit: 'contributions', + intro: 'Typos, docs, tooling — every contribution counts. Read the', + link: '/guides/contribute', + }, +}; + +@Component({ + selector: 'app-leaderboard', + imports: [RouterLink], + templateUrl: './leaderboard.html', +}) +export class Leaderboard { + private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID)); + private readonly title = inject(Title); + protected readonly auth = inject(Auth); + + /** Route param: answers | challenges | commit. */ + readonly board = input.required(); + + protected readonly config = computed(() => BOARDS[this.board()] ?? BOARDS['answers']); + + protected readonly boardResource = httpResource<{ entries: LeaderboardEntry[] }>(() => + this.isBrowser && BOARDS[this.board()] ? `/api/leaderboard/${this.board()}` : undefined, + ); + + protected readonly entries = computed(() => this.boardResource.value()?.entries ?? []); + + protected readonly myPosition = computed(() => { + const login = this.auth.me()?.login; + if (!login) { + return null; + } + const index = this.entries().findIndex((e) => e.login === login); + return index === -1 ? null : index + 1; + }); + + constructor() { + effect(() => { + this.title.setTitle(`${this.config().title} | Angular Challenges`); + }); + } + + protected medal(index: number): string | null { + return ['🥇', '🥈', '🥉'][index] ?? null; + } +} diff --git a/website/src/app/pages/not-found/not-found.ts b/website/src/app/pages/not-found/not-found.ts new file mode 100644 index 000000000..9bb1da2d1 --- /dev/null +++ b/website/src/app/pages/not-found/not-found.ts @@ -0,0 +1,25 @@ +import { Component, inject } from '@angular/core'; +import { RESPONSE_INIT } from '@angular/core'; +import { RouterLink } from '@angular/router'; + +@Component({ + selector: 'app-not-found', + imports: [RouterLink], + template: ` +
+

404

+

This page could not be found.

+ + Back to home + +
+ `, +}) +export class NotFound { + constructor() { + const responseInit = inject(RESPONSE_INIT, { optional: true }); + if (responseInit) { + responseInit.status = 404; + } + } +} diff --git a/website/src/app/pages/solutions/diff-highlighter.ts b/website/src/app/pages/solutions/diff-highlighter.ts new file mode 100644 index 000000000..441f285fa --- /dev/null +++ b/website/src/app/pages/solutions/diff-highlighter.ts @@ -0,0 +1,89 @@ +import type { HighlighterCore } from 'shiki/core'; +import { DiffLine, Hunk } from './diff-parser'; + +/** Same theme as the build-time markdown highlighting (tools/generate-content.mjs). */ +const THEME = 'github-dark-default'; + +/** Languages a solution diff can realistically contain. */ +export type DiffLanguage = + 'angular-ts' | 'angular-html' | 'javascript' | 'css' | 'scss' | 'json' | 'markdown' | 'yaml'; + +const LANG_BY_EXT: Record = { + ts: 'angular-ts', + html: 'angular-html', + js: 'javascript', + mjs: 'javascript', + css: 'css', + scss: 'scss', + json: 'json', + md: 'markdown', + yml: 'yaml', + yaml: 'yaml', +}; + +let highlighterPromise: Promise | null = null; + +/** + * Lazily builds a shiki highlighter with only the grammars a diff can need. + * Everything is dynamically imported so shiki stays out of the initial bundle. + */ +async function getHighlighter(): Promise { + highlighterPromise ??= (async () => { + const [{ createHighlighterCore }, { createJavaScriptRegexEngine }] = await Promise.all([ + import('shiki/core'), + import('shiki/engine/javascript'), + ]); + return createHighlighterCore({ + themes: [import('@shikijs/themes/github-dark-default')], + langs: [ + import('@shikijs/langs/angular-ts'), + import('@shikijs/langs/angular-html'), + import('@shikijs/langs/javascript'), + import('@shikijs/langs/css'), + import('@shikijs/langs/scss'), + import('@shikijs/langs/json'), + import('@shikijs/langs/markdown'), + import('@shikijs/langs/yaml'), + ], + engine: createJavaScriptRegexEngine({ forgiving: true }), + }); + })(); + return highlighterPromise; +} + +export function languageFor(filename: string): DiffLanguage | null { + const ext = filename.slice(filename.lastIndexOf('.') + 1).toLowerCase(); + return LANG_BY_EXT[ext] ?? null; +} + +/** + * Attaches syntax-highlighting tokens to every line of the given hunks. + * Each side of the diff (old = context + deletions, new = context + additions) + * is highlighted as one block so multi-line constructs keep their context. + */ +export async function highlightHunks(lang: DiffLanguage, hunks: Hunk[]): Promise { + const highlighter = await getHighlighter(); + for (const hunk of hunks) { + highlightSide( + highlighter, + lang, + hunk.lines.filter((line) => line.type !== 'add'), + ); + highlightSide( + highlighter, + lang, + hunk.lines.filter((line) => line.type !== 'del'), + ); + } +} + +function highlightSide(highlighter: HighlighterCore, lang: DiffLanguage, lines: DiffLine[]): void { + if (!lines.length) { + return; + } + const code = lines.map((line) => line.text).join('\n'); + const tokens = highlighter.codeToTokensBase(code, { lang, theme: THEME }); + lines.forEach((line, i) => { + line.tokens = (tokens[i] ?? []).map((token) => ({ text: token.content, color: token.color })); + }); +} diff --git a/website/src/app/pages/solutions/diff-parser.ts b/website/src/app/pages/solutions/diff-parser.ts new file mode 100644 index 000000000..84e28faca --- /dev/null +++ b/website/src/app/pages/solutions/diff-parser.ts @@ -0,0 +1,89 @@ +export interface DiffLine { + type: 'context' | 'add' | 'del'; + oldNum: number | null; + newNum: number | null; + text: string; + /** Syntax-highlighting tokens, attached asynchronously by diff-highlighter. */ + tokens?: { text: string; color?: string }[]; +} + +/** One visual row of a split (side-by-side) diff. */ +export interface SplitRow { + left: DiffLine | null; + right: DiffLine | null; +} + +export interface Hunk { + /** Unchanged lines skipped between the previous hunk and this one. */ + skipped: number; + lines: DiffLine[]; + rows: SplitRow[]; +} + +/** + * Parses a GitHub unified `patch` string into hunks with both a unified line + * list and paired split rows (deletions zipped with the additions that + * replace them, GitHub-style). + */ +export function parsePatch(patch: string): Hunk[] { + const hunks: Hunk[] = []; + let oldNum = 0; + let newNum = 0; + let previousOldEnd = 1; + let current: Hunk | null = null; + + for (const raw of patch.split('\n')) { + const header = raw.match(/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/); + if (header) { + oldNum = Number(header[1]); + newNum = Number(header[3]); + current = { skipped: Math.max(0, oldNum - previousOldEnd), lines: [], rows: [] }; + previousOldEnd = oldNum + Number(header[2] ?? 1); + hunks.push(current); + continue; + } + if (!current || raw.startsWith('\\')) { + continue; // "\ No newline at end of file" + } + const text = raw.slice(1); + if (raw.startsWith('+')) { + current.lines.push({ type: 'add', oldNum: null, newNum: newNum++, text }); + } else if (raw.startsWith('-')) { + current.lines.push({ type: 'del', oldNum: oldNum++, newNum: null, text }); + } else { + current.lines.push({ type: 'context', oldNum: oldNum++, newNum: newNum++, text }); + } + } + + for (const hunk of hunks) { + hunk.rows = toSplitRows(hunk.lines); + } + return hunks; +} + +function toSplitRows(lines: DiffLine[]): SplitRow[] { + const rows: SplitRow[] = []; + let i = 0; + while (i < lines.length) { + const line = lines[i]; + if (line.type === 'context') { + rows.push({ left: line, right: line }); + i++; + continue; + } + // Collect a run of deletions followed by a run of additions and zip them. + const dels: DiffLine[] = []; + const adds: DiffLine[] = []; + while (i < lines.length && lines[i].type === 'del') { + dels.push(lines[i++]); + } + while (i < lines.length && lines[i].type === 'add') { + adds.push(lines[i++]); + } + const max = Math.max(dels.length, adds.length); + for (let j = 0; j < max; j++) { + rows.push({ left: dels[j] ?? null, right: adds[j] ?? null }); + } + } + return rows; +} diff --git a/website/src/app/pages/solutions/solution-diff.html b/website/src/app/pages/solutions/solution-diff.html new file mode 100644 index 000000000..2d12165b7 --- /dev/null +++ b/website/src/app/pages/solutions/solution-diff.html @@ -0,0 +1,161 @@ +
+ + ← All solutions for {{ doc().title }} + + + @if (loading()) { +
+
+
+
+ } @else if (failed()) { +
+ Could not load this pull request from GitHub right now. + + Open it on GitHub + + or try again later. +
+ } @else { + + @if (meta(); as m) { +
+ +
+

{{ m.title }}

+

+ #{{ m.number }} by {{ m.login }} + · + @if (m.merged) { + merged + } @else { + {{ m.state }} + } + · {{ m.changedFiles }} files + +{{ m.additions }} + −{{ m.deletions }} +

+
+
+ + + + View on GitHub + +
+
+ } + + +
+ @for (file of files(); track file.filename) { +
+
+ + @if (file.previousFilename) { + {{ file.previousFilename }} → + } + {{ file.filename }} + + @if (file.status === 'added') { + added + } @else if (file.status === 'removed') { + removed + } + + +{{ file.additions }} + −{{ file.deletions }} + +
+ + @if (!file.patch) { +

+ No text diff available for this file (binary or too large) — + view it on GitHub. +

+ } @else { +
+ + + @for (hunk of file.hunks; track $index) { + @if (hunk.skipped > 0) { + + + + } + @if (mode() === 'split') { + @for (row of hunk.rows; track $index) { + + + + + + + } + } @else { + @for (line of hunk.lines; track $index) { + + + + + + + } + } + } + +
⋯ {{ hunk.skipped }} unmodified lines
+ {{ row.left?.oldNum }} + @if (row.left; as l) {@if (l.tokens) {@for (t of l.tokens; track $index) {{{ t.text }}}} @else {{{ l.text }}}} + {{ row.right?.newNum }} + @if (row.right; as l) {@if (l.tokens) {@for (t of l.tokens; track $index) {{{ t.text }}}} @else {{{ l.text }}}}
{{ line.oldNum }} + {{ line.newNum }} + + {{ line.type === 'add' ? '+' : line.type === 'del' ? '−' : '' }} + @if (line.tokens) {@for (t of line.tokens; track $index) {{{ t.text }}}} @else {{{ line.text }}}
+
+ } +
+ } +
+ } +
diff --git a/website/src/app/pages/solutions/solution-diff.ts b/website/src/app/pages/solutions/solution-diff.ts new file mode 100644 index 000000000..1cb3f2b18 --- /dev/null +++ b/website/src/app/pages/solutions/solution-diff.ts @@ -0,0 +1,124 @@ +import { + Component, + PLATFORM_ID, + computed, + effect, + inject, + input, + signal, + untracked, +} from '@angular/core'; +import { isPlatformBrowser } from '@angular/common'; +import { HttpClient, httpResource } from '@angular/common/http'; +import { Title } from '@angular/platform-browser'; +import { RouterLink } from '@angular/router'; +import { Auth } from '../../auth'; +import { Doc } from '../../doc.model'; +import { PullFile, PullMeta } from './solution.model'; +import { Hunk, parsePatch } from './diff-parser'; +import { highlightHunks, languageFor } from './diff-highlighter'; + +interface FileView extends PullFile { + hunks: Hunk[]; +} + +@Component({ + selector: 'app-solution-diff', + imports: [RouterLink], + templateUrl: './solution-diff.html', +}) +export class SolutionDiff { + private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID)); + private readonly title = inject(Title); + private readonly http = inject(HttpClient); + protected readonly auth = inject(Auth); + + protected readonly reaction = signal<'idle' | 'saving' | 'done' | 'error'>('idle'); + + /** Provided by the route resolver / router input binding. */ + readonly doc = input.required(); + readonly pr = input.required(); + + /** 'split' on desktop, toggleable; unified is friendlier on mobile. */ + protected readonly mode = signal<'split' | 'unified'>('split'); + + protected readonly metaResource = httpResource(() => + this.isBrowser ? `/api/pulls/${this.pr()}` : undefined, + ); + + protected readonly filesResource = httpResource<{ files: PullFile[] }>(() => + this.isBrowser ? `/api/pulls/${this.pr()}/files` : undefined, + ); + + protected readonly meta = computed(() => this.metaResource.value() ?? null); + + private readonly parsedFiles = computed(() => + (this.filesResource.value()?.files ?? []).map((file) => ({ + ...file, + hunks: file.patch ? parsePatch(file.patch) : [], + })), + ); + + /** Bumped once syntax-highlighting tokens have been attached to the parsed lines. */ + private readonly highlightVersion = signal(0); + + protected readonly files = computed(() => { + // Fresh array on every recompute: the lines are mutated in place by the + // highlighter, so an identical reference would be swallowed by the + // computed's Object.is equality check and never reach the template. + this.highlightVersion(); + return [...this.parsedFiles()]; + }); + + protected readonly loading = computed( + () => this.metaResource.isLoading() || this.filesResource.isLoading(), + ); + + protected readonly failed = computed( + () => !!this.metaResource.error() || !!this.filesResource.error(), + ); + + constructor() { + effect(() => { + const meta = this.meta(); + this.title.setTitle( + meta + ? `PR #${meta.number} by ${meta.login} — ${this.doc().title} | Angular Challenges` + : `Solution — ${this.doc().title} | Angular Challenges`, + ); + }); + + effect(() => { + const files = this.parsedFiles(); + if (this.isBrowser && files.length) { + untracked(() => this.highlightFiles(files)); + } + }); + } + + private async highlightFiles(files: FileView[]): Promise { + try { + for (const file of files) { + const lang = languageFor(file.filename); + if (lang) { + await highlightHunks(lang, file.hunks); + } + } + this.highlightVersion.update((v) => v + 1); + } catch { + // Highlighting is progressive enhancement — the plain-text diff stays readable. + } + } + + protected react(): void { + if (!this.auth.me()) { + location.href = this.auth.signInUrl(); + return; + } + this.reaction.set('saving'); + this.http.post(`/api/pulls/${this.pr()}/react`, {}).subscribe({ + next: () => this.reaction.set('done'), + error: () => this.reaction.set('error'), + }); + } +} diff --git a/website/src/app/pages/solutions/solution.model.ts b/website/src/app/pages/solutions/solution.model.ts new file mode 100644 index 000000000..5ace2a04c --- /dev/null +++ b/website/src/app/pages/solutions/solution.model.ts @@ -0,0 +1,37 @@ +export interface Solution { + number: number; + title: string; + login: string; + avatar: string; + isAuthor: boolean; + state: 'open' | 'closed'; + merged: boolean; + thumbsUp: number; + comments: number; + createdAt: string; + htmlUrl: string; +} + +export interface PullMeta { + number: number; + title: string; + login: string; + avatar: string; + state: 'open' | 'closed'; + merged: boolean; + createdAt: string; + htmlUrl: string; + additions: number; + deletions: number; + changedFiles: number; +} + +export interface PullFile { + filename: string; + previousFilename?: string; + status: 'added' | 'removed' | 'modified' | 'renamed' | string; + additions: number; + deletions: number; + patch: string | null; + blobUrl: string; +} diff --git a/website/src/app/pages/solutions/solutions-list.html b/website/src/app/pages/solutions/solutions-list.html new file mode 100644 index 000000000..40036117c --- /dev/null +++ b/website/src/app/pages/solutions/solutions-list.html @@ -0,0 +1,78 @@ +
+ + ← {{ doc().title }} + +

Community solutions

+

+ Every pull request submitted for challenge #{{ doc().challengeNumber }} — click one to read + the full diff without leaving the site. +

+ + @if (solutionsResource.isLoading()) { +
+ @for (i of [1, 2, 3, 4]; track i) { +
+ } +
+ } @else if (solutionsResource.error()) { +
+ Could not load the solutions from GitHub right now. + View them on GitHub + or try again later. +
+ } @else if (solutions().length === 0) { +
+ No solution submitted yet — be the first! + + How to submit yours + +
+ } @else { + +

+ Also available + on GitHub. +

+ } +
diff --git a/website/src/app/pages/solutions/solutions-list.ts b/website/src/app/pages/solutions/solutions-list.ts new file mode 100644 index 000000000..3da1977ce --- /dev/null +++ b/website/src/app/pages/solutions/solutions-list.ts @@ -0,0 +1,39 @@ +import { Component, PLATFORM_ID, computed, effect, inject, input } from '@angular/core'; +import { DatePipe, isPlatformBrowser } from '@angular/common'; +import { httpResource } from '@angular/common/http'; +import { Title } from '@angular/platform-browser'; +import { RouterLink } from '@angular/router'; +import { Doc } from '../../doc.model'; +import { Solution } from './solution.model'; + +@Component({ + selector: 'app-solutions-list', + imports: [RouterLink, DatePipe], + templateUrl: './solutions-list.html', +}) +export class SolutionsList { + private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID)); + private readonly title = inject(Title); + + /** Provided by the route resolver via component input binding. */ + readonly doc = input.required(); + + protected readonly solutionsResource = httpResource<{ solutions: Solution[] }>(() => + this.isBrowser ? `/api/challenges/${this.doc().challengeNumber}/solutions` : undefined, + ); + + protected readonly solutions = computed( + () => this.solutionsResource.value()?.solutions ?? [], + ); + + protected readonly githubSearchUrl = computed( + () => + `https://github.com/tomalaforge/angular-challenges/pulls?q=label%3A${this.doc().challengeNumber}+label%3Aanswer`, + ); + + constructor() { + effect(() => { + this.title.setTitle(`Solutions — ${this.doc().title} | Angular Challenges`); + }); + } +} diff --git a/website/src/app/shared/comments.ts b/website/src/app/shared/comments.ts new file mode 100644 index 000000000..461b3ee50 --- /dev/null +++ b/website/src/app/shared/comments.ts @@ -0,0 +1,61 @@ +import { + Component, + ElementRef, + PLATFORM_ID, + effect, + inject, + input, + viewChild, +} from '@angular/core'; +import { isPlatformBrowser } from '@angular/common'; + +/** giscus comment thread — same repo/category config as the previous docs site. */ +@Component({ + selector: 'app-comments', + template: ` +
+
+
+ `, +}) +export class Comments { + private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID)); + private readonly host = viewChild.required>('host'); + + /** Changing term reloads the thread (component instance is reused across routes). */ + readonly term = input.required(); + + constructor() { + effect(() => { + this.term(); + if (!this.isBrowser) { + return; + } + const container = this.host().nativeElement; + container.innerHTML = ''; + const script = document.createElement('script'); + script.src = 'https://giscus.app/client.js'; + script.async = true; + script.crossOrigin = 'anonymous'; + const attrs: Record = { + 'data-repo': 'tomalaforge/angular-challenges', + 'data-repo-id': 'R_kgDOIXXIfw', + 'data-category': 'Announcements', + 'data-category-id': 'DIC_kwDOIXXIf84CSZF_', + 'data-mapping': 'specific', + 'data-term': this.term(), + 'data-strict': '0', + 'data-reactions-enabled': '1', + 'data-emit-metadata': '0', + 'data-input-position': 'bottom', + 'data-theme': 'preferred_color_scheme', + 'data-lang': 'en', + 'data-loading': 'lazy', + }; + for (const [key, value] of Object.entries(attrs)) { + script.setAttribute(key, value); + } + container.appendChild(script); + }); + } +} diff --git a/website/src/content/authors/Ioannis-Tsironis.json b/website/src/content/authors/Ioannis-Tsironis.json new file mode 100644 index 000000000..9cb257672 --- /dev/null +++ b/website/src/content/authors/Ioannis-Tsironis.json @@ -0,0 +1,5 @@ +{ + "name": "Ioannis Tsironis", + "github": "https://github.com/tsironis13", + "linkedin": "https://www.linkedin.com/in/giannis-tsironis/" +} diff --git a/website/src/content/authors/devesh-chaudhari.json b/website/src/content/authors/devesh-chaudhari.json new file mode 100644 index 000000000..c1bc4bfb4 --- /dev/null +++ b/website/src/content/authors/devesh-chaudhari.json @@ -0,0 +1,4 @@ +{ + "name": "Devesh Chaudhari", + "twitter": "https://twitter.com/DeveshChau" +} diff --git a/website/src/content/authors/lance-finney.json b/website/src/content/authors/lance-finney.json new file mode 100644 index 000000000..be44e3e89 --- /dev/null +++ b/website/src/content/authors/lance-finney.json @@ -0,0 +1,6 @@ +{ + "name": "Lance Finney", + "twitter": "https://twitter.com/LMFinneyCoder", + "linkedin": "https://www.linkedin.com/in/lmfinney/", + "github": "https://github.com/LMFinney" +} diff --git a/website/src/content/authors/stanislav-gavrilov.json b/website/src/content/authors/stanislav-gavrilov.json new file mode 100644 index 000000000..7fa793099 --- /dev/null +++ b/website/src/content/authors/stanislav-gavrilov.json @@ -0,0 +1,5 @@ +{ + "name": "Stanislav Gavrilov", + "linkedin": "https://www.linkedin.com/in/stgavrilov/", + "github": "https://github.com/stillst" +} diff --git a/website/src/content/authors/sven-brodny.json b/website/src/content/authors/sven-brodny.json new file mode 100644 index 000000000..3372743d8 --- /dev/null +++ b/website/src/content/authors/sven-brodny.json @@ -0,0 +1,5 @@ +{ + "name": "Sven Brodny", + "linkedin": "https://www.linkedin.com/in/sven-brodny-0ba603237/", + "github": "https://github.com/svenson95" +} diff --git a/website/src/content/authors/thomas-laforge.json b/website/src/content/authors/thomas-laforge.json new file mode 100644 index 000000000..2bfd96588 --- /dev/null +++ b/website/src/content/authors/thomas-laforge.json @@ -0,0 +1,6 @@ +{ + "name": "Thomas Laforge", + "twitter": "https://twitter.com/laforge_toma", + "linkedin": "https://www.linkedin.com/in/thomas-laforge-2b05a945/", + "github": "https://github.com/tomalaforge" +} diff --git a/website/src/content/authors/timothy-alcaide.json b/website/src/content/authors/timothy-alcaide.json new file mode 100644 index 000000000..a50cd7643 --- /dev/null +++ b/website/src/content/authors/timothy-alcaide.json @@ -0,0 +1,7 @@ +{ + "name": "Timothy Alcaide", + "github": "https://github.com/alcaidio", + "youtube": "https://www.youtube.com/@timothyalcaide", + "twitter": "https://twitter.com/alcaidio", + "linkedin": "https://www.linkedin.com/in/timothyalcaide" +} diff --git a/website/src/content/authors/wandrille-guesdon.json b/website/src/content/authors/wandrille-guesdon.json new file mode 100644 index 000000000..a240cba89 --- /dev/null +++ b/website/src/content/authors/wandrille-guesdon.json @@ -0,0 +1,5 @@ +{ + "name": "Wandrille Guesdon", + "linkedin": "https://www.linkedin.com/in/wandrille-guesdon-53a54684/", + "github": "https://github.com/wandri" +} diff --git a/website/src/content/challenges/angular/1-projection.md b/website/src/content/challenges/angular/1-projection.md new file mode 100644 index 000000000..127530f03 --- /dev/null +++ b/website/src/content/challenges/angular/1-projection.md @@ -0,0 +1,51 @@ +--- +title: 🟢 Projection +description: Challenge 1 is about learning how to project DOM element through components +author: thomas-laforge +contributors: + - tomalaforge + - jdegand + - dmmishchenko + - kabrunko-dev + - svenson95 +challengeNumber: 1 +command: angular-projection +blogLink: https://medium.com/@thomas.laforge/create-a-highly-customizable-component-cc3a9805e4c5 +videoLinks: + - link: https://www.youtube.com/watch?v=npyEyUZxoIw&ab_channel=ArthurLannelucq + alt: Projection video by Arthur Lannelucq + flag: FR + - link: https://www.youtube.com/watch?v=yNrfvu7vTa4 + alt: Projection video by Amos Lucian Isaila + flag: ES +sidebar: + order: 1 +--- + +## Information + +In Angular, content projection is a powerful technique for creating highly customizable components. Utilizing and understanding the concepts of ng-content and ngTemplateOutlet can significantly enhance your ability to create shareable components. + +You can learn all about ng-content [here](https://angular.dev/guide/components/content-projection) from simple projection to more complex ones. + +To learn about ngTemplateOutlet, you can find the API documentation [here](https://angular.dev/api/common/NgTemplateOutlet) along with some basic examples. + +With these two tools in hand, you are now ready to take on the challenge. + +## Statement + +You will start with a fully functional application that includes a dashboard containing a teacher card and a student card. The goal is to implement the city card. + +While the application works, the developer experience is far from being optimal. Every time you need to implement a new card, you have to modify the `card.component.ts`. In real-life projects, this component can be shared among many applications. The goal of the challenge is to create a `CardComponent` that can be customized without any modifications. Once you've created this component, you can begin implementing the `CityCardComponent` and ensure you are not touching the `CardComponent`. + +## Constraints + +- You must refactor the `CardComponent` and `ListItemComponent`. +- The `@for` must be declared and remain inside the `CardComponent`. You might be tempted to move it to the `ParentCardComponent` like `TeacherCardComponent`. +- `CardComponent` should not contain any conditions. +- CSS: try to avoid using `::ng-deep`. Find a better way to handle CSS styling. + +## Bonus Challenges + +- Use the signal API to manage your components state (documentation [here](https://angular.dev/guide/signals)) +- To reference the template, use a directive instead of magic strings ([What is wrong with magic strings?](https://softwareengineering.stackexchange.com/a/365344)) diff --git a/website/src/content/challenges/angular/10-utility-wrapper-pipe.md b/website/src/content/challenges/angular/10-utility-wrapper-pipe.md new file mode 100644 index 000000000..f74bb1612 --- /dev/null +++ b/website/src/content/challenges/angular/10-utility-wrapper-pipe.md @@ -0,0 +1,39 @@ +--- +title: 🔴 Utility Wrapper Pipe +description: Challenge 10 is about creating a pipe to wrap utilities +author: thomas-laforge +contributors: + - tomalaforge + - tomer953 + - svenson95 + - LMFinney +challengeNumber: 10 +command: angular-utility-wrapper-pipe +sidebar: + order: 202 +--- + +## Information + +This is the third of three `@Pipe()` challenges. The goal of this series is to master **pipes** in Angular. + +Pipes are a very powerful way to transform data in your template. The difference between calling a function and a pipe is that pure pipes are memoized. So, they won't be recalculated every change detection cycle if their inputs haven't changed. + +Pipes are designed to be efficient and optimized for performance. They use change detection mechanisms to only recalculate the value if the input changes, to minimize unnecessary calculations and improve rendering performance. + +By default, a pipe is pure. You should be aware that setting `pure` to false is prone to be inefficient, because it increases the amount of rerenders. + +:::note +A **pure** pipe is only called when the value changes.\ +A **impure** pipe is called every change detection cycle. +::: + +There are some useful predefined pipes like the DatePipe, UpperCasePipe and CurrencyPipe. To learn more about pipes in Angular, check the API documentation [here](https://angular.dev/guide/pipes). + +## Statement + +In this exercise, you want to access utils functions. Currently, you cannot access them directly from your template. The goal is to create a specific pipe for this utils file, where you will need to pass the name of the function you want to call and the needed arguments. + +## Constraints + +- Must be strongly typed diff --git a/website/src/content/challenges/angular/13-highly-customizable-css.md b/website/src/content/challenges/angular/13-highly-customizable-css.md new file mode 100644 index 000000000..b08786ea3 --- /dev/null +++ b/website/src/content/challenges/angular/13-highly-customizable-css.md @@ -0,0 +1,24 @@ +--- +title: 🟠 Highly Customizable CSS +description: Challenge 13 is about creating highly customizable CSS styles +author: thomas-laforge +contributors: + - tomalaforge + - tomer953 + - kabrunko-dev + - LMFinney +challengeNumber: 13 +command: angular-highly-customizable-css +sidebar: + order: 104 +--- + +## Information + +Styling is an important aspect of a frontend developer's day job, but it is often underestimated. In Angular applications, I frequently see people using `@Input()` to customize the style of their components. However, `@Input()` should only be used for logic. Other techniques, such as **CSS variables** and **host-context**, should be used for styling. + +In this challenge, you will need to use both CSS variables and `:host-context` to remove all `@Input()` from your code. + +## Constraints + +- In your final submission, your component should not contain any lines of code. All styling should be handled within the decorator _(or external css files if you prefer)_ diff --git a/website/src/content/challenges/angular/16-master-dependency-injection.md b/website/src/content/challenges/angular/16-master-dependency-injection.md new file mode 100644 index 000000000..caf99bd90 --- /dev/null +++ b/website/src/content/challenges/angular/16-master-dependency-injection.md @@ -0,0 +1,30 @@ +--- +title: 🔴 Master Dependency Injection +description: Challenge 16 is about mastering how dependancy injection works +author: thomas-laforge +contributors: + - tomalaforge + - tomer953 + - kabrunko-dev +challengeNumber: 16 +command: angular-master-dependency-injection +sidebar: + order: 203 +--- + +## Information + +To successfully complete this challenge, you will need to have a good understanding of how [Dependency Injection](https://angular.dev/guide/di/dependency-injection) works inside Angular. + +The goal is to provide the `CurrencyService` at the row level, so that each row displays the correct currency. Currently, the `CurrencyService` is only provided at the table level, which results in an error as the same currency is displayed for each row, despite each product having a different currency. + +One way to achieve this is by adding a second argument to the pipe, but this is not allowed for this challenge. + +## Statement + +- Your task is to display the correct currency for each row. + +## Constraints + +- You cannot modify the pipe. +- You cannot wrap the row inside a component, as this will break the layout. diff --git a/website/src/content/challenges/angular/21-anchor-navigation.md b/website/src/content/challenges/angular/21-anchor-navigation.md new file mode 100644 index 000000000..f094023b8 --- /dev/null +++ b/website/src/content/challenges/angular/21-anchor-navigation.md @@ -0,0 +1,21 @@ +--- +title: 🟢 Anchor Navigation +description: Challenge 21 is about navigating inside the page with anchor +author: thomas-laforge +contributors: + - tomalaforge + - tomer953 +challengeNumber: 21 +command: angular-anchor-navigation +sidebar: + order: 4 +--- + +## Information + +You begin with an application that has basic navigation and anchor navigation in the `HomeComponent`. However, using `href` recreates the path each time and refreshes the page. + +## Statement + +- Your task is to refactor this application to use the built-in navigation tool to better fit within the Angular Framework. You can explore the router, but it's better to stay within the template and use the `RouterLink` directive. +- To improve the user experience, add smooth scrolling. diff --git a/website/src/content/challenges/angular/22-router-input.md b/website/src/content/challenges/angular/22-router-input.md new file mode 100644 index 000000000..1a5127e89 --- /dev/null +++ b/website/src/content/challenges/angular/22-router-input.md @@ -0,0 +1,31 @@ +--- +title: 🟢 @RouterInput() +description: Challenge 22 is about using the @Input decorator to retrieve router params. +author: thomas-laforge +contributors: + - tomalaforge + - tomer953 + - svenson95 + - LMFinney +challengeNumber: 22 +command: angular-router-input +blogLink: https://medium.com/ngconf/accessing-route-params-in-angular-1f8e12770617 +sidebar: + order: 5 +--- + +## Information + +In this application, we retrieve three pieces of information inside our `TestComponent` provided by the router: + +- We want to retrieve `testId` found inside the params of the URL. +- We want to obtain `user` located within the query parameters of the URL. +- We want to access `permission` set inside the `data` object of the route. + +In Angular versions 15 or earlier, we use `ActivatedRoute` to obtain all this information and receive them through observables to listen for URL changes. + +In version 16, Angular introduced a new `Input` that can listen to route data. You can read more about it [here](https://medium.com/ngconf/accessing-route-params-in-angular-1f8e12770617). + +## Statement + +The goal of this exercise is to refactor the code to use the new `RouterInput` strategy. diff --git a/website/src/content/challenges/angular/31-module-to-standalone.md b/website/src/content/challenges/angular/31-module-to-standalone.md new file mode 100644 index 000000000..93b0850ef --- /dev/null +++ b/website/src/content/challenges/angular/31-module-to-standalone.md @@ -0,0 +1,29 @@ +--- +title: 🟢 Module to Standalone +description: Challenge 31 is about migrating a module based application to a standalone application. +author: thomas-laforge +contributors: + - tomalaforge +challengeNumber: 31 +command: angular-module-to-standalone +sidebar: + order: 6 +--- + +## Information + +In v14, standalone components were released and made stable in v15. If you haven't played with them, it's never too late. You can try them out in this challenge. + +Moreover, the goal is to see how **Nx** and **standalone components** work together, and experience the process of decoupling your app with Nx lib and standalone components. + +Finally, standalone components are very simple to understand, but **routing/lazy-loaded components** can be a bit harder to grasp. This challenge will allow you to manipulate components at different levels of nesting and work with lazy loaded routes. + +After completing this challenge, standalone components will no longer hold any secrets for you. + +## Statement + +The goal of this challenge is to migrate your application from module based components to standalone components. + +## Note + +You can also test the [Angular schematic](https://angular.dev/reference/migrations/standalone) to migrate NgModule to Standalone components. _(Since we are using nx, start your command with nx instead of ng)_ diff --git a/website/src/content/challenges/angular/32-change-detection-bug.md b/website/src/content/challenges/angular/32-change-detection-bug.md new file mode 100644 index 000000000..633d41721 --- /dev/null +++ b/website/src/content/challenges/angular/32-change-detection-bug.md @@ -0,0 +1,46 @@ +--- +title: 🟠 Change Detection Bug +description: Challenge 32 is about debugging an application that has issue when change detection is triggered +author: thomas-laforge +contributors: + - tomalaforge + - tomer953 + - jdegand + - LMFinney +challengeNumber: 32 +command: angular-change-detection-bug +blogLink: https://medium.com/ngconf/function-calls-inside-template-are-dangerous-15f9822a6629 +sidebar: + order: 105 +--- + +:::note +This challenge is inspired by a real-life example that I simplified to create this nice challenge. +::: + +## Information + +In this small application, we have a navigation menu to route our application to either `BarComponent` or `FooComponent`. However, our application is not loading and no errors are displayed inside the console. + +## Statement + +The goal of the challenge is to debug this application and make it work. + +:::note +Without knowing the exact reason for the issue, you can "fix" the error and get the program to function. One such approach would be to memoize `getMenu`. The application might work again, but make sure you really understand the problem and its consequences. Making it work isn't always enough; fixing this bug in the wrong way can cause a loss of performance or lead to other problems later on. +::: + +## Hints + +
+ Hint 1 + + If you comment out `routerLinkActive="isSelected"` inside `NavigationComponent`, the application loads correctly. +
+ +
+ Hint 2 + +If you open the [`RouterLinkActive` source code](https://github.com/angular/angular/blob/main/packages/router/src/directives/router_link_active.ts) and go to **line 196**, Angular is calling `this.cdr.markForCheck` inside a microTask, which triggers a new CD cycle. If you comment out this line, the application loads again, however, the bug should not be fixed by changing the Angular source code. 😅😯 + +
diff --git a/website/src/content/challenges/angular/33-decoupling-components.md b/website/src/content/challenges/angular/33-decoupling-components.md new file mode 100644 index 000000000..2b900c7a6 --- /dev/null +++ b/website/src/content/challenges/angular/33-decoupling-components.md @@ -0,0 +1,35 @@ +--- +title: 🟠 Decoupling Components +description: Challenge 33 is about decoupling two strongly coupled components using Injection Token +author: thomas-laforge +contributors: + - tomalaforge + - jdegand + - LMFinney +challengeNumber: 33 +command: angular-decoupling-components +sidebar: + order: 106 +--- + +> Big thanks to **Robin Goetz** and his [Spartan Project](https://github.com/goetzrobin/spartan). +> This challenge was proposed by Robin and is strongly inspired by his project. + +## Information + +The goal of this challenge is to separate the behavior of a component from its style. For the purpose of this challenge, we will be working on a button element. When we click on it, we will toggle a _disabled_ property which will change the style of the element. This is quite useless in real life but the challenge aims to demonstrate a useful concept. + +The behavior of the component (referred to as the _brain_ in the Spartan stack) is located in the brain library. The styling part (referred to as the _helmet_) is located inside the helmet library. Both libraries cannot depend on each other because we want to be able to publish them separately. To help us address the issue, we are using the Nx `enforce-module-boundaries` eslint rule. You can find more details [here](https://nx.dev/core-features/enforce-module-boundaries). + +However, the button's helmet needs to access the state of the component to style the button differently based on its state. As mentioned above, we cannot import the `BtnDisabledDirective` directly into the helmet library as done currently. If you go to [`BtnHelmetDirective`](../../libs/decoupling/helmet/src/lib/btn-style.directive.ts), you will encounter a linting error. **A project tagged with `type:hlm` can only depend on libs tagged with `type:core`**. + +## Statement + +The goal of this challenge is to find a way to decouple both Directives. + +### Hint + +
+ Hint 1 + Carefully read the title of the challenge 😇 +
diff --git a/website/src/content/challenges/angular/39-injection-token.md b/website/src/content/challenges/angular/39-injection-token.md new file mode 100644 index 000000000..4e2f3119d --- /dev/null +++ b/website/src/content/challenges/angular/39-injection-token.md @@ -0,0 +1,38 @@ +--- +title: 🟠 InjectionToken +description: Challenge 39 is about learning the power of dependency injection +author: thomas-laforge +contributors: + - tomalaforge + - jdegand + - LMFinney +challengeNumber: 39 +command: angular-injection-token +videoLinks: + - link: https://www.youtube.com/watch?v=ntggdQycFyc + alt: Injection Token by Arthur Lannelucq + flag: FR +sidebar: + order: 118 +--- + +## Information + +In this small application, we start with a `VideoComponent` containing a **1-second** timer. The development team decided to use a global constant to store the timer value: `DEFAULT_TIMER`. However, a few weeks later, the product team wants to add a new screen for phone calls called `PhoneComponent`, and we want to reuse the `TimerComponent`. However, the product team wants a timer of **2 seconds**. How can we achieve this? + +## Statement + +Currently, the timer is still 1 second for the `PhoneComponent`. The goal of this challenge is to change the timer value to 2 seconds for the `PhoneComponent`. + +## Constraints + +The use of `@Input` is forbidden. This example is basic, and using `@Input` could be a good option, but in more complex applications, the component we need to update can be deeply nested, making the use of `@Input` a really bad design. + +## Hint + +
+ Hint 1 + +Looking at this [blog post](https://itnext.io/stop-being-scared-of-injectiontokens-ab22f72f0fe9) can be of great help. + +
diff --git a/website/src/content/challenges/angular/4-typed-context-outlet.md b/website/src/content/challenges/angular/4-typed-context-outlet.md new file mode 100644 index 000000000..86d43e5f1 --- /dev/null +++ b/website/src/content/challenges/angular/4-typed-context-outlet.md @@ -0,0 +1,46 @@ +--- +title: 🔴 Typed ContextOutlet +description: Challenge 4 is about strongly typing ngContextOutlet directives +author: thomas-laforge +contributors: + - tomalaforge + - tomer953 + - svenson95 + - jdegand + - LMFinney +challengeNumber: 4 +command: angular-typed-context-outlet +blogLink: https://medium.com/@thomas.laforge/ngtemplateoutlet-type-checking-5d2dcb07a2c6 +sidebar: + order: 201 +--- + +## Information + +You can improve template type checking for custom directives by adding template guard properties to your directive definition. Angular offers the static function [`ngTemplateContextGuard`](https://angular.dev/guide/directives/structural-directives#improving-template-type-checking-for-custom-directives) to strongly type structural directives. + +However, the context of **NgTemplateOutlet** type is **Object**. But with the help of the above guard, we can improve that behavior. + +## Statement + +In this exercise, we want to learn how to strongly type our `ng-template` in our `AppComponent`. + +This exercise has two levels of complexity. + +### Level 1: Known Interface + +Currently, we have the following piece of code. + +![Unknown Person](../../../../assets/4/unknown-person.png 'Unknown Person') + +As we can see, `name` is of type `any`. We want to infer the correct type using the custom directive `PersonDirective`. + +### Level 2: Generic Interface + +Currently, we have the following piece of code. + +![Unknown Student](../../../../assets/4/unknown-student.png 'Unknown Student') + +As we can see, `student` is of type `any`. We want to infer the correct type using the custom directive `ListDirective`. + +But in this part, we want to pass a list of **any object** to `ListComponent`. And we still want the correct type to be inferred. diff --git a/website/src/content/challenges/angular/44-view-transition.md b/website/src/content/challenges/angular/44-view-transition.md new file mode 100644 index 000000000..74d0a88bb --- /dev/null +++ b/website/src/content/challenges/angular/44-view-transition.md @@ -0,0 +1,84 @@ +--- +title: 🔴 View Transition +description: Challenge 44 is about learning the new view transition animation API +author: thomas-laforge +contributors: + - tomalaforge + - jdegand + - LMFinney +challengeNumber: 44 +command: angular-view-transition +sidebar: + order: 208 +--- + +## Information + +This is the second of two animation challenges. The goal of this series is to master animations in Angular. + +The View Transition API is a brand-new API that provides a set of features that allow developers to control and manipulate the transitions and animations between views within an application. +It plays a pivotal role in enhancing the user experience (UX), bringing applications to life with engaging and captivating transitions to guide users through different pages or sections of the app. + +The goal of this challenge is to learn about and manipulate all types of transitions proposed by the API. + +To use the API, Angular provides a function `withViewTransitions()` that needs to be injected inside the router config. + +I would advise you to read the [Chrome documentation](https://developer.chrome.com/docs/web-platform/view-transitions). You will learn everything that is necessary to successfully complete the challenge. + +Here, however, is a short summary: +Firstly, each target DOM element has two states: an `old` one when the element is leaving the page, and a `new` one when it's entering the page: + +```css +::view-transition-old(root) { +/ / animation +} + +::view-transition-new(root) { +/ / animation +} +``` + +In order to target a specific element, you must add the selector `view-transition-name` to a CSS class on the DOM node, as shown below: + +```css +.specific-element { + view-transition-name: specific-element; +} +``` + +This allows you to create an animation for this element only. + +Lastly, if the same element is present in both views, you can automate the transition by assigning the same **transition name**. + +:::danger +Remember, you can have only ONE UNIQUE `view-transition-name` per page. +::: + +## Statement + +The goal of this challenge is to transition from the state shown in this video: + + + +To the final state shown in the following video: + + + +Observe the following: + +- The header slides in and out. +- Each element smoothly transitions to its new location. + +### Level 1 + +Focus only on the first thumbnail and create a seamless and pleasing transition. + +### Level 2 + +Create the same appealing transition for all thumbnails without duplicating the `view-transition-name`. Note that this page has only 3 thumbnails; in a real-life scenario, you could have significantly more. + +### Level 3 + +Shift to the correct Y location when navigating back and forth. diff --git a/website/src/content/challenges/angular/45-react-in-angular.md b/website/src/content/challenges/angular/45-react-in-angular.md new file mode 100644 index 000000000..6feea1c60 --- /dev/null +++ b/website/src/content/challenges/angular/45-react-in-angular.md @@ -0,0 +1,81 @@ +--- +title: 🔴 React in angular +description: Challenge 45 is about learning how to benefit from the numerous libraries in React +author: wandrille-guesdon +contributors: + - wandri + - tomalaforge + - jdegand + - LMFinney +challengeNumber: 45 +command: angular-react-in-angular +sidebar: + order: 209 +--- + +The goal of this challenge is to use a React component inside an Angular application. + +Many components are available in React, and it can be interesting to use them in an Angular application. The goal is to create a React component and use it in an Angular application. + +## Information + +In this challenge, we have a simple application and a React component `ReactPost` in `app/react` to illustrate a React component from a library. + +## Statement + +- Your task is to display the posts with the React component `ReactPost`. +- When you select a post, the post should be highlighted. + +In order to play with the React component, you should start by installing the React dependencies. + +```bash +pnpm add react react-dom +pnpm add -D @types/react @types/react-dom +``` + +## Constraints + +- Do not transform the React component into an Angular component. The React component is pretty simple and can be written with ease in Angular. But **the goal is to use the React component**. + +### Hint + +
+ Hint 1 - Configuration + Allow the React files in tsconfig.json + +``` +{ +... +"compilerOptions": { + ... + "jsx": "react" +}, +... +} +``` + +
+ +
+ Hint 2 - Initialization + Create a React root with `createRoot(...)` +
+ +
+ Hint 3 - Display + To render the component, it should look like this: + + ``` + .render( + + ... + + ) + ``` + +
+ +
+ Hint 4 - Design + Do not forget to allow the React file in Tailwind. +
diff --git a/website/src/content/challenges/angular/46-simple-animations.md b/website/src/content/challenges/angular/46-simple-animations.md new file mode 100644 index 000000000..aa8887977 --- /dev/null +++ b/website/src/content/challenges/angular/46-simple-animations.md @@ -0,0 +1,49 @@ +--- +title: 🟢 Simple Animations +description: Challenge 46 is about learning Angular's integrated animation API +author: sven-brodny +contributors: + - svenson95 + - LMFinney +challengeNumber: 46 +command: angular-simple-animations +sidebar: + order: 17 +--- + +## Information + +This is the first of two animation challenges. The goal of this series is to master animations in Angular. + +Well-designed animations can make your application more fun and straightforward to use, but they aren't just cosmetic. Animations can improve your application and user experience in a number of ways: + +- Without animations, web page transitions can seem abrupt and jarring. +- Motion greatly enhances the user experience, so animations give users a chance to detect the application's response to their actions. +- Good animations intuitively call the user's attention to where it is needed. + +I would recommend you read the [official documentation](https://angular.dev/guide/animations). You will learn everything that is necessary to successfully complete the challenge. + +Otherwise, look at this [working example](https://svenson95.github.io/ng-xmp-animations/) and [git repo](https://github.com/svenson95/ng-xmp-animations) to get inspired. + +## Statement + +The goal of this challenge is to add animations, they should run when the user arrives on the page or reload the page. + +## Constraints + +- Don't use any CSS and utilize Angular's integrated `@angular/animations` API. +- Don't trigger the animations with a button like in the examples, rather when the user enter or reload the page. + +### Level 1 + +Add a fading or moving animation for the paragraphs on the left side. + + + +### Level 2 + +Add a stagger animation for the list on the right side. + + diff --git a/website/src/content/challenges/angular/5-crud-application.md b/website/src/content/challenges/angular/5-crud-application.md new file mode 100644 index 000000000..1e439150a --- /dev/null +++ b/website/src/content/challenges/angular/5-crud-application.md @@ -0,0 +1,56 @@ +--- +title: 🟢 Crud application +description: Challenge 5 is about refactoring a crud application +author: thomas-laforge +contributors: + - tomalaforge + - tomer953 + - svenson95 + - jdegand + - LMFinney +challengeNumber: 5 +command: angular-crud-application +sidebar: + order: 2 +--- + +## Information + +Communicating and having a global/local state in sync with your backend is the heart of any application. You will need to master these following best practises to build strong and reliable Angular Applications. + +## Statement + +In this exercise, you have a small CRUD application, which get a list of TODOS, update and delete some todos. + +Currently, we have a working example but filled with lots of bad practices. + +### Step 1: refactor with best practices + +What you will need to do: + +- Avoid **any** as a type. Using Interface to leverage Typescript type system prevent errors +- Use a **separate service** for all your http calls and use a **Signal** for your todoList +- Don't **mutate** data + +```typescript +// Avoid this +this.todos[todoUpdated.id - 1] = todoUpdated; + +// Prefer something like this, but need to be improved because we still want the same order +this.todos = [...this.todos.filter((t) => t.id !== todoUpdated.id), todoUpdated]; +``` + +### Step 2: Improve + +- Add a **Delete** button: _Doc of fake API_ +- Handle **errors** correctly. _(Globally)_ +- Add a Global **loading** indicator. _You can use MatProgressSpinnerModule_ + +### Step 3: Maintainability!! add some test + +- Add 2/3 tests + +### Step 4: Awesomeness!!! master your state. + +- Use the **component store of ngrx**, **ngrx/store**, **rxAngular**, **tanstack-query** or **ngrx/signal-store** as a local state of your component. +- Have a **localized** Loading/Error indicator, e.g. only on the Todo being processed and **disable** all buttons of the processed Todo. _(Hint: you will need to create an ItemComponent)_ diff --git a/website/src/content/challenges/angular/52-lazy-load-component.md b/website/src/content/challenges/angular/52-lazy-load-component.md new file mode 100644 index 000000000..f71c57d48 --- /dev/null +++ b/website/src/content/challenges/angular/52-lazy-load-component.md @@ -0,0 +1,48 @@ +--- +title: 🟢 Lazy Load a Component +description: Challenge 52 is about understanding how to lazy load a component in Angular. +author: lance-finney +contributors: + - LMFinney +challengeNumber: 52 +command: angular-lazy-load-component +sidebar: + order: 21 +--- + +## Information + +Angular has long had route-based lazy loading for entire modules, but lazy loading individual components was much more complicated. This challenge is about understanding how to lazy load a component easily with a feature that was introduced in Angular 17. + +## Statement + +This is a simple application that can display a `TopComponent` that we are pretending would slow the application down if it were part of the initial bundle (it actually contains just a bit of text, but we are pretending). + +The current implementation shows a `PlaceholderComponent` until the user clicks a button to display the `TopComponent`. However, even though the `TopComponent` isn't visible until the button is clicked, it is still loaded as part of the initial bundle. + +Use a new feature of Angular 17 to lazy load the `TopComponent` so that it is visible _and loaded_ when the user clicks the button to display it. + +When you are done, you should be able to see the `TopComponent` being loaded into the browser in a separate bundle when you click the button to display it. In Chrome, you should see this by opening the DevTools, going to the Network tab, and then clicking the button to display the `TopComponent`. + +## Hints + +
+ Hint 1 + +You should be able to remove the `topLoaded` signal when you are done. + +
+ +
+ Hint 2 + +The new Angular feature will hide the `TopComponent` from view, but it will still be loaded in the initial bundle unless you change how both `AppComponent` and `TopComponent` are defined in their decorators. This challenge start with the old `NgModule`-based architecture, but you will need to change it to use the new feature. + +
+ +
+ Hint 3 + +The new feature is [Deferrable Views](https://angular.dev/guide/defer), which provides several different triggers. One of them is ideal for this challenge. + +
diff --git a/website/src/content/challenges/angular/55-back-button-navigation.md b/website/src/content/challenges/angular/55-back-button-navigation.md new file mode 100644 index 000000000..3ad3f0568 --- /dev/null +++ b/website/src/content/challenges/angular/55-back-button-navigation.md @@ -0,0 +1,56 @@ +--- +title: 🟠 Back-Button-Navigation +description: Challenge 55 is about overriding browser back button navigation +author: ioannis-tsironis +contributors: + - tsironis13 +challengeNumber: 55 +command: angular-back-button-navigation +sidebar: + order: 123 +--- + +## Information + +The goal of this challenge is to override the default behavior of the browser back button in Angular applications. + +We have been prompted by the team's PO to provide a specific implementation when displaying dialog components and +native browser back button is clicked. Currently, Angular's default behavior when the native back button is clicked is +to remove the current history entry and go back to the previous route. + +The initial state of the application is as follows: +When any dialog is displayed and the back button is clicked, any opened dialog is closed, and the app redirects to the previous page. + +This behavior should be changed according to these requirements: + +1. The requirements dictate a few different behaviors depending on which type of dialog is currently visible. +2. For example, we have a simple + action dialog that should be closed on the back button click, but we **MUST** remain on the current visited route (/simple-action). +3. In addition, we have sensitive dialogs like the one on the '/sensitive-action' page that must open a confirmation dialog on a back button click. +4. The confirmation dialog in combination with the back button click should behave like the simple dialog action one; the confirmation dialog must be closed, and we must remain on the '/sensitive-action' page with the initial dialog still visible. + +## Statement + +Provide an abstract, generic approach to handling any type of dialog behavior when the native browser back button is clicked. +Some Typescript design patterns, in combination with the Angular features, could be utilized to support this kind of infrastructure. + +## Constraints + +- The implementation must not be static depending on the 2 dialog type behaviors presenting on this challenge but also scalable to support any + new behavior requirements may arise in the future. + +### Hint + +
+ Hint 1 + +Use the `CanDeactivate` functional guard + +
+ +
+ Hint 2 + +Material Design dialog documentation can be found [here](https://material.angular.io/components/dialog/overview) + +
diff --git a/website/src/content/challenges/angular/57-content-projection-default.md b/website/src/content/challenges/angular/57-content-projection-default.md new file mode 100644 index 000000000..68bc9454a --- /dev/null +++ b/website/src/content/challenges/angular/57-content-projection-default.md @@ -0,0 +1,36 @@ +--- +title: 🟢 Content Projection Default +description: Challenge 57 is about content projection default container +author: thomas-laforge +contributors: + - tomalaforge +challengeNumber: 57 +command: angular-content-projection-default +sidebar: + order: 22 +--- + +## Information + +Content projection in Angular allows developers to create flexible and customizable components by passing content from the parent component to the child component dynamically using ``. + +Currently, we have a shared component that relies on `input` properties to receive and display data. However, we want to improve its flexibility by replacing all `inputs` with content projection while maintaining the same appearance and behavior. + +## Statement + +Your task is to refactor the existing shared component to remove all `input` properties and instead use Angular’s `` for content projection. After your modifications, the application should look and function exactly as before, but without any `input`. + +### Steps to complete: + +- Identify all `input` properties in the shared component. +- Remove them and replace them with appropriate `` containers. +- Adjust the parent component to pass the necessary content using content projection instead of binding to `input`s. +- Ensure that the application still displays the same UI and behavior after the changes. + +## Constraints + +- You must not use any `input` in the shared component. +- The application’s UI and functionality must remain unchanged after the refactoring. +- You must use `` for content projection. +- Do not introduce additional properties or services to pass data. +- Ensure that projected content is correctly styled and positioned as before. diff --git a/website/src/content/challenges/angular/58-content-projection-condition.md b/website/src/content/challenges/angular/58-content-projection-condition.md new file mode 100644 index 000000000..7dead94de --- /dev/null +++ b/website/src/content/challenges/angular/58-content-projection-condition.md @@ -0,0 +1,38 @@ +--- +title: 🟠 Content Projection Condition +description: Challenge 58 is about conditional content projection in Angular +author: thomas-laforge +contributors: + - tomalaforge +challengeNumber: 58 +command: angular-content-projection-condition +sidebar: + order: 124 +--- + +## Information + +Content projection in Angular allows you to create flexible and reusable components by dynamically inserting content from a parent component using ``. However, debugging content projection issues can sometimes be tricky. + +In this challenge, we have a `CardComponent` that supports a small mode, which conditionally changes how the projected content is displayed. However, there is a bug: when `small` is `false`, the card does not render properly. + +Your task is to identify and fix this issue without adding `inputs` while ensuring that the intended behavior remains unchanged. + +## Statement + +Your goal is to fix the issue where the `CardComponent` does not render when `small` is `false`. + +## Steps to complete: + +- Analyze how the `small` property is used inside the template. +- Identify why the content is not displayed when `small` is `false`. +- Modify the component to ensure that both cases (`small` = `true` and `small` = `false`) work as expected, while keeping the same structure and behavior. +- Ensure that no new `input` properties are introduced in the component. + +## Constraints + +- You must not add any new `input` properties. +- The expected UI and behavior must remain unchanged. +- The `@if` directive must be correctly handled to ensure content projection works. +- Do not introduce additional services or state management solutions. +- The fix should be minimal and focused on resolving the rendering issue. diff --git a/website/src/content/challenges/angular/59-content-projection-defer.md b/website/src/content/challenges/angular/59-content-projection-defer.md new file mode 100644 index 000000000..32b4e0114 --- /dev/null +++ b/website/src/content/challenges/angular/59-content-projection-defer.md @@ -0,0 +1,27 @@ +--- +title: 🔴 content-projection-defer +description: Challenge 59 is about deferring fetching data +author: thomas-laforge +contributors: + - tomalaforge +challengeNumber: 59 +command: angular-content-projection-defer +sidebar: + order: 212 +--- + +# Challenge: Deferred Loading for Expandable Card Content + +## Information + +Within the application, specifically on page2, there is an expandable card component. This component consists of a permanently visible title and a content section that is hidden until the card is expanded. This content section is populated with a list of posts retrieved via a backend API call. The current implementation presents an issue: upon navigating to page2, although the card defaults to a collapsed state, the API call to load the list of posts is triggered immediately during the page load process, before the user has chosen to expand the card and view the content. + +## Statement + +The goal of this challenge is to optimize the data loading behavior for the expandable card component on `page2`. Modify the implementation so that the backend API call to fetch the list of posts is **deferred**. The data should **only** be fetched when the user explicitly interacts with the card to **expand** it. No data fetching for the post list should occur upon the initial load of `page2` while the card remains collapsed. + +## Constraints + +- The expandable card must retain its core functionality: display a title, be initially collapsed (on `page2` load), and expand/collapse upon user interaction. +- When the card is expanded, the list of posts must be fetched from the backend and displayed within the content area. +- The data fetching mechanism itself (e.g., the API endpoint) should not be changed, only _when_ it is triggered. diff --git a/website/src/content/challenges/angular/6-structural-directive.md b/website/src/content/challenges/angular/6-structural-directive.md new file mode 100644 index 000000000..48cae6f56 --- /dev/null +++ b/website/src/content/challenges/angular/6-structural-directive.md @@ -0,0 +1,63 @@ +--- +title: 🟠 Structural Directive +description: Challenge 6 is about creating a structural directive to handle permissions +author: thomas-laforge +contributors: + - tomalaforge + - tomer953 + - kabrunko-dev + - svenson95 +challengeNumber: 6 +command: angular-structural-directive +blogLink: https://medium.com/@thomas.laforge/create-a-custom-structural-directive-to-manage-permissions-like-a-pro-11a1acad30ad +sidebar: + order: 102 +--- + +## Information + +Structural directives are directives which change the DOM layout by adding and removing DOM elements. This is an important concept you'll need to improve your angular skills and knowledge. This will be the first part of this challenge. For more information check out the [official documentation](https://angular.dev/guide/directives/structural-directives). + +Guards like `CanActivate` or `CanMatch` are also very important, since you'll need it in the most application's you build. If you're not very familiar with route guards, check out this two articles. + +- [Everything you need to know about route Guard in Angular](https://itnext.io/everything-you-need-to-know-about-route-guard-in-angular-697a062d3198) +- [Create a route Guard to manage permissions](https://medium.com/@thomas.laforge/create-a-route-guard-to-manage-permissions-26f16cc9a1ca) + +## Statement + +In `LoginComponent` you'll find 6 buttons corresponding to 6 different user's role. + +- Admin +- Manager +- Reader +- Writer +- Reader and Writer +- Client +- Everyone + +## Step 1 + +In `InformationComponent` you'll need to display the correct piece of information for each role using a structural directive. + +### Constraints + +- No `ngIf` or `@if` inside `InformationComponent`. +- Importing the store inside `InformationComponent` is not allowed. + +You should end up with something like below: + +```html +
Info for Role1
+``` + +```html +
Info for Role1 and Role2
+``` + +```html +
Info Only for superadmin
+``` + +## Step 2 + +In `Routes.ts` you should route all users to the correct `DashboardComponent` using `CanMatch` guard. diff --git a/website/src/content/challenges/angular/60-async-redirect.md b/website/src/content/challenges/angular/60-async-redirect.md new file mode 100644 index 000000000..dcaabfd2b --- /dev/null +++ b/website/src/content/challenges/angular/60-async-redirect.md @@ -0,0 +1,22 @@ +--- +title: 🟢 async-redirect +description: Challenge 60 is about using the new `redirectTo` function in Angular Router to modernize navigation logic. +author: thomas-laforge +contributors: + - tomalaforge +challengeNumber: 60 +command: angular-async-redirect +sidebar: + order: 23 +--- + +## Statement + +In this challenge, you are working with an Angular application that currently uses a custom `navigate` method in `dashboard.ts` to handle route changes. With the introduction of the new `redirectTo` function in the Angular Router in v20, the goal is to modernize the codebase by removing the old `navigate` method and refactoring the application to use `redirectTo` for all redirection logic. + +Your task is to: + +- Locate and delete the `navigate` method in `dashboard.ts`. +- Refactor the application to use the new `redirectTo` function from the Angular Router wherever navigation is required. + +This will help ensure the application leverages the latest Angular routing features and maintains best practices for navigation and redirection. diff --git a/website/src/content/challenges/angular/8-pure-pipe.md b/website/src/content/challenges/angular/8-pure-pipe.md new file mode 100644 index 000000000..c981cda55 --- /dev/null +++ b/website/src/content/challenges/angular/8-pure-pipe.md @@ -0,0 +1,41 @@ +--- +title: 🟢 Pure Pipe +description: Challenge 8 is about creating a pure pipe +author: thomas-laforge +contributors: + - tomalaforge + - tomer953 + - kabrunko-dev + - svenson95 + - LMFinney +challengeNumber: 8 +command: angular-pure-pipe +blogLink: https://medium.com/ngconf/deep-dive-into-angular-pipes-c040588cd15d +sidebar: + order: 3 +--- + +## Information + +This is the first of three `@Pipe()` challenges. The goal of this series is to master **pipes** in Angular. + +Pipes are a very powerful way to transform data in your template. The difference between calling a function and a pipe is that pure pipes are memoized. So, they won't be recalculated every change detection cycle if their inputs haven't changed. + +Pipes are designed to be efficient and optimized for performance. They use change detection mechanisms to only recalculate the value if the input changes, to minimize unnecessary calculations and improve rendering performance. + +By default, a pipe is pure. You should be aware that setting `pure` to false is prone to be inefficient, because it increases the amount of rerenders. + +:::note +A **pure** pipe is only called when the value changes.\ +A **impure** pipe is called every change detection cycle. +::: + +There are some useful predefined pipes like the DatePipe, UpperCasePipe and CurrencyPipe. To learn more about pipes in Angular, check the API documentation [here](https://angular.dev/guide/pipes). + +## Statement + +In this exercise, you need to refactor a transform function inside a component, which is called inside your template. The goal is to convert this function to a pipe. + +## Constraints + +- Must be strongly typed diff --git a/website/src/content/challenges/angular/9-wrap-function-pipe.md b/website/src/content/challenges/angular/9-wrap-function-pipe.md new file mode 100644 index 000000000..5213fb079 --- /dev/null +++ b/website/src/content/challenges/angular/9-wrap-function-pipe.md @@ -0,0 +1,42 @@ +--- +title: 🟠 Wrap Function Pipe +description: Challenge 9 is about creating a pipe to wrap component fonctions +author: thomas-laforge +contributors: + - tomalaforge + - tomer953 + - kabrunko-dev + - svenson95 + - LMFinney +challengeNumber: 9 +command: angular-wrap-function-pipe +blogLink: https://medium.com/ngconf/boost-your-apps-performance-by-wrapping-your-functions-inside-a-pipe-7e889a901d1d +sidebar: + order: 103 +--- + +## Information + +This is the second of three `@Pipe()` challenges. The goal of this series is to master **pipes** in Angular. + +Pipes are a very powerful way to transform data in your template. The difference between calling a function and a pipe is that pure pipes are memoized. So, they won't be recalculated every change detection cycle if their inputs haven't changed. + +Pipes are designed to be efficient and optimized for performance. They use change detection mechanisms to only recalculate the value if the input changes, to minimize unnecessary calculations and improve rendering performance. + +By default, a pipe is pure. You should be aware that setting `pure` to false is prone to be inefficient, because it increases the amount of rerenders. + +:::note +A **pure** pipe is only called when the value changes.\ +A **impure** pipe is called every change detection cycle. +::: + +There are some useful predefined pipes like the DatePipe, UpperCasePipe and CurrencyPipe. To learn more about pipes in Angular, check the API documentation [here](https://angular.dev/guide/pipes). + +## Statement + +In this exercise, you are calling multiple functions inside your template. You can create a specific pipe for each of the functions, but this will be too cumbersome. +The goal is to create a `wrapFn` pipe to wrap your callback function through a pipe. Your function MUST remain inside your component. **`WrapFn` must be highly reusable.** + +## Constraints + +- Must be strongly typed diff --git a/website/src/content/challenges/forms/41-control-value-accessor.md b/website/src/content/challenges/forms/41-control-value-accessor.md new file mode 100644 index 000000000..738daf1e1 --- /dev/null +++ b/website/src/content/challenges/forms/41-control-value-accessor.md @@ -0,0 +1,43 @@ +--- +title: 🟠 Control Value Accessor +description: Challenge 41 is about creating a custom form control that implements Control Value Accessor interface. +author: stanislav-gavrilov +contributors: + - stillst +challengeNumber: 41 +command: forms-control-value-accessor +sidebar: + order: 101 +--- + +## Information + +In this challenge, the goal is to create a custom form field that is using the Form API of Angular `ControlValueAccessor`. You can find the documentation [here](https://angular.dev/api/forms/ControlValueAccessor). This interface is crucial for creating custom form controls that can interact seamlessly with Angular's forms API. + +## Statement + +The primary goal is to use control in the `feedbackForm` to eliminate the need for using `@Output` to retrieve the value and inject it into the `FormGroup`. +Additionally, you are required to integrate validation for the new control to ensure that rating data exist. (The form submission button should be disabled if the form is invalid). + +Currently, rating is coded this way: + +```html + +``` + +```ts +rating: string | null = null; + +onFormSubmit(): void { + this.feedBackSubmit.emit({ + ...this.feedbackForm.value, + rating: this.rating, // not inside the FormGroup and no validation + }); +} +``` + +The goal is to include rating into the `FormGroup` + +```html + +``` diff --git a/website/src/content/challenges/forms/48-avoid-losing-form-data.md b/website/src/content/challenges/forms/48-avoid-losing-form-data.md new file mode 100644 index 000000000..b17e60e76 --- /dev/null +++ b/website/src/content/challenges/forms/48-avoid-losing-form-data.md @@ -0,0 +1,40 @@ +--- +title: 🟠 Avoid losing form data +description: Challenge 48 is about Bob 🧙‍♂️ the product owner, he wants to develop a new feature in response to customer complaints about losing form input information. +author: timothy-alcaide +contributors: + - alcaidio + - svenson95 + - LMFinney +challengeNumber: 48 +command: forms-avoid-losing-form-data +sidebar: + order: 121 +--- + +## Context + +As a member of the development team, you need to address a specific request from the product owner, 🧙‍♂️ Bob. He wants to develop a new feature in response to customer complaints about losing form input information. + +## User Story + +Here's the feature expressed as a user story with a functional expectation: + +> As a user, I would like to have an alert dialog box that appears when +> I attempt to navigate away from the page, after I have started +> entering information into the form. + +## Acceptance Criteria + +1. If one of the form fields is not empty and the user tries to navigate to a different route or page, or wants to reload the page, show an alert dialog to _avoid losing form data_. +2. The content of `dialog.component.ts` must be used for your alert. +3. The appearance and behavior of the alert dialog box must comply with W3C conventions, see [alert dialog pattern](https://www.w3.org/WAI/ARIA/apg/patterns/alertdialog/). +4. Maximize the use of the new concepts and syntax in the latest version of Angular. + +
+ Tips 🤫 (if you really need it and after careful consideration) +
    +
  • Use the Material CDK Dialog or Overlay - don't forget to add @import '@angular/cdk/overlay-prebuilt.css' in styles.css
  • +
  • Use the CanDeactivate guard in the new functional approach.
  • +
+
diff --git a/website/src/content/challenges/forms/61-simplest-signal-form.md b/website/src/content/challenges/forms/61-simplest-signal-form.md new file mode 100644 index 000000000..f2fda4208 --- /dev/null +++ b/website/src/content/challenges/forms/61-simplest-signal-form.md @@ -0,0 +1,58 @@ +--- +title: 🟢 Simplest Signal Form +description: Challenge 61 is about migrating from Reactive Forms to the new Signal-based Forms API in Angular +author: thomas-laforge +contributors: + - tomalaforge +challengeNumber: 61 +command: forms-simplest-signal-form +sidebar: + order: 24 +--- + +## Information + +Angular has introduced a new way to work with forms using Signals. This modern approach provides better type safety, reactivity, and a more intuitive API compared to traditional Reactive Forms. You can find more information about Signal-based forms in the [Angular documentation](https://angular.dev/guide/forms). + +In this challenge, you will learn how to migrate a simple form from Reactive Forms (`FormControl` and `FormGroup`) to the new Signal-based Forms API. + +## Statement + +The application currently contains a simple form built with Reactive Forms using `FormControl` and `FormGroup`. The form includes the following fields: + +- **Name** (required) +- **Last Name** (optional) +- **Age** (must be between 1 and 99) +- **Note** (optional) + +Your goal is to **refactor this form to use Angular's new Signal-based Forms API** while maintaining the same functionality and validation rules. + +### Current Implementation + +The form currently uses: + +- `FormGroup` to group form controls +- `FormControl` for individual fields +- `Validators` for validation rules +- `ReactiveFormsModule` for form directives + +### Expected Result + +After completing the challenge, your form should: + +- Use Signal-based form instead of `FormControl` and `FormGroup` +- Maintain all existing validation rules +- Keep the same UI and user experience +- Display validation errors appropriately +- Submit and reset functionality should work as before +- **All existing tests should continue to pass** when running `nx test forms-simplest-signal-form` + +:::tip[TDD Approach] +You can run tests in watch mode to refactor using Test-Driven Development (TDD): + +```bash +nx test forms-simplest-signal-form +``` + +This will re-run tests automatically as you make changes, helping you ensure all tests continue to pass during your refactoring. +::: diff --git a/website/src/content/challenges/forms/62-crossfield-validation-signal-form.md b/website/src/content/challenges/forms/62-crossfield-validation-signal-form.md new file mode 100644 index 000000000..25c314036 --- /dev/null +++ b/website/src/content/challenges/forms/62-crossfield-validation-signal-form.md @@ -0,0 +1,92 @@ +--- +title: 🟢 Crossfield Validation with Signal Forms +description: Challenge 62 is about implementing crossfield validation using Angular Signal Forms where one field's validation depends on another field's value +author: thomas-laforge +contributors: + - tomalaforge +challengeNumber: 62 +command: forms-crossfield-validation-signal-form +sidebar: + order: 25 +--- + +## Information + +Crossfield validation is a common requirement in forms where the validity of one field depends on the value of another field. For example: + +- Password confirmation must match the password field +- End date must be after start date +- Conditional required fields based on another field's value + +Angular Signal Forms provides powerful tools to implement crossfield validation using custom validators. This challenge will teach you how to create custom validators that access multiple form controls and update validation dynamically. + +You can learn more about form validation in the [Angular Forms documentation](https://angular.dev/guide/forms/reactive-forms#validating-form-input). + +## Statement + +The application contains a registration form built with Angular Reactive Forms (`FormGroup` and `FormControl`). The form includes the following fields: + +- **Email** (required, must be a valid email) +- **Password** (required, minimum 6 characters) +- **Confirm Password** (required, must match the password field) 🔗 +- **Start Date** (required) +- **End Date** (required, must be after start date) 🔗 + +The 🔗 symbol indicates fields with crossfield validation that depend on other fields. + +### Current Implementation + +The form currently uses: + +- `FormGroup` to group form controls +- `FormControl` for individual fields +- `Validators` for basic validation rules +- **Custom crossfield validators** for password matching and date range validation +- `ReactiveFormsModule` for form directives + +### Key Features Demonstrated + +1. **Password Match Validator**: A custom validator that checks if the confirm password matches the password field +2. **Date Range Validator**: A custom validator that ensures the end date is after the start date +3. **Dynamic Validation Updates**: When the password or start date changes, the dependent fields are automatically re-validated + +### Challenge Goal + +Your goal is to **understand how crossfield validation works** and then **migrate this form to use Angular's new Signal-based Forms API** while maintaining all the crossfield validation logic. + +### What You'll Learn + +- How to create custom validators that access multiple form controls +- How to implement crossfield validation in Reactive Forms +- How to dynamically re-validate fields when their dependencies change +- How to migrate crossfield validation to Signal-based forms + +### Expected Result + +After completing the challenge, your form should: + +- Use Signal-based forms instead of `FormControl` and `FormGroup` +- Maintain all existing crossfield validation rules +- Keep the same UI and user experience +- Display validation errors appropriately for crossfield validations +- Submit and reset functionality should work as before +- Ensure that when the password field changes, the confirm password is re-validated +- Ensure that when the start date changes, the end date is re-validated + +:::tip[TDD Approach] +You can run tests in watch mode to refactor using Test-Driven Development (TDD): + +```bash +nx test forms-crossfield-validation-signal-form +``` + +This will re-run tests automatically as you make changes, helping you ensure all functionality works correctly during your migration. +::: + +## Constraints + +- You must use only Signal-based forms (no `FormGroup` or `FormControl`) +- All crossfield validation logic must be preserved +- The password confirmation must update its validation when the password changes +- The end date must update its validation when the start date changes +- All existing tests must pass diff --git a/website/src/content/challenges/forms/63-child-forms.md b/website/src/content/challenges/forms/63-child-forms.md new file mode 100644 index 000000000..7693104a6 --- /dev/null +++ b/website/src/content/challenges/forms/63-child-forms.md @@ -0,0 +1,63 @@ +--- +title: 🟠 Child Forms +description: Refactor the checkout form to Signal-based forms with reusable address component and shared validators +author: thomas-laforge +contributors: + - tomalaforge +challengeNumber: 63 +command: forms-child-forms +sidebar: + order: 125 +--- + +## Information + +You already built a checkout form with Reactive Forms (FormGroup / FormControl). Now you will refactor it to **Signal-based forms** while keeping the UX, validations, and billing toggle behavior. + +You can learn more about Signal-based forms in the [Angular documentation](https://angular.dev/guide/forms/signals-based-forms). + +## Statement + +The application contains a single-page checkout form with the following fields: + +- **Last name** (required) +- **First name** (required) +- **Shipping address**: street, ZIP code, city (all required) +- **Billing address**: street, ZIP code, city (all required when visible) +- **Billing address same as shipping** toggle + +Current behavior: + +- When the toggle is on, billing is hidden and disabled. +- When toggling on, the billing form copies the current shipping values. +- Submit marks all controls touched and prevents submission when invalid. +- Error hints show when a control is invalid and touched/dirty. + +### Goal + +Refactor the form to **Signal-based forms** and extract reusable pieces: + +1. Migrate all controls to Signal-based forms, preserving validation and submit behavior. +2. Create a reusable **AddressFormComponent** for street/ZIP/city. +3. Define a shared **custom validator schema** for the address group and reuse it for shipping and billing. +4. Keep the toggle behavior (copy shipping to billing, disable billing when same-as-shipping is true). +5. Preserve the UI and Tailwind styling. + +## Constraints + +- Use Signal-based forms only (no `FormGroup` / `FormControl`). +- Keep the same validations (all fields required, billing required when visible). +- Use a shared address validator schema applied to both shipping and billing subforms. +- Move address fields into a standalone `AddressFormComponent` +- Maintain the preview and status text. +- All existing tests must pass. + +:::tip[TDD Approach] +You can run tests in watch mode to refactor using Test-Driven Development (TDD): + +```bash +nx test forms-child-form +``` + +This will re-run tests automatically as you make changes, helping you ensure all functionality works correctly during your migration. +::: diff --git a/website/src/content/challenges/forms/64-form-array.md b/website/src/content/challenges/forms/64-form-array.md new file mode 100644 index 000000000..79cd95df8 --- /dev/null +++ b/website/src/content/challenges/forms/64-form-array.md @@ -0,0 +1,70 @@ +--- +title: 🟠 Form Array +description: Challenge 64 is about building dynamic lists with FormArray and migrating the form to Signal-based forms +author: thomas-laforge +contributors: + - tomalaforge +challengeNumber: 64 +command: forms-form-array +sidebar: + order: 126 +--- + +## Information + +You already built a registration form with Reactive Forms (FormGroup / FormControl / FormArray). Now you will refactor it to **Signal-based forms** while keeping the UX, validations, and dynamic add/remove behavior. + +You can learn more about Signal-based forms in the [Angular documentation](https://angular.dev/guide/forms/signals-based-forms). + +## Statement + +The application contains a single-page registration form with: + +- **Name** (required) +- **Pseudo** (required) +- **Contacts** (FormArray) + - First name (required) + - Last name (required) + - Relation (required) + - Email (required, valid email) +- **Emails** (FormArray) + - Type (required) + - Email (required, valid email) + +Current behavior: + +- Users can add or remove contacts and emails. +- Submit marks all controls as touched and blocks submission when the form is invalid. +- Validation errors appear when fields are touched/dirty or after submitting. +- Submitted data is displayed as JSON after a successful submission. + +### Challenge Goal + +Refactor the form to **Signal-based forms** while preserving the UI, validations, and dynamic FormArray behavior. + +### Expected Result + +After completing the challenge, your form should: + +- Use Signal-based forms instead of `FormGroup`, `FormControl`, and `FormArray`. +- Keep the same validation rules for all fields. +- Preserve add/remove behavior for contacts and emails. +- Keep the submit gating and submitted data preview. +- Pass all existing tests. + +## Constraints + +- Use only Signal-based forms (no `FormGroup`, `FormControl`, or `FormArray`). +- Preserve all current validations (required + email). +- Keep the same UX and Tailwind styling. +- All existing tests must pass. + +:::tip[TDD Approach] +You can run tests in watch mode to refactor using Test-Driven Development (TDD): + +```bash +nx test forms-form-array +``` + +This will re-run tests automatically as you make changes, helping you ensure all functionality works correctly during your migration. +::: diff --git a/website/src/content/challenges/forms/65-signal-form-edition.md b/website/src/content/challenges/forms/65-signal-form-edition.md new file mode 100644 index 000000000..f3457e5b7 --- /dev/null +++ b/website/src/content/challenges/forms/65-signal-form-edition.md @@ -0,0 +1,63 @@ +--- +title: 🟠 signal-form-edition +description: Refactor a user management form to use Angular's new Signal-based Forms API. +author: thomas-laforge +contributors: + - tomalaforge +challengeNumber: 65 +command: forms-signal-form-edition +sidebar: + order: 127 + badge: New +--- + +## Information + +Angular has introduced a new way to work with forms using Signals. This modern approach provides better reactivity and a more intuitive API compared to traditional Reactive Forms. + +In this challenge, you will refactor a user management application. The current implementation uses traditional Reactive Forms. Your goal is to migrate it to the new Signal-based Forms API. + +## Statement + +The application allows listing, adding, and editing users. It includes: + +- **User List**: Displays all users with "Edit" and "Delete" actions. +- **User Form**: A form used for both adding and editing users. +- **Fake Backend**: Simulates HTTP calls with a 500ms delay. + +Your goal is to **refactor the `UserFormComponent` to use Angular's Signal-based Forms API** while maintaining exactly the same functionality and validation rules. + +### Current Implementation + +The form currently uses: + +- `FormGroup` and `FormControl` for the user fields. +- `Validators` for mandatory fields (`firstname`, `lastname`, `age`) and minimum age. +- `patchValue` and `reset` for managing form state during edition. + +The application also uses `rxResource` to load users and navigation to handle the editing context. + +### Expected Result + +After completing the challenge: + +- Use Signal-based form instead of `FormControl` and `FormGroup` in `UserFormComponent`. +- Maintain all existing validation rules and error messages. +- Correctly handle the transition between "Add" and "Edit" modes. +- Maintain the same UI and user experience. + +## Testing + +A comprehensive test suite is provided to ensure your refactoring doesn't break any functionality. You can run the tests using: + +```bash +npx nx test forms-signal-form-edition +``` + +These tests verify the entire user management flow, including adding, editing, and deleting users, as well as form validation. + +## Constraints + +- Do not modify the `FakeBackendService` or `User` model. +- You can refactor other components if necessary, but the primary focus is the `UserFormComponent`. +- The form must properly validate inputs before submission. diff --git a/website/src/content/challenges/nx/25-generator-lib-ext.md b/website/src/content/challenges/nx/25-generator-lib-ext.md new file mode 100644 index 000000000..891be9b16 --- /dev/null +++ b/website/src/content/challenges/nx/25-generator-lib-ext.md @@ -0,0 +1,56 @@ +--- +title: 🔴 Extend Lib Generator +description: Challenge 25 is about creating a Nx generator to extend the built-in Library Generator +author: thomas-laforge +contributors: + - tomalaforge + - LMFinney +challengeNumber: 25 +sidebar: + order: 207 +--- + +## Information + +Welcome to the marvelous world of Nx generators. + +Generators are awesome tools that can help you and your team generate code more quickly, especially for pieces of code that you use frequently. While using Nx, you create libraries regularly, but sometimes the default generator doesn't perfectly meet your needs. + +## Statement + +The goal of this challenge is to create a generator that extends the default library generator of Nx. You will need to override the default `jest.config.ts` and a `eslintrc.json` with a custom one. + +You can either use all the default parameters of the Nx library generator or choose to modify some and keep others as defaults. The choice is yours. + +## Constraints + +You should only override the jest configuration is the `unitTestRunner` option is set at `jest`, and you should only update the eslint configuration if the `linter` is set to `eslint`. + +--- + +`jest.config.ts` + +```ts +/* eslint-disable */ +export default { + displayName: '< libName >', // 👈 lib name + preset: '../../../jest.preset.js', // 👈 be careful with the path + setupFilesAfterEnv: ['/src/subscription-setup.ts'], + transform: { + '^.+\\.(ts|mjs|js|html)$': [ + 'jest-preset-angular', + { + tsconfig: '/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$', + }, + ], + }, + transformIgnorePatterns: ['node_modules/(?!(.*\\.mjs$|lodash-es))'], +}; +``` + +--- + +`eslintrc.json` + +Add the rule `"@typescript-eslint/member-ordering": "off"` inside the rules properties of ts files. diff --git a/website/src/content/challenges/nx/26-generator-comp.md b/website/src/content/challenges/nx/26-generator-comp.md new file mode 100644 index 000000000..ae1505459 --- /dev/null +++ b/website/src/content/challenges/nx/26-generator-comp.md @@ -0,0 +1,148 @@ +--- +title: 🟠 Component Generator +description: Challenge 26 is about creating a Nx generator to create a custom component +author: thomas-laforge +contributors: + - tomalaforge + - tomer953 + - Sagardevkota + - LMFinney +challengeNumber: 26 +sidebar: + order: 116 +--- + +## Information + +Welcome to the marvelous world of Nx generators. + +Generators are awesome tools that can help you and your team generate code more quickly, especially for pieces of code that you use frequently. Inside an enterprise project, you often have to create components that look similar. And most of the time, you end up copy/pasting other components. In Nx, you can create this boilerplate in a simple command using generators. + +## Statement + +The goal of this challenge is to create a generator that will create all the boilerplate of a component for you. + +Below are the end result of your generator for a `UserComponent` associated with a `@ngrx/component-store`. + +## Options + +- name : name of your component/store/service +- createService: flag to tell if a http service should be created + - yes : create as below + - no: don't create the inject/import/effect/function call (anything related to the service call) +- inlineTemplate: flag to decide if template should be inline or in a separate file + +--- + +`user.component.ts` + +```ts +@Component({ + selector: 'app-user', + imports: [LetDirective], + providers: [provideComponentStore(UserStore)], + template: ` + // do things + `, + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class UserComponent { + private userStore = inject(UserStore); + + readonly vm$ = this.userStore.vm$; +} +``` + +--- + +`user.store.ts` + +```ts +import { Injectable, inject } from '@angular/core'; +import { ComponentStore, OnStateInit, OnStoreInit } from '@ngrx/component-store'; +import { tapResponse } from '@ngrx/operators'; +import { mergeMap, pipe, tap } from 'rxjs'; +import { User } from './user.model'; +import { UserService } from './user.service'; + +export interface UserState { + users: User[]; + loading: boolean; + error?: string; +} + +const initialState: UserState = { + users: [], + loading: false, + error: undefined, +}; + +@Injectable() +export class UserStore extends ComponentStore implements OnStateInit, OnStoreInit { + private userService = inject(UserService); + + private readonly users$ = this.select((state) => state.users); + private readonly loading$ = this.select((state) => state.loading); + private readonly error$ = this.select((state) => state.error); + + readonly vm$ = this.select( + { + users: this.users$, + loading: this.loading$, + error: this.error$, + }, + { debounce: true }, + ); + + ngrxOnStateInit() { + this.setState(initialState); + } + + ngrxOnStoreInit() { + this.loadUsers(); + } + + readonly loadUsers = this.effect( + pipe( + tap(() => this.patchState({ loading: true })), + mergeMap(() => + this.userService.loadUsers().pipe( + tapResponse( + (users) => this.patchState({ users, loading: false }), + (err: string) => this.patchState({ error: err, loading: false }), + ), + ), + ), + ), + ); +} +``` + +--- + +`user.service.ts` + +```ts +import { BASE_URL } from '@angular-challenges/fake-utils'; +import { HttpClient } from '@angular/common/http'; +import { Injectable, inject } from '@angular/core'; +import { User } from './user.model'; + +@Injectable({ providedIn: 'root' }) +export class UserService { + private http = inject(HttpClient); + private BASE_URL = inject(BASE_URL); + + loadUsers = () => this.http.get(`${this.BASE_URL}/users`); +} +``` + +--- + +`user.model.ts` + +```ts +export interface User { + name: string; +} +``` diff --git a/website/src/content/challenges/nx/27-forbid-enum-rule.md b/website/src/content/challenges/nx/27-forbid-enum-rule.md new file mode 100644 index 000000000..998e11c49 --- /dev/null +++ b/website/src/content/challenges/nx/27-forbid-enum-rule.md @@ -0,0 +1,27 @@ +--- +title: 🟢 Custom Eslint Rule +description: Challenge 27 is about creating a custom ESLint Rule to forbid enums +author: thomas-laforge +contributors: + - tomalaforge + - jdegand +challengeNumber: 27 +sidebar: + order: 12 +--- + +## Information + +ESLint is an amazing tool that helps developers avoid simple mistakes and adhere to company style guides. + +In this first example, we will create a rule that forbids the use of enums. The rule will suggest using string unions instead of enums whenever an enum is present in this repo's code. This is a straightforward rule for learning how to create rules. + +You will also need to write tests to verify the rule's functionality. + +The starter code for this challenge can be found (from the root folder) inside `tools/eslint-rules/rules`. + +To test the rule inside your project, add `"@nx/workspace/forbidden-enum": "error"` to the `eslintrc.json`. You can navigate to Challenge 47, `Enums vs. Union Types', and you should immediately see an error. + +To assist you with AST (Abstract Syntax Tree) definitions, you can visit the [AST Explorer](https://astexplorer.net/) and use `JavaScript`, `@typescript-eslint/parser`, and `ESLint-v8` as the transformation methods. However, please note that you will only get the `type` information there. The transformation function may not work for TypeScript types since the editor is in JavaScript. + +You can also check this [repo](https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/eslint-plugin/src/rules) for ESLint rule examples. diff --git a/website/src/content/challenges/nx/42-static-vs-dynamic-import.md b/website/src/content/challenges/nx/42-static-vs-dynamic-import.md new file mode 100644 index 000000000..2e04e1447 --- /dev/null +++ b/website/src/content/challenges/nx/42-static-vs-dynamic-import.md @@ -0,0 +1,31 @@ +--- +title: 🟢 Static vs Dynamic Import +description: Challenge 42 is about understanding and fixing the eslint rule - Static imports of lazy-loaded libraries are forbidden. +author: thomas-laforge +contributors: + - tomalaforge +challengeNumber: 42 +command: nx-static-vs-dynamic-import +sidebar: + order: 15 +--- + +## Information + +If you are using **Nx**, you might have encountered this error: + +```ts +Static imports of lazy-loaded libraries are forbidden. + +Library "users" is lazy-loaded in these files: + +- apps/nx/static-dynamic-import/src/app/app.config.ts eslint@nx/enforce-module-boundaries +``` + +This error is part of the ESLint rule embedded by Nx to prevent people from mixing lazy-loading and eagerly-loading code from the same library. Although this error will not break at runtime or build time, it can lead to consequences for bundle size. The lazy-loaded code will end up in the main bundle, nullifying all the benefits of lazy-loading a library. + +## Statement + +The goal of this challenge is to improve the code architecture to eliminate this ESLint error. + +You will learn how to create a library and how to rearrange code. diff --git a/website/src/content/challenges/performance/12-optimize-change-detection.md b/website/src/content/challenges/performance/12-optimize-change-detection.md new file mode 100644 index 000000000..5fa698a43 --- /dev/null +++ b/website/src/content/challenges/performance/12-optimize-change-detection.md @@ -0,0 +1,41 @@ +--- +title: 🟠 Optimize Change Detection +description: Challenge 12 about optimizing the number of change detection cycle while scrolling +author: thomas-laforge +contributors: + - tomalaforge + - LMFinney +challengeNumber: 12 +command: performance-optimize-change-detection +sidebar: + order: 107 +--- + +## Information + +In Angular, there is a library called Zone.js that performs a lot of magic to simplify a developer's life. Zone.js monkey patches all DOM events so that it will recheck and rerender the view when something has changed inside the application. The developer doesn't have to manually trigger change detection. + +However, sometimes Zone.js triggers a lot more change detection than needed. For example, when you are listening to a scroll event, each scroll event will dispatch a new change detection cycle. + +In this challenge, we only need to refresh the view at a specific scroll position to display or hide a button. All other cycles are unnecessary. + +To have a better visualization of the problem, profile your application with Angular Dev Tools. + +:::note +If you don't know how to use it, read [the performance introduction page](/challenges/performance/) first and come back after. +::: + +You can learn more details about zone pollution and how to resolve it [here](https://angular.dev/best-practices/zone-pollution). + +The following video will explain more in-depth the issue of this application. + + + +## Statement + +Your goal for this challenge is to avoid all unnecessary change detection cycles and trigger a change detection only when needed. + +## Constraint: + +You cannot opt out of Zone.js globally. If this code is part of a large project, and you opt out of Zone.js, you will break your application without any doubt. diff --git a/website/src/content/challenges/performance/34-default-vs-onpush.md b/website/src/content/challenges/performance/34-default-vs-onpush.md new file mode 100644 index 000000000..779af5324 --- /dev/null +++ b/website/src/content/challenges/performance/34-default-vs-onpush.md @@ -0,0 +1,57 @@ +--- +title: 🟢 Default vs OnPush +description: Challenge 34 is about learning the difference between Default and OnPush Change Detection Strategy. +author: thomas-laforge +contributors: + - tomalaforge +challengeNumber: 34 +command: performance-default-vs-onpush +sidebar: + order: 7 +--- + +## Information + +In this challenge, we will explore the differences and impacts of using `ChangeDetectionStrategy.Default` versus `ChangeDetectionStrategy.OnPush`. + +You can read the [Angular documentation](https://angular.dev/best-practices/skipping-subtrees) to learn more about the differences between these strategies. + +In this challenge, all components start with the `Default` strategy. When you type letters inside the input field, you will notice that all components are highlighted in orange. + +:::note +I added color highlighting to each component and each row to provide a better visualization of when a component is rerendered. +::: + +As you can see, each letter triggers a new change detection cycle, and all components are rerendered, causing performance issues. + +Let's use the Angular DevTool to profile our application and understand how this tool can help us understand what is happening inside our application. + +:::note +If you don't know how to use it, read [the performance introduction page](/challenges/performance/) first and come back after. +::: + +Now, start profiling your application and type some letters inside the input field to trigger some change detection cycles. + +If you click on one of the bars (indicated by the yellow arrow in the picture below), you can see that `PersonListComponent`, `RandomComponent`, and all the `MatListItem` are impacted by the change detection cycle, even when we only interact with the input field. + +![profiler record](../../../../assets/performance/34/profiler-record.png 'Profiler Record') + +## Statement + +The goal of this challenge is to improve the clustering of change detection within the application using the `OnPush` change detection strategy, but not only... + +## Hints: + +
+ Hint 1 + +Use `ChangeDetectionStrategy.OnPush` but this will not be enough. + +
+ +
+ Hint 2 + +Create smaller components to better separate the input field from the list. + +
diff --git a/website/src/content/challenges/performance/35-memoization.md b/website/src/content/challenges/performance/35-memoization.md new file mode 100644 index 000000000..52f61389b --- /dev/null +++ b/website/src/content/challenges/performance/35-memoization.md @@ -0,0 +1,51 @@ +--- +title: 🟢 Memoization +description: Challenge 35 is about learning how pure pipe works +author: thomas-laforge +contributors: + - tomalaforge + - LMFinney +challengeNumber: 35 +command: performance-memoization +sidebar: + order: 8 +--- + +## Information + +In Angular, pure Pipes are very powerful because the value is memoized, which means if the input value doesn't change, the `transform` function of the pipe is not recomputed, and the cached value is outputted. + +You can learn more about pipes in the [Angular documentation](https://angular.dev/guide/pipes) and inside this [deep dive article](https://medium.com/ngconf/deep-dive-into-angular-pipes-c040588cd15d). + +In this challenge, we start with a button to load a list of people. Each person is associated with a number, and we will use the Fibonacci calculation to create a heavy computation that will slow down the application. + +Once the list is loaded, try typing some letters inside the input field. You will notice that the application is very slow, even though you are only performing very basic typing. + +:::note +We will not focus on the initial loading of the list in this challenge. +::: + +Let's use the Angular DevTool to profile our application and understand how this tool can help us understand what is happening inside our application. + +:::note +If you don't know how to use it, read [the performance introduction page](/challenges/performance/) first and come back after. +::: + +Now, start profiling your application and type some letters inside the input field. You will see some red bars showing up inside the profiler panel. + +If you click on one of the bars (indicated by the yellow arrow in the picture below), you will see that the change detection cycle is taking more than 3s in `PersonListComponent`. + +![profiler record](../../../../assets/performance/35/memoize-profiler.png 'Profiler Record') + +## Statement + +The goal of this challenge is to understand what is causing this latency and to improve it. + +## Hints: + +
+ Hint 1 + +Use `Pipes` to memoize the Fibonacci computation. + +
diff --git a/website/src/content/challenges/performance/36-ngfor-optimization.md b/website/src/content/challenges/performance/36-ngfor-optimization.md new file mode 100644 index 000000000..336f525fa --- /dev/null +++ b/website/src/content/challenges/performance/36-ngfor-optimization.md @@ -0,0 +1,34 @@ +--- +title: 🟢 NgFor Optimization +description: Challenge 36 is about learning how trackby works +author: thomas-laforge +contributors: + - tomalaforge + - LMFinney +challengeNumber: 36 +command: performance-ngfor-optimization +sidebar: + order: 13 +--- + +## Information + +In this application, we have a list of individuals that we can add, delete or update. If you open the developer Chrome panel by pressing **F12**, go to the Elements tab, and expand the element to see the list, you will notice that each time you add, delete or update a list item, all the DOM elements are destroyed and initialized again. (See video below). + + + +We can also use the Angular DevTool to profile our application and understand what is happening inside our application. I will show you how to do it inside the following video. + + + +:::note +If you don't know how to use it, read [the performance introduction page](/challenges/performance/) first and come back after. +::: + +If you need more information about `NgFor`, I invite you to read the [documentation](https://angular.dev/api/common/NgFor) first. + +## Statement + +The goal of this challenge is to understand what is causing this DOM refresh and to solve it. diff --git a/website/src/content/challenges/performance/37-optimize-big-list.md b/website/src/content/challenges/performance/37-optimize-big-list.md new file mode 100644 index 000000000..daeb5aec9 --- /dev/null +++ b/website/src/content/challenges/performance/37-optimize-big-list.md @@ -0,0 +1,39 @@ +--- +title: 🟠 Optimize Big List +description: Challenge 37 is about learning how virtualization optimize big list rendering +author: thomas-laforge +contributors: + - tomalaforge + - jdegand + - LMFinney +challengeNumber: 37 +command: performance-optimize-big-list +sidebar: + order: 117 +--- + +## Information + +In this application, we will render a list of 100,000 individuals by clicking on the **loadList** button. If you open the Chrome developer panel by pressing **F12**, go to the Elements tab, and expand the element to see the list, you will notice that all 100,000 elements are rendered in the DOM, even though we can only see about 20 elements in the viewport. This process takes a lot of time, which is why the application is very slow at displaying the list. + +We can use the Angular DevTool to profile our application and understand what is happening inside our application. I will show you how to do it inside the following video. + + + +:::note +If you don't know how to use it, read [the performance introduction page](/challenges/performance/) first and come back after. +::: + +## Statement + +The goal of this challenge is to implement a better alternative to display big list of items. + +## Hints: + +
+ Hint 1 + +If you're unsure where to begin, I recommend reading the [Angular CDK virtualization documentation](https://material.angular.io/cdk/scrolling/overview). + +
diff --git a/website/src/content/challenges/performance/40-web-worker.md b/website/src/content/challenges/performance/40-web-worker.md new file mode 100644 index 000000000..522e19d28 --- /dev/null +++ b/website/src/content/challenges/performance/40-web-worker.md @@ -0,0 +1,36 @@ +--- +title: 🟠 Web workers +description: Challenge 40 is about learning how to create and use a web worker +author: thomas-laforge +contributors: + - tomalaforge + - jdegand +challengeNumber: 40 +command: performance-web-workers +sidebar: + order: 119 +--- + +## Information + +This challenge has been created for [Angular Advent Calendar](https://angularchristmascalendar.com) 2023. + +This application is basic. We click on the **Discover** button to reveal the surprise hidden behind the black screen. However, the current application provides an awful user experience. When we click on the button, the page freezes, and after a while, it reveals the secret all at once without a smooth animation. + +> Note: To create the application freeze, the loader is based on a very heavy computation function. We could have used a basic timer, but that's not the point of this challenge. + +Since JavaScript is single-threaded, when we perform a heavy task, the browser cannot update the UI or respond to mouse clicks or any events. To free the main thread, the goal is to isolate the heavy computation into a different thread. To do so, we will need to use web workers. Web workers can run any scripts in the background, in isolation from the main thread, allowing the browser to still provide your user with a good experience. + +In Angular, this technology is often underused, however, it's straightforward to create one. There is a schematic that you can find [here](https://angular.dev/ecosystem/web-workers). + +## Statement + +The goal of this challenge is to create a smooth animation by isolating the heavy computation function into a web worker. + +First, create a web worker using a schematic, then move the issuing function. Finally, the animation should be smooth and the progress percentage should update, which will provide an awesome user experience. + +:::note +Since we are inside an Nx workspace, simply replace the `ng` command with `nx` when running the schematic. + +If `nx` is not installed globally on your machine, prefix your command with `npx`. +::: diff --git a/website/src/content/challenges/performance/index.mdx b/website/src/content/challenges/performance/index.mdx new file mode 100644 index 000000000..5a7bb0abe --- /dev/null +++ b/website/src/content/challenges/performance/index.mdx @@ -0,0 +1,71 @@ +--- +title: Angular Performance +prev: false +next: false +contributors: + - tomalaforge + - tomer953 + - LMFinney +description: Learn how to use the Angular Devtool chrome extension. +noCommentSection: true +sidebar: + order: 1 +--- + +import { LinkCard } from '@astrojs/starlight/components'; + +In this series of challenges about performance, you will learn how to optimize and enhance the performance of your Angular application. + +Before starting to resolve any challenge, I invite you to download the [Angular DevTools Chrome extension](https://chrome.google.com/webstore/detail/angular-devtools/ienfalfjdbdpebioblfackkekamfmbnh) if you haven't already done so. + +This extension allows you to profile your application and detect performance issues, which is very useful for understanding where performance issues can occur. + +## How to use it + +When you serve an Angular application, you can inspect a page by pressing F12, which will open the Chrome developer tools. Then navigate to the Angular tab. From there, you can select the Profiler tab as shown below. + +![profiler tab](../../../../assets/performance/profiler-tab.png 'Profiler tab') + +You can now profile your application by clicking on the record button. You can play with your application and see when change detection is triggered and which components are rerendered. + +:::tip[Learn more] +You can learn more on the [documentation page](https://angular.io/guide/devtools). +::: + +Now that you know how to use the Angular DevTool, you can choose a challenge, profile it, and resolve it. + + + + + + + + + + + + diff --git a/website/src/content/challenges/rxjs/11-high-order-operator-bug.md b/website/src/content/challenges/rxjs/11-high-order-operator-bug.md new file mode 100644 index 000000000..dbc0b53d0 --- /dev/null +++ b/website/src/content/challenges/rxjs/11-high-order-operator-bug.md @@ -0,0 +1,32 @@ +--- +title: 🟠 High Order Operator Bug +description: Challenge 11 is about resolving a Rxjs bug because of high order operators +author: thomas-laforge +contributors: + - tomalaforge + - LMFinney +challengeNumber: 11 +command: rxjs-high-order-operator-bug +sidebar: + order: 114 +--- + +Let's dive inside the wonderful word of RxJS. + +This challenge is inspired by a real-life example. + +## Information + +### User Story + +We need a button for each `Topic`. When we click on it, we delete all objects with this `Topic` in our database _(Fake DB in our case)_. Finally, we display **All [topic] have been deleted** if everything was deleted successfully or **Error: deletion of some [topic] failed** if some deletions failed + +### Constraints + +We can only pass one object to our DB for deletion at the time. The DB will respond true if the data was successfully deleted and false otherwise. + +### Statement + +The QA team reports a **bug**. The UI shows **All [topic] have been deleted** all the time, even if some deletions fail. + +👉 Spot the bug and correct it. diff --git a/website/src/content/challenges/rxjs/14-race-condition.md b/website/src/content/challenges/rxjs/14-race-condition.md new file mode 100644 index 000000000..b4fbb8d95 --- /dev/null +++ b/website/src/content/challenges/rxjs/14-race-condition.md @@ -0,0 +1,30 @@ +--- +title: 🟢 Race Condition +description: Challenge 14 is about race condition in Rxjs +author: thomas-laforge +contributors: + - tomalaforge + - LMFinney +challengeNumber: 14 +command: rxjs-race-condition +sidebar: + order: 11 +--- + +## Information + +The goal of this application is to display a list of topics in a modal when a button is clicked. The application functions correctly. However, your tech lead has asked you to add tests and they are failing. + +## Statement + +Correct your application to pass the test + +## Constraints + +- I can see you coming 🤣 => You CANNOT change the test (the test is working fine) 😳 +- You CANNOT change the `fakeGetHttpTopic` method. A delay has been added to fake a slow network. + +## Run the test + +HEADLESS : `npx nx test rxjs-race-condition` +WATCH MODE : `npx nx test rxjs-race-condition --watch` diff --git a/website/src/content/challenges/rxjs/38-rxjs-catch-error.md b/website/src/content/challenges/rxjs/38-rxjs-catch-error.md new file mode 100644 index 000000000..5680d1544 --- /dev/null +++ b/website/src/content/challenges/rxjs/38-rxjs-catch-error.md @@ -0,0 +1,37 @@ +--- +title: 🟢 catchError +description: Challenge 38 is about learning observable completion. +author: devesh-chaudhari +command: rxjs-catch-error +contributors: + - DeveshChau + - tomalaforge + - LMFinney +challengeNumber: 38 +sidebar: + order: 14 +--- + +## Information + +### How to Use the Application + +Our application features a form with a text input box and a "Fetch" button. Upon clicking the "Fetch" button, data is retrieved from a [free API](https://jsonplaceholder.typicode.com/). + +The correct values for a successful response are limited to: posts, comments, albums, photos, todos, and users. Any other values will result in an error response. + +### Bug + +A bug has been identified in our application. Users are only able to successfully fetch data until an invalid request is sent. Once an error response is received, users are unable to send additional requests. + +### Learnings + +This application provides an opportunity to understand the correct placement of a [`catchError`](https://rxjs.dev/api/operators/catchError) operator. If placed incorrectly, the overall subscription will be completed, preventing users from sending more requests. The goal is to preserve the overall subscription by handling error notifications from inner observables appropriately. + +## Statement + +The goal is to use the catchError operator to handle error management inside your Rxjs stream. + +## Constraints + +Users should be able to log the value/error each time they click the "Fetch" button. diff --git a/website/src/content/challenges/rxjs/49-hold-to-save-button.md b/website/src/content/challenges/rxjs/49-hold-to-save-button.md new file mode 100644 index 000000000..050ccc48a --- /dev/null +++ b/website/src/content/challenges/rxjs/49-hold-to-save-button.md @@ -0,0 +1,46 @@ +--- +title: 🟠 Hold to save button +description: You're tasked with implementing Lucie's button design, requiring holding it for a set time to save, taking over from Sacha; functionalities include configuring duration, countdown initiation on "mousedown", progress bar reset on "mouseleave" or "mouseup", reflecting remaining time, and simulating save request on hold completion, using RxJS operators and ensuring declarative code. +author: timothy-alcaide +contributors: + - alcaidio + - LMFinney +challengeNumber: 49 +command: rxjs-hold-to-save-button +sidebar: + order: 19 +--- + +## Context + +As a member of the development team, you have to respond to a specific request from the UX designer, 👩🏻‍🎨 Lucie, who has designed a button that must be held down for X amount of time to save a save request. + +Sacha 👶🏼 the trainee has already integrated the design but doesn't know how to perform the "holdable" functionality. + +So you're going to take over from him. + +## Functional expectation + +> "As a user, I would like to save something by holding down the button for a certain amount of time." + +Here is the prototype made by Lucie: + +![prototype gif](../../../../assets/rxjs/49/prototype.gif) + +## Acceptance Criteria + +1. We should be able to configure a maintenance duration in milliseconds. +2. Pressing and holding the button triggers the countdown on the `mousedown` event. +3. On `mouseleave` or `mouseup` events, the progress bar is reset to 0. +4. The progress bar representing the remaining relative time should reflect the remaining time. +5. Simulates a backend request when the hold time is over (console log or alert). +6. You must maximize the use of RxJS operators and be as declarative as possible. + +
+ Tips 🤫 (if you really need it and after careful consideration) +
    +
  • Create the `HoldableDirective`
  • +
  • Use `TemplateRef` and `fromEvent` from RxJS to catch events or `@HostListener`
  • +
  • Perhaps the following RxJS operators can help you: interval, takeUntil, switchMap, takeWhile/retry...
  • +
+
diff --git a/website/src/content/challenges/signal/30-interop-rxjs-signal.md b/website/src/content/challenges/signal/30-interop-rxjs-signal.md new file mode 100644 index 000000000..08489c8f7 --- /dev/null +++ b/website/src/content/challenges/signal/30-interop-rxjs-signal.md @@ -0,0 +1,22 @@ +--- +title: 🔴 Interoperability Rxjs/Signal +description: Challenge 30 is about learning how to mix signal with Rxjs +author: thomas-laforge +contributors: + - tomalaforge + - tomer953 +challengeNumber: 30 +command: signal-interop-rxjs-signal +sidebar: + order: 204 +--- + +## Information + +In this challenge, we have a small reactive application using **RxJS** and **NgRx/Component-Store**. + +The goal of this challenge is to use the new **Signal API** introduced in Angular v16. However, we should not convert everything. Certain portions of the code are better suited for RxJS rather than Signal. It is up to you to determine the threshold and observe how **Signal and RxJS coexist**, as well as how the interoperability is achieved in Angular. + +## Note + +- You can use any third party library if you want to like **ngrx/signal-store**, **tanstack-query** or **rxAngular**. diff --git a/website/src/content/challenges/signal/43-signal-input.md b/website/src/content/challenges/signal/43-signal-input.md new file mode 100644 index 000000000..0ab0498e5 --- /dev/null +++ b/website/src/content/challenges/signal/43-signal-input.md @@ -0,0 +1,55 @@ +--- +title: 🟢 Signal Input +description: Challenge 43 is about learning how to use signal inputs +author: thomas-laforge +contributors: + - tomalaforge +challengeNumber: 43 +command: signal-signal-input +sidebar: + order: 16 +--- + +## Information + +Finally, the day has arrived when the Angular team introduces a reactive input. This highly requested feature has been awaited for many years. Version 17.1 introduces `SignalInput`. Instead of utilizing the well-known `@Input` decorator, you now have a function that returns a signal. + +```ts +// old way +@Input() age?: number; + +// new way +age = input() +``` + +If you want required inputs + +```ts +// old way +@Input({required: true}) age!: number; + +// new way +age = input.required() +``` + +If you wanted to obtain a signal from an input, you had to go through a setter to configure your signal from the input. + +```ts +// old way +age = signal(0) +@Input({alias: 'age'}) set _age(age: number){ + this.age.set(age) +}; + +// new way +age = input() +``` + +You can read more about signal inputs [here](https://angular.dev/guide/signals/inputs). + +## Statement + +In this small application, the goal is to refactor the `UserComponent` to utilize `SignalInput`. + +- You have required and optional inputs. +- You can use the `transform` function for the `age` input to directly convert the property to a number. diff --git a/website/src/content/challenges/signal/50-bug-effect-signal.md b/website/src/content/challenges/signal/50-bug-effect-signal.md new file mode 100644 index 000000000..46f07c6bd --- /dev/null +++ b/website/src/content/challenges/signal/50-bug-effect-signal.md @@ -0,0 +1,40 @@ +--- +title: 🟢 Bug in Effect +description: Challenge 50 is about understanding why an effect is not triggered. +author: thomas-laforge +contributors: + - tomalaforge + - svenson95 + - LMFinney +challengeNumber: 50 +command: signal-bug-in-effect +sidebar: + order: 19 +--- + +## Information + +In this basic exercise, we aim to display an alert whenever at least one checkbox is checked. You are in the process of buying a MacBook, which can be upgraded with some extras, like more drive space, more RAM or a better GPU. + +Bildschirmfoto 2024-05-09 um 08 57 57 + +## Statement + +The actual implementation doesn't work as expected, and your task is to fix a bug that your team discovered. An alert should be shown if at least one of the three checkboxes is checked (independent of any other checkboxes). But if the first one is checked, checking one or both of the other two checkboxes does not cause the alert to display. Why does this happen? + +The objective of this challenge is to understand the issue and fix the problem that prevents the alert from appearing when the second checkbox is clicked. + +## Acceptance Criteria + +To ensure this feature works properly, try this out to reproduce the bug after solving the challenge, to check if the bug is gone. + +- Check box 1 (Alert should be shown) +- Check box 2 (Alert should be shown) +- Uncheck box 1 +- Check box 3 (Alert should be shown) +- Uncheck box 2 +- Uncheck box 3 + +## Bonus Challenge + +- Try to implement this feature with a `computed` signal. diff --git a/website/src/content/challenges/signal/51-function-call-effect.md b/website/src/content/challenges/signal/51-function-call-effect.md new file mode 100644 index 000000000..e2a94694c --- /dev/null +++ b/website/src/content/challenges/signal/51-function-call-effect.md @@ -0,0 +1,25 @@ +--- +title: 🟢 Function call in effect +description: Challenge 51 is about understanding why an effect is triggered too often. +author: thomas-laforge +contributors: + - tomalaforge +challengeNumber: 51 +command: signal-function-call-effect +sidebar: + order: 20 +--- + +## Information + +In this second challenge focusing on Signal effects, we've introduced an input select that allows users to choose an action. Whenever an action is selected, it is logged in the console. The application also permits changes to the selected user. + +## Problem Statement + +Ideally, the system should log an action only when one is specifically selected. However, we currently face an issue where changing the user also triggers a log entry, even though we do not explicitly monitor user changes. + +The objective of this challenge is to identify and resolve the cause of these extra triggers. We aim to ensure that logging only occurs when an action is selected. + +## Constraints + +- You cannot modify the `UserService` file. diff --git a/website/src/content/challenges/signal/53-big-signal-performance.md b/website/src/content/challenges/signal/53-big-signal-performance.md new file mode 100644 index 000000000..d3b4ea4a2 --- /dev/null +++ b/website/src/content/challenges/signal/53-big-signal-performance.md @@ -0,0 +1,24 @@ +--- +title: 🟠 Big Signal Performance +description: Challenge 53 is about performance while using big signal object +author: thomas-laforge +contributors: + - tomalaforge + - jdegand +challengeNumber: 53 +command: signal-big-signal-performance +sidebar: + order: 122 +--- + +## Information + +For this challenge, you can imagine a large-scale application where you use a service to save and retrieve your user state at any time within the application. + +The problem is that updating a single user property updates the entire application. + +I added the `CDFlashingDirective` to visualize when one component is rendering. + +## Statement + +With signals, you can now be more fine-grained in what the UI is rendering. The goal of this challenge is to understand why everything is re-rendering and to refactor the application to be more performant. diff --git a/website/src/content/challenges/signal/54-pipe-observable-to-signal.md b/website/src/content/challenges/signal/54-pipe-observable-to-signal.md new file mode 100644 index 000000000..2b88b528f --- /dev/null +++ b/website/src/content/challenges/signal/54-pipe-observable-to-signal.md @@ -0,0 +1,22 @@ +--- +title: 🔴 Pipe Observable to Signal +description: Challenge 54 is about refactoring an application using observable to signals +author: thomas-laforge +contributors: + - tomalaforge + - LMFinney +challengeNumber: 54 +command: signal-pipe-observable-to-signal +sidebar: + order: 210 +--- + +## Information + +We have a legacy application that is using observables to store a state. Signals are a very good fit for that. + +## Statement + +So, the goal of this challenge is to refactor the following application to be a fully signal-based application. When you are done, neither the pipe nor the service should import RxJS. + +Be careful along the way; everything might not work as you wish. diff --git a/website/src/content/challenges/signal/56-forms-and-signal.md b/website/src/content/challenges/signal/56-forms-and-signal.md new file mode 100644 index 000000000..077fd822f --- /dev/null +++ b/website/src/content/challenges/signal/56-forms-and-signal.md @@ -0,0 +1,27 @@ +--- +title: 🔴 forms and signal +description: Challenge 56 is about working with reactive forms and signals +author: thomas-laforge +contributors: + - tomalaforge +challengeNumber: 56 +command: signal-forms-and-signal +sidebar: + order: 211 +--- + +## Information + +We are working within a large e-commerce codebase that utilizes a substantial number of forms. The team predominantly uses reactive forms, and since the release of signals, we have been integrating them extensively. + +The current feature in development is a multi-step form process. The steps include: selecting a product, choosing the quantity, and finally proceeding to the checkout step to complete the billing details. However, an issue has been identified: when a user navigates back from the checkout step to the quantity step, the previously selected quantity is not retained. This needs to be fixed. + +## Challenge Statement + +The objective of this challenge is to make sure that the selected quantity is preserved when navigating back from the checkout step to the quantity step. + +## Constraints + +The solution must use reactive forms and signals. + +Additionally, as an optional side challenge, you may refactor the code to use template-driven forms. diff --git a/website/src/content/challenges/testing/17-router.md b/website/src/content/challenges/testing/17-router.md new file mode 100644 index 000000000..2af0c8d77 --- /dev/null +++ b/website/src/content/challenges/testing/17-router.md @@ -0,0 +1,28 @@ +--- +title: 🟠 Router +description: Challenge 17 is about testing the router +author: thomas-laforge +contributors: + - tomalaforge + - LMFinney +challengeNumber: 17 +command: testing-router +sidebar: + order: 108 +--- + +## Information + +We have a functional application that lists available books for borrowing inside a library. If the book you searched for is available, you will be directed to the corresponding book(s), otherwise, you will end up on an error page. + +The file named `app.component.spec.ts` will let you test your application using [Angular Testing Library](https://testing-library.com/) . To run the test suites, you need to run `npx nx test testing-router-outlet`. You can also install [Jest Runner](https://marketplace.visualstudio.com/items?itemName=firsttris.vscode-jest-runner) to execute your test by clicking on the `Run` button above each `describe` or `it` blocks. + +For testing with Cypress, you will execute your test inside the `app.component.cy.ts` and run `npx nx component-test testing-router-outlet` to execute your test suites. You can add the `--watch` flag to execute your test in watch mode. + +# Statement + +The goal is to test multiple behaviors of the application described in each test file using [Angular Testing Library](https://testing-library.com/) and [Cypress Component Testing](https://docs.cypress.io/guides/component-testing/overview). + +:::note +I have created some `it` blocks but feel free to add more tests if you want. +::: diff --git a/website/src/content/challenges/testing/18-nested-components.md b/website/src/content/challenges/testing/18-nested-components.md new file mode 100644 index 000000000..d7ba391c2 --- /dev/null +++ b/website/src/content/challenges/testing/18-nested-components.md @@ -0,0 +1,32 @@ +--- +title: 🟠 Nested Components +description: Challenge 18 is about testing nested components +author: thomas-laforge +contributors: + - tomalaforge + - LMFinney +challengeNumber: 18 +command: testing-nested-components +sidebar: + order: 109 +--- + +## Information + +We have a small application that sends a title to a fake backend when the user types the value into an input. +If the title is correctly typed, you can send the request; otherwise you receive an error, and the request is not sent. +The application is created with nested components. `ChildComponent` is the container that includes four components: `ResultComponent`, `ButtonComponent`, `InputComponent` and `ErrorComponent`. However, since we are testing our component as a black box, the architecture of our components doesn't change anything. You can create your test, change how the components are structured, and your tests should still pass. That's the goal of integration tests. Never test internal implementation details!!!. + +You can play with it by running : `npx nx serve testing-nested`. + +The file named `child.component.spec.ts` will let you test your application using [Angular Testing Library](https://testing-library.com/) . To run the test suites, you need to run `npx nx test testing-nested`. You can also install [Jest Runner](https://marketplace.visualstudio.com/items?itemName=firsttris.vscode-jest-runner) to execute your test by clicking on the `Run` button above each `describe` or `it` blocks. + +For testing with Cypress, you will execute your test inside the `child.component.cy.ts` and run `npx nx component-test testing-nested` to execute your test suites. You can add the `--watch` flag to execute your test in watch mode. + +# Statement + +The goal is to test multiple behaviors of the application describe inside each test files using [Angular Testing Library](https://testing-library.com/) and [Cypress Component Testing](https://docs.cypress.io/guides/component-testing/overview). + +:::note +I have created some `it` blocks but feel free to add more tests if you want. +::: diff --git a/website/src/content/challenges/testing/19-input-output.md b/website/src/content/challenges/testing/19-input-output.md new file mode 100644 index 000000000..d77db7eb0 --- /dev/null +++ b/website/src/content/challenges/testing/19-input-output.md @@ -0,0 +1,33 @@ +--- +title: 🟠 Input Output +description: Challenge 19 is about testing inputs and ouputs +author: thomas-laforge +contributors: + - tomalaforge + - tomer953 + - svenson95 + - jdegand + - LMFinney +challengeNumber: 19 +command: testing-input-output +sidebar: + order: 110 +--- + +## Information + +We have a small counter application that increments or decrements a number. The `CounterComponent` takes an initial value as an `@Input` and emits the result of the counter as an `@Output` when we click on the **Send** button. Since we are testing our component as a black box, we only have access to our inputs and listen to the output values. We should not rely on any internal implementation details!!! + +You can play with it by running : `npx nx serve testing-input-output`. + +The file named `counter.component.spec.ts` will let you test your application using [Angular Testing Library](https://testing-library.com/) . To run the test suites, you need to run `npx nx test testing-input-output`. You can also install [Jest Runner](https://marketplace.visualstudio.com/items?itemName=firsttris.vscode-jest-runner) to execute your test by clicking on the `Run` button above each `describe` or `it` blocks. + +For testing with Cypress, you will execute your test inside the `child.component.cy.ts` and run `npx nx component-test testing-input-output` to execute your test suites. You can add the `--watch` flag to execute your test in watch mode. + +# Statement + +The goal is to test multiple behaviors of the application described inside each test file using [Angular Testing Library](https://testing-library.com/) and [Cypress Component Testing](https://docs.cypress.io/guides/component-testing/overview). + +:::note +I have created some `it` blocks but feel free to add more tests if you want. +::: diff --git a/website/src/content/challenges/testing/20-modal.md b/website/src/content/challenges/testing/20-modal.md new file mode 100644 index 000000000..8a1d34c8b --- /dev/null +++ b/website/src/content/challenges/testing/20-modal.md @@ -0,0 +1,37 @@ +--- +title: 🟠 Modal +description: Challenge 20 is about testing modals +author: thomas-laforge +contributors: + - tomalaforge + - tomer953 + - svenson95 + - jdegand + - LMFinney +challengeNumber: 20 +command: testing-modal +sidebar: + order: 111 +--- + +## Information + +In this small application, you have an input prompting you to enter a name, and a **Confirm** button to submit your form. +If you enter a name, a confirmation modal will appear; otherwise an error modal will be displayed. +In the confirmation modal, if you click the **Confirm** button, a message confirming the submission of the form will appear. If the user clicks on **Cancel**, an error message will be displayed. + +The goal of this challenge is to test the dialogs inside your application. To do so, we will test the full application like an end-to-end test will do. This means, we will test the `AppComponent` as a black box and react to events on the page. No internal details should be tested. The difference between an e2e test and integration test is that we will mock all API calls. _(All http requests are faked inside this application, but this would not be the case in a real enterprise application.)_ + +You can play with it by running : `npx nx serve testing-modal`. + +The file named `app.component.spec.ts` will let you test your application using [Angular Testing Library](https://testing-library.com/) . To run the test suites, you need to run `npx nx test testing-modal`. You can also install [Jest Runner](https://marketplace.visualstudio.com/items?itemName=firsttris.vscode-jest-runner) to execute your test by clicking on the `Run` button above each `describe` or `it` blocks. + +For testing with Cypress, you will execute your test inside `app.component.cy.ts` and run `npx nx component-test testing-modal` to execute your test suites. You can add the `--watch` flag to execute your test in watch mode. + +# Statement + +The goal is to test multiple behaviors of the application described inside each test file using [Angular Testing Library](https://testing-library.com/) and [Cypress Component Testing](https://docs.cypress.io/guides/component-testing/overview). + +:::note +I have created some `it` blocks but feel free to add more tests if you want. +::: diff --git a/website/src/content/challenges/testing/23-harness.md b/website/src/content/challenges/testing/23-harness.md new file mode 100644 index 000000000..629ffdf5d --- /dev/null +++ b/website/src/content/challenges/testing/23-harness.md @@ -0,0 +1,30 @@ +--- +title: 🟢 Harness +description: Challenge 23 is about testing with component harnesses +author: thomas-laforge +contributors: + - tomalaforge + - tomer953 + - svenson95 + - jdegand + - LMFinney +challengeNumber: 23 +command: testing-harness +sidebar: + order: 9 +--- + +## Information + +A component harness is a class that lets a test interact with a component via a supported API. + +The objective of this challenge is to have a better understanding of the CDK test harness API. In this initial challenge, we will only use Angular Material's built-in harnesses. + +Documentation for CDK Component Harness is [here](https://material.angular.io/cdk/test-harnesses/overview#api-for-test-authors). +Documentation for Angular Material component is [here](https://material.angular.io/components/button/overview). + +## Statement + +Test the functionality of `child.component.ts`, which consists of some inputs & checkboxes related to a `mat-slider`. Implement the prepared test suite, but feel free to include additional tests as well. + +**Note:** You are welcome to use [Angular Testing Library](https://testing-library.com/) if you wish. diff --git a/website/src/content/challenges/testing/24-harness-creation.md b/website/src/content/challenges/testing/24-harness-creation.md new file mode 100644 index 000000000..d60456b01 --- /dev/null +++ b/website/src/content/challenges/testing/24-harness-creation.md @@ -0,0 +1,48 @@ +--- +title: 🟠 Harness Creation +description: Challenge 24 is about creating a component harness. +author: thomas-laforge +contributors: + - tomalaforge + - tomer953 + - jdegand +challengeNumber: 24 +command: testing-harness-creation +sidebar: + order: 112 +--- + +## Information + +The goal of this challenge is to create a test harness for `slider.component.ts`. The harness file, `slider.harness.ts`, has already been created. + +The following API needs to be implemented: + +```ts + async clickPlus(): Promise ; + + async clickMinus(): Promise; + + async getValue(): Promise ; + + async getMinValue(): Promise; + + async disabled(): Promise; + + async setValue(value: number): Promise; +``` + +Additionally, you should create a `HarnessPredicate` with the default predicate and the `minValue` property. + +```ts + static with( + this: ComponentHarnessConstructor, + options: SliderHarnessFilters = {} + ): HarnessPredicate; +``` + +Lastly, you will need to create the test suite for `app.component`. Some default tests have already been written, but feel free to add as many tests as you want and create as many harness methods as you need. + +> Angular Material documentation can be found [here](https://material.angular.io/cdk/test-harnesses/overview). + +Good luck !!! 💪 diff --git a/website/src/content/challenges/testing/28-checkbox.md b/website/src/content/challenges/testing/28-checkbox.md new file mode 100644 index 000000000..15b66eb73 --- /dev/null +++ b/website/src/content/challenges/testing/28-checkbox.md @@ -0,0 +1,30 @@ +--- +title: 🟢 Checkbox +description: Challenge 28 is about testing a simple checkbox +author: thomas-laforge +contributors: + - tomalaforge + - tomer953 + - jdegand + - LMFinney +challengeNumber: 28 +command: testing-checkbox +sidebar: + order: 10 +--- + +## Information + +This application is very simple. It consists of a checkbox that enables or disables a button. The primary goal of this application is to become familiar with the debug API of [Angular Testing Library](https://testing-library.com/). Knowing how to debug your tests is a crucial tool you need to have in your toolkit. + +You can find the documentation about debugging in Angular Testing Library [here](https://testing-library.com/docs/dom-testing-library/api-debugging#screenlogtestingplaygroundurl). + +The main functions to remember are as follows: + +- `logRoles(myDOMElement)`: prints out all ARIA roles within the tree of the given DOM element. ARIA roles are the primary selectors you should reach for in the first place. +- `screen.debug()` or `screen.debug(myDOMElement)`: prints the DOM inside the console. +- `screen.logTestingPlaygroundURL()` or `screen.logTestingPlaygroundURL(myDOMElement)`: this function is very powerful. It will create a playground to expose all elements, and you can interact with it to see the selectors you should choose for a DOM element. + +## Statement + +The goal of this challenge is not to submit an answer, but you can if you want. It's more about using the debugging API to play around. These tools will be of great help for the upcoming testing challenges. diff --git a/website/src/content/challenges/testing/29-real-life-application.md b/website/src/content/challenges/testing/29-real-life-application.md new file mode 100644 index 000000000..fdbb84407 --- /dev/null +++ b/website/src/content/challenges/testing/29-real-life-application.md @@ -0,0 +1,38 @@ +--- +title: 🔴 Real-life Application +description: Challenge 29 is about testing a real-life application +author: thomas-laforge +contributors: + - tomalaforge + - tomer953 + - svenson95 + - LMFinney +challengeNumber: 29 +command: testing-real-life-application +sidebar: + order: 205 +--- + +## Information + +This application presents a greater challenge because it closely resembles a real-life application that you might encounter in your day-to-day activities as an Angular developer. What makes it more difficult is the need to handle asynchronous tasks and create appropriate mocks. + +The application is a typical todo list application. You can filter tickets, create new ones, assign each ticket, close others, and navigate to the details of each ticket. + +In this challenge, you will write tests for the `ListComponent`, which represents the global view, and the `RowComponent`, which represents a specific ticket. Additionally, you will need to write unit tests for the `TicketStoreService` using [Angular Testing Library](https://testing-library.com/) . _This library allows you to test services effectively._ + +Handling asynchronous tasks will be particularly challenging. It's important not to introduce any explicit waits in your tests, as this would introduce unnecessary delays. Instead, it's better to look for an element that needs to appear or disappear from the DOM. In this case, the test will naturally wait for the correct period of time, as the waits are already implemented within both libraries. Take advantage of these built-in functionalities to create efficient and reliable tests. + +You can play with it by running : `npx nx serve testing-real-life-application`. + +To run [Angular Testing Library](https://testing-library.com/) test suites, you need to run `npx nx test testing-real-life-application`. You can also install [Jest Runner](https://marketplace.visualstudio.com/items?itemName=firsttris.vscode-jest-runner) to execute your test by clicking on the `Run` button above each `describe` or `it` blocks. + +For testing with Cypress, you will execute your test inside the `child.component.cy.ts` and run `npx nx component-test testing-real-life-application` to execute your test suites. You can add the `--watch` flag to execute your test in watch mode. + +# Statement + +The goal is to test multiple behaviors of the application describe inside each test files using [Angular Testing Library](https://testing-library.com/) and [Cypress Component Testing](https://docs.cypress.io/guides/component-testing/overview). + +:::note +I have created some `it` blocks but feel free to add more tests if you want. +::: diff --git a/website/src/content/challenges/testing/index.mdx b/website/src/content/challenges/testing/index.mdx new file mode 100644 index 000000000..0231ad2ed --- /dev/null +++ b/website/src/content/challenges/testing/index.mdx @@ -0,0 +1,74 @@ +--- +title: Testing +prev: false +next: false +contributors: + - tomalaforge + - LMFinney +description: Introduction to testing challenges. +noCommentSection: true +sidebar: + order: 1 +--- + +import { LinkCard } from '@astrojs/starlight/components'; + +Testing is a crucial step in building scalable, maintainable, and trustworthy applications. +Testing should never be avoided, even in the face of short deadlines or strong pressure from the product team. +Nowadays, there are numerous awesome tools available that make it easy to test your code and provide a great developer experience. + +In this series of testing exercises, we will learn and master [Angular Testing Library](https://testing-library.com/docs/) and [Cypress Component Testing](https://docs.cypress.io/guides/component-testing/angular/overview) that simplifies DOM manipulation for testing any Angular component. + +The benefits of using Angular Testing Library or Cypress Component Testing are to test your component as a black box. You will only interact with what the user can do on the UI. However, the difference with end-to-end tests is that the backend is mocked, which makes the tests faster and more maintainable. +The goal is to mock as little as possible to test your component at a higher level than unit testing, which will make refactoring easier. +Within a real application, integration tests are the tests you will write the most. Learning how to write them will make your application more robust and more maintainable. + +Here is a series of 8 challenges that you can take in any order. + + + + + + + + + + + + + + + + diff --git a/website/src/content/challenges/typescript/15-function-overload.md b/website/src/content/challenges/typescript/15-function-overload.md new file mode 100644 index 000000000..44d289a77 --- /dev/null +++ b/website/src/content/challenges/typescript/15-function-overload.md @@ -0,0 +1,27 @@ +--- +title: 🟠 Function Overload +description: Challenge 15 is about creating overload functions +author: thomas-laforge +contributors: + - tomalaforge + - LMFinney +challengeNumber: 15 +command: typescript-function-overload +blogLink: https://medium.com/ngconf/function-overloading-in-typescript-8236706b2c05 +sidebar: + order: 115 +--- + +## Information + +Angular uses TypeScript, and mastering TypeScript can help you avoid runtime errors by catching them at compile time. + +In this challenge, we have a function to create a vehicle. However, each vehicle type requires different mandatory properties. +Currently, we are getting an error at runtime if one property is missing, and we don't get the return Type, which is not ideal. +One solution would be to create a separate function for each vehicle type, but for this challenge, I want to use the same function and have TypeScript automatically complete the properties depending on the type passed as the first parameter. + +To achieve this, we will use overload functions. + +## Statement + +- Use function overload diff --git a/website/src/content/challenges/typescript/47-enums-vs-union-types.md b/website/src/content/challenges/typescript/47-enums-vs-union-types.md new file mode 100644 index 000000000..6ae54a72e --- /dev/null +++ b/website/src/content/challenges/typescript/47-enums-vs-union-types.md @@ -0,0 +1,80 @@ +--- +title: 🟢 Enums vs Union Types +description: Challenge 47 is about the comparison between enums and union types +author: sven-brodny +contributors: + - svenson95 + - jdegand + - LMFinney +challengeNumber: 47 +command: typescript-enums-vs-union-types +sidebar: + order: 18 +--- + +## Information + +[Enums](https://www.typescriptlang.org/docs/handbook/enums.html) allow developers to define a set of named constants that represent a specific type. TypeScript provides both numeric and string-based enums. + +```typescript +enum Difficulty { + EASY = 'EASY', + NORMAL = 'NORMAL', +} +``` + +On the other hand, [Union Types](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#union-types) are simpler than enums, as they don't require any additional runtime or compilation overhead. + +```typescript +type Difficulty = 'EASY' | 'NORMAL'; +``` + +### Reasons to use Union Types + +Enums are a concept borrowed from languages like C# and Java. TypeScript enums are compiled into JavaScript objects with keys for both the names and values of the enum members. This results in larger output files and additional memory consumption, which can be particularly problematic in performance-critical applications. + +Enums have some more pitfalls as well: + +- Non-const enums do not fit the concept of "a typed superset of JavaScript." They violate the concept by emitting global JavaScript objects that live in runtime with a syntax that is not compatible with JavaScript (JavaScript uses dynamic typing rather than static typing; enums are a form of static typing). Since JavaScript has no compilation step, there is little or no value in having static typing. +- Const enums, in contrast, cannot be transpiled with Babel. But there are workarounds for this issue, e.g., using the `babel-plugin-const-enum` plugin. The TypeScript documentation about [const enums](https://www.typescriptlang.org/docs/handbook/enums.html#const-enums) says "_Do not use const enums at all_". +- To use enums, you have to import them. If you want to use enum values in a template, you'll need to declare a variable in your component too. +- Numeric enums are not type safe ... + +```typescript +enum Difficulty { + EASY = 0, + NORMAL = 1, +} +const hard: Difficulty = 2; // no error +``` + +### Reasons to use Enums + +Enums are the best option for code maintainability. It is easy to find all usages of a value in a project and enforce constraints. If you stick to assigning strings to the enum keys all the time, you can avoid a lot of issues. + +It's true that enums produce larger output files, but that's not always a real problem. As long as the enum does its job without any problems, it shouldn't be something you care that much about. + +Another good thing is that the necessary enum prefixes add meaning to otherwise meaningless values, so they can improve readability. For example, `HttpStatus.Forbidden` gives more information than `Forbidden`. + +### Mapped types + +A [mapped type](https://learntypescript.dev/08/l2-mapped-type) is the process of creating a new type by mapping type information from an existing type. + +```typescript +type Difficulty = { [K in 'EASY' | 'NORMAL']: string }; +``` + +### Conclusion + +Enums are not redundant, but in most cases, union types are preferred. Unless you care a lot about maintainability, enums may fit better. Here are some more interesting articles discussing this subject: + +- [Should You Use Enums or Union Types in Typescript?](https://www.bam.tech/article/should-you-use-enums-or-union-types-in-typescript) +- [Typescript has unions, so are enums redundant?](https://stackoverflow.com/questions/40275832/typescript-has-unions-so-are-enums-redundant) +- [Tidy TypeScript: Prefer union types over enums](https://fettblog.eu/tidy-typescript-avoid-enums/) + +## Statement + +The goal of this challenge is to refactor the enums `Difficulty` and `Direction`. + +- Refactor the `Difficulty` enum to **union type**. +- Refactor the `Direction` enum to **mapped type**. diff --git a/website/src/content/guides/checkout-answer.md b/website/src/content/guides/checkout-answer.md new file mode 100644 index 000000000..2e56ce162 --- /dev/null +++ b/website/src/content/guides/checkout-answer.md @@ -0,0 +1,57 @@ +--- +title: Check out Somebody's Answer +description: Guide to checking out someone else's answer. +contributors: + - tomalaforge + - gsgonzalez88 + - 1fbr + - jdegand +sidebar: + order: 3 +--- + +All Angular Challenges answers will be presented in the form of a pull request (PR). To view and follow them, navigate through the **Files Changes** page on GitHub. However, understanding and following this process may not be straightforward if you are not familiar with the interface. In many cases, you may prefer to check out the branch and review the solution in your preferred IDE. + +## Install the GitHub CLI + +Follow the instructions for your operating system [here](https://github.com/cli/cli#installation). + +## Checkout a PR locally from someone else + +### Sync your repository + +First, you need to synchronize your fork to ensure it is up-to-date with the forked repository. + +This can be achieved by clicking the **Sync fork** button on the main page of your fork. + +![Sync project header](../../../assets/fork-sync.png) + +The image above shows that my branch is behind the main branch by 8 commits, and I need to synchronize it to be up to date. + +![Sync project update modal](../../../assets/sync-fork-update.png) + +### Checkout locally + +Navigate to the PR you wish to check out locally and obtain its ID. You will find it in the title of the PR (as shown below). + +![PR header](../../../assets/PR-header.png) + +Next, go to any terminal within your project directory and run the following command: + +```bash +gh pr checkout +``` + +If you don't remember the command, click on the Code button on the right side of the header, and you can easily copy/paste the command. + +![PR code modal](../../../assets/PR-code-btn-modal.png) + +:::note +If the command doesn't work or fails, GitHub CLI will guide you through the process. +::: + +🔥 You can now navigate through the solution locally and serve it to test it. 🔥 + +### Checkout with GitHub Codespaces + +You can checkout any **open** PR with GitHub Codespaces. After clicking the code button, you can navigate to the codespaces tab and click the green button to create a codespace on the PR's branch. After the codespace initializes, you can serve the app. diff --git a/website/src/content/guides/contribute.md b/website/src/content/guides/contribute.md new file mode 100644 index 000000000..45f164a4f --- /dev/null +++ b/website/src/content/guides/contribute.md @@ -0,0 +1,25 @@ +--- +title: Contribute +description: Guide to contribute +contributors: + - tomalaforge + - jdegand +sidebar: + order: 4 +--- + +You can contribute to this repository in many ways: + +🔥 Create a new challenge by following these [instructions](/guides/create-challenge). + +🔥 Answer challenges and submit the results (guide [here](/guides/resolve-challenge)). + +🔥 Give caring, constructive feedback on other people's solutions. + +🔥 Correct typos within the documentation. + +🔥 Assist with the documentation's translation. + +🔥 File an issue to suggest new challenge ideas or report a bug. + +🔥 Sponsor the project [here](https://github.com/sponsors/tomalaforge). diff --git a/website/src/content/guides/create-challenge.md b/website/src/content/guides/create-challenge.md new file mode 100644 index 000000000..4b01d6bb8 --- /dev/null +++ b/website/src/content/guides/create-challenge.md @@ -0,0 +1,66 @@ +--- +title: Create your own challenge +description: Guide to create your own challenge +contributors: + - tomalaforge + - gsgonzalez88 + - jdegand +sidebar: + order: 5 +--- + +You have an idea you want to share, an interesting bug you are struggling with in one of your private or side projects, or an Angular trick you discovered. All of these possibilities are a good starting point to create a challenge and share the solution with others. + +How do you start creating these challenges? + +## Boilerplate Setup + +To streamline the process, I have created an Nx generator that will set up all the boilerplate for you. The easiest way to run it is by using the Nx console: go to the Nx Console > generate > @angular-challenges/cli - challenge. + +Alternatively, you may utilize your IDE's [Nx Console extension](https://nx.dev/getting-started/editor-setup) to generate the files. + +### Parameters + +#### mandatory parameters + +- title: The title you want to give to your challenge. + :::note + The title must be a maximum of 25 characters. + ::: + +- author: Your name + :::note + Your name should be in kebab-case. (e.g. john-doe) + ::: + :::note + Don't forget to update your personal information inside the file at your name. + ::: + +- challengeDifficulty: The difficulty you think your challenge has. There are three difficulty levels : 🟢 easy / 🟠 medium / 🔴 hard + +- docRepository: The category of your Challenge is Nx, Angular, Angular Performance, Rxjs, NgRx, Typescript, Forms or Signals. + +#### optional parameters + +- challengeNumber: You can specify a challenge number if a challenge is being submitted. (If empty, the number will be the next one). +- directory: If you want your application to be located in a specific folder inside `apps`. +- addTest: If you want to add test configuration. + +### What is created? + +- The generator will create all the files needed to have a new working application. All these files will be created inside `apps/${directory}/${name}`. +- A Markdown file with minimal setup will be created inside `docs/src/content/docs/challenges/${docRepository}`. + +## Challenge Creation + +The only thing left to do is create your challenge. 🚀 + +:::danger +Don't forget to update the docs to introduce your challenge and provide your instructions. +::: + +It's your turn to act!!! 💪 + +## Solution Submission + +After one week or so, provide a pull request of your solution to your challenge. diff --git a/website/src/content/guides/faq.md b/website/src/content/guides/faq.md new file mode 100644 index 000000000..524e0f1e1 --- /dev/null +++ b/website/src/content/guides/faq.md @@ -0,0 +1,20 @@ +--- +title: FAQ +description: Answer to question +contributors: + - tomalaforge + - jdegand +sidebar: + order: 7 +--- + +
+ Why is my application not starting, or why do I encounter errors in my terminal when I run `nx serve`? + + Most of the time, this issue arises because your node_modules are outdated, and you need to update them by running `pnpm i --frozen-lockfile`. + +If the installation process fails, you can resolve it by deleting your node_modules folder using the command `rm -rf node_modules` or `npx npkill` and then re-running `pnpm i --frozen-lockfile`. + +If the problem persists, please report the issue [here](https://github.com/tomalaforge/angular-challenges/issues/new). + +
diff --git a/website/src/content/guides/getting-started.md b/website/src/content/guides/getting-started.md new file mode 100644 index 000000000..fdebab874 --- /dev/null +++ b/website/src/content/guides/getting-started.md @@ -0,0 +1,82 @@ +--- +title: Getting Started +description: A guide on how to get started with Angular Challenges. +contributors: + - tomalaforge + - 1fbr + - ho-ssain + - jdegand +sidebar: + order: 1 +--- + +To get started with Angular Challenges, follow these steps: + +## Create a GitHub Account + +If you wish to submit an answer, you will need to have your own GitHub account. Additionally, having a GitHub account is always beneficial, and it's free. + +## Fork the GitHub project + +Navigate to the [Angular Challenges Repository](https://github.com/tomalaforge/angular-challenges) and click on the Fork button in the header. This will create a copy of this repository on your own GitHub profile. + +## Clone the repository to your local machine + +Select a directory on your local computer and clone this repository. + +Open a terminal, navigate to the chosen directory, and type the following command: + +```bash +git clone https://github.com/[YOUR_GITHUB_NAME]/angular-challenges.git +``` + +:::note +You can find the clone URL by clicking on the <> Code button in your own instance of the Angular Challenges repository. + +![Header of GitHub workspace](../../../assets/header-github.png) + +::: + +## Open the project in your favourite IDE + +Open the project in any IDE of your choice. + +## Install all dependencies + +```bash +pnpm i --frozen-lockfile +``` + +## Choose a challenge + +Your project is now up and running. The only remaining step is to choose a challenge 🚀 + +Each challenge consists of: + +- Name: indicating what the challenge is about. +- Number: order of creation. The number doesn't have any particular meaning but helps for reference in GitHub Pull Request section. +- Badge: helps visualize the degree of difficulty. It's entirely subjective 😅 + - 🟢 easy + - 🟠 medium + - 🔴 difficult + +## (Alternately) Use GitHub Codespaces + +From your own instance of the Angular Challenges repository, click the code button and navigate to the codespaces tab. + +![Codespaces tab](../../../assets/codespaces.png) + +Click the `Create codespace on main` button, and you will navigate to a GitHub codespace. + +If you never used a GitHub codespace before, I would recommend you try this short interactive [GitHub Skills Tutorial](https://github.com/skills/code-with-codespaces). + +When you navigate to the codespace, there will be a prompt to install the recommended `VS Code` plugins. If you plan on creating a challenge, you can use the `Nx plugin` to generate the starter code. Either way, the codespace will install the dependencies, and you can create a new branch, tackle any challenge, and create a pull request. + +When you push to a branch, you do not have to provide a GitHub token. + +Once you are finished, remember to pause or delete your codespace. If you don't, GitHub will automatically pause an idle codespace after 30 minutes. You do have a generous amount of free codespace time per month, but it is still important not to waste your allotment. + +In the GitHub codespace, copy and paste will be blocked until you give permission. + +The GitHub codespace uses port forwarding to serve the projects. Click the prompt after running `npx nx serve [project-name]` to navigate to `localhost:4200`. diff --git a/website/src/content/guides/rebase.md b/website/src/content/guides/rebase.md new file mode 100644 index 000000000..e91badfb6 --- /dev/null +++ b/website/src/content/guides/rebase.md @@ -0,0 +1,57 @@ +--- +title: Rebase your branch +description: Guide to rebase a branch to latest change +contributors: + - tomalaforge +sidebar: + order: 6 +--- + +Sometimes, changes may be added to the project. I'll attempt to make changes that won't break anything, but sometimes it's inevitable. + +Most of the time, you won't need to rebase your solution, but here is a guide to help you know how to do it. + +:::note +This guide is applicable to any Open Source Project. +::: + +## Steps to rebase your branch + +### Sync your repository + +First, you need to synchronize your fork to ensure it's up to date with the forked repository. + +You can achieve this by clicking the Sync fork button on the main page of your fork. + +![Sync project header](../../../assets/fork-sync.png) + +The image above shows that my branch is behind of the main branch by 8 commits, and I need to synchronize it to be up to date. + +![Sync project update modal](../../../assets/sync-fork-update.png) + +### Open a terminal + +Open any terminal of your choice, either the one from your favorite IDE or a standalone instance. + +### Git + +Follow the following commands to rebase your local branch: + +- git checkout main +- git pull +- git checkout [your branch] +- git rebase main +- Resolve Conflicts + +At this step, the rebase may stop because your local branch has conflicting files with the main branch. Correct them. After this is done: + +- git add . +- git rebase --continue + +If your branch doesn't have any conflicts, a success message will be shown. + +### Push your work back to the remote branch + +Finally, push your work back to GitHub: + +- git push -f diff --git a/website/src/content/guides/resolve-challenge.md b/website/src/content/guides/resolve-challenge.md new file mode 100644 index 000000000..0d3b345fd --- /dev/null +++ b/website/src/content/guides/resolve-challenge.md @@ -0,0 +1,110 @@ +--- +title: Resolve a Challenge +description: Guide to resolve a challenge +contributors: + - tomalaforge + - 1fbr + - gsgonzalez88 +sidebar: + order: 2 +--- + +In this guide, you will learn how to resolve a challenge and submit an answer to the main GitHub repository. + +## Introduction + +This repository is powered by [Nx](https://nx.dev/getting-started/intro). Nx is a monorepository that allows you to store multiple applications inside the same workspace. Each challenge is a separate application. If you open the `apps` directory, you will find multiple directories, each related to a specific challenge. Each directory represents a complete standalone `Nx` application. To run and start with one, open your terminal and run: + +```bash +npx nx serve +``` + +:::note +If you are unsure of your `APPLICATION_NAME`, open the README.md file. The `serve` command is written there, with a link to the challenge documentation. +::: + +:::note +If `nx` is installed globally on your device, you can skip using `pnpm exec`. + +To install `nx` globally, run + +```bash +pnpm add -g nx +``` + +or + +```bash +npm i -g nx +``` + +::: + +## Create a Git Branch + +Before you start implementing your solution to resolve a challenge, create a git branch to commit your work. + +```bash +git checkout -b +``` + +## Resolve the Challenge + +Follow the instructions to resolve the challenge. + +## Commit and Push your Work + +The last step is to commit your work following the [Conventional Guidelines](https://www.conventionalcommits.org/en/v1.0.0/). + +Finally, push your work to the remote repository with the following command + +```bash + git push --set-upstream origin +``` + +:::tip[Don't remember it] +You don't have to remember the command precisely. You just need to remember `git push` and if it's the first time you are pushing this branch, `git` will provide you with the complete command. +::: + +## Submit your Work to the Main Repository + +Now, all your work is located insite your local instance of the Angular Challenges repository. + +The next step is to go to the main [Angular Challenges page](https://github.com/tomalaforge/angular-challenges) and create a new Pull Request. + +GitHub should display a notification header to help you create the pull request. + +If it's not the case, you either have done one of the previous steps incorrectly or you can go to the Pull Request tab and click the button New pull request. + +Once you have chosen the two branches to compare, you should arrive on the following page: + +![New pull request screen](../../../assets/new-pull-request.png) + +In the title section, start with Answer: followed by your challenge number. After that, you are free to add anything you would like. + +:::danger +This is very important. It lets others know which challenge you are attempting to resolve. +::: + +In the description section, you can add questions, troubles you encountered, or anything else you want to share. You can leave it empty if you don't have anything to say. + +You can now click on Create pull request. + +## Get a review + +To continue providing valuable feedback and reviews, support the project on Github: + +
    +
  • $5 per review
  • +
  • $30 for lifetime reviews
  • +
+ +:::note +You should still submit your PR to join the list of answered challenges. And you can still be reviewed by a community member. 🔥 + +Everyone is welcome to comment and read other PRs. 💪 +::: + +:::tip[OSS champion] +🔥 Once you have completed this tutorial, you are ready to contribute to any other public GitHub repository and submit a PR. It is as easy as that. 🔥 +::: diff --git a/website/src/index.html b/website/src/index.html new file mode 100644 index 000000000..5e367d2e1 --- /dev/null +++ b/website/src/index.html @@ -0,0 +1,22 @@ + + + + + Angular Challenges + + + + + + + + + + + + diff --git a/website/src/main.server.ts b/website/src/main.server.ts new file mode 100644 index 000000000..723e001fb --- /dev/null +++ b/website/src/main.server.ts @@ -0,0 +1,8 @@ +import { BootstrapContext, bootstrapApplication } from '@angular/platform-browser'; +import { App } from './app/app'; +import { config } from './app/app.config.server'; + +const bootstrap = (context: BootstrapContext) => + bootstrapApplication(App, config, context); + +export default bootstrap; diff --git a/website/src/main.ts b/website/src/main.ts new file mode 100644 index 000000000..5df75f9c8 --- /dev/null +++ b/website/src/main.ts @@ -0,0 +1,6 @@ +import { bootstrapApplication } from '@angular/platform-browser'; +import { appConfig } from './app/app.config'; +import { App } from './app/app'; + +bootstrapApplication(App, appConfig) + .catch((err) => console.error(err)); diff --git a/website/src/server.ts b/website/src/server.ts new file mode 100644 index 000000000..f1cf30179 --- /dev/null +++ b/website/src/server.ts @@ -0,0 +1,83 @@ +import { + AngularNodeAppEngine, + createNodeRequestHandler, + isMainModule, + writeResponseToNodeResponse, +} from '@angular/ssr/node'; +import express from 'express'; +import { join } from 'node:path'; +import { githubApi } from './server/github-api'; +import { authRoutes } from './server/auth'; + +const browserDistFolder = join(import.meta.dirname, '../browser'); + +const app = express(); +// Custom domains can be added later via the NG_ALLOWED_HOSTS env var (takes precedence). +const angularApp = new AngularNodeAppEngine({ + allowedHosts: ['localhost', '*.vercel.app'], +}); + +/** + * Example Express Rest API endpoints can be defined here. + * Uncomment and define endpoints as necessary. + * + * Example: + * ```ts + * app.get('/api/{*splat}', (req, res) => { + * // Handle API request + * }); + * ``` + */ + +/** + * JSON API backed by the GitHub REST API (cached server-side). + */ +app.use('/api', githubApi); + +/** + * GitHub OAuth sign-in flow (sets an httpOnly cookie). + */ +app.use('/auth', authRoutes); + +/** + * Serve static files from /browser + */ +app.use( + express.static(browserDistFolder, { + maxAge: '1y', + index: false, + redirect: false, + }), +); + +/** + * Handle all other requests by rendering the Angular application. + */ +app.use((req, res, next) => { + angularApp + .handle(req) + .then((response) => + response ? writeResponseToNodeResponse(response, res) : next(), + ) + .catch(next); +}); + +/** + * Start the server if this module is the main entry point, or it is ran via PM2. + * The server listens on the port defined by the `PORT` environment variable, or defaults to 4000. + */ +if (isMainModule(import.meta.url) || process.env['pm_id']) { + const port = process.env['PORT'] || 4000; + app.listen(port, (error) => { + if (error) { + throw error; + } + + console.log(`Node Express server listening on http://localhost:${port}`); + }); +} + +/** + * Request handler used by the Angular CLI (for dev-server and during build) or Firebase Cloud Functions. + */ +export const reqHandler = createNodeRequestHandler(app); diff --git a/website/src/server/auth.ts b/website/src/server/auth.ts new file mode 100644 index 000000000..3709798c6 --- /dev/null +++ b/website/src/server/auth.ts @@ -0,0 +1,82 @@ +import { Router, Request } from 'express'; + +export const AUTH_COOKIE = 'gh_token'; + +export function readAuthCookie(req: Request): string | null { + const header = req.headers.cookie; + if (!header) { + return null; + } + for (const part of header.split(';')) { + const [name, ...rest] = part.trim().split('='); + if (name === AUTH_COOKIE) { + return decodeURIComponent(rest.join('=')); + } + } + return null; +} + +function siteOrigin(req: Request): string { + const host = req.headers['x-forwarded-host'] ?? req.headers.host ?? 'localhost:4000'; + const proto = String(host).startsWith('localhost') ? 'http' : 'https'; + return `${proto}://${host}`; +} + +/** Only same-site paths are allowed as post-login redirect targets. */ +function safePath(value: unknown): string { + const path = String(value ?? '/'); + return path.startsWith('/') && !path.startsWith('//') ? path : '/'; +} + +export const authRoutes = Router(); + +authRoutes.get('/authorize', (req, res) => { + const clientId = process.env['GITHUB_CLIENT_ID']; + if (!clientId) { + res.status(503).send('GitHub sign-in is not configured yet (missing GITHUB_CLIENT_ID).'); + return; + } + const params = new URLSearchParams({ + client_id: clientId, + redirect_uri: `${siteOrigin(req)}/auth/callback`, + scope: 'public_repo', + state: safePath(req.query['redirect_uri']), + }); + res.redirect(302, `https://github.com/login/oauth/authorize?${params}`); +}); + +authRoutes.get('/callback', async (req, res) => { + const clientId = process.env['GITHUB_CLIENT_ID']; + const clientSecret = process.env['GITHUB_CLIENT_SECRET']; + const returnTo = safePath(req.query['state']); + const code = req.query['code']; + + if (!clientId || !clientSecret || !code || req.query['error']) { + res.redirect(302, returnTo); + return; + } + + try { + const response = await fetch('https://github.com/login/oauth/access_token', { + method: 'POST', + headers: { Accept: 'application/json', 'Content-Type': 'application/json' }, + body: JSON.stringify({ client_id: clientId, client_secret: clientSecret, code }), + }); + const data = (await response.json()) as { access_token?: string }; + if (data.access_token) { + const secure = siteOrigin(req).startsWith('https') ? '; Secure' : ''; + res.setHeader( + 'Set-Cookie', + `${AUTH_COOKIE}=${encodeURIComponent(data.access_token)}; Path=/; HttpOnly; SameSite=Lax; Max-Age=${60 * 60 * 24 * 7}${secure}`, + ); + } + } catch { + // Fall through: user comes back logged out. + } + res.redirect(302, returnTo); +}); + +authRoutes.get('/logout', (req, res) => { + res.setHeader('Set-Cookie', `${AUTH_COOKIE}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`); + res.redirect(302, safePath(req.query['redirect_uri'])); +}); diff --git a/website/src/server/github-api.ts b/website/src/server/github-api.ts new file mode 100644 index 000000000..861c2c2d7 --- /dev/null +++ b/website/src/server/github-api.ts @@ -0,0 +1,450 @@ +import { Router } from 'express'; +import { readAuthCookie } from './auth'; + +const REPO = 'tomalaforge/angular-challenges'; +const REPO_FIRST_YEAR = 2022; +const EXCLUDED_USERS = new Set(['allcontributors[bot]', 'tomalaforge']); +const GITHUB_API = 'https://api.github.com'; + +/** Tiny in-memory TTL cache — enough to stay far below GitHub rate limits. */ +const cache = new Map(); + +async function github(path: string, ttlSeconds: number): Promise<{ status: number; data: unknown }> { + const cached = cache.get(path); + if (cached && cached.expires > Date.now()) { + return cached; + } + const headers: Record = { + Accept: 'application/vnd.github+json', + 'X-GitHub-Api-Version': '2022-11-28', + 'User-Agent': 'angular-challenges-website', + }; + const token = process.env['GITHUB_TOKEN']; + if (token) { + headers['Authorization'] = `Bearer ${token}`; + } + const response = await fetch(`${GITHUB_API}${path}`, { headers }); + const data = await response.json(); + const entry = { status: response.status, data, expires: Date.now() + ttlSeconds * 1000 }; + if (response.ok) { + cache.set(path, entry); + } else if (cached) { + // Serve stale data instead of surfacing a rate-limit error. + return cached; + } + return entry; +} + +interface GithubLabel { + name: string; +} + +/** Maps items concurrently, at most `limit` at a time. */ +async function mapLimit( + items: T[], + limit: number, + fn: (item: T) => Promise, +): Promise { + const results: R[] = new Array(items.length); + let next = 0; + const workers = Array.from({ length: Math.min(limit, items.length) }, async () => { + while (next < items.length) { + const index = next++; + results[index] = await fn(items[index]); + } + }); + await Promise.all(workers); + return results; +} + +/** + * Runs a search query across all result pages, concurrently but capped to + * stay clear of GitHub's secondary rate limits. The search API caps a single + * query at 1000 results (10 pages), so the query is additionally partitioned + * per creation year; each year's page 1 reveals via total_count how many more + * pages need fetching. + */ +async function searchAllIssues(baseQuery: string, ttlSeconds: number): Promise { + const currentYear = new Date().getFullYear(); + const years = Array.from( + { length: currentYear - REPO_FIRST_YEAR + 1 }, + (_, i) => REPO_FIRST_YEAR + i, + ); + const pageUrl = (year: number, page: number) => { + const query = encodeURIComponent( + `repo:${REPO} is:pr ${baseQuery} created:${year}-01-01..${year}-12-31`, + ); + return `/search/issues?q=${query}&per_page=100&page=${page}`; + }; + + const firstPages = await mapLimit(years, 4, (year) => github(pageUrl(year, 1), ttlSeconds)); + + const items: any[] = []; + const remaining: string[] = []; + for (const [index, { status, data }] of firstPages.entries()) { + if (status !== 200) { + return null; + } + const { items: batch = [], total_count: total = 0 } = data as { + items: any[]; + total_count: number; + }; + items.push(...batch); + const pageCount = Math.min(Math.ceil(total / 100), 10); + for (let page = 2; page <= pageCount; page++) { + remaining.push(pageUrl(years[index], page)); + } + } + + const restPages = await mapLimit(remaining, 4, (url) => github(url, ttlSeconds)); + for (const { status, data } of restPages) { + if (status !== 200) { + return null; + } + items.push(...((data as { items: any[] }).items ?? [])); + } + return items; +} + +interface LeaderboardEntry { + login: string; + avatar: string; + count: number; +} + +function toLeaderboard( + counts: Map }>, +): LeaderboardEntry[] { + return [...counts.entries()] + .filter(([login]) => !EXCLUDED_USERS.has(login)) + .map(([login, entry]) => ({ login, avatar: entry.avatar, count: entry.values.size })) + .sort((a, b) => b.count - a.count); +} + +function accumulate( + counts: Map }>, + item: any, + value: string | number, +): void { + const login = item.user?.login; + if (!login) { + return; + } + const entry = counts.get(login) ?? { avatar: item.user.avatar_url, values: new Set() }; + entry.values.add(value); + counts.set(login, entry); +} + +export const githubApi = Router(); + +/** The signed-in user, based on the auth cookie. */ +githubApi.get('/me', async (req, res) => { + const token = readAuthCookie(req); + if (!token) { + res.status(401).json({ error: 'not signed in' }); + return; + } + const response = await fetch('https://api.github.com/user', { + headers: { + Accept: 'application/vnd.github+json', + Authorization: `Bearer ${token}`, + 'User-Agent': 'angular-challenges-website', + }, + }); + if (!response.ok) { + res.status(401).json({ error: 'invalid token' }); + return; + } + const user = (await response.json()) as any; + res.set('Cache-Control', 'private, no-store'); + res.json({ login: user.login, avatar: user.avatar_url }); +}); + +/** 👍 a solution PR on behalf of the signed-in user. */ +githubApi.post('/pulls/:number/react', async (req, res) => { + const token = readAuthCookie(req); + if (!token) { + res.status(401).json({ error: 'not signed in' }); + return; + } + const number = Number(req.params['number']); + if (!Number.isInteger(number) || number <= 0) { + res.status(400).json({ error: 'invalid PR number' }); + return; + } + const response = await fetch( + `https://api.github.com/repos/${REPO}/issues/${number}/reactions`, + { + method: 'POST', + headers: { + Accept: 'application/vnd.github+json', + Authorization: `Bearer ${token}`, + 'User-Agent': 'angular-challenges-website', + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ content: '+1' }), + }, + ); + if (!response.ok) { + res.status(response.status).json({ error: 'reaction failed' }); + return; + } + res.status(201).json({ ok: true }); +}); + +const BOARD_QUERIES: Record = { + answers: 'label:"answer"', + challenges: 'label:"challenge-creation"', + commit: 'no:label', +}; + +async function buildLeaderboard(board: string): Promise { + const items = await searchAllIssues(BOARD_QUERIES[board], 1800); + if (!items) { + return null; + } + const counts = new Map }>(); + for (const item of items) { + if (board === 'answers') { + const challenge = item.labels + ?.map((l: GithubLabel) => Number(l.name)) + .find((n: number) => Number.isInteger(n) && n > 0); + if (challenge) { + accumulate(counts, item, challenge); + } + } else { + accumulate(counts, item, item.number); + } + } + return toLeaderboard(counts); +} + +/** + * Aggregated leaderboards with stale-while-revalidate semantics: a stale + * board is served immediately while a single refresh runs in the background. + */ +const boardCache = new Map(); +const boardRefreshing = new Map>(); +const BOARD_TTL_MS = 30 * 60 * 1000; + +function refreshBoard(board: string): Promise { + let inflight = boardRefreshing.get(board); + if (!inflight) { + inflight = buildLeaderboard(board) + .then((entries) => { + if (entries) { + boardCache.set(board, { expires: Date.now() + BOARD_TTL_MS, entries }); + } + return entries; + }) + .finally(() => boardRefreshing.delete(board)); + boardRefreshing.set(board, inflight); + } + return inflight; +} + +/** Leaderboards, aggregated server-side and cached for 30 minutes. */ +githubApi.get('/leaderboard/:board', async (req, res) => { + const board = req.params['board']; + if (!BOARD_QUERIES[board]) { + res.status(404).json({ error: 'unknown leaderboard' }); + return; + } + + const cached = boardCache.get(board); + if (cached) { + if (cached.expires <= Date.now()) { + // Stale: kick off one background refresh, still answer instantly. + void refreshBoard(board).catch(() => undefined); + } + res.set('Cache-Control', 'public, s-maxage=1800, stale-while-revalidate=86400'); + res.json({ entries: cached.entries }); + return; + } + + const entries = await refreshBoard(board); + if (!entries) { + res.status(503).json({ error: 'github request failed' }); + return; + } + res.set('Cache-Control', 'public, s-maxage=1800, stale-while-revalidate=86400'); + res.json({ entries }); +}); + +/** Repository stats for the landing page. */ +githubApi.get('/stats', async (_req, res) => { + const { status, data } = await github(`/repos/${REPO}`, 900); + if (status !== 200) { + res.status(503).json({ error: 'github request failed' }); + return; + } + const repo = data as any; + res.set('Cache-Control', 'public, s-maxage=900, stale-while-revalidate=3600'); + res.json({ + stars: repo.stargazers_count, + forks: repo.forks_count, + openIssues: repo.open_issues_count, + }); +}); + +/** Active sponsors (needs a GITHUB_TOKEN with sponsorship read access). */ +githubApi.get('/sponsors', async (_req, res) => { + const token = process.env['GITHUB_TOKEN']; + if (!token) { + res.set('Cache-Control', 'public, s-maxage=900'); + res.json({ sponsors: [] }); + return; + } + const cached = cache.get('sponsors'); + if (cached && cached.expires > Date.now()) { + res.set('Cache-Control', 'public, s-maxage=900, stale-while-revalidate=86400'); + res.json(cached.data); + return; + } + const query = `query { + user(login: "tomalaforge") { + sponsorshipsAsMaintainer(activeOnly: true, first: 100) { + nodes { + sponsorEntity { + ... on User { login avatarUrl } + ... on Organization { login avatarUrl } + } + } + } + } + }`; + try { + const response = await fetch('https://api.github.com/graphql', { + method: 'POST', + headers: { + Authorization: `Bearer ${token}`, + 'Content-Type': 'application/json', + 'User-Agent': 'angular-challenges-website', + }, + body: JSON.stringify({ query }), + }); + const data = (await response.json()) as any; + if (data?.errors) { + console.error('sponsors graphql failed', JSON.stringify(data.errors)); + res.status(503).json({ error: data.errors[0]?.message ?? 'graphql failed' }); + return; + } + const sponsors = + data?.data?.user?.sponsorshipsAsMaintainer?.nodes + ?.map((n: any) => n?.sponsorEntity) + .filter(Boolean) + .map((s: any) => ({ login: s.login, avatar: s.avatarUrl })) ?? []; + const payload = { sponsors }; + cache.set('sponsors', { expires: Date.now() + 900_000, status: 200, data: payload }); + res.set('Cache-Control', 'public, s-maxage=900, stale-while-revalidate=86400'); + res.json(payload); + } catch { + res.status(503).json({ error: 'github request failed' }); + } +}); + +/** All solution PRs for a challenge, author solutions first, then by 👍. */ +githubApi.get('/challenges/:number/solutions', async (req, res) => { + const number = Number(req.params['number']); + if (!Number.isInteger(number) || number <= 0) { + res.status(400).json({ error: 'invalid challenge number' }); + return; + } + const query = encodeURIComponent(`repo:${REPO} is:pr label:${number}`); + const { status, data } = await github( + `/search/issues?q=${query}&per_page=100&sort=reactions-+1&order=desc`, + 300, + ); + if (status !== 200) { + res.status(status === 403 ? 503 : status).json({ error: 'github request failed' }); + return; + } + const items = (data as { items: any[] }).items ?? []; + const solutions = items + .filter((item) => + item.labels?.some((l: GithubLabel) => l.name === 'answer' || l.name === 'answer author'), + ) + .map((item) => ({ + number: item.number, + title: item.title, + login: item.user?.login, + avatar: item.user?.avatar_url, + isAuthor: item.labels.some((l: GithubLabel) => l.name === 'answer author'), + state: item.state, + merged: !!item.pull_request?.merged_at, + thumbsUp: item.reactions?.['+1'] ?? 0, + comments: item.comments ?? 0, + createdAt: item.created_at, + htmlUrl: item.html_url, + })) + .sort((a, b) => Number(b.isAuthor) - Number(a.isAuthor) || b.thumbsUp - a.thumbsUp); + + res.set('Cache-Control', 'public, s-maxage=300, stale-while-revalidate=600'); + res.json({ solutions }); +}); + +/** PR metadata for the diff header. */ +githubApi.get('/pulls/:number', async (req, res) => { + const number = Number(req.params['number']); + if (!Number.isInteger(number) || number <= 0) { + res.status(400).json({ error: 'invalid PR number' }); + return; + } + const { status, data } = await github(`/repos/${REPO}/pulls/${number}`, 3600); + if (status !== 200) { + res.status(status === 403 ? 503 : status).json({ error: 'github request failed' }); + return; + } + const pr = data as any; + res.set('Cache-Control', 'public, s-maxage=3600, stale-while-revalidate=86400'); + res.json({ + number: pr.number, + title: pr.title, + login: pr.user?.login, + avatar: pr.user?.avatar_url, + state: pr.state, + merged: pr.merged, + createdAt: pr.created_at, + htmlUrl: pr.html_url, + additions: pr.additions, + deletions: pr.deletions, + changedFiles: pr.changed_files, + }); +}); + +/** Changed files with patches for the diff view. */ +githubApi.get('/pulls/:number/files', async (req, res) => { + const number = Number(req.params['number']); + if (!Number.isInteger(number) || number <= 0) { + res.status(400).json({ error: 'invalid PR number' }); + return; + } + const files: any[] = []; + for (let page = 1; page <= 3; page++) { + const { status, data } = await github( + `/repos/${REPO}/pulls/${number}/files?per_page=100&page=${page}`, + 3600, + ); + if (status !== 200) { + res.status(status === 403 ? 503 : status).json({ error: 'github request failed' }); + return; + } + const batch = data as any[]; + files.push(...batch); + if (batch.length < 100) { + break; + } + } + res.set('Cache-Control', 'public, s-maxage=3600, stale-while-revalidate=86400'); + res.json({ + files: files.map((f) => ({ + filename: f.filename, + previousFilename: f.previous_filename, + status: f.status, + additions: f.additions, + deletions: f.deletions, + patch: f.patch ?? null, + blobUrl: f.blob_url, + })), + }); +}); diff --git a/website/src/styles.css b/website/src/styles.css new file mode 100644 index 000000000..e513796ae --- /dev/null +++ b/website/src/styles.css @@ -0,0 +1,167 @@ +@import 'tailwindcss'; +@plugin '@tailwindcss/typography'; + +/* --- Markdown document styling ------------------------------------------ */ + +/* Inline code: drop the literal backticks Tailwind Typography renders and + style it as a highlighted chip instead. */ +.doc-prose :where(code):not(:where(pre code))::before, +.doc-prose :where(code):not(:where(pre code))::after { + content: none; +} + +.doc-prose :where(code):not(:where(pre code)) { + background: color-mix(in srgb, var(--color-neutral-800) 70%, transparent); + border: 1px solid var(--color-neutral-700); + border-radius: 0.375rem; + padding: 0.125rem 0.375rem; + font-size: 0.85em; + font-weight: 500; + color: var(--color-neutral-100); +} + +.doc-prose pre.shiki { + border-radius: 0.5rem; + padding: 1rem; + overflow-x: auto; + font-size: 0.875rem; + line-height: 1.6; + border: 1px solid var(--color-neutral-800); +} + +.doc-prose .doc-aside { + border: 1px solid; + border-radius: 0.5rem; + padding: 1rem; + margin: 1.25rem 0; +} + +.doc-prose .doc-aside__title { + font-weight: 600; + margin: 0 0 0.5rem; +} + +.doc-prose .doc-aside__content > :first-child { + margin-top: 0; +} +.doc-prose .doc-aside__content > :last-child { + margin-bottom: 0; +} + +.doc-prose .doc-aside--note { + border-color: var(--color-blue-800); + background: color-mix(in srgb, var(--color-blue-950) 40%, transparent); +} +.doc-prose .doc-aside--tip { + border-color: var(--color-violet-800); + background: color-mix(in srgb, var(--color-violet-950) 40%, transparent); +} +.doc-prose .doc-aside--caution { + border-color: var(--color-amber-800); + background: color-mix(in srgb, var(--color-amber-950) 40%, transparent); +} +.doc-prose .doc-aside--danger { + border-color: var(--color-red-800); + background: color-mix(in srgb, var(--color-red-950) 40%, transparent); +} + +.doc-prose a.doc-linkcard { + display: block; + border: 1px solid var(--color-neutral-800); + border-radius: 0.5rem; + padding: 1rem 1.25rem; + margin: 0.75rem 0; + text-decoration: none; + transition: border-color 150ms; +} +.doc-prose a.doc-linkcard:hover { + border-color: var(--color-pink-600); +} +.doc-prose a.doc-linkcard strong { + display: block; + margin-bottom: 0.25rem; +} +.doc-prose a.doc-linkcard span { + color: var(--color-neutral-400); + font-size: 0.875rem; +} + +/* GitHub-style button hints used inside guide texts */ +.doc-prose .github-success-btn, +.doc-prose .github-neutral-btn { + display: inline-flex; + align-items: center; + gap: 0.25rem; + border-radius: 0.375rem; + padding: 0.125rem 0.5rem; + font-size: 0.8125rem; + vertical-align: middle; +} +.doc-prose .github-success-btn { + background: #238636; + color: #fff; +} +.doc-prose .github-neutral-btn { + background: #21262d; + border: 1px solid #363b42; + color: #c9d1d9; +} +.doc-prose .github-neutral-btn svg { + fill: currentColor; +} + +.doc-prose details { + border: 1px solid var(--color-neutral-800); + border-radius: 0.5rem; + padding: 0.75rem 1rem; + margin: 1.25rem 0; +} +.doc-prose details summary { + cursor: pointer; + font-weight: 600; +} + +/* --- SendPulse newsletter form ------------------------------------------- */ +/* The embed script injects its own stylesheet; force it back on-brand. */ + +.sp-form-outer .sp-form { + background: transparent !important; + border: none !important; + padding: 0 !important; + width: 100% !important; + max-width: 100% !important; +} + +.sp-form .sp-form-control { + background: color-mix(in srgb, var(--color-neutral-950) 60%, transparent) !important; + border: 1px solid var(--color-neutral-700) !important; + border-radius: 0.5rem !important; + color: var(--color-neutral-100) !important; + font-size: 0.875rem !important; + height: 2.5rem !important; +} + +.sp-form .sp-form-control::placeholder { + color: var(--color-neutral-500) !important; +} + +.sp-form .sp-form-control:focus { + border-color: var(--color-pink-600) !important; + outline: none !important; +} + +.sp-form .sp-button { + background: linear-gradient(to right, var(--color-pink-600), var(--color-fuchsia-600)) !important; + border: none !important; + border-radius: 0.5rem !important; + color: #fff !important; + font-weight: 600 !important; + font-size: 0.875rem !important; + font-family: inherit !important; + height: 2.5rem !important; + padding: 0 1.5rem !important; +} + +.sp-form .sp-button:hover { + filter: brightness(1.1); +} diff --git a/website/tools/generate-content.mjs b/website/tools/generate-content.mjs new file mode 100644 index 000000000..139c429ba --- /dev/null +++ b/website/tools/generate-content.mjs @@ -0,0 +1,294 @@ +/** + * Compiles the markdown content in src/content into TypeScript modules under + * src/app/generated: one lazy-loadable module per document, a sidebar manifest + * and a url -> lazy import map. Runs before every build (see "prebuild"). + */ +import { readdirSync, readFileSync, rmSync, mkdirSync, writeFileSync } from 'node:fs'; +import { join, basename } from 'node:path'; +import matter from 'gray-matter'; +import { Marked } from 'marked'; +import { createHighlighter } from 'shiki'; +import GithubSlugger from 'github-slugger'; + +const CONTENT_DIR = new URL('../src/content', import.meta.url).pathname; +const OUT_DIR = new URL('../src/app/generated', import.meta.url).pathname; + +const CATEGORY_LABELS = { + angular: 'Angular', + forms: 'Forms', + nx: 'Nx', + performance: 'Performance', + rxjs: 'RxJS', + signal: 'Signal', + testing: 'Testing', + typescript: 'TypeScript', +}; + +const DIFFICULTIES = [ + ['🟢', 'easy'], + ['🟠', 'medium'], + ['🔴', 'hard'], +]; + +/** `🟢 Projection` -> { title: 'Projection', difficulty: 'easy' } */ +function parseTitle(rawTitle = '') { + for (const [emoji, difficulty] of DIFFICULTIES) { + if (rawTitle.startsWith(emoji)) { + return { title: rawTitle.slice(emoji.length).trim(), difficulty }; + } + } + return { title: rawTitle, difficulty: undefined }; +} + +/** + * Author profiles keyed by lowercase file slug: the `author` frontmatter + * references a JSON file in src/content/authors (e.g. thomas-laforge.json, + * which maps to the GitHub handle tomalaforge). + */ +const AUTHORS = new Map( + readdirSync(join(CONTENT_DIR, 'authors')) + .filter((file) => file.endsWith('.json')) + .map((file) => { + const data = JSON.parse(readFileSync(join(CONTENT_DIR, 'authors', file), 'utf8')); + const githubLogin = data.github?.match(/github\.com\/([^/]+)/)?.[1]; + return [basename(file, '.json').toLowerCase(), { ...data, githubLogin }]; + }), +); + +function resolveAuthor(slug) { + if (!slug) { + return undefined; + } + const author = AUTHORS.get(slug.toLowerCase()); + if (!author) { + console.warn(`Unknown author "${slug}" — no matching file in src/content/authors.`); + return { name: slug }; + } + return { + name: author.name, + githubLogin: author.githubLogin, + twitter: author.twitter, + linkedin: author.linkedin, + youtube: author.youtube, + }; +} + +const SHIKI_LANGS = [ + 'typescript', 'javascript', 'html', 'css', 'json', 'bash', 'shell', + 'yaml', 'diff', 'angular-html', 'angular-ts', 'jsx', 'tsx', +]; + +const highlighter = await createHighlighter({ + themes: ['github-dark-default'], + langs: SHIKI_LANGS, +}); + +/** Per-document state collected by the renderer. */ +let toc = []; +let slugger = new GithubSlugger(); + +const marked = new Marked({ + renderer: { + heading({ tokens, depth }) { + const text = this.parser.parseInline(tokens); + const plain = text.replace(/<[^>]+>/g, ''); + const id = slugger.slug(plain); + if (depth === 2 || depth === 3) { + toc.push({ id, text: plain, depth }); + } + return `${text}\n`; + }, + code({ text, lang }) { + const language = SHIKI_LANGS.includes(lang) ? lang + : lang === 'ts' ? 'typescript' + : lang === 'js' ? 'javascript' + : lang === 'sh' ? 'shell' + : 'text'; + return highlighter.codeToHtml(text, { + lang: language === 'text' ? 'text' : language, + theme: 'github-dark-default', + }); + }, + }, +}); + +function rewriteAssetPaths(markdown) { + return markdown.replace(/(\.\.\/)+assets\//g, '/docs-assets/'); +} + +/** `import ... from '...';` lines at the top of .mdx files. */ +function stripMdxImports(markdown) { + return markdown.replace(/^import\s+.*?from\s+['"].*?['"];?\s*$/gm, ''); +} + +/** `` -> plain HTML card. */ +function replaceLinkCards(markdown) { + return markdown.replace(//g, (_, attrs) => { + const attr = (name) => { + const m = attrs.match(new RegExp(`${name}="([^"]*)"`)); + return m ? m[1] : ''; + }; + const title = attr('title'); + const description = marked.parseInline(attr('description')); + const href = attr('href'); + return `${title}${description}`; + }); +} + +/** Starlight `:::note[Title] ... :::` asides -> HTML, content markdown-rendered. */ +function extractAsides(markdown) { + const asides = []; + const replaced = markdown.replace( + /^:::(note|tip|caution|danger)(?:\[([^\]]*)\])?\s*\n([\s\S]*?)\n:::\s*$/gm, + (_, kind, title, content) => { + asides.push({ kind, title, content }); + return `%%ASIDE_${asides.length - 1}%%`; + }, + ); + return { replaced, asides }; +} + +function renderAside({ kind, title, content }) { + const label = title || { note: 'Note', tip: 'Tip', caution: 'Caution', danger: 'Danger' }[kind]; + const body = marked.parse(content); + return ``; +} + +function renderDocument(raw) { + const { data, content } = matter(raw); + let md = rewriteAssetPaths(stripMdxImports(content)); + const { replaced, asides } = extractAsides(md); + md = replaceLinkCards(replaced); + + toc = []; + slugger = new GithubSlugger(); + let html = marked.parse(md); + html = html.replace(/(?:

)?%%ASIDE_(\d+)%%(?:<\/p>)?/g, (_, i) => + renderAside(asides[Number(i)]), + ); + return { data, html, toc }; +} + +function tsModule(doc, outFile) { + const depth = outFile.split('/').length; + const modelPath = '../'.repeat(depth) + 'doc.model'; + return `// Generated by tools/generate-content.mjs — do not edit. +import { Doc } from '${modelPath}'; + +export const doc: Doc = ${JSON.stringify(doc, null, 2)}; +`; +} + +rmSync(OUT_DIR, { recursive: true, force: true }); +mkdirSync(join(OUT_DIR, 'content', 'guides'), { recursive: true }); + +const mapEntries = []; +const manifest = { guides: [], challenges: [] }; + +function emit(doc, outFile) { + writeFileSync(join(OUT_DIR, outFile), tsModule(doc, outFile)); + const importPath = './' + outFile.replace(/\.ts$/, ''); + mapEntries.push(` '${doc.url}': () => import('${importPath}').then((m) => m.doc),`); +} + +// --- Guides --------------------------------------------------------------- +for (const file of readdirSync(join(CONTENT_DIR, 'guides')).sort()) { + const raw = readFileSync(join(CONTENT_DIR, 'guides', file), 'utf8'); + const { data, html, toc } = renderDocument(raw); + const slug = basename(file).replace(/\.mdx?$/, ''); + const url = `/guides/${slug}`; + const doc = { + collection: 'guides', + slug, + url, + title: data.title, + description: data.description ?? '', + contributors: data.contributors ?? [], + noComments: data.noCommentSection === true, + html, + toc, + }; + emit(doc, `content/guides/${slug}.ts`); + manifest.guides.push({ + title: data.title, + url, + order: data.sidebar?.order ?? 999, + description: data.description ?? '', + }); +} +manifest.guides.sort((a, b) => a.order - b.order); + +// --- Challenges ----------------------------------------------------------- +const categories = readdirSync(join(CONTENT_DIR, 'challenges')).sort(); +for (const category of categories) { + mkdirSync(join(OUT_DIR, 'content', 'challenges', category), { recursive: true }); + const group = { + label: CATEGORY_LABELS[category] ?? category, + category, + items: [], + }; + for (const file of readdirSync(join(CONTENT_DIR, 'challenges', category)).sort()) { + const raw = readFileSync(join(CONTENT_DIR, 'challenges', category, file), 'utf8'); + const { data, html, toc } = renderDocument(raw); + const isIndex = /^index\.mdx?$/.test(file); + const slug = isIndex ? '' : basename(file).replace(/\.mdx?$/, ''); + const url = isIndex ? `/challenges/${category}` : `/challenges/${category}/${slug}`; + const { title, difficulty } = parseTitle(data.title); + const doc = { + collection: 'challenges', + category, + categoryLabel: CATEGORY_LABELS[category] ?? category, + slug, + url, + title, + difficulty, + description: data.description ?? '', + author: resolveAuthor(data.author), + contributors: data.contributors ?? [], + challengeNumber: data.challengeNumber, + command: data.command, + blogLink: data.blogLink, + videoLinks: data.videoLinks ?? [], + noComments: data.noCommentSection === true, + html, + toc, + }; + emit(doc, `content/challenges/${category}/${slug || 'index'}.ts`); + group.items.push({ + title, + difficulty, + url, + order: isIndex ? -1 : (data.sidebar?.order ?? 999), + description: data.description ?? '', + challengeNumber: data.challengeNumber, + }); + } + group.items.sort((a, b) => a.order - b.order); + manifest.challenges.push(group); +} + +// --- Manifest + import map -------------------------------------------------- +writeFileSync( + join(OUT_DIR, 'manifest.ts'), + `// Generated by tools/generate-content.mjs — do not edit. +import { DocsManifest } from '../doc.model'; + +export const MANIFEST: DocsManifest = ${JSON.stringify(manifest, null, 2)}; +`, +); + +writeFileSync( + join(OUT_DIR, 'content-map.ts'), + `// Generated by tools/generate-content.mjs — do not edit. +import { Doc } from '../doc.model'; + +export const CONTENT_MAP: Record Promise> = { +${mapEntries.join('\n')} +}; +`, +); + +console.log( + `Generated ${mapEntries.length} documents, ` + + `${manifest.guides.length} guides, ${manifest.challenges.length} challenge categories.`, +); diff --git a/website/tsconfig.app.json b/website/tsconfig.app.json new file mode 100644 index 000000000..11c10da69 --- /dev/null +++ b/website/tsconfig.app.json @@ -0,0 +1,16 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "types": [ + "node" + ] + }, + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "src/**/*.spec.ts" + ] +} diff --git a/website/tsconfig.json b/website/tsconfig.json new file mode 100644 index 000000000..d2fbb9c2b --- /dev/null +++ b/website/tsconfig.json @@ -0,0 +1,31 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "compileOnSave": false, + "compilerOptions": { + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "skipLibCheck": true, + "isolatedModules": true, + "experimentalDecorators": true, + "importHelpers": true, + "target": "ES2022", + "module": "preserve" + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true + }, + "files": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/website/tsconfig.spec.json b/website/tsconfig.spec.json new file mode 100644 index 000000000..9c8efb9b7 --- /dev/null +++ b/website/tsconfig.spec.json @@ -0,0 +1,14 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "types": [ + "vitest/globals" + ] + }, + "include": [ + "src/**/*.d.ts", + "src/**/*.spec.ts" + ] +} diff --git a/website/vercel.json b/website/vercel.json new file mode 100644 index 000000000..1946eec5c --- /dev/null +++ b/website/vercel.json @@ -0,0 +1,7 @@ +{ + "$schema": "https://openapi.vercel.sh/vercel.json", + "installCommand": "pnpm install", + "buildCommand": "pnpm build", + "outputDirectory": "dist/angular-challenges-website/browser", + "rewrites": [{ "source": "/(.*)", "destination": "/api/ssr" }] +} From 189fa76a8f8efea848a23bdf5671e85d307e15bd Mon Sep 17 00:00:00 2001 From: thomas Date: Sat, 15 Aug 2026 13:12:17 +0200 Subject: [PATCH 02/17] fix(website): address CodeRabbit review feedback on PR #1533 - ssr.js: don't cache a rejected dynamic import, guard the 500 response when headers were already sent by the SSR stream - auth: add CSRF protection to the GitHub OAuth flow (random nonce in a short-lived HttpOnly cookie, verified on callback) and harden siteOrigin against x-forwarded-host spoofing (SITE_ORIGIN wins, x-forwarded-proto decides the scheme, first forwarded host only) - github-api: bound the in-memory cache with eviction, add a request timeout and 403/429 backoff retries, and return partial leaderboard results with a short TTL instead of discarding every fetched page - solutions: branch templates on a `loaded` flag so SSR no longer renders a false "loaded and empty" state while the httpResource is disabled - docs: correct the view-transition-name uniqueness rule, show a Signal `.update()` in the CRUD example, split in-app navigation from page unload in the form-data challenge, fix the `forms-child-forms` test command and the `counter.component.cy.ts` spec name, align the challenge-creation guide with the website content pipeline, and recommend `--force-with-lease` over `push -f` Co-Authored-By: Claude Opus 5 (1M context) --- website/api/ssr.js | 12 +- .../app/pages/solutions/solution-diff.html | 12 +- .../src/app/pages/solutions/solution-diff.ts | 9 +- .../app/pages/solutions/solutions-list.html | 14 +- .../src/app/pages/solutions/solutions-list.ts | 11 +- .../challenges/angular/44-view-transition.md | 5 +- .../challenges/angular/5-crud-application.md | 6 +- .../forms/48-avoid-losing-form-data.md | 11 +- .../challenges/forms/63-child-forms.md | 2 +- .../challenges/testing/19-input-output.md | 2 +- .../src/content/guides/create-challenge.md | 11 +- website/src/content/guides/rebase.md | 7 +- website/src/server/auth.ts | 83 ++++++++-- website/src/server/github-api.ts | 148 ++++++++++++++---- 14 files changed, 256 insertions(+), 77 deletions(-) diff --git a/website/api/ssr.js b/website/api/ssr.js index f06333e53..3ba901e4e 100644 --- a/website/api/ssr.js +++ b/website/api/ssr.js @@ -5,13 +5,21 @@ let handlerPromise; module.exports = async (req, res) => { try { - handlerPromise ??= import( - '../dist/angular-challenges-website/server/server.mjs' + handlerPromise ??= import('../dist/angular-challenges-website/server/server.mjs').catch( + (error) => { + // Don't cache a rejected import: the next request on this warm instance retries. + handlerPromise = undefined; + throw error; + }, ); const { reqHandler } = await handlerPromise; return reqHandler(req, res); } catch (error) { console.error('SSR handler failed', error); + if (res.headersSent) { + res.destroy(error); + return; + } res.statusCode = 500; res.setHeader('content-type', 'text/plain'); res.end('Internal server error'); diff --git a/website/src/app/pages/solutions/solution-diff.html b/website/src/app/pages/solutions/solution-diff.html index 2d12165b7..d24cc85ac 100644 --- a/website/src/app/pages/solutions/solution-diff.html +++ b/website/src/app/pages/solutions/solution-diff.html @@ -3,12 +3,7 @@ ← All solutions for {{ doc().title }} - @if (loading()) { -

-
-
-
- } @else if (failed()) { + @if (failed()) {
Could not load this pull request from GitHub right now. or try again later.
+ } @else if (!loaded()) { +
+
+
+
} @else { @if (meta(); as m) { diff --git a/website/src/app/pages/solutions/solution-diff.ts b/website/src/app/pages/solutions/solution-diff.ts index 1cb3f2b18..5f28787c2 100644 --- a/website/src/app/pages/solutions/solution-diff.ts +++ b/website/src/app/pages/solutions/solution-diff.ts @@ -70,8 +70,13 @@ export class SolutionDiff { return [...this.parsedFiles()]; }); - protected readonly loading = computed( - () => this.metaResource.isLoading() || this.filesResource.isLoading(), + /** + * Both resources are disabled during SSR, so neither reports "loading" there. + * The template branches on this instead: it stays false until both responses + * arrive, which keeps the server HTML from rendering an empty diff. + */ + protected readonly loaded = computed( + () => this.metaResource.status() === 'resolved' && this.filesResource.status() === 'resolved', ); protected readonly failed = computed( diff --git a/website/src/app/pages/solutions/solutions-list.html b/website/src/app/pages/solutions/solutions-list.html index 40036117c..47c8ea063 100644 --- a/website/src/app/pages/solutions/solutions-list.html +++ b/website/src/app/pages/solutions/solutions-list.html @@ -8,18 +8,18 @@

Community solutions

the full diff without leaving the site.

- @if (solutionsResource.isLoading()) { -
- @for (i of [1, 2, 3, 4]; track i) { -
- } -
- } @else if (solutionsResource.error()) { + @if (solutionsResource.error()) {
+ } @else if (!loaded()) { +
+ @for (i of [1, 2, 3, 4]; track i) { +
+ } +
} @else if (solutions().length === 0) {
No solution submitted yet — be the first! diff --git a/website/src/app/pages/solutions/solutions-list.ts b/website/src/app/pages/solutions/solutions-list.ts index 3da1977ce..209944834 100644 --- a/website/src/app/pages/solutions/solutions-list.ts +++ b/website/src/app/pages/solutions/solutions-list.ts @@ -22,9 +22,14 @@ export class SolutionsList { this.isBrowser ? `/api/challenges/${this.doc().challengeNumber}/solutions` : undefined, ); - protected readonly solutions = computed( - () => this.solutionsResource.value()?.solutions ?? [], - ); + protected readonly solutions = computed(() => this.solutionsResource.value()?.solutions ?? []); + + /** + * The resource is disabled during SSR, so it never reports "loading" there. + * Templates branch on this instead: it stays false until a response arrives, + * which keeps the server HTML from claiming that no solution exists. + */ + protected readonly loaded = computed(() => this.solutionsResource.status() === 'resolved'); protected readonly githubSearchUrl = computed( () => diff --git a/website/src/content/challenges/angular/44-view-transition.md b/website/src/content/challenges/angular/44-view-transition.md index 74d0a88bb..e760863a8 100644 --- a/website/src/content/challenges/angular/44-view-transition.md +++ b/website/src/content/challenges/angular/44-view-transition.md @@ -51,7 +51,10 @@ This allows you to create an animation for this element only. Lastly, if the same element is present in both views, you can automate the transition by assigning the same **transition name**. :::danger -Remember, you can have only ONE UNIQUE `view-transition-name` per page. +Remember, a page can use as many different `view-transition-name` values as you need, but +each name must identify only ONE rendered element per view. The same name is what pairs the +old and the new instance of an element; if two elements share it in the same view, the +transition is aborted. ::: ## Statement diff --git a/website/src/content/challenges/angular/5-crud-application.md b/website/src/content/challenges/angular/5-crud-application.md index 1e439150a..fb403ef1c 100644 --- a/website/src/content/challenges/angular/5-crud-application.md +++ b/website/src/content/challenges/angular/5-crud-application.md @@ -36,8 +36,10 @@ What you will need to do: // Avoid this this.todos[todoUpdated.id - 1] = todoUpdated; -// Prefer something like this, but need to be improved because we still want the same order -this.todos = [...this.todos.filter((t) => t.id !== todoUpdated.id), todoUpdated]; +// Prefer something like this: an immutable update that keeps the original order +this.todoList.update((todos) => + todos.map((todo) => (todo.id === todoUpdated.id ? todoUpdated : todo)), +); ``` ### Step 2: Improve diff --git a/website/src/content/challenges/forms/48-avoid-losing-form-data.md b/website/src/content/challenges/forms/48-avoid-losing-form-data.md index b17e60e76..843f4b716 100644 --- a/website/src/content/challenges/forms/48-avoid-losing-form-data.md +++ b/website/src/content/challenges/forms/48-avoid-losing-form-data.md @@ -26,15 +26,16 @@ Here's the feature expressed as a user story with a functional expectation: ## Acceptance Criteria -1. If one of the form fields is not empty and the user tries to navigate to a different route or page, or wants to reload the page, show an alert dialog to _avoid losing form data_. -2. The content of `dialog.component.ts` must be used for your alert. -3. The appearance and behavior of the alert dialog box must comply with W3C conventions, see [alert dialog pattern](https://www.w3.org/WAI/ARIA/apg/patterns/alertdialog/). -4. Maximize the use of the new concepts and syntax in the latest version of Angular. +1. If one of the form fields is not empty and the user tries to navigate to a **different route inside the app**, show your own alert dialog to _avoid losing form data_. +2. If the user reloads the page, closes the tab, or leaves the document, the browser's native confirmation prompt must be triggered instead — a custom dialog cannot be rendered at that point. +3. The content of `dialog.component.ts` must be used for the in-app alert. +4. The appearance and behavior of the alert dialog box must comply with W3C conventions, see [alert dialog pattern](https://www.w3.org/WAI/ARIA/apg/patterns/alertdialog/). +5. Maximize the use of the new concepts and syntax in the latest version of Angular.
Tips 🤫 (if you really need it and after careful consideration)
  • Use the Material CDK Dialog or Overlay - don't forget to add @import '@angular/cdk/overlay-prebuilt.css' in styles.css
  • -
  • Use the CanDeactivate guard in the new functional approach.
  • +
  • Use the CanDeactivate guard in the new functional approach for in-app navigation, and the beforeunload event for reloads and tab closes.
diff --git a/website/src/content/challenges/forms/63-child-forms.md b/website/src/content/challenges/forms/63-child-forms.md index 7693104a6..2fe1f6afb 100644 --- a/website/src/content/challenges/forms/63-child-forms.md +++ b/website/src/content/challenges/forms/63-child-forms.md @@ -56,7 +56,7 @@ Refactor the form to **Signal-based forms** and extract reusable pieces: You can run tests in watch mode to refactor using Test-Driven Development (TDD): ```bash -nx test forms-child-form +nx test forms-child-forms ``` This will re-run tests automatically as you make changes, helping you ensure all functionality works correctly during your migration. diff --git a/website/src/content/challenges/testing/19-input-output.md b/website/src/content/challenges/testing/19-input-output.md index d77db7eb0..3752816ad 100644 --- a/website/src/content/challenges/testing/19-input-output.md +++ b/website/src/content/challenges/testing/19-input-output.md @@ -22,7 +22,7 @@ You can play with it by running : `npx nx serve testing-input-output`. The file named `counter.component.spec.ts` will let you test your application using [Angular Testing Library](https://testing-library.com/) . To run the test suites, you need to run `npx nx test testing-input-output`. You can also install [Jest Runner](https://marketplace.visualstudio.com/items?itemName=firsttris.vscode-jest-runner) to execute your test by clicking on the `Run` button above each `describe` or `it` blocks. -For testing with Cypress, you will execute your test inside the `child.component.cy.ts` and run `npx nx component-test testing-input-output` to execute your test suites. You can add the `--watch` flag to execute your test in watch mode. +For testing with Cypress, you will execute your test inside the `counter.component.cy.ts` and run `npx nx component-test testing-input-output` to execute your test suites. You can add the `--watch` flag to execute your test in watch mode. # Statement diff --git a/website/src/content/guides/create-challenge.md b/website/src/content/guides/create-challenge.md index 4b01d6bb8..4d6fd1f1e 100644 --- a/website/src/content/guides/create-challenge.md +++ b/website/src/content/guides/create-challenge.md @@ -38,7 +38,7 @@ Alternatively, you may utilize your IDE's [Nx Console extension](https://nx.dev/ - challengeDifficulty: The difficulty you think your challenge has. There are three difficulty levels : 🟢 easy / 🟠 medium / 🔴 hard -- docRepository: The category of your Challenge is Nx, Angular, Angular Performance, Rxjs, NgRx, Typescript, Forms or Signals. +- category: The category of your challenge. It matches one of the folders under `website/src/content/challenges`: `angular`, `forms`, `nx`, `performance`, `rxjs`, `signal`, `testing` or `typescript`. #### optional parameters @@ -49,7 +49,14 @@ Alternatively, you may utilize your IDE's [Nx Console extension](https://nx.dev/ ### What is created? - The generator will create all the files needed to have a new working application. All these files will be created inside `apps/${directory}/${name}`. -- A Markdown file with minimal setup will be created inside `docs/src/content/docs/challenges/${docRepository}`. +- A Markdown file with minimal setup will be created inside `docs/src/content/docs/challenges/${category}`. + +:::caution +The generator still writes to the legacy `docs/` folder. This website reads its challenges from +`website/src/content/challenges/${category}/`, so move (or copy) the generated Markdown file there — +otherwise `website/tools/generate-content.mjs` will not pick it up and your challenge will not appear +on the site. The author file follows the same rule: `website/src/content/authors/${author}.json`. +::: ## Challenge Creation diff --git a/website/src/content/guides/rebase.md b/website/src/content/guides/rebase.md index e91badfb6..1b50f4c9f 100644 --- a/website/src/content/guides/rebase.md +++ b/website/src/content/guides/rebase.md @@ -54,4 +54,9 @@ If your branch doesn't have any conflicts, a success message will be shown. Finally, push your work back to GitHub: -- git push -f +- git push --force-with-lease origin [your branch] + +:::note +`--force-with-lease` is safer than `-f`: it refuses to push if someone else has added commits to +the remote branch since your last fetch, instead of silently overwriting their work. +::: diff --git a/website/src/server/auth.ts b/website/src/server/auth.ts index 3709798c6..ec1c50aa2 100644 --- a/website/src/server/auth.ts +++ b/website/src/server/auth.ts @@ -1,27 +1,60 @@ +import { randomBytes, timingSafeEqual } from 'node:crypto'; import { Router, Request } from 'express'; export const AUTH_COOKIE = 'gh_token'; +const STATE_COOKIE = 'gh_oauth_state'; -export function readAuthCookie(req: Request): string | null { +/** Reads a single cookie value from the request `Cookie` header. */ +export function readCookie(req: Request, name: string): string | null { const header = req.headers.cookie; if (!header) { return null; } for (const part of header.split(';')) { - const [name, ...rest] = part.trim().split('='); - if (name === AUTH_COOKIE) { + const [key, ...rest] = part.trim().split('='); + if (key === name) { return decodeURIComponent(rest.join('=')); } } return null; } +export function readAuthCookie(req: Request): string | null { + return readCookie(req, AUTH_COOKIE); +} + +/** + * Resolves the public origin of the site. `SITE_ORIGIN` wins when configured, because + * forwarded headers are client-supplied and must not decide the OAuth `redirect_uri` + * nor whether cookies get the `Secure` attribute. + */ function siteOrigin(req: Request): string { - const host = req.headers['x-forwarded-host'] ?? req.headers.host ?? 'localhost:4000'; - const proto = String(host).startsWith('localhost') ? 'http' : 'https'; + const configured = process.env['SITE_ORIGIN']; + if (configured) { + return configured.replace(/\/+$/, ''); + } + const forwardedHost = String(req.headers['x-forwarded-host'] ?? '') + .split(',')[0] + .trim(); + const host = forwardedHost || req.headers.host || 'localhost:4000'; + const forwardedProto = String(req.headers['x-forwarded-proto'] ?? '') + .split(',')[0] + .trim(); + const proto = forwardedProto || (isLocalHost(host) ? 'http' : 'https'); return `${proto}://${host}`; } +function isLocalHost(host: string): boolean { + const hostname = host.split(':')[0]; + return hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '[::1]'; +} + +function safeEqual(a: string, b: string): boolean { + const left = Buffer.from(a); + const right = Buffer.from(b); + return left.length === right.length && timingSafeEqual(left, right); +} + /** Only same-site paths are allowed as post-login redirect targets. */ function safePath(value: unknown): string { const path = String(value ?? '/'); @@ -36,11 +69,18 @@ authRoutes.get('/authorize', (req, res) => { res.status(503).send('GitHub sign-in is not configured yet (missing GITHUB_CLIENT_ID).'); return; } + const origin = siteOrigin(req); + const secure = origin.startsWith('https') ? '; Secure' : ''; + const nonce = randomBytes(16).toString('hex'); + res.setHeader( + 'Set-Cookie', + `${STATE_COOKIE}=${nonce}; Path=/auth; HttpOnly; SameSite=Lax; Max-Age=600${secure}`, + ); const params = new URLSearchParams({ client_id: clientId, - redirect_uri: `${siteOrigin(req)}/auth/callback`, + redirect_uri: `${origin}/auth/callback`, scope: 'public_repo', - state: safePath(req.query['redirect_uri']), + state: `${nonce}:${safePath(req.query['redirect_uri'])}`, }); res.redirect(302, `https://github.com/login/oauth/authorize?${params}`); }); @@ -48,10 +88,25 @@ authRoutes.get('/authorize', (req, res) => { authRoutes.get('/callback', async (req, res) => { const clientId = process.env['GITHUB_CLIENT_ID']; const clientSecret = process.env['GITHUB_CLIENT_SECRET']; - const returnTo = safePath(req.query['state']); + const [nonce, ...pathParts] = String(req.query['state'] ?? '').split(':'); + const returnTo = safePath(pathParts.join(':')); + const expectedNonce = readCookie(req, STATE_COOKIE); const code = req.query['code']; - if (!clientId || !clientSecret || !code || req.query['error']) { + const secure = siteOrigin(req).startsWith('https') ? '; Secure' : ''; + const clearState = `${STATE_COOKIE}=; Path=/auth; HttpOnly; SameSite=Lax; Max-Age=0${secure}`; + + // The nonce ties the callback to the browser that started the flow: without it an + // attacker could plant their own authorization code in a victim's session. + if ( + !clientId || + !clientSecret || + !code || + req.query['error'] || + !expectedNonce || + !safeEqual(nonce, expectedNonce) + ) { + res.setHeader('Set-Cookie', clearState); res.redirect(302, returnTo); return; } @@ -64,15 +119,17 @@ authRoutes.get('/callback', async (req, res) => { }); const data = (await response.json()) as { access_token?: string }; if (data.access_token) { - const secure = siteOrigin(req).startsWith('https') ? '; Secure' : ''; - res.setHeader( - 'Set-Cookie', + res.setHeader('Set-Cookie', [ + clearState, `${AUTH_COOKIE}=${encodeURIComponent(data.access_token)}; Path=/; HttpOnly; SameSite=Lax; Max-Age=${60 * 60 * 24 * 7}${secure}`, - ); + ]); } } catch { // Fall through: user comes back logged out. } + if (!res.hasHeader('Set-Cookie')) { + res.setHeader('Set-Cookie', clearState); + } res.redirect(302, returnTo); }); diff --git a/website/src/server/github-api.ts b/website/src/server/github-api.ts index 861c2c2d7..e999966e7 100644 --- a/website/src/server/github-api.ts +++ b/website/src/server/github-api.ts @@ -6,10 +6,56 @@ const REPO_FIRST_YEAR = 2022; const EXCLUDED_USERS = new Set(['allcontributors[bot]', 'tomalaforge']); const GITHUB_API = 'https://api.github.com'; +interface CacheEntry { + expires: number; + status: number; + data: unknown; +} + /** Tiny in-memory TTL cache — enough to stay far below GitHub rate limits. */ -const cache = new Map(); +const cache = new Map(); +/** Per-PR paths would otherwise make the cache grow without bound on a warm instance. */ +const CACHE_MAX_ENTRIES = 500; +const REQUEST_TIMEOUT_MS = 10_000; +const RATE_LIMIT_RETRIES = 2; + +/** Writes an entry, evicting the least recently written ones once the cap is reached. */ +function setCache(key: string, entry: CacheEntry): void { + cache.delete(key); + cache.set(key, entry); + while (cache.size > CACHE_MAX_ENTRIES) { + const oldest = cache.keys().next(); + if (oldest.done) { + break; + } + cache.delete(oldest.value); + } +} -async function github(path: string, ttlSeconds: number): Promise<{ status: number; data: unknown }> { +function delay(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +/** Retry-After / X-RateLimit-Reset aware backoff, capped so a request never hangs a page. */ +function retryDelayMs(response: Response, attempt: number): number { + const retryAfter = Number(response.headers.get('retry-after')); + if (Number.isFinite(retryAfter) && retryAfter > 0) { + return Math.min(retryAfter * 1000, 10_000); + } + return Math.min(1000 * 2 ** attempt, 8000); +} + +async function githubFetch(path: string, headers: Record): Promise { + return fetch(`${GITHUB_API}${path}`, { + headers, + signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS), + }); +} + +async function github( + path: string, + ttlSeconds: number, +): Promise<{ status: number; data: unknown }> { const cached = cache.get(path); if (cached && cached.expires > Date.now()) { return cached; @@ -23,11 +69,31 @@ async function github(path: string, ttlSeconds: number): Promise<{ status: numbe if (token) { headers['Authorization'] = `Bearer ${token}`; } - const response = await fetch(`${GITHUB_API}${path}`, { headers }); - const data = await response.json(); + + let response: Response; + try { + response = await githubFetch(path, headers); + // 403/429 are GitHub's primary and secondary rate limits: back off and retry. + for (let attempt = 0; attempt < RATE_LIMIT_RETRIES; attempt++) { + if (response.status !== 403 && response.status !== 429) { + break; + } + await delay(retryDelayMs(response, attempt)); + response = await githubFetch(path, headers); + } + } catch (error) { + if (cached) { + // Serve stale data instead of surfacing a network or timeout error. + return cached; + } + console.error('GitHub request failed', path, error); + return { status: 503, data: { error: 'github request failed' } }; + } + + const data = await response.json().catch(() => null); const entry = { status: response.status, data, expires: Date.now() + ttlSeconds * 1000 }; if (response.ok) { - cache.set(path, entry); + setCache(path, entry); } else if (cached) { // Serve stale data instead of surfacing a rate-limit error. return cached; @@ -63,8 +129,14 @@ async function mapLimit( * query at 1000 results (10 pages), so the query is additionally partitioned * per creation year; each year's page 1 reveals via total_count how many more * pages need fetching. + * + * A failing page marks the result `partial` rather than discarding every page + * already fetched; `null` is only returned when no page at all could be read. */ -async function searchAllIssues(baseQuery: string, ttlSeconds: number): Promise { +async function searchAllIssues( + baseQuery: string, + ttlSeconds: number, +): Promise<{ items: any[]; partial: boolean } | null> { const currentYear = new Date().getFullYear(); const years = Array.from( { length: currentYear - REPO_FIRST_YEAR + 1 }, @@ -81,10 +153,14 @@ async function searchAllIssues(baseQuery: string, ttlSeconds: number): Promise github(url, ttlSeconds)); for (const { status, data } of restPages) { if (status !== 200) { - return null; + partial = true; + continue; } items.push(...((data as { items: any[] }).items ?? [])); } - return items; + return { items, partial }; } interface LeaderboardEntry { @@ -172,19 +253,16 @@ githubApi.post('/pulls/:number/react', async (req, res) => { res.status(400).json({ error: 'invalid PR number' }); return; } - const response = await fetch( - `https://api.github.com/repos/${REPO}/issues/${number}/reactions`, - { - method: 'POST', - headers: { - Accept: 'application/vnd.github+json', - Authorization: `Bearer ${token}`, - 'User-Agent': 'angular-challenges-website', - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ content: '+1' }), + const response = await fetch(`https://api.github.com/repos/${REPO}/issues/${number}/reactions`, { + method: 'POST', + headers: { + Accept: 'application/vnd.github+json', + Authorization: `Bearer ${token}`, + 'User-Agent': 'angular-challenges-website', + 'Content-Type': 'application/json', }, - ); + body: JSON.stringify({ content: '+1' }), + }); if (!response.ok) { res.status(response.status).json({ error: 'reaction failed' }); return; @@ -198,13 +276,15 @@ const BOARD_QUERIES: Record = { commit: 'no:label', }; -async function buildLeaderboard(board: string): Promise { - const items = await searchAllIssues(BOARD_QUERIES[board], 1800); - if (!items) { +async function buildLeaderboard( + board: string, +): Promise<{ entries: LeaderboardEntry[]; partial: boolean } | null> { + const result = await searchAllIssues(BOARD_QUERIES[board], 1800); + if (!result) { return null; } const counts = new Map }>(); - for (const item of items) { + for (const item of result.items) { if (board === 'answers') { const challenge = item.labels ?.map((l: GithubLabel) => Number(l.name)) @@ -216,7 +296,7 @@ async function buildLeaderboard(board: string): Promise(); const boardRefreshing = new Map>(); const BOARD_TTL_MS = 30 * 60 * 1000; +/** A board built from an incomplete page set is cached briefly, then retried. */ +const BOARD_PARTIAL_TTL_MS = 5 * 60 * 1000; function refreshBoard(board: string): Promise { let inflight = boardRefreshing.get(board); if (!inflight) { inflight = buildLeaderboard(board) - .then((entries) => { - if (entries) { - boardCache.set(board, { expires: Date.now() + BOARD_TTL_MS, entries }); + .then((result) => { + if (!result) { + return null; } - return entries; + boardCache.set(board, { + expires: Date.now() + (result.partial ? BOARD_PARTIAL_TTL_MS : BOARD_TTL_MS), + entries: result.entries, + }); + return result.entries; }) .finally(() => boardRefreshing.delete(board)); boardRefreshing.set(board, inflight); @@ -335,7 +421,7 @@ githubApi.get('/sponsors', async (_req, res) => { .filter(Boolean) .map((s: any) => ({ login: s.login, avatar: s.avatarUrl })) ?? []; const payload = { sponsors }; - cache.set('sponsors', { expires: Date.now() + 900_000, status: 200, data: payload }); + setCache('sponsors', { expires: Date.now() + 900_000, status: 200, data: payload }); res.set('Cache-Control', 'public, s-maxage=900, stale-while-revalidate=86400'); res.json(payload); } catch { From 0334da9eb5f81e689e1ed7f91451045e17dd5cd9 Mon Sep 17 00:00:00 2001 From: thomas Date: Sat, 15 Aug 2026 13:21:33 +0200 Subject: [PATCH 03/17] feat(website): gate Google Analytics and AdSense behind a consent banner MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Neither Google script is loaded before the visitor makes a choice. index.html now only declares Consent Mode v2 defaults (everything denied), and the new Consent service injects gtag.js and adsbygoogle.js — and sends the consent update — only on acceptance. The choice is remembered in localStorage; rejecting after a previous acceptance flips the signals back to denied and expires the _ga/_gid cookies. The banner is browser-only so it never lands in the prerendered HTML, and a "Cookie settings" control in the landing footer and the docs sidebar lets visitors change their mind. Co-Authored-By: Claude Opus 5 (1M context) --- website/src/app/app.html | 1 + website/src/app/app.ts | 3 +- website/src/app/consent.ts | 138 +++++++++++++++++++++ website/src/app/layout/docs-layout.html | 9 ++ website/src/app/layout/docs-layout.ts | 2 + website/src/app/pages/landing/landing.html | 1 + website/src/app/pages/landing/landing.ts | 3 + website/src/app/shared/consent-banner.html | 41 ++++++ website/src/app/shared/consent-banner.ts | 11 ++ website/src/index.html | 19 ++- 10 files changed, 223 insertions(+), 5 deletions(-) create mode 100644 website/src/app/consent.ts create mode 100644 website/src/app/shared/consent-banner.html create mode 100644 website/src/app/shared/consent-banner.ts diff --git a/website/src/app/app.html b/website/src/app/app.html index 67e7bd4cd..dabcba218 100644 --- a/website/src/app/app.html +++ b/website/src/app/app.html @@ -1 +1,2 @@ + diff --git a/website/src/app/app.ts b/website/src/app/app.ts index 54697a923..6f6cdde59 100644 --- a/website/src/app/app.ts +++ b/website/src/app/app.ts @@ -1,9 +1,10 @@ import { Component, signal } from '@angular/core'; import { RouterOutlet } from '@angular/router'; +import { ConsentBanner } from './shared/consent-banner'; @Component({ selector: 'app-root', - imports: [RouterOutlet], + imports: [RouterOutlet, ConsentBanner], templateUrl: './app.html', styleUrl: './app.css' }) diff --git a/website/src/app/consent.ts b/website/src/app/consent.ts new file mode 100644 index 000000000..4a8c7b21d --- /dev/null +++ b/website/src/app/consent.ts @@ -0,0 +1,138 @@ +import { DOCUMENT, isPlatformBrowser } from '@angular/common'; +import { Injectable, PLATFORM_ID, computed, inject, signal } from '@angular/core'; + +const GA_MEASUREMENT_ID = 'G-6BXJ62W6G5'; +const ADSENSE_CLIENT = 'ca-pub-2438923752868254'; +const STORAGE_KEY = 'ac-consent'; + +export type ConsentChoice = 'granted' | 'denied'; + +declare global { + interface Window { + dataLayer?: unknown[]; + gtag?: (...args: unknown[]) => void; + } +} + +/** + * Cookie consent for the Google tags. Nothing from Google is requested until the + * visitor accepts: `index.html` only declares Consent Mode v2 defaults (all denied), + * and this service injects gtag.js and AdSense — and flips the signals to granted — + * once, on acceptance. The choice is remembered in `localStorage`. + */ +@Injectable({ providedIn: 'root' }) +export class Consent { + private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID)); + private readonly document = inject(DOCUMENT); + + private readonly choice = signal(null); + private tagsInjected = false; + + /** Null until the visitor has answered the banner. */ + readonly decision = this.choice.asReadonly(); + readonly granted = computed(() => this.choice() === 'granted'); + + /** The banner is browser-only: SSR must not render it into the cached HTML. */ + readonly bannerVisible = signal(false); + + constructor() { + if (!this.isBrowser) { + return; + } + const stored = this.read(); + this.choice.set(stored); + if (stored === 'granted') { + this.injectTags(); + } + this.bannerVisible.set(stored === null); + } + + accept(): void { + this.persist('granted'); + this.update('granted'); + this.injectTags(); + this.bannerVisible.set(false); + } + + reject(): void { + this.persist('denied'); + // The tags may already be loaded from an earlier "accept": tell them to stop + // using storage, and drop the cookies they set in the meantime. + this.update('denied'); + this.clearAnalyticsCookies(); + this.bannerVisible.set(false); + } + + /** Lets the visitor change their mind — wired to the "Cookie settings" footer link. */ + reopen(): void { + this.bannerVisible.set(true); + } + + private read(): ConsentChoice | null { + try { + const stored = localStorage.getItem(STORAGE_KEY); + return stored === 'granted' || stored === 'denied' ? stored : null; + } catch { + // Storage can be unavailable (private mode, blocked cookies): ask again. + return null; + } + } + + private persist(choice: ConsentChoice): void { + this.choice.set(choice); + try { + localStorage.setItem(STORAGE_KEY, choice); + } catch { + // The choice still applies to this page view, it just isn't remembered. + } + } + + private update(choice: ConsentChoice): void { + window.gtag?.('consent', 'update', { + ad_storage: choice, + ad_user_data: choice, + ad_personalization: choice, + analytics_storage: choice, + personalization_storage: choice, + }); + } + + private injectTags(): void { + if (this.tagsInjected) { + return; + } + this.tagsInjected = true; + + this.loadScript(`https://www.googletagmanager.com/gtag/js?id=${GA_MEASUREMENT_ID}`); + window.gtag?.('js', new Date()); + window.gtag?.('config', GA_MEASUREMENT_ID); + + const ads = this.loadScript( + `https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=${ADSENSE_CLIENT}`, + ); + ads.crossOrigin = 'anonymous'; + } + + private loadScript(src: string): HTMLScriptElement { + const script = this.document.createElement('script'); + script.async = true; + script.src = src; + this.document.head.appendChild(script); + return script; + } + + private clearAnalyticsCookies(): void { + const domain = location.hostname; + for (const cookie of this.document.cookie.split(';')) { + const name = cookie.split('=')[0].trim(); + if (!name.startsWith('_ga') && !name.startsWith('_gid')) { + continue; + } + // The tag may have written the cookie on either the exact host or the + // registrable domain, so expire both. + for (const scope of ['', `; domain=${domain}`, `; domain=.${domain}`]) { + this.document.cookie = `${name}=; Path=/; Max-Age=0${scope}`; + } + } + } +} diff --git a/website/src/app/layout/docs-layout.html b/website/src/app/layout/docs-layout.html index 7dfe8bd31..e024ba803 100644 --- a/website/src/app/layout/docs-layout.html +++ b/website/src/app/layout/docs-layout.html @@ -106,6 +106,15 @@

AlFSHfR7r6?l2J0av+}BLpvZxD>+}gK;H(!MdvUJm4&)Lcu zs0%r5oB)v#$z!=*8N~FwO)=y3EqT~j{%2L@pNPZEIvexdt^0_*Z#^}@cgP;O6zVGd zBY^%(Fh>KDn>%3^xyPQ*uQyFP?rrPO3}6tRlkmG@|IE#Ma`qR-yIO90K4v6E zr5BFmSxk;bbm_Qd%-&qjHilO{);*f)h7AV3$kT_DWP>-IHO2?h-(#S~9$bO#$Zn6f z9<8v3A+6y#rc+3}W61Qp%ovQr56-I>l{1mMQ4OPw1nIxaj&geedE# z8=nNzAL@vaPqhJedDgX#=yH6xf;i4f>{@i2^y!3|#T~$oRy@DDw1}?eCWxAG48sMY zw}-68TC(ri2LGmcr}vj{Ey>&ZX#+M0bs<5=SYw7e_IZIN<&rPA2&ibrL!YU38JC7Mg+>=?hTUyJQ+@bs4YMG{! zwpMA&Dk{yBx_XPBZ#=Oh83}qkm`(Ih{fI8^+7ta^A(en9MADL2BQtv5R^TIkl!Y{_ zU1!}cP=Fl+IOT7@S6(I9sps}#CEhO~k}2X@j7VD7e4cok^>VEp(S08@sH$uT{jn;cTDLBryFqo4tJ=&^*@9N_|??Z3K$H=^QMdnc{=cB1wbpbjwBbGuhX?pM%9~qXC#cMp;m|7 zSFZE8NpU)0BuR?_&ZVEkmFTnGBq23%SnN>|-|oMzq~9a>tPF4Ww26ai3n%hZ&IoYM zbikXF*lOV`$O5KvamrIrg#1{&V?M9Xc5t5P?;9|vYnN40bYs|vK~4)|rcb|j{BLAM zaKFs_CA*X(CLNv1fU>#H7kxmKa4F-G%G4ydSLK0^s#{eZPLB#F z>;`6Q+>T)oN>6+^<~4@%9hnPPHJ^3b>{k=GbFfuY*LoHYK*+8jXJ3C##|$6u(N*m! zzLC_9r+zCbp+pba(K)$c;PNH;|&}lq>wO_5c zxXA48%nRT`+jegE;=?LvDV*ciX-QF&-1TNE34_wQe)%pAo7{-^tteEnza~%=vlaRo znxl&fYACFMZG%3XF4Oq1;76$+h5{&Bsx;S_vb1V1o=+8Nyn$%=&97Ma%lW9$IEcTr p>$l1g;adE<`I?v&`h5n+suA*8gMO&|;%5$UT`{vYEi?H&=6}HNBnJQh literal 0 HcmV?d00001 diff --git a/website/public/docs-assets/performance/profiler-tab.png b/website/public/docs-assets/performance/profiler-tab.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d228d735f6198ec86b00eb9c2238a409545ba8 GIT binary patch literal 54993 zcmZ^~1zcNC^Ea9_#k~|L8d_SQrML%oC=M;I#ob*3#R?QJ?!}9{ySux)6FfkWm*4X| zf4TR)_vCYO=IqYwtnZ$k?*uEzNnoLqpaTE^EGbD*B>><>(=)w^iv0X<^3W>@004E( zL_`#%L_{bR>}`zAER6sF+9;<;Y3UdGuLHr2l*<_zKQaQWUc4QgA{>9GB>aOghCrKx zJv`TUo=HwL`4mO8aF0f`kb^#()>OUtM@g0WEDq|@ZyA#+rBLh?n3pRztan{dw({>` z0Ys19iX_T*jJ>sN&%R~CCx&ndGhag-to&PwcwMuQ?#ZWfMl<3;RgF8*9tWni?4qs9 z7na8Olv?_?M~yct*jp08w#?MNPN2deyS!6m+xS)*4K|-bdzLvo{wkfo#Q5FYb<%Ye z`hp&RU4O(M0`EURW|c@6X0flYhtDpLs!a17IX7RbN4rG6<-I}cqw9yV_6#Hzyi!K>}(TD`u5_!lmox zroV|i)E80d#;czpzAXLryYm`!PX^_YqDRDCrBxPn0H^q+IiAq6UK&Yl26AjY*La+f znv}7uEa1~KjS4^lz5;-rDd6)D03-n*{fh62Axfg+{}F$F<9lc7=x7UJWOQ+HVQ^t(u(3B`Waj4PW@KVvWMQFy=Ad_Qvv$;X zrMGsV`gbD#m5!*9gMq!7t)rQZHRV6)>VLO!a^!pW?jJ?}ef>M1My_W6qsiLgKgD`3 zAmcwVjLZy7jQ?L^j%LRHKVtvH{9Ei_<@&ce-hUE6wyjRGYUVDHV*>kQ}_ zm(pquf)Kt5*OH<+c`}9ZmAG=P&d2DrtB<#* zc>;X6cX03<4yy&NadG$Lo^SMd_Yz)$4NbVS-bA-FTCbg-;;HJTk1wJ8uQ>TER9H-^9`~%d@l9TAc`-7B-zMQAT)DsM3D@ z!tC^qy>;^5+Sv(OsI~x83ZR$lf<)fwcI}r0@{a#lv*J7!zeSNxz7Ek{TF*naJ8Y16 z+9<|9j;a;VLX*}iC_%=e91++^L_|kNE7V#qE9A+MBTit)Z^NJ+b>I_eY3bv7AwT4} zoAd2Kk&B(-Fzzm2-IP2FoV!|wT{(=!Dzizy`#Rm$SIBpKm9Ne3Nmo;IWs^CGJ1Z+H zutR1ax*mG>L!r9$_C}^NMe6zLmBwOA{?b|tie< zqeg6Vc|K@Pj^@<$Nev8Ou&|cIZsD&{ZT_vQ^d^TdJn1gK8Gh=$&6A3M%&+gZQ)@Cx z5!%aR4hP$WZo)m`b#?BD<8^GO0B0Y7zUgdp%k z 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 literal 0 HcmV?d00001 diff --git a/website/public/docs-assets/rxjs/49/prototype.gif b/website/public/docs-assets/rxjs/49/prototype.gif new file mode 100644 index 0000000000000000000000000000000000000000..32c33528c2cbfd161db7651dabaa8c08e91aec9f GIT binary patch literal 106408 zcmeFZbx<6Oy0<&H&p;r-VUQrfCAbXk76_082=4A0TmuXa!GgQHyF>6`0fM``&&OJO zpR?E5_h{Ak&%O6d^;C7$RCV=qz5e{(mXeX=;nmZGXN13ou>t@9H~Ewy=+=&T^$Vkb^$tcOmX~`*Q!KA!kGVmWC3K}q#76loYf}Da9Oi2l*qNI2}s3|E} zC@CqaD4q{0DoSc9Dk^FUGHOa{YRcEt)YPvj!LO-azozG+AtRz83!eM1%ThW-r$ z0S*I2F(Y*(BfB{>MJF?xAS+EW8yhqG>vj(ER~!sc9Bdq1Z#uc&4018l@Gy4qFt6~i z7Vxlz@G>{>vgh&f@bNSM;AiRLXX)W*?c?X+7hvrbVCxiM8xUZd5n%5VU|$t@>o4#& zRfv5|NI+0XP+FL~1oCze!nG{I)gdAoD9Sq_%DXBim?kD7CeFVs&c7xuX)eJ#D#70` z!M`HGzb3)ID`Ktt}M zpb;_gi?Lr%W5W+(qhe!|CXy4oQ@)j@#y+K`q&W4p1Y?K$kD$0f{%PVV29~8|oWcYGJKSiydtvogJNh?N9xEbAtne z<3q5CvF(ZR>G|1(g=yHYg`<@P*viWK%Ien2>dxx&{p#x0>e}|&`p(+=?#9OM=GxuX z=GNBs{`Stn&erwL?&0pv-v0ji(f-rX;nC^ItI~bcvHdVSZtM@Abhxy__Www<2Q%H0J zTXxQ1ES+kR)?iica3ZV0kY#9j-j5U>hrPwY>in_q5Px)1*_wihZ0XoH+Cw#kQ~Ao- zewYc}!?DGh)#gh>wZ*gLy4_)&t() z`ygPD$v0H!b=c!F=!`T}uJ=b#OpQ&T5ivGR19Xz{JOEQ=;a5vDcaf|7k1D0e~-0$PYk*lsf(hqPwT=l zIMZSKW1KB*ulVQQ(yj*Jsqg%6){~4rPeH13uCN9opn$8 zk=TWT3-FWk!$=5Oi(G5mS%*T9>G6WPqglVBQ8!`xBYwS^>_%a>odrYH$Y?j>HI3&f zqvuJ@;Nu8MOwq8E?KL*P^_dlJC0k~p=sHsmCHi5$c<{lXCGpJ2kGsg+r8TocezTKN zX!ngUm^s9(Gu`cJmo6hf^386Jb!XByO!D!HzHpB(%3awRev-QdISED6DX9@BaL8%y zM0>?)-(YX{OKSEE=}Z=#_`32duEM@Kbs#ewRP?;EIH(->STv79#JXQpKK@aCzh*in z%)DkUNd2&G5!v0UZpD7)uwete(6V7i_R~?*!ADo?rqw!zs*`=Obv)MfL*D?UM6RfosO-AKd(5XXD~>x$H(F9$FWZ^5jU4lcrou zm(#+6SWfY3CZ)9sB%hfsW_0DOYG?U_tga@zq96C>EwdNPgUs*euNJ}iq}SPw+oZO$ zE~>D?>)#iVOZEOf_@hVl{svYzYfF^rJkW3{9j0ig6w~cy_0^}_Z%HmXZ+@o;@7(Uh zqLbaZka!k43{)^_}^bNeGK)?XE zaOUxF^U=e_Wl)^n#kESgmwT1L_rdXR| zr*sbmoJt5cW7Z3=cVg77z`y^K(+8+}t9_6u7eu^OTP!hb8qwn(U%@5vj>9I|n5B z&Z48jbEs)$24z2<#Uzd7&~Oh9D!QM=W?<&hNy!YoOFoM$C)#5$5><~6@$xxKca?qwzas{|^(1+_ zq0%|4dcfr50eZQoT9~M2t?1+~5xDxkGEBwM`ls86%~g%)+3B61=Ov~J#UE#fX6l+Q zON*%cP(Gdvc`sa+x&E+V`aLw;c6V9sgH@udL^!KH^S(Spp+w(_SG~$PJ|p6#j@l=p z56kc4q48KcnuAI6OWMwnX_p5E{6q^2@lI~JZ>^N+Qx>MZ>LUCjN-a&~el5Tj)YGn0 z_x13He=WbMt1aiZI`t{$lkiJu$Vn;Di00>8uZwQ{p?zqd`IUF|DY7Z8+WM&C)6&G7 z_~sZ@X2Z^5p3|6wmah&+_--yxj~g*^wCP~s8$GDkL3V5BW!d}pv{A_|E@S{;g%67S z3Ow;m2dZL)A6AL1_na8{b%BhxpoxxH!nyy`r4&1zUI@_RrW*{b43Uywdy#U}L&c2v zrfwDL-f`VU;(6$ViVBwB0H=tc`Hu$)ZFNG|WL;X) zQfvk9^ddMqR)J==-6VA*o6H`!!@9ugq<;A=c9&Z$^MjwtcnxIc3@`N}HPbECV~UZ`wO4K4ijhTE9UKusR^ zk6lHNyQvIdZGqI%uF&u*=*aXmJGQwmS<-Rx2|FnF@&NhWue+Is(YFQL02B$1g^8%3 z9~fiAMqlRYN2}U6zvKKkFy_CX4@egyyy)0*-#{2$>dh#&THt+HLzu5#=BVjcII>4c zo}DVYD$2$n=B-L_Tv4xU+*UX?&i0tNtKh0*$zPg}w(dI3b81CVJaM>AUMK=yU26UK z{QRWm;aM8K_cGbpXA`g9S+fV$HXa5E3oO>oTo(N7Fna5lJWK(@cPl$iGq(_PH#$nU z-V-W2P|ha=+Rkx~Zm(=BS-@d@WWCM%nGr~Wp*`zM)>y;Vb`)V?o8l1kwucRCk25Y4 z!-(hZ=WtX|CixOp!CWBS0w9>zkPpjUvzM7&1z9IwYcsp8q3Ls*ZQ;|e)k@^s47PqPh4(; zfo(>D2ZU3B#*IbSq|3CpzZ~E*-FjdxCaF_!Bu{feB$Ku%uQ{{Hk8}fG9oZVbrqjED zwo3}<=^63hkzxcXO9{pJn(!2KVoLP4o&K;5&SJDuJekC*JbS ztEOIAcia-ztU@g^mOz@yLBb=QsN2VIFH0-XL&uT460jav-9ECSSDm1RWB~6VUT#;e z-+j;{S5T`e(7kLCgNCn)+ECYmQ`#bAs$FmhP1@r3giw0`qLWTzN)%eSjvY!c0C zQBck`yft+_WmhmBJG_;_=zA-m$8pe!4~9M~%DfL~DhkDw6-&$&H0=W<3Nmq7u~6Re zxzoj}i2|KnVg-SbT{|!zqd=lJn6A3WHCJXu+xCo_F2~Ni?_OE_y#9iV@69Fc{d*j} z%GP%-1GLAA>JI?PabaoFp&L|SUF%|ruV7fyfVN=ZfGMd!t!?0S253tccsCBZM*&{x znm{`I?;u#?5YSx)rmU_rovH0^g3WB6on4+4DT+TAg}<-5zgq^D7+t_)RA>h+YU6ll z88%W3Ht2~JOUo9kHwlGt3m6YTZf6a^)(mtX2R`XyId-6i*I{{#`}7VVi41sZbznYZ z0NtaIgX$dHXF!hl4l9nIjvCbMc$_$Hkl(r@FJ^$wGO+Fnu%>r_e&d*T*q)>Lo{M1A z0Uj*B4%4v}M58FwGuA*CI5?!0=fZ!sAWJ88KBS( zWb19SYnqVTaS;4zB>M-Y#(1SRr&u1CnMTgKRSl}?rL^~K2eN$ziZUQ-4~#m#5*!Zk zoXr3sxkb$tfW`pG)={WE1QAn`5zRh`em)+=^vKgIps@^8@G9_E26ToMD|FnMKFOMa zKwGKaiq#krE{-jT=6&V@z3TUn&G44`h5>X&7g|A?ZU{j6hVr|@I~JUO+uJ31woWS0}Vki zWRZcsE|J!QLAJX=>{5I#un)m?*CF#KuC3dcPXJK3E>cy+SFt(Jcm{IRENGzvN#@n} zZC21@MHEh!&ngh%S}^Pryh>ka>k=QHag*uHy=t(b{0L*^Zgf zEOG%DBO3yB$Uyqu;p@SQq7Ol9j>7C=-tPc_d z1?9t5E?trT0{0i=6_dVvq?VaHFXKG(@jO|dAUl^YB}rd4H{E|b~wlx&r}ke`j~;r%AF>0?P|k>AVY z!fxb}Br5E~pM`xyrQYg=xoELvJH-bLh3VNvr3Z@FpIpn4T^vDXj>pPe5#`JsCtu9#n@cM{Hu!f zzKS*lStD<@q64&YT*BO4QGxn%6m8&}gf1cqgn=>!sFy_aqOL6>E z@9a_Uno{rHT<`g--aQ3$*#TOXbQwl37qkF{q%?#zH-!Ich`euzB5sV?Z%BA)HWsL} z`@T#ixX~vz*|n!Ju>0LAT9e~?W50Nlcec(!aFbhgb!K;yyQ*FgMzeAC7gUL6hxMiu z|K>(wDcfQRUgDN6{+8JZ^U8r{6N6^Vz?MOaM!Vq_U8*Jm^wtmA&GBNbdf6>616x03 zx6=2veuNpcLJ`_l_gjkP+Vlc6(_{wjYf(Q-oEe&&I*mcnzu|29t!a-Gta>)vwz ziSv@52R6(Jx5zEbrWc89iO|A)>!AQyExE3!J?HPl8xaW?$0LA8U|ZL4ko1zCbtZxE)J$Y3}%oFWeE(WFakplu=Y=M@fUHI zEz|@=u5Nd;fB=Vrk3HB#o@Mx;SQ3KE`gCAt&u*@k%82ap_Y-6#gWm6 zks;54V}Kr#9)r(Ai{L8gcpR%5^T+bTj}?;9HG$C$tGj0uDWYn|ls zn&L^D;%l7}SenXa1a9hr4&@2ko7+wn4apCuWLu}@m!=gTr;-2XwP&5ZX6v+oo7ljd zn@Mhp=9CoN3QN#B_N=SdTu9nnSnJ$S%j{IkkU(aWB-0#G{?A~`A;Yx!M=ON*nAi{qqAlY&dr+DkKDOLJ*U3$06wOH0eJ$E6k0<#|$& z7n2@>%7TWKi|DG(mtV_AkIN^dzt04JUugfn^7?&~_WQ2&_rucfr?h%33vrG8b_`GU zWU&<_GWO0=E;J#|nAR37YjzApE*$HXJi+;w%&es)?+JCd+rF-lma!10i@wxaqY>)F zJ$g&=#D+!kj-hN7AGpfGytc=%&Oye*td>jLwl0ufP5n34_`RM+O{m8 zM6{2FOd_}5Mv7bMY&(}#J6LbowK173vwJXavuaFpJ#9}-Zc~fxEW)a!EF*RTty{j1 z?$k`Ky++!NXq(wn*sapvA@$#_&Dwp@y&IjrZ42D{PPIp(xRbA``iDh>$Gbv&bIOuPaew-N5W19sZR2TPZ;%2rhundKcCTfpV5J28YMJHmd=Q=&WPM;M?>>$MAJ#Y-8R%h<@v+supJ z?sHx8tHG?x^3lshg9}CLt9H0KjgqU4%pIxYs~v+~GnVV-)yr9<>ouxdZIC>pONfH^rS-z9ly}YiH&CVPK$hD*igR3>+pp!vq2;#^2B-H&w|Tzj zbCh@9W7qLEca#XX`(<~D5mY4dt~LL$*T(d`PvB9~0nJk{@uAQcWG`EX`96rVlWn)0D~ zydh1{8=3Uu#qe+v_jk!Oy9@J~QtkGmk9?Pw3wSWS-+gJHu8*S83EK)tTexi2dLzi8 z{2DiBQv+$j!DNpG_FF#>W&6{$@2{e&O1-&(H516frJs+ z#BrpkE5&h@7**P^xJxP|@Zr?#Bv3!+RQ6q6#o9>{yKJa5owJXq^pgcs$8e+gPgh94 zPV_wNzlh3#%FyROjL6WD=djB$&GL<9GJvLO<=OhFtK~Vy#5ok+&Kg!LaQ_bAP~_dt zsaE7a?%_}pyxyoDbAMpl@+bHxovADalHi1?NZ=dQs7R3qa=w!xT&j8}SKDqMmbMfyh4dR~Xw_h$o+ zgGSssWD{Q89B#+8l?(3v-SwaGFP9RzyiwAX7kz%d=Fx-O6}({#Bo8`O0~0S}>VG{p zNLnjq-kNJAc-vNH5ZyaWU|1w6`JoxA;LKx`n2C_I8TC1Dp2x+gtk^g$l!IWq${Crj zKE(^jVw$bJ|81uz(%8K=CjP42tgx8c7N%d2n9gU>5Y&2SQrd28v01i{&}{igUFU51 zeZ-i*PPJ9-exq*t%bTr+`E35<-1N3zl&!F*n!TF)WmMbl(6yA4P@u^JP3KG6X1l>p zvLyB)H2t2ho0+6o9mW(EQXL{3U$;6=DM<-B{iMhJan%md7UhDKTq*Ir#pOktm9r*K1=to z6-(o7cWyw=_ZT)~0<+qm3MRigMne(ue!Sjp_lChxbOC|1bfWZQJ}Bb4@c8fB$7)Bt zsC6^8MXx(T#91A#_fwGAf`!n{ZDID$lXR5VvqI?V$^qdH8TX1IUH$RnTnwBfXxgaV z1X(`TM`I4QHaJLR>QC;?%K;bbQbwIo9OjDzbv= z%27N%71Z*H+C&9VV=rE~4ipYn1cX~slMK#D$f{4qB=+R&-tllr%l?QaJ)oXy!jr-c znlw#0NT!Dd4HXxj#l;|IG5Gh%77V^HUH@u;>(nTxb2XXRUa|xT)sWDC6`NGI_yIf> zGLrmq(rLufm~y*b-n8k!Ee957@K#k)F4t@-d9o*uyPlrS(pWW>w3&u}jF;W|g;g45 z_iMu6p^COKFOsf%OoT2Qm8kC|mHQA)AviorkzVWph_#yhUP0plF&wFwUP+>M$P*!a zYH4^1NgNWv6X9Db=_I5{lDsIBQC(+2)R&3UOu>_13gbK&TNA~Nkf)N89fLR{66HSx zO{IQxj23vCsHlKE?G$mADUOuLUY;nE$Mv&NDbQSB3tcFO=4WvRhrL-gi>Ma7Y9We2=P z@ff3JF|c`}r)sa1(DDFQggMkb5VKdQTT)`=bvH5MZeD@4e^9{ut8d)dyygqzVcnMd z)bvO5s@<>VmPY)a7VJ-}QHrgsoti%_C!1DMS(RF7e4SY_->rjVuxsfmtW^Bfm=~2JPY!(d0E9Nv8ukHI3vjvs*>p+`lJ;Sr@&ULim8NmrlywF928bjcU9Yu~wa-4Zc4u*hd0 z*V%Uyl#w|LFH%0V4U?4qJCP^9sJ4KdA(U_I36G+iOcrh|T5VM#Rg7EAvA4ru zwCcFwk}XbL!x77wukp9=Tf82PqsDCHeu zeevYd%93T{M!Exr3+|8$1MD%9a@bL zj&W?1Jnp4krC|5zTp_0-jio(}e)pMTGVFh-5vl;u0Am0d0D$TTfc;w<+vN`YCmP!i z1&f7|$W%SkSj5X+vB4@z;Vi4dsrjf8Z}1n6Pp4Nw^=AM;y-Sy4v+-Mf?IyREg0bX@LuXahr~e-H(r0ct-nFy z*PT(!21BVb)qg-@;;#Sdw*Cnc*Okow6%r4n$<>!FHM^ewTS&ax9fG^{Q-&VcDGV&`{=h*9cRq8(_FU-x6?hZcDKL#`~isrUYYM?hR_u4 zWQB9>?PN#&0g2<(&3AK?jEi>jQl0m9^D~0p>^(zb^S#1?yrR9LlDfUU;)*`zXGn}0 z0ofO>n@rv>X&zdzC~5B^IwpnZO5p!QXYg#|is*d6c_nI!u>aNKM+On;M33P6-PXs>qK=oj0mvs#T{7(|f4%}1A z7naoog2YS!fO0cq+1y99gF0l#`^egrApVJlU;wz|`3DuI>ODnHgqp*yVJqP3+=5vv z&Qdc|Jq8|}KkbvHUuQdjpW3$B7d6UXcvCkPi_0!)p+c-m-yfOgDFY5rjG*fy(nQQc zUCc4BHZ{x+Ac?_3qH<;JLZ|2Ev=-nEAOC>`Z#X55$hfgMj?N-)`xPGt3>jepxUR_~ zauEE$9;Gt$@hx&TJeTHL-H3u4Rp)SYKx5!s!4#|zSQVKEMn5VcODyUFe%Q(dbk4ac zL2CRKy-=8MRs!&?Z&pLvr9{^-m_}ViBZa>xZ^XdF8aEP!(|OlZXqRtSsXeV-cj9ry z-FNdf()qTs@X6dEe-W?!;Z!Vum(Nbc54b)3FXHlF(#4-n^)4rwn+dB44fWr~c{Tw4 z^Yz{XE_eTNJ?WEW!Jua`(8IRvvls}AT>lR-&_7@A?_!`-8IHA7@2aOm9M$R!B0o*{ z7Y~FS&l$xU_}6goM@Er?>-+Cy6zK21ep9u%dJ1VhQOAa8xYe=KA)Yy4UF0WjNYiyJFiew(Uu#RT~^s)Nj;MOAb_Zp%6**HSorehg_T?ila>v-<)F zde$uxYM2SF1TNI5umpoqSBwRq?iSFxdB>>|4*0oK<9dY!u`&MkzNsI4eU4OP{1-XR z8zmQW{6PK-!&s~i&!=wCwmT{brBa3j1k!A5RoKnO`yBt>~ zF6I2GA@XKte(p2JbUB~k zmnqVr?0g%KtDxfzJy>-;>HT%U&I1zrCd;zZ`8F)=+(o*h^lEl2HuX2EkJkf|SMU<= z-83x#aNUUV+4=k@_w!?ech&KSS3_O(I-9G`aKJ+b=mq9QNsT!mtag(FKxMk}tbODD zN=|U>wBw$>fE9TlAWl_@XDPLsREA`)I+Ww70N#i8R616H=g6o((qm0+DguDja;_-w zYu;eYaets&@$Jv?b5uY@P5oHV@Tq~4z=2`6BKN*D6@cccC0oz=YTV(q;Hl%eBG;Mb z?Xsi!Wc6#o?bL1{*ZkZqDB0{qPM*NJ;rez6RCG_v=>uhsnP&zW^>{(%Ki5)U{t(>F znD3W1Y!&U7wOsA(m;Xg@M^k)IH8O;rQ+Ov{JXV;UP@qycVf1w=|A$%eVRokaC#%A> z$l}i;o00b=4!gqEqovUO9j33e+@-(Ufn&E~xYFd>Ucopl8~Ha;K2lHU z#qo>Ec3?OF8E;-cVU`ITg6MfJ3gO|_B!UtKAfnO6aP;Qnkv}c@%G|3-j#dB*&~Y$) zwS%sq`N0Pnz}w{1Ey;4bzuAoc+w~d|QtLEVL-j4yHa-VCe-2b`+ zZgzdDkTKxagK)b!Myr4SbX9^o<~TPXCJRWv!G&5NoW(BkF4d@x^3Lh9eic4O<w28CY_`j<-go;7!xE<&mD7HGF1KHO23yq7Hp114dSOAT37!H+mMX1z8R1h6YM|= zrV3!7bQ^VcPjj&P}`dSwSCZGezJDNs2`33g4uQ z6(Kh+=Aa<`rSk&;umKBj^M9JgKQ*NPPkC^^Ke?>uUpv3Q$%FrA(dr-a;QxN-_kTB9 z{aqgX|C-LvX30TG@D?>^?B8^L-|~cYBYQx?H!BX?>gSk_N@=8*9Lf|hJpF&u`B8qP z%b?No4TK~b-$C3~$wN=zd zqVTXj_Py+*+L&#^-AlOhF_K?jijSJ6 zlW~|E@xOg#ZoZiLRZIwbfU{}Y7G($~xI%6@YByfF59Ys5_+>)`z&K#7$HEuDPD4}L z=xMPRNVOv(7RI#fd$Iq?PP{@VwXB15JDI(Vfj^vuoGO+vYLMi<$!>_d_*YfGSr4Pi z;Q1B0J&}2;d<~H`%bKY*hWi=DNPa5OdU=Dgqd| z7@5SZ;j|30aFuFbs#2|GvBHRM?^v153ByEf-h}Z)r=Dv&ks9ilIo+8o@Asptzram$i=AVSMXV5PzG zivj~QN$YmI?`nS^OgP$s#ql^80IZ^T5X+YBIXAy{@eMMy|G?H@$U?aQ% zTCdBN9kePi*z z#byHltsBj0$Ys$c)kZr%-;fkSU=-;6^XSi#!GWTuPE6nMRZE1>Tr$)T?cR&5nD7c~ z!cDAEDwxOQX{Oz|Lo+3!0jpRx#Ad%TTq=Uj&K=!8eIsOd5|Dp8qN?nZTxuU2XnYo5 zLF=EIOC5x?Ip|wqEWI!ldD7DVcxp*@36_TG2_ikAJ2t~x3FW@!67&r3sH1g59AD+mx$iF=T>hdk8uySYrs-O5#NNaOe<*7ZfRgZRU}x_%D2bcS*fS zS0}u}TW@Mp4lPaZ8?@6mOX`h%5O6KWL6%xR7#|z_ku4I~&vxa=r*NrtP9=Xg*q5|j z#((;9?eY6*kGl}df}r!s4jI+Zfb2zv2uM`f7dzmvV9{zz%I?#^=1ei>SXVca>jacm znu-{$Ly`sc#D}y7u3EL3#2U$u4Z~sI*f`_5t3;xio>4yzD+haV7r!o-gBw3V z;j*tVV*l9uqx>)V&tS`)V9641Om99c=*5^)n#JR{OA|Mx3#MlG@(07i!Sn1A#rY^i3qWa^%prA{SbGVe2*Q2SR^&4cNdjVqYVHtETsQ+)vDP$f^5|J zx&CzMH(E=E*JR}l^}=hbAmomT23&2PehOdcEt*=cbMS8La)yn%h`f z7l`v4{Vo#9?PSX2w)e*Fp5}LVwTe-vVg~JfxmEX>&L_Oe6tAD3Y5A4Grp}eck8~bQ zv5VV^*Y#AnhuZb`Dkn$It+;{5Zr2{l0CLyP^0bp6eDqb3^sAn2!_x>C0VOcG+n_Mn zX~K6;$$6oxA(J*5lsKxT&8ORR*5&;V*Pgp9?RPWH%PabPoBRGRJY2_?Y2UX$DqZB< zMTUr72c4Y;FjUG_0s0d3LwjsM6rc(2!+%sGac%S~frUJ;t{%_(qqBRSXBm6Mw_{{& zQGe~|4BhMu`@ZqKPZqd6)*t=*3KgBA7c7$gt~+=vJx@9NU(07vqb8HMiNCE-sppRQ z3I$NJb^UFH>d#q*c7sghO$JrPa%-5;pDR=+ax}_K;?eJN|6HN^dq)?Idz@j|@W%?3 zAj0|tl5AY>yLZnkRR1y^FTJ~nV^CNK_;ZEoTf20Mq(bu_)A0|#(kBfuTYmqsLiObY zKXNiZ_IWz)b$PZm{l|3NreRrle=gMJ^O(@pH5>eS^z(H5%SiS8)i){OmR1;SS;Fp< z!`Pt7@8{__>g1Q%OOzG=gZUt0PxL>g<0x!NWC4Xn{i}8_{H~$C1PP{;UiWC*6h8U2 zAq!#TO*9lQ@M2uoB6#kcRlkDx-y`MPw%tUW>-FDttG0vyp5W`7$?QnSx^5+@5j*F}^hIRT$HEM&Ipd zy&V0oRMNU=CLXfv^IKWruP$j~-lZb<;%Tv-gV^((R=Xi?Bznm&C3Wl;LSSHIiC21@ zmHm)6l5pk*lI$>J>hvmO6{L7IbHXf#Fs|p0j$JU>1Wy@KiNp=ljV%NXU91BsBpovo zK|-#3dl30J$wQ!LT&!BL7MUJmt&|qq^Vm#WMdFoK-p|1J^1~+Tii?@yn2I4Bivx(d z=0qSi?1E|>N6Lpy_D$h~FQUQRjq01G2CohyMJ zQAgo}7}^UN0`%Rot3E~tF%z7g?`3z^zBF$)j-tMH2OLD9@gekfhb3Vtbt4jtp>Ejn z-f3xlbU1uKh~P)4%!(FXI?)Tj9mMXz#8;L6Kod_nT5`4U>NM_qkg-b=he&D3iy_Ia z@#y{*gj?7-8aBK_clQ|3-#@OmD|83MYx-guD%3R>CASV6&sJg+qNBluB8c6iYmq;dNt`Kh^QgIVR35Pf0c8D`O=_v1)g4+^8lD0h!EHs5^j9noUHU z{V4}m@Tk8nAx@i-U)v>Tmx63Qb*@lNm9$Fd9hWppZI;*jBky6GrzU>kVxJ^)*pr|YRF zzbS&%A64c?OrY&&vm*~Csv|`GDZD~NRP%^@7CbSJkP6k|8ocEZP=FMc1IC$8J<9(^RYhsVGk$g9ve=6(4iX{&#CTR+tAWK40jfz~<&)k^5i* zl*w?JKq#6UL5NVF$eT%BUr8!-;O85P2r7VlI2Qrp&6x-#1%%>VcXB#?zD)ml&6{LZ z%`V!HIALI&PE?p_FI@)!$>%3LVa-l#zUV}l5+@v*r705AlP`)hpFY}{rQgc~8CbT} zJN*c=9C6%a1av(B)k}{#5rWCuRuyLY;OX!JuakIMdWi2wA=KQL3zs8r0%TA}1zt$n z#3DxV#eUSUQh2E>OKpy}%EjC&ieCYkBt@mjjfzR(T&J5zA2pGhQOgYvhztB#!hlhL zGx@Sid3w5J7+vx8UQ?GXb-y&+`}ZMuD%nkHWDo%AMvJIA2#Mo+@+AaM8}vcDMzF4K zpgN`mkcJ50gnw9 zB}^|&ugbfsZ#gZtsCNkL;pupJ59wx|iw2l6`UBtzV=tCN@Iv6Pn|vETCyvEav+-csrqxgfOHr~5(_@ePlO%daIMld; z0Y(FPqs$d5@}Kwpz{se8zphXPH!>k<`U@%tL&XfUVK_@XJpv<{0Dh-=R129diALp3 zA#VxttGQnAkTNnC!QFU>VoetQj~z*VzKMXXE;#E|ko!tDj!mS4uwt~P7=H4&y(t29 z#p?Duf1`j*w|;hemF7BRA` zif+cM2^=VZh=PGC0kjp} zt~^1ODXrp;s*^N7P^DsK}08r38Rl`)SkRE7)Ty5_B=q z(TESLIAb>v@YYaU1FdziaCC>5;#o|}!vKWd~z*X$!5(N`s zwTQ;NMAbu+UzKnbzu9jNwHL_iy;E?_F;@?g63wle%cB@7f7^&B&Ob#iT*v<7*8gwV zo|a22iJLNx=EW`g9)q21OrS1b>7<&YUV>VOCzF8Obx4%AXa;Hy;|6-%uuzF??<7(v zh(ZXcYP|n`_Z@u&xq2f}U)W1jSV=g}BMaB+j|%_pGRoJoar9Chb0>KF@c2JEyczJA z7kTjLbeR$FXS@5_snnk&VA0GId{-DbH}BnT#W~_wBQ#<^YpOMpdbJ>5>|n2b$6{4> zocQI5g+v#KO*coSfc+$J*28P@-~fj^9zjcLIrF$4-~z+8#o~{+>Hhj$0E@~p11o$f ze9@e6L`lzDC;==t71>aM)0=Ze;c*^pWTObCop+hRY~K#5uASGX}Zka7&Op|>_V{z z!}Z>niyr?m-X{W`bqQ|E^ki(IGhNjlMhBTGAI^GPwA@n6`EC#k1Lq5A9H?t0Jmb^2 z7Mg|hkIx%EQDX> zuXF<$5Dp-P`}`l(!hgI@KwsSBYR9a{^dAI~x+|Rcu~2LG_`9V0mHgl72A)dQg_M$3 zz2$sU@2}7o`G0$zK!M#Rzey2%C@U+(=RF)Uo$IM#$uHRmx#!mj?5h~P^M2SV^z6s@ z@ywp=5zj96Ua{y@$dYF1Lm*o3=hc>*XJbm9l_LE!9vWkx>!fV_UG4jhek&$CF2DEK z>}4S`v4H)QlW(d~5t4;H5KqZ`$OfR&G>S^>j(r#OSlC!D^%!dxjTD_fLlo=4{ako8 zAab$$S$OKX7B)%hk$RyXj|i^VK%Yz^g(U~Tl;*@yU!03#555Z&?a2J-<|+SO$@>dF zMVO@^PK9)0_Bl+8qSpsahAqk$MnKU6u8Ly^AXJ9Jd;u7;8tQHbM}*iu5k zb+)UKLfP|ln{hAo3MjA(EGYplk_0N0L1cQay?FeN@N$69J7-WKwYuFrF#_jR1UlIm zKXg}7Ns4!=jFT^X@Xs3p#xiVPeJqIAJ^+NifwzSp0&4s4#>8tJtPC*0A;y4&*a-K` zQh3NHP?_Kb{LrzLwI~W@?Ab*z068bHi`|lU`UDa$n($7L7(~U*_vJMl;d*Fu5Gyd1 z9>$9p168$rjljqUU5I#Y%hLfbVV-&&{EsWu2lW#laFFn_@+bj}fdf29?=CD6AXHU; z3^ryOsH?Il7OC*d5cjp5NZ}%YvckvnSC#}Xqt~-#>J;=}Tp5c)vd`w~NXgF_%vdgjwZlnw`7n0;9 zyg|;G61ed-@aPeakNZ3bWFVsWj-y}r_A5YVp5S38h>C*13M(EP{#A(htJ+0)A2nj# zm75;4dqOyL_z&;JY1lBL3XonQpk^S_@-S1_>SGD6^dP;Zi`F?X04qzw*U@CXQni#L zhbPJWd7~D}H@^dN$cBsBdS+CQv2f|M@fq)T8Kd%y^$TCR4d+8M%*lj;fz)jSrn{^Tv zEmb4L7$jDj9Jb*B5^|0~HU_I5T<46=H$JR1@7Qz5lU&91_9hC~8rdn7ngih4q=qXM zC@>Um#ON_A(3!R1&=KtiUN%6YY*7R7hj)5~`3P_#^uX9pNm?8(rY!JkemJ5@{>@LKsrQSW;X$W-CaEC z3|oQsqI1mqA(sAWJVxV7-Be|v5g}j)Nt6j5!*@U>5~L!>g;){#fveVtHoFTxNc3IE z|6%Su-Q6aia4Urj@b z>6`)cRB45g{ABGsg-l9-;=-PrtGC}AsOXg3(1?Nea{#VM#A8fiqTr>lz*g`_p6Cy1 zl!UJF&5CuH3setK3<}91|HuvBQ{w^vn2PGK_c`8X; zm_WE)*2mx@y0nWu4G<_0xoO_SUzf{(*`iX*r+W+n0x;XR++N%?4M5@J0nNe{ngtRk zZI%f1?_TxBFER7-!2_TfTy7T&CfZ%^V#h!c_~m)C6O~8x0=@($b;VS1&~lEUNJ~*JD=$%!%v;%AadJ;_BMczqR8ap4EyHQ z&aJgB4munwBLO2a+770VMg+Yi1CV3DvGCgaE0lAoSl$_tZ~-=JqHA(NBwh|6{&+c> zXLfdPAIxRxTvc+2d%!(91lq|H-K9!{osK2M*B0_>uWOp0j;9S@>I58OJ8B^2I&Raw_F`*7+X0HW)qZRAdY9juuN zvEH5q%u7D&4)+zN~Pg zeLqOeLF^0V<{Z_P2Gl4#vhat#u-=pEjks_RVa~Gs*4-n2IQui;?HM_c_qa>^!ZRe@ z9JXeUi}GW3y}u$!qvr`5Zq7aOO_$v`9!*!s$OBz>W~Ojy4HlcMKCELN{1D>wIT#&8 zbcMxy=DkB*+s^kRoDc2e33%>mXMN25))3a0&TG+TV`7~uswGr?{et+fg z+D0nv->&rtai?c2!2I7HW$YSsbKl2Y?61H0PcYQ~u`B*}GtwzHH;%Rcd)6~*!Loiw|1~^r>ic_ zNI2*f%~l{ki+|n!TI7hYe86F8UvTI9_t=X>5JOY|kmC4j(76U@AKz=erC}Ltp*Xu@ z>WatL8|ij=p$xY@|A1aO;)D7nH$1t9Z+z9_gDQwDdgNU9b#RMda%mRr`2%`gUt-nd z%O8?njZ_*A6(O<9ga4oz?_zZ=wf+Nob#e@6a{Xeh!n<6%#)Hrv!x8uf8L$W8bUv|ygI=Aku-rBR>f8uuTKfXO(DLX;czbP>mAEwE z5wV1rdFb2-qFM$a)8XZ8LUI$i2QjeYaQaK zb4U{T>BEDgS!eSz$*}D#qUA4NA4jnMZEa8hk^r@Ue|zPvsoZeyFKgJp1qJ`xwejbb z_y6~`@fW_gXXk%t^@;hnf?O8 zAx+*9RL=rK=A?XD^8N(E!THQCt!_jNt<4j0R?s>e5KhsKr^b+;lAIce1Hua;Jz6;; z*Z`Fd^s&lxGn_2npCPpaaSLSLf{+OZgsT^GbSD8X_6jWwy&Ub(clX`mq!-E5r{W!o z`SY20#v_Ms-2GJaEz^_Jfs>)9G;Kw%t!;TF=UPTycW7qX#E`V#c+pqf+KB$j>Z;7q zCmEg*^^EGaU12Bug}?$12!C9z@;eZo6JHLZbHupMMQ^?_Ip{-XdG2c9Af}AXS53b` zOdq48uYK$^WVLEK*n_wXe5!M<>FXza06zgmK;W%-sZ&muSb)>fwh|P+Shw;*X}Q?E z60scr^2gin6ridmgTE6f6u8fD-GBHDb4TjtzKc2K`Atyw|Fc)^UxGUAru}xmqwO)n z`&EBs4<1ZU)h6Rn_$;g{cyIa(xo8_;=g4NPQsa8oPDALRzt;8V{q96?qp&r z#wFOt%n5Q!#mnpgf)m`sisIfI4p{0vSjG`3Cq>lnV>L`OT)X=gGv4A_QR(jA7)w%6 z(Y`BLu5SEmxrpa!C?>~FKJ{m_nfRsVI6<9baQHVLBDxBgZxQ06wx}EaIQ(=uLDWlM zJD9r=xHCLr{l7kldvC+n4Wubiwh2L42|1uTue4UUxDh)=}tRzC;6MjT#=+ z^xu4m9(hAK*ZnSii3RWg*#rLHeTmvJmtVfMW?YWJ>Q~8|m!=gKo5rj+O?cR|@12xh z`V!6GVCU*)#W&c;{qN$UFfT_ValXV~7vf@4*7F?!XtL%KcdoBJ2`^33wHn=@1w5m+ zqHCCOr{y=O^uz-aKU|(D^$x~0`wljuDhrg;fkhh3K{ke)bC%<89*(k_4iwMgdVB#V zK7w~#c5u0u_ItYg!_7^PB8Q94{m7~Ix7WK5RrW4#EpB)6s_DLO zdi>)`Ni*cmL;qjcw|FI1H&5GmziI<`7#Q!r?xG{mvOVXz<4a;vIz{`=(oKc#(+bU< z0Pt--8)N;3Z}>>oZkn$?{BdhG`Zu*i!)T0^DOClqQo*5!*0z0X1>tvmg*wGZJQZ48 z(~ZboUb|N}Qc0DOn%WYv5CT!$LQ)vWHZG0$tRVSU(l{+eq11*fd3^#Y=Y|xiazPDL z>7GfQxE9xZ7`?PIp7gz}K(Ed;^2Xx=UAg(=8%Ak1gd1zh=FSCZ*%+;r)f}|_Mgn|d z5)Ta@fm%EIYB@TUD@}~<@QW*ZmO}LTvakYzic_vlVbZ?>#S?s$)(z*Xnui61kQ39n zu?mM^WwcQ>g{&YA)^iChsWqB61pl>cNKwNpEx1LSSDVyFrH&aR5q?RwJ0gIQ+ zn#C9DuYo#2+o*^#Ex$zvo2by4s8g!YGTV#NYM(ouzKCV@r5aEJ^M0xFU?nIhRcXBt z*y(&HpSGx6w1w|h&n%mfrFOnArU#~NG&jOZvL61sptF*?kt<`1_{`kem zFv@7bl!0$ zYx?|zlmXD~HSa2gn|nPu{Rkf2ccNMIpzhrs z{G5+>Vo+oS3_a6I_nxh?#hwrmPxW?7Htoc@#ul)ws`tp)JDawN(J~E%KzwVtSl7UX zFd~g!MW)?^NUcIn`o7w*atnV9giB>YX;Tv(I zzfJ35#$M){R*B5i`ViA@2-|9Ik=%^N$m36Y*~fCmLhtplI!{jbascEG*Av$vzS|RN zVC_;x`u@>yo_(WpzBMGP=2-OY{d|TuEAZ|h28_B>V&WgOQ!p&eX1ta&*e4kuMNx$Kc=h6_^<`-Q~xxc zaadcLl?#bcho&N;G5k z#sAwgvCtz1>vx66tbdqv|5w2NzoD{WE`#sHV1NBP+HfU;8h{)3@2~?LoiqPuvGD)= z+~#D+K2|_fm321t5cMv%{+xBzv(KR|@NZqO{|?9LjL?O_{jopRKlkeA|JNTDTULn{ z{#(GpVr>MLlO>7;{L5&}NJ5#!T{al4^Baz{@jedUk0jKftNb^k@h=kR-@~fHjSs&f zSnhM_MB%z#mbvtw=l)?dz6`5gBFj5g{030fsKo|cv`CBt_drf^><4j1WB;_G`)xu+ zvS_QJPusMiIn)_!3@W|w&&fEW@psclZM|4`>WVAd*V~0SrO&<%HTw?Tn*%1EiK5(!6&xPfsfF1 z_QQW2GjutVd;o9N$DY)2La_~ZZFLRIO3>G_%R3`-)7kh{$Xy?zDMZkPI62alZdI@W z5OTN%kKS^REyRBs+=+Z8#H}fqB4K?;I6){;nF09h%F=s0Z;M;^>WtmG0_v_9nIo^T zht5)(4L61n>FoP1ezwWvtiA*U+vB=iyG9;S3f-W^K>`c1r;YPFjA~oo zM|(W0^xJP$cR;=|aJBMWV3Z*8Ki8;7=&jfmK`>xc8{XBSSV2CItkIY%UpwjbA zxy7##swrrsf2n#;)U*iyrbrn5S{u^9NQpKelz^#;60OK2#s-d3)7@w*kdaA(nQ*Ji zb2_AWNN`f@Vu*@{7a-0wc}!>9YP!n&{h{2O@o23pW`{_$3uuute@m6nWg%8+zJu*B z7kt&Ntlw(4i|s6dkc`4Dl2eY8;znyId<{wYWV;~!U97$3RvW}?KcA*(UPUq!kJNFi zAbmciSZZAn?bE!(x|16rx5$Bh7%ZN&6kBrZxQ#M)nmS`Nr9@#UsY)n#*#M@OxTrv+ zIU3BgpZmuSEwi5ojVo2={nrjXRH}NTe=Pp-egTZU?6(~{W51A3yG+xxfBbpV2$Pk&3)o# z&V$f|ce$71<~RJ)gK)W*s@C%U%}W1Yzv2H#BuTtgZu@UM2>-*hIL}}{&PtzQ8Gp{I zl~#sskEH%OThLH#8x#DcdhiJM4G*a}w459CEfNd(M_Synj=lYAh3y@y1IS>!D1jsP zZ7^m+KwBdTD#7{I=Svnab$)HkIs&l>tWr-DyW5Z8(*vD0B&kFqHoH6Ov2j#Iq%>Ed zO^hJ``}$S^{Fe~!J6CQ#7ckg}`8x7k&TD^q-xi;!cPG84X7O zP5jDN_}anv2or?`1_YI2p(MPsEDBzTqLegSh_==qBVeOPvQhMPi?DYCtsIRIf zjjy2vr6Oc^*&{~$!pKAC`Wh~Xr;up`?WTRC5S?FGL88JRP9%XG>-{(v(NqFl3ajWaiwEfHPbyFmpuXH_3^x9;9 z9UE@GN;BH)$5TeMl_J`@a8~-ZUtC}6j~9));rA@&Rpc&&lC>p%s@rl=Jz(hUzO>Sd zFk=y!KRYE`lC`-TG-1a_Ob(8!$>oRyx}u;R7$>8J+o>?iRzY zh3MtUg?tkq5hT*4hBwn7RVcF=Y>AkrkCjG{hsroBy#XoBn^CiRJBX}UOp}h}bZ3XI z;&IA@!x?)>sP0GS66KN4xC;ohyslvA;q3kTS4Wz*YH^|7pZtjCs6Sx=SC1ENth|z3 zjJ@&Wcqu{c>dA77smsYq+P%t?Z<*ddPF8axuAZ(Hrn;Q2mzGqXZdBC&INikbTs_;W zopL$*-VpQ1>&LU7!+tpB8bz~08|j_KVc@d|=evV9exC1*s$KiFKWX~#*TM8Xc*2cO zHQK}QMNf9muZyH{=Q1l*7Eey8iT)N0n+D|K4tMPTSfThe=P|*5&5g)@A4$)Dc`e7K z7S6^Tyh%TvC&`B0dM1>%%r4^`e38Xis%wGdW6txurOabO#QlJz?li)#pEk}QH>C{G z`;~`TJ5(aYK*i=6pN!IE+3FUMp3i35v&`vkE)73TiKjIXIVTNdRSXT(TUdL>@4&CB zk)KQoy7$Z7$m4lnMi~&|C6O3>WS!E3u9?m?Z%uixIx|hM7$K}?%43-;r@&lIOyV>E z290~`u(fy`E@o{`h4j#l>8rCp5gLuAB>uL~IG|sZ1NZMaJFuk>?t3uj%c|P9h>CG{ zKABG6uoti>dot@R(jOFTextp|uvkPIA&>(PSf#k@m-0Q~T>uoJBz@oCJ7r%RfCOB> z*f*qjnu-$%D5P4ma6!(Di7HH)L=esih1j}l9a~|$C z8X$vR{(jAM`FJ^h6Vd$j0mgrIp8Wgc#jc1>UCZwZI=yOD!6#Cn8WXE&WDvtRSX{HEK zq>Pc);%m?g0rTt`8H=>>bj~GzZR#U)$t5jQuGW^)#H2wVZ4AAhs8TNokfs2~i6ty3 z3F-?Nx#}UaYj2*)F;38{)ABQG7i)<=5z(Y6Ksn2uepC;X2$(%@i7Baip%>=O#OI6gV^hDcSA>J-cDS2Pk+0lUt#2EL(FC9FR9Nbi{n)FB!nMMfFK zJ5}az|5GhS!xgQT_eyDTY>&X%q@jq5J<05 zhyet+)kq7#-a7eR&_n)XQ!PQaJ>(P!{HrW$1w;Wf0ZRW^x1jI*Mv=d-+fM~*iEQuy z2GQM@>LXUTumXopVJhX)d+)8`>X@UdLU=TrQa?yTbV=3`!?e49V2GAzG8VQ{ zjTTR4`=UPn^)1Sc3=9xyzsY4#{`#@g@)dmCuK^jwPsiEdMH(mCooV040C?OY(wiSA zuc$treJgd)wy!YS7Pl?;Q6|p}e@N8eYsI$n;K7STs;=k^#}0fsPvfNsDBmj2cZFLv-zr8*>Qskt6;^0Oyx>$IDT~zbJn0bz z2DV31X0TypIB6a+jrQ`gFg5TOnmv!6=eJW&h=B_KU|P?~gtiA>h3=jvWY&J-1n|Ve zD7$EiemL1uH9_@=xfDGYDk=<(a5Pt(h#n~=cgCkp8q+7IU|=0I(J^RA#^?vU(&x;n zf}rnKK90UhT4vZ@@q=dSS6T-N#yiO_Qa&oALI^DiRNO5NE)+uu-I7S`YS&lR2q!3E z3F?B+uho=vgBEz96s4$9Ft<8c%62jriJK--s1avpKemBPT(Q(4iG)ca*QNuF* zRYL)qthf@U6Mn+-G(rAiZ7*H`9}}!KMPP|{jVd6;1|ev1UT~n~+sc(UhW)~oApHe~ zRf_|3pVy2aYKd_*mn^~^O!5+n+=svCSSE22XH`;GUxOhu7l7*zq-YSHy9Bfim4l!g zKC+G{aQutp;XzP~x3()gXcsL@#2U{=9%OWK+#m-tQoD(7iF0YF$R)}kn+n{OxZ<}) zyM9s-f5drzrRN?iDKbDt=tZI2M0Sz$!=!}wMnv_m|n=w_18A@=aLI=h^sf4~p zxbE+NI*w1QKt@IAyauE(KT}@_kEnmJti%?S5GZq-sxb(G=lOCPaq3#~`Ncz?WK$ zf}FN|>R?5^1Tjfvl9tm6ej!Ap3QHa-=WE-b=E+F%<@Ml)=e>02crj9*-=WxCr24X5 zXpU$wr3QmuI@u&hAte~_3I(JCNT#Ws+frLlNAlWHg`1JVXdfX8tB>!#kxUfh{w&oA zFgSsDxsr?2ANRtr^TdR;?N;^5lWcvh#OzmYDiM>%LXL1$AMTn!w?NtFARwlMG8L~jFD%sX&6i= zxaP|VsGD!6l{rr2kqEj|OIe2SJmnVWEJPSMtN;*5Fh5|I!$92#4=|?1$5RBTpZ_9z z!7&ujJIFCZ1|np-Q4)#Bqk5(ucy$@pRXD%E4vHjv5GxAwtPtaLZw-bO-X&4*+~L?| zh?JWS0!VDxmTNdhAfjEP0%(vh7(@6Oix`^44p!wAqkf%;o(urudKe-~AaF0g{uUUJ zcjgeQb#6_B=gGys&ww)ch=jH(fY|p(i6jA|k*QejFzzi81Vw9IdK;>WgLx-HP6UBh zAoQH)B7qPrawz@^WJR9|Z zPy(!)L)qVF_1zw11}BZ;8&Hp_$u-Ys9ce~#w?JFT0DI`Oq#n+TQbGbCCibYCUif}l zHxK~*kjlUye0?WE0F;2|JpJ61&X>q121XvMwcG$flBi}Th79yBbqqW8i_tkpIDP5p zq;*tRX|1!70M8Q)Hw=V)cuV)V6^IAm172&_r~0rp&6eDze#1TyA5SZg{_r~KAS#B^ zcRRmd!=%gN(3(DAnu~c@M1}I5K`3f;=?>fEuLvh}9bGI+Y3R=S0Qo31QV9ekzkz5q z0&Ihf?K(u<*j{(@j8ny8@Ojag4r+JT5Ei*Miqya`i8;}9V8Qf#P>@FY3FS&`ENBwO z*cXp=qcipfeds%psQUY!d)YJm1+es+*DuuT`F_v?QSQdB-6+h486EOeN?+~*GT z5wzto%dJ?x;hOU!d;kdaI2^h(!{ zRXYi+*qlm4IMre-rom=uLw)DRSiM`QYTC__$kg5aP4W`d*NZVVx~?xBf>@(WmFAP3 z)kp71jIOnu1)t2lXTN%>&tpgo>=}6)O>+St1RKMF?mYtv1Q`*?;HDNXJt&!#X*4gW zZ5I+m$=N-O*z3d@iay?*W>laO=KD>bm#=l4&|q^1k8F7{#tRRIbLin(*h;Tv8Vam| zV46kr17ZNjr9O{4QRO_jBS}y7)_8(}%U#|7w?2>9C`NG?r&Bnr{Y{@Y^9_FV#g<1) zc+qy`?#2Gnr9O|T6n^m~WGPEvr+^RseMTuxC_(vBpQm#gB{bTwH!Qsl>!*UB)YfbB z8uM|4)BUE;E3?V#V#v3{7UJX zEWMb(C0xlJwt3AzJx}Gzr%bNxR?eZl5s7=wFIC^cB3PU| zU6&V}TbEE|<8r@5mOAU~8+Nt_=aQaui*I=vQb-E~biN*78_?Ptr2Oi(Cp(+j;W5I< z|0%zlr9)_cl%gb&u#pGOEIgro?KVah+_4kh%#r%^CuYC|7~l2AeMle9v>F`NZujEB z5wk05VW5JpBz~(-^!4*e?}(DZ2jStV`^qP!1xbV{|u1mVzbRrIHNSM%(+e`~n>-|(Ec zwH^IfsOcHY{$mW{H1DKYbD8<<*|ire44FG?F!Ct8C8UP+w)>$H9t1$zX+ux;bytL3>=BQPLffamp~U? zdhNT2Q$YchN;&_Frx$%|ao(jIE6R_bJC#54Xw~m#|2)V)TGY)SjwAF~-90y6`Far( z3Vio55a!1zx zF7FpbcmP`Gi;FR4oP70OjFe##RbX3MfAXP0$;Y&$I~W3hQIXJjBW^+`@FdLt2n67N zobDm!>}WQ31`y^-43w^^02sLsY^-2J43I{Z6GUU;qvtT( zDQO*Y;R8fmC&LjZVTXYcNQ(3i_c)`cn!n;Vd_+_ZG7s5Nk$ZeUpOdpLDZT%46c1C#^JZYB{}u*m1m+t&fSJ|JE%B{0UxS54Hy)R2+YS9`iP?D@A#{Y4DHjKvbJS0LEJK0!J`o?_v>^n>t zLO@vu+Xi#XhKhFme2(P`LkuLl$n=r7whstj1lFig1Bo+b&)vYF)_ZOXHM8g4^zfBm zS4pT&W@(Bs_?mLS45w#=0ImO!_T zRsyDFZ@Q>p+DaIKB@{)Oxs9a9%J4x4G)Dc)16ANIl!0n;_(0i68>)Pf_dL^FP<$UX z1)=Lo_#dDgQWd?sp}6siAOyX$Lp$x9TGwaRF~ZtyHE}>*9GC&Y90LuWT0TOvN^vsa z&9fgjsb@1S{s@QCaBWutK(|2Fz_+k=TB&JOuB+pOJs4F8Y&&)=Q;|{D$AYTK6?Ap0 z9bmPl)&bVYy*B(42GOzu1(=3$+ac)*%|ZlYT|=oPYLeXl?@<^;Vk zLGCtiBL)B*9)o~hCxy4X?Awinfz81%=vzQLpX_ui9}JIJ1JO=V?ndsRXA8LrE8=ev z33S>IVY6s1e$q{ZRlVh}9BjJ1Bm}~QTht=KL)Yg1w)JHrB1uXNoeD2sGp!fdbOND za4rGYWLp7RAi+D(R-Hi}_+A9IkPnBpUUA9;^Bu#8CEf&^u$Fw_VL+lYFe+T2?J$dZ zyg+`jav#t7<}LY75>{VUiz*aIWU?JazO5{%SWP4dZX;3zZ`}z)g~Vcn|9@v+LSygERMs2$FUY#l6sc&gEWUpD-?MO%T+2 z#4ZJkG`)2mE8Kd-K$N(Rq=<9)toNL=Gb0?iwzD9Qje{vF^h#VEB@1X(Vr09BFqs`p z=zV@$B>H(IO~okrQ!`uG?vR=^!)t5FyGv{zF-W%fS1<0wtW7qDN77V6qfMUV69?TS z5HUbPx$XR5`3?kEK>1N7b~eQNV0^xQa+&+}?%qaE9x3~;;@OdG$@re90N#%ed1Dok~K&H_o8k-!vId4kv z>UJK9QRqsi@Q?Is3URpa=j4$r{dCN>mvs1V0>T_}XukxJU zqDvbJV{l)6uzWI}9&c3U=jKgT#xau2>m+IWWi!kUHO(mHg@M=w%hX$Zk&irN@wVhJ z9XX*{jCd4cFe$xBe>LC6dk2kWvU>@l6xt}`F0`Y9QC^QIs>|NYb)T`H52(+|3Z2bhOXm25^%C+Q=}8%E@r`SQ=^RxjA!>PG%_ zd+3K#$-;Kj-|h0}pMR76$}xoP*@@9*e}=ens(_mYzx9poP7Ws<{`;ar>d@3NxfC?xT2wDr^atj3a z`d_5#vb6=0rv(x?P@dfgx*9A-1h5t|up3Cr7aB{AD|ACO8$z|FLv@Zr^%%ko zq{58M!c2U^DvTb4D6_3kg;^bkp%}u;gTh3|Aof1t4r$>|4dKqy;Vx<6s+5j!)o?aE zVlSTvpR|a_4G~Y$B9dUliBMvnY(PP}?6T*qRQ$48{5PNYwY2!<$hf{d*=?SD7v4Z@R_`b6W_-wgB9aYGpe@JGP>j!8z(n>5=x;EJ zPIU^WnP(()m9_07$%g8e}ItEj>MBJse}3PQwwN%b1a$&U8*2BDR)3JQnOg5B(dG zMhGwh7~rM;rz8AjT!wV_>>fJ12hINd?q3#7-=u8$0G#u8e^sA*09RdZe8J%i?S2O~ z?~*^>{7|g+LhB&u@Tz@_pTciQnt-l9t9ABUmAjXRc^*_Q3ILeqtsidlY#b~9T<^Nn z|4R*GU#A8HEpOLWe3tdyUvAl~8#IL0#JyfGkgmTpM2UZlTO|$z=uX?8nzI<@C^%;m z0;XxuZa8S%P;FS?0T7_Og&Ke5SmmXL#-iTsapwj}WJnt0<|oMUD#TxVh}V#q&LjV% z2aOF;fHtY6O}hgcR;s*qaPt#vv4c(|h=SAx4y*bjFrw^7TNkdn%t2Wi1Js3!O{**4 z8vsi4Apr-p4k))r1ma9jCX9_EsF?C=9wFV694RgX{%V8G0=Av%n& z*x?ym1qK}nd|)jx161)W#TlZ$8PQ(@2#KRK&L`i*0=`hDEhVbkhgyLg&Zm>$ZW1tE zZw(X2yUMa8+syK!@ic|-4}jJIc~vXi`~-p)BW0*%22G)Y%JMt}{vhA+UeY6LrR7lW zF^yDsJviak6K}c4*>#x0%kuSg&?+_FE(FbMnIav5kop!AAR2h9A# zIuNZaG}^f(1VDh&`;td04^KRZfoE&fyF;80_ouJ=k$^2_WiKtmq)i$sUHE2QDnB`KavkLnUhJ2k8KSUT&J)BOY+;bK9w> z&*0n=>kpA8FR>3kejNwZ>83u)OAH$E;;k%zV-U{Ft zXN{7{Wp~e&?#%!KTaLc3{BZg8LvuW|joj1VshIpKz(iYGE}QAyO^uF9T?&TWP5FZk zt83T;`ltNlI3In9Tf*vSa@_8$0|J0a%#NG9OAT}-)b=NY- zX=-^9PbhWE63Z+~O>(0;itWT!ldb$_u90;<;kWxZB#ncNf1HDCK}C_{wLbC(2ZQfq z2^vX3z#dvUi&Je6YtM6sPm!F$sKY zC%%~X6~Df&Qb|_Rl{~U2YnQ-7^pj9^c4R4w<$*`X0pm}{4%lnmKa}Ngd)u%#Q%H89a4^I#r+Q$e|aGrdcWyzp2O-; zR%dI7pjoRb9VR)f!j^H<^gX8{4gNY&iBy>BPOAXDS|E_F3G?Zr&BB|CE=5MGo1bT} z<8*aZZyr2&==XVggRZ`1=(|gZpZToULW3C;pJq4V#bdiSwPnQm$OaVQ_1-)(8+ClI z6&Rtk!;QC}wUxZPFqXUiM{nm?ANmdiTJ1QQHh;N$&2PwW?zp_ZWrOvaZx<|FS|X47 zG*EN=*v)7yT#Z3Tq{F{@V4mRTRNHjeb_lbU^@VCfJHzwsFjgUJ;)n&vcBzv>xD)CG zclYBVq7=?tu|QWf-OlRo7G|ksyH$sz;27?S{AISd4X`C%%-RXRJGekL)zC$)AePwC zO60Sq)Fby}$5rCdA`SIPzvi&m^E;W#;1Uipsl$l)MxK=(2hAqzadmKg#md$CbZnPv zxLcAfi#3mIBOBLM54TZ^yR`35Mw}@mLK|7aMA%xPhs`z|K;VOG22(fu#;UZx*rJA))kyK+%7U^`|@K75w=QL-1ml*pX0&<@HJ zg!A|3*5&u+rRd^aLltn<4zY-RENObEst` znT_|G)?(G$iI8s4KM4SE?49C_!lOm8T%g9@GXndeyHC*GPH}{8481kwmdjS04<~_fZauQ3}Z#0t*;)L&Qy;he*rI z;Y2S0Bt`$E*pVsRl7tURAP!|!BpOAzTdVofOF=`St`-1-C=sYMQSf^Vez1sfk1kNxJ5bdPY@oBRQk@G-*uWS&B?6td9@whttjN`TCZgncLp zy{iXqM0&fT2rXem-?t&}F(AWfj*3U*dZNMjZRGe^eXupc*2dKq9~|znzzEd8+eYM; zd<2>~ zkdK>%2pHi*0o)-|-i`>9gq*<05HRq@D95IQxN>d+tzC$vt6iN58cpe|DoL2HM_Qow z$cmS=bd<3Fz`JjrbivCLt4EqON@$7QCVB;Z8Yx2Z#?^(+gm9df*mU%AK0NOfK>>_3 zD}f*=jRXrLd$mn;Ydb*o@NWK;BBwNcKfN=hq_ZaGjyuA$@A~u3I`^|M0->HK_ZYo8 zKUz{g_gpM`-qr2icg3nx(&P60y)3U-^Tyb8pTIG?hg7R5swq^9q}!PNogdfl9Clfr zbUlcky8oUq>DEcAMHJdb+G>^d{y9PV7lQjHjp;k;xW5^yfSjh9j5Xs9sey{eq^QKp(kR)1UzxgG**00$q*O8X2@0-j76_IX z2$vT~ZRATf6^JrD&oHKb6LxmL@QjCCQW(74ypw-nCCD%V;Xg{8X0xSf0a1 zK9A|{fd;RGeefjii?)23>Q{|#eezuIW3oZE(cj!w^{LYXO3EQ(MZXH=awRh@sTx;U)@Fk^tS7?3%J@I@6? zgrZ%87vH7|H_;i&TumigO=Dh7=U2_}qMGS#HOuE}Ho@v)4c4FYluDoKa8qht@?{v&9}AZ z0#&@7HCoJX3}oLJnPU#XtlD8JdggB|KEJVgQOj8-i&TQFK&$Wg)j7z%Sw>KtH`U#b zsY>IwI0b@SkK7m&LCf5RiL`3w6oz~%=)rNrevE%iIQ&hPEVit6Sqh&|zrGwLcv%X2tg8Bn zju?x3ZPE%^4ZrS+>8mc8DEUp6Ov@?nFY?m2ALl;|1mHJ4jzg8u%ckukOfK`&xKfzf zW&h|J&KdA>PjdXNM($-%@h1#}{KE>&^s$u;$_ZFI&2I-e>~> z7LQlab8vsOAx@V3Nf$VfIo0PWB9r0(j1|&VeTShP71)F z<_f$YHXf`HY~mfHevbkejwk;Dk2WRmTAZ&e{kJ_9r ztLbRp(+=qbLJ~Si3B5~|A|;`NpnxC(BGRO*fPhGm0HH_?MMa8Kse++MS3~atf=IE@ zR7BKJL_j1HJ!kGcXV$%IX3d)S{S%V4*WSOqzn{JDaPo z&Z1$j3UF2uzvtKN?G%}%4a95sX3jb5e%X)DNx!=L+0)1B>>LvCAp5SHz7?naL_Cl> zuvkbk;(Z-Fd%Ao$juR&UlwF-0s*Q6z+*M|tP@JnTI|yFWIv~dNxII= zt#B*y^uZJpAUu#hXbma9QHZl($9&a0d!+x({Usbb=DV@`MPBztdsu8vgmmw?kz|SI z_a;x^qHh(ZPxYEV8LGa=yZ(xW0-)-&o*i$?DdSq55jX+4 za8=@k*qf~TN`#o+SCK7gh%h1gqTPENlo4b0(LxH8&(XGA1{!L`y?`&O6;27%ssTXG zb^FN$7PbbM+BBzwZx@@tjcY=in5hLfFWlO{_EO<=M+g262rqSR`?xm2Km67p@I7ln z^Ow5=-#7rhvuxvA8K*;%mnJP9AB9eZJvgZtyu5bs&gm^6S*nG=y&QYAihca;3sX_( zvzcd+JMyptZg?7Xsa-;ynSp&TL3>6q?MCm4bmjd~B>-9F0V6fGPw3t!)jfsjM7YnV zJ!9-$(L8&yKJVOGKO|Y@Q4|Ra+hoAPZ_MVd^N$J!z%P2!fUk>U>*<8mH6zus0G^xq zA|A|o<1NRS!YUh`%w?mT-{9bu@Mn)zYxC%DaTVPB+1IOg2LxwoYbvGb6dmsqOefMAU4p4osxf zJu{TW(~in7pF64{P9R)`4`h(c#T*UP`J&b;EaQF9-KsBBMO^iz_J*K9WMDFJrlE4yRs;YL$vc(31!j~qu6?SpwlnK^ ze4SYIb}x%AXHq*B4q&)v2i4_4WZiUL;bakI*E|YH4^!VM^PBt_DZYa8Rsk}Eb`iK( zHWQ7&!Z4=20YB&BqMhQM3Jv?kSS6E*P!oNQ1j%lsl0pn$(Gu%ZJhQ{$ieiz&D=DyS z7P~!fR$w59_~XsRa|20i#U6K}`FUmnyQO*fGk?@-D%QltEAx@Ne$-iN)HrG;ynd#0 z`EiV9_9fUc8wl_&IZ^wLCELhsf-1c~o%+aK!fbBXVYeY??2(7spZ@f2V-d2}%h-(G zpAIo}21#CI?VF!z-+e+(mGgrgq({=QXUP@k?nSbikZvCKv{25O_(vv_mX1_~`o+HK zX397&C!J^+E=k5S>%Lug_}M-?Ru|GT^7dQU`HnbzA3l`nVw99F^V;dhVXsHt?Y94X zN=M!ck zZj7!7{MsA9vuvdq%O>DjR|LgV73;($m{GB_NWHX%>1uGZFqkFYyfSgT~b-o&1rcZJqcP#ka&wX#3 zX;XTV8krxj6jaPS+#JI5(%J8Fhi)g$3&i))e?{fdO)i>b&z(z1U!i2)`PTLy6{kCW zwV2&myes8(Lki+G)|Mz&P4sz>GSUI4z2QK~UL0V=W8)$TquqQ zAvJ0`UwRuEUjT~_ZVL+TM@7Vb2U!hZq0yhC%=P(4Fn!$c<>bNXl$k*JNZvGA^z}6n zK}Iml@}w5p2k(YGg>9iNS;_hsF5C*(W!V2_%#tu3`(O!(F*r`xN|!V#@un?ypIFvDw?;Oov2v?7)u%*{~(Zx{(Gd)MP$$gN1As?Dd+ji0DDcx6yA@+&%O z42w=#38KmcR-|=rYeRU^MvW57Yz}>fn#WcENW81uHY)e&nlKAzuE*(RwlA zX{w&*)Lc8&(0*7LjeO&vh(%l-t&ni(4JBB84>b;eUM0an7(!wTlZj=ZQlir|o-0Yg z$F1V3^zK!?L2-f7aPj`|W1&c3MW78Z4itc(k%JG_(BEDM>f!y*+J%LYS!h%y1+TzK zEY!{)nL*o3FaSUhTnONeP_Nl|oNKgE>n%HDuHe?drhe3cGs`nP+PMe`=!bwAkUJ!I zXR3?OT^4zD_&N1hUkS7U0GU*dS|nV9>G#yz-~bn0xHC(O z|GXudsuuR}Cv0{L<+8@|KsUDOM@Wo1nj<7d3QFu=6Hgs*TbY4YPJ~=@c6Pvq(#Wvu zSSW~rd8yo|l!_|B!Y)t1nz77R25wxYTmwmMb;!@3hVG5q{#v<(21Z+a1VA{T5=4Qd{{ettXTQ~di7w(zHs+u;okkigSNuMxx%CULI7_O@MIC#p$HmQ z1kWu(v==eY7qJ`^p?Qm0PZqN~6my0ZbLSTGwiolw7vG<`$JAKNAQrZ9_8h^jM4Y!+ zWWD&Ra^cW2Qh~P=h$&SHD_+lVk@Zn3%`DNFFV#6H#q*Zwoh&nOD0`{Qvf_+3Nh&j% zFDn;jVFf*;O9*%o4^8Lg%^lEYVGnr_g*3fV?Stqu!*a(@mS@mSF#p-ELIWb{w;R9z z-R(wf`Io2szYBCr-cHYTqLYMdSUB|uFzbY8FF$uaTJ=x>9?>j!LF}&4* z`oCMQeG?A%p8j8m(nnu)mN8fymE~>yVMhLcB1%u>*HLK@E%iMyA6n|0@^x=s`(S5n z#kZKzV1@L*h|<5@)PLx;dMNVZ&b^`j4<3ef+Yc}6r7_ymC!|9AUzIR*Qw7!OLa%Bp8hOPKR^>B~Roa})8JlIz>bZw< zFD_WQ4>n($8}1u?TzBynjT+J${`%XS=g5_AcIH;9ZnwxQUME@d>zR6sMb+tJ9=a7ZJ1}elT~K}qZ94%)oryNVXwo-Ay@)hTGr+@);-HMjsm7Im!XNF#*d1>rIc+6I(HA}$O?DagN3a~F9 zX9$j2#l1?TQ|BSes%{y^RlR8KF83SBfb@;5F^w;SjTTPV;*388D&LpNz#qYb&VZmq z5ew3;$^GT~o>K8sxbKH_zxPfk5FkbCrH5+t?90R-cuD74YJEx+8Q0jb+3r=kf^Zir zJ+VG#cVla`(W&^LcM5qUFVLa1K(&95UbZ~9Fg1qj#8g#hJc5exIPDJ7vss;vaIYhH<`MT2I_*V~t*; zAIu$f_Fy_?Zst!!|Koq;e_^sz3Yg1}`cKLn+l6%ekG1O-ZhI#-vRXJjA8q#2VV{bp zts>t{H448s2pl?5kg_!_+p@7WqA(y!4_UtU+or=lA8o(Tk{2Jrg(oUbNYje+NIcqH zW$}1B<}$GEHPI^*FKLv`alW&tY$M*Qt@Q!_zTPj>E2F3WoAr)brknEq=X%Gu8Yc7q zd4{3CzL40=svU;{SBJ7dy3K#Qp1t=JuB^W?Ws@*Zmb!`Hub%v5Tw;>tq>^i0HC23g zWO!mw#dD&Z~rC~ zOW}DQ%D#WcHoU#LYpej*$fC{t`0M)?jc@_%V&iIKW3ht0ZX6M+@&YqgudVgfL(Mck}z|P>qD;dtBt+X4d(u?+U9Wj;KJ2$d-ES zY1Qu&pVD!=Z`CYge-+G}*P6?x=iTAl6G+XCUNr{?jKj})%>(BZX6*+6K=RGqS+R48 zzfxyUt8%!4@KFCr<#R3yNqZ>mjeIs#+-7A%iuQN&*KR4eyN2o78$oVPsvDAR?&-UO zQ%Kd>Ad&PmtP_ur_GTyBy*sY1pIvkPn*UZ(q(0>b&3J#J=iRG5J&4%-{HKy4y;elz z^!X33r}T`@FZEpZ^h{Pm?}vI9lRlT{hpf{9p7GM_{{VRYt)x7n!);5hwxTzsjjzK+ zzdS_unj%&EHw@e^NLiBr$@0saX0VshTV`jTSVeFA}9y({#2A zbeV&7@lc+GFa52K_0#DG_}G}8edUJ}r6w5GF>jSB>oT(_oq}AIYMW}in+{KNpVW-j zsy|J-SoQc1N$E%GMH!{qg$CLpJ$jDW7%30ho^O&N6~23p{JIP=&v728jboE3NVKb8 zA=(O>9bdcNaCtaZ-uE3nc}^Fb=_@x$94J1W+6p<4Su6))a?4rT!M zipZy*qwk#WCre*{(^L*G`o0=DaGU}lFuocz;x+#XIcFm5pYM7)ga?2g)tqahD?xS? zY>O=aV0%^ic|<58i|810wT)3X)J?7zJMqVO0$s-s`f8r*K~;N)k`{*uyyt!3`gcc!6HT=X;X)oRZt>V+foq7y$Eh02YTIRr8fnuP2YZ4-HoDo=__k)Vs$7%)@@jJ zZR_&zeRZ>$-kipY;R1vA9;aK&qwgq~=>coMyxrVP_Jo z&70q}t@NjMY2+wBzo~4D%-6I%x!-f+`#aanYe#KedZmR*up6p*_2!nTUl*FydhUxD zqqL&-1q8G&PVVAPTpcc&{a6>vrxy8b=f0Z}vTJO%UhVky0KaZSFF!AhOT7Z15@~@Y zF1qv>apG>gWFCF+Yb@kFEhd3$zdXGVQ9)&cOU+@OlVn(D0bo84IPpScP5^8iA2j*o zy@B^&Ko^9Al#wpgxwF!zapaC3;W92$9Kf$!QHAkcUOb=f&vnYi-Ys<2GD(@&1Us%V zx0iKV>xa$CxQOPV3zQGq1{b+?!Zt{R?}{Ti1vhKpyy|r+cy5p-P+?Bg)Agv)CY$5y zOh1bxX~p7%=!=(QvL8nET(LTmjIb+S4el3sz18tXxQhZYVldLW-OXa>5-n zr*sbd8v7U^fClpu<)fMA0+(}-v8gE|wk?i-rLd(ct?%`?*6#M(oY4hxYRbeUXv?J^-12F499f?UWL=OZ~lF@woU8gy^r! zrZ_bOFfMhGH;1m5cky^=^ate?}GUTPrd}1C%Mx ztftQcwb#GAd&?8Jard^FTK^c`>p0d*-}Uxwu!D;&R)U3Rv>URe$$2RlyFAgIrI$6y zv`+<&n$)Oni}V(OTiTzt7Jdg?+3`QYW&RtU>q7CAV3xpNzI6>st*q1Pjds9zz z@vv2i2D4^;o;6^QnC?jybg&QB|nHh~zIUcv1gW&=2JwP#nRd`cw!N5ylc z5f$R#HcAWFwPJx=jCZ-%qcWq8HUYl6r&)ob#hy-c*(gf65UjG2u0iZPg*+O#09Q`* zkJCH+=If|VkUG>&4=%dO(`nZ)m$HO9yW`3mgHAkI7eLCpQmy?=5!LJmdf;_M_t;g_ z7!LAcY*Y&K%|p7iag@sPn*Z9d@_7d711lK;I~N!@F&;--UqacTS2#xqhVq9PxTjq# z;}`sGWC#{^+RK&sJDcNIgV2s50_zy-NXK4jA7!MT zbxDJ#-o&F0COPfEZZVJTj8tO?X;HI9JfiiCP38VY=&PQ@FAK)M2Fp5*n;*AvH((SB zA@jxkF6BWw469?q-EM-@Y{+8}xQC zK?Yv*x3yqu$ErZcNYduMok4ly8gZmbBT?GK&q!=V69wEJiJV?C7-R3opA#d_i*>=^ z+8G$Aw2(Nv^X-F02%tIu0fUrQwpZQeOs|6%0p zOP#V&j>b>@acaN59=2_HwiV0ehIBp&{`AU#hUk67W2zgm$J%XVcJlhQdRl`yMPz5kGN)v})NjB`RWWGWG(d2y8mVF;>J4M>7;aW}nl%P=(aw_VHPRpruVrVFjn?6FA)<6d10bo| z0fy)h`wj62cX>HP{SO@4R$Cu% zdhR#)u30-yUee27dM%s{{z@9bYaV93aH6f5PACKSuOsCXR=bFCCMgW*I@39H8r}@K zVO)2CT5pY$7AXFd9d)$w0{_cK)Uxn9oivK!r%{yYPB=ioSWRZ1+Zmkz8;}W{Q&llu z^XHmdn#SH*DN6l~Xx<(C&ke>nJDYNKp3wTE(lNc7_LxeYafRXuVY9)&LELM}2}7R# z=9Tml7tp|T+yWsw;p9=a?~8K~9wEapr%l*p?R|EzZBN_4OK(P0dT|IOZ13fjnW>N{>nLDc24MLTE{$0X4*!QBFsMyDcqmIj5M z?rjqx$?9l5az}pt*04$IA+ylcS_gEP%JqRa&7gy}WjrI(G|HG(3G&xngww%2{aSRK zXy+)K?uof+vLPf`E0u^odyR(i(EI9A6C7prk?%q^BS$Q$cV}%IDW`*KYNk^Jrx>uQ z^dnE9e@7poN#oOdA*8J(2YxS)vSHS>5}kCJ0o#vBv@p{eXYkr$V4~hxNjTNwp8B>b z@YBvp`ewESb0UOFWgB}px1&6Ui!nI!DX#Lk1ZnK3xLr62B-Jp2Z#HZ;VD%$6K%{=} zu)$UL6O}F0cY@fqg;a?R2r(;e%rLHSF98#3ONy?q#9B!wWmPmMyXnbT$ z3C>oA9LE=7j?ha&)NW5TN8WY*27aN|SdvvD~th{2>FT5s-it6T#*u3~E;3{n6T6w}q1L+j9pH3eD^BSn1 zvnuH}9KY4SEq}Bl5sWx1cWbr(K^;}MAn<%<{K*}mwv}$&fmQmOMX2EJ1gviu3scpi zGfU~+M=Yi^E=Q?M($HILxtK)wmxo;_AO^t3K*!kpmk+ytKH?{fwZnImd`3g-|Aht} z!%N%0K>vu>N!>m3Pa!4h`((%Kvra8OBPl!=#N`$`!sKo&JO15Sp~?-iTpLyx5C9AZ zP@dEz;H$}#7jAC~;wrtSsxK~BRzJVd`N01oA)Z~{^HsG=jriDXjS)|)E0uV<@OgtD zod(?*^yvB3JSbqWxH{J@>VVlzHGhATjCXvhe!)~;e1%@UFtrCoZ1WI;GwbZQ@nrD#5X~1% zK&Za#I`0O)ilBhK=f4Kf&OCoMRzIf$Z#A6XF&>y5B^Tmodw=BYG3*aifU?+QuEI}@ zP&Xg!^*F?Ed%&$iU%*K{n)3HgybMUA&v-;QhbxwnWLcYv0EQFWFC)Z+JkxQFaKey_ z+-|GzEzm0IqW6g>yQct;iEAsF-d{yXW(U}&O#AsK1c0X2yWU(}4xDU$*F4@dU+YK< zNbuX5p325qF#D(FGIvRR%s>5Pi7uKXbl>KSI&4fh9lo)dz!$sWipMq(HU|WwUw-y- zFy><*%5sO+BhVSD!M!YToj|;Fu=_Ac^^A^BwaHl%`b;>*Mu~9T-hdX+$8I)xV8N}E z-(Uo*<7R;9Yg+0pR`rIl(`(?|#Y`ZA|1yYkKq*+3-Ev|w2~f@+W58i;;5)(57jHIM zZ;g*8isXSUnYgCIlG)lU0YXXq#~tS(?B9}Vt{G1CcbtMoM*t1Dnv59Ev0v$B#Y+?U zq91qtGSZrCGDZUt4E4keB7Xl_vR|EcMAz*eelx!DNcHq*rk1n9xxqyd}P!}YHmI&6Sb zJ)z0Bwx(#7`T&Wj4SceL?IBylpVB>ph#rl%{p&9!A(9HXQh0!cX23XzQFozPaGYZn z?X9k`!w(7@<2$srF`D`msR;P0JHLiJM_8Q@;OuSmlT!Km?cbGAr(CxO2k->{qyssi zXUf#2)&rqbKyL|WF?S+%eK9SL>Wtljo8qXtBu9T?@Je_dFgPB`z`cUC3QJ@IE1`T2 zOPTGkiK?6>Y3ztH!G*-WP3~yQb}HF!0}YU+jS8V7EA_D|dL|)9T_90rQEiY=f=-Ac z`k1(=0F7j<=x*ErKANyHUyRpT?IIYf1L3bUOA-ZyiPDHN3~Ud^D_xSTHK|LylrpP% ziwdz?1n~UEF5|#!XuZY7RGNA(ZgnSJK!J$o;)YAI+@p&lg`#dU-^0yM!V!br&}VB2 zczA|EEMI0U_%hTl}o3UW=5f>X>cC$gfa z*&gcO%@~XdS~2~d_|cvh6SFQ=CMctrAipQ65Q9PHEIUBNZrL*GVf8qHUHRfZLZmaY zOYp@5V{wWzF$VqezK)BK4zQj^QXnjI1BdjbEi2?IezWH5#1!DwCu0TjyJ4TRyV>W} z(K$CQ5a%b};XiH~`5lTJLl&Ron1@@Pbd=?!QTX+ePbepgQ8?UMV`kD`Jq_jTMVzhF z9k0_d|-^&54x;g&VF zOMlQ75*T-Z**Qc#ugdx~>1+BlG;99>|AUcJE8q=6?V zr5zk<^!Q^x)|3nP#tRgzurh~{N?!>B^89<7bCS;W97tZ)sq7Vo7bSdztCZ9JD3=1fC^a3y4!CUP&&#?>kg!x(4o`df zHEA$7?)v>o4x*QzCl?SbvA9UOqs`gSjwfDp$HMQmy9Yhge4F0piYzPWb`pzei?%Cf z{K+q)+j|T$t0W9)hwHOZo;dA#z^gkF@#qi+u%y4L@DDKuBIayeTNMycRM|U%@LS~A zf5I5PXb1pwAr3#^5N5lZJIt+{%*K%BC-IG3mEsQ(R1oF>h4wx)5X<6M*W&`v(F#N? zWJqr6BlN`pjiIR!~xA08A#93Wi;s#{$^lVEOi99^u~?qORHxovdC;xsXFY#3UiI@j|IrH$-MR zY0vlI53iTLaMn~Fj7}TwlHy+|bN@e+vsaw?Q7uyNGTmd0-16c_#HyR%!-kVtqP6T% z2HP86o{T#1(_ZzyiGl}p^8Jb`qDlBxHUSH=Jl^oC_t!xtv!5376&is`7u|MSf%MDWWZr8U(RET zYS?mcRBI{Pr8Sm!nhHIUv-Hzr_9^d65>!1$2sKp{v7zXm-$RS#IMu38eUJaWexdNd zzqN<^WOUlKP`CZv`;j!2S3+=giZ1dh`q{zj=i$rN`lLl;OO*-+==Sq2UMAOF;Y zj?jD@4VGmno(VKA{`=1E}pq)VuC z6AX&5i-V?T_CJZVUC+EwXhv%d|7!;Ieg7h|0x9s8uA~!uZ#f+JuPF~f4y>R$?iL&( z3%_3*{G0YC!%hHmdM!r(CoBwYB)LRn|C3?o_Ne?1`=R7A9TsM?7`dn7KAt4|$9|~L zFIk%MgW5Q*BQEZa(*I2lc+fNKQmZ5b&d>BYY+23<{^wqtr6@?3XDB<<#`~eDwa5Jr zcWiw=i`_dHRwZ^f!$u=X_H`?Lg#TG~A9V|SnKho3mY6}}{LkU(E$L{O^!uEtRQ0Q@ zD)0iPv8A5kXj@M1XiWJVle)wI$4<#&>r)agEZ~c7Ac}Bb+9=J+Y@JLK=4oN)Djpv>y(mXQ+ zKP`Lxxi=-i`0>{WP@~@UL$}Z4c-U#F@;m<5SxP=^M37j`)xPdbSsL>{;XHeOOocOa zFos3r?QG2szJMsVJL`UrPGs_`xU!&{T)!QxXV@?I^NoIHb8ghNFX}7rB7Q=VB57j( zIx_x4I_Ul1lMaq8kNl?|uc2({9~`~^zXDKygg*|@vbh&S(An&M7ASi0=yWIPCY#qVN+tqJr zKJ4HgAZQI^o`^BIqa4y#aJ}#vn_9rl5f(WB02_PH=s_hgS-M<{bpQzjC;&KG^7S3B z?ilW|YWK!jBY;42>Y&owiPG`lzRjLAm9kaRqR=ZXuk`bKexfcehie~Enh&Tq5|ssR zh4KXsBG2=wKER?0{Id}z|?ZRG83k6-7QT;FIMf2Z&AI6*cXRonB9rxf=R?w^P| zoOP2iXuIosHJN=2NU5T&&R=b2J-f#ORC{!?PXE)#3&-Q~;CKn`58cOv;t~L4@fz08 zHRQVIkZ8Qt0r(i1GIE-UBIok1W1^dHWjjx27VbY3@M&FCwl92+O&nr4y+4u3Pe)wG zl>;otaDcpDb*Gg|Q@G+9;g+dQm;mOC;Vl({Q32u?^RbsqvjKd%ht%uoA&e*ZC!14F zmHG{7YZf@P148+$j1FwU!B`g`IaS{y_Ketu)sG#@hV1=wrx&h1r(NNV6LO2#?f1T9 z;Gzl`W%cL?`IX8WSEzHcRWA-!9f*-Lo^M?#d}8+lx2tW{+b}Cmlxuo%_j9@wFncAP zTzSulv;mGAyXji^c#j28KJj%zivmL(8XwqzC`!-RL=UwL^TIk@_g6(oN{`U~Ng`L& zdk1#kT%(}`;a`Q0_LdW#4+uu(TQPyM++zj=-`|jr`pG131a~g%VI5x|`z&10mWh5hcx+ z7_|fAWHuJrq6ZnI2@?>>!%_s$N(g}whDfEL;iT3}P#Q;%mh)l}E0Ii*A_C$hv#D5Z zx*o4|5F>GB31Q-IAfie}@Sf?qZOtsgfpqPOo_0%&pBvDDy2hS*R1C{k0J2w84Pxlu z>gQ6r*~^O-2Y$PhSB2Paa{r!NWY;E$vbGb3qbpgn&L+li9QThFpWe(0>x{u1 z!cBzn#kVb*R>e4COl&#(?-V6o79&j&h>Mn>uVj{=>UV_!#t?cGb zasAxSqg|~HtQYq5_^rO-m)tJhB51NsC%QMGZk_){d+}JNS0yJ%31df;F|mh z?(@>iu@$5hQLeBNDZXMxRWe8?2tyE{Pe;&X2JUvkNI_Ubf-Mn<)^SM?9z`Rpu`Z~e z@K=&=Cb6f{gXZ4rT)&r`(Z$q4jx&2^QmhR%V)=U9j|gD)*&ZH^$^nrWQtAoxBG8O` zknMA;xrAOZ6XGzMA6pMf%~ZG}pDJa~R*J*=7ju9tA;&V&kdw!Q(&e&UnbNCH!)=NH z)9SE=P~D_kq!LV>Kc2gRml8#TFO?Ofbi3TfGJ!)&&?c4LTwDjXT4(My02zR2TcK!U zb>Y^YI6rn0{^H|ZG-ESTpWY}&o`nP4-c}B1&J?F#--+dAu`9;=Sef?dMYB|43DVsY z#7B3@trw9i0U0uA(V%V?B`}a3y5FmW0P~#Lh(QH1utfW*3I6u#713E0iP+H>9G0Yr zLxj^~?Un>DqJbiuOMvtAw;sWMcNSVkoa~0p^Ium!;4`TSXPJvQ908tkEdUnMq*WKK zRZu7qz+kZ_A}~uGPzqaO7MD5B#gbTrA6B%s(CdO#kSV6U*9fM(a1{UacS z$nFLxD(b;m3Xv9|mTXBZmstbt->AqynRFI=dGUh=v3^T7)6}j4lv1)VU{tV&5T|$* zlVZPG3TmG)epR{D?ncF9U9^=|)}k4~@Lqk|T0cH*67@(imgy|MoE-y9uMcyOx1#|0 z9fSbq=&8f*6N$KIlS#IZT-iZYApS)~6ytk~iN*&{BsR#xp@bg6ZEC_}&rj*s!2q^j zdr0;ECq~iKQf}eSRqn@ExMi^+965O|NXBmPReY9<5aB3ooSxihAmeio*&-J2MGYO&naOi zR1%c4>k|bcdTa$xLNO}1y+{>(z{5(S>Mb`g(Q#2Qd@n)#k>w@*>URqEb}=*&Eg^uz zgl-zR4R#`^YSDF%CF3onPi0v*-R3Y?V4U2A+jU95f-M!``sjOc0%D>7oudG>DF}0P zD9|brqKlfoF1_dsDd_VKIgfs|8yUXoVu=OUO@Nq-nCwYl^AqSflC#btbD{wpPetwf zpPZoBABP8f79r(cqgE79`xIt{1PC6>P%&;1)64U^pk|||NA@&U@DQ^JPd4FZ6bC0c zGd*iya`bn#CEHrLL+q(8+Sw4bY<-zt+q0GsdqCLHAr#Mh7pz-3}nV9 z3h;}nDGDBEi3Y}pp@>J$046+B62*Ys&I3g2I>!vjjB~LwB7++&MI_Nol>}Hxr5QCR zE4(Q?9Gq(F40eSgnh8)K8QPA$adwuZdd?rLW69V|1p}#|dNLvr3(+Bf zjf%_$W?ch$Qcaz~jeD>nJX16lzztxkB!f@(Wh`^s^UvJ@+e7rw&_^VME&!lHW~>Du z(kRgL*rdkL`=wss%LI5K1ySLA7qiGH@%i?~S|k^TJ<{b$ygk>pWJWjzQG|xUodJdl zjMXH>BLze;p0T4UuNIJ%MTKCn09{MO69U}GAKdiXd#2Zt%MMKq^{6rBl+%+*0pGQE z2B+C2lo6mbEP#o?pg~)NgjhbfL0 zR+iF)(K3ORr1?sql~UHp%2=VwEFYEo?Nup_7)7_LJdARQgGLc=b!k}j3+w8F=<34i z>XNSN$d&41h8i}JnsSDk=5^lO+?vk$nr8 zvS<8*bbzRv9Y&wOe&T#U>{@Oe9docTU-vC3ps!x|m`a_=**d#Y^nA5qCYlk3VWg7| z=)42Km&c5XWNy8`+%i3Off&o@#Jo2=*WsK@5j z3u-oq`l7{a>cuo0WSAO+M;au38|1$<$Q^4?q%k$BnKeQ(8kBt-HAfmXzBJ;J8^H`s zHl>P?B}L`FR0jaN1GUNWpQM8)w&73CTf)bjS>9slJu&1my4m$uGhDIR^+L0USu-r7 z*(tf%<4g0kj%IJB7B~7X;*0iMXbv4|4ykE@WVA#swA?a7M;vPn)NDz((89c=*xXpv zybaY=gk@^BWnXB!8{U?a*LFV~<^h0G$Sh7~EIS9NmA|w^P{89$`*-+mpna$)A9P2< zu@1OmM?)UE*{q|E4m;39cmC?29P8|s>AVhrd1GM{MJ%PiT0q5$Z7)#=u@JH^)OZs* z6aI8I@9BKU(>DuG7rsFK>5N9YaP_S}%R6!>*JitsV&}%fvyCs%MJAXtm3gDcZ!KAV zk93XZ54{2CFkE^H;G+OXpHi7%TQW@F=@>=J_Mc|zzckR(X6)ZIyV&zPAk47S1jObd zGIoK2P%LA0>=JhDg64N^0-6OP&EB((DCAS3R!}|MI2VR<@H)QS`rZP@dm=LOU#Ar2Wwdw0`7S$_RLKq~py~iq@>uF*RnMe|wx$sBWu^YhZNvnB>Pwl_ z$1;8#OKuKRs*zKf2bf2{LQET`PA*MB>f23Z*z{5#Yimy{T1_)DOqbM8o!g$aOr5rp zdu4TH+VaXPi&V6A>MQfNo#&oTU#flO!awbH1$_ZIb3S#(zINtf<%(bU80dHTi z{M(Zx9B={9%|QBZ#@s^7J)YwNPm{U6o=*8M-d(86I679Nd-Yz%Uw^@0!sK`%NNzou zM?SCV@<^FWvKo82Sz0DrtUru52?!gvO&vvUqE_u+XuVY0K;f=;Jr9JCsfdfLS3+cO#u z1&CL4rP7}ypK2PsJUVVq6AV-A=$>i4#F(gWA*j9mZe^rUUaR)GF~E8M`umJ>?WlhE zVqet6q$mAJ@|j^4uH&r|Zv@)3IR%igXYEWMb62`pumUZIy+lm=&2AlD@uDk6(x!89 zpTLW8IGQ7Oru(u>)_AxST``izXd03TSTZk15&3@`TYwBHgDaWl<&yR%fRtr{48dTN zQFj|vI#y%elyea1Ib@RQZuq81^qyC_cfR`^ylB{6+SG#?@N%N;V?pQx@%v$KvlCxN zZDA+i`8PRzDlgDJP{G9k?-KAi2}aUYHnai}f>cVmsJ#ME#dy4|D84$&{RJGGT9|t< zg#@rXyZ5k?+)o?MaBqS8r^R8OI-tFGxXGsF4Nw_BgUpN=yoakW_`YG8c5gaP4Gi2M zPuqr*+|%8uP7Ux$k#U_Z|L}<@i%!Y9Cu;~9dl7-A8^?7Idqo~=FP+>et?}A(w4n5TDQIV`ul^x<1tkjvU#E5~-mzS&z}#c5 zNdyKd*EW2iUQa&%lrNv!ngv-L8W#T)A%Qy_6iWq+>{*YK9(!yk0bKj|(sQ&PCn5og zSz0d*Y*tFQUv2&Vna1#-C`>@p7)9C{czd9{>~a?8{se!n?`+t;|@bKUtr>JAxd;k7HIikSMM6vwZny4iSL}L z%`bFFlk#e34X6jbjcJ{X3oGxyUh0=7HWw36EnBM=Vsq8^LL)8vk1AjOPE6=sF+VZa zxt)*C?9!|FNlW~W+xsn32q;!k1lWMoKixF8n$1YPYJdg&a5L6ge^TUcnHcqZ`;uPu z-L7RMHCAU*K-&l(-8edmJ)~c+=qhB-K{vIWumPQyFLOP$T>ve-?{vEdFaj~u1U37K zDcS~EkY7h$;QOEvXkb%?+4-7%<{Ws!!}A0nrZ)*c>RK9)$rEP1E%3!TL2ET5HS~=h z?+*Er`%x(Z&^eR{)^IW<{}1Bs`>pA1+aG-hB!rsKs}MQ@(tAtjMXDfzAco!%1nDL8 z4nYtQQ0XF|(z_aZ5hRExRp}rC(wj(bTx*@Z_xav)?(^LH%l!`^pEl>1W4zv#eTwNr zoMP2D$5hLL^;!+5bu3s(6qq$XSHn&2YfWm(t)rxPgI7>EdiXQ*mEbU9wki1mr4?GJ zlFhLCPsykHnrDMILRL8Z{rXYtE7>8CbeY2&3(6?_R1gI2%vyY7`Es%KQQ3!VY%Ii) z*DoCjSpfH+X83u>u;s}wlL3O%W#=YDVx>Rw4^mXfUWsONSwRBm;aW114J?s^#B5cT zghT+C)MX~E!1P>&a_A?HNco;DAQHg9VTUKT#HusoB4h3V7UCRlL(;#c2q-fsj>Xfi zn6*iO`J-_FVrCQo>C6n| z>^zs9ybv@9=bm`{p^c>^t%x`K7Mnj(--52UeO<4Dsm2|>@);GL-6bk@5G;X( zoN929T%YQqCa@YZo_2J<68eOWYcXCmcKAKZq1(;%$xb46G+g9w6hHd6?GiB-;o?M* zc8!%P+ir#_pwIOdO)tE*-R-VhPvd8fo9g(s-TVryrvmI6O&~jN89rd!kN|WgJ0!Ig z4wfKL4^Ba^{7bFDBFHc8lW#=*pZ~Ji3JL7^^xHdN;QjobeM{#&=x5+F;dp5{7afuE z4ymC4CA_Sw?cK{)59(^aZ5^MyJ6nAnNjf)!r=5C7B)c2IWUz49EZhFBubcT8`#x-t zDHaP*_q$&3?W6XW_Hr+;Kpo1Z-FW71D2ML@V|IJSg4UjQk6tCZbS}|6KOy&QC0tDr zFl<7;50Ji>fY`Ewzqag^Io`wQ**LP$1rPCw)~3BIh+}`IH!v)9Cw>C$2pgDs50$;2 z(82B?Kw&jR6fd4RPU$Qt#)9v^c)5SQ)<*T32lG3-3h#tlsS8_-R-@Dr4bMv1T^ZJc z$6SqmK3la>P!t&R$G1u)^muMuEuH%K?)N~d@aVc!gZv0yP^#dG!SYAN-0}1e`-q^e zWs{h;AqW2Z%VzyxRK{C8EA zp^&ws&IjpD_wWjfDvXJUdb>@Y5vvIm4*9OVP^w6Sm^ORyQ<_6@mtRX?7WA>*UCR+9 ze1(>KX^4jC4q-c4Y|J)hw%)I&dRp##~0!!*S~ zadsqwWGN*L0GBIqcFBtQTby^98BLSMP~hBDg00)wx+Ch+^Y*gtpuH0fZ2 zr8@Vaau5eQp-85mQyU4wRJ5rseG)A!uFf#z?3tT=G zWdpVY5m&gHGx}DwCYMb)>sgW#`-1MEzyZ&p?WeSEi^P67>WCJQMJv@MiaHuV;>VbD zTRiC!o0@lOL97EyIfcrKM*yR|GH!t@EfVGj#jMx-Mss4Po`*kpP8qF1n!3xmvJ3qT zpsPn^MCg!w6Mzky!0!lxZ{on00~z(L;U<`PJb>y1oh)WYO_|_)4)PVlOTob_A`)kvWKi!ch0{ z1kDmaHkAk}%_Ss=lIe+q`*g_48OZB*p@tZcod9Jwjy!TVWK_UQZYa&;v8dOXyDB(1 zecdj4Jt!)WBs#$*b(+YU$W<@r?=d6PJ^g}oO-OTQC;;u!)v=vK6j+H3XkExBmUV# zD)7nVbDvF%JKbkbdOqfmR(N;>cu{}%+xc7wh<|!H?L*Dz4Q)$P7>YS$5$?0fcWHBz zKCxfeaE5}ty!DDYkAptomoglH!$cPY2m$Lx6z!Z{^zB#x7{Z!o=f7_Y%xXQXXv5`)~g<+;U#^Z zWseG-v~Rl%y?9zha3<{wh5WeJUOWk@DjT+|cDh~u=tZv#?6vfZ%x-916_kKr653M; zoBa0SYBx;v{RQwF#hQ0j)or(HI^1h|H>jZoNKrMl=Wo1|=;zv)c(j%GrY z#rs#Y4_gbNvf}@jFzNjZ>YD<)H(Tf3_iESPBAN%f0;gW~X-zC>P3~w-ooyuulNh$P zKXsS)tpqnyosBly(i~`KacI&?&@&0bWSMn)MQD3vL3>q4d(CV+L704A(5B-g^GDBw zwb%Y7Om@z8v^=`a%H%CX8VT}Gx9rZVKi#U6aq;ik6O-o31bJ%P%aF6O65_Z3%{$`B4lNQ}} zEj6L;qFdOj-`Q(0*K2gqYr@`lL%C1)0-BxI#m{wXwXx4;uFv+O55?YZuiPJBYU9+| z2lll9MJXN?)O%m_`>+q__UUTJ^#yT9g~|+kkZicZ_Mc5jFn}6>lBn{3ssL!jA8(D9 zy8J9AWK2l8|C3WM`o*MV%3FctQ1M!4 z`-9gEzh!{C!z;@vv@V=@pij#A(ZPn(`Jv`lZ_Bh^KRH^|i0HxL=|SM(^mTOAhi2dG zLWC;>W9V|uR|)sHbkvwpp$XS4MC@r|dJtEy5t@=nrepg7KTqivbX4_-(L!s!mG%*; z*LVP8SEE-Z0&b~^j)F}*dkVTMc`3jnO3Sf7CB={%`zPfHIy zO?0j`eNrgcoZzD3{Q`S&6~PApusAvx_Y*()1(gM6Gg%CJCfGbER#l*LYq~lRhooj^ z=N{8!xPtF|3Xo~O);f5v!7bx4i*ntj`Z*9CPek9_Gp4k6;Xc+?M~)jDAQzAhT91qT zPA3K!JhoLIiDOGZBy**3dw&^%HI1DH(?WKGBFT+064s0bl zWSu3shqBle05ewTLX_>iKb(DWX|JP>ToFSP0_ZSXr4pMo-m%*GFclp3%Fo81!H-_R zW${&}>BH0I56ZB)$dx`CnkATy>f!(&;U`dOOMpKq8BqGTM_r~zOiUzb?DQ4%kWG~) z*`5VFuItP2p>jovPJv7oxR=33vMI-Z1W{FN#7Px$r8(_((>W1gAt)N|wNJY|8L_+xnCL7g6t^M(t#4y~ zOmahanN#)Clj}EL=u`LY@$L=AOUtr!sGTQrlV<77hPd%QN{qvBeZRaxBt2F_4_aM&XI8NiaX9Ey-i5X8I6Jw5-2|ncv_i$q)=mYr7<1Mo{Ia z6)ee{-W^3%cjZ#|5y=$l^NybuF6I zU;)T>iiK#`MowZE6gIw)Kk=Cfqm#^tWbYvhM8~k5zh9sZJ?(*0*Cp!wfi*3A2`r|l zKqrRJF{tNWVqL0>!7}UY>EE!XjRW|-8kCURmO{l%$>cFbrEFCHFn7d}{g+(d4$jk& z(|(2O+3B$5hx!~H$^?aMqCq@tA0^dcU1o90d2?+y=gY{NZ0Hoe>n?|+x)5cmbjR6; zp#J;0%br$}S<`R^(fyRknpNiYGaO&MRNiVBOpSAT)LWOh#88=3R+u%{-uV#0PPNSc zzP0C3g#_A*5+%cX_U>tpL?IsLWXKddp&KB{?yRzGbt}K?p14d}QxVCvk*I!mlW5vn z*yfc|#mTng{gOK>Fw1p$DyI!~7H9TtN!|7y=>TG(fIX;eB@wlR5izFiPQ2(h=3a@N z!-ry{p3&Iby$$_6h>6$qqmsBl3RrVY1UeQc3)LZj->CVsXx`>Oh+cQ;?*cM2f76;>;gn|XDIa( zh@Z_~gSoiOQZ?kXBVI{(+EVngr=p_;KSePFxKpkH~LQaqiE73+M0xZJL!;AO{S;zUfMsKWCcV9|;D$`!@w z(?um@v#kkJ;asMEp8^-}V~FEfoif4(Z@~uu(fDu>km{EZF$LvV>q3;xw}79Q-%sK- zI2t7|VTa3afixs4gys}IWj9tEaaeFI70{Fng@iH7hRm!(XW$PAE4RWHdm92HsYXh~ zECSAr;I8m&lY_ZgIOxiH1fyUxwbW;U57gvf=ed!)aF`MLPjbYR0O@uSVfR21gQdEJ zQQam)Lg20??@H1sLGq7 z@e6S%IBC)@Z?Rkmat$gc55u8B_Pdg5l~;)uA*&S;F*-p;U+jKA3Tlm|;tRZgOCDCV z3yr||P@h7BQQ-vNv)<(P2nHR4Zy{0GfO>4i#Hy1LtC8rKK#F1H^h`kyro00OQNbIb zDLTFpmIBd5kP94ib%BDUj%54hLBT7-UKHn9LMqcyMuUV(In&r{`#$3lE+cLk_{G5hjSR@Y|_L~evafZO&uAi`RanCxGH(bg0gGXf&Og;OwN|g3@b=@?^31YKsz_juKAt z3<%Cu{)`fw&dxv1&N|NZs_^ws%0XM@SvUI!=;p<@YT%CtYoI!LaG5eT8TLpJ7dS6g2_XWUngLSft`sEa6Uu@hX-%5|++&c1medn6h_Oed(x3;>{sq~Cm%@ZV@4j8HJ2jsHsACY+Aql@)&U8$Im| z`cco)Bfb0$Z8)!f*^|)p>Q0CCHx)&Fp#s&&^ZTkJZA|DFFAq1q-WfUNMTBxZVG+OB z;pvXYydXDc_kK<8c}XkBVK`Hw5^-rxB=~UKK|QRNfz6!#25Wp|ulj7(o%X<=^Ov$j zQ_}b4?tG>B{`){+EFEoCocZhN+n{Oz!0SV|xHrDlgfq#Y?|3@HH_En=Er3c^;|$Kg zwA-d~zy*=U(1X)(@0Z}B%$*ay@dGB)Rn6RQQ9{$D87h3PwU2zSdhw+L0#1p!qM08y zJ`w`z(mnAfI`5$Xyl2i^OhTL;d;lbbwPtBtu3%zR>xx~MHQC4ktieiNO_WLeUj0;3bTJHy=UTZJnC1r~tsy)HyAH~n;U$OceI-SSW)zbsWtF|zQqeS3+rM=P)D$3h3vfLMC6!*-oL#0I%f zO1M(>oVCiO2oEy+2+3;dx+@D}1SsSwLRIzg8iyjl#sK3OV26S>uQa0VfW3%OsdAORIS|N0G;(vBR3N_nfG5U z*J-fh2f-@C`^;gd#2%R0D@50sSjBinc}s$4&3B@p!Hzr}^Of52=_i>t2x)cF^#iK1 ziJUL7Ns$>Q>CTXDsK#ow!!$}q8L#{>U0!@FL`q}|;I_fWcDc+zl!ukfu3%{oOX1ja zWk&h%q30GH;_JFN=$h6u-Rac`9cuCD96F6b6Dr=H3n1`i^R?L|-_#T$a&PZlD2Z}6 z^ZXRoSbZ18Yrq28(HZW_UJz4zqBiFT*Iq=vJ(@j;h|0XR%MlcY(*;?gUMsQbt@dE6f* zd6yNdOIgZo#|vuwF6AUCB-PRxmY0CVdL->{XpF!Sa-DYYl0iMyeYKBIv3AsWoQC1+ z=!qw{LDax;V&$+II+;q!(x!`;CyDJ@3V=s1OuSM}K_4el1sTdsuO*q(<==eR&P4@! z9K%|5J5#Rnkkgq#_qN{sn*kL>HDE3e8~kE?A!{#{vq=owrvAg1+GZ3CQ9W0{_K^FQ zWmP_TRW=9HsYMJcHNfC1c6omCPUt(yJ)(bhEB_e-P#Y^?ut;uw+Rgl-Hl7d?@UPuUDyM(mX|F&8 zB-xa3hTeMG_jS+=`5&;vpD$R&fB%AoLFj~fU26ZO!x6q<^k;5=>TTMoe{f8_`jzf1 zLAsp3bhxCe4i$gI;L#LGzmiTurmOK2B*Qtoezqen507EIGi+{elqXrBPrxz18>Q&K zaKEA`<@n_#%EP&jS*B+C(OsPimG_M6HyZ^AwqeKa>TFxkm9I`iCawe=^JG7bqO}&4 z`+$O2Raw5yzB6@EF+%yv&(XT<9&OpA8$8`3&PPccFQJZZ$z@tG-W_LL8p*zQUxR07 z;D``QvayPnvn8s*7d4xGo!0JNF>;q@4MIvj^J{(OA#*{dajg@u=cF00nnbjS#QMqb zbE=(kClzbLz&x&&0~(E#wf>Pv|A#uI1)aX6&Jl2bN%7I94WX;eXY zpJypWD_nO>dGexk7*P&se1;4+9bCTAw5W@V+aYUNeyAb}$plOW$@4w3p*hJ=0WD5Z zsdZTm@tNudyP7D^H}c>V4yR%=T%K74@Mk?BmlX)s{@62~6Sz-ruJ(G-IYZ@QqtxMP z)c$d{{^^$AMv1d*^17+9)i9$*wooIDN&ax$)w1GC86p32i{rwFFPb+ut84p*g?`jD zes=%yvURQM$E(ic%^$C^f8&@QTXp|21gI^%-T2AEW4md}x%y=+=ha&a%?t6uJFQyR z)OOmmK#4n=^Hm+*nkRESCY?WRHSfJ)m{0ln_Tu>07Tdj3VS*TZ(wm@hL|@~habLs$ z#!jW=i7BAHwS{Y8wBG9PaCh9=8-OQ>><{whdhQPiKCk&-#Nd;y1HusCwL_dxsl(y8 z_Rk-q9}UE|O(qOl=wbf`v114gWjTPz|5~7(j&XLy5N>aq!T-9wA*jC>XmcC2bBJK} zKezY3omQ08<@c0Z|F=OtH`A}G1pAd^DHn4GSE~G->&|dCJlY4oE%RiPmQ&+}dBgDG zsqd4|uep+FNzRPmw`vJ)%A`=n(~nI)63I=hE&quh5=1HvgVx%`p2Yt*gM1H;zS9Y^ zH4la~`-x4KXrWZ+vA$Jgmx14mm!Ny&GOEzFgS?Ag)kx;>KQpd!J;4Y4CHX&lqS)@U z4)QJe$N@WgEaa3rex?3~f1GgHRdI`axBVkw(D@x65BOZhf%YSDg{!%hErLTxWj7XL z{vT#s|1^~S$!Yp~#&sv*L#p(LN|Q7hqxI2r%kZzhz8APu+Ng8U8@xjg%kwjhZVw;IyZjTEb@rNL>>2moBAp<8 z<#?u6hR{)-{~s8vRR4*7Q`KauyRGf~ZQLm0rA%A$mFtfl*4zY6xbn@?JV7L=nlT=p z^ufzkYy!y=IpX zVa(V5Io9BiNFIUwy;0z1SGZCBo*<(MIbOZ-=Lb;OUp~3_-1wPF;2OJrW2IWYNSe?c zcRIHl6(*(8D`yQ=CQolPxId|UO_0&e4e{b_xH{;LmO`V~_OIO}EMACO0UnJW( zITb2T*A9H8iwasy^*uQ~;Jjt)=47J`TEjsAwWm^q@;Cd*f(CC>_9LH36xK)%fbt>K zyB+GPjIO%QS(Q_b3Oa4XBPiu+%n>f}eR)!w6cV!~@SB4A7f z`^NO2*R13l@;?UgU$0rEPweg^T;pu*m&7mY*%%}-be}5xN!h`fJ@e({Y2HzYd^*!J-uUm`^dg$;$*2L%tWLyw2iQ4JWgu= zic^p@Df^EqAsuzx6qr=z(q{svBtqf817E=YGU4_dA(E{6QuYHj0eo?h0bek;fokYp z&^?g0zlb?R1XnJ@p~P-W^^G;u;U?WYoc?Ku&#*c>n50p?=LzC^(cB2ajV(J+&HZ8` z=(WYggmIs9*=&X^>Go{BGU=X%p?cmy=^4TqyLb93OpyL3(vy;8ME$l>Y#-tUTza6f zQ`-Z>sut;gju_$QeZ~4N#>2ER?Jkw*UccPWivygF*zdznx9qy{*8}bW$^jn#^%Vd08Y9`eYM%ICUlZNB60KwkCfk1wC+VCW6UF`-3%6%~VfyDO zR;wRj{^J``xqR#;Z1=A}xfV`-Ws_#Zh``OOONW>fUSs$?**N{1m2dx0x|6q>s>fcU zUWZ&sG21k+cQwuDvyyyiouyqWnR?#*%HT!7LA-QziJeiGHi~$|FHb zBmEdY@3jB*H72||U`)Uns~q0vSh@z>k#KHwrAh2)Vfoe^R~1aW{;W`hOWpE}nDj%z z*!BIlk0;nO(riD9qTQbIr#)WKn{UOteO-&Li?Gf+Z6kL1z%G;9NACT00DLvPQ0NrR zy`IRjiK*kqgoP)4`O2v@wFni1WUFhCdQ4$KjDCrMQz|Er*kU`s#5xUHX)KQ+`z7k5 zE+R@AOF}nlH8>R?!U7p!k*$dW5`F3{O-8&I@f#EQAZVt>`ArS%V9WTGMxF0Smlz=O z`poYU;`eDxDsc#Q5ger4?v3GWAR!FwIE_$mEYn;|^y%SksX9U8 zG~t_?QN7GLRh!8)%1`!;C66z%`Vr1$<6^m^K7D3gBuC4-EOCr8H63*_Sz}0Q0j;`@ z$3nu{ocP%LyMCSh1@xXB$;##f_^q{lc0HDTV_#7oX?EkDxWa!HOPWkxhvT{eFAqQd zBPLus`ec5~>uA!_<>k?5o51a(FQ|lniwQ4}XFLh*$+JEKPnZ<_zZjmVeRtd*{TlWY zoM!SZoRs809}Ntk^WRAfiBL{N#Np2Og8@wO+yAVDQ8&sF=+BJ5_Yr>{4YiQNyuTJ& zI-h$^UZX||H*S;~7OQ#@@==~4Lbboo4L=eV z=F)k{OD5dxIbG{IkbkE@c6+A5eg174+m}J>4zF!~3Hv_)HE@0JhkmQLUL-!x|N9NT zl;r`!x&70>9u2&xv2EwFnQGX{4hx4@>sJIyxgD9w?UekFnDEyZ-mW43ez_joN30%R z|4sXYo#nwS;oQ-4{ht!R1JJVwzi+BhJvVhE-gb7J{Cs6)j1M+?6L!4-U*jMk%F+4j zq_r>Wi@WY^CkW|FprW`R>T*R|$m_Bt2=^aPd0N?If>P@AxZuHw zL%JnNvcqe047JyW9KF;}QN0YT`ZVP<2!57lISn#8wu##5iDh1Y;ncN{lQik&^l9|3 zJ(J#B4l<3+OumK@A?l--zi$=iThqkkTC~`t?U-jTJ6K3>g6!%;EWjJ?FsUNXjX8Au z?Ldy^7DQ`|Ca6p;X2Y#LV+3A$Bac2kE>p`P-3s5el7X3&-=Oz%*L6%y%uiS;ye8WY zl26p50hJFI>FZXQoGy4)m|FU}+ovc9_j0UW_)*fZ-2UD}6LGd+(`w?_waKu^Az>T3 zcFz12Ll-?Q94*b?#zt>V=@`f01SwASf6qbGFZiNtpETbLwLB(mfb`WAB*@bQ-P*Hy z=52OOG%0s=*~flr_KfI(Y*R?F-as}yv$ych6yf;A$fhp8#>~KSrSl|>g}3zdvJ@&a zc3zZ%Sc4IS>Mes`e}wA2F_ZyX!UQp1S$d7e5~&7PE_q?bEBp)od6ZMn$JYQ+eAGk9 zWQMH!3I1fcgk&+%>~bE3?M@ml z!6)uamIi{X3dRVM7jE4Pn3ORBQJp~`s*By|1hGA7Bq=u~Z0~us`W<{-{a(X1X5hnP zq9ONXkr1*g&yABZu!*sJ%OTO-CrZ4B)?(VbtwG8~991`t@RkSERo!fqTXb>)~G|Hj)^0-07GU^7ZgqX+ZgzC0|2Lp1dU!@|7*lDVVR}f&Qe=h0PP!klp+;v(8y{c4LRZ?35sR8i zyYXQc!o@CtFL7QF()^6-21N#@NBIc*fzIQkL9}V^$^GD%g>OsX`dA9jXs!gGc*GPJ zGyu2EPTd(RanWTINUme5#7_t-9X+!d#^TsYpV|DvDFerW?r5DEmZh*gPk<8N*$o5-4 zR{C;WJByY7>0+IFL*b+HhYB9XUlpTau_mHdEj^U=cGa>Eh4@}>X5QHSU>^w+QMt(NYZzCFDOW`GAdj6E1N=R!ge5Zt@X;zRq3h;a* z0fCB2v+{Rf?Ds)J=Oma{87uA~XP$VK6qIVURgi*Av@}+@KIk9;l+6u=!4D*74%Kya zB|U&J2rMmZa2ZD28h^zTo$&kZqqfU5@h2s_Xwr)!V$vWqF?%iXg<_ug??*lfWdIU3 zn*|`!5=iZd`;-(RFTlK+k;pf~+Oh4SB=mb!`0mz2(B!VYO}=k}zEVd}RL%f*@ZbZ3 zn0#-tv!Q+VjC&;Zth~>A{qU8NE$wh#l$t{KO_&K&0Fta%uy=T!Xo$L-JFczutYOqA zy`gYj*+rX-$X80u?>e<)Ug(wsQw&CfWf&W;&UTJVG-@ni8r{%VIv@9h9~R95$UHX` z1a#g?>$2xL9lEmeffOJr0T_H4hV2928Qb4RzFm3~d*(wiHf8*aN>|C*Wl(A?ZIy6qkMYjz=B zMzP<}`+iE<+$yzPTxZu#K&S)ne{NJ^fSZKqx19gB#Qk@{glegW>7THif0np^)dT;3 zm5-*y`iB4C?$rNG;1PnYvxM({=xjS!$CX}xX7uK76bzy2yL9}Mtm7^oY#dQ^`UeGL z3W|7he!SDvlaUdAsT~SD`u>IU5grjrKd-@QOSjjP5qM`&4u1EN@{p7hsOAcbrN1;= zjAe8dWV(Vp@(*UB z28Op0Ch*o?xIFeU;##-$|J=4tNK_J9%f+8Q{`Sma`ngF_04o6nbLXxSEVVB`&8Q$# zBj+zKif45$Ao(71_0H4eDxvbkoRF$p`Ss&KUKMMTZ{_wz zTO|> zF(U*V9qvfNs7L9jnF*&jtU#_ndWrk=3$Ej6W`ut9FeK-My4Dl79Z1=zvC;deIV!8* zsHbgzXYg0kOUsM_)1o09ke7lmz88XcFE5;#&G&;TxAF4_>Pjp1$B2!K36!#kQIuf} zP(=zRV~X$5U?N$hOH;ZK_gIn*Vfsl?&p>6L~5RePPc^?74= z4A~N8!RiVvb}@mfF*-3p1at^i76H^tK>8p_8LmXZ_r()cFL5MUYQ>aym@OXxnZ)bL zUq{&oqs9_H$2Oc9!!ICT>G4Lbn6frwKlnw0qTnsk^2a-zBQRaimDpHen_e7D$ z5F6FS!9I-{kx_mF-jmmUojnehRZ4u}v)2;|GY-WU&C6n4OCo)C;4`im*i+XwXZkYE zwbO?Tga({2O${R5WrcH*-@&T06roA9KKJCbZ0S#5*2Nk(s-sbC5N48+ z#5?lFa6L8%?Ij-`qqZXP?B@k3vtk{&A+I4_lkOmGkx#t@eG&6HQiDhx7EOT!K)hUI zlrA!%{uO@0=Ri6&9H^e*<|4Vkr`b_%X3(Sa1y14miD8Q}*)F~+@-y=F;eJL^N2GPdUL21T~RjXG@pL)6*>x~seD5y)V9%_bQ+zq@R(D-dMQDC38{GmjO=ST_Ln3A#}E}LKWFZsctjd4XZf>Aoeqr! zxa&gcCZ|Y3tH)!gJ+q?@o07wSve`nk?Osmq4meCpWCR8+0Zy$KDnttw${Y7y=R5gS zruN2B=)yT(tZET*vJxp)iXUES9)5(CF8|YiC-?RST@4m3lea`m3CFU!qLc~6sD6`0 z@4+H_5;o)lfV7qfO2D!%gXxF#zNf1k7Q>@ziG&<#yP2`LIB|3o?I$FE&a*0ppo<>- z=vmu-enVm%!`zs|w1X~+^*S9|ZnD?QvLT>cC zQRw+Z5p`3gj^XBw&^3LndX^5^7wo{fNPxe{O#J;HBS758LG#>*AQB z>z!&__H=Aq{h|Tt55u=<dbgL$0d;QX%|KGUYyQKQ-;K`*3*|;(HQm_;w~Q04Ka z6!jrViMB_tIm5Sv35mA<%0&eO;t8Ik)Bm!n`NQWE3U{%`lJ1@V zI)5PKqW-B)e6((R`0QQoF4=;&VkGH!KL{70*tXn1-%g!30F3ez0u7z#f2h-G&qdVQkf(uR*}P|x>&v7Z4G z9Ob71xSsYvQ*8UMuIt^=T+F7wfg}Pkb)euqVwylA5wA!>c=cEgS03>G9Nonyy?hYA7L?GJqN?L$$G&50OsjL%z#h4x7U%FA*y0-bb zG~~YBdq7$ufx8DzyG?km!vd>cjmXY^D$TqP)Fo<%WP)nsht{BCfZmq!hK2ahkEI#> zUD_f*bax``0c&*@LSdw6tYGQ0hnQ};IuVJGYb$QJ_H}#8gy(w*YNY;zzou3rXusV> z7?^znLW?(u+BVu{R9o(54^+mL1}$BM(W{#S6M?VbG_}SJz9};;90MbD40wO8SYc{F zcM{CfrZdarCnZL3M3U)>XtAq>-76uIGW7u(;fAd-E;>iD=i`=g9x2F5RrM|*O@EpP z#tk51?0c){^IJ+1GZVWuJ{+n-vk4EH8ocuB(ZeW;&V{pPL)#>WS8Q=!T3s}*xAbufg(5&GKu&48u!>f?oV6-~++S=~(5B(%6 z3blv|0LFZ?`s8aqe8(i4k~-P78!57I+LEDu#v8j%Z|3vq{>$^-onJ?oy82E{iA5}g z=SpuqRbtt%hLLHA!)sMSx`7xC^&{9vLPWyh0TfEYVyCI0J7*|z7_iTxNr(z@ng)+96y3HbrzjJn-lKB>WfZ|F#R7Llpr z7U&l%7c^XD@v|Pr!4}@c6F|( zqyL=6oyU*Lq*b}`pr!HJG!h>n9&em<#Isj_ZB z6*gKe%qLEyNRP{`Rh_x22<=sLVYK1r<0a0(xa)2S*o3YU8m5$!|(%QE99usbgF zMPHg;6B(e%Xq=%T7(U~mE>VfL1mvrz=xIKBE+=BNFOFqAXN|;K+f_pZxFB6=N6+;p z8q3q@kMx}DeqMK|BhBlB3oHBt@90HO+65RBzwBsR&d z&i?`Plvo6m;Sy9=_F|oEN&!aLm@5Sd&@kp+4$(F>YNP78<9HHdStSr$=s~QoE^mkt zmIwqqhyw^NaMB_tS@t$EtRY2;Wd5(Cb$~M5pSl4FNDwRlLNlk1%7-mPQNeeiq8B~2 z#E;YDNouV^@&daAFLhZ~P#|3&A%@hAXm)GF!PYt6(+2s;ftGf(=dc zv>IS)PzNc-4K3X$<=jw_P}`6!n7fiYXn8rP#4jF&PCn#5=D8OPeR#tdqVV1|0HW#~ zlg7NQiy!8FJPIZ5;`~v5_JMpnN16mi(#+Mu%`L>tU=X{mu0s;bGN|peWsoVt^_c=9 z*;sZhn27`eS4~!T(EKW05Qzc;9{u`Mrt|W8WFf)0n9{uAc!L3Kw+sfFfMRtGf5eFo z(gR(wUH0{~=QU+YPXSnx=)uj~Y;0WhzGSk=7#@SrL_QVgr0W-5)Hf*sfTvUAbuCx6 z8(|J00Gvpq-4~iSSRwcBEk>H7E>{EP@Ods>?uJrthEowMp4I%G;6S zBW{fOrMDC|t42oa?$e3-i|l<3>`dI{-0+ z1R4F;~W)N1Wxn9HSJN zBcgUEbisWBBq+&qvHaZ7mh0!bq|eR0SksBzpT}LE3`AZY$vLjHkgU6ahX*2eNF(=| z(7;pZ>MiupKm^%oBxNh=IQy=K( zgz%Z%uzR@hZvv5r&!a0D!tfaN9W3Ow4=K1ZEU*ZajHPNLMa!RB)OAIlVnfbxl=?;B zMp9C5G-$YpS|=~Ivi!~}-wm4wltD!#1?$1@U?Gcg;kPR-yIg|KYpFWK$xCY~z5t+G zSZcRC`-V()?MERq4-&{3!~QSg-ovZOJqs5OAwcM%S0R9O1f(}fLhl4c1Vp4MRYX8V z6zNq;C@LT*y-O1TkrH|@f(R%`??{&>knhEEjx%@W%$d1&t?y6B%6@(97pUeh(GnBopdulcRZ{d zA%rmmjPL2y(kxFiIJa>G!Gl6lgD^Jz9pa1C7xd)Fr1ta`VGm<9>9s;qnRC=iRw_q&3QiVTw9a_^Fcj>}~}!J6E4=eQbOkaG3(o;Or9@?7Kj=_c>b; z$Qiy|SS+}HAxb{b{T30c!}~u{!#5MunD5%9hDfRA?V}N}QorU?Zq>gT-{+>gjN%0e zEqhq!D1SXn?}59JWwao?vhtSl?)TuSGX*-~+~%@Ll6RvJ14(E5G6Bw;V5Y+%afF;@ zgtDNr9;|7pw5w2#h`yt8pj&n-`h~E_!CGH zfu6o|@#Bq@sO{UU`|}(2&wDREk%yFO&L>|MN98?LME_3lq5wXswZHzTrVxVQ%zyt; zSpx}WvG6+IZw^1L+mQDXmv^IxP+X{3fmxHq7lGd6+f;E?WqB9l6OZ5RG3e#J%eQFE zv)L}fuP?G1$WzsvAMbwcGHvQ4xgI2p6h-1;Otv(sC@~^HXTi1R6sPyYrr2HH{($Fv{gws|d1 zL)19ifiwvX3qKP26Q-RKUprr&1%4EAai*LcZF-pA91IWoo+e?J7V5Dg7Ab=(&iTY@ zU%3&a=l0%i`qxJ#L&U0;1nxP>chI{J%T1k$(UDr5iAAe1U1L58O`v&OaN%?ebw_-9XP&7=X0sqle0QhfLnh;uXj;n7Lvhr7}Rtob2-}r<4^<-2ZTCYhDP`qykh@{JFbs!?4b!_hGSKWb3 zbKfWpAY=3Ejj(}=b>uEIBdUaiq3m-D>)nFSh+V^^vxw7ms-?Qz*-2s@0u?Kpoq}8R zzikHoM%kvJ1nK|q8~9iE4%&sA6Ez7kZr{sRKY85Yqy@C~rfax49H>vfc=G__$djx! zcrDYL{`fYH>FfNVxUl0?ICLg|;RgaWRtwq8KlF20gRvwv!f zR^f!5#z1M|7BL!|`aWb*@fLn~ihC9T)LQ)$fecFVlm0JK`om?{l45&Il3`hi^nVgW zMa(&fCFcMMi1c`TW)KUma-)SMvzy~21jT*^5bxN}usCq)Rvg3P_}A@sbK?1JS8k(@`5 zWGmm2T3SeVtu^3dY}Xm-mU$$0dLb*xS(caeu1`s4T!Pg5#oVNaBt(pL7%jbAlGL{X zf+>0D1KrhI`1Tcr$NzcyY<)dnO@}1(fiqB8WPM+qbb9`m=EtAO&OQpu~ z>AlBd36!6IwQ`1&IGEmFp^>6whA}^$+SD+s390qoajj-=4hTUxT*?omwzfH+6)_dy zpKkS{O%mMz?&gLy;$&8gcxf*=Z8S4_$D9Sq)@g(9EfT+1ex(?H6?JszHr^prVfMn? z@#yZR($b*QR`=pYqrT#PvGf*F?u7rW^6d9|rU9Pe^*?zyzcFq9B%0O<{kwXetv@FW zJj494<5(|}t#^PT?R(n$j>OO!JEfmmIP^+~gxyIQdkv^#90u}@?N2KFs!X2xtFTj@ zG4JXqAdN9sI*quKy`?^NBzKk!V)fm(mL7*(gVXvd7TQpiRuo(MUw|0BsoX1`ZVlu3 zo5>~rMLnNjo4XS`wOqI|^I`JeP*3G8gy&RILV67(&juz)saWJ%>{aMcr_G*vsTGV&M&U=VoQ@)vz z`>UQ?_JdfQv3RXaz10KVGPZK>XMuXI;!buMJxeIyxwF{Ef@@m@LVXH}TUjlUuIXuH z#CeNZ-al}Rbz}lgBXkj!l$Gc3IQGd#tJIQvvRkA~)^pRoyh;ZL+f1p4G?_0Ussby; zw?2*p2rUOF>%GJhYOlO%DD_llyQef#fO>QNQzp~%u*JxN59ZpK=$R*utC-uup<%M) zA>zyGrhHV%)xXvA97_@Pm4)ce*fClmJ4w0>2zz{>2MiJHvH?#$^l+ zSUmJoYm$9vy+Y!P0OEROwL=VPtJB%?Y(#eeAm#JsC=hR)aI_+oT_W$Cr(IFbL3 z8~ztB@b75+SH<=MXngr_?$+rq2vI(%B<))<9=2g@{fwWL(B~XNHqWfQgOorH)rEPSLpJJuWk4z5}4(Ji@t#%__>1?4Bep(>T|dulm1?@tY_=L1FZaqTjZ(_iMQKP>@2im ziOF$)Do{o>1sa_2dl3@MNiqI1^95UekjcgElnI9K&m`GMLXUX(L7%^03rB| z7kPp&jQ_H_Oa2Bd{$AZD_~JW0_B`=3%6XTr5epFi3&#;`kO(0_`QXs2g%djbmK9}j z34q06w{uVGeX>gFR40HhFyY6y;gvft$KHDI_wVnD7me3>UnW0<0Lq7QV?rgWg=sB% zj$kfrJvmj2$KEEw`k%YrABxR)(E-bwnr*| zhO8|_A@G*A9;;%InDj9e+W;*7QQg#GJn{Abe3re>+%k6(vc@0pRjQfG>~y@J!{TCRKrAzF zIFfTU@QK4xu5a2t539?}MwfhAPgQSIz>~P!p&l-aeR}1 z=&M*u>De4D2~IycpSxk4+$6NsB{2lx3z=z!FrmKqf$2``YkUB{u$6%+UcI-#(PwdX z0SH+WX_L6TXL#fGpx8$G?W=_UT8FPZHOFM@V$7KPDvr6}_r3!SK30Q0VsGu!VZ;NN6E z{|}1&kHyN*M8S{e06j~TU)2cLABlqTsfs=*4Ku{A8E`6;_h35e+@1^c{OM>Y09=5T zNUDYC&&3Mxlq>ZUpBbnIe(NIN`_SvsEm?u|I0gRMI76e8r`(F4kp6no$ty0J@e_XQ zhTX|Rx^>mhA#SwD2D4nR<*KH2N|9uey$WNC!#SP~b7to>Y8%O8n? zxf!-f4nZsqqp1+ykmu9g(h>dTJSfjvD*L=##l&3Zf)-q!K*38TPaXii;HinNxQpxM zR$c+XM-v4p5v#R(8bvO4j%WE*pPJyA{2NbzjmA>I$jXi8JIiNEoHKl1N`ucax}4q^^#mLQ?k`9tsI)`^%f|A7;2f>U~A1F3BWB#yT=GXSZz z{Yy-!Li$p*_ew^6$J4O~)~>2ASf$YK!5loWL7Z{2+xcYoKlt&nN5lfP#$3Jfn$D+K z!dzOdWtGU^sdh9V0uU8= z?yuI6e~99y)u`G25%_ScP>Z6f{`^|*iDmW1EBstTrYn03JifOcIKU*xS?H0vu4?Fe zfwVB*w+sM2Kx;Ttxy{=^$H=J@B0A;JNXH~v$<6p!DJaKfmLfpgvS7Rp7(FRWjB<_0 zd_Bmw+|$2Ys1~^{L$^0Y7^qv!gU*!aY%Nu$xgO4ErA}a2X{QnTT)y(;YpJIf)?vC; zajhaRHCo=cA%ILoY;U#3uL$pACnu774~!pl`HtwQ=(>ifKQY&Jm0{Y#v&+NZ*N{c7 z<&(Z2{m;<&OsG*zWIn0y@U5iHy%r&6!`HBERAfPe#j;wx!fXb(Z&y)GSGVX;ED8GOog8%jpx)CX>^|sBAJFC;Uf7C+hDq@Z`?K%v@`uHDa4_(Uu;Ax#81|jrK!@))Xd*rKs#My6{^8 z7Xm;njN*8X-Ii!wE?S+T5D8M1;(9U~v-38Wbxt-Wg$cH>tFjVek^Fbu8?{A_2n@m` z7-xKR;l36Znjl4tH1*`BFVPUG2o3dm?tZL`{{_b3`cBdZ;1lUB8&2{QYK;Sq6|0%) z>rMbmU^p{m4c(y3ZwW2BL>(Pog9rv8oFFnP%#ve%$@h)P<7<7S@md#1MCKLxk)p%# zVvodWbNqBOMid$f#Ivf?vwYldh-u3-#w)4f`vwd=!U#%OkjR^l27alB^6JE!5T!~z zI$N(0;|mp!Q_>NA2A|U;6vz0fLCn`1I(ecNnpycP;=!F~^lc_kT%>bouvIawWpM)l zeB9LSBt^}L4X$K==%OlK*N3oLyCnB&sQLI5kuvJwfk{2qDNPNy-fRJClH@+43%726 zB@@MBACKVTip^}C*fVy>#j#!&uUX+PBz!QRf4K|fZ{mQj#fM0EZz6!fd2jNE*}e2C zu!d9@-k*uP)dg*vus@RJEEyq)%R5yUQ!$_qT+%0n!Qg#7`!;Se;Fd=St|Y_y%?4L!UH zVlbBb8Y%*1U0}x@wqi-1P2m>fd=;_#F-SY|3dU_1I(lxOGzJ&^ZnCRqKJG z;i+V{8jZ{!*MnrbQYr4XHL@M72P4VSV7Oq7CQjy!5DlF)>Zff@JaQYMXdq-TTccUP zbR*2TD~-OQty$P}Q$96P|IJSF>HqbTcNtD}zV6y)iEPbo2h**@;jS#HiuP`2&#h+@WZ5#Unmw+GfO&*Yw%kyA&z-8RGPWtw#zgtcl|7mRY_UC%FfPW)RGIuHgwT4_%>{ord$V1S z#0DkvAr~uqW{$?)mJn}uAGpAk+|LW^Q2`z9wl5jmc%7@ng~%WzU?A776b^YV;6wt> zZ9tT!7^bflh421J$2eTfwY_>=pN0L#4vnzTqxIVi7aj3TU<(k*VHy~--xArbpN%-(AW#}w~2!pE}KOwRjZ9>#B$)4g*A|Y?a*!)$Yuqe0(Z#&N`9e>McqLuMVkJ z-}M|^YQXtt2k&$AUguqka6miak$9qm5cFg7g}0~R70%ar@BE_7-zi4;lGs#QfAIUd zolaajazdGp%RHm#Q@!FZv;$D)r7ZKkV37Or^l4LP9{QSz%%1dnERbg1_ZCV1in9!fsS~jqtUb>2HhTL#rRH+P^f5V%5pSX44VVSv(OCh^bk1DZgP{~l9qfszfSEY-yVh;z zjm7`<{jh>Z2deWfO(k@G_|?2lblOA)J2fN*H~dYcYG-TVLWk(W)HpGH{{V15EInuJ z%X;j!*Xjpo-58Qx`W}wq0m0c6Ch9Q3b1N0>elRs-b9WwK*+$3+oniDP&{|0Ko;&3} z9>D%2#DX6|R`!B;CSk$Klb%Fk3c+2rHxGW^*s&$uSz63a zIoViboXm7NC-=jGAD$Vw|G_ikOZg~pKdkufnQ^jX`+4dpUtWE?-XgeGz5U^jo$>cm zhkvI&7Q!X(Qa``pPuVas8%x=!d!{-L!Tb(?!}UhO;mY_#Oss5j2pk?_+LNA%&ja;Z=>%b4lGn097#DG@|h&&tj^qo}?r z@zl|j^Wgg6u!ZXvM)wiDu(Aj#e2&fDr2=ibW+m5RaszIh`#Pm8I8d=~6~fJhW&xkN z+1GQQB`#{V`I{kG^KF<_6te6v{f*N8;ZYPPF^2hwoxq}*u%;xcH@NxL`NUNiz9qCDzXXmI$YcrKFyvi z+D0AVQxh2O2T!&m;7+p$@C)bQkl(8xTNi_gnoat1&|2!@5_c%sb$mTkB|?Z)vzvT% z>WOfDBXlWyQG$o->>98TDi9+9u}eCOg@Gz0=`4(gPd`MfWQvZ+wJw4DG?_5I1**`a zP5^$(Lz0WLgT(4ALE0^`yQ~_tX?^F&*#g+C_SL12qbX<)sU)-?Fw#+EQ|{iFh|aGk z6k-n1>`_@|uYx|4fRu)QB5pc$tYN`>M!c=&qGiNGS`EpbkdBMa*GXQmw(+QG!o-0d zPP7!s>5{*jt|LCF-KqxwTa4;n7j6{GQc~)7T)uX2xi6K-SyrDP6TftIJU$W zXDfV`i06+S#uDBZxaqZE^GIP%Q$G~T#kP)4QLLuN_4c5h*uM_*BEBs$JYd{Tfu7?- zF?93=$!({?B63uCwcdr9Zl^JJ=cq|{yo>bQPKT4{YN%`V$0TlN@aftopl#719~;@A zs>#;~572?ApiF4A%IP~D1J73t;fk~TXn(EuY4nfbY7tFne~0K7JQ>;AbW4c%kFadc zi@Er|4n~=Y?=xIg@(o`*s5Z&H&zF0gXOJB6&GaC?=~`L@q`3j{Bt8Mfhl0C#G_vj_ z=GSa~Wq+8AZ+_H)!7`sN_C6(~LQQI1PajYc=2c)#DL>-3@Rj`LUN94+G|Kl~oQRmD z2IIs!r8KQBxq}PT!JrfNA*;MJI)MoFzSzWk*^>ShM*(jS@il+zI-PF^^tn9mYGeL7W>4H}nvIKzK=AMmIZdu%^D z$+61~|E>R3fucc5KxQWhdJ**Hh~;10m~L4<<)iznn<-}(b!jJ60=d`3N{;ZjUeLiq z#ckfQ9D}4KBf{Udr%-^m4UjJXveT;i@BN>=?Q;%hZ=$bt0JbRrso-RL3Nu+6eM9~I znsu^0nq=nPAhlbVX#R4#5bmV)vIQU&P{&yn& zrZk+x?W{~TCPq07zBIwbURjr13OaOM{&1tJVy$1zk5qay%3~u&!CUaEaAg>vMoZ2% z>jd23%g>iOjtdi9-&~$(RL0HfnSbkCn*!8mrVrm@SLbgRzR(}Pet-AuyP@&kt217! zlI=s|J`mGw_J?8ymnQtkgtx~La|D$J{kZrl!`O z6lq|L(iF(a+@xfY8RVON`e~Ql7WmO)gG|UuTZ=%j&p*ue`j=VTmRbsq~L=F;QAUg$|BJTTqqkgsstg23+5YH}#p&#_tzjwu#NQQKPYT zs(h??D1XFzR$4ViFI2)xxvnIC6GF`BT?VpQ?L9%jDJQo`(y>EvUkTd5jxW_J*P;o+ z&JW)gQ9p!;^(AiXsH|aCUh`VtUDq`vQ52?SQE+$aka?D|q0$U8>P8HDZ1!^5(}VPtrRNLE zyg!~&m{w7Gy4lNvf2teZuWdUP-6E*&4n-j--Ldpi`Z-@muE0%Jqozl<$3&BhLrz&9ZZ+?$15b ze-A;y)-4(l3@#jf3Wso;&Gz_;hg2-Zt-|u^Lllr@GuO9;_mwubSHG>*YSU6GYzV15 zZGOwEAC2gGbnm{|rhv$i(vBfuo5I^pG`u~^^^!f?=(fo5;P_>u$uD#)zIdf-YBDMw9!{r#@Ff&uWD*sIaWvd<;?m73BvKBf|2j|)_w6UE%2j>P*5!w zzoYyV!b`0vievxV%w!zLo>NGw#6AyVg;bJDZU1RRo{W1IJ~JJ%k4^a(BeKGqVEVPx zx_}wAN4d)>e=#EWY@EHkeQ^>iLwB!?>(m1D?~KU%ZSEPmIaeP~pYmSiJiD z6Q^OpNFuF1KW3oQ>gFi@+fMr^rjcbWs)j&&}o^!=4j~Vsn^}gC40ERzPT5q_4v;bnP`dJT~u5Q zqItz|TJxVqG9lol|pVO(?%6}M~8qTTVc_#qT}O-s-4%x5jSKzs3<(URtDfl zW$MUFEI&qM@b{a$91_29L8NGk$1bM*}mV1OvqYa_dWf(clawo}VKWG5WVu)L#wm=f$M=4=U>S^WgUe_sbaV$0&Jn z{04TwK!Yn7c?I~>{RljDneIpi=tmd%0b{gt^4EY-64(L%JAXP|&3ziOGFuZueYBMC9=H6F*N{okoIL7P*_*1P)8YhM7TT-A0FwsW?srp#AP zOzc8+XEkYH>Up){mm0&!A5o6id6?pXkkhXVMoL_!54r@%u|BWQ*LRF{GVojhfgux_ z(yxmq8{yq)F9nT@Pu<5YJXY0tv#H{}Sw>QsPmjd7ZO@qi|JCGGEJ%akS>PGon*L&I z+_%deaXy!hdqP>}X-ike<6g<#pAmWHLpWP}ak-^%R&fGYoyNB6v7NKuV8&a>j2cr& z_Dp|-W00?rm9k%0q7R+lp4!{B&aPW-QDCWIg_e%QGO*Qp=SkO08_KNM&`_KkJhwaU z2P(JGR{$vVm7G!|@kU;pcz# z_s9Nt!K1Aw2$5z&UZq$A6JGzc8~5UnUWb$O?4F1GzlaJviFPS|oc+X4-|T^!GXSE( zA7g(WKfOA%j5qEEwMqb^l{=Lh!!`Fwhx~$CT$pP9wJrg{mldTB`Gv(FwDMoptS$)_ zl~8Lt6&2p`Rb`fc;Hv-Fg4j)fzWt|F=E>Oq=?uN~%0`spz8P@<<9p8&hGY5LF9il= zlX^);V1xX(09CB0+}QYC%j0{`pRLwH7`mM6aM$hEu!I0n;q^p^wn*$MIjtx?8KU4; zBUSIC*#?&2t_?Z}anC zU4QU}O5-XiLBIOUgO_y|3s1j#Hx$I7N~3A$NbteLNxlP-ERkA}Zy8sjbp|7Wy4@zP ze9yHbxAsvWa_(?Ck1_Sbjk{G&w75^rl{hC~;e4Y*4#50J=MzD9acPObh)f;xy$bYO za{3N@-=rIi#vvP&GB}&`y!q}GVuC6iWz-EuTy>M`yvDb6B9#AKUkQ3`_EgVRviXNi zALZ^&iYTO;KEF457*^kevtZA0DQG{*GO@}jKfVz8)mw4g z&?aUX*dSt?r`9br)%76f**VjDX3ugs9EQ(}@l8^X8&Zhw?Qw-KxF*P%g98{zY)I5AgQ&ig@Hzwbv__09IDy@g zkCV~x3k!bpc`~r^F5go$-_%cGsZ_4s5skJop6NV}Ch}Fmw=X;l7E0KlWM4Zg+@rQKh1qPaXW_zK-{D1oH&m&wp))A5ERQ4Ac-y>(``8Y#SLuw0qL5RmVMmOuh>qKNXFpQg;pYTd;&j}cb#cEx+e~F=`FVyr9pQO;Q0b%1yBI*-H{TiCi*R&&DY{EgZ1_?r{ z`AWTxK0`P32+XF!fe}V>(B?xw(RLs)2$#pM#M6Au!r4(i_sTA(T3H$5IE)*_&Rhw; zoo|V{{nmkdrzGNwAI$1*m7v}E^yx#USgWkMga{W`8I~vAVp1PdX6-p;^1(WPcqY^qyAE8hQ$%hUW%QjC|h+6kPU z5|$-COx@Jv6V!I^oz44n{_dL($-3Up-Fw&0->n$B7;`;J`pQX^jiNH1} zrQ0~j*(uJ3s0&R|$L=-p=$#F_R4_&VYOm3L82@xJ2S(0_I1|@4aKDc_Ti#$1i+dA% zZnTuAa(KE;{qy3!ufFooUFSvfv7wcrgXEIBU9U(CrlSS9u%vA5Xqs8OQokkn>`-ML@xaW1g8E zhLKdY{@O2AV;swoD>Jho^cjo~0aQW-m#tT;(3ZNkB3ac;isZMaat@KyuRCr{-4G>4 z#*+K`I@zJI(OwXG<9Fy_iS-6>zZ2L;qD4sbg)gm98-|FsU|k76qBu6#;p!=syOu2BZ5gTE=9U9SUs3ANfaEeP;1;kA{su#6?i~vGGlUvEcdjwcu(a_ zEJSKQDjaR3c_r4^GhJWVIVVHP2g|yXsU9Tt{sq?#(6G zglWz{w_yS{+v=PAd`7oQWfxL)=^Xgd!oisfX%T921L^1c`4%%p4VF%4B~@kQW+n$Y z#AKyCF{RGU%91;ulvmCilT-*0IH+<;|4TRMzp>dCDcv1ao<$rVrbi*~F4?28)@&-G zN_bpJ#mM7rQkMkWaO_$Q(>pEGbKsFJ(Pjp2B=dW9Ds&?xO9$6 z)Q5Dnh2`f-8c@ch1PjZ}n|G!XDI8b`$*MFMD()=+^Y*uu7ma6Ir=yEjVJ&e)ihEO7 zB9X&&t8t1qh`i%OwO#BC5QwF@HpYQY<;a+CdlP3h!&1Vz*iU&?uHM>3XFx ziKX8s>`F))d3mE5GY($yNGA@@nYt@!L~D=mI2Qx|DrgKLy@XPL1~9q0;IqadA9)*F z!|0k4*(RO@NgOIWxaYuGx6wgL>&r}fIVsGeqC|31XC3WjSSAUH%Evh(eK+r0(GrNM zmXH_vxlaVWzvDr~E%b#wyw7hi4ymd6n&> zk#Vzj?1g?0dNK}VOFaSwCtG($wizj84_-_% zQ9bw2R6Ds>$TWNDI!{8^Sttr>!#03!tpi;6ZfL|oYunU;>jMV;dGgj5Y;fZqa6FB- z29ll{&aI)y?Vu`5#&$`Q6T#;&^cnXac4g8}Vu<{<@o(a{D+`AlP;zN-x|$6KwJeBY zw1g%ZY!6$NICd#-w7t4|!)FeWRUhc<;!E1T@RY4b_TrYwAlz6tjiSOcD27^vWf`V% z>02{Y+-@>_)WyELFDy`{Yx=5U^H|-J6bUb+a==gu6<3xGOg%33*7IrhrKt|RIh+na6nCD`1xZ_y*Zhdb;R8p@ngcptHN7vUOcQ$z{}p+%%7)wT;GiuzVl zuF;yu7JjZq#gk9o7S@gtGf!pBK8m3Cu#{`C5CvRxaJteZ`rU;~c8dq3{S+BhxXM8FDUAy*ttr)_z#>ym!af~}#b3`4$x&1E6Rc4!An-NNbnT+yA`Li8@ zGu^)WL_So#1b1FCnV5J#SaY37@g zArdFEp>zYy3CH7wdzaOdx!Gm$&7gx6hryYB?sJaW2|*Xzl&Fp2Swe~&K@!kJ@@p>2 zf|0kvjcC(IO_bf7>XxmwLvsU{@yF;Nrv$!~G4_`3K^cKlOz+Gz!1%)(NkuR+TFUdi&n(lzL?}a!p&MDwrZ20OZToP zGQQfFv_p67o8 zD+DoZf10|ua)!pTXy<*8u6QbnOI2a|L9H%K(!B8fI6ycnd*M6V^v>yz7rvk2#m+DT z^LRe@CBCGOv?se0jzVm)(lV;hurcpS{vFjI8Ls1mGa==IpWb@B_>3$Lf9lKRM)cwJ zGeGL{;(o;b{ntLK776~+SqeID#JXyF3@^TY4HB(y3pn$L?Pwzi&prZ@^ehnjO0ADq zv-5fKyD|wKkXXRm!H+^K?PdO?ckRAKgFuW;B|BuEm0R;9k4Qy*%=W>I7$W8Io}(A; zc&*||xM>A0`H!m$!P@LDtUh>7d9b*_=e4y?pPqsiZd$Z<@_1KROc-nFjMz@t^`9%n zLbl@o|KdSbzk1Ra8}1W2~}y? z2YpImGBH6T^0E>ba%PZ*atBy?#?I!Nh)PNr1C6kX=$S) z1V)lBs1R}++s~O^w}0ILuBlGfqTo`vGnZtXAgM$sZDRo<Q^zk1vn$P*x##kh_+U_bX}bt5bHLNAS3KiYJUe4 z*IQ?eV|12iYC$+aBj_5mcqNHgb%`?7`VIccjamFrRO9cg(OM8bNDnXnKUF<@;cr!6 zI)kNR(fw8Rry|>YIj)@;EiaAcy0w5WX23=#G{2KiSbC74&hc~t<=B%bg{3wo@J)E- z#WT-%Q;kkGhEk~^-qK{-Vza2vJUQ0@h<-mVz{tD;;t^UwEHnme41>Fj)`LLi#SoB3 z0|Qw{SIPY=t#xZy!s`ggY2+ZR#PwDxleO{84tMB2Z-0DnJN79 zsu^MMoIApw{w;CshP=wwg?s9iXoF{K@%clfKS8QOqg>6Y5Kd;enZRu(Jue z4@Z26M1}+Ao(UHE(EWSziD-h)LfSWb?Sd z8{H#7!q1Z*-v9^}yIea2(#W>jX?u0tx~05@V6~9>>Wv=IH-%emO3P;dn+N%s-BI_U z8@pp3KUkvhf(kVK8kIu&^Jpl=h=F(n%4mZ+t}dVAu6x zrBx8t7fk}FeVHqg{%(Rf^ih~JT)av7HovR$ItoVAsB=`GwUK}pHp0lTcF7$ z{=(z~$}=+7l9bg+u`0lJJf(h_MM4ZJq}{d(KYQ%1tV$>t4qGXMJu%G>c@CQBq5-*c zk@G)`qlOaJop*G0GdV+>A<($zMhYsz^8tbHB|8=+5-!n@(Tz!1Af=~0J=d_hVd~-H z#|L}1qR?tBK;lq~p1n#1v|3O^+XYA&>@F(@AzPd%m~b$>u}6%Ba&Duerw03ugi3+B ziw0_uBGxG*eW`(j5uWn7Tb3x|qY0AqBm&^VGl16|j{)>NKt8#$@Zt3Kdt;HW%C_to zn6E=x7mxHwF8SY(LSK`Kt%Loy&-!6i+AQF%TUgm#zU>Lw=skvo0>G;9 z24UlMErEWzXV(K+j4Dv0K!3M=U=S96g<4Q!OpL&h{xKOFbKn^)uc6 zwYk3ZSMHxL0|v~*w$*!kHv{hky+>ICh6E3l{K-Cw=gdAA1$-9QQ}5fk=W6&v4W&+P zl6}5+h->MF`SOl1#_Ec8+9>Nt1*6wvlxj8zCjzizKG-w;v>Od#)!`GWQqLvUO_j@Q z)F(qrUt&;HH8#^^AacXl?lZFCuy=-hb0MEd*d#>pq=Mt8!mo1`XHQ3ec!}}HYjJYz z6okGHnTZ=RsqEq|9xcU^8{T0WBPWFU6AR_Rv6)Zp=y#)u=A9a}C21KG=8`H*LM$QN zHUKu}>R;q_k`@AyN&)-vZXV9#+yy(qY9wArwG2%?8Mlyw{WS|_@#_h;=1cq*T4IZ* zf1zVTtaXWw!&-+z z)u)ZOq)$$=5fWc1V=ekYY7dTTP+LBuqd@4YK~X~gPJ@-n@Zd|8@=Ihrgsn?dnUKn& z@66l1j_rm!Z1u%AYQOtvKp33X0aZxBA9C0e0rz)90^0&W4}AB(4P^VDGe-WYzyF0Q z3U|{q3a%hL}e|%t+3)B`%h6*1qP$gL2N4b&3wIWQR+wE-2 z7Uq3?(DuzmTh$vxBLMk_Xwe!ip8M+j z8)S?EqVF8;P!Yz6e|F%3a!VrzY#+?ggiI2Jf#@N`xJPR1IVi;g;sCb21$EBh6hfIw zOV_@MU|9&5h|td;9%kHj3Q|hp=cDX}gEb=1l??>8Uv90mzSMF*ha};c7??=Fc3k z)6gk@Nd2jU8zj^uvhmLB$Bb#H0u&@DWRh~=TOi6$U6KB{(KENvin)J1>Vfez83BK* za$YKd&|#xb`2|bmj&({Lzs-Fd)Sq?R0wz;E$$pnLnTcR3h*ZwzPMLfgDOFknvbHA* z-?tHdcB$U+`YWW791BFb zWXUjD!%=Xz>u z?uTYV6qVLoPKh`%L2O7{-hTN8*ke^)CZ&@ zjEOi)m4qIP)RB@Mi9+>jOvUxA`}q)Q%K`RSE~t@iQc18yt606pw7#fWR_=8(6el`B z97H?WdnUs}NsEff=FQym2Xc>fxyJfvh(J9~oJf3V*9X8XRbcia;n?05l)ne+q9MhE z9R@5>KB_cigS|d-#Z7vMAt}a2;Yi5{7174vu$4&co>HimBzb*Q{h2BFY=bj_dVAHy*7wkP3FKH--~ZxoF_* zNH?0j9>Ouilyu=6t@aLN(XH^OD>lUE1XN1fg>Ejnbc$YzZ$R*5RQGk9onJApn|pq_ zqz5VAUX+7kNS^LfV0kGKq`_jd)sJSEc7Jb(AL2G>d{f=MS=06p73b3%J0o`4f2JJ$ z{TJvTb!q6N}7!<)1f+04=_z}ICAP~$!kfshC!^<#@Q}Sm(Zk5U5Ow9 zTtA~TVXUc5txBGv1Enu>ft}$)ktK#h`7R}B>6>rDZ|=3SSjl3fHA*>DGq_RL+qJKl z2E-IXNW?NUF!rLS*>N(Bh*ckTS!f1(*F?jqW6K~3vY96iDcomm`C;cY`pIi`puGMg zG%knMEIq6m2 zC*b|(En@}uf`_mXY=&NJ^P{%fBSNr%b-Z^Vq&UVYB%>wF*uJ1@qOaj?p#id?J|bzT z(s?h1Y4!>U4GRKSWBB>$m&Eqm*S#Cay>Mn+rf&OK$ z*gp;z%Jp(!1}J7IH$^$9?L7NE>1T4^9|kj@e`cQ2*Ix%l*_(;;V@zpnYCdyoFryDB zrO?Asp`gWUq=&TUwHTiBzSIzqHtiMhi*2;9=Vm+OY9f>tFOd46B)s+d0MjQ%mpj|q zyf+Uq%#W@$E0k;C-yoUH1If10mn@!r0(-)RYi!jp*EmmbKC0of<#Wpf*EklX5nr^7 z(ALEAlT&_Ct6+cXf$c`bVal9e@qT6ZO*LrJq|m(Vt2aG&q(YL{6y_p^)2oO=gHwni zFenx|wm`+Q6q*}$fqaP^k6x-Pf<|pa$esx7=LD14n*M_Y{4ZTv_ma`Sj&iv`;b*=5 z^}J8Fz2*N`-I@49y|@2=He)bj9gHQ$lD+JM5;L}BFH6*kA$v{<2`vU=%`&J6$-avu zWa*40$(E&r2-#^-I;E2Nenxe2dYt?2{@%a)KEKEJFZg_B9-r%dy|3$fUC)=Ses{YW zv({Swtg~eJppoC7tXy2I`8Hzo1uO2nwWf~0_;poptgxN2zP#n}qa6N`qan4oeYcX& z*+DEIM#$5jmJ?s;I?Qfmpsl-VT`4@0R4n)p{>aUFJ-;T2Ml4~l@GFwx;%r?=yXYA9 zQ1#|SA1EhQFDYKJDrG*a7Xt9j=mxm_)Zt2ma!U;NniHKrvbx0Zp%)W=#c}V;ZGZu; zV`H8Y_AJ>k{Fi2cKLV5!(hT=}JVcASZv)1ok`CRNk9BRxzD*>9f^t81YH?MjX~R3` z$KpVV+jrM-$ zoyNeq#}7&!XlKF~xO2ykx&Z=1Hzc2w3Uwtx2fp!+L2A-jo|t8X8%RAsmKku)?R0?} zNQu~sl~a2~{N;2XD4kUCiD%>juzYs1M7#;Ek%-raH#!d*9~Ent60?+ztqkSuGKAt) z+XMECIV;1ZXUt^vK)N`BGqe>Zh6J#DYUPszj*%IPDTgSC31D5ORqMd_J+*MTd<2;2 z@7>O`-;8yB20wSjyIrH-kWbwb#V{;44fgVRw^*p-Ft@_W4GDPNi^2lsL=NOqfUzcD zn=eajtj*|riqj#D*38TP%x*`l4qbsF4+VKHQ5-}mx@u~bF?e`>CQYU^>HyCTCR{6s zh{UC%!OLaTfsgqry_!j2Y0NL8aVi(#%Vi|7xV|{aJR%n>E;C@Dr{aPCF^A~RH$Dh> z+=?jb=&8Wco#)WlO1vGH90^2T9x8pxqShukidr1~hUNP|SWf&TnICyScJt%1|2*_e ztZTPW9zQfXC*j4Heua4tn|AYG^ecp3nSK6!M@874(;kgCKfm9-teEh8GDW_M|3vDw zs{%_u8jt=9{R+co=0hu?nC>h%yg+DteM0$tSSMJ90 z@@=6}IAgLyA_U~6R5~o2zF8!2O_#eAY>0Fa-MF~Z_I#2443b9{_I*l0+1&E%Es3^$ z{e?!MBktOLrC7kdO11vAq0l9S6J3d%;#Nx>sS1P;CDRo>+Lo9BC9=X@uY(i%RNNx~ z97oy4`ysODX`ELx+$^4cP!vF8KL{kEP^1UIK~XaT%;Gqs4t8alK5>$_{pizJ+P-{E zlKEB`i||f%!mWc~ewT(DBw(6W?B+~uKSnC_)z=&&0pPePUcSZ^+F)EX#PHR^VAqil z@L^Uja|Lf}^WV-}CZMahL#{bSe5Qfs+Jqn>88+o0E8$tz=BaZV5*i1qVVAI z`l_?S1pU|gSh$>zb|U>P)>=ef%}h2&2-Pe&5wQHN7+i^=Wn7#>EcMw1&7itaMhz9G zNCXR!)GjviVt6`9Fo+!tr*%{9VSG~eXD)%SgIZZuJv{OW;$-Q9RNKq&46c(eH{RgTa0bQ5 zbMcp8`x1{MmyRzLAG~^AM#l1DjmA>3>1PeelCqb1OX=n9wEBV4%1+PHefh3I%h$#G zJC`fOMs7=1w%MaS|B(^=KbR~0!=+X_zw>W7D0W*X;D2B6O~9|OSe`Qfc=n68ssF8y z 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 literal 0 HcmV?d00001 diff --git a/website/public/docs-assets/sync-fork-update.png b/website/public/docs-assets/sync-fork-update.png new file mode 100644 index 0000000000000000000000000000000000000000..c8a1eea7dc6d7be2cd273c5e69bb89d75962e435 GIT binary patch literal 72374 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 CD7ggy literal 0 HcmV?d00001 diff --git a/website/src/app/app.config.server.ts b/website/src/app/app.config.server.ts new file mode 100644 index 000000000..41031f116 --- /dev/null +++ b/website/src/app/app.config.server.ts @@ -0,0 +1,12 @@ +import { mergeApplicationConfig, ApplicationConfig } from '@angular/core'; +import { provideServerRendering, withRoutes } from '@angular/ssr'; +import { appConfig } from './app.config'; +import { serverRoutes } from './app.routes.server'; + +const serverConfig: ApplicationConfig = { + providers: [ + provideServerRendering(withRoutes(serverRoutes)) + ] +}; + +export const config = mergeApplicationConfig(appConfig, serverConfig); diff --git a/website/src/app/app.config.ts b/website/src/app/app.config.ts new file mode 100644 index 000000000..9726923ea --- /dev/null +++ b/website/src/app/app.config.ts @@ -0,0 +1,26 @@ +import { ApplicationConfig, provideBrowserGlobalErrorListeners } from '@angular/core'; +import { + provideRouter, + withComponentInputBinding, + withInMemoryScrolling, +} from '@angular/router'; + +import { provideHttpClient, withFetch } from '@angular/common/http'; +import { routes } from './app.routes'; +import { provideClientHydration } from '@angular/platform-browser'; + +export const appConfig: ApplicationConfig = { + providers: [ + provideBrowserGlobalErrorListeners(), + provideRouter( + routes, + withComponentInputBinding(), + withInMemoryScrolling({ + anchorScrolling: 'enabled', + scrollPositionRestoration: 'enabled', + }), + ), + provideClientHydration(), + provideHttpClient(withFetch()), + ], +}; diff --git a/website/src/app/app.css b/website/src/app/app.css new file mode 100644 index 000000000..e69de29bb diff --git a/website/src/app/app.html b/website/src/app/app.html new file mode 100644 index 000000000..67e7bd4cd --- /dev/null +++ b/website/src/app/app.html @@ -0,0 +1 @@ + diff --git a/website/src/app/app.routes.server.ts b/website/src/app/app.routes.server.ts new file mode 100644 index 000000000..e1837defc --- /dev/null +++ b/website/src/app/app.routes.server.ts @@ -0,0 +1,40 @@ +import { RenderMode, ServerRoute } from '@angular/ssr'; +import { MANIFEST } from './generated/manifest'; + +export const serverRoutes: ServerRoute[] = [ + { + path: '', + renderMode: RenderMode.Prerender, + }, + { + path: 'guides/:slug', + renderMode: RenderMode.Prerender, + async getPrerenderParams() { + return MANIFEST.guides.map((g) => ({ slug: g.url.split('/').pop()! })); + }, + }, + { + path: 'challenges/:category', + renderMode: RenderMode.Prerender, + async getPrerenderParams() { + return MANIFEST.challenges + .filter((g) => g.items.some((i) => i.url === `/challenges/${g.category}`)) + .map((g) => ({ category: g.category })); + }, + }, + { + path: 'challenges/:category/:slug', + renderMode: RenderMode.Prerender, + async getPrerenderParams() { + return MANIFEST.challenges.flatMap((g) => + g.items + .filter((i) => i.url !== `/challenges/${g.category}`) + .map((i) => ({ category: g.category, slug: i.url.split('/').pop()! })), + ); + }, + }, + { + path: '**', + renderMode: RenderMode.Server, + }, +]; diff --git a/website/src/app/app.routes.ts b/website/src/app/app.routes.ts new file mode 100644 index 000000000..68dc4eed2 --- /dev/null +++ b/website/src/app/app.routes.ts @@ -0,0 +1,51 @@ +import { Routes } from '@angular/router'; +import { docResolver } from './pages/docs/doc-resolver'; + +export const routes: Routes = [ + { + path: '', + pathMatch: 'full', + loadComponent: () => import('./pages/landing/landing').then((m) => m.Landing), + }, + { + path: '', + loadComponent: () => import('./layout/docs-layout').then((m) => m.DocsLayout), + children: [ + { + path: 'guides/:slug', + resolve: { doc: docResolver }, + loadComponent: () => import('./pages/docs/doc-page').then((m) => m.DocPage), + }, + { + path: 'challenges/:category', + resolve: { doc: docResolver }, + loadComponent: () => import('./pages/docs/doc-page').then((m) => m.DocPage), + }, + { + path: 'challenges/:category/:slug', + resolve: { doc: docResolver }, + loadComponent: () => import('./pages/docs/doc-page').then((m) => m.DocPage), + }, + { + path: 'challenges/:category/:slug/solutions', + resolve: { doc: docResolver }, + loadComponent: () => + import('./pages/solutions/solutions-list').then((m) => m.SolutionsList), + }, + { + path: 'challenges/:category/:slug/solutions/:pr', + resolve: { doc: docResolver }, + loadComponent: () => + import('./pages/solutions/solution-diff').then((m) => m.SolutionDiff), + }, + { + path: 'leaderboard/:board', + loadComponent: () => import('./pages/leaderboard/leaderboard').then((m) => m.Leaderboard), + }, + ], + }, + { + path: '**', + loadComponent: () => import('./pages/not-found/not-found').then((m) => m.NotFound), + }, +]; diff --git a/website/src/app/app.ts b/website/src/app/app.ts new file mode 100644 index 000000000..54697a923 --- /dev/null +++ b/website/src/app/app.ts @@ -0,0 +1,12 @@ +import { Component, signal } from '@angular/core'; +import { RouterOutlet } from '@angular/router'; + +@Component({ + selector: 'app-root', + imports: [RouterOutlet], + templateUrl: './app.html', + styleUrl: './app.css' +}) +export class App { + protected readonly title = signal('angular-challenges-website'); +} diff --git a/website/src/app/auth.ts b/website/src/app/auth.ts new file mode 100644 index 000000000..bdca41740 --- /dev/null +++ b/website/src/app/auth.ts @@ -0,0 +1,33 @@ +import { Injectable, PLATFORM_ID, computed, inject } from '@angular/core'; +import { isPlatformBrowser } from '@angular/common'; +import { httpResource } from '@angular/common/http'; + +export interface Me { + login: string; + avatar: string; +} + +@Injectable({ providedIn: 'root' }) +export class Auth { + private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID)); + + private readonly meResource = httpResource(() => + this.isBrowser ? '/api/me' : undefined, + ); + + readonly me = computed(() => + this.meResource.error() ? null : (this.meResource.value() ?? null), + ); + + readonly pending = computed(() => this.meResource.isLoading()); + + signInUrl(): string { + const here = this.isBrowser ? location.pathname : '/'; + return `/auth/authorize?redirect_uri=${encodeURIComponent(here)}`; + } + + signOutUrl(): string { + const here = this.isBrowser ? location.pathname : '/'; + return `/auth/logout?redirect_uri=${encodeURIComponent(here)}`; + } +} diff --git a/website/src/app/doc.model.ts b/website/src/app/doc.model.ts new file mode 100644 index 000000000..c7f04ce01 --- /dev/null +++ b/website/src/app/doc.model.ts @@ -0,0 +1,61 @@ +export interface TocEntry { + id: string; + text: string; + depth: number; +} + +export interface VideoLink { + link: string; + alt?: string; + flag?: string; +} + +export type Difficulty = 'easy' | 'medium' | 'hard'; + +export interface DocAuthor { + name: string; + githubLogin?: string; + twitter?: string; + linkedin?: string; + youtube?: string; +} + +export interface Doc { + collection: 'guides' | 'challenges'; + category?: string; + categoryLabel?: string; + slug: string; + url: string; + title: string; + difficulty?: Difficulty; + description: string; + author?: DocAuthor; + contributors: string[]; + challengeNumber?: number; + command?: string; + blogLink?: string; + videoLinks?: VideoLink[]; + noComments?: boolean; + html: string; + toc: TocEntry[]; +} + +export interface NavItem { + title: string; + difficulty?: Difficulty; + url: string; + order: number; + description: string; + challengeNumber?: number; +} + +export interface NavGroup { + label: string; + category: string; + items: NavItem[]; +} + +export interface DocsManifest { + guides: NavItem[]; + challenges: NavGroup[]; +} diff --git a/website/src/app/layout/docs-layout.html b/website/src/app/layout/docs-layout.html new file mode 100644 index 000000000..7dfe8bd31 --- /dev/null +++ b/website/src/app/layout/docs-layout.html @@ -0,0 +1,122 @@ + + +

} + +
+ +
@if (menuOpen()) { diff --git a/website/src/app/layout/docs-layout.ts b/website/src/app/layout/docs-layout.ts index 26325e09e..df4ec392f 100644 --- a/website/src/app/layout/docs-layout.ts +++ b/website/src/app/layout/docs-layout.ts @@ -3,6 +3,7 @@ import { NavigationEnd, Router, RouterLink, RouterLinkActive, RouterOutlet } fro import { toSignal } from '@angular/core/rxjs-interop'; import { filter, map } from 'rxjs'; import { MANIFEST } from '../generated/manifest'; +import { Consent } from '../consent'; import { SiteHeader } from './site-header'; @Component({ @@ -13,6 +14,7 @@ import { SiteHeader } from './site-header'; export class DocsLayout { private readonly router = inject(Router); + protected readonly consent = inject(Consent); protected readonly manifest = MANIFEST; protected readonly menuOpen = signal(false); protected readonly query = signal(''); diff --git a/website/src/app/pages/landing/landing.html b/website/src/app/pages/landing/landing.html index 82b05a60e..13db9faa6 100644 --- a/website/src/app/pages/landing/landing.html +++ b/website/src/app/pages/landing/landing.html @@ -206,6 +206,7 @@

Never miss a new challenge

Guides Leaderboard GitHub + diff --git a/website/src/app/pages/landing/landing.ts b/website/src/app/pages/landing/landing.ts index 9e3a58719..dff611248 100644 --- a/website/src/app/pages/landing/landing.ts +++ b/website/src/app/pages/landing/landing.ts @@ -9,6 +9,7 @@ import { isPlatformBrowser } from '@angular/common'; import { httpResource } from '@angular/common/http'; import { RouterLink } from '@angular/router'; import { MANIFEST } from '../../generated/manifest'; +import { Consent } from '../../consent'; import { SiteHeader } from '../../layout/site-header'; interface Sponsor { @@ -24,6 +25,8 @@ interface Sponsor { export class Landing { private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID)); + protected readonly consent = inject(Consent); + protected readonly challengeCount = MANIFEST.challenges .flatMap((g) => g.items) .filter((i) => i.challengeNumber).length; diff --git a/website/src/app/shared/consent-banner.html b/website/src/app/shared/consent-banner.html new file mode 100644 index 000000000..8a2600505 --- /dev/null +++ b/website/src/app/shared/consent-banner.html @@ -0,0 +1,41 @@ +@if (consent.bannerVisible()) { + +} diff --git a/website/src/app/shared/consent-banner.ts b/website/src/app/shared/consent-banner.ts new file mode 100644 index 000000000..7027fdf8b --- /dev/null +++ b/website/src/app/shared/consent-banner.ts @@ -0,0 +1,11 @@ +import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; +import { Consent } from '../consent'; + +@Component({ + selector: 'app-consent-banner', + templateUrl: './consent-banner.html', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class ConsentBanner { + protected readonly consent = inject(Consent); +} diff --git a/website/src/index.html b/website/src/index.html index 5e367d2e1..f31b65d70 100644 --- a/website/src/index.html +++ b/website/src/index.html @@ -7,14 +7,25 @@ - + - From d1ef34c45e568f7a58340086e75952870509d556 Mon Sep 17 00:00:00 2001 From: thomas Date: Sat, 15 Aug 2026 15:26:16 +0200 Subject: [PATCH 04/17] fix(website): make the consent banner stand out The banner blended into the dark page. It is now a floating card with a lighter surface, a pink ring and a shadow, over a dimmed scrim. The scrim and the outer wrapper are pointer-events-none so the site stays usable while the choice is pending, matching aria-modal="false". Co-Authored-By: Claude Opus 5 (1M context) --- website/src/app/shared/consent-banner.html | 31 ++++++++++++++++------ 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/website/src/app/shared/consent-banner.html b/website/src/app/shared/consent-banner.html index 8a2600505..40fe55d1d 100644 --- a/website/src/app/shared/consent-banner.html +++ b/website/src/app/shared/consent-banner.html @@ -1,15 +1,30 @@ @if (consent.bannerVisible()) { + + +