From 924f57fe032c15daa5bff7ba5e464ef71f20c919 Mon Sep 17 00:00:00 2001 From: Joao Carreira Date: Tue, 8 Sep 2026 10:22:01 +0100 Subject: [PATCH] feat: inital implementation --- .dockerignore | 7 + .env.example | 6 + .gitignore | 7 + AGENTS.md | 823 ++++++++++ Dockerfile | 16 + README.md | 146 ++ docker-compose.yml | 9 + index.html | 16 + nginx.conf | 33 + package-lock.json | 1544 ++++++++++++++++++ package.json | 27 + public/overlays/crr-logo-extenso.png | Bin 0 -> 61515 bytes public/overlays/crr-logo-sem-interior.png | Bin 0 -> 9970 bytes public/overlays/crr-logo-white-backgroud.png | Bin 0 -> 147728 bytes public/overlays/overlays.json | 17 + scripts/quality-check.mjs | 58 + scripts/security-check.mjs | 76 + src/App.vue | 135 ++ src/components/BackgroundUpload.vue | 59 + src/components/ExportControls.vue | 28 + src/components/ImageEditor.vue | 73 + src/components/OverlayControls.vue | 82 + src/components/OverlayPicker.vue | 82 + src/composables/useFabricEditor.ts | 472 ++++++ src/composables/useLocale.ts | 171 ++ src/main.ts | 5 + src/styles/main.css | 620 +++++++ src/types/editor.ts | 37 + src/utils/editorMath.ts | 71 + src/utils/imageFiles.ts | 11 + src/utils/overlayConfig.ts | 43 + tests/editorMath.test.ts | 53 + tests/overlayConfig.test.ts | 23 + tsconfig.app.json | 28 + tsconfig.json | 7 + tsconfig.node.json | 15 + vite.config.ts | 15 + 37 files changed, 4815 insertions(+) create mode 100644 .dockerignore create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 AGENTS.md create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 docker-compose.yml create mode 100644 index.html create mode 100644 nginx.conf create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/overlays/crr-logo-extenso.png create mode 100644 public/overlays/crr-logo-sem-interior.png create mode 100644 public/overlays/crr-logo-white-backgroud.png create mode 100644 public/overlays/overlays.json create mode 100644 scripts/quality-check.mjs create mode 100644 scripts/security-check.mjs create mode 100644 src/App.vue create mode 100644 src/components/BackgroundUpload.vue create mode 100644 src/components/ExportControls.vue create mode 100644 src/components/ImageEditor.vue create mode 100644 src/components/OverlayControls.vue create mode 100644 src/components/OverlayPicker.vue create mode 100644 src/composables/useFabricEditor.ts create mode 100644 src/composables/useLocale.ts create mode 100644 src/main.ts create mode 100644 src/styles/main.css create mode 100644 src/types/editor.ts create mode 100644 src/utils/editorMath.ts create mode 100644 src/utils/imageFiles.ts create mode 100644 src/utils/overlayConfig.ts create mode 100644 tests/editorMath.test.ts create mode 100644 tests/overlayConfig.test.ts create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..8ec3360 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,7 @@ +.git +.env +.env.* +!.env.example +node_modules +dist +*.log diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..5eb7f1b --- /dev/null +++ b/.env.example @@ -0,0 +1,6 @@ +# Docker Compose configuration only. These values are not application secrets. +APP_PORT=8080 + +# Host directory mounted read-only as /overlays in the nginx container. +# Edit its images and overlays.json without rebuilding the application image. +OVERLAYS_DIR=./public/overlays diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..13ecb5a --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.env +.env.* +!.env.example +node_modules +dist +*.log +.DS_Store diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..f785783 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,823 @@ +# AGENTS.md + +## Purpose + +This repository contains **Local Image Editor**, a small privacy-friendly browser application for placing one or more image overlays on top of a user-supplied background image and exporting the result at the background image's original resolution. + +The application is intentionally simple: + +```text +Upload background + ↓ +Add predefined or custom overlays + ↓ +Drag / resize / fine-tune coordinates + ↓ +Download PNG or JPEG +``` + +This file defines the expectations and constraints for coding agents working in this repository. + +Read **README.md** and **PLAN.md** before making non-trivial changes. + +--- + +## Core principles + +These are non-negotiable unless the user explicitly changes the product requirements. + +1. **User images stay local to the browser.** + - Do not upload user images to a server. + - Do not add analytics that capture image content. + - Do not add cloud storage or third-party image processing. + - Do not send user files to external APIs. + +2. **The original image pixel dimensions are the canonical coordinate system.** + - X, Y, width, height, bounds, quick positioning, and export must all be expressed in source-image pixels. + - Browser/display size must never change logical object coordinates. + +3. **Do not use a full-resolution interactive Fabric canvas for normal editing.** + - The current editor intentionally uses a smaller backing store plus a Fabric viewport transform. + - This is important for mobile memory usage and large phone photos. + - Full source resolution should only be used transiently when producing the final export. + +4. **Export must preserve the exact source dimensions.** + - A 4032×3024 background must produce a 4032×3024 export. + - UI scaling must not affect export resolution or object placement. + +5. **The project is frontend-only.** + - Do not introduce a backend, database, authentication, user accounts, or server-side image processing unless explicitly requested. + +6. **The repository is public.** + - Never commit secrets or private infrastructure data. + - Do not assume obscurity, minification, Docker images, or frontend environment variables provide secrecy. + +7. **Keep the product simple.** + - Prefer a small, understandable implementation over speculative abstractions or feature creep. + +--- + +## Technology baseline + +Use the existing stack unless the task specifically requires a change: + +- Vue 3 +- Vite +- TypeScript +- Fabric.js +- Node.js 22+ +- nginx +- Docker / Docker Compose + +Do not downgrade Fabric below the security baseline already enforced by the repository checks. + +Avoid adding dependencies when the browser, Vue, Fabric, or a small local helper can solve the problem cleanly. + +If adding or changing dependencies: + +- update `package.json`; +- update and commit `package-lock.json`; +- run the full checks; +- inspect the dependency for current security issues; +- avoid packages that add remote runtime dependencies or tracking. + +--- + +## Repository map + +Important files and responsibilities: + +```text +src/ +├── App.vue +├── main.ts +├── components/ +│ ├── BackgroundUpload.vue +│ ├── ExportControls.vue +│ ├── ImageEditor.vue +│ ├── OverlayControls.vue +│ └── OverlayPicker.vue +├── composables/ +│ ├── useFabricEditor.ts +│ └── useLocale.ts +├── types/ +│ └── editor.ts +├── utils/ +│ ├── editorMath.ts +│ ├── imageFiles.ts +│ └── overlayConfig.ts +└── styles/ + └── main.css + +public/ +└── overlays/ + ├── overlays.json + └── + +tests/ +├── editorMath.test.ts +└── overlayConfig.test.ts + +scripts/ +├── quality-check.mjs +└── security-check.mjs +``` + +### Ownership boundaries + +Keep these boundaries intact: + +- **`useFabricEditor.ts`** owns Fabric.js lifecycle and canvas manipulation. +- **`editorMath.ts`** contains pure coordinate, size, bounds, and positioning logic. +- **`overlayConfig.ts`** validates the runtime overlay library. +- Vue components should primarily handle UI, props/events, and presentation. +- Do not spread direct Fabric manipulation throughout multiple components. + +If new Fabric behavior is needed, prefer adding it to `useFabricEditor.ts` or a focused utility rather than manipulating the canvas directly from a UI component. + +--- + +## Development commands + +Install dependencies: + +```sh +npm ci +``` + +Run locally: + +```sh +npm run dev +``` + +Type check: + +```sh +npm run type-check +``` + +Run tests: + +```sh +npm test +``` + +Repository quality checks: + +```sh +npm run lint +``` + +Security checks: + +```sh +npm run security-check +``` + +Run all non-build checks: + +```sh +npm run check +``` + +Production build: + +```sh +npm run build +``` + +Production dependency audit: + +```sh +npm audit --omit=dev --omit=optional --audit-level=high +``` + +Docker: + +```sh +docker compose up --build +``` + +Before considering a code change complete, normally run: + +```sh +npm run check +npm run build +``` + +If dependencies changed, also run the production dependency audit. + +If Docker/nginx files changed, build and validate the container as well. + +--- + +## Required agent workflow + +For non-trivial tasks: + +1. Read the relevant implementation before editing. +2. Read related tests. +3. Check `README.md` and `PLAN.md` for product constraints. +4. Identify the smallest set of files that should own the change. +5. Preserve the coordinate/rendering model described below. +6. Add or update tests for logic changes. +7. Run `npm run check`. +8. Run `npm run build`. +9. Review the diff for accidental scope expansion, secrets, generated files, and documentation drift. +10. Update `README.md` and/or `PLAN.md` when behavior, deployment, architecture, supported formats, or security assumptions change. + +Do not claim a check passed unless it was actually run. + +If the local environment prevents a check from running, state exactly which check could not be completed and why. + +--- + +## Coordinate and rendering model + +This is the most important technical invariant in the project. + +Assume a source image is: + +```text +4032 × 3024 +``` + +while the editor is shown at: + +```text +900 × 675 +``` + +Objects still use logical coordinates such as: + +```text +x = 3200 +y = 80 +width = 700 +``` + +Those values are **source-image pixels**, not screen pixels. + +### Interactive editing + +The interactive Fabric canvas should use a display-sized backing store and a viewport transform: + +```text +logical scene: 4032 × 3024 +interactive backing: 900 × 675 +viewport scale: 900 / 4032 +``` + +Do not regress to allocating one or more 4032×3024 Fabric canvases during normal editing. + +### Browser resize + +Resizing the browser or editor container may change the viewport/display scale. + +It must **not** change: + +- object X/Y; +- object logical width/height; +- background logical dimensions; +- exported coordinates. + +Use container-based resize behavior. Prefer `ResizeObserver` for editor layout changes rather than relying only on `window.resize`. + +### Export + +Export must temporarily render at source resolution and then restore the interactive editor state. + +Any export implementation must: + +- preserve the original background dimensions; +- preserve overlay transforms; +- hide Fabric controls/selection from output; +- restore selection and viewport state in `finally`; +- handle allocation/encoding failures gracefully; +- avoid leaving the editor in a modified state after failure. + +Prefer asynchronous Blob-based downloads over large synchronous Base64 URLs. + +For JPEG export, explicitly flatten transparency onto white unless product requirements change. + +--- + +## Fabric.js rules + +### Background + +The background image: + +- is not a normal editable overlay; +- must be non-selectable; +- must be non-evented; +- defines the logical canvas dimensions. + +Replacing the background clears the current composition, so preserve the existing user confirmation behavior whenever overlays exist. + +### Overlays + +Overlay objects are independent Fabric image objects. + +Each must: + +- have a stable internal ID; +- have a human-readable name; +- be independently selectable; +- support drag and uniform resize; +- preserve aspect ratio; +- stay within background bounds; +- be removable. + +For the MVP: + +- rotation is disabled; +- skewing is disabled; +- flipping should not occur; +- edge-only non-uniform scaling controls should remain disabled. + +Do not silently re-enable distortion controls. + +### Transform updates + +When moving or resizing an overlay: + +- enforce uniform scale; +- clamp it into the logical background bounds; +- call the relevant Fabric coordinate update methods; +- publish the updated selection values; +- request rendering only as needed. + +Do not assume `object.width` is the rendered width. Fabric source dimensions and transformed/scaled dimensions are different concepts. + +### Async image loading + +Background and overlay decoding are asynchronous. + +Preserve the generation/invalidation logic so stale image loads cannot overwrite newer user actions. + +A background replacement must invalidate overlay loads started for the previous background. + +If adding new asynchronous editor operations, design them so the latest user action wins. + +### Fabric lifecycle + +Use one controlled Fabric canvas per editor instance. + +On component teardown: + +- remove/clean listeners as needed; +- dispose the Fabric canvas; +- avoid stale references. + +Do not repeatedly recreate Fabric canvases during normal Vue updates. + +--- + +## Bounds and sizing + +Pure transform rules belong in `src/utils/editorMath.ts` where possible. + +Overlay bounds should normally satisfy: + +```text +x >= 0 +y >= 0 +x + width <= backgroundWidth +y + height <= backgroundHeight +``` + +Manual numeric inputs, drag, resize, and quick-position actions must all obey the same rules. + +Do not implement separate inconsistent bounds algorithms in different components. + +Default overlay placement is intentionally resolution-independent: + +- default width is proportional to background width; +- margin is proportional to image dimensions; +- default position is near the top-right corner. + +If these defaults change, add/update tests. + +--- + +## Supported image formats + +The current supported formats are: + +- PNG +- JPEG +- WebP + +Keep validation centralized in `src/utils/imageFiles.ts`. + +Do not add SVG support casually. + +If SVG support is explicitly requested, treat it as a deliberate feature: +- review current Fabric SVG security considerations; +- update validation; +- add tests; +- update CSP assumptions if relevant; +- update README/PLAN. + +Do not trust only file extensions for user uploads. + +--- + +## Object URLs and browser resources + +Custom background and overlay files remain local. + +If using `URL.createObjectURL()`: + +- revoke URLs after decoding or when no longer needed; +- do not leak object URLs across repeated uploads; +- do not revoke an object URL before Fabric/image decoding has completed. + +Avoid retaining large decoded images or canvases unnecessarily. + +Performance on mobile Safari and large phone photos is a first-class concern. + +--- + +## Overlay library + +Runtime predefined overlays live under: + +```text +public/overlays/ +``` + +The library is configured by: + +```text +public/overlays/overlays.json +``` + +Example: + +```json +{ + "id": "crr-logo", + "name": "CRR Logo", + "file": "crr-logo.png" +} +``` + +The runtime config intentionally accepts only simple local PNG/JPEG/WebP filenames. + +Do not loosen validation to arbitrary URLs or nested paths without a clear requirement and security review. + +Current validation should reject: + +- empty fields; +- duplicate IDs; +- duplicate files; +- remote URLs; +- nested paths; +- path traversal; +- unsupported file extensions. + +Adding a predefined overlay should normally require only: + +1. copying the image into the overlay directory; +2. adding an entry to `overlays.json`. + +Do not require a Vue rebuild just to add a new runtime overlay. + +The Docker/nginx configuration intentionally makes `/overlays/` revalidate rather than cache for a week, because deployed logos may be replaced without rebuilding the application. + +--- + +## UI and accessibility + +The editor must work on: + +- desktop; +- tablet; +- mobile; +- mouse; +- touch; +- keyboard for non-drag alternatives. + +Do not make drag the only way to manipulate an object. + +Maintain: + +- numeric X control; +- numeric Y control; +- numeric width control; +- accessible overlay selection; +- quick corner buttons; +- visible focus states; +- useful labels. + +If multiple overlays exist, keyboard users must have a way to select an existing overlay without clicking the canvas. + +Do not introduce horizontal page scrolling for normal mobile layouts. + +The editor is the primary visual element. Avoid turning the app into a complex dashboard. + +--- + +## Internationalization + +The interface supports: + +- English; +- Portuguese (Portugal). + +User-visible application strings should go through `useLocale.ts`. + +Do not hardcode new English UI text directly in components unless it is truly non-user-visible. + +When adding a string: + +- add the English translation; +- add the PT-PT translation; +- use Portuguese from Portugal, not Brazilian Portuguese; +- preserve proper accents and spelling. + +Examples of preferred PT-PT wording: + +- `ficheiro` +- `imagem` +- `sobreposição` +- `carregar` +- `descarregar` +- `área de edição` + +Avoid Brazilian-specific UI vocabulary where a natural PT-PT alternative exists. + +ARIA labels that are user-facing should also be translated. + +--- + +## Security and public-repository rules + +This repository is public. + +### Secrets + +Never commit: + +- API keys; +- passwords; +- access tokens; +- private keys; +- private certificates; +- deployment credentials; +- private infrastructure details that are intended to remain private. + +Real local environment files must remain ignored. + +The repository should contain: + +```text +.env.example +``` + +with safe example/non-secret values only. + +### Frontend environment variables + +Do not put secrets in Vite/frontend variables. + +Anything bundled into browser JavaScript is public. + +In particular: + +```text +VITE_* +``` + +must never be treated as secret storage. + +The current project intentionally avoids Vite deployment configuration where runtime static configuration is simpler. + +If a future feature requires a real secret, do not "hide" it in the frontend. Propose a server-side boundary or a deployment secret mechanism. + +### External services + +Do not add: + +- telemetry; +- analytics; +- remote fonts; +- remote scripts; +- CDN runtime dependencies; +- third-party upload services; + +unless explicitly requested and reviewed against privacy/CSP requirements. + +The current restrictive nginx Content Security Policy is intentional. + +### Secret scanning + +Preserve and run: + +```sh +npm run security-check +``` + +Do not change secret scanning to print actual discovered secret values into CI logs. Report filenames/types, not secret contents. + +### Dependency security + +Do not weaken the Fabric minimum-version security check. + +Keep nginx on a maintained/patched release. + +When changing dependencies, inspect current advisories and run the dependency audit. + +--- + +## Docker and nginx + +The production image is a static nginx deployment. + +Keep it that way unless requirements change. + +Important behavior: + +- `.env` must not be copied into the image; +- overlay directory is mounted read-only; +- runtime overlays are served from `/overlays/`; +- overlay files should revalidate so replacements appear promptly; +- the app is normally deployed at the root of a hostname; +- security headers and CSP are intentional. + +If changing nginx: + +- preserve SPA/static asset behavior; +- preserve overlay runtime behavior; +- validate the nginx configuration; +- review CSP implications of any new browser capability. + +Do not hardcode private domains, tokens, or infrastructure credentials in Docker/nginx files. + +--- + +## Testing expectations + +Tests should focus on behavior that is easy to regress. + +Pure logic belongs in utilities so it can be tested without a browser where possible. + +At minimum, add/update tests when changing: + +- coordinate scaling; +- bounds; +- resize behavior; +- corner positioning; +- default overlay sizing; +- overlay configuration parsing/validation. + +For editor behavior that depends on Fabric/browser APIs, prefer focused browser/integration tests if a unit test would only mock away the behavior being verified. + +Important scenarios include: + +```text +1280 × 1280 +1920 × 1080 +1080 × 1920 +4032 × 3024 +``` + +Verify that browser/editor resizing does not change logical coordinates. + +When touching export logic, verify: + +- PNG output dimensions; +- JPEG output dimensions; +- object placement; +- multiple overlay stacking; +- absence of Fabric controls; +- editor state restoration after export; +- failure handling where practical. + +--- + +## Code style + +Follow the existing TypeScript/Vue style. + +General expectations: + +- strict TypeScript; +- explicit types at important boundaries; +- small focused functions; +- pure helpers for math/validation; +- avoid `any`; +- avoid non-null assertions unless the invariant is genuinely guaranteed; +- avoid duplicated logic; +- prefer early returns for invalid state; +- keep async error handling explicit; +- clean up browser resources and listeners. + +Do not add abstractions solely to anticipate hypothetical future features. + +Do not commit: + +- `dist/`; +- `node_modules/`; +- local `.env`; +- editor/IDE junk; +- temporary output images; +- debug artifacts. + +Keep LF line endings and no trailing whitespace. + +--- + +## Error handling + +Errors shown to users should be: + +- concise; +- human-readable; +- translated; +- actionable where possible. + +Do not expose stack traces in the normal UI. + +A failure loading one predefined overlay should not make custom uploads unusable. + +Export and decode failures should leave the existing editor state usable. + +Do not swallow unexpected errors silently if they prevent the requested action. + +--- + +## Scope discipline + +The following are currently **non-goals** unless explicitly requested: + +- authentication; +- user accounts; +- database; +- server-side persistence; +- cloud storage; +- project history; +- full layers panel; +- text editor; +- rotation UI; +- filters; +- cropping; +- image effects; +- collaborative editing; +- admin interface; +- remote APIs. + +Potential future features may be mentioned in `PLAN.md`, but their presence there is not permission to implement them during unrelated tasks. + +Do not choose or add a software license on the user's behalf unless explicitly requested. + +--- + +## Documentation rules + +Update documentation when a change affects what users or deployers need to know. + +Update **README.md** for changes to: + +- setup; +- commands; +- supported formats; +- deployment; +- overlay configuration; +- privacy/security behavior; +- browser-visible behavior. + +Update **PLAN.md** for changes to: + +- architecture; +- requirements; +- acceptance criteria; +- project scope; +- implementation direction. + +Keep documentation aligned with actual code. Do not document features that are not implemented. + +--- + +## Definition of done + +A change is normally complete when: + +- the requested behavior is implemented; +- core product invariants remain intact; +- relevant tests are added or updated; +- TypeScript passes; +- tests pass; +- repository quality checks pass; +- security checks pass; +- production build passes; +- dependency audit is reviewed if dependencies changed; +- Docker/nginx is validated if deployment files changed; +- no secrets or generated artifacts were introduced; +- README/PLAN are updated when needed; +- the final diff contains no unrelated refactors. + +The goal is not merely to make the requested change work once. It should remain correct for large images, mobile devices, multiple overlays, public deployment, and pixel-accurate export. diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..239bcfc --- /dev/null +++ b/Dockerfile @@ -0,0 +1,16 @@ +FROM node:22-alpine AS build + +WORKDIR /app + +COPY package*.json ./ +RUN npm ci + +COPY . . +RUN npm run build + +FROM nginx:1.30.4-alpine + +COPY nginx.conf /etc/nginx/conf.d/default.conf +COPY --from=build /app/dist /usr/share/nginx/html + +EXPOSE 80 diff --git a/README.md b/README.md new file mode 100644 index 0000000..d82bbb8 --- /dev/null +++ b/README.md @@ -0,0 +1,146 @@ +# Local Image Editor + +A fast, privacy-friendly browser image overlay editor. Upload a PNG, JPEG, or WebP image, add one or more predefined or custom overlays, position them precisely, and download the result at the source image's original resolution. + +All user image processing happens locally in the browser. The project has no backend, database, image upload endpoint, account system, or credentials. + +The interface supports English and Portuguese (Portugal). It uses the browser language by default and remembers the selected language locally. + +## Highlights + +- Multiple independent overlays +- Runtime-configured overlay library +- Custom local overlay uploads +- Mouse, touch, and numeric X/Y/width controls +- Accessible overlay selector for keyboard users +- Four quick corner positions with bounds enforcement +- Original-image pixels remain the canonical coordinate system +- Low-resolution interactive Fabric.js backing canvas for better mobile memory usage +- Full-resolution PNG/JPEG export only when needed +- JPEG export explicitly flattens transparency onto white +- No server-side image processing + +## Run locally + +Requirements: Node.js 22 or newer and npm. + +```sh +npm ci +npm run dev +``` + +Open the URL printed by Vite. + +Useful checks: + +```sh +npm run type-check +npm test +npm run lint +npm run security-check +npm run build +``` + +Or run all non-build checks together: + +```sh +npm run check +``` + +The application uses Fabric only in the browser. CI and Docker use `npm ci` so installs are reproducible from the committed lockfile. + +## Docker + +Create an optional local `.env` from the public example and set a host port or overlay directory if needed: + +```sh +cp .env.example .env +docker compose up --build +``` + +The application is served at `http://localhost:8080` unless `APP_PORT` is changed. + +Compose mounts `OVERLAYS_DIR` read-only at `/usr/share/nginx/html/overlays` in the container. It defaults to `./public/overlays`: + +```env +OVERLAYS_DIR=/srv/local-image-editor/overlays +``` + +Images and `overlays.json` in that directory are served with revalidation rather than week-long caching, so a replaced logo is picked up on reload without rebuilding the container. + +The included nginx configuration adds a restrictive Content Security Policy and basic browser security headers. + +## Overlay library + +Predefined overlays are loaded at runtime from `public/overlays/overlays.json`. In Docker deployments, this is the directory configured by `OVERLAYS_DIR`. + +Example entry: + +```json +{ + "id": "example-badge", + "name": "Example badge", + "file": "example-badge.png" +} +``` + +Overlay configuration is intentionally restricted to simple local PNG/JPEG/WebP filenames. Empty fields, duplicate IDs/files, nested paths, remote URLs, path traversal, and unsupported extensions are rejected. + +To add an overlay: + +1. Copy the image into the overlay directory. +2. Add its entry to `overlays.json`. +3. Reload the application. + +No Vue source change or image rebuild is required. + +## Coordinate and rendering model + +The source image's original dimensions are always the logical coordinate system. For example, a `4032 x 3024` image remains a `4032 x 3024` logical scene even when the editor is displayed at `900 x 675`. + +Fabric.js uses a viewport transform to render that scene into a smaller interactive backing store. This keeps X/Y/width values pixel-accurate while avoiding multiple full-resolution canvas surfaces during normal editing. + +During export, the canvas is temporarily rendered at the exact source dimensions. The normal low-resolution editor state and selection are restored in a `finally` block even if export fails. + +## Public repository and configuration security + +The repository is designed to be safe to publish. + +- `.env` and `.env.*` are ignored by Git and Docker, except `.env.example`. +- `.env.example` contains only non-sensitive Docker Compose values. +- There are no `VITE_*` deployment settings because Vite values are compiled into browser JavaScript and therefore cannot hold secrets. +- If a future feature requires a real secret, it must be handled by a server-side component or deployment secret store and must never be bundled into this frontend. +- CI runs a small repository security check and a production dependency audit. + +Do not commit credentials, tokens, passwords, private keys, private certificates, or private deployment configuration. + +## Runtime/deployment path + +The Docker/nginx setup expects the application to be exposed at the root of a hostname, for example: + +```text +https://editor.example.com/ +``` + +The Vite bundle itself uses relative asset URLs, but if a reverse proxy publishes it under a path prefix, the proxy must strip that prefix before forwarding requests to the included nginx container so `/overlays/` continues to resolve correctly. + +## Quality checks + +A Gitea Actions workflow is provided in `.gitea/workflows/quality.yml`. It runs: + +```text +npm ci +npm run check +npm run build +npm audit --omit=dev --omit=optional --audit-level=high +``` + +Unit tests cover coordinate/display scaling, transformed overlay bounds, corner positioning, and overlay-library validation. The repository check also detects common formatting/configuration mistakes and basic accidental secret material. + +## Replacing the background + +If overlays already exist, the app asks for confirmation before replacing the background because the current composition will be cleared. The header branding is intentionally not a link so it cannot accidentally reload and discard a composition. + +## Licensing + +This repository may be publicly readable, but public visibility alone does not grant reuse or redistribution rights. Choose and add a `LICENSE` file explicitly if the project is intended to be open source. diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..c2916c6 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,9 @@ +services: + image-editor: + build: . + restart: unless-stopped + ports: + - "${APP_PORT:-8080}:80" + volumes: + # Overlay assets and their runtime configuration can change without rebuilding the image. + - "${OVERLAYS_DIR:-./public/overlays}:/usr/share/nginx/html/overlays:ro" diff --git a/index.html b/index.html new file mode 100644 index 0000000..dd5c870 --- /dev/null +++ b/index.html @@ -0,0 +1,16 @@ + + + + + + + Local Image Editor + + +
+ + + diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 0000000..6f7a17c --- /dev/null +++ b/nginx.conf @@ -0,0 +1,33 @@ +server { + listen 80; + listen [::]:80; + server_name _; + server_tokens off; + + root /usr/share/nginx/html; + index index.html; + + add_header X-Content-Type-Options "nosniff" always; + add_header Referrer-Policy "no-referrer" always; + add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always; + add_header Content-Security-Policy "default-src 'self'; img-src 'self' blob: data:; style-src 'self' 'unsafe-inline'; script-src 'self'; connect-src 'self'; font-src 'self' data:; object-src 'none'; base-uri 'self'; frame-ancestors 'none'; form-action 'self'; worker-src 'none'" always; + + # Runtime-managed overlays must be revalidated so replacing a logo or + # overlays.json takes effect without rebuilding the application image. + location ^~ /overlays/ { + expires -1; + try_files $uri =404; + } + + # Vite-generated assets are content-hashed and can be cached safely. + location ~* \.(?:css|js|mjs|png|jpe?g|webp|woff2?)$ { + expires 7d; + try_files $uri =404; + } + + # Keep the application shell fresh and support SPA navigation. + location / { + expires -1; + try_files $uri $uri/ /index.html; + } +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..eabee26 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1544 @@ +{ + "name": "local-image-editor", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "local-image-editor", + "version": "0.1.0", + "dependencies": { + "fabric": "^7.4.0", + "vue": "^3.5.13" + }, + "devDependencies": { + "@types/node": "^22.10.2", + "@vitejs/plugin-vue": "^5.2.1", + "typescript": "~5.7.2", + "vite": "^6.0.5", + "vue-tsc": "^2.2.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "license": "MIT" + }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.1.tgz", + "integrity": "sha512-UZ8sUxPTiHWYX9QNdJedb1kDZSpS1t/VPWBWGSgqHNi9w3Cu6IXvu2mzbhiTiPvtrqgTQJ+zqiAq2iPIPilpaQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.1.tgz", + "integrity": "sha512-cQ4nFQABN5cDvDpbvJ7bMStCpnaVxynZrRMfUJYgxcIk9Sh54FIO1vtfkg0B69REjER77ioZ/ov+eAApx/KmLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.1.tgz", + "integrity": "sha512-FQNqd1lRy/0QhDk3xeRIkSBiCpXCiDnZO3YLVdcDKN1UBiKToNftCzcXYNLshmPDUMlu2TdeS8tGcsU6f3YF1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.1.tgz", + "integrity": "sha512-pvD16V939D3CloK0+qikpGaxiPrDUXTe7Y5cWOMkMSy7m1cawa8EGy/kXYi/G/cKAC4HDAbSnzCIk1WmsoOKXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.1.tgz", + "integrity": "sha512-pcFGeL2345VwdTnJhA6zLbew+YgWB0qBG2+dMtXjCicf6+rm6kO6cOoh5VnTe0ZMrMRgRyuHmCJxZWrIdzYuOw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.1.tgz", + "integrity": "sha512-mRJlqSRulVzcKq/LKA6ICSIc3K/l4fzlVn/gePn2nXIHy8seRi5z/eeRE0d/XMBxcMldiXtQTSpRj0tkkC3g8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.1.tgz", + "integrity": "sha512-YDUNvVM85TI3g/1OpnqKP1h4NeW/j64DfWMf+G3M809xNk1bJSnpFp4sh83NpmVE5DXnkh8ULor4LTVZKoYLHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.1.tgz", + "integrity": "sha512-7Mcn71p9ZuQFAj+h+dhQXy/yeLePRS2yKRnmW1DijA9thKO5qap0GNOIQK4yQ6iP3SU0Mrb/yWo8h8vgRba8lw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.1.tgz", + "integrity": "sha512-4YiLQTX6U4CSl0L9cluep9A9W6UmTfqBDc2/CH6wlu54pl4E7Jn3cOD8oxzvBDEGk/JMKgJ47C8g+radF7mwvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.1.tgz", + "integrity": "sha512-2ra8F7w8OquwZN9z2/fKFnli69wa8PLwaVzRMIPGb13ByMJwC28Fbp8YcVGoUhlYMTt7j5j9bNgpysrN2UM+vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.1.tgz", + "integrity": "sha512-Sy20ncyhjmBP0Ml+UvQbimjlk6VFgjW5uNP+qqwHB00mTE8Bl2C1TuHTlRwK2YoXeZbee5lP2XevBWVkAQAtSQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.1.tgz", + "integrity": "sha512-noITLp8oNjYliPnGWmLyelIHwULGqbHloQHGw1rtxbWhTuWooRpnZarZQJ1y9EUC4szuCusCc+HEpUtxpIwYvA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.1.tgz", + "integrity": "sha512-hlxxXd+F1mWiAcaFR7Sv9ZQT6m6UfI8+Vy/kFJzztq2pDMU/0wZ9sish0iszNZvsQDo8Gc0i5yuFEOz5dDf6fA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.1.tgz", + "integrity": "sha512-EF7OpqQTQ/BvGqLzUi4rEHuagCV9MugAUXSHemwPW5vxZ75RR+jxO/2j95Ph2dalMpFHSVECjRoioHZgA9zOYA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.1.tgz", + "integrity": "sha512-wQO3JesW9PRkwlabQ27y7sPfVOOTLRG73I4F2UYHG5PXun3J9U3y+b7ezVKSYbsvSKGQ1k1cq8Qlun4C9kLt3w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.1.tgz", + "integrity": "sha512-ouAGwhO6wHRXdnOVCOsB0tRFkA7nhNB2Nwax6oECXN0YiN8EYUTBAOudADOB1PI+yDL61TeNx/u7MVCzksNbkQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.1.tgz", + "integrity": "sha512-q2R38Sn+1J8RxhfJ+T54wSWmyKXWec+9jgDfqO2AtArEqHO5R2aeayp5H5OYLr5UYDVGsVaZPEFUooMhYCdz5A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.1.tgz", + "integrity": "sha512-gfI5T24WLLuFfSKw7Go/zDXjAAV0fny0swTaDv+WjK7vqcw4cRhFfdsyKL1n+ukI+ooBxn3bVQnyrn06WpI50w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.1.tgz", + "integrity": "sha512-4h6XqthmB4Hspji84wvgk+ElodTsGj+dbZqHJHHtKxj4mYq0ANSEEPX9ys3moJueqsRjwpaJYH7874Itwnj2ow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.1.tgz", + "integrity": "sha512-dlfCOa87o1VAYegLQ9EKilx2JCeRofiyPGhTCmqnuXZ6bMPiycO1rq1+sKoulAp7pGLIsTIw+1x5R+zgh5LhhA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.1.tgz", + "integrity": "sha512-cjkLbOlfcm3QGhMM1J5zaZjsw1GggbN6rw9UTSSRrPrR1KkcXnN7Uq9rPw34xImQ9VOY9GN+6u2Zj80B9ptkcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.1.tgz", + "integrity": "sha512-Li1KdUnWGE4N3e1F/B4RTB1ms+nG4WBgjByO46pkeBVX/2UBsY53xf5vK9WygVmnH3RwncIST7lkSdLSY6P9lg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.1.tgz", + "integrity": "sha512-t4ZYOSoLTgwhuFMrmTMLx/+i1DQVK7HYqMc6kY46EApwi8X0nIVphzdNoThU3xt6n+N5urG1/gxBdCaKDLavfg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.1.tgz", + "integrity": "sha512-RgroPfMmKlD1RzSDxvwgcPiy2HNQKoYV7OmwIXDsk73uKW5t6B/V8KIy27SMv/FNXFo/oSBtWc9J0X7t91ezZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.1.tgz", + "integrity": "sha512-at8QVep6S3h5Y6gSbdGU06bRY5WJkf6WUduM9YtvYMbYhB1MOFfUgc6kehitQXzOtMSaT70q7f9ydPhpqu821w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.20.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz", + "integrity": "sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.15.tgz", + "integrity": "sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.15" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.15.tgz", + "integrity": "sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.15.tgz", + "integrity": "sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.42.tgz", + "integrity": "sha512-2Ye1ilMtKXxl8qZUrQ5j0CdgenFp/HFQmta6rfRyfEsTG69L6Wk+tWuNoHYHMx9E8tF2Slvdg1FuwDvAXdy1LQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@vue/shared": "3.5.42", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-core/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.42.tgz", + "integrity": "sha512-qbhQZEFmycr+ni/qyuccS4sucNN7VAbDfbkvNxWOX2VfgFm90MNs3/UhRNKoPMEIVn0F8gdlYjLPvqxHwHeQOA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.42", + "@vue/shared": "3.5.42" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.42.tgz", + "integrity": "sha512-fkCAFB4okcAANGMThboWnScp/gzWjU0ZSkVnjTIiplmMDq2uq0tIB3j+xVu4rhv5rvOgBySCysudmbMd6xRRqw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@vue/compiler-core": "3.5.42", + "@vue/compiler-dom": "3.5.42", + "@vue/compiler-ssr": "3.5.42", + "@vue/shared": "3.5.42", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.19", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.42.tgz", + "integrity": "sha512-xmLk3wLkbizPAiLyomjgFFosf2ys9b5Ghb+oh/k2tnvipNz8OFrQOiTcWCzyK7MpBp9KkyGtfvgfLUivbmuGYA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.42", + "@vue/shared": "3.5.42" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/language-core": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.12.tgz", + "integrity": "sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^1.0.3", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/language-core/node_modules/brace-expansion": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@vue/language-core/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.42.tgz", + "integrity": "sha512-TzNNfKpb7hDxbQltwAut8VDQA5YP+BuRlxntHUuRjyKwlMvmAPbs3unhCvieijifY6vFfVBwsS7wG/C7uq+bEQ==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.42" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.42.tgz", + "integrity": "sha512-9uACtuHs7vJGkm5Bp3xu4xRDLFTIYy5DgxpToVjqGIAhAEKwQfsaLvKINhM6nFVp6bZPRFGdDqd1g52MqKsotA==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.42", + "@vue/shared": "3.5.42" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.42.tgz", + "integrity": "sha512-rsCmhiWLaRxGltLwhlCWyYkFn7WAbKRh0q17eZ1A6Dq6eqc2ACQ61IIryxz0LrsvCzHSilLA9JHovVwM8CNE2g==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.42", + "@vue/runtime-core": "3.5.42", + "@vue/shared": "3.5.42", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.42.tgz", + "integrity": "sha512-2++5dUyYS4gvo7xQXSECUDhB7TS0aOl5SeVfC5qSq1Jgfhjvegw1zqhwTIR3imZ+QYPJQw9gfcFvXGAjGZ7ajQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.42", + "@vue/runtime-dom": "3.5.42", + "@vue/shared": "3.5.42" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.42.tgz", + "integrity": "sha512-2rPxex1jQf4jvl9MOHl6YaXCPcrNqz/FstMOEh3QWY+/OME9nQTvl9WYeCwhW7AFjaR0SnngZGlp/wkR6rkI6g==", + "license": "MIT" + }, + "node_modules/alien-signals": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.13.tgz", + "integrity": "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/fabric": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/fabric/-/fabric-7.4.0.tgz", + "integrity": "sha512-NalYDc3eifTl1C33zryQwpH6+XA/2ClxQrH9vkASkZw3tbkRmorpikhYMmxhUTmi7O3e9ODz0vOT8qfaCh9IVA==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", + "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.18", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.1.tgz", + "integrity": "sha512-3Df9jsstwhccuEfmAMi9l8XUh/GOkVObmFTU7CCVBysEbcOZLl84jCtaAZMcPiMz2EGKsATzQcU+Xr3n/wU6cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.63.1", + "@rollup/rollup-android-arm64": "4.63.1", + "@rollup/rollup-darwin-arm64": "4.63.1", + "@rollup/rollup-darwin-x64": "4.63.1", + "@rollup/rollup-freebsd-arm64": "4.63.1", + "@rollup/rollup-freebsd-x64": "4.63.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.63.1", + "@rollup/rollup-linux-arm-musleabihf": "4.63.1", + "@rollup/rollup-linux-arm64-gnu": "4.63.1", + "@rollup/rollup-linux-arm64-musl": "4.63.1", + "@rollup/rollup-linux-loong64-gnu": "4.63.1", + "@rollup/rollup-linux-loong64-musl": "4.63.1", + "@rollup/rollup-linux-ppc64-gnu": "4.63.1", + "@rollup/rollup-linux-ppc64-musl": "4.63.1", + "@rollup/rollup-linux-riscv64-gnu": "4.63.1", + "@rollup/rollup-linux-riscv64-musl": "4.63.1", + "@rollup/rollup-linux-s390x-gnu": "4.63.1", + "@rollup/rollup-linux-x64-gnu": "4.63.1", + "@rollup/rollup-linux-x64-musl": "4.63.1", + "@rollup/rollup-openbsd-x64": "4.63.1", + "@rollup/rollup-openharmony-arm64": "4.63.1", + "@rollup/rollup-win32-arm64-msvc": "4.63.1", + "@rollup/rollup-win32-ia32-msvc": "4.63.1", + "@rollup/rollup-win32-x64-gnu": "4.63.1", + "@rollup/rollup-win32-x64-msvc": "4.63.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", + "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vscode-uri": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.2.0.tgz", + "integrity": "sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.42.tgz", + "integrity": "sha512-4RyHQTbQvOPs3MfvUO1Sg0YRrKNnA0mAVtvpd12Tg1fKDN7OHBUl1IqSn8zGJjK9nI3NkNp8cgTpVrSZC5TTcA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.42", + "@vue/compiler-sfc": "3.5.42", + "@vue/runtime-dom": "3.5.42", + "@vue/server-renderer": "3.5.42", + "@vue/shared": "3.5.42" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-tsc": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.12.tgz", + "integrity": "sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "2.4.15", + "@vue/language-core": "2.2.12" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..1b847e5 --- /dev/null +++ b/package.json @@ -0,0 +1,27 @@ +{ + "name": "local-image-editor", + "private": true, + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc -b && vite build", + "preview": "vite preview", + "type-check": "vue-tsc -b", + "test": "node --experimental-strip-types --test tests/*.test.ts", + "lint": "node scripts/quality-check.mjs", + "security-check": "node scripts/security-check.mjs", + "check": "npm run type-check && npm run test && npm run lint && npm run security-check" + }, + "dependencies": { + "fabric": "^7.4.0", + "vue": "^3.5.13" + }, + "devDependencies": { + "@types/node": "^22.10.2", + "@vitejs/plugin-vue": "^5.2.1", + "typescript": "~5.7.2", + "vite": "^6.0.5", + "vue-tsc": "^2.2.0" + } +} diff --git a/public/overlays/crr-logo-extenso.png b/public/overlays/crr-logo-extenso.png new file mode 100644 index 0000000000000000000000000000000000000000..686f6faf01b0d449d3ce96c832a06a37b78a055b GIT binary patch literal 61515 zcmb@uc|4Te8$Yg8l4K_&vSv@pzBBf1?7I*$Ldw34knGv_B_oWnB_`P`Wl1HBFoo<{ z#%}C0-{X0n&*$m${eA!Zya)E?|gi=dW&4`5L z0)~WyROmb@xU(P4tpWa>aaGn+CLyVNMsehD7JTP$(lpW|AqnCoAqkHnAvplI!he&H z_}(BPS-L|)B9l!*!t@}&87fCYa{7&-t_cJ@FiFDw|NrMA&y2Llyon5;{EL})UQc3L zOz6K{K-1(!o+&>5MJLs@rw;$U4=xt(s;&eYulO7NeREFdHZI)i&j-NuN|?pc1KnA5 z@y)CUOZPRwXTe5s@+{AKg3G*tm^U^zsUjsxConhLrKs&r+sTi@doHVEh@Mc>o^O!x$FmBFqZ|-&#H<6Y$tqGZv5SG zJ<(;+N#(b#65xKqLiaX63kC~X7hO)c0AOI4;9|jAVZllPT&zafttZ`^(-faKmIhw| zUtE~QvbP=}1-=51Df5dONt2c7`~1b2Qh z@J{m!EI-np;=B&7!A;P#5?~Bafr~kk0f7Ut{B}?QfC1%`i%0rk zP}8@BL3c2;B@ZodvFNM@P=T=nB4FSE40saI1d|AegHcTJT%VQ@29E(E)53xP@Ql1D zKno}U39Q9BfiCMwu3$K`YGQypcmU`C011RVNpd0+0Q>hHW$-x>j)feNNW{N-2A({b zJ9o{^Y;S-B2o{VNFapp2`2k8B{N`*q_&4ukq;E`;-rvzQ`lPO_V%oCk_9LInH4dc* z&u-kA45v1%eU%Z~oM#d?&{7_dQT#yW(>V6Cz(uBYjGN@{?AZ4SLx;HA4>idntBMfu`jn5)u)vlfP2|rHX!Fy_0CEDVqdfamV{b z<$b=BPkncN6x$j*cx3YEQQ z{^hT>Ztu+)7kC$6phHNj5CcpAZ5c%llmrT&Canf14BEAPc*Lr($Y?Xt7j(}za>4$1bKaP?mPs#ta(cqTnysNF|1=Z&L;}X2bc0!$9NZC1&D3h< zZ`=_0?Bhf{?X0k=b8*;|@4nT4Fx7b}H%xI{YX7Df^h?aF zzuNK#$1}^uZ7*wWRUdlRAmy)q8Fo<(ZThoWFm3!>)rC0kGzd;iP!>yS82vw#6~`zO zVb7%`Z7^RKte1s@M*bWPN$}A4OO&k!%(E3KKW`R{_y2P^cU+rUn_Kwj5q>YEE&mka z>DlvgI2l;OKJT~eDqrYd!Y}>Y(CB^Y`^|&m#%&4_nEgv^s@I=mq(~m3%EM-G13i&G zq%8gZ;E!%$(fMJc-)eZoL|~$I!wGB?km?hyNgJMT4J7ny7@=Pbn5oTmR!pOq>Xe3YNOn>Uozak4or_773l*Qbur1!Ea_ zK0-XQO>vL4X8!Cqi~o@12hjrk9KLLaiv2kTmmXZKHTL#Nzl6}foXa*C8K6@7{Ngx| z{Jbwe3oV9f`1wU(GnbPhe*Ho6=WMCn<$=GN=tggU`a@-;B(2A69ri6)x*#4G>g(G6 zB$zXPRP$TlI3ga)ZB`rqhayRd_wC!(72BF?+hEGZ8kygH`C}4tEc@5uLUGMT(+I!Q zd8qGyHudVY-EiF2Y(CF~HeRv5sJrq9#?Ks~4)RY005`Xbs6S=A;7qkhF~e_i%?9Ig z$6)vmos<%l)wHj=HPe{c$FEKIU*$co759;BR%To4avG{Nxu87@iyv0x^YeeqLjIi!CUv3lDA#Gcyx%)bhdsI0 zEyJ7KIW%6dKlSj;+9m7ay{3QP82Dr!(42 z!=%OGcO^vrM~k@f0{lmlC1|fG%+kew*sWQO-@BH*SNP|^)g>+*sJ48KSnsvkymOkY zDtb;l6HRuv_a9E;V9_&=3H+wwVv4>ib$2lCBF(FSV;=pNzs%g#FrKa3n}STOM}s<8 zhKCo|mnzqSc6lbYmMXEgoB3OJL)VCJ&$5S19ySQhN{I$6esbCP^mN-l9_+tg$?}67 zUd(J$T)SkUkGFi^zS(C*3XL0v;JW(Q!#24M>-Y>5jvl`2?bbl@?;DoRJbk!FHhI{2 zuhN7y<6Y%i7;bUsTS(}^cF7uJ%4@|0BlDj{duf=X*jI6_yOHd{c%g3_{e__`k!v5> zcR6%JZjSiQz~>cN?=C+jJW}NRk;srN>hR9L{iE;H4prOc#xED|R_oS{I7CAMcrS$r zWo>sy`&E}V_5F%`o8I^9QlnROSc8=*^za~$9iCb>p7yLGL4ISd5h?qd?%hK|@wcKd zTGSGsc;R}v!bkBXFI(YxgOU#TVFLSc9s6M&J8`4vc>%*(?C&v(LWNMAZG*GO`r^W! zEIIf)SB0&dqN8nB_~oO^GMwx)T&)8|hexvgsr@1NuVfu0@*C`g{zx8+6N9ReZC!P($2p3-_1yK-g2oZ}vj#PkocV8?G zY1=FS>x4h5`yM7-rIOWdbEigezMRXT@6dPNuFmAnxoZwxx9*<1PUn8^ir|yt-Kx1h znc%(b9S=jQuwovVJt1IT!1r^Sq+NfQP$1bg1U`)@^^KG*7Hd2~Xez307;9fB$%(_K zm$T2+kC??{=?WEz2d-P6WI5TLbQ9Z%1y>-!pX$9rM0V?j5%?&B(53R5q!eS+=mFE; zT1h+u(Z~X#%B)z2#kXtF*!-QBS&tZSmV6!8R%32BvD_q0_lK_*%8g)Q$KKv4W_;Ge6|{!Q zTtOtVj>?7EO*88!-s;!w!*adf)bBNSLcU<@ZTOxVi*-`iF&=vLJqj7h z-`+0YYwq{psok(SS|uu1+*W_*eM1awJ*~i*z z>a<3Bg-T>=g_N19oF3i%3eTP+&<_xBZM=~zgL^_S1jkwFj)>i!V6Kr5?YA~sB>P^+ zrSMtSTvhv=9j#k5Sh9&R>nR4I&K3-aD_+FemI>S?86mg)JQ*b2wPfHp7U7F0mJ^ zpRMPB*&9?pU^f3)6@#rE*k?a-97vN04`wQ^`MR<5{6tF+su=Jw2b2M9*Qs`zAh^L( zMNT+E&HVNA@mQ*1VPh|Sd3#&Tye!AIAS`Qwz=54AS~hZgkA)I5Y7-wmdR`liIl5&Ska7+kR8 zWxEudF1o5^Up?KP{U#GMosuZlzsrQa;@xBS5+!}%6$0Oxv5ZNhGN6Ah3RBEkeuAk( z+FBh*-!Td)w;D?7vYO7(7J+3I@|ogj0t2OCD^8}le%nDn{w>ERzWV?A*e~a~eTeGS)p7vS2m%Mh{+{GQTSks3uu)rg=TtU>KIW1c7*r zdk>P+Ri?KizxXNrw!)l7z5crME5E#9s_i$#!)o|y3R6~b*M&AW(JlSvC?aR5B(G`p zDX47S8NJCnH@RRX<{#V7`SsRD6{XR3*TVD51`IB|GMYY_^8y5hf@`Tx8~wa*glEI{ zZ8_}rS{!*Cc7$A^t=t3<$y*Np)`T8m^JcKt**}{lf;+Ovfn4n4r4adyc<2KKxR$WKz-N z@k)!wab?~Z9akJTrzV_ORxnC06ob_zi)x2>ta^yu)C;bHb*M^NORM1q8>i>kQkW!4 zy9n>#5oP(V6)G0I>qW6ygKKc2Y3pT0q$aF<#-B>$9LH*GBZJi%bsipLm zm`hmGkqDvF5eZ~uc_>re3?W`v#VsH=D{6GkrSk>x*wV&FoWV3OD=X7JPFN9~*J^?$ z(18wiKT&h2Or9FBf-iPl5nk)y98aWZ72E$%fwc2e^SIR{%!ram%@exHl3+CCV)Fs% z3K(MP%j_;Ur7SY3_voTkJbUk>%)HKN##+hf<^5#Pjls&1MNL3FlB|U*%6LrCLI{Z| zvtTtlGpodEn)YY0KOE)g_Nq+<$KNP*$w+2|ze`3Ya-Z&084jat<5jP8<1xV{xb-wt zyp);vyiJi&;CHs7#qTLqfZc_*mv$GxutH=}s}P)zr#^hFS zHNkU;^);Ufzh@MCHu+bad8G@Affmi|Z&}pJF=J3-ZsqYGUV}gAKjTWpuHxSrvW70rc*r@WwM34){cjZfA$kCU+ zMn1bBXIN=m^DqkyTKdv?O9b9{7ALK&i7C@Vr{&@ohx|K&=9qwG_2O0Or<^`+SVvKUgW~?^v6D*0J7BrOW>VX)QcrKIX6IGs79UY+&Um7K?4vR>K7^s}6S= z&2|yO1_>LpGqpBN?u{G8R0aap^F4OJ5HKz;Gw=~Fg+0u2F(QvXaQ>8C>5O8aLDzEA zX|&U54jv!m_4*1N%&|?FOdM!RPuOeSm@ z5KB|w^F`Xb?|)R_J7lX3irN`3$sHEPzIkonR(4+vL#XdyoD(Hxq`+5;4E(h|SK_bl zjdbkr_3hJbbRGLGjR)ZqcSQ-)6h#J0*n6-#@aALclHL<-XPItbC6>aa#}mCmCzT}6 z^~BfYN(}3_wRF&h{oZ}#H2Rl8Va= zOde@hsQ8%b-h_XYFWgn>wGzDsGgc-mYNctB*m$UQVJ8O3<29I${PIAlhZb%8tw9nD z3-;B3h_%=AQ4t_{U#aDh>%*m4&Qa1U%t(Xo$lMs}Ak@A4IcL*NEkg0nmxy0YlK*8B1xzT1JEzl$}kTLYSmoj3DjIcS%e|6F~t(J zO4r(!%731>Gbrb9`XVgR$AX`~uHSa!;Ulj&ntk>dUgsI|$IsKv^;IxkUzohLWK(ah ztJ@I2#9-aXq7>9{A%r|~%e|(&VS0}&t5h&oxB5R;?#dm-m;7SiLe_Oq zSO2W{H>#jlNH#>Lv^X+=KnD@l+S)^(wbDg0w9%?xVPt_oygopUN{X#Tz9=h*k;+R) zS53iOb7m$k`zo+v(Ib&vtNf_*RF)#~{DH$4Vz6%{3N|MV&fI*K4a3D?waB9EPT&}5 z$WGyYd$rT8HI*~J{%)@)HLGxJ+Q3ALiN)?eQ*+-vs(;6R){S6y)|!EMD?#){)GAJqK^;~LEKrs=a@{ zQ0qnbdg*#UFpy|-B}QHsNHJAy-qpW(0>uJAp~M|5D^C{-;F3R0n^iiZoSD!AhS;1i zXE9S&!ow_DG!dpgqA$g<4K`G<4lFwbF;FFWK1*ve`SLKrk6_N3K_NSQ^(-+{IT2zU z>+FV&LLJ}vU0Vt9XkhJpWK+ee%8~O@VDJ>Mcr>>oL>Hc*D1${q_Ol}4R~mgt^?Np; zzgh$(`q=lPk(z&nlHl^1sc~BISkfd(RUR_37Gxqbtls>xCcQN+nvNDN2tCY85!oA9 zFB<9@c!R1ocxNaIbGmfCA1<}st?{nI+0aQ$)uXJepugxE6_N>E=NTfncd^d%VhU6L za{2}1>X*pGyG@B*v&|QL^b*vQ)J=u$FGMrn*u)vSHyi7up)P5?u-f=`ib~p!GV#I3 zp9l#TIW0(S7P_fb3p3^!9~Zi;61UISmAfb&YIFyqoAZt1_t15N#o^J(izAC;WLxYTiJC1c#dPP@ zaFsf5#a}dwsXZtNqP6b$bT+dA_z^J`_;}`zQO2|CDtv0fRrji5Mw8yno61@*CAVSi z2DGo2QuXSI1w#91PbptJf36XkC}h&3XYygxT?fMpf!QM@Xi27U-zM7yc_H4lk4K-> z!;FO=BNN&3;WFEe8t)WK&7D&G`G4&H$`<{gi+WL0*TG~N&_tIv+WTM0 zxY(_aj_dsui0$8sCODvnF38!mCn7?1ac48%Admg_yu?+8qeXKdtJyR%l&vPX?PxI| z3+v%=#CSyJp*{rj>cySp{)|2$7?(fa%d^L*3Vd&x`E)zQcQudqr>5qC5>S7kocGP~ z*N|zKsJ19a;6h2mF8*N7@B242ZX$|WS7GGmxlJl&0$cJuT072`}u5PUrk#OYm&$DB9$FBF+F0zMN@MY3|?pJk(8n)zh!o&`Mb|yvxX`T zU#Q_aGJbS;=L9)HaKW6mrkUc`%97)+`kg94nr>Gd@2nrjFvCRO2gwKH6Z^}*_$DB} zXB*(2a*ljZf8S=uGOS~RQI~TnKc?b@NeM-BHHxZ}UCKW=?4_h**CM)sHC7?Km4(&}A#VQEnnjm{}l~l~wBX(?;HUVKK zcA)&>kYoeNw*PA|_Ax%xKKrOIj|&#*YUIiya9>i0!D17E*O^i*ylBd*pAv6NC%94? zQ}J3r(K~<42!3&A9KqSAtK>bWUAil^8W#)yu^xww**!&l@GELW@#x{a<6Q%cIve!? zEgH`M^T0448{>h#)#Nejok1WAL70i_dvI&w4&QZ$tU9sh)Cjaelq3!5w< z`rj!^f_mezfeuKk+1%0PGv;xkG>=?X`=>a=+47TG+Sd@!;9l-0& zpT$9qPVu~z2^G51zxsStz->4&ZPmw%E9yfMA+oNpryhwBD$Ii4pm-)v}h#>wLpm$GB z>?BH}_ht)|JLt3to?FlNG)7 zIbd8h&uOx(m~Zp08UZX$u{)_m}RQ_le?6&P22)x&a<_)^I@i&@Mg(F=U`*b%61}H23 znchBo2xSv5U>*e#7cWmea+Pfmf-&o&UlqfoAs(}*1z1WMr<|*H=t4M8 zAaz}#R>&cqkH8PcV2Lgh&xlqZitrXggr>Je9gKt@x$d?!Q0t7aVtou@Yk+^Jx<@qW zldD@eT+u?Ed*}3we4PyRaH->p$1i_|7VngGtzFZ{ntXL8YQk4h_`YwG8gh5~rd7Gw zd%a7X)Mao&H@^8Kgv6O}QFDuZ)3H_dLS;~z_VL5GG_-G14AWx~5-f~UyIbtgNjnzk z;pC^iIWNL8REt#t(?x&JQl`$hoi1$FT;QtZH5hzWw3`PvxMiRb=4&FO5gB#zz9w!Q z!VcUb9zqW#36XDJ$SVXvSGpi&l<0v<$FnJSeAGOEcd)Y734QB0@Y|KvSAq}L zGMr=QeN4d5P{CWmC$d6>UC#&W)F7cwEfku!7JkPLLug#+Amq^yu=Xi57vhz^&ioX`R1xATxHBlnr`#`-TawF%r%;{C4W8c`UX^Pb?`sReaFR z^%Sbd6^r|ZaD(d5v`n$&r4BCu^)hhoqNR+%PCk=cPTPNm^b}1*R?jU&I6r}S3|H5f zcg|&Lv=?YVJb3!y)Pid<4f!uwj04z-^k!?i6LD5SJk4UY_Dn_&keaxuXjL{SYl{GW zC`FOV{g-`$y!_F+0F+hw`s|xQF|GnX#!=3toV?tysh91`^bq04+#S*Py6ys#hIybb z{I58aEvEgL?A@#P@Xyy^m4&?^a6)uwXyqD=poSh+mF1P)p+S2cr@$ob7D}(IMb4OK z2%xf3K{TT+F$zU#FBCsNocNQ!=0Z9hIs6wwBGLm@NQ3@ni8x`08zkK{R~sb0g?L18 z{uP31LWUl8M?$YpFxE^aIWP+O%#!)g7}C|O}8 zr{3CNuo2u~6VCM0X+W;Y=s|KXFF#M!8u8PQ-1phKHxHG@dSr1pLV zTMFZFJ@UB5PtuMngq{DF>AK87Z$>8an1vdIl{h62?!Uj$4)SQiu1~7m?{=>KC~jXc zN&LADZ9BsUvXEz=n9%(lxvjz8YE~8<2z>RV=~|cjtSudD ztXiaU?TmXYR&(OVa|7i)GfTM&&ku37X~D`5i8(3yvZUX9zv#8`n-MLa3&5y)CTZRs zfwVVWdfZ7IDGB27p~!D`cwMv^Fi=br0g`F(gy5`;G_&{y63xjw9>0UEs@^KIx(z)9 zc8K4GXs7ykPr)mi%;fng*Jfma%d;By@8};0wNMiwTmQQ<*2m1O4}D$f(GlH>3!~I% z%S-3S4KM?%8_Ux3)FkbAgiI#S5Ev7eN_k-mW5uw} z9F{N{0tnHTjlNjU1&Uhi3)O*}>ej3R;Pmm>D`Zjn5ZsTcdY~PA2C3#hAGx;X-dH*&f?+^! zn}5vwxU`CpP;Nqw=bNEz0oa*|hVoVxf^9znzdr&GXl~_d-po9pM|*{Gay8Wez*C98 zsJPy_+VjOOmGZ$R^O*md(~VhkZIn1iR~-am{Z-vakWwA|1YAYA+UzG{ z4^1!XynW7h^2V%LAg3TB9%Ouolzs&d+>SKz<3Chik4WapWkNqg+S4}u_6&mxDL+9L zfPk_dSjhN(;s>7-4nNDm;yPL``XaOzgJ^vOY(%fNot6$KB&#SLqtgJ-DogB&0UB35h;yx%7lanzVo)5Z|`^_#ri}2`D`X(Xmknf$km0;vKtWmXJ1&i=V zDv5O@RK2SRc8RhaztwooLy8ag{r9(ar2O+RoevQ~-oTo+jHpxNOp(+};w-o^jOT*E zukZ^V#R!}_5Q%m*i^JNh^vPaOm~VvTz6^hVXu%I7jyg)}y+ZydXn+26Crq#m-zoPGZQYOMyyKT!Iu0Vb#q% zSx5RebU&Q-`r7rq^H#U?J^8Rfu2su0ii-gT_m=4As2PctA{Td6rh|}DTOAyfJ`j7R@v$d z^)r7fV~iH;lOLky=+W#Kn8;n8M7{hg@F5JqSA!r^PSq>UOD`Gp(N}2N=84Das-z-k z6_19IRiT7x_SsB;h6JE7=tPI8TlJW}g5Zw0CKEpaCm;_O0cL4I&XSXxXl!qe3464J z8Z{^|NNWd$!LW#m=&wcC7o}B99dX0@;tioJ2lgD@tK}m=OY% zEh2jU)nbNVwO_wk0b)xGz7U)V5_n)Xba@)p6AZy0pY|4Ac2$?AYhXqOyV|xuSO9|9 z&O0%X6Jb1xJCf#WJ#r~~lmT8(&$>-LN)Qsou&h@m9O|{5$)NyCkW>SPAh>`28J!RicEOqT~ zPuUXJ1d%kUVpxZ3Ijg}K$8F5%$%9V_yt^AQ65;N+_4{YYqk}95yYk(^MDdb>3(Xjt zuM{QYoRrPf=-pVp2tz+(-Sl-0Y$i z9)q@}Lx8E{PQ;Q$}!cl}Ci48{FA;;H!EQv$FB`$T`OOnV%3 zz5D|#VX161xTt`*J=Q%@bf9C1`P#v{)+N+omEtM)WYjPZ{@BbKLwGo963l{<$mZPb zv(F2IeLnlzB+4j$mRo$O>3NSt=^^P_we=2*%?s{ zbD3a-#8UXnbYhH@3<9q~i}Jg9PKDdz-Jk}=Q_ks74k1`$JHuM)0<#+^Y3txNbLzP2 zjePM$*foa=fsYx39w%!Yf|WfWSKyT}oTn zebg;0h6Ae?SMB+Oe^MBN+gq_Kj+42WP8#pnjVkMU4)?^?#rkU$e~sQ@{i+iUc7k2H zv5)Ptw&FRSx<1a7IT1Rxm@wI+9|PSS_dXtPW(mkNd~0B7`PiMd@2alIjIk(PyL!!B z+j#pLtRga~_l5m02J|fl)Ayfny{uz!ZBZDpT8Uo_azTotffI!G1t+3=g)Y`Y!uG5N zG}kY~yaA-%C{)4M_Ydfg*w8G8xCc9h4hH*o_O7j+A<#3Tw-iyI-g68kc8A0$V_Zby zm%w{$qtda1`tYfnU1nenr)If#xvPQ`7Go0 zcm(4ErF-g_GLiVUW4gt`35KC!9`hEvcoP*n3~%Q!Vag;>?KHx{_aeX95dS{f9wqLG+ejKJZRHjeEJu-+FkeW}5&F62sC?%FnkKVs@9;9t@`y7GqJZ*YdS?6jR#GVdH zK0a0B>*?m$&cfAex;SeG#b=q<;$yIe)K5-Bt$i(Zk*p=BN|t)88FwJKtoMq9j0bT) zMO~ZkcQ-dE#i-+c3!Q3frbUx#5P!birYMN9f|XmP^s~A^St+U_gha#~t~7h{^1z6R zO8n%I+)5ZL2h&J%BgAGARBsot|Abr|lx`lygbo z{=@BO34*2kGBjw6KAQ9Kjcf>Rd8Z63nWCWyV(h|(+A1jo*_@JrWKj20{lU48yb+rn z$l#~6r@x}*OlZowPJ`Yu;4{IQ51mLwt)?riZNlU*@a^Gqu(R3gBeCR-R>hvPZ+InA zozrh|z~Ij09Lu?*a#vrH_$$SPJ$(6sF3+C_w*1i|JQQb!9(~5ECX6<&)-1_}c=&|& zQdQGhFGVn&Pl&_X7<=d-Bo@sM$$IU(Rw|K?cjWIb1w7`2T7#53{Si$Y%VB)V(j4EN zn0we#swl!606-DCVkU@5^b*-fW?1@x$4dKmLSGLbkFwoKNuN zeSQbl17+KZjQjkQVx-uGU>VK#j#lOUW;T%W58^Hbu?4#{^sFT#HUQ&IF2#3}k7z5iJ|>*uCPxw2D6D27`bj zl7S9QG<=>8mgY?Ow_N1$4pFOBc=3&$w^lCG*m6lMnaNXyZ1WiG3u})fMqtR3T|wYS zN<@e2D}0)ulablQuR;AXn6%2Di7EX)x~5&Lxq6BpqmaN)sE{D$j`rw~cO+F=UuHMB zhecrS27ca@DLECx^I2L_?F$o}M!9Y^`3PymWi;0u0#626eE2K^-hU0Y(7|SoUJDV~>GVhBg5+K` zHF{DsZkcB=kvbr+kIXAR~ z2NIE?nm|NXpl8%PHVyfK1L(3;DL=pIWr=Y?V&{R!3%~01`A08%*IFFg)-AXDp*tm7 zdU*@&H-OV!K)egGL_>A#Y-fpu5MThQv~CrKavW6lE9x8x`LQCwfq;&z2TCz8(OA!f z*+&q02`>D^C^P1)gqp{MX`Ps_h}!0bi8M(g^ESJ%)C2FbLlx%ws;~FL*=nvfdoMCI z)1W^rGI6Ug>cn90>i5P}>D3xS`R`j{2!z>t4Ir29)opFO68`d*mAeymTi#%(<4Auj z#;!yK@V#1VgE=*IeQ!YyOrCM=_j;<3YukBL3OZm{K~AawADige+S+)lMa&Tiffx&o zPQ8GDs>oxj%nHUW1Pm;bM-%F@2VIk;OMG##!aY3LywssM_8z#i>Mz`Ms9BH%1q!CJz z?P@cj)bek0FUmQqV&-ibB5Ps`*5}pUG=Q4o*5~f_@ckKMf31&w=-BvS-WTN6W#60tS8urIc{7K?(S10bJrcNneavN8Q8?vl#tUm4 zbJpwltcj4hnKagOjb%6u%%<s(2{4>>{MizoU<#dC5~fS{Y)^pK|1lRFmd zo>Qh`pgwm2bvZz9h5l39G$ae0`H*r}w|8bZ*DjKJe(r8;n40j0p4j794sIB~ISOOm z2y7*1ln3yUbl9i|vp#AE99(T6bvh~YFrV=~f~}KjU~KEs>Cx#Ze1V$S$(UI;jNqyj ztX$C_Qr{A4)h^`UIIsfsG*V-a>^Ievt-Eb)jl;0aLd!pI*fcf$xegsq)0_%Y7Z;uM8B>Ek7g;8 zoxyu12;FcVLphp%92^{s1FLA;r2p6vTKhTHRJfxI2ef+FACfMQ>*^hRhUD>UV2p{p z#s_mVL&Y+DYDMbh!B`p4!1!o{D;)PF{BUeCyxT2bZU$cQbmr*E3rG7jmXbEfjObe^ ziE6h>;P29To3cJsy0g|5cS#IaHH&J53Q zq+eISQ7l1lRH|U%(-%BQ%UIwZOYI(0vGwN;q9KWnZYW7g?{)_9VERc`D z-R%h7*Ll+R5PO>&CBeY|G?}@x!8lwPM7DGNmhUe9!`Va-xMJ)mtBOKhxUVD!F#RR$ zOzHu5@c{`vX^v#6?+V8ku#f04@mQ1QpAfRBk|hy~yFj^#Lo##gUzy4-fKrn!#kflB znzsMUa@5EN{g@n>G5Z>*8x2k?!wv#@-#5In;(+6K>AHcV=TLBMkNz)z5U@0B;+PHb zZRCJ~+69nHPPfMO>mTCNiAL8MNy^V^! z22qe#1~U?W>HO#M%jEA(mqMx0MV$k+|DU1Qtyy(k@yJ$3!=dpW9{J{Y0^pfHqJt zv3+dga&bt%@Nr|Br`f?1VC^`#Zz0kQ*t3AH(XX z-Vd!kFUTZ~MII}+lfH+JU!hFpfh}wihfP?1QcJsFr4xbaqd0l$aU-i1aC&Gd$kPn7 zqQUzGW%1>9-6Mtcl+%(ouh(L-3cn;cV0-I(e`v8{adf3zP@Vhl7K+F&fH{^CaxZF4 zVa_V0gtGc7-LnKmjJL3nLzm8P8Cf1~-)`vJCbE z=4*cEVgUkC6bMvC-IZj7{L4`#f!{9s<9`;qgGX&X8?vkdYHvr>y+In@Q$#Rhi z1d$u)A{7rKqLC11kJm3e)G;83nG4)U0kSA3J4gXFI1?gi)opVRSP{zu&GwI!q!78) zSv?GB5Z(f{kaG&z>KNX^x%M5|hvS#y7fgLWvw_+RS3%$&gqc=t=8p0xM9Ex}3p84# zGU_@RcxMiX-B`CgP6c&b>}mRub`V_1cJ&u)RH0np*_gud7-S-NMF^iPUO4X-jeTHl zt$R_}w(UL2t!uPsV7-~+leq@@gSFd{pulu}-!-rqKUPn5*UC*J2E1l#NKd;`niHs9@MPrc+)(!xigP?sfqdIlJFD-W#oWN)oX)me*)av7 z#dZevLK^^P|3+p~Ge}f>E8VjO^B}ZpmPbskz1wt6E;JE3@U<5Rq~6=~aHkLM|KWx= z4LGb2tSC|8UL=2L@j3;6h7+hy!5h-|868fzt{#|a;2`B8dp7M!eB#W=hnklurS3&? zfvT&1qdb2>dEAm^hPJ-0WdKaeGN#~A25?NXw&O_Mr&`AD`9zfXl`taR#WSDw?Ta=# z_9s2_YvuM-@U3u;x9g0k#WpB79GgP(*IhU7rE=aa*!L!}%wD&~E^s84p}8-s%U4#BPVtwPB(l06BbMT~a}TC(=~ z3n&NDkUU9?AMNaIp~3HUysnCxWtmmZ5VvMCBv->ufSC*`2fm;WpBtRX z&bERmal>B{!-xB^yd)En;DCt+*!ns@{5-8<_N2cl-FIcPnYpuD*V@l8oW1Dzikl=f zxlm2mTemik=kEiz{4Q8jWVk%R6N~XI;joRh!mhFXeb&t>Gw1aZ$DOAgc^7+c`GG(| z!(-T(F-X7s=Zr7tXA1faf_@;Y_Vbz&*l2begw5ZgK9p(r~Ex^ z|8q>$V*sjWg%(O_GKDo7C$s~>Xp604|2?IMD9OFMr9YcdZXf>trR^*_)*3uhw357y zDf81QJt2RQK=H=?-{YO}NmdeRUs@CisS>S@w;rYSAQvq4j|>IG!2o(aU-`N&#m&F^ z_R7!t$q9XRpUXqCtmQHEejv+Bn}J6aP64 zU3GKl`xVps+&}ydr>Wdd%i`P{&7;1m3F{?Hi~k8auG(a%M$?eRt-gBv4!H~+`qnDO z^-tK8KYGh-Q_P-e1-X|ulnGBEB$EDyR`*HQ`Vr=3{(Wp`A6y#%Fm3rr`+otrefQ+R ziRz%WAXYdNR7_m?SEBPs2cEHpPC>ZNknR7Y@!HrcGIQehA<@}sgqhdTzl-1t^qt)+ z=MfR#ajwN0J)8su*aZGWWb!iS{@8dWJf!GFi>J!TS>-=;Ah#rNW zswS$XK@G#d>ihi)15jU~pNm+&#adgO`qs?<5>KzsyFVK75~0=cvT7U_W`pVaXA3aP zadS_47!4{RY>8V>xsTB`|BvSHX_Ub}$NlohD!f29R>aKzJ>UKP${g62e%kE?rxLIu zp0^dj0}uYUo!cwy?1u$y&m!)r*Tahd*d>4GKgFU83hib-vacljj9#)E>iTO7c=g|7 z(y!;Q^HxLIMF`=%#}WMRx=t46&y0W1Y2VfmtL*g~w>)}xO6zI0TVo#B#=YMN{<}T6 zCpmsk#mQVeiU0)sTE@Jgm6ChJ$sDe}$-`hcag9hMArK~qYU*Ze<^nDq{`AckC!F&5 z0@XDNIm6{O(8IcFSh@t%<00KEZrPLFoU1R{g#F#J4bW-|CN$JjDc$j}AD@WQDz|&X zdhpLK^a$wl-`j(f<9+VoZsp&6Pr2Wh9fF8+ESBt_twrp!nNesIToovxb<5&sA6^*w z?SFm~!5cXy0yPEGor(VOH6b1=!SdHnY3Nf4@qO%WTYt8idOgn+_gWmtQ+qe-%wNBM zk#e#TL-#buxIdNcir-`U=eT-z3McMruFroW?a2sdq`vatQ?WDNE3N>51lqbk9=uYIVWYwPTI{jMTeFv)oQ9fsn-8hNq(ORJ6_JUtfz zYfAH?krN`He|=Oa(upSMQUoQ7;M3gm9Ut1@g_E=ju%@NGoDeGgq7!oYaS^KOxV!WZ zHmW9CuX2r`1eniUXv9A=8POBYAlcanJC7Fv(OP7&sfW4p04MYGn;K>hZyNu7y8Y4g zEy-MDGECiQ^)b7NE`URy)JPn zu`B^BeYoVWaFdsrV5|fowfW`L4=O&COAh~QbXkZ(>s%gk?K(Z`f~x0|ZnFKwT_N!8 z8jx`mg6fjkKWosk1f4HMeHsamS;4rESNmRFqd2lknsujgbrz^^@Mhic!d#T2hthEO z|5ksjss4{P1L2HSW|MLd;u_Yj*>@x5HiR!f!Q4|2y2uskAQ@Wtt=FgslY^}O6{T2hx6pq{ zJWCb3%Qsh*IL%K%;mj`t00-e}|Hr}Tt(e2|^uDHvpH5k1G*4-WO5 zs0!-^2e4f*UI;0HtX%4h2+&F;{Y?Gt;KBhpzY@p-NVS?sZr{ggCNZ<>V4O;Ka|c2T zPFI9pp+kz*{&7e|%pw(Bpt&6s#AKl6@Ht2%s;d%;Fqx={DM8SG=3<{DNT$1lnBXw9SNNL+ba0acFdwFSiuQl2oe z|I=YQ2m%i>|CWb~2O$70JF?galmC<2NPt=B%{Px|fWzI&sQP^krzNZZeRw<)W)}K> z27GvB;g$sT2@l-!mV*)p{8GQUHhN?k%7Zz&{bJ8QeU#U_jmVe$86z-(%hv((9fzuA z$4@nPgLXVtG60jG=|VbIKjIwDSZALvm?TKukS_nFLESlt9pbk-Wk0_S1X3muV4MVGExsR{F4ODxku1TS@jYrZG|H9}cVae<#IQkNuM1xvw= z=rXN9*`_rfwjdt(w}oWPt+*~lDxtntN9X6elSB=BdsA_JIL9YkHrk~+eEgLEVz_)w zfC7BmGogFcKZH#>B=IDzyVTjoEwX3I0JoFaqR7=x8GG`slBk6hYLG+zix69LBi;5? z-p|LaU*osP-hVz{Z=?qrgB4X{{|+v8cl>@FWypb-$r$IebJEyt* zZT4U`70K5x(Al`g__}Q@AQ_?J<~8stcp;`IqV|yR8RMHY7v&z~TdJHoIT|R9o`rwk zZUEnw8a;(?>All0NcLh&DsC-RGA=3o%>9cglFf*Ifr`2&{2D6gY~+3QlE1iAE~}@+ zGVIK6w0Pz|U8ni$8PqH?mDrr#h51#4px9 zV>Qw1)vFILo}&GY%kw$}QsbvE#rn?T4|(r?A(rAT7>f-gFIxRxjJZ%Z762*QTvHek(&X z94cc_FNTjKgT&u-3NESpK^$;+xs^v}V%taGXmVtDY@Z9m{4hyAW3bLga+zcCK1 zHN#N5NNQl7O+v1iF`otN%j9W@78hVO=dI*e8;L5Zp@tfKF>5#=y(H@*8IvVPS4@dF z#ajl;$x%gg5s&`bM4U>0$dY8Hd;dpYW&>uaunZ3!(!J{sK~=p;m9tKSdh76}fpb zd^K6lWNjG02`c(M^*>cEj}_KZtr|reGeM`UMZM5pX^2)hiLog zKoM2Z57lr{qig=2Z9hqur}Zm;kv6RzUAvfJxg)WXPvS;ht*5kjl+J)4zZA*e8R<;a zsAyy==5Eu{E_a*A`o#3vDDkK*kOysB@do39glxzB*GP4*uJ9@`XtD8t>5V5OyzHLy zsDW4xO|hBrbf&8%H!|hML(~l3 z?jyy0Xn69n{N3;A`gcXr-T;VV9E8_IXYLwZrT)wEHH8t-PR5xtz<<6DQemEs&P84K zIKCM7hoWBv#|nH+ORj)HU)R>=D5HL(I_Ib3KYnsh>l@`UYHID<>CC+ac2|U;IWK#F zkGP*2q^%x)4Yo3e$+>C$%2=X^FST(W5Brb8TJ}Rk{`IDcn3gF#me~@z<`e7)Lb{ME)DdY^}#9sdHmKzcdhs!tk|)1Sw8r}^WCWLfqLAxZEqm>t3cBu zgM(_1e|1)u?I+{t#bAEu2*n% zp@FzOMvUE45A7>pXLgP7G5>Ln>STZ#27)>R8043lk?mXbc*&V#GuvTUA7bjAnTiQC zo5e1ZZk?CMna`D?8(UWLr2p=hBeV4ZYXqf1y_U;a)w3q>G(4q{rb)~&M zU}e56^sAo`rzL3m=b<{)Ae4wh0<`){dBlX;7F`WE;2D}usg^%L5INsSN{jm#)2QO! za|e;H@KROGN>T8`tdeIA-+{0=dTzTo{=v+!0S=C;9GSi!lT$b#MBzL0 z$t#jbN>{AZlo1`O@fVSB-9iVoFZO1{gR?i|uM(*_H|qQDYi}6EeJt-os@xMC>JN%&*Y;yqx8@zd(A*`hcE<@#mrILB{8 ztPji-16scp3jG}$B+bWq7AP_IQ(tEIrGQu0{i^HGzAW$YwfcKGgv<(Oj7zh*v9$wfUg$>h8NmGZHQXMeeDDgY-Y1|2o~y}! zJbF4g+}cOH6!mia$KDkuXQUsMj~~LQ>5kjNvKivdwr0jkn}EH$ji3E8+5QyS)c2*a zb7xQH86K=IV=G@$*CJRq2hS-(C5utM^w5F)sVnPB-pad)M7jpJl-&)vJ*HdA*E=}Dvw@zYX3@9 zgrSJ<=g=#PkaWoPc~T)%o!Ekv^7N$pD=L+pnziN#r8MfAtuC4>aFvR&D*xuLGV>Ht zON=5f?LO0zbwg7(Vcv=(pJ`!b?2P#L(@J*yzNWkkf&1*D@(X3LEM5-}(3B)IeJr>Xz|110KR*`|4naPd)3bx)6kF6-UZ5<>p)iboGBgk2;dkl!SN9`>)t^ z4Pb8j$m37bN?ksRV!dQ5K>{(k-&|m|`6OGNTKH|4p*`bj!V8kqy3i3l@+lnN2eOGYewkgXJ2yss|jk$f?nTjjJlQVS5i&RnFp>F zazY1ggxIs+MNh)=nfn}&G~>eNuo#(1GL;A$R07jat}%ShMmBUoH(~96cT**0XgG7% z+wX*T8H_2{JB*6L(-S7;pX!_xKld)L!JaQX7vE?;4zu%~`kFnLnntL$ zDz<)KA4qD^uH^o^{7~p?zju$VA70?^0e#H3BKi9Gml8fihMu#Tyhsk`3z3+dL^F9! z84Ngl#~_{bAF~OL%VOK=M@u+<%6I4!{3Wux*eCF&V7^#3+&rt0ykhu^<6-SQsagc8 zA`m33SpApygnie+4$uf2#a(#^YLIW#m{(By@pGdV@mW|wUgx2==#hM zEiv1hEmjmL9>tIhnkU1c-wT}=A&@KT}ZHD){{{5WroOMm3 zd3~x_XCjEJ@(#Ctem!lT_9ok&0T< zUWCfipi)OAe10D5e&A(1*N7Y_1h91_;lfRXTX;JBN!iAA5}g){^*$d5qxwzgo^{qw zJt$aVv0T;qV~BUO|G_7c+quWUWBu$^3PB`$XsuaoYt|Trk>`BNph~v%WZyaMj9vv( zQwpqogj}pAu+*#_BJq&7K?7h9C0D6 zQEZAW;(3g7Mk5rZ#NQoYxtjkWD&=@^PV_miKN{BCGVz{ONhVX6#WD4pNsI#5nGREa zWlAM6k=HG)w)lFhFO^JENACpup2WCLyUBmZYv$fBOF8crW7(aC{f~qF z52vlkJwmtTq_K?JQNG{JZQ_SUBy-|k9P|FDR$mmJvHomTALUc1`x0Ms30f4lS99RS z?_q&9V}`TZ8NMA{gRh9ijq8b9z=KyLW)$5LV60|1P8{ud2ZYnWHijwH!p_WK!1^I0!BOI+6U;T4cRLqTqbUt z<1U(rPD#?F{yN5=^e(-;r}!hy&U1JbP2omGpS1~mXG*C{mRTT4|hC%ZE%R?JAS7m@oR}$KEZ^% zG@QLdmudQ|D7#L&@9UvCgMI#?&Uq%~?4Ku8sC!&a)u-HC$HBKIb^m)E>a|VeJ)DWn z8tobF_@hiVZ4x=)K-Wi`R}2BcXY9ah4BV_S8%6qrQb5g{28;3^?Ibivf3>d>K5O;3 zMfOr*P)jMlk=$DCJ;B2-;t^lxj=EZ9e?jVDfnQ#YusH0cycNtd{6Jt2UF7|ET;+4_ z>cyI-;a+V0gwX?vQ)A&WKhNHPQ5-N!J3s6XODAfAc4|*tbc%dAfLCPmvNv>m6QY|2RbFq5B*B zrgd6nyeEIf0?uBE8KSrDSt%_h(pd(bhEywP^-huVelJ&Q%T^Es$Lo{|2bol5MJY)bwLadi+k$QIT9yh~)w zrdLpAbbX0EBq|)ysjEupAu9VZxb-f3;h4KIf9GVh72a@ms+r_f3~w}V5G@#wl0<;t z@KNo88b*G*`t_A#xYt3%Y;MJS9?;C!LB&6`8*&j7rqdYwT?vB|KaO@T~!nN;~%kOOYdF>$82kgS+2(~i4wdU>U627=Ju2SZb@8>pUVfq z%DN<~{8DaJ{Tv73;>0g8V^!huiQLL0n3HL;{mRv(-KWDy{1+PVl<+0lP&F{6nKH_68S^WN9b;aGO7AA7-2epdPu zCH%f47+*d{(f>TGkDujHajPJU8~TMf3~r2OOx)?yCecYUt%3&UB@gm2%r=xiU z-s@mvON(VY`8CRx(K%g$%PILnI&TFGpBxAXuddDj~Uug0lX3Pv=2 z-emDOxwTe`W7<<+uhR!M2_Wm2gQ6gvRbc5YUA50NTe!8wA;$? zt>D~9T0u~Q*PV1P6ST=t=DTm^3_aa-@G+n-8&iDNHmUhfCc>==bKL5WV|@B zSk@+;8JyI6n4Lp-(DmA5J)T_jDZIjV!RDr=%BD(Z(_UXMZmr2m_=`v1+${kuF5^Ly zizlnX_ZPD3c&gUv5FO-cTIqVx9WXPr@h;L)%V(li`iv#}+ppTYNVz-p@$N>{#`kE; zR}$@h+nX|?+&FTDvx(}Q!KkRUC4!Ih9`t4;ZwhBXcWw5yz0rygLR(8MYKEG}7F~$W zk-yRJZn~|TlCO027@|zMKvnJGri6x_lyp{gLWNs=RdfDXo4LY1qpF^R}<1;+Fr)BYt`rx!n^L@^qoW*c`ri0%+=*kV$$>O|pS z@Q>$>jq4|S`sf-3^&>rKkon38#q}Bnr~&;+t&nyDuUAprUL7UH3!014Iz9q{+8qi7# zH#-5kxiw%j@E#_KW|3S}$Js2S2S}J}fH+by!woKEUEecz0b2`G-*}FW$jk%mHTvG| zdV+)E2dUHVilm7Q?|^G!4VLb+k>Liuev${$Moe%@oZBrB*97_TF?p@*b$Bv2IwVNXd!!jziiEvHbn^Zu_eng*4{52(A42M5E*1oR zc_HUSDEp7CMJ*rO*2wr*`c+}zj?R{=0rQ(NsucH;VES9(NuFwGj_jW)9gHOYw673W zvN@A(#ICm_bDi$*32 z)b$KzebFMCcb*$M&xxQ0L3)jGHVoF1qVR=lcFK&XvqR5`&|re@dW}c)3DJ)QTpp%o zeGh;ZYt4Ot8Mu=~LhZI6aov8Dg*oAcFR;ocvd8dVsN1ROKIn~cK+kvI4n65DakfP_ z3tPIYx)W;r;!_*wW*dlkG5g;-funyuAA}j4*C=iRb-|Q=p&=-@|45F0mt!%WsNYl? z$z@R=2!A8;1rOEivIYWM!L`UdVHqy-*or^drZM)yq)$1~JwB$H*uu&_Q3`7()nB4- zJUz3P{=uYA>0&|M4oII(D}UL7(Np-U-c{W3nzobqlpBA(mQQ;Cdn$&u7FH9?_Lb~{ zTxn2x1ZwNrZI9kI?QH1?I`ULSGu}}4be+_Kzso{ecH7`ekH4f^#o@`aK2AgZ#!_PN z&>%ojj(YFfwWn-9VifFTz+Ja-uQ!_yk|_$nz=$IPKl_RbH%v5AMR517|7*9ZfEn_7 z@_BN}jMosob<0Rr9lkNGCNIp58ZDn)gzj5J=b&wZK>Sol6wzlNh14r&DNKxPIGWr| zv%z%siX0OHMCZPISvP@-Sx>sA&v}`6#`U2Ei6_g9sAf+(@V7xYkGW%GEiQIPXzlO2 zp4SQ-D_jC~#}MYsIiR>9>G{e658VYD8kClQ%!tZ&rP3>Oh7s?++utqkiAI~zWYg5( z=%Me_!j|a+gK}&|mpexVG+ytEzNVvqt_Uq3IzBE>LV4~-LO zx$^dO&{R7KNAzK)Ki3_!l$ngh^0maWYS#QNUh%~GK#Olg?!eHD{ibZvq}`FepQ!j| z{f-Z4F_nw#qdNf|B4rt17!@Phptm-&7gRYHe#Cic=e`K#&dV8YMFtxck98y0(8%fN zX^MOn`Ui6UqMrw~*e|?Xc*a+aef3ner?h;Ce;VA^R!&9Xrdmnq_GV<^fVRL(7nxN~ zG+kT8dxXu9eE!VCh=x)(+7W=a1n>+gFY%h@-{Bv6zQ6sMm5OlCDK=tG3m{@;-GF^! zKp9jW&FDapeak_6cPRsD)N(K5slHgsQK#ys|BAr25z5hKeBr4BdR3|^<0mP`-#gb0 zu}7p!ACpKbG~O`1E^+fDQCJ!VhI9xS3`owunW!a&+677J!fwEtSy}1k?sXqX%~m;i zM5M`pfhnn_?alLTHF6U0P%(dZ^tXz_pAj|MHh3k!npRXUraIp~Qt?W*n>c{!pFge`zGl9(`%)d)Rg z2XNj~A`~Avb^kc>#BCu$iiXkT6g*RjfVj{7q8A?kn!jSOS{P~6w3WEtIZ;i7su{SP zDm%B7zGyBZ;!3)t<%9lP?gzCy)P|av^OhCFbD?Uv4xC4t3&x$nJ*z5QFq7GVfC<8g z3%l;x%=%!U**Zw~K{7*v_>1)TpqmU#^r%GMPs30dyQdJ8@=+dh=CA9kyM$;Z(mH$- znnPNuXc!%9u`Ef0hCa}wY$Y5Awuc@z@1FY5;wAg+EhJ4X^VZ8W-cwC1J1v2d#%SXm z!0Dv5yDI-xz-cG*u93UgOAqCBlI00zp8`)RtHdko66CTuQ9}txv0f%#Z%Uo|rBo#Q z{LE*O?oC9%6_KvQsaAeCwWo`j>}_#oK$q0tI50+9?Sb3JS3$hx^A0cCqSYKDF_t9E zq7YP$#oEzgbA-6OCRR-kLN227%JMD```@@g<>rTHZ|)>X3nfWGe7(=?$vs+~qDo)ve+|Q#NEP16>mk#y)$}(H zmm#REZ;OE880_OtjZ80>5EsrTTzgWU_nll@!F48R8Hh)D4K&)CK6=^QA7qibi%Qo} zbTPwonJOJ0afa@AkbN0iBhO5`d`&;RLJAb~i zBRl!cs_K1BLHITK%me%Kykl~Jn#HHvS({lD%ne`oe%pq}eGd4>RzGjjHK>7*C+k_j zn;JZ5pO^#SS->!O&`D^XO07NFHYHLr_9v(5i>*uBLvRDz<6$J_L3DoY?DICcF1M$N zuKD!nkV89Du+Hj@LF`j7Ga&RTAC|J4J4BxVAE-Id-os8`VKO*nZsyM zd&9t%>xL~7@l7HpKVDN_;dzlIh@aA{*DWK$uqq%2A`6S6hYUA7br_6wvh`1khc&AXHI{}!|CnrmBdsO~0`K|AKb*wYTokJT($w-kBJ$h# z$H_0A`f-t|F%qilr9a6_#gNt$xWN^;r~#HMNkLwEh}W1FFq0of39m3`Ex%$+X;F!x z9JgxZ=F;~!kdz>b^j2p*Phsv zgvsu%5{Ez3YY_Ie8%{HM2__wUd*2gy_Ti0Kn2K^hoISO65e-VY9q0c*X0e|*dxx(l zY8&i~7{@eH1exIpp(rP+Nsh^gJwJ8Nq#(uoE8f#!g{s`a9sc71;sf+&zKT>x>zAT@ z>K#5Y2aFB*j)ywhcghNc0SX{FP|h}0cXE@=}mDTq%E|$4X_f-}Ybayl;Or1DaQ9{EFI;07t z?>*f$-9(!3=a%OP_@=6n&N3Rg&zs|r*au>xo*D5fc7cAB))y*j@+RVD&&4%;!r+JB zMioF8DkmajkN-f{Ckewo2Ns&f5A}q%9!=Cp_hYbKIqrMID7^5SA_+D^aMG;XA8_q(LQhRi{#=t-b2nqiDo`FRdyWT=J zxgXC*(LQt%eqz}|7`Bh+@yM?-qnHteu>PKzf@-J|*QHJxA!^J8R zEzi}~#Fn`NF&zOhJ*rKT_aFZ~SYsfzd=790=1^yRYhNIbbb{*UFnGK zXxQ@XyKJ!tK~sY4V{#wOC2~;6aq#3mC5NOXVfZG10*^n`KQ2PXgQ{^aI=13f^7IVZ z-9@46bqa4}_ai-qbX@_MJ$V4MVQF0lU+xOEHn(g;GYcci&PX%rLnQ;WkJ|>Yr)r-! zON+`pi-8tks`>V7ZW_IvC|DM$_*O5)A$@Ax;miy2KXS7+Dot#r?}rLi1}d_e5$>7Y zh7c|6xzPaEX)G{;UT44^vA?Cd0a~0#3l>~Q#6IkSxIK|!+46Xp?aAMPm$=8v0@Z|< zVvt5APe{0f1)tKU%Hl)>ZVFb$xMdUqly)2n)g_Ah77m1Gaen#u^Xq!^*gDAAqX&-% zXegPIaW-(pSRDRKS2<>)v5&XCIe9$Hy9sh{G&Da12pR{%_zz@AwW$}4pt=)IuQi!r zS^L-*S>kHCD}j5a%RVzDm;WPCfDk=&v%1z%nwnhZXrZfgG7bm9ymspsL~=4SM5D(4QoN^H*pV6HLj7nGo@+2m zSW`0Qg7wku{Sp8q)&rDnpAG*e%S-jqPB)qM`k>o+hKq{oWFWMdYu4$W!rfkjm!K~m zQssh8#dP?n!Fl+>iv2K0cdiKO^TDx^2JF_2a3~fZ>k0oehUWHC<_TWI@28)>{^X+2d%y{qNyGYAwWGIE{V?lf{-^B1xv6W?yCbmeAzFUH>%kW9|_! z9U>Z+XO+;tVLOC8}y)e7b-36?(nE};Qj zAm%rpSqbRfo&%f=R6E^=PC;L4yP=782xNL1tQ8b5)WZ==p?TnDg}5{qU2+5Mp|X~g zl8vfFA6OL*49+;rN+fPWamNXRzYVv)f$pt;6tKr>A4G{iEl_&0X1}Y)LXT=9E-D8v z_i+Y?1)p$(a=ew*fob3Xk~ymgJ)ZkqC~Sdy(i`UBAif1QQVFwo9X9fh)4grI>$0gk<3r zYTM^Ue~}r|Pme4xh`%C1B)e;w*sM(!2xaBT3%f&DTnU<*E~UE%PN$S6e)l+E9k`0Q zu+_{#oYv@efSwAlgY_J-Bze(9U{yN0bDd^yh}n9B0{`)$Nsp8<4jsvjLYu0?5JN7R}oj+vnzr3~FZh`&9r)*P7 z+ivDi=vj^(@6NGZKv*5e;nmrIBcTD`iRQlLGMb@YI@3&fEo>AD;z060Adm(-3!k{T zY}vjPAWo!eaiGd<2kl(CHI6s%SS>y&wBQyb+!E;z?aTKr+3z*Tj;fe2_~ny=k#G74 z_O5^&{%hv!_wVtqxZAxIkPm=(nKqe=nSt%Y)g55+4*xTGu$kA~C0hC2qo4p>7tuLE zeHFYG2~0jGsg9}@+4O9BoLISFpoMEb5v8qC1-3KSK=ZG*>S|U<-2A0hRuLh(3I`#P zq*q9Yez;`q8g!G%3d4){z5d|@{=?y9n~l^DF-*zCs^LID8Y=N5C@*SAOHAhi!-(2Z zyw3hM4xA9B63o{l2ZV&hK-(GcTPmqVJVw-s9fwt!t7EYlhqDpw{_RyWgN)gRGcb5L zdVRa|Y$0E(XfRB%UDR`wxK0Po&a!h8+J(nRe(_$)`QbW z4UIXwGt^EjN51ulV=-S~kf%{E?}uGbhmso(;z81#bJ;gqKH|DFMT{urolbT#>n}9V znDCw?rc!|lu}|A`@OCEPW}2%;X%Nxbt9hs$eZt$rLt>L7oED}F6^F+?ZnPk8FgDqN zz!*{O>!p`So>F{|^1$I+?1iBUd4~wxFTw(x`GG({;ZjdcCHedPx$B@qKp`shpKt*=>wK8V0L6)xpE*ZJf!6s5cKuf>ZI#vQsf!b}`K`3i%E2M5PR(Q?+-Tg)*xM zB?``#7e1S>vu(=osD_g}zCtXWs^EjmTflICB-T-Vm2Ecu)gPbtPW_NzS*GU=GBFpu z&LW{UuFr7TfcNdM?SU6S;|j>}e#tH8Ws5eRz8cT+L8dYl6gSYF?^dh8I}vv-gtc!; z61)BTk8EfAS~r-bs)Gv*+w)UNCRtSKmHw@Uhy(A$ zRCljV+Rjf*?Ulmt7Kt70&U3uN+czzv3F?wMA2$0_SmEyq*~sCIlI`Yaj*zpHIv0Kv z{Z=cM3bR$vt8y1h#RSn5g`W@&W&#^BaR==BBu3oPu|zjJiVTih-R4?ItR+LTG`ygU z+i#AT;V1F7T=Y$%cXh2{h=y~Ite!W+dhhvCOj>8#kgxfDw0(4tG_i9Pi^Zj zFoW7JrPhPV5*j{mpU3VZ+K{tMxE#?L_KM&W;dmn0pgrGNWIoA^eKH+%_wx&HFo!7^Q<$Og3_e|o&(~(W|^F*NJ*Zk zi>PS~=G6&%%b8_n75b(&g3v>h@d*|x035{GwShBp;*~j35PO{% zwGr!rwx+~N20>jwFQ3GT`o6>`CgYdR+UVGC6ZZCsEX_ssGQs%{;1(xFC6!wYK385u zXYp)J9vtOq5nqHdL{!%6xHE{fWNngk`vuH|B<0?9ty$%k0RH^539;4+ZptbOFE@k3 zBgzHa5c2jJA`hPlItZ$Gk;t)TGN;*JRtp__> zw!TLw0f$)3Ed$i5umfpK!r-rQzpv9>1Rh8?ylq-*_4D)9*`gg&d-TCaaaEywl(H$c z5meb;VsLz0=1Sx+FT7en@_bB}I@#hC{Dogu08pwq?hYrOgzGAUBFNZx?)KM$+b6R} z27JlBiIp3u zghN`wSXRP_UDxkhT#?aOeAa~c=4Y@D^;n%$(5#~8ky)cr1+_Zk%R{&aPhsEr$`j|x zxCg8}IW|7sde=_(6c3aQbG{&cK`LmqpncuttT>~_p%t&3{34m-Yp7l%b>N$1&&|RK zQRA_ARBf!cbKuhMy{FfpslN?VNQN|p-|aeq~EGVJ%(rs zreH>G@47Z5@-ylXNrrwummxlO@Dwl(WB93K_(udw|9S3;b9U+iDY? z)f9E*{ILdFU5}KMF~zc~|JvxXwB+HC?RUIE$mx|UUPpSGY8L59^e!OY;(@A3tec{A znBFM(0TuqyZ^>(fpjSQjz?MMoJig{Y%oB{UKsx@m;t2{w2*3$Wb#cqyG|Tx%DQ4}~ zr6G>sBMmb=Ot%X*`u_vYYn>CZA{ebjkI2aD9Ex!w9d=lp#GN(oNZK2qX?0HO&y2mP z!Tea8w`suIr9Ho&k<2TP>%XpUn)~7An5!*+nTGe&n4? z1Kz_7yr;H?S-xIAKAjRuzF`Di7Fy-p6XItS-oj*6Ic1)~gmjG1^Fb$y3ili4=umd< zzaOb?Q$&8x^vvSwphCaT0-5HHnw(hz2;jt^40Bb!RX%PN9C<(J=Z|N&Qs-EVkY}&3 z2%qC4m2>;SM^Oo8T~&t31uJI|1BL}Jvyi}q{$qmVvu)`q-54IREl0uoOroXnv~I^_ zU>0#z;xReDrWo6a@uzuOvjP6geFj$RY^>U8mJUT%xMd0paIH}@LQ}>3FIF742=NXJ zhCps4=o<7u$TWRCpK-eZ<8i-wGG}3LY?@kVh%2;xR5WEc)vF3KO2J%TtI?TURE`$V zlaaW?qy;r#U2K@>svwhtvbMKfI{0K}LHd)c$$qSVPIuQ|X~keot5dIBG95q5s?dWu z&Wsv*jEsj|Nt+U&^=lQTGgni2!mXqiD;orHf}#(sAd$?)_bf_~$(T$?DKJXa8j9c# zvsOm!VXvZga6DhtHs5{xIQI^SWVl@zN0QBFS}#AM>k| z{mDl1U;pCgR0ky#dIdaN-9zeW`c!hn-x;48r&cbwKMFCIqk93PN6{&1|K%WvDxIA~ z3u%Cd8FfzJ<2i+dVo+8?;(Is>Nj2={KS!ztI1#|bbaHyK;GAZUf$cnwz0BxZVf%rA z!1V!3?{!@wJAmh3a%_TI9Bd*;Um;U)-bbkznOV*UkMpm3GW`>;5VYU$ED03#kfA~} zHwMTFjD)O|D2Y2g^wXEb4=NP;a_TYYKI7$k3;99iC&OVmWe0E=J$vAFiOQq=%W{0%Ht|IjE!*<>rI z$s*?MQfcsCgFbN)Lu6urFHh&QsG(?N{KliAy*fdBiB^6BC9}?pW!tBq z1*JuO=qtP2JBU~DapHeKA+3BLm@m9cO2sQikbP0SR6txs5XE4h2r>1CV=b|$zdB!5 zuhiX%L*$=!uSm{3)y%zQa(;Qw2f+(}#i)0g?nCCYW4v4}5@3JIz^i8G>9W!bJ~Wuw zAEz(27bL!>Vt#*Jtq96ZwrEp>_QiCxxCQP1Aref*M-e6 zy`0GJ!{1&9Swz?k;xUq6yvXDR3n*)DwIkEe`#%(6`8%nwWpgvVJT6ObQ}i(Neb}fg zRW1z%wPt#57@2|?O!&mRVhv5yp(VB-Sw-gL+dAXnoq5HG6 zTXo(D9zGDx8JXb3Iyo&!jY)S<=K(f>&4&YikcdmrVyUptW(OCwL`tgAz3w@(awUxOpD3Mc*%pyU6G#A13?`ric zMMwwj*A+g~4(}*j)GovI=M+ad7VuK(vJ1{Nlhw^XWA_OJKi-PPgbf>ko}MZ3e|SYe z(mo)!WI%nb>)IajpQ^k$ilb^?J3s`CisZsRm_+L3LupXol_POh!9Pb|ctH$pdH0iO zD&mojh^yVu9zSzkbxEzc4pPckAsbZAk_+?6I7F*QYIXT6O5j%^ znv!An**4BaeZwhnT&@a7Wz>U}jeS)AOTDX@YYZfE~Q(!mB z3Jyx#9z~vXL+c<#%$z)z33}UB1}QjR<|UH^#!z_SuO8{YLWN@Ekm^PQ8%%zd?Empg2 zsJVYX8iQDT|9~X%y*p>9Lk42RNgc?WkFK)9>>7H@knxnLNr3`g%T-#G0w~P%XW9J( z`$r#|yLS()Z|bIEu3O?9dweh598Ru0TblmU>-sG=vNXV%rr-(wjaNm+FTra-P>rV3 zAwIKrAcvvE^)jh5UJ*g$FJ=1eSEZ16LW@P;;)3Aws`keHK@!7avOiX`-}4++#}U?? zIPF>2%7fvb1Rfqfq#z$oWr3fe#NK1mztiJLN@|jrl62P;!>SB3_P$^Q(j}f_C9*VzYbI)8)X#7XobWpH*9fTw1?G?H)PlaD(Fa%@T z|6}T{#mXKNm5u`*~gavU4k&+fA zL=^p<<$j*`eg5XN!<_S-GiT1sHP`spTw7tN1%%@)S5mGvow%|Or6C27Bd*qd7f1+5 zQp}U$9>218;1r`hd_$+MlnN(+984w?rxex{qz-UOY~tJS0Jn~s^Gw`f~4@P4%{s2kk+;s#2ig~JzrXvmkcLh)`B zb6T7He3T3EKK*#iPNJw$`N|*}%b5@2@0gSKPmonXMjqddshl5~(N5>+z0Rst{+M7E_`S73lreF-0PObVYMZw(&IZGQ%|_Li9C4zOF*J>mmw3}_@_ zL=j7fAC(SFMV}d@AfDHMb=9TpEZ)7__5PFCaCI0(So%AHGsFtQJpLT~jJCX7ff=K9 z2jlch)N8RoYiA(`+5G^N4mhrVljDbbd`;?kbW4ZAoHOyJK*S-uhh1vJ{;{JwZ^&RRb`L@=v|rBcCp3zf4DW_2Nu z!sI2zbvh>WOzR-d%H%35qX!~PMkv0GJWs_+3oP*dhyW*=9T&1D&d*ynsr0BpF|m?i zHY6pq=OCjEAj3(?%DIC8Fn;mFqgUTPu>?7Bo$xXNN!54l(V6t^!z(|jsc#;>OvSQY zD(9*Z;-YJAI}XM4Hq->jLnPP;CWdV{qQcP~F<`OckyZ)KV6_!tR(@Icq52pacH((U z)llfZx7zeU>znhlZr%SijZq`u0sA7VC5T5%>Cm5k*-uLUpzggmg+CxPk!q8HRD%>1 z_7}D7Or3@<=3qm-3g?|k95bTgD{ot`{ro$Sk5SQ$GmcBOE{-qR!__tStM3`np;yFw zH>}BjE-Ywt-RPgrcVz>;@dZ`Y1td3%>gX8IRz-88V6zyB9v)P14Qul{@^-Q#Sg6OW zf|W=@d$I}}DRqG3BJ}d34(fT0B))xk+F)C!DY}%2T++nO(w|mT0S1FMST|Ke^p)Wx z>`epDsu!d#QR}yU98PK;3VdSNPAdi(tjaQ16R!W{8GxW^53)41UEG0$-XoUl$ zG%-rDVEccGodMS&xh0=71i8tm3W0bZ+)uy-6r1k`TWJ6!==UKD+uol78`;Ulhj=&t zckf4E^ebvX^wv|UU zMC@|=#>sc`Q>{~aKnNUEj(aeGl%5BS@&J>te%p9I0kWSCUhYooe;uzlBZ7{)JOm5$i{76XiHAxQ=z2{U?Om%} z-uL>X1hTkExs*w;G?0!698KuiWp`jfFVqc(=7S}cm8f19iw&2w?^?iCm;jy!J^Qfr zUm%nag#b$`GI+x+2JfSM>L!_-&duz52eUi{J~7tr_G1N@o{HIc_#;fO2>hpFpBfWz z`!Rv%(Mh3KOQJs-hWqIPo<1G9tarfw0J2M9WRf?r%I8eX=oQZ<-yKO>Hp4D zH}w!%gGl(9=&2^ktd}32xN*Y#r{`H#sH)NA)ijAOQo^qjuyH1UUo#aa$3x*Fwh{?# zm7H(BpTVv0KRQWJWh;aDOL$;fgi2x92918!w==5yy%-MS67Bo6(|yy41jNfRj$( zrV}15Cr$!k#(c^4}jMKpMX13datcdihn0 zF_eTczaL2WIQpRmWE1P>6&1YmLE`IK5BvLXP;HuiG-uWj0%_OKIOF=NTXYjt?$lo` z*}M$4{$A^SbaeMp3FdNKuFLJ57#|j%)XDk&rvdy@jjdwcs0Yjp_ZpuKl8$-YdaZZriaF) z89!yR;mizG%FW(72bK6@>Jk-kZwi=G-*ItPg`qhtoOC&#`puHIoc>rJr68|-VS7c^ zB9q*2Vg)A?%yji`69ZAgr3mar6R&Gyw+Mno!4e={1OqdEKA2@J)_>D045vLr<|)2N zDvfQcpogjO6zl7$W{00uTd0GK<;z#*)IGw0@s^dn?e~}Y#BdWAoh~5dUYRZC2Sdwo z4!HI^Q@b6oTz(YA$jErZ&^n93yXw}{!}g`^!5oF<^x8l03a$zjgZPwusV7+IXa%>u zUDvcuKN7n%fIE=*-OTVB2$F7Tl=|1~BpX!UTLB>0pNAF6zfwHL91;=1{abF~RZC-> z$;l!$ODRlR(0#QJ-@jU_7K`9O7i~w?Z1`3H*rCwGuT{+gfbj&!50#-!(d8jX+!P^h3ELFkK9{$JmQQf?%AOgj8#D4aOJ2 zaK|_=z6*j{RpOtR&6yCEZ#u{`>Yw%w2x{@E?EDG1Ta=VBv<`Spi{&RqM zyafQ(saVnV@v%vt>mmg6sOPk9@~jgtzR5)l-~1g*z0gR?H!k&pU>|%$o=y?BwGRF? zGgw!b;fEusrtjW{msP?2sE%>fuQEAccO>Cfy=|44@H8VEb2q^;sDd=Tpj-Xg@kG1OpyK0BX`1ma3NoFXdnY zUk!z=RO`8?+!{rkSP^Sb;@9w}Xk1Dn0u2fcZmoap91(GF+|3BAjci7CACcEIaCv1| zPvN4&Mxz4lH)WD=&co_k#2%)Mi1rO|ruawu4sWHa+&xsko$LB!z%~g)*Jk0<1wobjU1cr ziNHJ!N!gsaM;q7MCf5@0FTM#VT>IB#!Ww+PN9zq`*QHWfE0kJ?w&N4;`K1i-get$p)9geboHEQjmzVbA?$D0i%ZvOm zMkon)?m)W6^MUGY_%gj$ERce*=(90?&^z6Zw^)x_ejP{P(EYj*8UB!+}_~h@f3Ci zCyusUu4cZu6PS1^m3C>Wp7Oj%^6{Nr%l{6JYOLc|PjFGSo5jt4cn`~(4SB`mCEt1Mf=8Y?=;+g2*InCYw z86T-3xVOCaWy&H0Aq_DJ1A%irbAXGNeu=5o511`rE!qB^u*^#4!Z~~u0Jj3rkOf@c zv~to+Aa~e$bl2%}dpG#xIZkj9klq`RMl*=tB38$K>=nG#%&Xw2!lz8A#QFPk8+d>% z30T|G8aDx|wo^rzqbDv4a>F7o=ppU%xWKCq{u31k;1R=-?rGHZ8@jA-7i-Lm19ylC z<>Uw%99@G&0r)3;7VYUoH|oHIez$i}kN^H9I1t*Ub$Tkj-dLA_sZ0OhB@JR9JMZbhh{AA~vPt^}wHGE*N~ zx6KOt(o*)k4h*|E=S-G_{Zq9t+;x+CCZ=*w^QtQ$H@bgO6P+cD7rl}uf*8cQKW-3WSvv`c*ji$WPdvIrDajGZ$X_Oc?=;v8n0(jydlw*up6NPs+^pLRK_mY;ECejEf*g&^JXXc%P9J zV_Ro)B0VEo`5KFs{U&}PRs045)&94t@AfISJjpe56NIaZ=> ztxxn#3HJ)>Os8&b&((%u6j}VZJc@#F82a+kES@Ygt#9H0Lf>Zb*7|$sh?)`R?j1aw zzaO^cmSBJV+Ai`wJ$##760SobBRj*q0;0GdYRAMVC=7$545O-aorCUYHuk`BS)&IV zW{?RlrQrFB!ms`jUuwpLej2rLnQo$NgF4sL%-$kFAA{?F|1n5dQN*XIo?8-&F z6UKKUn@1ELB1FV1ClUOm* z3&o1XYXA4d`ayL63T{TVS4l3Zh8b|A&_wz14&Wc!ly;ms;$8k?kK;gxF7C?wi(Tgv zgA1j|;XZ>tx6}n*Ns2-#2|A~?n;}Ww1U^+Hm=hK=S4F&#mc#0A23yEHavK z+C9U)!37C4f357AuC1gSMl`6`YE%|p27jR%2l0X6Ok7o8tM@8Z1MMikmLxh`XQp!b zE3E+Z8R9-xZOf?xF6x}`1|TO~=OhuiUJZsJX`*nM`OJ@8HPShcIBi8l=ZGR!>(X_J zNqHwASAAWoQwK`GI4L?#cRRZ~Lh#g^>|SAVBGEINlk^HR9v7Xc)6vS2y|<~TT7Y$q0wd1FNlwzh?$x-9To9BaC2o)_ zh8}VfdF1M31x^|%j1O@?piug>t_aEoK@w6kQ+IqQ{%=l}K##gtTV%t6@-Xy;g0R90 zXsR;ixXdbDIlviZ5#Lf!i4lfnzrTIsv+KFXY}i=tn@J<-Z5C;d5+6+rgXz%^wYH46p$3w>MA6|BWpg)tUm-4(rR1i#evggJng`ORn;_IXAUdyfZwR&)I zyZXUA9~<2>0#U1SZ-Vvgb#)PVD(@Gi)>NMK774hJkG}loM{R$TkyUXo2+l5B+3l#I zV4P{s{-uJ{4^h#}%wh(kpexJ=#rIxGcBYEF$Ep(N2FuO4D2zc1z~?(EhJK3L75bn{ zEG|r?{m29aW>!=a3n{p$WA5z`KhW+)Ox9JdOsif~((*2Fw{KV9xZJv;%!G>1Z#i|} zsENW;(-a%V2i+0^Q<62WKh3XZ$aEJ?eQw^6Wc^08JvtVd{$^H-WgfqfSU>1GkpcSg zZU-*2S50`CD3LGU)&g-9(Qj^3Gx|0JOQ7|Q@?1MAkEb56@VYOrNZBYh7kRM_WK;hs zWpp#=It4=UuZJUWHR7+I{OlXC+)R0V#|7ZrW8J=mewvHD`FU7BKLLl&I;E}%Th*zpMg`+RC()~nB z|Jkp+$IXIM0r%%bde`0Xvp-D4Q_Ynh534WZqIz668mMg4l+GlovirB=5KHQ#lAK=jHoK6!6 zpim6J{9i^%Oe=LH9C+n}t3?0h%{!idzNwx{kf<_-uQ;Fb^&1c;jIYV~l-?uL)%AKa zQt9EDjr5wedx$2eUa`lrT2gVOfi$r*tUtZJaq5a=Jt^ufg=+KR$8sp_H=9pYsx?XM zi(8?DkqHxe_VX5s{*u^ck0y0u{tr3UdWA21xy2w#AZT%13zPZG2Zq zYOIrjuaU6eOMZ!D(AzZo0PELcSO&Db$8vdV;+HV1e}(sL61{(TZu#ra|6hKvasdTM z(2N{okICEfJso#R<=&S8pCyks9P7iu0j*j}A+}~fL-A1+mgC<@aJAuUAwXo`=vb0l zzvz6)3j1eW62ur_eOE{FJ*4_KQF*V76)o`Fh7#7DdCJCu_MDizsXMYU2$ipZl6vT1 z816C4DY0Yf_J$Flr98`}Z{X1l!qSD-wKwMVws{;$N{ zhldMghj=8o@(-&3+f;UKz4^41G$?ZrQBgxqG>V)pFf@z`zI|Px_#jl+Jk6~JMJ}^u zlDj^}IFW2@IH(0d(;SihnN^eW5*dv0%`8-o>pyupT;czCXy@DJif5=0?e0qLx36W* z%>%$47@%~kxurFRcwE`P9nk;3NGX&nb_Q64!!((eHk#qHBXeSEE#hnUzTEp{U15yB zsKtt=%B&U^g8FK1(4jTeY3DO`9=8nvx(-Vpo7Y0-ELuMFo^yTepg#4VayVIuk8$_r z(DRp~8NHv#eD9uFw9g?;@m@9$2POg_XSJTOzqsUMY{DpL<$e-3@jRR_y%_`qm3Jr| zg;~l&TN@;jy}=-^I;S}jLQNgafz`n%K6}*WtFmhjTbt_$MaYN7q)Ry(&hNjd??=(3 zBKKuctkZ0O(_}~0kdXCMBh!++f!f*`G4~?Ht_)y6Jacd=B|Ptx+#-1_NnN~h1mHUE zE}#SGO6H*ZeGP9-S9-L-ldGHG669q{O!ONz(}#?CLAGP!1Odp2fCKnDVn6|aLE;~A zzNzB9Ei2|9-bq3Xs58gRH8I7dVtG@^akXYi@_mF}Dp(u|c zf{X{sTvQx#lIw4e&!%Vd>9Z;N3ufSeLwNv;y< zwB2}o2a~tR(Hx~j-#V0sE4vT*PeW%mK$=?bO~ zDSDVw)>%rAWHXowY(H4)D;58@vIc1LEtuXK_7B0rm^uT1qMg@E%hr*)?0xbKh@R9M z|A!Y9^38)6dV|%G1~j(O&t+pevAyV*;mn9u>^Tx{g!7P|!Kx^L2^8tmmZBLR zKC&QvqD@@Nsg};=VTe&xE4B=#Nx;EWQq^}4-p1U0bC`@>MuhR~OM_+d-x>Hh;c*~b z_+!-zhBH{kV~BT|%cbq#d=#{@h(F~L&!OTZQTj#xaKToQ_LrV}el1z)`Bvq<6-G3) zxW&=xvHUt5lsV^@^ZZ60@XAX$Q17kOtzFpFl2{JVLH%2&MPB<-+bA#kws%{M!e&@egA0%J3FDnR?`2Z3*{VuchDbdUCMF)j>%Hf0 zFfu$3HEHPq)nX&60p<3Rk|TgZjrpt8GOH=4S*H4PYJ^N8<8V2|#=}xKW=Y8wlTAn) zbNvS8^%~^97;s<|#XtPu<=#s1)5eF3XuN%M+iD${UWD0r&TVbgFofdDKU~n3)}5GP z`B@NDs$m>?#-O>1ZH!2yAB1fEVPKWad;&F~{d;8(>y~Lg&xAHX&wbw!j1{CoS4p~q z3_A#PnO!6}!73k)T*fj71Sg%;hFa^}Ou~0qRDe*x|$nqW{HeM^kk{9Suz8vt%!HJc7jHs zp-<8Gn{JBgCYb@M4L>(;xy?lXlv>)ZVCSXhYCmYKUm@qKaqh>wgIN^d=vhN<;LHLi z&9aqLt$`~PDKB0Hn!o%EAt}IGs{oK{Ro#`+i5YDNJ<-5A0J<;g1Oasmyb&`az5X5; zsKecCo{$aziak&Vn@>C3q-RRjBa)EDgu!ObK_nK#AKz)xrUw-`I)P-o^$%O@_As02 zZ|2@|+MN0+*jieZu8`xFGT{D&&$TK5&@0+ugomFKKVopS?q;AENA%J~<-HaR zLt|cZjCY(2N=|XcJe>09dvlW`E3>tJHg|A~d|cMN>Q~_?>db-`xW}jkG-DJ`!H$$m zpUY%XPI#o1XL*`o7_OySQD|qSg6h;>Jv#vdk0FA4xPP1>nRF>z9yZLr4j z%c`hw92Hq%f|}SiY%*Z{$#RYMi0L9w^`V~1Mu>zH!fo!b=F$? z*ACn!^ikx2T2*Xqp;bbX+U&S(+alX4;}PosQKYy+aR8%73>2n<{!lbp{q{qzIF+3~ z+#JK860YztwoC-hI!>mQH-pa}kj2p_#l}1CAatb^CPLzEzb$`f6fD&>dRYj{l;`UM z>#}jUE$1T9MKn#2ifDg(Lv!lPA4}c?`T&7-%&ib>{ZEey2rg_ZwK`Z;zYZ*nKBZLQ z&-anK)QhUkg7wTu`)02M{CD!sWBJ}PwG#ci4vM=_NqG_tm8GdhWR;yS=W*%>CN$;O zWn2(?saCl;{XZXMC!co}QyhSZ*NEWI(vq5#Aev`FST(0&eSjaM28BqW3pM>H9quVx zqZYZJpc`q>;_Y6<{dELbrFr1x7wFVZKNygs?--yGx(e6B^ha9UpcEK&&z_<`n@b^^ z>J{_S*h91zgZvF475JdED*F_3n*KZ9@6a7~;4WE?cw!L3k2>u_Qga*g-K=J9X{?9} z@pioz-LP1t$XH1QPGGsY1X5{7_-w#SD=oTy7^k{W5+EPkTwVSHpVb-Z3*Bx)g-6C|_UJXKndP58wT{q1gwKTcigqe^@W2gw^_u za^f{X~g5Y2vVD%pGLT+>grc+339{r5Mk^Q z16ex&y82YKB90ipr`R!k2lNUizeuqPyrYW~$Rf(;dm2sEp`UxGlqU11kFeBHglK6d zH3V|0V(f~&kXuGfg1u^3dNgvMAC*5WHa@hjSZAkBfvc+|bI-OQ1t!1D7YzWw3uwpf zbw$O$aa6l^cgP6iAxH1NmU3IKP^%^=R_KKj`&*eu4<1Me@xb-Q6;E9pKckiSHsHwo z7(R0iU(j+0)Jm54C=WU-ceUg%FT0mOEu9qcy{%SSvxF+DvnO`n`I$s2Z^gbcs1F?P z(!a@H5s#Ee*%4Txf69$k5`rhza=c_!6j4k5*&Y)jtuX_>(O2OZ_UD;5O`-cI{g*y` z8Ejsw6!%Au4+ANA1hf4grc(4Ya2ZVjvIc4Yv0JAK!cnAl5KJ)rEM@I$WtfV{&+*xg z_;QD5pY~I#0VCP$A7Vj1i+7ieQE5O$KUgXi3x{Kq04#OWUidZ{ME6pd!abk0{>kOH zFL~%;3s7KpKgNnlZ#|PJ&eB99afhPzoSm=%Dp53@u%z9Wh^ZWdE zDDK_U9?@e4-49Asx;$gJJ-31b3ILsarR2Q_e889)y{j1Rqo!q3t@|3m(tXX_dq6Ly z(O_dT{<3Qcul%XSNUQfAlg4?0ffk0vdunKLD-&e{EKiG2?9M^%6qyL$!6GOP6d}Pu z3wrwDa=BPpGf_J9FsanpRvttm?4&D#W;AD-11IbkVfXl|=gUl_#P=q-YAVjg^FXpE zG}-GPk*Ncw8c0 zc01d+6VJYiAphl=2&m9R`50jCo<`aH^jlqN6_3tRNddL$7#HdB9upB$XalTlo7<#H zGlGRT|G^ZirK@F%+5pD99;q#(q=g~TgeQkhI9mLBOwC{nVkEY%Eaw%u%p#kGXy0*v zqr-hBwJzowKp^A6@VeA_7p_!=ppli~eRf$WkXp_v86s7hYG&mIx1BGWx3jb?_MAPcI=!rDfC ztfv;lyN8lNVq$En`XG*%`DJ;^WTAfd)Wnc(fXVof!S79|M2U$9fyw6%oy&GcO$k$> zO$&;frLSwGMO|-_gg2~m(}`?WCt>^4)|$z=ZIonSHZ6CGb)O`gE*2n5(-^$!drAx@ z`VzjpiiGJoE8TvF`QN1)QO+j+$|bnHgDw2LGHtqckem}>0`WF#Bli>-+h$#d>_>N# z30c0%$-pe+X_u&y9PsHJkWCoKFn*~3^$hvvY+nn`hYT+J$l2lLH)P%zmyInEK8De6 zzbq1Yaw*I`G)r;N;iZMk}JspZ`=p=?@K<1JvCe zARf6U_}}?&Gb%k4A!Fw%7aT*s;*e*u#P_(_TGGV_lpbHIT2u2b*v;0dXRzv zEaPo$Q;j@a?)@jyf`Dd}`_dc#f7*GJ-(VhBU;n;!E1U4KqX>TbmRV~m-^L;xjPvz% z-iy8riTxI_mt{x^4mEfFw?t2Z@z~@UU;BgA~?o2gWADu9>w)e@hR*T zaa)}o0B@J?KS*V+34(P^8okA5zh55AGOngwrsm!5(x*enL4&flZf|y6KX00W7nFG$ z{beCjdUy5KJ=6pUtiIo1zto@$bmCr&5E|6GP{!L$O6CLM>H7E_z?EP2)Pt=CECv1 z6}isIsoGea<^KHY>!Qk){KpM@+0LL0q!cq-$2(6ABAUyAo|EQm?-EjXDU}++Kffx>bDmL~QWOz~>-8sbfWX)EQzmkv zdN84!@TO%Y*e!tv7T>uPfTxzL{13 zoj_{XW6IAEOlf?W@}dnmR2i4GAvt4bkZLYyYzSsfF4vhreLJ2`1%Ki%=+(cTL*$)` zB~}6xW?7^A$paJMJYf9pT&3=P-Jxbjr!Obvkpr5F1f>e}HuJ=^i&fw#Ee#DRCSc|> z!Jt70&LurkgV&EPq-p^HWAYd*h2*s>03}c+kp3qR9>n>D_Q2TyRdO@Ud0?=ASMxl9 z)WW2+Zn+@FSb8WMNG!gN5iW4RZ?pLT zhDqxD2#)EYj|9=!{;FS=*PXcT{BL*r)-`_<1l;uE`GYU$3a?T6I^WdPv6kIv(YL6f zYq8yIlj)Dp208Nhvu17vo4Riz?DxM5<`L*p@OoM9<$*zuS@}oGB)lg2Q-EU)L_wIm zpTr$YBl52k7A)i7FEu8c9UY&(rj%rqr*mIQ>9f_@m|WNZkGiWSlnVvx#rk&=o;A_S zq|+7cp6-zBMFA|fEH~@cz189}4_MdPIoSDcl!pbYYSkOe(K`N~U!S;G@ryr$n4n@- zl(O@}1yB0~g;tq>|At;ATwpV{Q$Z-MQEGIhtWTZ!p;Y{Tg1E28*<|atiXl$HV}c-< z%?H*3lZFdO=gO^S?5gFvggEFoDqRIS`FZyd>ccpL@nlnVOkT%4JJ`n^z<$9V>Fs0E zkRX_l6IR*!1oUU`tWwt3Py$91k~{$UVUCO`<@{urlPWOM@NB8xc|gsf2x!M_vOko@ z?3AYiSaI8IcHdi6wgYCcA$)bp5JokMO$$8lmuY}aSZDZY-dC?NgkqCR2eM&{axZP} zeB9nT3=drsCgj4!NixTN?toIk1dHxXznLe#M-5X^vvb^VWsS_O9hPP+s1@UqS9;qP z_a}rOo~*S_uun_Vzlmk9G$GI<83`bDiEu5Vcvkrwk5XvQVY+`miytf+UMgbEhL7*d zs6pv^C@`&JGI&$x?UMxsh&N0=_yjx~T_?!irahaR^P!qrWSY4;_zWTugtR`fiSPjY zH!%Wn>z#zMJ+cPOfEmOm#HM=tZS>DU)Yuvqr+;v09dnLn*vs2xA=U?{PXJ%!r`0wA zt)~dZce)M^0%ZW#b7d`1s!|9%#51{69={q0C`y2OyN_^(9!96V(6@1gNSr2nUsSWr z-9LF+9O5`{DbXo{GT~JOZhvfS{43hHG|g zb;}@2=GD$M$}3az#JS(*LqOGn*Vwk~s-J`ofSAeeYG1v{Js>t?zQ_CM!9>~D-FsJc z;v^bQ^n{Iz03Ygm>xL$@*7sO^AQkPtn}lUBDGCPfmPWt;IkXA)GGz7)AsKxRvrD$# zF+!iKo{Dg=pvxcd;uhSfZ=<)|6zkM9t6jZabw$mar>TJZ?RF~m)-s&%NK*4FOZ4+xa(iDVoou1poz+<|avzU4WXFMRl_V zg2g7?>nl?iE&8zoF*Id{72Q`}{rfM?UCRk#qMOl-Ef7#g$*yx6)Dz_?S6&Z-asKre3XgbbW6~{`Izd{#rXT@I;JT(3qU|O# z0saSqC@CWGsfT_$rv~>Cc{fZO+A|_kf}#7WHq@jpey$v1C%WpsKL`uk^B)NRP2t_B z{pR{b;mO|jFNE5&3&aJU=~G1w0&u;%d_i$0yb1u`(7Km96d=c};mm^J8kz*N0<=>o zF)y30Po!XP^>EM(&yTj5@8tIPd=;;`2dEZ|*fukNU@YPf+ci(m$}DG21_-z=Ttuq` z;HfT&J0n!aFiwP`XTOIzGY(`TxXgljcygzxn3Tt(598*peL0TesiQ%c(rs{GP2O3p-D^G_f zQL?#aAjj>KQS{|-Kb;FoTZ}c{=6)qoEm{nebT}{c*wZ?Jn_&)QPmgdSJ)2vPO-9Xw zw^oLy<2z_D7W`jQG6~R7?}u*%Io}_0Rz@__sXWLpTnIz7ug6=;p;(O#84-%RQ)7+N z$T%&vT1mF0ON0OIcF_kCe~u=M6L3XtO|fZgHptmV#&8*5NongL8gBU9Xky(UZ@GSXIhgCdCWSaKl<^|(k~u9=u5F~w{$ z$}%N_y;kbl{BJ)0(^_FTX}!u_qs5_2co7}iY7T#&kyBDv&;oBl@EDLfFm&7X!^_UK zpx%QRAW|ZC)dvdEZ2IHr7xu#9H65%4HWmSThs$g^aHq6n9u^DL{Hgn zxdYU<7HSD-S?E{gs{TyLycAw8jE4Lm7BLP{NE%^B-CED4np`g_Y zx#aXB#uh7Y$AwLuxc@}V3T8xmz8Yl1$@R9GNF=JQ#D^8L+V=1K^1ih~>O%FF~Aq!-vcXRcf2TIG6mA2h|>uu+R6(JeMW+s1${h zB2^}*Qg&Ru*9C`<_M2KOj5S@DOl^h2nQ$lbArxP=(I>|o3f08ee#yMBcj+`?Mnf&$wh=i~2EB$Xo3^%AWSdB%z0zGW z5P3IE8w^am0mnx>M~EnV!(S>*?RmgY0W2*cR}}2=nbxQ&Gx|fwGj~d>uMyWH-#Tdn zE?;J}KmsQYZO3&2CL@GRy%6S{C#_s8d0%}8rgs%JS6$n#1LM54uw{zLyDpqd`Z>m* z`c|I%Z7L>-*qsAP#vqZ)4=z8eC<3oQr4F^ra>t2&Sk5lA{GLo% zs(V#C5O3J765oYLWDJ} zwrXD^9}Jt{FHnU_gd(w#w`{_40Lx~?NLlFLXetyWPEXJV`d})|MFz>*b~Ve2E=z+s zq}A@g`th4&eetUWdWCAQNn8QTznT6!#W;+S9cHsgM1=(nQB?099FI(~{sHb_sRdq% z6zo~H`q3YJc9WRX6s=X8KTXt?ccJXk>3NsCYqa*7bQ1MDcDY&Bm>S(BjbK;29MV}Z;NsPQvFnD=1S9BuwtyA&TD~}?9c7eSM+iK zm4F2HmD!Vc?{u4@J!0+7XZ3V;Z5EWi1}m!Nw}^PQG-t8Dfh7!~1mQ$zoUj zIFKLRYGcJvT0J5A+O~Lz$;A38QyO_5GB*t<{UtWE!_XKdmXtdN-2p5_@Ya08jj$Gt zK$H4preFzbsZgYKI6fVqWKE`wkSC@Z5|m^LI!Sx=LTGp{RCtP*%;>K|{{_2YO+@@r`f0!iuH72JVhf!H$I+%It~EK3HP5 zs#owXE?G=1UyW)Z=LMgvDiB+{BTSKmblYeABG;RwxMyN>55w|nUS!Wn`y@xmradDy zojR8iQS4-m-$;(~k&^5s1KT0SDmV!W);=v3;L3mcrq4(;Mh>1Iw4T-vvAm$9$&5nW zT+kQ=7qZR~ITU|vh$Dh}T)$6p`55Z`Ny7KnK1Xe7BXZ)OUrTejzf6vPJsx0#7pSh> zwX`~J)VPM4!$LscTw~M!NEaX{tz#t^oSn@3hrb%B7WOwWEo06(*mdrKkYXJITKZ3~hx!^-2BQ$c zO8=yL2NOm~vmQ<>lkb7vkwg^QpY|+m6S7b9h?vyn`Y#(>>32IH@%gz^MgGMRRzBC> zPt@+S9E6MEmP@JMX{{>#Q3#gnmY^f)P%Xzq|DC(>>Tw7cdXU}& z8QV~s0mDfq!AX|?#A*9uM4PUeBYDeX~S(TGz7BDCHK?0PY&i2 z>Y|Qe;bKfJb`wvxW^ni--(3DfJA45 ztima2jmSO37~cNwc0_gmVm2-MBnVz+*MmJ4RE(7-s9DGb9d*d0rE|vX=s4b;LDkh8 z9o40Y%RzAPRrJs}9GrxYufWazYj8gNoFf>_jH2~grS))$4umYn%Q3(G&1EIIU;nU- zR3v~%3$zUFX=NN{@|u}2rDncy`ijUC{S%{`O+k_9Kp87S_Si{jaefZs{e!dO4lLZp zGm7WS-qnDg8j8b0c;DO8(lVbQOX&iMUKn~AT6p+m;)mxJq(c?M)bFoj?7NSj)JKP!%VuT$MpH+JcqqzZaK!jqdO0EBxRil0AvMdw336Hq8A!M&DGL_iKFy zj3Vh074$4rhvUQ+zr=|}71&c8=rK9MCF}$`NX#5k#0so7I2qB~QfXJga1K3*ENbFT zQMV0lYNTwZt$KpCE4o-0seX9w)qJavYU+8~$3I}?2a6r^Q-wEt3MR!q!`UM$2*EN+ zE&){p5DN;YPmIvPMGJYz(k2D^pq*$c{(w|HTX=0xL1w+v%fjD0w1XCLi#81GytyAA z?Tpt(eNAe}4PIQiHI*6dBD`Ur&I{g9 zl+s@?*l1m$11;o?vUQp;n^j{yfsdK*I}^t*GD+$FrbQJ(60|ijckk|=3p{*h6yO}4 z&;RhJ0AOAG6?N;*@x!6Xg14Wv-caZ4h!B6_d3l^UJxJQ*AKgiI2Wc%wL*|`~CATq2 z1VNLoL?I!AU&L{A=d~8KaqRIfwJd}~)YreX@r7wU+2gsPK6}As=zEX}P&@9;32$DZ3$liD8Rtc<%h@9I}ZI6dtEeP_#>w$68Vw0(Z>8!GY64RAj6 zMH!u~S5H_q!iiS>;!(Hkw+)E+6ItZ;NAGfFp9sPABpn$xneccYSz11i(F>v?6&Pj{ zNy2Uu*6irM4Gyv)p*%Fo0iD=@i9PU&$gk#Dj2>V^xJF`rgk%6t88vUqs4%O_i$as9 zvsP~TY{?78Dk%!UYrG6DlCcbrg8J=1Mf_NEmiHbW6^enKj~J%1uV-vmJ0B>s3J)Ub zC~2+6@xP8u+7Q2S$%1buVe!A+W@P9!&0u3UEedxsf3g+_^v=CnO$M;7BTGqJUG7aY zLd5vp+NF@_h671oLl-=4Kbn|ms_Y2GqqNo!a2V&z1PjXzq>$u5*rx%IHMsGFDNtJz zRVDXX*EBY3cU3=gV}y(T)~9L;8VApfE{zXMQ&d!E$uIfgLLcoA{v>jd{zlTZ+8J%p z1{N16wrrw=fx&pH>_1NV4*=JKa!MqDm7hT;QMIb&<6AblbMvO(o`4*B#OuZzDn(rnK$%FHUBLRS07 zf{zw&1C|%@YPk2^Z`a;}!;;iCoah--pPBZHVCMLv8-01sG|B>Y40n9k%l&H=f}y9P zE;?y1%B9wMV0B%}2EY61ndP}7`>`(G-w3x%f5>=RWCpXO#t^X!eD_v*M`vN9Wm?YO zC5ey4T)$YQO2)Pf=Q?S6p6^?WPCl#hom;J}H*^{f<(`2)P-s84OORf{nqeX(IT+A0 zV&xoE?BV)2}FQe`?;TD=iu+?^BFqn z+2yr8%F&b`_432Q$-Z66i50m}$eTywrG1XROf@mXprD&(E8?0Wdl8)buEiqbVp11~ z&h-Cyv#hSg^#;RP*!54o8_1`UtyjFtFIic#V z!V7V}SIyuOEi=geEHdZ#B3ejYMk=`W$j6MS@k?n(M>hwOe`8yw8mUJZ@Hyk?_WS(a8;uMP0PA!;0y} zI^;lJNjzhXnV|Y_Wcy?R!IX$?D;v9zBdl1!LUfnurFre=gl-zPr@0?$=W;GpcR@i> z{I|ZKN*G_BQ%6f6W91)m}@T5z^NBi{2+O%|+Zzs~zGU{j4 z3oeDMcV({pixx9GAWzAE%MGjB`uB7VjVVOV(i(?r5msBTtQC1@HUAde==?J~EAoKI z^IJ6YcJ|3&Yjc{$*m{sqma{@uPW2iPy@!2%ap8 zUGXO?)c- zsD+Lb?p+M;;}fG&Fk47MPK4b?ijxpd3)qf0(o(q5e_VB6GNojL|LQp^x8ge&boG%m zD~67WI)8h}j5cagHsT(85p62gwy15Xm36M2Vx7&nD7gf$`+s#^XH-)`x0SAd^r{F_ zm0lDOF-QprL_j(LLPtsv5HNrNDI!(6^dd!CNa&%3DpimsJya=DLsPoI7t34gx!(J- z?w^@t&P?{%bMH;=Ir~^Cez169$0a?IDm5B68)hQEVZ%X>cAU~3qop4Gaw+m|QjAcF zv(uJJi*!wJ5mTskubm{D6Q#cY=kG&^@muH`3aNxzkXg%9b)`h}uzOn;#^kM&Z}mb> zgHGs_z#)*XvMv7LPfvO`4M53WUmKcWGoT}#<;*M(;sBJDF**BiYYCVURIF(nJf zz*qM(BDs2w?gB=l1#*d3vQ!3hAEpO#e@ztCEh%|@=X0`#mZB6%z$^Z$>B~-LPkf1A zuD^RGfHCt!B#N6cEY=+mJo4=$S#R17?_QD=Y7U zPpLdNC6q(8FWNYYp7&DVzlB@09w9PZz3E{}iJ2a{tprro{zE`~#O-C-rL>u*s-lCY zNJGkDHMjR6lT7icoMR(Cq&qVUsrO=n->oJq_FlytvcWV3etc3bbinAMk%lo7 zL6?v5b#jjuV;I|xapE~yjtcL|c?ae`CnP%NTW@nm*jBVZ={=FL=WLQsZu{xggzVQy zE=)Lm@Hvs6QD0q@+e#x3;d+UvC_(uH)*tqnby^f)Aezk^dayaR!-7OmKCT}wZJY(YL6b)9 zKdsT6Kg)wfECpO3CAWF(+U8K~H^)X``^H%hk&m7eCV*1iIKIAu*sR19E&9@d`S)yg(NBU8sp5X+Af z;GL;RkodZG_H$jKsf>90Io1|APEUkz_{C@EP6C*0E5=G*!t&|&tM|+l&xnrj3c7N- z%o%S|$qBCWfDd?(OcGO84#7gR^JViY9ZeBbk8h3MV1Z6944Z`H)HSn`E zts+&(blN0&PBGDiD}!3hZsmG(7n255eej=X8IqxkhU+)h(|F!>5sRfV;OD?3KL$B$ z2;K1&ljdekN?71gLXuLu<}RGK+c7v_hq?5uv{<)NDXj(hq?rt}`;|?AQ1=vLR=lr$ zGKsOD;i+|(hZ+7FmgC$FWi29pe)*K5R^QDJ^cw~HvfNWb7| zC~`9|fF@_1kd~WD?DWlEI6*(z^mwKAROIIZL5U=g zFfd-Yh9$tgWlo%w;+hc=Yq>7lQpk5kqT-K;3+XzN!Nd+}zSlD^XdS#*xpYZ%eXt}3 zl-Hmj`jQqU-XEyo2#;NhmrAc@LSZ**wb)~%YHuG`eZ~-~^3akIw;%h<7Ezq=^X#!o z+>{g$vOZ~>SYW(TXs4O&*{BFHuz5VYtnliH^cuTJ6Up=Fi}ZR8aPdutmAgzWvUEx> zJB8u1ygFleHK$1FM-Oy_#pdkE*>;9r0w>H`j=Tb5oaC!zuaFU2oK(oZZnNeae8>eh zD(D>ybI!;I*2O~AN8skGKPsjL~~k(5gZ;Z}&ANT$+JXwF@hwAKD;H})8uM9@D$!bY=22xvd^efxP>mv}G0 zIzd2?+fKR4F8%h=Wy{*RXtN=j6PPgdUgZE9HmpfR*9p2?6ou?; z3=)dcNu`8`ce{00Bwrf&2oDzE;f$9~S31(UngWBGf+T$IID@WpA70JWC!3g|ed|T@ zVG!x-#ZhbjxVJM3Uzb)Z0d9*-X7v4ZtIp{sQMZJqj+OR=lmxx{kOpw}a;zbXzoU48 zg}lhfu58&t@BL;)1yZQl(TPpUpwJ1&d?{;PBZp@Ijl_-~@$pyhVe)k4Zb6Ac7H&hB z6YD+`c6ve#=Dix{7XS&ZDd;%OV- z&aFZAS?A)ZY|lp%J9YH4)CaAjz>y@L89T-P;Vf{#;GecANUz z8akemgh;9YeVnAHunH-4tH^yAaNFcvn3Kf`d+sfylQH@8`bKxq4oq7P`rIY5O_sWE zZPLA3YK%r zW{FyvyX)jdsQ1?A2s4g(SbE+KR^$oe<+E{+6S<%`IWrBREtIf;dqBj=?4$X60#;Wf4uhbYy1>c_A2 zS#K2$M8$Zk$mqe-NQL3h8mUpIm+;=|{Y?rfDf0<&s;It7K9P#$N_0hi(;do+R$3dK zweTG199dF%fqsag04nh}`c}=y#H( z+}IEl?w$kzJdknK9dWkeH>GO1b&A~T(oA<5dzh?G>117{=|iyy(eH?}e4(v?{&Eqk zg_S4hnEV9SME(pZCvzS+$^A=LK_Tl;L7&_#=ic_xhkr{Dq|D`BI@PB|z=HHf9hU+N zp-l`r2-u*rJtw}hmb>_n_9&{bey6jkYKw_&bu0qg1M*)+9F&bna3#XNl82^e4+xPu z7>B)Soo$yS)|%|y;F2hKfFLR33mDL7`}mwZURZ?(+#sL&CrIS{V@46>2us-4!U z{7lNN$c;74l-0#Ea(tOcdbs}z@Y#OL76W2V31r2^WUcFuIw&Kf57KBB|XpS1x9VQ~MJ!2GKbENPQS3W}blJumqu_1xO zM3%Qrx*Yc@Hrp|(DgGD}<1*tTt!^o`Vn=Ze!B{8M({Wp`NOgB_#nJ)iA?I>iZc@d4 zO~cX&Qe9m>Adc@*o}(ZcwE6MTXg>`rKBXRCXfN6xVVcOtJk1UEUt5BE7I?^@7|_J2 z2VPe@xZyJ*uXcl~YiOQi@aqfXm!9LTUy?RrZS?a%zEo@X#PX&YPNX&Az_`NzJ=WcD zFq*~|i9i|hDxd0|F~s6k^zZ>_$EpQAye<-N@&TC=l;M`8TsX6tVDM51%RGDjJQYV` zQgN~mLz;pIg2`iq#%Ld!)aUzATj=6ux>D(YnYTC;8!P27`~7~J`|@FBC;}DTWoFOQ zNciS9e~KG}dk_aR+QD>$kVREoNB1laGo;`=)Pu$KA;R^;ux=bR8xQ2)q7MbF6pM`; z%Y2Usv?+TPv=B8 zy3G;G*IK})Q8!&%sIi#CB+soc0*MD@Y$-a$%y>)|>sEb7@Oq?-Xq*`2BLNL2@!x>Q z5;Cym<`!Y@7GI}td*-=Qe8&%_Z|y8iqBIFoFiK1>8_WZbOjuY%dH^LyCP7w*Stm5= z^0d*usGj`C-(eYLgzFD00>OCC;G??tsvV?j8$L~Kw2x0mxgYAk55~pX#ECGWB}1w$ zodKyL`&qZ!+hphrv*P?UJ&Ef&wgLd{?4D7Z-(8`N>MPH5dA@(1!YAxxha+dWXTSC| zDTg|BoNjDZrrEd|zWu@HAb*6?_|SG6^sVi;vo4>keGfOnrZHM(CUDwH$P}JSY~JcYH(i8xw_rpj^hs3UCFsEjN;Z8U;Fz{ygdH-2fS)=>mb2OU{#kUt%e$;#@_{HXXxf)moR!1cgWcSCc@W&!tX?i>{;-nZOY?KdIh4C9p<^rc30og=XO3_RP6 zbI@j8q&=2SIz3~`i=XW13y}S2-YC_{sGFzzQNx<-XLEo2bz`k&1@MVrsu@imrxwIa z$~TEM;t0jfE*)l%8zd3wKRC##>kv9+27}Et_Y+;8;Uz$RkvF(HTNHws+1KB-Rm@m3 z^l9`4$XY!bPGoUE;0R>ybY{L+7H^h2Wmd4uDy~_E!&vpW`Yn&$_fPmV8ZBe3|AhT>Ja%Lg(P#mTQa z&`{MtUJa9_kV-%5vav)}?!cQ1Q6e9^OD{ok+gJ)F;S1$p1o*zMjv&QxCbcR~K}K}s`5Y(z z9}B=^kLCez_XICDR+6Vh-UnNp70}q99J(m0bFDWC`wn0qT}R1;#q07A)^84)rp|Bf zhWp+f0%OrVfA-+baL|fJJQEA?yyU<@rAowJ1wi4L#SjltMaVqc4V zYs&}9drX8e`6^I&+b9S?0Hq974T)M(VSujMpcZA`m$c{y zE3tOehMT!z{a;G-*+m?OYYRJu9w$t#2qClWw4q{gQ1b4U)3r;3{A=+AD}SGvBG2`dKF7AkJpkSHr30yuHEa#?tNhY z?Ghf}E7!;BAq5ETcQ zVfEW5B~o2DKW4@uW>z-y72tHCe_Z*4+wt(|MD4#o+HKT>E)K0|o(*4VrSJ&6=~SMN zPZ2E$_{*P%If>kQxXJkc2GJJq89WXKv}6T;#T6*PxkAPMus2j0$7k}8|6mAc=P)in z{rjwb&3jHQ^?`kKC}BnzR*DxF7icZ)X&kNq7x=qU4<1KW#nDUv_@A{_6X%aijQ;UR z3GkV9Q{ocvc}0BUM;^viVNcm4Eue;`Pq1r z8sdFm`Y){{jC8CG{}@PRLJJnl`X<|p&L1ElvFl|DaJNv492{QtIqPB~S2M%=!03Ms z?(6x||FZIOO%!A57*8RwRjJIXciC3aMmsc{BA_$c5YEA@C5mmZ#4aRJBr?>R^P4!vU^GRZ-*R4 zw&VD)dRlek*YK!Cqiogj64c8EqQCZ;dW-%2aOWzX$FFbv?n;-NfS8%59F##Y=rum$ zzaP6h)pmkPK$WFKz;nA^Rey|Y-r1b3b6?qNW1enw??P4Ldo_74{7znPj7;&N1uo%V NYRa0x5=D!^{{UZS+x!3k literal 0 HcmV?d00001 diff --git a/public/overlays/crr-logo-sem-interior.png b/public/overlays/crr-logo-sem-interior.png new file mode 100644 index 0000000000000000000000000000000000000000..19ab456c566143bca5b453190474f3867ed381a5 GIT binary patch literal 9970 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
  • W$RnRtN%ZS`qNuO qh^+xi7uNODONBXTcB%aM#wUrjWblJb3GN>`cv=uWwFVWtnEwT?Kwatp literal 0 HcmV?d00001 diff --git a/public/overlays/crr-logo-white-backgroud.png b/public/overlays/crr-logo-white-backgroud.png new file mode 100644 index 0000000000000000000000000000000000000000..3058d52fcf33c32aa5cf4b91cc8faa90210896f7 GIT binary patch literal 147728 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⪼#{ z+y)^!KD(7}&Q8EV>GB{ZF0$-5U5v(my7z9AL}-SI1OfdlSB2swgcX_6-lkY1xfn?J z=k!h#kM7+9GUVTL(sG!j$ZQ6V?WSEzZt}-<(9#0bwznz)nU6d&lmn%}w|^yRB4Uvf zOl_}6^r+FqyL*-gkF27)ZF(jl}JvYF^=+XM$kY-=?BLQ}Tz1E13f?Gj{YfY)8R<4sjBE>ED zir$GSQ=N$(U6F?*z9|PAmE>eVl?5~dAGFR|Krlul_VNmH3Uyjh?H{&?Y72q@HB!AQ z_9La#N)upGcCBFMgu~L=zb#{wuIwo$L;s@C^sl9pCR9_>yTHmjeJuKrv$aY+H|ba` zLW=p&ZZ>L{K?VE@eQ*7Mz7^^c@2rn^4kkiryWNcJN+>+pwRZTgBh`UE&mHlNW1N&y zvk*yf6kp35s#%wa)AZy1;PBP3cg3YHb`QB_(~>h?SB^r01Mk8)C#8l@cf`jvRxL1} z9GzIPr|kU^?yf|urgro1h;DRLrBtj2ncdf{MFz$FpxnUCEEX%Dg*9p1(*>JI2zpK6&b32%Or()VSD z3D)wib!z%;rW<~ZpCQ|qVsp~dqWgPTyC~P_jX*M6Orul3xB%ZhO_U#N`M*4Rv{Yf| zz9#Z*w)0ek#qCky<5cdx>ST64$tG4^rFgoDYEt(Q2d zUhPiZ8e2KA*Bj@$w)MKC?NQ|Up{h(pK!b94`v($5^App#zVSDG@zy1Z4?kHT>K5I2 z@aJZ%_zv=y?PQ)OP9)Dsq~osh3w`2iHu}O{Bte=$h^!@BRnq&Ky5wKMS71D7mZoeT)>}Z{dijpFd+Pn0zFrH&I2C=_c zKTK$g)~!T&u8L}ci>B}rL5L~I>KVS8de9&)y5k>=@i3qwtvwO`<>mV97uwYhmJGS= zZEgS=(4Pv%9Bd+|?Dal@pV#lv&kqVE&tP{q0krzBe3aceD2UVsqCH1e45sBf{1Wi> z$kJpvBX4{KrWprQ0i{RgRSMzg} zvYmGYGt|lQ4l3iK8>0u4IQrSykm^lPCI(Oeh7QYUxpFRX$A?IS^-&|)7V2Yu_0fy& zgKcGlK3ir?jNpOYX590qpwbb<-nGhVOQHYHKBtX;4Gx2pX!_+ba>^|7^cigUz}*eA z``YP11&T*v%DhT+3`cOaUaMqT{R>r$yI`GLDq{XyY=l8TDswZqz&O8V`q?s9C-l21 z8aF?{j2#&wBSf!NdNc22f--0jUCCqOv5?d4RR8yHZQ7Yb!WzyeGf@>-Z$-L)!;B%j zpB_zX$97jdQb-Qmg55UIf9dwZa?pG-j_6j`>y%O>^IsiDozc5Hlwx3dXmD;*VLg-& z_AvFL5B7%y8a*7@<2^c}Lqy{CdeW{ztCY}Jfcc5}Z6Dn+(Q$j+#&`0RsT)NF0#5LU zq?rK%jp#~(^ts7Y!?{Vemrka5czLu)=83}Of+)2_nDw6soUic^Q`s3~q545{p5YdR zuNx6X*+^A3dflf&UAVhs+QEbhAES1K2WirTA}+p;_$>;ynv)LedW zAE<3&5-pVm1V}$SG+Kc@REDQGApyAV`!>!K9zA~I>bsP>@|yD9V80&W5nO~4?mVif zi1P?w28%3hXKf*?5Pul1Ww<*2wJy-ZS zq+$g`;iVzQco9W>LcTyU<7G(oRj0OVAI#7Z$fD(ZkrWQKy2I2SOTBsYJYTNK4U_;x> zso?Uu*nh(jdWEo+;U6rFmQ6G*l90S%!WREA{b911l?vKQl{KEy{I$@5Fz9DW^_E(<^U#4|pK6ro ziuTy8!MMTDe`vl!>FTZ0Y1Syq9b!5gPDemngyHVTdTDm1_IR={D<068IN#sBGpbA- z%dM>By^VzTYXPCHxXaKSqw{h7VjN%cMbVb%%oc=9OHoLC{>PVD?!CZ}t!=4GT?w1S zLU+O+A}NG&SS$VW4|$IEA2RSPM;~ChQpyy|&$K`4ZUOIFN1npV%Dsq#*>IBjzo0mJ zK9F0Qx+7dIVal&w^CypluirIwO&p2DK1KaTd6z;)n~$OZdm4gq*l8hD{aH|3qs+ z9h@`khWJ=8$=JR{IA<)&ow`c(UPF|qLTdmuVzMOD_C$rdwaOopFaZ=S6BTo zmhKz>$~?+dfHg!cDF(4OsFK810Zop$)GPH zIUBOIBi{FufA0Y9OV_gvH|fM!Z7(*%|MV;lN_xI~v$bjX(sje&&*enFeOB?tX6V`K z6ZWS$7fn%v^Z1SmHYJ4nO6mI(j5W1=W70PNzEn|50M8}#MCf86a$K-Ix(K-)N^pTeGud-7S;R0sZoXqH<-Bn_@uq z#7KAb2D9WDwM68NVR^43q(m46>%hgoc)*I+Jq`X{&z5KJ7NtB@TW(qZAgDlSSa7g7 z_|O#B6;JdLi%O2-sFhdv=RrmQ;_;`f%Yu41wZ&bltW(%+6aIbizV+t|{}`e}_C|rD zLE@94G8v|S)ciqS-p{;kc~$Un!%rVz@UyOYH#K9MqPMov!a75`X~s+FK-Oj@w)XL_ zif>6XpV;mst;4eBP=6`M(()_^x`!DeA-8+xx4*>bc56mgp`{DkxkxUf2 z3R8+^*iwrYm=#BjXG+xUiDW<{Jt_Bvz^>DXje1!?uLIrPy0POSMOLVZ>KF9{!VF&T zEE4&oWQI?a1E1CM1A2xlmg0X7B2_!oVS#g1L$D~oTq5u%bNo2%7G$vgtu~iaiVpG- zoKA7jb>^LvX3>xYbp9Dkvvm50D36hC`Ll#w|6}XX4fYhH54^)7)P#Gh&mkt+O7B$& zFSvy<+j*O!S$qrHkG-?Z*i)e@W5!&~k969|53B#Ey8muI!CeFZonU}G;1*x9=3Y0o z4^_|FcBf-l*Wy>2W_<+(xMhj|6m;vM8W^_Ty~~xxxdZl6RN&X~RnhJ!ePPAeA10Pa z)UGjcFg7rN){aseeX)?a2wjgmzv&qdmPfYnt$1N(+KycTrd78y;4hkw_Ji{n6MY@} zL@Buzb?I5}8>(|)K9oa(X&xkJR`I5&V9ZK;n&(<0tSM6|%>d)gC2y~S)|io<#(L*Y zzvdza+gcr!#8O+8?O3aattMKJzc5EQdsws`Hpm-J@~;FB$)oA+)amv7M|37>TB^D7 z|9SxskX1RP{!Pj~|J(u=zbz{~a~ViiLD%RYY4T=g8F6J_DQElOJWR5dS4`bHmAP20 z42Sy&G9`kDb5$ZnF?@N(&;@zL<9IXr(W*Bw+zSJFy^NA~O93tdh)ac?E5Jg^R1tLX z;cAXkKh#Um?<1tbIipiSNl<-hCTyf!Bex7Q67iT4(T=$TmM6rn{Rb)AKQ41r8LU557@@+DYEU@UH)M8ibP6=i_&tJLz~a8n2QfLW4;k16XO7mo8(7y?PVm0l zx;W$xSQilU{QVfcyCxr|krtl~aBM@aUL0BP%pwbkkVpeW0f?dz@L`WKR7_aWe0$N+ zzS2>XlzYUC8VSd{n4MeJ)-v@R%>$~JerX(+cpA)d&^Olaps(*?9=F7p3@&Q2PW;yM zPvA;4nz}`BwD1y&d`SHUyQ-u>bYliZ7-R`XlB7|YvYcuNolBXz!TVFSej(1af{}uT zV+fI%@jDKd-Ra8EII-etdc|Wepn3mb@+?LQeFh3IW)NzEi;`NOVhVl728fIi9f38c z9ujwyRJrlb6X}p{`7;MXg+05I_g-bN+cT9N^b3)+dxDmk3+GO*BMEpiz8t16#h3P9 zj2L#!)?&=HC%{V#q{ZfZtMn!7xe#sNu!}4kc#14cLqkatI3$0}_BP1f6MHuNOVr)f zN7wu`e;%xL@HXadph+Y66Yr8JJOJ#2^%VNJqZbK$YFqQsk1_D(R16qNSP=R?0 zhKFQhL0^USt|O-{qnGH>>XM%Q z=F}xhqexA6P_C|IXecK8ZtEtU>(cRz^*F6Stj5FVqs-$S>0mz+Q#60kORpAhIg_(D z2)<=s6vdXlvb8QADtszg6EmOM{3{NCY4y?POF&#w*vcU;A8{(>flBVcj5jfI5?Y&u z9}nZR4+NR80nM}x0}0^rLaz*>v5oM6ULPC2K9=IGibW9(($#35odprnd934Fh^aP6~PAB8oj42P%^5PYlat}E+ZY! z^zm^YkT_I`*8&<0djwRdh%2wN*(`g^OK{O}5_gdr zRyGYOhAO2*k;k$#)SO|c1BnH^pR{fuI+n|~KlN!nT3zfYJ7;PVt?1TD$GS00DFP6; z^m)e{X93tAYa#@7%}wYVZ!qWEw2cFdf8($3&*nLR1H*rSlAx065WWkuxI0}TKNv## z_1_%g0!m}hSer=RYq~;D(sdVL>?i+g{YbwTe^GR!r)BO4mj=(YZv?5yBb!5s9ATIY zr~Gwq2shQ<0Yi1~4tj}VWQ^$S*dZpJYBu~sKC#9>q7N$8bFq@3GL^+nU|ns;!%a@% z2UA`p>$OIWi4b|M!=I0OO2MS}T;@vc-2E00eG{ElH+RFvvf7)_7ZZL(A|5H}=rFPHDPQEJJ$+t`t0y{2YiF(ROUSf*Tmd3im~eYEO|2){^;V@%v(MSgztS}%*( zR^jWZf0Rt7NWfaWp(1|+DUoqrgC9`DDVSBwiEqxpi1kl@&^>1L^*bGYgq^N70qD7$ z5P6yA7WCXahQ!qCu`(Xby&NcdQ9-RV^B(kgJrLb%HiLX~>7=W+;ilviN6bahDl^2< z{Xs|JUTd6f5+HnyLrDRua{JCnnpV6OBhM_i{h6$mqIX45<$R@jRTNvub^?fa_!##n zwlf&2CN1V0FL9t~^jlvpoYND7-JY!l|EfO1Am}W%Om*$&zi|UkF|V;MCNUT~5?arF z6tRUyU#LMNn=91P!sYw5&1y0-f^^;TaDO=%g_;7NH5ZoQV|iW;5v;qz)CQX+fXYAA z+Vz00CDw`D0x@If9ZQLH8|cnI?SisQsxVU|#XXL-O^}mYsbos&m7?lvrI1%gL_kLN z3&q6P?u#oF`_S=i@A~&=$ki+L0V^KVt-J!ggWd$hYXA7K4l1bhi9(K>le(o(dR27l z{!ep;R`I4#4O${R#lZ;@L@K>|d!Xy=3i-)fVu3005EgCS*{9H#(iE_QW|GpjTGkh; zV$1#aw1HFOY@RQL6jevhbS!N||MWLrFa!{3g*Z7gAw;QZFJ%b&6XM*ui9g1h(d7z_ zUqo!RXf=R%oEVY0PQ2aDvSkzzgHya z`XErsM+z;`H=*$)`0MwecYc&7C57Aw4tKue@QFz2ypWLg&8%m%3ItF`$2MkJv_uuW z^KkjNG;t3C7bRC&lP8KIDm#PH5K5sQSVKrl?D{*4)ni?on)22?qifkXe7yUDTLpNU z(?UX35JmpS9bx!T!t#K)c(6DHaCSKQjpcV@)P5RF2a9uZ;I!*Xa-czz&%>GYR_=__jNe;%-xZ#sb^k+I25TAvQVhKO zLJ`grB~#Tm5!}>eId&asffvbBEAJmW=(G*YPt~2hEyRl@30tWFl9r_>{-Ud_!&)sT z(qqH?O4oBe39*b8PiWfhuOWFYUIVbaph7OBU#!pf=~F6KMmx@wTn1?A(UibmZ6(s~ z;l!~bY4oIf+Yb)R#lf+59I+xJwu!_i<1tWV?EB+x-YNJ+lFBx`v-YwPgf90 z#oOz8K51we(r*z0FkEIY-HGROAnFlU6GB2Ufxs}&M8QeGCM1@{l zGvnVb_i!4=)2Mj(Ru65zS-n<2>)y$GnT`E67=gCk#wf!nMHYV#$F|4bTP+}bSFjP! zRgRSkda6$9qTDYl`+l+v76|a28d6U@1!-}%`wGc_)m`sWm%V1HST^2P2NQ9t(y5bu z^$kBiGyZZ0EnI#AP^X}2VO-hcgV(rXkO5NZu`(oPwQdj#ZY*@~P9z%qkxmTkp(7(2 zH;!^1V%E+xb^cCDW4yoE?lXKw^g*S%X91qa($`SAEdSR!`!mUPhu<0i zK|DpT`D@+f`yY(fhhP^sEEwG6>Tv|Kp;yD32AYPhM_lE42g$~vzhGxm6SmX>pZFlD z&xf)Ria>25F#)p_MP3X3ZI>%wHdVV%T7t#;S;cRTbL`YWe^U8YAK1K#v#5oM17DxrIJeP@cNpj zbj4%&C#%b@B33j}eH@@D4;V2NNO67Q^Y2t%pUZWxbV6G#k3K9wx0BndL&{!zF(DYp zE<5NL2<$nOO?4aiDu1ZC@YOd3zDt6?mh-98vRvWiR{fU25rbLfWS^*H_4J?#yxek? zx>2#|U9eC|(TtFnRZ4H(I{85SXkyG@J0hxKQBarUtlojaX58j}CZDIXHe26Iqz4$$ zFGwC=99k}UwSVe%`gQq)(%qTDthf5u?y$ITXydt@1A}l3M|u9k(YA`W57RTl?@$?D z2>E38>87mzvs0}(eI9l`YHC@^o z;Xl|bnyusU>N~rN1H-0(IhHTAb@J9z8qUX|thj&MSpFKmsmC=tR4gQv9OQ@;9Z}v9 zONyMsoB((S-aD}6DTb`2Cj48 z*Djo`tNa#W>WvzG0%k`>Fr0k- z^Tq6)4kjs?^2f=-ye(2R(Q&19vZg8{GXzu1?sY#Wu9TSP4eZSn{;A{9?@qq3dR060 z-hWKXeKhv|ny7W#yuwE%NuMY^4*F3AiLYOFXb_JH0bvo`$aHPL45m3L9XabN+Rqz_ z$}QfnQWT~$l_ikQ=H7W?Y+L*N=l6h3e#Nhz+Xi1=4vG0v)p2>vDHv(CL5_kdJTFD* zVbmCd_HQ?)4HIj(Uh|0xz;OMVyL|&W6ja}=KA}?KcN>h3fW#Jz(`&hlPdM-Kp5PKI z7ut7$(Q{7Um|k{mnfSi+T8R1&ivjPg^A`9pbY`qj{dj8Nf3HaNWGP5%EA-3d6MKQFlhxWw&1R0&RouRnCF~8=X}LMMaavN1fNY zZF)4;@YFx`30Wh9smPde-j#17{Vp29Q$NEi)<>!%xyarm0sIXjBe4J_lV2L0K`bRFUYE$dE?mC) ztIy$)5X|}@sx6_VT7w0=In+FM&Qg!F=OsymVm5R+8Fg!_kx$KWhZ=4g%s zA*E|+Twa-h((%VOC&TcHXVs=nM3f#`i|Mi&W=U!kHSCOM4!_Z17c9-#96b=LC)pL( zo>=DX?2NHgss5_t9Qoz3awwMZ7BPg^m^?NWvpu%$RQa9PN`<{pu~GKW|_shMeCsp+!(4;7CM>r{hllunQSTm5D6)J;rqxzv`ft8O=& zTm)e->)jlFtEy}gM<4s2>F)L}pB@u6+YCoLo$s4J8!1NXt#>+HPb0R~I6~mC`JKYq zC1-XUx68#QWP}C9TWXgU3;A8K=eXe43s;-YB&ND;m@wJTOBNX@(oL1M8u!9Hk@aAK z_AM#}f@^R1QGu{tba zzcc(LyZx4oLBQe-WBOQL-L`eib;;#m!K})DKSp$Iz48QRbNNn2@8^3D3ez*0P=^}{ zCF?AV7ZF`4Z474?eHlL_nfxA+zbTH0sAGMVwwL723Q5*vH<0r{&Cgfl9R+2(YzoNph5-_kDQCGh1Wi8Qr$$im34PU1&;|?LxZc14_1bX5Ao$mh#YoTg^jo@BV8?vB$Rrij>YRP16V0| zs<4khFpdRmpGfXk{x&8C#_G+YVM;G{rdb7v5u1Ita~m50d3@vhDknnetnU?&)>@HS`s zILrRC*<9^KhMN&QQ&%F0?rk=@{Bx$^{8b~vvuGT_$g>`=k(w^bTT97hj}RE^G~86Z z7r#@~I>!8vdAZr#Qxa;Tkoc+SXS~REna2~AR>5P z-*;s2SDl{Mbwn@zcUnpw3*;4Z0f_95DqlL^{^5`PU^B?w(r?DD8o1^XS^6!gSpzeV zUW$eQ})fAV>A>>CX)k=tb!G{(nr>QwNiyBXZ;;M8VXEZ#cX7cPoN z@xMU9LUE1OA)o&;smqe)+|N#x{Xf(b;W5V0KXZ|3fhMR!#v-Iopt z3!*<=k@|`Ft!zvaWjL75W8&w@Nh-C)Q)=pDf&`#wqHa6-_^=}4qm!^Qs^E`-5w{?t zjenC|*|>jO8xG%^q4ZE;ycy`vJ3RG#kjz>l6d~1H{Ly{w%<;bm1P}qRG-@Bay|n14 z9l$sAOYq9h6?r9lbU8&m8{cL1ydtD1 z(FTW)sOYyNRTaM;pF1X+zl0k5gJkZgq)5U9u8brG@Ro5mV@V!0v1A^i^~i|I!2Q}^ z(m|jbRGt5;lOb8cU|Fv9xFhxQ!Ca+`1X`{rHn&@Fb`mQIR!{$+k!grzwUz4uQcsXo zIl~1`l%~#IhN$q@-t7&#L8pjV&XMLLJb`WEL0Qr;24vkok2_3av&WOoFO`gS|D3qz zxgYZ|wUJaXs9Cb<2c~JDypFQaOy!^5^QXt|l=NWc92`5jePM`0T-A&~mIf#ip$=yM zJq>m_MYY%aQltEXZIr8r=LTbK6xSm9+jMjGw+NQK*kf<*QiGQ7(vPSggEc{j>?4?N zQ!URR(UaiTwxu=Axv#oEshm1pet2|aDltB*>&yXJnc%lCZVc`}Xd;O2(`kYu`#$_s zu0oq0W=tFp6;sFRY%yjUNZQB-(zIktNJW;8+ct$nNaXJF#=K8a)ch2kYow$`#msaw zqBp5#@%+_tn?@nEN4fO_3o2nUjBt3i*NUF1wR`)kto@<}XKv_=$DI~zue|*5_!3uA z-zv$!yNxWWBBxQeh3sD+SEWy8Z7eQNd~fBpaij*u&J2I#4Y`oGFUAQCg;vSqFs6f26gW^hjp1oPf3(#rvJr3$|m zrQjL!Yb9yzuQR0;kmm2IMv?KJuaY$MsdQ4bY1LWO)OSjJ43u~n8h_S4^+lzPvS}(F z3)bg`%GjuMl`ms1ZRo1arS92(9%(Ee_^wmM!24G%qGmS~nJI``Z8B}6^irAgr94?Z zX~MwW37@m#?rXK04?gLL)NUTF_KAzUZ`@!gGrn)2i3Hqg_ww5Y>=JGnKwNf-a!3-K zDhcn~*)00JSsK-QMW!#uQu0x&fha#n%i$~1y_n*_yA1YPR_Q{qeT+3bHFg_uU!01@ z`>$}UI!-gVjcQ75@x~egmA&2^EPd)Dvre4`?};*Wuc_B@*s`!Iby}KT@eM|2ddjXN%2SV(SqX z(HHoQjV%zv<=FgHti$0rS$yg^SZ}@$23a}2kL&v#au0rkvQPzY-zs<<{*XFf*{MK4 zYrAu#BzI(4YHKcIvArxCGCW5UO&qF>E!D;G%Y59Qdrb8h9KO3u^!vWOQfKj=$lEse z9>e&l2ET|9IFdY(0m2o96sHvT8Tir zz3qAJn>F7B*I<9<&CHf|HiiTM1k2umn=b37h}>N2>|lnwy;TeuedgxeOk?9piB)pf zSDYfrmt$CM#F`?k6aMx2TXAQMgNE6###eq`Vs4nIq#Ss}Vg0;JhhW&&HWaW(h%Ki~ ziWzI*>N~@xto`Uwt-kax+3pER$Sya#JzAV%K95h ze;}#ORuM6MEayb8MZAHvgshqPczzVm=}sV1U+e9UaR2kna00i)I<@ZF z@8ZWV^(LmN>$qU}8Z4A6?4zz5cJT9|;W+qhakcN~#X6i`4F8+;l=I;WxLyDQF$Pwq z6-*Lf5{eDrn&#yiynz+_i!jfsyw*EHk>sg$JKR`6=q)ZbCtApg+S)e*hslN z5_WX)aNn*W_z&cXXvxFd#fVJ)`V2YlU}r48?SstKs7SAP{2mB}d0`LncN5g<_7 zon>B>6$-uQ55W)RUT=hH2~1)Et?>DlJ7{05X*llm`L~$d!csuo0t6aaa7Rqzazyi5 z6QpY#lE^RXBy2cy4h`kA_jkietupw-DR`993XX#z^~-gOkdjLcHw(4|Bvx z*11g4PB*_||6ebFbU3+lapX$3V(&3idw70qifM^EodaITEkDPFN41Lp$hfk%BZAQRLxm8-+I2*(cU2EN=d z`>7Q&5lm|iFGsn&UO=MIw2nvOKZcg_H{btdWI256syX7ins}mMH5-vYs%$bV(c%;s zz&~6?AA1Ahls`3r8;-)Qc^{G7$iPhu-kv)&G1+r`F_H>?sk z584~k%ls-D*-_lO=&2gb+c{tmHgrQ^{(>l=kOa8wj3LH+neNKX`QcahGHib>m}3RTsb1l%e+Lt2|k-Aj)Wh~=mE$v%3F zmY3&=JV`#g`w92(@Ii{?#XmXWdV56wMJ26>4?GqH41j#ob}*2PjCUrc+pt}rj>9~6 z;M~l6DAz)JkHZVN4&GQSsHZ4?N5yS`!#?W%&eGF=hsu;UbAR%)My`*q1S}~L@Qf?m zz(?YfI(4g4QAXS23R;H$%Zj)F%ZAR zDhg4Uo-%U(6w_^GFvNVUk!^waAD?_JFMka|-1d1{NvT}~p+cweol2CTkEuzkY%ejP z!|uSc*vaiXp1se%%iDdvkt*H_`TK2z{F;frj}eHDEY$=XUWC^a-*=e>qCZn=gwbg75RozYJ3%!Wjg&z@K> z#u4ec%KFSqM|-~iU0z{86fge|HcD7=bpzqeCrh0o=V9cUV$RZ7Zy#8?%BA43tC~P8 zJ>7T_VxXtPf2nb)FaDKBbWm`QcH(rFbf5pBa4;#6!(=#qV8X^`FLj#z;4JGKcZ$?M zy6*3Vkga&+RXb)`FxNc&!AtQGB)EpedA9C|U-6fcZlOX24katI4dnIqpGPtOzBzdW z@y_8J>@@-U{7h}0ir{oe2pu4gKj%C$IKa))elpO^a!>u4CMLLAOU;;867e2&J5q_B z$@BR8*_FRPK_K#yrSVqP`i(&{b`GywgBQ!B@+}eiuhFjk5&T7fs#%wQtmr+74IcdM zHTRkl*qIlb?|KF#z%a1XG>_56vm@ta39B4$b0e#x1ex00HC5w-6xvg1SQhaVgUd8439OPK!eVRoT#}|(c6qQlCt*!FhKj`*=z1~~2Cw1Q&8*UA|%X4d6 zn=i&i0jRtfp4GS#|Gb}?aIqX0y9E>zu7~l|@)tc-UuRXNa9QzGEgH(TAL8b__!18&{73H9VyqJH*|4i&60CPL>AX6Z#4v z_`z&$qs7iLs=!qsAFu>Q4;l3v*euKIdtSbpQvrSidKIrTh!xVrb3-d;o5c3Pe9Sw( zl!2H*DH?*=LNdwoV})Rj-~?V#`Jc+s7e*GH?8D;X0LU&k%rsj*R^aO~-sLwcr{7js z#5}hDJp9TCN#DK47y(*X;4`+39dBRLgh)c~*|w9&UNwM-WJE7ACu$~%4qpTB)lco+ zuRCRP74Oh)MN{KOM(z^eU&iwNcu?C4wtUjh@sf_3LHG9u^6Nqi$!6=MFKIi>>6 zmDY;h=bwj^K1nmv#2|dvcY3Nmm-Cj%q1{aW8jIWLAcP$cIgi)-FRMhe^=C#ei3Jh> z;%k5TSO^9SGu09h*p1zR=L(MrrCUdKyzQQ86B1%JISDsUwOAfVuejW>*bqn29z)>{VqiDH<11!l$SVQ%Hi;DGmV4->9K$f z5tE_4`m7-B<7AxfIwm0aN{_7Va}DXQ5F%HGIl z>6gqg(*q8`eHt^zLN%-N{gYvBltLm+%oEQm%$lq@13vG+VfY4vVDl);7 zIqCdx?Xc~7T}(osdh%=B+gZq}e}X$+ss}0n?867ZUc(F-nLEUGSf67sJ;b*A4-zM6 zYAP6oU^zUZc<-+B4m-7Q@a7UV(@hSy{U2k@NI}7Nk@knu;fG{E$s~0V!(O*yr-R_s zmpW_z#N0XeV)!vsa@aYKhmUYSaEvWEheJK0;$QhUgs!}WE!r(dcAJZjf=E4i zSbmW{!}xN8c<_U5e_Ir!O=T5pN$AVyEp_PL+{hba+TK=G8xtGowZi#THBlGSG8-n=KsIcNtLgWzWwRk&>;mIPtu{QL1A1=*V|8DfnT%OlEQ zj7e+HL!O!m&dqdNWwW}NaCkzGh6o}1@Ff^jRklA=@&UA~ooM3UX_*fkB8RQ|qFwTy zYe41iz0m4CFiv&qYFW37{yAfUXj-OWQCK=L3BW*PM@-Ep&!g_E?;k!M9aMm8E6cl! zxCWyqPf34|o@6z)t?30AY?F7ejm=e7%SY280K*MM#!#G5!la}Nt6^hLU7_#>%O>Tw zjGeq6rbI(v2q1Lxp#9~Ie*H$7DN2ueHuu)-T$T0hSYuU{_xkW-)GAJoda%mhJtA;z zNK!dalNV#U-qcpPeXpdS0t^7Wz(^TRlyORZj|J|dfoFttCQOQ3!JNf>dOm9IY#=B0_6^!Vr=G|lwxkYQEVF<4#O&(7Fd+Ufx~B{W@KUO6TFl!kvM^L|3bt1S-AQ@)nvHc1efZ%!sM>5NdjOi z4;e@QB%Fj228TRar2qx`FWj!Xej0KZEg~g|%#E)J8oryx!Yaqp+VV?z01prjp#?*+ zWtwB5=}K0{nysL2!wb$Uj7&FJnU^7NQ>w6%tApE$$&W>Q>fDj5Tm&^sUoi;%ccP4* zhkln>YK*K7k-`>6EKm=JD?$l^lfe7ST1PEiYKLzZ5VL;+NzqYW@}Dw)%^gjpD>YvG z3g?|!?AmXKlt`Yksy`q5(oEtKEc^OKo%-EQDrp6d6F`w%G=4U&W+>jbx?=|D0EgLT&#H#b;QJI#rh+4h3K zATig8hva6szH`r2To>(3q=Ht57)~q<>HEcgeekgeSrN}(wA*TWaX;>f86mlm5=haD zG!B0%rvaU+z>QozQ3KJ;vmp2VD$&2}=S~4e)t(^nTIoueQS_;ZYwhRSLxIKZ&Rg)p1S>R& ze8trM;qV={>-Q{vzlf~g>HD>PWO0xK@UaoiKpQQ-jKoxY7)!#SDP;6&z+GNFB!zMn zi!#^KUw4SC(YwE~zCoiO$2Pe(MPjB!zEE|ul6d*BCjRHd|XWW4aHb~9u+GgRe9HQ!TeeUF}8 zrx81vv!o+uke_DDIZq`B7umxqerOrCD@Q!m*7YA1MJXAHV=)`-kX;SLT5e3}2T;ru zwD{G^+(9-{GiW{JApmJ>#FV$m?e2VUSu0oRsi7m4Tsa+!EVZh8i(MnN zDE|6c1WQ1RqK zE%?}ugWLvu>Su&0VEebUKJ6pWPGxX!UwZ)`U?RzspcPISSK<)bQM9zENDT0oHw&Od zHT(vCuVCWmpa}NDDYzn|a&TGMX_gXlI?&3%Q4tns&U8E?RLXpB^wgor^#)P`uL<*e z_cc$3^XC5f5=vG&0gZ{D;licdaCG27lK$Gt*-O%XD$K|yZ$|+Xk?l&jM=G?C52-S_ z{g5wk`4EgFYFlg8oFM5czW7rBJ@t7A;CJKB>iYp5#=SXLWekOphnWg;Rh5kg{!NIr zO`)#ma6;?rY7=JNKZF8Quc7Vmv}hjfg${)+Ta`2Yi9{#@D+EWZ@NETHb@v z0?HT?l%}<4qD^!g&dqXYhx@0sL8`cYPBw>BX4a<3X(ktsG!A%=;1*9D(Q zFV?+q&r95&lKz@jlxbf&n7%4o0+T@O#?;rno!y)MK;hJ#q2RP0f1*`1lYOw~;qSjW z7%NDOs!!}H(K2CE1QKPmzN7kc$@Ux_q#VBu~Fjygk-5MmWn*aZp3}K@KuTj>=I?+Q)OZZ-%iMUP$Q#{dD{Z(y0@*r9Mxmb zx#y;or?8Z;7g0TKv1}pQtm3+TT5>mDo{1Rc+ClCcSz%rS#8gl#l*EZ(a+4oK4Eszq zuOZYpAb&vqfTLTX%ol!5HsXK`@XKXK|8~;=B-8bpkaZXcN}y2cqL6CR(XaZMxqLU* z=ajK!@r_oZlI|oDNV(SzXCs`ZiFrKnWZd`6l1;^y`+xyhLR$=C3A0=m1e2r3Ql%ac z`MQ#T0fJoR#?x1?suw>Sqdb*>OvWIw3)ZXD*GYP@|77)M?uPwUvTssIWc-&}dX`Tx zx`;Ok;P_om1Ipj4f#8&-{FCW&2p`RnxV6r3lF{kiSpgh7=h-V)h){JVlBu#o?j^6P zm%bsROj^|UWID#1mq!h!6{*~yG2om3ebaP4@4?A;9mx2DmDFJ$8J;hJM4?+z;ZeN1_{7*aCZKCaK0vK8=r%qj;rHu5}b>P%?BMV z-0;D|AE1Cr!1;nYNF6`IQA{Vm%7IL#DMfa~y@XiE3>gPkk#Dml_M}g+6YS~-jX^dT z>y6brI*=PSl4h}?2wwl3m^9F05p5g_YBPC8q-@upf{UkaG4FZD7X%p42d zn=mWklR1uB;o=Nc#^=jGh>ZdZOKb(;0XF`eC0KQsd0(VdQ$LQERXs!U1P2w<4MT27 zxb|gtuwqS_?1=BFNm<|bZ4=pkvpQ~7HlW>IqO>(aT$vAqv8J~ZkITX6Kurvqp+*{_ z(B&J*d|1L|730%@xspGM+I|3#3$^|`)6Qw^>s|7Xzxy%;x$7P(-U}su3mh5jP{2_Z z&w_ulp_RgKh0iBG-258M{JWrltw2;QIq9cgMm7j>x|Su8No>Ya3)a#2A#=(}5pQ*2 zby=%Didw0bpI4-NQlF}_8YN2jp6OV*c~Yvr>*y0WDXnNy$*BAP9?oGwh!&y!^J`>h zVbP|ZDe1dSeNfF7tt)7gi+1+7f9I`{hJFeVh=e3k)ToZSq<5GDPBDWCwG#R{Fa|Jx z+qa{O-_Y#nI!jH2!8hcEm!1uZ{yXtewX^4uq+r|n_Mk=T3~h$9O%MX!WN)=5%&=~l zdbwQ6n^-Jwk-hpr8Rf}?)YcIZeyWx6RuQja=@u|XidvZ7V~VHz;Vv5@W@_x zOcx3!ZvYNo1HaU2Q#SVd9BSqD=W|MQ=W>QCiWU?EZaj0BV|>?>-g3jt;w5(EA()q| z_aU^?K!&FjO&QZ!ekT@k_wMR^K_qpMvu%6=$YeMRHaqHGXq)G>u`wWe!mAvphG-}^ zBWoP|9EJ*mf{6s|Vb!^IX9LE5EB{^z^zFLKuWw}}o z@__5KsL{zsPU!TpnrL9>4K?qnKmwNn%&>RkRnl)0%1Ws1xtglEBcA@^$WS>Tv&kbg z20IyD3k4(waKo;A?9}`2HpTa2i5;`I{Wrz#`>j4QVL5x16V>1VbJEcD=qo0LmpK^J z0rh#Od1O(6lbv_E?dAY~zel4k1Tcb~`s85*+m_yKOSZ|$>0o?g!r?w_H4t>s$sv!M zE@en$Yv-AV5523H2Bj88|^JXQrJgtlY?;Ge>zTVq! z(?e@3x&@`FmuG0j>ampp!N`B{ixDZUX!-i+d}E|eQPYY3st%Z}%C1~FJIUzsL&N3g z(;_&FbxO&dWTAy96s}0%N%q7?Ars50l`-|DS; z{lO0iV@)GgN3cUKz6(I2l}O4h=WB=-U=r03u*PFitz8w+I_&EATA;+G zMv%ck1cY9y4oHEsc{v=()yr=_vye;lc-R?QZp|D-q+^*5Qa&f=+M&5; z*sVJ%K>Kw$xb*rO|P*q_2!0W~4Eq5;UDE zpm{J^e5Ob{r~-fTC?d-h;{UgD^)?P8dGNNQ<6~hE?Y0iocxUwI);uZ74!$h~0^POg zEB514+3(zg;e@sZ8$p8h=i@K=)~61tkOVTQIF56H%;h8R^zWMj(TJM&ah!Q241pj8 z+iyGW!$eRkMNm2&;fW+CRXW-1-%Q0QBunmHQ)?y{l?g06qJ0$GGH+1%ctD$7v8*T< zYc9(G^Z5i?i`MFlmJg{!s0#(#Ut_<1nfo}>nOVt~o>~z3rk&hZ=IA@`sjHsL|LsmC z2))^FEu31{a)z}We{|^RXac}mo*k6O+9NHXFPcICaPf#@kob} zn$H;A+Jx;kK?yLG$F7@ZrRiFxCa?34l>>4^^!WJqIFc2*SYKp1p5NYCCsc`Z{;1CQ zEKUDs$BvUnD`hTU1Sv5sxAGxBvL9&5b{u8sGH`%4l#gSK_TgI!>1t-gs)RqkOA)Q)I2+?do{8>fmU^4j+5$1PurTD zhW_sB?6*sk^T^gORJ=wfI7@`Ov)PuBq8t<8K(S;fh5;%GPQVAbJlwz&BsI)ea zN-F%F&18(R`n}ND>`{_!DMU#1H_paeM3+GxA!n|&BimO(?1G2}++_)H$MA`Kwl z+=|>S6tsJrHa~-+dKfqXA%~fmQS`6Qvq@TkpA`~qBW;|8B;tQLfWo*wjSgQX$4^Jv1X12c8YdWpZUYT$D6?hVM!AW(kQ*(Qd z&IGXZ#tA6Ls5~0@elT!k15M2+DglBz4a2=M`D3UCTVkQ5qzU?R6*&Js>~6IUZ*DJk z@bfMB(w>h!k$G6w{zErW>NzW)g(sJ)`gO>Xpq<`mXk&jzGIAbmJA46DTT5AEg?!W? zHlU_dP+P#?(>-+rwK6iTTkU~%+T%jh;zv+(6?o#Cx`PzRXJ9UQyuANNaVLq9I-L4A1o z={zV#8Ft?dR@R0&jIeStJmN(qQQVwtyD1|T&&E}ii7I_PMC{u9?--75Rm?)O22TjU z>p`4Dc>zpp>-b*nsSjdlbKy$iu^q)l9!-D>nvJ5cqI(tM@f5~jGzn*(;4GT#3SOXz zJ@4dv{2uZu#bzLPnKZB};nek6(r|ECxc_~A=-BfDPJn~Df;jDGCCQX9WteFA9$$YPKi@^U5C~zkm8yR{Ys>mfF_XQ>dh+qH8zDu0@{QLrvg> zUTQlTcY~jz|Ibeyu!t;Nj1-Mq&buf0_UyP+J0REwc_siUVC^2zM2a4S1=U{sG;FUj zIZlaoU%Wn`5PKaQ(3;rb9RL@;SW{6G-K95{?5KGEgKu%yOzjSpQ!d>t*UNXgh(-ne zg%8w$nrOjK+G)q7s%xAv7@IZ;P)zPU6O=Rfo0v@@BI`|KU}RaanP$d0wDABddXNh! zcYAiGp&|+;bpqxKCEsOlafnwx({E;R^s8P}S2mVE;w}F2s;Ab>J}I1d5L6uoDpZaJ zC>~AnFaD{8HuA@^inYTIlFUo^$?PSk8X%!eY!4_n&tuoWxo2;+t@)q2beS{8SQUl( zO1@MQ9acUfp>hWGGwY@=ExkYHdhY$uE2NU#q>|T9mD3Z|-9JQ!Q6Ad%_;~cUcaxRY zAhJyV!X>b~%=pWnrC0Yw3@9&>dv_TN&ssxOpXLm^4T)1#vZpR&A|N82HqZnS6&4l7T6H>opc{#t zbMYCH_Yv7A%LN%IINuHZ_q8d7?3W(HG^T3T;6|sj0&mCK$e~4HVRxfr8=aKhR_Mo< z2C5>M2yk5owK*#YD~DRqs1PG$zPBZl&7ZF<@}^i!19iu)jozA)Na`H72xi~?cr3xA z@FKr5V!WO1+J91m#~49w2*X?|tcND0lt&_{+~pF6Qx6>x0R&B+9My0ExIAT}Z>6q`CsFfj^4*!qXRM=ga)M&iI2i<{N`fG; zP%H;|9*kfe4=1)Qgs?2D9pxf|Wx&I;gJ9Pn|M||KWcHn!SSYJuq!O}u7>Uj%25sQ1 z*xjQP8Y$1qfkH8R-C@jyDCEipBh6pyhM4s{7OVBJ^XLQH#oOPEx`)rM;Ht^tqAd91 zAqT*JmT4Qv+qb?>-3E$O{gc}ke)31vKrZ-}g7+tQl1cXr1PukArOl8|XCoa&)njLo z1H^&yyuGW0g&L5Uxegb_)o$j=kG}!| z`1|=33IPsL{Ik|F@cf#ll(>)^8VQx{9ndw_pJOVYYk`(zXt;KZl?c4rJ!CjT1**rL z>YGu6!h-w|Bge{C5n#T2UI+B{Si7Z^v7CaEfrD)22MEMHnadV=!8Wg8>kPP>6O49V zW6b%;miL`84G#*MrO?nX{uyWM>Mf{|0Ayv4Ceg)kl=~V^NU@ZM&3GA>lT4?Dp{~qqlG4>bRSF#<=s?Z6J%73_h1Of_RG8ibHa6kXYw z%J@zh8-B|_^L&bw^p!^OJ+zwy9Hdg(t18Tx<=$ze!v{%~$w7&E++iL81)y%BMJWfw zb;zUHwatF+3&VADd-nGSa}4-m?LZ8-t@sB{O`|-B4}V!pA0BLB0I6U_6-h{;Vacvn#PkLg)jOP zjpWg#POQIPoU`rR3ph`EE(aTWi%C%+62Gv;wsPH{v+#`*vQlHi4TJ8rkz23Rus46X+q?EWU0FEmr?8T<{6Y|ABJc5QkVp=scFsRL2&r_P+vb$e)rf z*SVlR6BgE{Y~Z~Nk>{N)qM7WfJ!^E`cz8<6IcE;YlXHbox#m$UraCuAw%P;E)A5zs zzutXZqj~|8Mw%-@Pc$l&Gpj7|Z{~cXRY;#C1g;;|WLb~tvc?iP>gxC9!|>3FkgX`4 z4Pu^!zolPfS*e$-KcW+zFi@tTf9@D^Trf5QI=5yHqmfh9d>joKD9=|qr~-^=3>rQk zY0#c9tMbcDqt&pDtpD4WySD2?_kLA$bv*bg@kv)l6=~FVhX)OniWcJQ3{O>NMX0iE zgvVyDE`Un`1&JdV@G$Pz2M zmWehMK~f(R+8=F03VIp@&(R%gvH0=p z-PW;&TR)+3;J?sV%6jmvqzzQJgTC3Y@J7Gm5nzKf8bnJj)rUqRnFch&(qM^y+kbn-h|LuqEyq)r8i$QHg9_JI{dXQ?{D6|N2FH_g7rkZD@ZB zd-S#5wn_}Zu%pONUl1Xn0}nuNp|Qplhh;IW#hXI(u1d5_N;o-iqIdF zu%n3wh8-UITMJ%(*>^^jL3kRyleze}{LfMU^~Kb-3=Lhs^UxOr-5sC5pc<-nf9X_V zdi7j(GcspD^B_{fc!Cn;aX)ETEM2)Ju&W#@h5aXrZ1foeQd2cT*YxFi8*ZNuk^zjz z=`i+Xnpx+FH%ZQE2OO{;z3zm#9YXL%m4a8?tDscOiBSkm^b9 zB_=!DCSse`tErcqK7t}y{v_&WG5!Z5#!cQ5S{;7Sj0XWF2^$!LDcayI*&bG7*1a&yXobWs}g zKWMv;J_He==vq-He`Qvvzll!S7w5ajh|D4bX|9|H|Sq{*iWNUI+8|p4tuD`OS7MyhiliVi(l~iheD|g*$l*-z30fE%}P#*#(sUY4U3@4(l z{p_yhaayOM90o4_X>oc`@#nQB4K zQMXYB-(gu?M7w-EpmOQt<6>e2mYk{=q9XmzF!X@&h)lfEL&nCf0}%yn|HmoJq-dpH z6^ZHeFDi=1Ek5XU?^0P&EfmIrHZRM$pcC6PPRZ{4SPVM+8{s=HqCM6Y{ZmrBagH8^ zz|l~@rdsNK4Sq@N^sSj^3y7j_gZ8m^qYeM?m%vKBiV$PZWXht`wy5oI&&d7%!3s%H zk?q-nwe|j%_45ILKsleYZP&=+-daiy(2(=Y11_(n^c*yCEbYjQ8k%&F+V8z2al z^I8H@0Fp1&ahi7!jV{;WuMwoMAa92lTep45kFrw!Pl9yG3aao9qU^92U>zEpx4g(# z3#zmWJ%3wy`cpo?E^tAT98*4xgw@NiHz?)3p%+r1Q_5VQ)PN1HX#XQSVx0r6Z%qe5 zKcv^NcA6T!>tY5V_k0&ph4=pSwS!u)s61>-Uga<4i0c2^^9Q8lDO|hAePc)nPZ0)r zuH}(yPZqoTMkG1oU_2}j?%3ka!NRapT-4fr^Xit}^58ej?>A@LF20Sr-}gv}Nv>~! zDv~dBG1FGIMO(V>^=T%Fv}=(P+8BTSZhzU|rc((nwNW_6p5;roSf0kr*XegPKVrB! zJR3K^S6A0>-!;AO8XOh+ruwnV@MbdQL7l?z+DQU4z5l2xOjp=+oI>)7b|ewZ_t%ZM z()oy*lyLY<_{PYnN*;FoYdgL-zoQfPg!gtE1^tH~=ajHZwV@L#9T$o+UrCp%=W0;) zz9VGGehtLrHZPJh^uFIZGaB^h@>!LY?QyF5^5|#s1d09ol&n;QE1N$|(DgIq17Zd1 z4MZi$YTcyM#p6VyG~&~7li7=W8C_Prn^jo|6lBE(utq{jw~D3mzlcdze4b0)shJz? zY#tK$AZ>;5^LzTVF$Y}cLgz=rGv`JH79w*ZYBpI(agI8xE-tP8R+QpdK7>8~NDtfx z{}*+#ifAs|A2e-B@6rfgWQyx{)QioKUvNhRgp$JzIaYbVL9pdoT_Y1q-%@? zT|au3y7q=7TU(rnw9Tbg;u~TD z{duW(bI!whYkxYo&uZ}3+3S^gr*?(rPtjzTNh!3kBGmSaN#woTa z7o%1e!RJ9lAE?Z=ZEu-0YM_H&>5n2W6V$gA{8Q5#QCs; zj{TOuHu7qf4$_5dM2_m)L-tF~qKpC~dR>>Bn(&L-IQp*2=Y4G)T$4$jLWx^X<%u0T zzse<$-bNa)QNILvyXvnRydI{S{n^c|WK7hwyv*#;!zw%MmT0Uc{|c>%bI&NY<;JX} zjZ-fVtJR6vvr*Bk_7-G(A23C~*o+C=@Bh>ix0(JetH)R|o|`TF3cJ}sgx0>WR51 zY;$b81SMYHr&J&1@kLwxO6Gmmd-Vc_v+tE8y1wGIzk!FARL4bc5l#5seM*j) zE=~dbefVA_KV7GooU;CX>#T)k537EYuL|w)9T`c-xRJX~}PbAc{U&b#Fzq37}`)T)aLK}CD zeA9jXD3#Q-hG1;{+2AdWAH|V-R#ZZao@^KRp0mGrtfOIWyC1GJ?BFLjgWA&Fqfu2R zp-Jp{bwwN{43{8CV$L6$bY+~GdMl?;&XbiBP04A_wy^H z-BjX?Sop2?^5tu)`Qb)8xnqWFf$#aKgqJRm1`ADjOnd)O)xvRw2tI$Ct5sss8OQbf z4^tHR`tPAP%@eriJUd(FOdch#sh-#;5jrR$&iI|C&~1Oe7S#6JU@kNz#q+F^NVf4b zT?8GUPdsJPsP|yvbk$zOP({~}gOhdl-q9EAuW}AeBkHg`Qsxqz{n#e-LVfkShF)(S zp$j$=)6Ln%Y3E>IqVMSEw<7c{rUYYe@8aDhDAz4i)vi&%olG@Xq@tQ~w|%O9*W_im zZ2SAIyxht)V>bbVJ_2d+6i>+CHCbZYYEOfGsZ*1<@+`vM0@s22UYp10K7M)N0ldae zM%s*gG|y~OiiSamimvWxv%_7#46@9c9=o>S9WVHHD{t|9ouzLw>MaDbSJesUp7n)z zB-Rewb{N3@DY^t*#YblwY_m1-f$Ap6q0A;Tb<1kwsSe+$zC>d7zpzL1JK&i>Wl2AerT`SHwv90sI!e*$)a_#naI^kx5^J5d0 z?ok?JDr)LY!`Jty|4v&+8rbD=M)whUa-FGMaow@cTh2D`bi4K2t}F4=`3}93pLyZ( zZTkD?$jF8`ksDzu8{Nk_dDsr|oL=8rn@BLrn&Qk%cM+u^5!aCc{PLhgYfizqLNnJW zCM{y=;2kf|DfRU#ZgKqYVzcpSJ3k$@hgVn|K`DpWI>* zYuVi=8xZ4;3|BliviXbA&&#!1Af(E}Ge{f-_g;KY?BVT*TY*V+@`nKq(B9Yjz5fKl= zZoS*5(H?`tJ)zxePLGWD_o+jtsw-HEe54c%UZ2uezxil)S~tjsgF2GD!PH^uEv9{Bqkb$=G!l46oQ>8cIBh*Rw0S(xCxxc-!W2kT+`Y3U$qgH>1d zw1z7kLu++k1=eog9o4_)aMW?_J8tH`=77u($f>sFCC<~% z9E%c~jEKB(r7Wb>Ff=T_Kw~uIHFfRZ^Q6HR3hck0Nm&;Wnwoxyx|k1$wM?Q<1h$3S zs8ZXsg{!hMvqeUM&9@q-VYC&UDlZL2U6NMRasqjfx!~lahuPj)zXSUTURi(6`aRc3 zy;q+f(ssWI95bR_eHZuy64}-Upe4;+&b5V+|Wj8V(_r<$8MM!vklQtCw%=guK?XJ9yR^(@sRZMXqum<)}g} zm$3R33F@A6?Qz1At(^jyGXreGI|0kzIoLQ058NZ=k~-cudTle?PS3|cLTN)9{4DRu zRxBJc8u3pQx1Zd{_vSJ8=G{M!+Ak!e@kG=Vmz?DhRaG7_sTs*i9DmkhJyKIXFhl*HgYKAY zeyip*J)f@I8B1vsbTRwMuX%C<=PTh4pHFp7pTpYs?V#&dY$n;K5-y!bjJ_H=qJU7*b&Le1 z%vG>eG$KM>IrVHgP>?~bTdu2H=CtShHblNZo70sxgCzy^vvolfN2zb8L_X*5k6WcC zJ3izV{1yMplg%8XEKz-^ySE5EaE!|c@W09d(Uv;+0_(y49vE4e;D%hJ!EY6ljQG5v z%o}0jr^!)<8EXRODPvnc=pTQ0TdxcA*)xYKcefv*-fq7lPl8$+UE_d{4#O?iO((~c z7X_i1rHikL6QLHU{@4y?ZP%6y>s>daqRv7>{w3$@ z=ZNo?(p2JA`|Z`+DQM@~7AY7!;;It_IM`neA{M7gP49o37FlPjXjs6Ag%`CMLev~o zstcVu*mZ)3@q%iA%qkm_LHfs9U}ya@(0fyZs-jBlC{Oy&nOHTymr5KX2lr@;*qvb1 znaJr$u^ALAndh_ienSDtY6siNGNFN7n?~s>o55j>@v6 z@W&!u*Av9q5+7WsuVLugQ|xTRk`N{R_Q&<>NHHySPS0$Kg{f)JRV{AvJ!3x@3DPU6 zozgHU`N&T``j}7Rs3)1Zt}+#H$uPX9(4-iB!9;JrQ?**?RmjXS>ti?lH!9*yYs?$; zYqe+Hk9^!;c@#0%tpi~U`mzc;F8nDp5?NO6&f#g(sAqUd5NlT1UCqGSe@ZWgCRJqx zZ=Txky^K>WC!L!j2kGy8(u;{ztDi7@xwowKRF)VPUoN3LAK~LYT_(kLJ{GH~pcfY} zpS&O1sgbokEHH`7xpD3hot5fSlcTjMKOQNme}u@AGn8oS@uP^iAE$MW~pjvKKp)5;!Ua+lBjJ30HlrWp9k=e{93 zU2FM67D#GSzy-UY$j>=HuXX9Bl^Eh-Twe^&h|3?EfhVz{JD-}#B2Q$kKMQZ*1BoJi zkqF0Uo`GR!S)2KdI}&oh5PNr-gEe-G*dRhFz+!YDXQhHDDDbTRh|G8b~! zOb%9>AjHBB;3p4GRylpgzDL#6bs`ihu#dq;m`W};Xf!h`*+ow z*_|3Ycrz5(s89_Bv_7AsKWeN>FLQh!yN=%`&0tEOup359r)}~W$=wb2{5u=V{x6nh z=5831)sFq<&iPcII0HC<*3wCDrWUlcCk+^;#D5E7#I>VuVw%7gZg(DqwTx$@HQ(JMBpPi=@$1qL1tmPsj}c+ex|!GW3)cio)|$_zu> zI)#-g|1iVWluqNSi^hV7cxZi|H$&;tc9LPN&0OH~L+{^l3;EJtWDKlElP+Jl#X?lG zbFI3&)sw#(SqJh!BoFMYmH=Bic0UZ+eccaZ4-4AsO_}k(6mth`vDVT`d6pyE)DG)N z5uA+j?7!ginWkK$btaUYVfekUJF|dUMVq3KTwgiv%u&xd4_T!zk&c@jw0>UIUA6ad zp(PfzoaG{ppRIZQ0}wm8!)3dxaY>l{q$~TWm9!uss-3@KUDAg>n%rMaI~y;Tk8%He z_4BXGRx_W_`=j*UJh!8-mrW1Ju|nl8kLf)8H}q#F`{NuXSNHZ> z9(*}I5#9gQOdY-!ga4{CGeOosPjF{pI4CD5Y}#+#z9ttlo#3!I<@-DS4{Q#b+ouvn zaxw)Ol%;6D`UaEUA#+B>#HN)zF{#11^@siQ_Q7<$g!roO9(t9~1L%>$<-u@s&Vzwz zS^Yumyf#BRrod&U1uUv%S}kpS5=|>2{<2XgwAqr!7Z_)}Jq`Q(k4byDav`^0k37LD zZoWCx#lb7rJ79QcL0dQX`|8qfvK^&n+m$543jkmcCAik);jxN{|3Z;Rgm<6^CZ$Y{ zQZNM?9E*SP3PGl3BEpY9lK$2R=oanm2gq_1_jIY)ubdWaz4{5|*$x$4_E@>T8h}}} z-Rv(3QcJ1bXmi`BZ(6p;j(9$oC|FKup^mQdxEz(f?#VW^_w9FC5EXglvseyx@q5R8 zT0qIDKt=U0Zrvp+xt8ucoa!&+Ec-!{f$l=}Pt~yjw!`Clk%grA^*e(OOcT9G>Hhb| z$eJms$!4X9OTLDv28I6bR+`?nXf<^y29z%I3n?8* z%j(L@U&Gw?^!n}D!qN)c0bYpawzV5+klL!gGDn8uF>1YuEJXsc^{tBitupDy$7#et z?LE=>hn&HQ z$oz}bU439Dntj;P(|C}CxItuktDZjROFd)6$;Q90Z*Z9$6`uXwv9(y119@o0v)EZh zuUF>`y_p*V{!7h!Y*NM4wW`4neSCG@eW&mjoZMRe2mhI#F+MF@FQ6w!+@tfgQH3Q1!8CC>7ZcyAZjWtx zcUKzel$fV8x`|KH=quj4hU!0lX+#z>fc7^MO$V4yxhp=vK~lya3hh1?A#jB&LgZ zSgP$c08sQIYOo{bip`m6GBuG%CB6A!;kjko{yy2(Qn)(T1kTa`uoHIziD1l0GAi-~ z5}CiKQAz9;*~$M>uPvyAkR>nyr2TsKY0-mAk%52jCWk9t4vZJkPw^Q3= z=8vpCPN5PKjPMV(XHaHJQYx>EQaY|@c%=W}H&vAy3_Xl(=1iW zEr*Q@Od7g#Rpy-@x8ENj_jX{EhYyg!@;IFz^+MLBArXX=vq)O&GP;5!A1Tyhq5g7KQ?h zc@F%pqbd{usNz_~-=+0)ycfjzw*@8myuWg5r^JH((9;K%U7P&+c05U(D1ki-2u^^X zk#A7;{#F8)!xdB5^yRSyW;4)rndMv@m*N=O7jC_NEbYD3kEaL_3L)*|{`Y$HKym

    |?yY}4k8EdF9I68&+`*!>R* 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 JcKTA}e*vd%uXF$a literal 0 HcmV?d00001 diff --git a/public/overlays/overlays.json b/public/overlays/overlays.json new file mode 100644 index 0000000..04384b7 --- /dev/null +++ b/public/overlays/overlays.json @@ -0,0 +1,17 @@ +[ + { + "id": "crr-logo-white-bc", + "name": "Logo CRR com fundo branco", + "file": "crr-logo-white-backgroud.png" + }, + { + "id": "crr-logo-sem-interior", + "name": "Logo CRR Sem Interior", + "file": "crr-logo-sem-interior.png" + }, + { + "id": "crr-logo-extenso", + "name": "Logo CRR Nome Completo", + "file": "crr-logo-extenso.png" + } +] \ No newline at end of file diff --git a/scripts/quality-check.mjs b/scripts/quality-check.mjs new file mode 100644 index 0000000..f44fb79 --- /dev/null +++ b/scripts/quality-check.mjs @@ -0,0 +1,58 @@ +import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs' +import { extname, join, relative } from 'node:path' +import { fileURLToPath } from 'node:url' + +const root = fileURLToPath(new URL('../', import.meta.url)) +const textExtensions = new Set(['.css', '.html', '.js', '.json', '.md', '.mjs', '.ts', '.vue', '.yml', '.yaml']) +const textFileNames = new Set(['Dockerfile', 'nginx.conf', '.dockerignore', '.gitignore']) +const ignoredDirectories = new Set(['.git', 'dist', 'node_modules']) +const problems = [] + +function walk(directory) { + for (const name of readdirSync(directory)) { + if (ignoredDirectories.has(name)) continue + const path = join(directory, name) + const stats = statSync(path) + if (stats.isDirectory()) { + walk(path) + continue + } + if (!textExtensions.has(extname(name)) && !textFileNames.has(name) && !name.startsWith('.env')) continue + + const text = readFileSync(path, 'utf8') + const file = relative(root, path) + if (/\r/.test(text)) problems.push(`${file}: use LF line endings`) + text.split('\n').forEach((line, index) => { + if (/[ \t]+$/.test(line)) problems.push(`${file}:${index + 1}: trailing whitespace`) + }) + } +} + +walk(root) + +const config = JSON.parse(readFileSync(join(root, 'public/overlays/overlays.json'), 'utf8')) +if (!Array.isArray(config)) problems.push('public/overlays/overlays.json: expected an array') +const ids = new Set() +const files = new Set() +for (const [index, item] of (Array.isArray(config) ? config : []).entries()) { + const id = typeof item?.id === 'string' ? item.id.trim() : '' + const name = typeof item?.name === 'string' ? item.name.trim() : '' + const file = typeof item?.file === 'string' ? item.file.trim() : '' + if (!id || !name || !/^[A-Za-z0-9][A-Za-z0-9._ -]*\.(?:png|jpe?g|webp)$/i.test(file) || file.includes('..')) { + problems.push(`public/overlays/overlays.json: invalid entry ${index + 1}`) + } + if (ids.has(id)) problems.push(`public/overlays/overlays.json: duplicate id ${id}`) + if (files.has(file)) problems.push(`public/overlays/overlays.json: duplicate file ${file}`) + if (file && !existsSync(join(root, 'public/overlays', file))) { + problems.push(`public/overlays/overlays.json: missing file ${file}`) + } + ids.add(id) + files.add(file) +} + +if (problems.length) { + console.error(problems.join('\n')) + process.exit(1) +} + +console.log('Quality checks passed.') diff --git a/scripts/security-check.mjs b/scripts/security-check.mjs new file mode 100644 index 0000000..dfcd124 --- /dev/null +++ b/scripts/security-check.mjs @@ -0,0 +1,76 @@ +import { execFileSync } from 'node:child_process' +import { existsSync, readFileSync } from 'node:fs' +import { join } from 'node:path' +import { fileURLToPath } from 'node:url' + +const root = fileURLToPath(new URL('../', import.meta.url)) +const problems = [] +const envExample = readFileSync(join(root, '.env.example'), 'utf8') + +for (const line of envExample.split('\n')) { + const match = /^([A-Z0-9_]+)=(.*)$/.exec(line.trim()) + if (!match) continue + const [, key, value] = match + const isSecretKey = /(SECRET|TOKEN|PASSWORD|PRIVATE_KEY|API_KEY)/.test(key) + const isPlaceholder = !value || /^(?:change[-_]?me|example|placeholder|your[-_].*|<.*>)$/i.test(value) + if (isSecretKey && !isPlaceholder) { + problems.push(`.env.example must not contain a real-looking value for ${key}`) + } + if (key.startsWith('VITE_') && /(SECRET|TOKEN|PASSWORD|KEY)/.test(key)) { + problems.push(`${key} would be public because VITE_* values are bundled into browser code`) + } + if (/-----BEGIN .*PRIVATE KEY-----/.test(value)) { + problems.push(`.env.example contains private-key material in ${key}`) + } +} + +const dockerfile = readFileSync(join(root, 'Dockerfile'), 'utf8') +if (/COPY\s+[^\n]*\.env(?:\s|$)/i.test(dockerfile)) { + problems.push('Dockerfile must not copy .env files explicitly') +} + +const packageJson = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8')) +const fabricVersion = packageJson.dependencies?.fabric ?? '' +const fabricMatch = /^[~^]?(\d+)\.(\d+)\.(\d+)/.exec(fabricVersion) +const fabricMajor = Number(fabricMatch?.[1] ?? 0) +const fabricMinor = Number(fabricMatch?.[2] ?? 0) +if (!fabricMatch || fabricMajor < 7 || (fabricMajor === 7 && fabricMinor < 4)) { + problems.push(`Fabric must be at least 7.4.0; found ${fabricVersion || 'missing'}`) +} + +if (existsSync(join(root, '.git'))) { + try { + const trackedEnvFiles = execFileSync('git', ['ls-files', '.env', '.env.*'], { + cwd: root, + encoding: 'utf8', + }).trim().split('\n').filter(Boolean).filter((file) => file !== '.env.example') + if (trackedEnvFiles.length) problems.push(`Tracked environment files: ${trackedEnvFiles.join(', ')}`) + + const credentialPattern = '-----BEGIN (RSA |EC |OPENSSH )?PRIVATE KEY-----|ghp_[A-Za-z0-9]{20,}|github_pat_[A-Za-z0-9_]{20,}|AIza[0-9A-Za-z_-]{20,}' + const grep = execFileSync( + 'git', + ['grep', '-lEI', '--', credentialPattern], + { cwd: root, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }, + ).trim() + if (grep) problems.push(`Potential credential material found in tracked files: ${grep.split('\n').join(', ')}`) + + const history = execFileSync( + 'git', + ['log', '--all', '-p', '--no-ext-diff', '--no-textconv', '--no-color', '--format='], + { cwd: root, encoding: 'utf8', maxBuffer: 20 * 1024 * 1024 }, + ) + if (new RegExp(credentialPattern, 'i').test(history)) { + problems.push('Potential credential material exists in Git history') + } + } catch (error) { + // git grep returns exit code 1 when there are no matches, which is expected. + if (error?.status !== 1) problems.push('Unable to complete Git secret scan') + } +} + +if (problems.length) { + console.error(problems.join('\n')) + process.exit(1) +} + +console.log('Security checks passed.') diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..24fb2de --- /dev/null +++ b/src/App.vue @@ -0,0 +1,135 @@ + + + diff --git a/src/components/BackgroundUpload.vue b/src/components/BackgroundUpload.vue new file mode 100644 index 0000000..21ddecc --- /dev/null +++ b/src/components/BackgroundUpload.vue @@ -0,0 +1,59 @@ + + + diff --git a/src/components/ExportControls.vue b/src/components/ExportControls.vue new file mode 100644 index 0000000..fd1cddd --- /dev/null +++ b/src/components/ExportControls.vue @@ -0,0 +1,28 @@ + + + diff --git a/src/components/ImageEditor.vue b/src/components/ImageEditor.vue new file mode 100644 index 0000000..8199b40 --- /dev/null +++ b/src/components/ImageEditor.vue @@ -0,0 +1,73 @@ + + + diff --git a/src/components/OverlayControls.vue b/src/components/OverlayControls.vue new file mode 100644 index 0000000..c89f0a9 --- /dev/null +++ b/src/components/OverlayControls.vue @@ -0,0 +1,82 @@ + + + diff --git a/src/components/OverlayPicker.vue b/src/components/OverlayPicker.vue new file mode 100644 index 0000000..faf76c4 --- /dev/null +++ b/src/components/OverlayPicker.vue @@ -0,0 +1,82 @@ + + + diff --git a/src/composables/useFabricEditor.ts b/src/composables/useFabricEditor.ts new file mode 100644 index 0000000..4729acf --- /dev/null +++ b/src/composables/useFabricEditor.ts @@ -0,0 +1,472 @@ +import { Canvas, FabricImage, type FabricObject } from 'fabric' +import { nextTick, onBeforeUnmount, ref, shallowRef } from 'vue' +import { useLocale } from '@/composables/useLocale' +import { + clampOverlayTransform, + DEFAULT_OVERLAY_WIDTH_RATIO, + MIN_OVERLAY_WIDTH, + positionInCorner, +} from '@/utils/editorMath' +import { isSupportedImageFile } from '@/utils/imageFiles' +import type { + EditorHandle, + ExportFormat, + ImageDimensions, + OverlayCorner, + OverlaySummary, + SelectedOverlay, +} from '@/types/editor' + +const IDENTITY_VIEWPORT: [number, number, number, number, number, number] = [1, 0, 0, 1, 0, 0] + +type OverlayFabricObject = FabricImage & { + overlayId: string + overlayName: string +} + +interface UseFabricEditorOptions { + canvasElement: () => HTMLCanvasElement | null + onBackgroundChange: (dimensions: ImageDimensions | null) => void + onSelectionChange: (overlay: SelectedOverlay | null) => void + onOverlaysChange: (overlays: OverlaySummary[]) => void + onError: (message: string) => void +} + +function rounded(value: number): number { + return Math.round(Number.isFinite(value) ? value : 0) +} + +function isOverlay(object: FabricObject | null | undefined): object is OverlayFabricObject { + return Boolean(object && 'overlayId' in object && 'overlayName' in object) +} + +export function useFabricEditor(options: UseFabricEditorOptions): EditorHandle { + const { t } = useLocale() + const canvas = shallowRef(null) + const backgroundDimensions = ref(null) + let selectedOverlay: OverlayFabricObject | null = null + let backgroundGeneration = 0 + let exportInProgress = false + + function reportError(message: string): void { + options.onError(message) + } + + function getCanvas(): Canvas | null { + if (!canvas.value) { + reportError(t('editorLoading')) + } + + return canvas.value + } + + function selectedDetails(object: OverlayFabricObject): SelectedOverlay { + return { + id: object.overlayId, + name: object.overlayName, + x: rounded(object.left ?? 0), + y: rounded(object.top ?? 0), + width: rounded(object.getScaledWidth()), + height: rounded(object.getScaledHeight()), + } + } + + function publishSelection(object: FabricObject | undefined | null): void { + if (!isOverlay(object)) { + selectedOverlay = null + options.onSelectionChange(null) + return + } + + selectedOverlay = object + options.onSelectionChange(selectedDetails(object)) + } + + function publishOverlays(): void { + const overlays = canvas.value + ?.getObjects() + .filter(isOverlay) + .map((object) => ({ id: object.overlayId, name: object.overlayName })) ?? [] + options.onOverlaysChange(overlays) + } + + function clampOverlay(object: OverlayFabricObject): void { + const dimensions = backgroundDimensions.value + if (!dimensions || !object.width || !object.height) return + + const transform = clampOverlayTransform( + object.width, + object.height, + object.left ?? 0, + object.top ?? 0, + Math.max(object.scaleX ?? 1, object.scaleY ?? 1), + dimensions, + ) + + object.set({ + left: transform.x, + top: transform.y, + scaleX: transform.scale, + scaleY: transform.scale, + }) + object.setCoords() + } + + function updateAfterTransform(target: FabricObject): void { + if (!isOverlay(target)) return + + clampOverlay(target) + publishSelection(target) + canvas.value?.requestRenderAll() + } + + function initializeCanvas(): void { + const element = options.canvasElement() + if (!element || canvas.value) return + + const fabricCanvas = new Canvas(element, { + width: 1, + height: 1, + enableRetinaScaling: false, + preserveObjectStacking: true, + selection: false, + uniformScaling: true, + // Do not let a modifier key switch corner scaling to non-uniform mode. + uniScaleKey: null, + }) + + fabricCanvas.on('selection:created', ({ selected }) => publishSelection(selected[0])) + fabricCanvas.on('selection:updated', ({ selected }) => publishSelection(selected[0])) + fabricCanvas.on('selection:cleared', () => publishSelection(null)) + fabricCanvas.on('object:moving', ({ target }) => { + if (target) updateAfterTransform(target) + }) + fabricCanvas.on('object:scaling', ({ target }) => { + if (target) updateAfterTransform(target) + }) + fabricCanvas.on('object:modified', ({ target }) => { + if (target) updateAfterTransform(target) + }) + + canvas.value = fabricCanvas + } + + function resizeDisplay(width: number, height: number): void { + const fabricCanvas = canvas.value + const dimensions = backgroundDimensions.value + if (!fabricCanvas || !dimensions || width <= 0 || height <= 0) return + + const scale = Math.min(width / dimensions.width, height / dimensions.height, 1) + const renderedWidth = Math.max(1, Math.round(dimensions.width * scale)) + const renderedHeight = Math.max(1, Math.round(dimensions.height * scale)) + + // Keep Fabric object coordinates in original-image pixels while using a much + // smaller interactive backing store. This avoids allocating multiple full- + // resolution canvas surfaces during normal editing on phones and tablets. + fabricCanvas.setDimensions({ width: renderedWidth, height: renderedHeight }) + fabricCanvas.setViewportTransform([scale, 0, 0, scale, 0, 0]) + fabricCanvas.calcOffset() + fabricCanvas.requestRenderAll() + } + + async function loadImage(source: string, failureMessage: string): Promise { + try { + return await FabricImage.fromURL(source) + } catch { + throw new Error(failureMessage) + } + } + + async function loadBackground(file: File): Promise { + if (!isSupportedImageFile(file)) { + reportError(t('unsupportedBackground')) + return + } + + const fabricCanvas = getCanvas() + if (!fabricCanvas) return + + const generation = ++backgroundGeneration + const source = URL.createObjectURL(file) + try { + const image = await loadImage(source, t('decodeImage')) + if (generation !== backgroundGeneration) return + + const width = image.width ?? 0 + const height = image.height ?? 0 + if (!width || !height) { + throw new Error(t('invalidBackgroundDimensions')) + } + + fabricCanvas.discardActiveObject() + fabricCanvas.clear() + fabricCanvas.setViewportTransform(IDENTITY_VIEWPORT) + fabricCanvas.backgroundImage = image + image.set({ + left: 0, + top: 0, + originX: 'left', + originY: 'top', + scaleX: 1, + scaleY: 1, + selectable: false, + evented: false, + }) + image.setCoords() + + backgroundDimensions.value = { width, height } + selectedOverlay = null + options.onBackgroundChange(backgroundDimensions.value) + options.onSelectionChange(null) + publishOverlays() + } catch (error) { + if (generation === backgroundGeneration) { + reportError(error instanceof Error ? error.message : t('backgroundLoadFailed')) + } + } finally { + URL.revokeObjectURL(source) + } + } + + async function addOverlay(source: string, name: string): Promise { + const fabricCanvas = getCanvas() + const dimensions = backgroundDimensions.value + if (!fabricCanvas || !dimensions) { + reportError(t('uploadBackgroundFirst')) + return + } + + const generation = backgroundGeneration + try { + const failureMessage = source.startsWith('blob:') + ? t('overlayLoadFailed') + : t('predefinedOverlayFailed') + const overlay = (await loadImage(source, failureMessage)) as OverlayFabricObject + + // A background change invalidates overlays that were still decoding. + if (generation !== backgroundGeneration || !backgroundDimensions.value) return + if (!overlay.width || !overlay.height) { + throw new Error(t('invalidOverlayDimensions')) + } + + const currentDimensions = backgroundDimensions.value + const targetWidth = currentDimensions.width * DEFAULT_OVERLAY_WIDTH_RATIO + const scale = Math.min(targetWidth / overlay.width, currentDimensions.height / overlay.height) + const id = globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random()}` + Object.assign(overlay, { overlayId: id, overlayName: name }) + overlay.set({ + left: 0, + top: 0, + originX: 'left', + originY: 'top', + scaleX: scale, + scaleY: scale, + selectable: true, + evented: true, + lockRotation: true, + lockScalingFlip: true, + lockSkewingX: true, + lockSkewingY: true, + }) + overlay.setControlsVisibility({ + mtr: false, + ml: false, + mr: false, + mt: false, + mb: false, + }) + clampOverlay(overlay) + const corner = positionInCorner( + 'top-right', + { width: overlay.getScaledWidth(), height: overlay.getScaledHeight() }, + currentDimensions, + ) + overlay.set({ left: corner.x, top: corner.y }) + overlay.setCoords() + + fabricCanvas.add(overlay) + fabricCanvas.setActiveObject(overlay) + publishOverlays() + updateAfterTransform(overlay) + } catch (error) { + if (generation === backgroundGeneration) { + reportError(error instanceof Error ? error.message : t('overlayLoadFailed')) + } + } + } + + async function addCustomOverlay(file: File): Promise { + if (!isSupportedImageFile(file)) { + reportError(t('unsupportedOverlay')) + return + } + + const source = URL.createObjectURL(file) + try { + await addOverlay(source, file.name) + } finally { + URL.revokeObjectURL(source) + } + } + + function selectOverlay(id: string): void { + const fabricCanvas = canvas.value + if (!fabricCanvas) return + + const object = fabricCanvas.getObjects().find( + (candidate): candidate is OverlayFabricObject => isOverlay(candidate) && candidate.overlayId === id, + ) + if (!object) return + + fabricCanvas.setActiveObject(object) + publishSelection(object) + fabricCanvas.requestRenderAll() + } + + function updateSelected(changes: Partial>): void { + if (!selectedOverlay || !backgroundDimensions.value) return + + const object = selectedOverlay + const updates: Partial = {} + if (typeof changes.x === 'number' && Number.isFinite(changes.x)) { + updates.left = rounded(changes.x) + } + if (typeof changes.y === 'number' && Number.isFinite(changes.y)) { + updates.top = rounded(changes.y) + } + if (typeof changes.width === 'number' && Number.isFinite(changes.width) && object.width) { + const width = Math.max(MIN_OVERLAY_WIDTH, rounded(changes.width)) + const scale = width / object.width + updates.scaleX = scale + updates.scaleY = scale + } + + object.set(updates) + updateAfterTransform(object) + } + + function positionSelected(corner: OverlayCorner): void { + const dimensions = backgroundDimensions.value + if (!selectedOverlay || !dimensions) return + + const position = positionInCorner( + corner, + { width: selectedOverlay.getScaledWidth(), height: selectedOverlay.getScaledHeight() }, + dimensions, + ) + selectedOverlay.set({ left: position.x, top: position.y }) + updateAfterTransform(selectedOverlay) + } + + function removeSelected(): void { + if (!selectedOverlay || !canvas.value) return + + canvas.value.remove(selectedOverlay) + selectedOverlay = null + options.onSelectionChange(null) + publishOverlays() + canvas.value.requestRenderAll() + } + + async function exportImage(format: ExportFormat): Promise { + const fabricCanvas = getCanvas() + const dimensions = backgroundDimensions.value + if (!fabricCanvas || !dimensions) { + reportError(t('uploadBackgroundBeforeExport')) + return + } + if (exportInProgress) return + + exportInProgress = true + const interactiveWidth = fabricCanvas.width + const interactiveHeight = fabricCanvas.height + const interactiveViewport = [...fabricCanvas.viewportTransform] as [ + number, + number, + number, + number, + number, + number, + ] + const backgroundColor = fabricCanvas.backgroundColor + let blobPromise: Promise | null = null + + try { + // Fabric's toBlob() renders into a separate canvas. Temporarily expose the + // source-image logical dimensions and an identity viewport so that the + // temporary export canvas is exact-size, without resizing the interactive + // DOM/backing canvas or creating a Base64 data URL. + fabricCanvas.width = dimensions.width + fabricCanvas.height = dimensions.height + fabricCanvas.viewportTransform = [...IDENTITY_VIEWPORT] + if (format === 'jpeg') { + fabricCanvas.backgroundColor = '#ffffff' + } + fabricCanvas.calcViewportBoundaries() + + // toBlob() creates/paints its export canvas synchronously before the Blob + // encoding promise settles, so restore editor state immediately below. + blobPromise = fabricCanvas.toBlob({ + format, + quality: format === 'jpeg' ? 0.95 : 1, + multiplier: 1, + }) + } catch (error) { + reportError(error instanceof Error ? error.message : t('exportFailed')) + } finally { + fabricCanvas.backgroundColor = backgroundColor + fabricCanvas.width = interactiveWidth + fabricCanvas.height = interactiveHeight + fabricCanvas.viewportTransform = interactiveViewport + fabricCanvas.calcViewportBoundaries() + fabricCanvas.requestRenderAll() + } + + if (!blobPromise) { + exportInProgress = false + return + } + + let blob: Blob | null = null + try { + blob = await blobPromise + if (!blob) throw new Error(t('exportFailed')) + } catch (error) { + reportError(error instanceof Error ? error.message : t('exportFailed')) + } finally { + exportInProgress = false + } + + if (!blob) return + + const url = URL.createObjectURL(blob) + const link = document.createElement('a') + link.href = url + link.download = `${t('downloadFilename')}-${new Date().toISOString().slice(0, 10)}.${format === 'jpeg' ? 'jpg' : 'png'}` + document.body.append(link) + link.click() + link.remove() + window.setTimeout(() => URL.revokeObjectURL(url), 10_000) + } + + void nextTick(initializeCanvas) + + onBeforeUnmount(() => { + backgroundGeneration += 1 + const fabricCanvas = canvas.value + canvas.value = null + if (fabricCanvas) void fabricCanvas.dispose() + }) + + return { + resizeDisplay, + loadBackground, + addOverlay, + addCustomOverlay, + selectOverlay, + updateSelected, + positionSelected, + removeSelected, + exportImage, + } +} diff --git a/src/composables/useLocale.ts b/src/composables/useLocale.ts new file mode 100644 index 0000000..500839e --- /dev/null +++ b/src/composables/useLocale.ts @@ -0,0 +1,171 @@ +import { ref, watch } from 'vue' + +export type Locale = 'en' | 'pt' + +export type TranslationKey = keyof typeof translations.en +export type Translate = (key: TranslationKey, values?: Record) => string + +const translations = { + en: { + appName: 'Local Image Editor', + privacyNotice: 'Images are processed locally in your browser and are not uploaded to the server.', + languageLabel: 'Language', + english: 'English', + portuguese: 'Portuguese', + dismissError: 'Dismiss error', + imageDimensions: 'Image: {width} x {height} px', + baseLayer: 'Base layer', + chooseImage: 'Choose your image', + uploadImage: 'Upload an image', + dropImage: 'or drop it here', + supportedFormats: 'PNG, JPEG, or WebP', + topLayer: 'Top layer', + addOverlay: 'Add an overlay', + overlayLibrary: 'Overlay library', + noOverlays: 'No overlays available', + addSelectedOverlay: 'Add selected overlay', + or: 'or', + uploadCustomImage: 'Upload custom image', + fineTune: 'Fine tune', + selectedElement: 'Selected element', + activeElement: 'Active element', + chooseElement: 'Choose an element', + xPosition: 'X position', + yPosition: 'Y position', + width: 'Width', + height: 'Height', + calculatedOverlayHeight: 'Calculated overlay height', + quickPosition: 'Quick position', + topLeft: 'Position top left', + topRight: 'Position top right', + bottomLeft: 'Position bottom left', + bottomRight: 'Position bottom right', + removeElement: 'Remove element', + selectOverlay: 'Select an overlay on the canvas or from the element list to adjust its position and size.', + imageEditor: 'Image editor', + canvasLabel: 'Canvas for positioning image overlays', + imageAppearsHere: 'Your image will appear here.', + uploadToBegin: 'Upload a PNG, JPEG, or WebP image to begin.', + readyWhenYouAre: 'Ready when you are', + downloadImage: 'Download your image', + originalDimensions: "Exports retain your source image's original dimensions.", + exporting: 'Preparing the full-resolution image…', + downloadPng: 'Download PNG', + downloadJpeg: 'Download JPEG', + editorLoading: 'The editor is still loading. Please try again.', + decodeImage: 'The image could not be decoded. Choose a valid PNG, JPEG, or WebP image.', + predefinedOverlayFailed: 'This predefined overlay could not be loaded. Check that its filename in overlays.json exactly matches the file in the overlays directory.', + unsupportedBackground: 'Choose a PNG, JPEG, or WebP image for the background.', + invalidBackgroundDimensions: 'The background image has invalid dimensions.', + backgroundLoadFailed: 'The background could not be loaded.', + replaceBackgroundConfirm: 'Replacing the background will remove all current overlays. Continue?', + uploadBackgroundFirst: 'Upload a background image before adding an overlay.', + invalidOverlayDimensions: 'The overlay image has invalid dimensions.', + overlayLoadFailed: 'The overlay could not be loaded.', + unsupportedOverlay: 'Choose a PNG, JPEG, or WebP image for the overlay.', + uploadBackgroundBeforeExport: 'Upload a background image before exporting.', + exportFailed: 'The full-resolution image could not be exported. Try a smaller source image or another browser.', + overlayConfigFailed: 'The predefined overlay library could not be loaded. You can still upload a custom overlay.', + downloadFilename: 'local-image', + }, + pt: { + appName: 'Editor de Imagens Local', + privacyNotice: 'As imagens são processadas localmente no seu navegador e não são enviadas para o servidor.', + languageLabel: 'Idioma', + english: 'Inglês', + portuguese: 'Português', + dismissError: 'Fechar erro', + imageDimensions: 'Imagem: {width} x {height} px', + baseLayer: 'Camada de base', + chooseImage: 'Escolha a sua imagem', + uploadImage: 'Carregar imagem', + dropImage: 'ou largue-a aqui', + supportedFormats: 'PNG, JPEG ou WebP', + topLayer: 'Camada superior', + addOverlay: 'Adicionar sobreposição', + overlayLibrary: 'Biblioteca de sobreposições', + noOverlays: 'Não há sobreposições disponíveis', + addSelectedOverlay: 'Adicionar sobreposição selecionada', + or: 'ou', + uploadCustomImage: 'Carregar imagem personalizada', + fineTune: 'Ajuste preciso', + selectedElement: 'Elemento selecionado', + activeElement: 'Elemento ativo', + chooseElement: 'Escolher um elemento', + xPosition: 'Posição X', + yPosition: 'Posição Y', + width: 'Largura', + height: 'Altura', + calculatedOverlayHeight: 'Altura calculada da sobreposição', + quickPosition: 'Posição rápida', + topLeft: 'Posicionar no canto superior esquerdo', + topRight: 'Posicionar no canto superior direito', + bottomLeft: 'Posicionar no canto inferior esquerdo', + bottomRight: 'Posicionar no canto inferior direito', + removeElement: 'Remover elemento', + selectOverlay: 'Selecione uma sobreposição na área de edição ou na lista de elementos para ajustar a posição e o tamanho.', + imageEditor: 'Editor de imagens', + canvasLabel: 'Área para posicionar sobreposições de imagem', + imageAppearsHere: 'A sua imagem aparecerá aqui.', + uploadToBegin: 'Carregue uma imagem PNG, JPEG ou WebP para começar.', + readyWhenYouAre: 'Quando estiver pronto', + downloadImage: 'Descarregue a sua imagem', + originalDimensions: 'As exportações mantêm as dimensões originais da imagem.', + exporting: 'A preparar a imagem na resolução original…', + downloadPng: 'Descarregar PNG', + downloadJpeg: 'Descarregar JPEG', + editorLoading: 'O editor ainda está a carregar. Tente novamente.', + decodeImage: 'Não foi possível descodificar a imagem. Escolha uma imagem PNG, JPEG ou WebP válida.', + predefinedOverlayFailed: 'Não foi possível carregar esta sobreposição predefinida. Confirme que o nome em overlays.json corresponde exatamente ao ficheiro na pasta de sobreposições.', + unsupportedBackground: 'Escolha uma imagem PNG, JPEG ou WebP para a imagem de fundo.', + invalidBackgroundDimensions: 'A imagem de fundo tem dimensões inválidas.', + backgroundLoadFailed: 'Não foi possível carregar a imagem de fundo.', + replaceBackgroundConfirm: 'Substituir a imagem de fundo irá remover todas as sobreposições atuais. Continuar?', + uploadBackgroundFirst: 'Carregue uma imagem de fundo antes de adicionar uma sobreposição.', + invalidOverlayDimensions: 'A sobreposição tem dimensões inválidas.', + overlayLoadFailed: 'Não foi possível carregar a sobreposição.', + unsupportedOverlay: 'Escolha uma imagem PNG, JPEG ou WebP para a sobreposição.', + uploadBackgroundBeforeExport: 'Carregue uma imagem de fundo antes de exportar.', + exportFailed: 'Não foi possível exportar a imagem na resolução original. Tente uma imagem mais pequena ou outro navegador.', + overlayConfigFailed: 'Não foi possível carregar a biblioteca de sobreposições predefinidas. Ainda pode carregar uma imagem personalizada.', + downloadFilename: 'imagem-local', + }, +} as const + +function initialLocale(): Locale { + try { + const savedLocale = localStorage.getItem('local-image-editor-locale') + if (savedLocale === 'en' || savedLocale === 'pt') return savedLocale + } catch { + // Storage can be unavailable in hardened/private browser contexts. + } + return navigator.language.toLowerCase().startsWith('pt') ? 'pt' : 'en' +} + +const locale = ref(initialLocale()) + +const t: Translate = (key, values = {}) => { + let message: string = translations[locale.value][key] + for (const [name, value] of Object.entries(values)) { + message = message.replace(`{${name}}`, String(value)) + } + return message +} + +function setLocale(nextLocale: Locale): void { + locale.value = nextLocale +} + +watch(locale, (nextLocale) => { + try { + localStorage.setItem('local-image-editor-locale', nextLocale) + } catch { + // Language selection still works for this session if storage is blocked. + } + document.documentElement.lang = nextLocale === 'pt' ? 'pt-PT' : 'en' + document.title = translations[nextLocale].appName +}, { immediate: true }) + +export function useLocale() { + return { locale, setLocale, t } +} diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..97128ba --- /dev/null +++ b/src/main.ts @@ -0,0 +1,5 @@ +import { createApp } from 'vue' +import App from './App.vue' +import './styles/main.css' + +createApp(App).mount('#app') diff --git a/src/styles/main.css b/src/styles/main.css new file mode 100644 index 0000000..98eaa25 --- /dev/null +++ b/src/styles/main.css @@ -0,0 +1,620 @@ +:root { + color: #15373a; + background: #f4f2eb; + font-family: 'Avenir Next', 'Helvetica Neue', Arial, sans-serif; + font-synthesis: none; + text-rendering: optimizeLegibility; +} + +* { + box-sizing: border-box; +} + +body { + min-width: 320px; + min-height: 100vh; + margin: 0; +} + +button, +input, +select { + font: inherit; +} + +button, +label, +select { + -webkit-tap-highlight-color: transparent; +} + +button { + cursor: pointer; +} + +button:disabled { + cursor: not-allowed; + opacity: 0.44; +} + +button:focus-visible, +input:focus-visible, +select:focus-visible, +.dropzone:focus-within { + outline: 3px solid #ee815e; + outline-offset: 3px; +} + +.app-shell { + width: min(1480px, calc(100% - 48px)); + margin: 0 auto; + padding: 26px 0 40px; +} + +.site-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 24px; + margin-bottom: 48px; +} + +.header-tools { + display: flex; + align-items: center; + gap: 17px; +} + +.language-picker select { + width: auto; + height: 31px; + padding: 0 7px; + border-color: #c7cec6; + background: transparent; + color: #53645d; + font-family: 'DM Mono', monospace; + font-size: 9px; + text-transform: uppercase; +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + overflow: hidden; + clip: rect(0 0 0 0); + white-space: nowrap; + clip-path: inset(50%); +} + +.brand { + margin: 0; + color: #15373a; + font-size: 15px; + font-weight: 800; + letter-spacing: -0.04em; + line-height: 1; +} + +.brand-content { + display: inline-flex; + align-items: center; + gap: 11px; + color: inherit; + text-decoration: none; +} + +.brand-mark { + display: flex; + align-items: flex-end; + gap: 3px; + width: 30px; + height: 30px; + padding: 7px 6px; + background: #ee815e; +} + +.brand-mark i { + display: block; + width: 4px; + background: #15373a; +} + +.brand-mark i:first-child { height: 8px; } +.brand-mark i:nth-child(2) { height: 15px; } +.brand-mark i:last-child { height: 11px; } + +.privacy-notice { + margin: 0; + max-width: 450px; + color: #6c7771; + font-family: 'DM Mono', monospace; + font-size: 10px; + line-height: 1.45; + text-align: right; +} + +.eyebrow { + margin: 0 0 9px; + color: #d56043; + font-family: 'DM Mono', monospace; + font-size: 10px; + font-weight: 500; + letter-spacing: 0.11em; + line-height: 1.2; + text-transform: uppercase; +} + +h2, +p { + margin-top: 0; +} + +.error-notice { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + max-width: 900px; + margin: 0 0 28px; + padding: 14px 16px; + border: 1px solid #e29982; + background: #fff0e9; + color: #90381e; + font-size: 13px; + line-height: 1.45; +} + +.error-notice button { + border: 0; + background: transparent; + color: inherit; + font-family: 'DM Mono', monospace; + font-size: 17px; +} + +.workspace { + display: grid; + grid-template-columns: minmax(280px, 342px) minmax(0, 1fr); + align-items: start; + gap: clamp(25px, 4vw, 68px); +} + +.control-column { + display: grid; + gap: 16px; +} + +.panel { + padding: 23px; + border: 1px solid #d6d6cc; + background: #fbfaf6; +} + +.panel-heading { + display: flex; + align-items: flex-start; + gap: 13px; + margin-bottom: 21px; +} + +.panel-heading .eyebrow { + margin-bottom: 4px; +} + +.step-number { + display: grid; + flex: 0 0 26px; + width: 26px; + height: 26px; + place-items: center; + border-radius: 50%; + background: #15373a; + color: #f7f5ee; + font-family: 'DM Mono', monospace; + font-size: 10px; +} + +h2 { + margin-bottom: 0; + color: #15373a; + font-size: 17px; + font-weight: 800; + letter-spacing: -0.045em; + line-height: 1.15; +} + +.dropzone { + display: flex; + min-height: 148px; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 7px; + border: 1px dashed #9fa9a2; + background: #f4f2eb; + color: #52635d; + cursor: pointer; + font-size: 12px; + text-align: center; + transition: background 150ms ease, border-color 150ms ease; +} + +.dropzone:hover, +.dropzone--active { + border-color: #ee815e; + background: #fff2e8; +} + +.dropzone input, +.upload-button input { + position: absolute; + width: 1px; + height: 1px; + overflow: hidden; + clip: rect(0 0 0 0); + white-space: nowrap; + clip-path: inset(50%); +} + +.dropzone strong { + color: #15373a; +} + +.dropzone small { + color: #8c9690; + font-family: 'DM Mono', monospace; + font-size: 9px; +} + +.dropzone-icon { + display: grid; + width: 28px; + height: 28px; + place-items: center; + border-radius: 50%; + background: #dce6dd; + color: #15373a; + font-size: 17px; + font-weight: 600; +} + +.image-dimensions { + margin: -5px 0 1px; + color: #718079; + font-family: 'DM Mono', monospace; + font-size: 10px; +} + +.field-group { + display: grid; + gap: 8px; +} + +.field-group > label, +.coordinate-grid label, +.quick-position > span, +.calculated-size > span { + color: #64736d; + font-family: 'DM Mono', monospace; + font-size: 10px; + letter-spacing: 0.04em; + text-transform: uppercase; +} + +select, +.number-input { + min-width: 0; + height: 42px; + border: 1px solid #cfd2c9; + border-radius: 0; + background: #fffefb; + color: #15373a; +} + +select { + width: 100%; + padding: 0 12px; + appearance: auto; + font-size: 13px; +} + +.button { + display: inline-flex; + min-height: 42px; + align-items: center; + justify-content: center; + border: 1px solid transparent; + border-radius: 0; + padding: 10px 14px; + font-size: 12px; + font-weight: 700; + letter-spacing: -0.01em; + line-height: 1.2; + text-decoration: none; + transition: background 150ms ease, border-color 150ms ease, color 150ms ease; +} + +.button--secondary { + margin-top: 4px; + background: #dce6dd; + color: #15373a; +} + +.button--secondary:hover:not(:disabled) { background: #c9daca; } + +.panel-divider { + display: flex; + align-items: center; + gap: 10px; + margin: 18px 0; + color: #9aa39d; + font-family: 'DM Mono', monospace; + font-size: 9px; + text-transform: uppercase; +} + +.panel-divider::before, +.panel-divider::after { + height: 1px; + flex: 1; + background: #deded5; + content: ''; +} + +.button--outline { + width: 100%; + border-color: #15373a; + background: transparent; + color: #15373a; +} + +.button--outline:hover { background: #15373a; color: #fff; } + +.upload-button { cursor: pointer; } + +.controls-panel { min-height: 230px; } + +.active-overlay-picker { + display: grid; + gap: 6px; + margin: -4px 0 18px; + color: #64736d; + font-family: 'DM Mono', monospace; + font-size: 10px; + letter-spacing: 0.04em; + text-transform: uppercase; +} + +.active-overlay-picker select { + font-family: 'Avenir Next', 'Helvetica Neue', Arial, sans-serif; + letter-spacing: normal; + text-transform: none; +} + +.coordinate-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 14px 11px; +} + +.coordinate-grid label { + display: grid; + gap: 6px; +} + +.number-input { + display: flex; + align-items: center; + overflow: hidden; +} + +.number-input input { + min-width: 0; + width: 100%; + height: 100%; + border: 0; + background: transparent; + padding: 0 6px 0 10px; + color: #15373a; + font-family: 'DM Mono', monospace; + font-size: 12px; +} + +.number-input input:focus-visible { outline: 0; } + +.number-input em { + padding-right: 9px; + color: #97a099; + font-family: 'DM Mono', monospace; + font-size: 9px; + font-style: normal; +} + +.calculated-size { + display: grid; + gap: 6px; +} + +.calculated-size strong { + display: flex; + height: 42px; + align-items: center; + padding: 0 10px; + border: 1px solid #e0e1d9; + color: #60706b; + font-family: 'DM Mono', monospace; + font-size: 12px; + font-weight: 400; +} + +.quick-position { + display: grid; + grid-template-columns: 1fr auto; + align-items: center; + gap: 10px; + margin: 20px 0; +} + +.corner-buttons { + display: flex; + gap: 4px; +} + +.corner-buttons button { + display: grid; + width: 31px; + height: 31px; + place-items: center; + border: 1px solid #cfd2c9; + background: #fffefb; + color: #15373a; + font-family: 'DM Mono', monospace; + font-size: 9px; + line-height: 1; +} + +.corner-buttons button:hover { background: #dce6dd; } + +.button--danger { + width: 100%; + border-color: #d56143; + background: transparent; + color: #b94b31; +} + +.button--danger:hover { background: #fff0ea; } + +.control-empty { + margin: 0; + color: #829089; + font-size: 12px; + line-height: 1.65; +} + +.editor-region { + min-width: 0; +} + +.canvas-shell { + display: grid; + min-height: 430px; + place-items: center; + overflow: hidden; + border: 1px solid #d6d6cc; + background-color: #d8ddd5; + background-image: linear-gradient(45deg, #cfd5cc 25%, transparent 25%), linear-gradient(-45deg, #cfd5cc 25%, transparent 25%), linear-gradient(45deg, transparent 75%, #cfd5cc 75%), linear-gradient(-45deg, transparent 75%, #cfd5cc 75%); + background-position: 0 0, 0 10px, 10px -10px, -10px 0; + background-size: 20px 20px; +} + +.editor-empty { + display: grid; + place-items: center; + color: #6d7972; + text-align: center; +} + +.editor-empty p { + margin: 12px 0 5px; + font-size: 14px; + font-weight: 700; +} + +.editor-empty small { + font-family: 'DM Mono', monospace; + font-size: 10px; +} + +.empty-mark { + display: grid; + width: 44px; + height: 44px; + place-items: center; + border: 1px solid #91a098; + border-radius: 50%; + color: #60716a; + font-size: 26px; + font-weight: 300; +} + +.editor-canvas { + display: block; + max-width: 100%; + max-height: 100%; +} + +.canvas-shell--empty .canvas-container { + display: none; +} + +.export-panel { + display: flex; + align-items: center; + justify-content: space-between; + gap: 28px; + margin-top: clamp(28px, 4vw, 55px); + padding: 26px 29px; + background: #e5b35e; +} + +.export-panel .eyebrow { color: #79551b; } +.export-panel h2 { color: #15373a; } + +.export-panel p:last-child { + max-width: 420px; + margin: 8px 0 0; + color: #5e532e; + font-size: 12px; + line-height: 1.5; +} + +.export-actions { + display: flex; + flex: 0 0 auto; + gap: 9px; +} + +.button--primary { background: #15373a; color: #fff; } +.button--primary:hover:not(:disabled) { background: #0a2528; } +.button--dark { border-color: #15373a; background: transparent; color: #15373a; } +.button--dark:hover:not(:disabled) { background: #f5dc9d; } + +@media (max-width: 860px) { + .workspace { + grid-template-columns: 1fr; + } + + .control-column { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .controls-panel, + .image-dimensions { + grid-column: 1 / -1; + } + + .editor-region { grid-row: 1; } +} + +@media (max-width: 590px) { + .app-shell { + width: min(100% - 30px, 1480px); + padding-top: 18px; + } + + .site-header { margin-bottom: 30px; } + + .site-header { align-items: flex-start; } + .header-tools { align-items: flex-end; flex-direction: column-reverse; gap: 6px; } + .privacy-notice { max-width: 185px; font-size: 8px; } + .intro { padding: 58px 0 38px; } + .intro-copy { font-size: 14px; } + .control-column { grid-template-columns: 1fr; } + .controls-panel, + .image-dimensions { grid-column: auto; } + .canvas-shell { min-height: 280px; } + .export-panel { align-items: flex-start; flex-direction: column; padding: 23px; } + .export-actions { width: 100%; } + .export-actions .button { flex: 1; padding-right: 8px; padding-left: 8px; } +} diff --git a/src/types/editor.ts b/src/types/editor.ts new file mode 100644 index 0000000..8405c82 --- /dev/null +++ b/src/types/editor.ts @@ -0,0 +1,37 @@ +export interface ImageDimensions { + width: number + height: number +} + +export interface OverlayLibraryItem { + id: string + name: string + file: string +} + +export interface OverlaySummary { + id: string + name: string +} + +export interface SelectedOverlay extends OverlaySummary { + x: number + y: number + width: number + height: number +} + +export type OverlayCorner = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' +export type ExportFormat = 'png' | 'jpeg' + +export interface EditorHandle { + resizeDisplay: (width: number, height: number) => void + loadBackground: (file: File) => Promise + addOverlay: (source: string, name: string) => Promise + addCustomOverlay: (file: File) => Promise + selectOverlay: (id: string) => void + updateSelected: (changes: Partial>) => void + positionSelected: (corner: OverlayCorner) => void + removeSelected: () => void + exportImage: (format: ExportFormat) => Promise +} diff --git a/src/utils/editorMath.ts b/src/utils/editorMath.ts new file mode 100644 index 0000000..ddafa89 --- /dev/null +++ b/src/utils/editorMath.ts @@ -0,0 +1,71 @@ +import type { ImageDimensions, OverlayCorner } from '@/types/editor' + +export const MIN_OVERLAY_WIDTH = 12 +export const DEFAULT_OVERLAY_WIDTH_RATIO = 0.22 +export const DEFAULT_MARGIN_RATIO = 0.025 + +export interface OverlayTransform { + x: number + y: number + scale: number + width: number + height: number +} + +export function fitDisplayDimensions( + source: ImageDimensions, + availableWidth: number, +): ImageDimensions { + if (source.width <= 0 || source.height <= 0 || availableWidth <= 0) { + return { width: 0, height: 0 } + } + + const scale = Math.min(1, availableWidth / source.width) + return { + width: Math.max(1, Math.round(source.width * scale)), + height: Math.max(1, Math.round(source.height * scale)), + } +} + +export function clampOverlayTransform( + sourceWidth: number, + sourceHeight: number, + x: number, + y: number, + requestedScale: number, + bounds: ImageDimensions, +): OverlayTransform { + if (sourceWidth <= 0 || sourceHeight <= 0 || bounds.width <= 0 || bounds.height <= 0) { + return { x: 0, y: 0, scale: 1, width: 0, height: 0 } + } + + const maximumScale = Math.min(bounds.width / sourceWidth, bounds.height / sourceHeight) + const minimumScale = Math.min(MIN_OVERLAY_WIDTH / sourceWidth, maximumScale) + const safeRequestedScale = Number.isFinite(requestedScale) ? requestedScale : minimumScale + const scale = Math.min(Math.max(safeRequestedScale, minimumScale), maximumScale) + const width = sourceWidth * scale + const height = sourceHeight * scale + + return { + x: Math.min(Math.max(Number.isFinite(x) ? x : 0, 0), Math.max(0, bounds.width - width)), + y: Math.min(Math.max(Number.isFinite(y) ? y : 0, 0), Math.max(0, bounds.height - height)), + scale, + width, + height, + } +} + +export function positionInCorner( + corner: OverlayCorner, + overlay: Pick, + bounds: ImageDimensions, +): Pick { + const margin = Math.min(bounds.width, bounds.height) * DEFAULT_MARGIN_RATIO + const isRight = corner === 'top-right' || corner === 'bottom-right' + const isBottom = corner === 'bottom-left' || corner === 'bottom-right' + + return { + x: isRight ? Math.max(0, bounds.width - overlay.width - margin) : margin, + y: isBottom ? Math.max(0, bounds.height - overlay.height - margin) : margin, + } +} diff --git a/src/utils/imageFiles.ts b/src/utils/imageFiles.ts new file mode 100644 index 0000000..6b140cf --- /dev/null +++ b/src/utils/imageFiles.ts @@ -0,0 +1,11 @@ +export const SUPPORTED_IMAGE_MIME_TYPES = new Set([ + 'image/png', + 'image/jpeg', + 'image/webp', +]) + +export const SUPPORTED_IMAGE_ACCEPT = 'image/png,image/jpeg,image/webp' + +export function isSupportedImageFile(file: File): boolean { + return SUPPORTED_IMAGE_MIME_TYPES.has(file.type) +} diff --git a/src/utils/overlayConfig.ts b/src/utils/overlayConfig.ts new file mode 100644 index 0000000..2452dcf --- /dev/null +++ b/src/utils/overlayConfig.ts @@ -0,0 +1,43 @@ +import type { OverlayLibraryItem } from '@/types/editor' + +const SUPPORTED_OVERLAY_FILE = /^[A-Za-z0-9][A-Za-z0-9._ -]*\.(?:png|jpe?g|webp)$/i + +function normalizedString(value: unknown): string | null { + if (typeof value !== 'string') return null + const normalized = value.trim() + return normalized || null +} + +export function parseOverlayLibrary(value: unknown): OverlayLibraryItem[] { + if (!Array.isArray(value)) { + throw new Error('Overlay configuration must be an array.') + } + + const ids = new Set() + const files = new Set() + + return value.map((candidate, index) => { + if (!candidate || typeof candidate !== 'object') { + throw new Error(`Overlay entry ${index + 1} is invalid.`) + } + + const entry = candidate as Record + const id = normalizedString(entry.id) + const name = normalizedString(entry.name) + const file = normalizedString(entry.file) + + if (!id || !name || !file || !SUPPORTED_OVERLAY_FILE.test(file) || file.includes('..')) { + throw new Error(`Overlay entry ${index + 1} has invalid fields.`) + } + if (ids.has(id)) { + throw new Error(`Overlay id "${id}" is duplicated.`) + } + if (files.has(file)) { + throw new Error(`Overlay file "${file}" is duplicated.`) + } + + ids.add(id) + files.add(file) + return { id, name, file } + }) +} diff --git a/tests/editorMath.test.ts b/tests/editorMath.test.ts new file mode 100644 index 0000000..ca78945 --- /dev/null +++ b/tests/editorMath.test.ts @@ -0,0 +1,53 @@ +import assert from 'node:assert/strict' +import test from 'node:test' +import { + clampOverlayTransform, + fitDisplayDimensions, + positionInCorner, +} from '../src/utils/editorMath.ts' + +test('fitDisplayDimensions keeps source coordinates independent from display size', () => { + assert.deepEqual(fitDisplayDimensions({ width: 4032, height: 3024 }, 900), { + width: 900, + height: 675, + }) + assert.deepEqual(fitDisplayDimensions({ width: 800, height: 600 }, 1200), { + width: 800, + height: 600, + }) +}) + +test('clampOverlayTransform keeps the full overlay inside the source image', () => { + const result = clampOverlayTransform(400, 200, 950, -50, 0.5, { + width: 1000, + height: 500, + }) + + assert.equal(result.scale, 0.5) + assert.equal(result.width, 200) + assert.equal(result.height, 100) + assert.equal(result.x, 800) + assert.equal(result.y, 0) +}) + +test('clampOverlayTransform limits oversized overlays without changing aspect ratio', () => { + const result = clampOverlayTransform(2000, 1000, 0, 0, 1, { + width: 1000, + height: 400, + }) + + assert.equal(result.scale, 0.4) + assert.equal(result.width, 800) + assert.equal(result.height, 400) +}) + +test('positionInCorner uses a proportional margin and does not clip the object', () => { + const position = positionInCorner( + 'bottom-right', + { width: 200, height: 100 }, + { width: 1000, height: 500 }, + ) + + assert.equal(position.x, 787.5) + assert.equal(position.y, 387.5) +}) diff --git a/tests/overlayConfig.test.ts b/tests/overlayConfig.test.ts new file mode 100644 index 0000000..15573a8 --- /dev/null +++ b/tests/overlayConfig.test.ts @@ -0,0 +1,23 @@ +import assert from 'node:assert/strict' +import test from 'node:test' +import { parseOverlayLibrary } from '../src/utils/overlayConfig.ts' + +test('parseOverlayLibrary accepts simple local raster files', () => { + assert.deepEqual( + parseOverlayLibrary([{ id: 'crr', name: ' CRR Logo ', file: 'crr-logo.png' }]), + [{ id: 'crr', name: 'CRR Logo', file: 'crr-logo.png' }], + ) +}) + +test('parseOverlayLibrary rejects duplicate ids', () => { + assert.throws(() => parseOverlayLibrary([ + { id: 'crr', name: 'One', file: 'one.png' }, + { id: 'crr', name: 'Two', file: 'two.png' }, + ])) +}) + +test('parseOverlayLibrary rejects paths, URLs, and SVG files', () => { + for (const file of ['../logo.png', 'nested/logo.png', 'https://example.test/logo.png', 'logo.svg']) { + assert.throws(() => parseOverlayLibrary([{ id: 'bad', name: 'Bad', file }])) + } +}) diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..5b6619d --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,28 @@ +{ + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"], + "exclude": ["src/**/__tests__/*"], + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "composite": true, + "target": "ES2022", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + "moduleResolution": "Bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "preserve", + "types": ["vite/client"], + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + }, + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..734e81d --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,15 @@ +{ + "include": ["vite.config.ts"], + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "composite": true, + "module": "ESNext", + "moduleResolution": "Bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "strict": true, + "skipLibCheck": true + } +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..f56e1b2 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,15 @@ +import { fileURLToPath, URL } from 'node:url' +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' + +export default defineConfig({ + // Relative build assets make the static bundle more portable. Docker still + // serves the app at the root of its hostname by default. + base: './', + plugins: [vue()], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)), + }, + }, +})