From bea1f0741d3d63d6fae21b90d9bb0bee46d8fa0e Mon Sep 17 00:00:00 2001 From: Daniel Kluge Date: Sat, 21 Mar 2026 14:37:03 +0100 Subject: [PATCH] Inital commit of Astro Website --- .gitignore | 24 + .vscode/extensions.json | 4 + .vscode/launch.json | 11 + README.md | 43 + astro.config.mjs | 39 + package-lock.json | 4563 +++++++++++++++++ package.json | 25 + public/apple-touch-icon.png | Bin 0 -> 306 bytes public/favicon-16x16.png | Bin 0 -> 261 bytes public/favicon-32x32.png | Bin 0 -> 266 bytes public/favicon.ico | Bin 0 -> 3106 bytes public/favicon.svg | 35 + public/og-image.png | Bin 0 -> 380 bytes src/assets/backgrounds/bubble-static.svg | 129 + src/assets/backgrounds/bubble.svg | 226 + .../backgrounds/curve-ripple-static.svg | 101 + src/assets/backgrounds/curve-ripple.svg | 601 +++ .../backgrounds/dual-ripples-static.svg | 144 + src/assets/backgrounds/dual-ripples.svg | 859 ++++ src/assets/backgrounds/ripple-line-static.svg | 33 + src/assets/backgrounds/ripple-line.svg | 129 + src/assets/logo.svg | 35 + src/components/BookNavigation.astro | 111 + src/components/GlassContainer.astro | 9 + src/components/Navigation.astro | 101 + src/components/WelcomeTypewriter.astro | 186 + src/content.config.ts | 46 + src/content/blog/first-post.md | 9 + src/content/book/chapters.json | 7 + .../book/grundlagen/0-0_der_anfang.mdx | 84 + .../book/grundlagen/0-1_einsen_und_nullen.mdx | 224 + .../grundlagen/0-2_einmal_zahlen_bitte.mdx | 151 + .../book/grundlagen/0-3_addieren_mit_bits.mdx | 236 + .../book/grundlagen/0-4_voll_logisch.mdx | 7 + .../book/grundlagen/assets/01-transistor.json | 117 + .../book/grundlagen/assets/01-transistor.svg | 201 + .../book/grundlagen/assets/02-cmos.json | 411 ++ .../book/grundlagen/assets/02-cmos.svg | 511 ++ src/content/portfolio/assets/screenshot.jpg | Bin 0 -> 166718 bytes .../assets/screenshot.jpg:Zone.Identifier | Bin 0 -> 25 bytes src/content/portfolio/astro-rewrite.mdx | 11 + src/content/portfolio/infoscreen.mdx | 133 + src/content/portfolio/ol-git.mdx | 81 + src/content/portfolio/photo-sync.mdx | 39 + src/content/portfolio/simple-cb.mdx | 37 + src/content/portfolio/terminal.mdx | 109 + src/content/portfolio/tufast.mdx | 47 + src/data/socials.json | 23 + src/layouts/BaseLayout.astro | 72 + src/pages/blog/[...slug].astro | 41 + src/pages/blog/index.astro | 47 + src/pages/book/[...slug].astro | 112 + src/pages/book/index.astro | 44 + src/pages/index.astro | 226 + src/pages/portfolio/[...slug].astro | 52 + src/pages/portfolio/index.astro | 55 + src/remark-modified-time.mjs | 22 + src/styles/global.css | 221 + src/styles/md-custom.css | 49 + tsconfig.json | 5 + 60 files changed, 10838 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/extensions.json create mode 100644 .vscode/launch.json create mode 100644 README.md create mode 100644 astro.config.mjs create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/apple-touch-icon.png create mode 100644 public/favicon-16x16.png create mode 100644 public/favicon-32x32.png create mode 100644 public/favicon.ico create mode 100644 public/favicon.svg create mode 100644 public/og-image.png create mode 100644 src/assets/backgrounds/bubble-static.svg create mode 100644 src/assets/backgrounds/bubble.svg create mode 100644 src/assets/backgrounds/curve-ripple-static.svg create mode 100644 src/assets/backgrounds/curve-ripple.svg create mode 100644 src/assets/backgrounds/dual-ripples-static.svg create mode 100644 src/assets/backgrounds/dual-ripples.svg create mode 100644 src/assets/backgrounds/ripple-line-static.svg create mode 100644 src/assets/backgrounds/ripple-line.svg create mode 100644 src/assets/logo.svg create mode 100644 src/components/BookNavigation.astro create mode 100644 src/components/GlassContainer.astro create mode 100644 src/components/Navigation.astro create mode 100644 src/components/WelcomeTypewriter.astro create mode 100644 src/content.config.ts create mode 100644 src/content/blog/first-post.md create mode 100644 src/content/book/chapters.json create mode 100644 src/content/book/grundlagen/0-0_der_anfang.mdx create mode 100644 src/content/book/grundlagen/0-1_einsen_und_nullen.mdx create mode 100644 src/content/book/grundlagen/0-2_einmal_zahlen_bitte.mdx create mode 100644 src/content/book/grundlagen/0-3_addieren_mit_bits.mdx create mode 100644 src/content/book/grundlagen/0-4_voll_logisch.mdx create mode 100644 src/content/book/grundlagen/assets/01-transistor.json create mode 100644 src/content/book/grundlagen/assets/01-transistor.svg create mode 100644 src/content/book/grundlagen/assets/02-cmos.json create mode 100644 src/content/book/grundlagen/assets/02-cmos.svg create mode 100644 src/content/portfolio/assets/screenshot.jpg create mode 100644 src/content/portfolio/assets/screenshot.jpg:Zone.Identifier create mode 100644 src/content/portfolio/astro-rewrite.mdx create mode 100644 src/content/portfolio/infoscreen.mdx create mode 100644 src/content/portfolio/ol-git.mdx create mode 100644 src/content/portfolio/photo-sync.mdx create mode 100644 src/content/portfolio/simple-cb.mdx create mode 100644 src/content/portfolio/terminal.mdx create mode 100644 src/content/portfolio/tufast.mdx create mode 100644 src/data/socials.json create mode 100644 src/layouts/BaseLayout.astro create mode 100644 src/pages/blog/[...slug].astro create mode 100644 src/pages/blog/index.astro create mode 100644 src/pages/book/[...slug].astro create mode 100644 src/pages/book/index.astro create mode 100644 src/pages/index.astro create mode 100644 src/pages/portfolio/[...slug].astro create mode 100644 src/pages/portfolio/index.astro create mode 100644 src/remark-modified-time.mjs create mode 100644 src/styles/global.css create mode 100644 src/styles/md-custom.css create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..16d54bb --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# build output +dist/ +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + + +# environment variables +.env +.env.production + +# macOS-specific files +.DS_Store + +# jetbrains setting folder +.idea/ diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..22a1505 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,4 @@ +{ + "recommendations": ["astro-build.astro-vscode"], + "unwantedRecommendations": [] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..d642209 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "command": "./node_modules/.bin/astro dev", + "name": "Development server", + "request": "launch", + "type": "node-terminal" + } + ] +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..87b813a --- /dev/null +++ b/README.md @@ -0,0 +1,43 @@ +# Astro Starter Kit: Minimal + +```sh +npm create astro@latest -- --template minimal +``` + +> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun! + +## 🚀 Project Structure + +Inside of your Astro project, you'll see the following folders and files: + +```text +/ +├── public/ +├── src/ +│ └── pages/ +│ └── index.astro +└── package.json +``` + +Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name. + +There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components. + +Any static assets, like images, can be placed in the `public/` directory. + +## 🧞 Commands + +All commands are run from the root of the project, from a terminal: + +| Command | Action | +| :------------------------ | :----------------------------------------------- | +| `npm install` | Installs dependencies | +| `npm run dev` | Starts local dev server at `localhost:4321` | +| `npm run build` | Build your production site to `./dist/` | +| `npm run preview` | Preview your build locally, before deploying | +| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` | +| `npm run astro -- --help` | Get help using the Astro CLI | + +## 👀 Want to learn more? + +Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat). diff --git a/astro.config.mjs b/astro.config.mjs new file mode 100644 index 0000000..2f0b61f --- /dev/null +++ b/astro.config.mjs @@ -0,0 +1,39 @@ +import { defineConfig, fontProviders } from 'astro/config'; +import icon from 'astro-icon'; +import mdx from '@astrojs/mdx'; +//import { remarkModifiedTime } from './src/remark-modified-time.mjs'; +import remarkMath from "remark-math"; +import rehypeMathjax from "rehype-mathjax" +import rehypeCallouts from "rehype-callouts"; +// @ts-ignore +import { remarkKroki } from "remark-kroki"; + +export default defineConfig({ + fonts: [{ + provider: fontProviders.fontsource(), + name: "Cascadia Code", + cssVariable: "--font-cascadia-code", + fallbacks: ["monospace"], + }], + integrations: [icon(), mdx()], + markdown: { + remarkPlugins: [ +// remarkModifiedTime, + remarkMath, [ + remarkKroki, { + alias: ["mermaid", "tikz"], + server: "https://kroki.io", + target: "mdx3", + output: "inline-svg" + } + ]], + rehypePlugins: [rehypeMathjax, [rehypeCallouts, { theme: "obsidian" }]], + shikiConfig: { + theme: "one-dark-pro", + }, + syntaxHighlight: { + type: 'shiki', + excludeLangs: ['mermaid', 'math'], + }, + } +}); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..8ff090e --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4563 @@ +{ + "name": "website-ag", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "website-ag", + "version": "0.0.1", + "dependencies": { + "@astrojs/mdx": "^5.0.2", + "@iconify-json/lucide": "^1.2.98", + "@iconify-json/simple-icons": "^1.2.74", + "astro": "^6.0.8", + "astro-icon": "^1.1.5", + "rehype-callouts": "^2.1.2", + "rehype-mathjax": "^7.1.0", + "remark-kroki": "^0.3.8", + "remark-math": "^6.0.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@antfu/utils": { + "version": "8.1.1", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@astrojs/compiler": { + "version": "3.0.1", + "license": "MIT" + }, + "node_modules/@astrojs/internal-helpers": { + "version": "0.8.0", + "license": "MIT", + "dependencies": { + "picomatch": "^4.0.3" + } + }, + "node_modules/@astrojs/markdown-remark": { + "version": "7.0.1", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.8.0", + "@astrojs/prism": "4.0.1", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.3", + "hast-util-to-text": "^4.0.2", + "js-yaml": "^4.1.1", + "mdast-util-definitions": "^6.0.0", + "rehype-raw": "^7.0.0", + "rehype-stringify": "^10.0.1", + "remark-gfm": "^4.0.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remark-smartypants": "^3.0.2", + "shiki": "^4.0.0", + "smol-toml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.1.0", + "unist-util-visit-parents": "^6.0.2", + "vfile": "^6.0.3" + } + }, + "node_modules/@astrojs/mdx": { + "version": "5.0.2", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "7.0.1", + "@mdx-js/mdx": "^3.1.1", + "acorn": "^8.16.0", + "es-module-lexer": "^2.0.0", + "estree-util-visit": "^2.0.0", + "hast-util-to-html": "^9.0.5", + "piccolore": "^0.1.3", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.6", + "unist-util-visit": "^5.1.0", + "vfile": "^6.0.3" + }, + "engines": { + "node": ">=22.12.0" + }, + "peerDependencies": { + "astro": "^6.0.0" + } + }, + "node_modules/@astrojs/prism": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "prismjs": "^1.30.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@astrojs/telemetry": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "ci-info": "^4.2.0", + "debug": "^4.4.0", + "dlv": "^1.1.3", + "dset": "^3.1.4", + "is-docker": "^3.0.0", + "is-wsl": "^3.1.0", + "which-pm-runs": "^1.1.0" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@capsizecss/unpack": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@clack/core": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "sisteransi": "^1.0.5" + } + }, + "node_modules/@clack/prompts": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "@clack/core": "1.1.0", + "sisteransi": "^1.0.5" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.4", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@iconify-json/lucide": { + "version": "1.2.98", + "license": "ISC", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify-json/simple-icons": { + "version": "1.2.74", + "license": "CC0-1.0", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify/tools": { + "version": "4.2.0", + "license": "MIT", + "dependencies": { + "@iconify/types": "^2.0.0", + "@iconify/utils": "^2.3.0", + "cheerio": "^1.1.2", + "domhandler": "^5.0.3", + "extract-zip": "^2.0.1", + "local-pkg": "^1.1.2", + "pathe": "^2.0.3", + "svgo": "^3.3.2", + "tar": "^7.5.2" + } + }, + "node_modules/@iconify/tools/node_modules/svgo": { + "version": "3.3.3", + "license": "MIT", + "dependencies": { + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0", + "sax": "^1.5.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/@iconify/tools/node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@iconify/tools/node_modules/svgo/node_modules/css-tree": { + "version": "2.3.1", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/@iconify/tools/node_modules/svgo/node_modules/css-tree/node_modules/mdn-data": { + "version": "2.0.30", + "license": "CC0-1.0" + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/@iconify/utils": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^1.0.0", + "@antfu/utils": "^8.1.0", + "@iconify/types": "^2.0.0", + "debug": "^4.4.0", + "globals": "^15.14.0", + "kolorist": "^1.8.0", + "local-pkg": "^1.0.0", + "mlly": "^1.7.4" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "license": "MIT" + }, + "node_modules/@mdx-js/mdx": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "acorn": "^8.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/estree-walker": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@oslojs/encoding": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "license": "MIT" + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@shikijs/core": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "@shikijs/primitive": "4.0.2", + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/langs": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/primitive": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/themes": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/types": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/katex": { + "version": "0.16.8", + "license": "MIT" + }, + "node_modules/@types/mathjax": { + "version": "0.0.40", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/@types/nlcst": { + "version": "2.0.3", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/node": { + "version": "25.5.0", + "license": "MIT", + "optional": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "license": "MIT" + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "license": "ISC" + }, + "node_modules/@xmldom/xmldom": { + "version": "0.9.8", + "license": "MIT", + "engines": { + "node": ">=14.6" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-iterate": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/astro": { + "version": "6.0.8", + "license": "MIT", + "dependencies": { + "@astrojs/compiler": "^3.0.0", + "@astrojs/internal-helpers": "0.8.0", + "@astrojs/markdown-remark": "7.0.1", + "@astrojs/telemetry": "3.3.0", + "@capsizecss/unpack": "^4.0.0", + "@clack/prompts": "^1.0.1", + "@oslojs/encoding": "^1.1.0", + "@rollup/pluginutils": "^5.3.0", + "aria-query": "^5.3.2", + "axobject-query": "^4.1.0", + "ci-info": "^4.4.0", + "clsx": "^2.1.1", + "common-ancestor-path": "^2.0.0", + "cookie": "^1.1.1", + "devalue": "^5.6.3", + "diff": "^8.0.3", + "dlv": "^1.1.3", + "dset": "^3.1.4", + "es-module-lexer": "^2.0.0", + "esbuild": "^0.27.3", + "flattie": "^1.1.1", + "fontace": "~0.4.1", + "github-slugger": "^2.0.0", + "html-escaper": "3.0.3", + "http-cache-semantics": "^4.2.0", + "js-yaml": "^4.1.1", + "magic-string": "^0.30.21", + "magicast": "^0.5.2", + "mrmime": "^2.0.1", + "neotraverse": "^0.6.18", + "obug": "^2.1.1", + "p-limit": "^7.3.0", + "p-queue": "^9.1.0", + "package-manager-detector": "^1.6.0", + "piccolore": "^0.1.3", + "picomatch": "^4.0.3", + "rehype": "^13.0.2", + "semver": "^7.7.4", + "shiki": "^4.0.0", + "smol-toml": "^1.6.0", + "svgo": "^4.0.0", + "tinyclip": "^0.1.6", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tsconfck": "^3.1.6", + "ultrahtml": "^1.6.0", + "unifont": "~0.7.4", + "unist-util-visit": "^5.1.0", + "unstorage": "^1.17.4", + "vfile": "^6.0.3", + "vite": "^7.3.1", + "vitefu": "^1.1.2", + "xxhash-wasm": "^1.1.0", + "yargs-parser": "^22.0.0", + "zod": "^4.3.6" + }, + "bin": { + "astro": "bin/astro.mjs" + }, + "engines": { + "node": ">=22.12.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/astrodotbuild" + }, + "optionalDependencies": { + "sharp": "^0.34.0" + } + }, + "node_modules/astro-icon": { + "version": "1.1.5", + "license": "MIT", + "dependencies": { + "@iconify/tools": "^4.0.5", + "@iconify/types": "^2.0.0", + "@iconify/utils": "^2.1.30" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "encoding-sniffer": "^0.2.1", + "htmlparser2": "^10.1.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^7.19.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=20.18.1" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/ci-info": { + "version": "4.4.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "11.1.0", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/common-ancestor-path": { + "version": "2.0.0", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">= 18" + } + }, + "node_modules/confbox": { + "version": "0.2.4", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cookie-es": { + "version": "1.2.2", + "license": "MIT" + }, + "node_modules/crossws": { + "version": "0.3.5", + "license": "MIT", + "dependencies": { + "uncrypto": "^0.1.3" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree/node_modules/mdn-data": { + "version": "2.0.28", + "license": "CC0-1.0" + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/defu": { + "version": "6.1.4", + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/devalue": { + "version": "5.6.4", + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "8.0.3", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "4.5.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dset": { + "version": "3.1.4", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/encoding-sniffer": { + "version": "0.2.1", + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "6.0.1", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-module-lexer": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esbuild": { + "version": "0.27.4", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.4", + "@esbuild/android-arm": "0.27.4", + "@esbuild/android-arm64": "0.27.4", + "@esbuild/android-x64": "0.27.4", + "@esbuild/darwin-arm64": "0.27.4", + "@esbuild/darwin-x64": "0.27.4", + "@esbuild/freebsd-arm64": "0.27.4", + "@esbuild/freebsd-x64": "0.27.4", + "@esbuild/linux-arm": "0.27.4", + "@esbuild/linux-arm64": "0.27.4", + "@esbuild/linux-ia32": "0.27.4", + "@esbuild/linux-loong64": "0.27.4", + "@esbuild/linux-mips64el": "0.27.4", + "@esbuild/linux-ppc64": "0.27.4", + "@esbuild/linux-riscv64": "0.27.4", + "@esbuild/linux-s390x": "0.27.4", + "@esbuild/linux-x64": "0.27.4", + "@esbuild/netbsd-arm64": "0.27.4", + "@esbuild/netbsd-x64": "0.27.4", + "@esbuild/openbsd-arm64": "0.27.4", + "@esbuild/openbsd-x64": "0.27.4", + "@esbuild/openharmony-arm64": "0.27.4", + "@esbuild/sunos-x64": "0.27.4", + "@esbuild/win32-arm64": "0.27.4", + "@esbuild/win32-ia32": "0.27.4", + "@esbuild/win32-x64": "0.27.4" + } + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esm": { + "version": "3.2.25", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx/node_modules/estree-walker": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-scope": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "license": "MIT" + }, + "node_modules/exsolve": { + "version": "1.0.8", + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "license": "MIT" + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/flattie": { + "version": "1.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/fontace": { + "version": "0.4.1", + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.2" + } + }, + "node_modules/fontkitten": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "tiny-inflate": "^1.0.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/globals": { + "version": "15.15.0", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/h3": { + "version": "1.15.9", + "license": "MIT", + "dependencies": { + "cookie-es": "^1.2.2", + "crossws": "^0.3.5", + "defu": "^6.1.4", + "destr": "^2.0.5", + "iron-webcrypto": "^1.2.1", + "node-mock-http": "^1.0.4", + "radix3": "^1.1.2", + "ufo": "^1.6.3", + "uncrypto": "^0.1.3" + } + }, + "node_modules/hast-util-from-html": { + "version": "2.0.3", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.3", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.1", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-find-after": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-escaper": { + "version": "3.0.3", + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/htmlparser2": { + "version": "10.1.0", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "entities": "^7.0.1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "7.0.1", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "license": "BSD-2-Clause" + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "license": "MIT" + }, + "node_modules/iron-webcrypto": { + "version": "1.2.1", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/brc-dd" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/katex": { + "version": "0.16.40", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/kebab-case": { + "version": "2.0.2", + "license": "MIT" + }, + "node_modules/kolorist": { + "version": "1.8.0", + "license": "MIT" + }, + "node_modules/local-pkg": { + "version": "1.1.2", + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "11.2.7", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.5.2", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "source-map-js": "^1.2.1" + } + }, + "node_modules/markdown-code-block-meta": { + "version": "0.0.2", + "license": "MIT", + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mathjax-full": { + "version": "3.2.1", + "license": "Apache-2.0", + "dependencies": { + "esm": "^3.2.25", + "mhchemparser": "^4.1.0", + "mj-context-menu": "^0.6.1", + "speech-rule-engine": "^4.0.6" + } + }, + "node_modules/mdast-util-definitions": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-math": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "longest-streak": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.1.0", + "unist-util-remove-position": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.27.1", + "license": "CC0-1.0" + }, + "node_modules/mhchemparser": { + "version": "4.2.1", + "license": "Apache-2.0" + }, + "node_modules/micromark": { + "version": "4.0.2", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-math": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "@types/katex": "^0.16.0", + "devlop": "^1.0.0", + "katex": "^0.16.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mj-context-menu": { + "version": "0.6.1", + "license": "Apache-2.0" + }, + "node_modules/mlly": { + "version": "1.8.2", + "license": "MIT", + "dependencies": { + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" + } + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/mlly/node_modules/pkg-types/node_modules/confbox": { + "version": "0.1.8", + "license": "MIT" + }, + "node_modules/mrmime": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "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/neotraverse": { + "version": "0.6.18", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/nlcst-to-string": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "license": "MIT" + }, + "node_modules/node-mock-http": { + "version": "1.0.4", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/obug": { + "version": "2.1.1", + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/ofetch": { + "version": "1.5.1", + "license": "MIT", + "dependencies": { + "destr": "^2.0.5", + "node-fetch-native": "^1.6.7", + "ufo": "^1.6.1" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "license": "MIT" + }, + "node_modules/once": { + "version": "1.4.0", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/oniguruma-parser": { + "version": "0.12.1", + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.5", + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.1", + "regex": "^6.1.0", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/p-limit": { + "version": "7.3.0", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.2.1" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-memoize": { + "version": "8.0.0", + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.1", + "type-fest": "^4.41.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sindresorhus/p-memoize?sponsor=1" + } + }, + "node_modules/p-queue": { + "version": "9.1.0", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^7.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "7.0.1", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-manager-detector": { + "version": "1.6.0", + "license": "MIT" + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "license": "MIT" + }, + "node_modules/parse-latin": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "@types/unist": "^3.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-modify-children": "^4.0.0", + "unist-util-visit-children": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "license": "MIT" + }, + "node_modules/pend": { + "version": "1.2.0", + "license": "MIT" + }, + "node_modules/piccolore": { + "version": "0.1.3", + "license": "ISC" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-types": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "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.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/pump": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/radix3": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "5.0.0", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "license": "MIT" + }, + "node_modules/rehype": { + "version": "13.0.2", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "rehype-parse": "^9.0.0", + "rehype-stringify": "^10.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-callouts": { + "version": "2.1.2", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.4", + "hast-util-from-html": "^2.0.3", + "hast-util-is-element": "^3.0.0", + "hastscript": "^9.0.1", + "unist-util-visit": "^5.0.0" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + } + }, + "node_modules/rehype-mathjax": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mathjax": "^0.0.40", + "hast-util-to-text": "^4.0.0", + "hastscript": "^9.0.0", + "mathjax-full": "^3.0.0", + "unified": "^11.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse": { + "version": "9.0.1", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "10.0.1", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-kroki": { + "version": "0.3.8", + "license": "MIT", + "dependencies": { + "is-plain-obj": "^4.1.0", + "kebab-case": "^2.0.2", + "markdown-code-block-meta": "^0.0.2", + "node-fetch": "^3.3.2", + "p-memoize": "^8.0.0", + "unist-util-visit": "^5.0.0" + }, + "engines": { + "node": ">=18.0.0 || ^16.13.0" + } + }, + "node_modules/remark-math": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-math": "^3.0.0", + "micromark-extension-math": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-smartypants": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "retext": "^9.0.0", + "retext-smartypants": "^6.0.0", + "unified": "^11.0.4", + "unist-util-visit": "^5.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext": { + "version": "9.0.0", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "retext-latin": "^4.0.0", + "retext-stringify": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-latin": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "parse-latin": "^7.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-smartypants": { + "version": "6.2.0", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-stringify": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rollup": { + "version": "4.59.0", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.6.0", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/semver": { + "version": "7.7.4", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/shiki": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "@shikijs/core": "4.0.2", + "@shikijs/engine-javascript": "4.0.2", + "@shikijs/engine-oniguruma": "4.0.2", + "@shikijs/langs": "4.0.2", + "@shikijs/themes": "4.0.2", + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/smol-toml": { + "version": "1.6.0", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/speech-rule-engine": { + "version": "4.1.2", + "license": "Apache-2.0", + "dependencies": { + "@xmldom/xmldom": "0.9.8", + "commander": "13.1.0", + "wicked-good-xpath": "1.3.0" + }, + "bin": { + "sre": "bin/sre" + } + }, + "node_modules/speech-rule-engine/node_modules/commander": { + "version": "13.1.0", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/style-to-js": { + "version": "1.1.21", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/svgo": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "commander": "^11.1.0", + "css-select": "^5.1.0", + "css-tree": "^3.0.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.1.1", + "sax": "^1.5.0" + }, + "bin": { + "svgo": "bin/svgo.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/tar": { + "version": "7.5.12", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/tinyclip": { + "version": "0.1.12", + "license": "MIT", + "engines": { + "node": "^16.14.0 || >= 17.3.0" + } + }, + "node_modules/tinyexec": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tsconfck": { + "version": "3.1.6", + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/type-fest": { + "version": "4.41.0", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ufo": { + "version": "1.6.3", + "license": "MIT" + }, + "node_modules/ultrahtml": { + "version": "1.6.0", + "license": "MIT" + }, + "node_modules/uncrypto": { + "version": "0.1.3", + "license": "MIT" + }, + "node_modules/undici": { + "version": "7.24.5", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "license": "MIT", + "optional": true + }, + "node_modules/unified": { + "version": "11.0.5", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unifont": { + "version": "0.7.4", + "license": "MIT", + "dependencies": { + "css-tree": "^3.1.0", + "ofetch": "^1.5.1", + "ohash": "^2.0.11" + } + }, + "node_modules/unist-util-find-after": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-modify-children": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "array-iterate": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-children": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unstorage": { + "version": "1.17.4", + "license": "MIT", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^5.0.0", + "destr": "^2.0.5", + "h3": "^1.15.5", + "lru-cache": "^11.2.0", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.5.1", + "ufo": "^1.6.3" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6 || ^7 || ^8", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/functions": "^2.2.12 || ^3.0.0", + "@vercel/kv": "^1 || ^2 || ^3", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/functions": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "7.3.1", + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.1.2", + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-beta.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/which-pm-runs": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/wicked-good-xpath": { + "version": "1.3.0", + "license": "MIT" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "license": "ISC" + }, + "node_modules/xxhash-wasm": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/yallist": { + "version": "5.0.0", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/yargs-parser": { + "version": "22.0.0", + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yocto-queue": { + "version": "1.2.2", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..9c3af3d --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "name": "website-ag", + "type": "module", + "version": "0.0.1", + "engines": { + "node": ">=22.12.0" + }, + "scripts": { + "dev": "astro dev", + "build": "astro build", + "preview": "astro preview", + "astro": "astro" + }, + "dependencies": { + "@astrojs/mdx": "^5.0.2", + "@iconify-json/lucide": "^1.2.98", + "@iconify-json/simple-icons": "^1.2.74", + "astro": "^6.0.8", + "astro-icon": "^1.1.5", + "rehype-callouts": "^2.1.2", + "rehype-mathjax": "^7.1.0", + "remark-kroki": "^0.3.8", + "remark-math": "^6.0.0" + } +} diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..696f14d7c10f6623acb7a9cfb8d6b7dfa038a4dd GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^TYxx~g9S+XEn_qWQY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fI+L~9Mj-Fdg0KF$oc;@dOhRCXbYCt5?)FK#IZ0z{pJ3z*yJFAjHVf%D}?P#6;V`z{>@3LmL19 literal 0 HcmV?d00001 diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..a1979ec8b15dda6aef0b22f71fff53adefc6e71d GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~k!2%>FDyQrOQY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fIlzt^7#Ug_SXh~uXd4(<85o4=#%iKy$jwj5OsmALLA~JVRGN`v3p{ literal 0 HcmV?d00001 diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..fe1795ed2e84168f50115f3ec305a146ded6d2a6 GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Ex!2%>F92B_;q*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9fnimzvJsHS zUgGKN%KnO3M3hS~GpTVuP)Nwr#WBR*55Fo~DCL3@nov7!`iZ76r;Ez~JfX=d#Wzp$PyGu0OW` literal 0 HcmV?d00001 diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..6c4d9e13ecc5a9017c3354aa66038b953bfbc489 GIT binary patch literal 3106 zcmeH_u?>JQ5Ce~NbP*GLfe>Rb5`!=e3qDR5fF>QbWW91qbuvs8>Wpr171)4S-uEef vi|t}n74H9ZIK&+r7-=9AzS_1J>Z-QQ_GqV$4cLGU*nkb#fDQcJKn}_S-|<~r literal 0 HcmV?d00001 diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..2f99376 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/og-image.png b/public/og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..b161c4bd23c7caaba876a72628262b44bd3382e0 GIT binary patch literal 380 zcmeAS@N?(olHy`uVBq!ia0y~yVA;UHz*NS_3=}Etdnpg3SkfJR9T^xl_H+M9WCijS zl0AZa85pY67#JE_7#My5g&JM}RU0rcyh>nTu$sZZAYL$MSD+10f-S%&#Fd9n~)J;=xl!C8<`)MX5lF!N|bKOxM6z*T^8m$k58r rz{=2E+rYrez~FDqwI?VVa`RI%(<*Um=uymz0C~dG)z4*}Q$iB}!X!(c literal 0 HcmV?d00001 diff --git a/src/assets/backgrounds/bubble-static.svg b/src/assets/backgrounds/bubble-static.svg new file mode 100644 index 0000000..b24d3e9 --- /dev/null +++ b/src/assets/backgrounds/bubble-static.svg @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/backgrounds/bubble.svg b/src/assets/backgrounds/bubble.svg new file mode 100644 index 0000000..3c31f1a --- /dev/null +++ b/src/assets/backgrounds/bubble.svg @@ -0,0 +1,226 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/backgrounds/curve-ripple-static.svg b/src/assets/backgrounds/curve-ripple-static.svg new file mode 100644 index 0000000..cb23942 --- /dev/null +++ b/src/assets/backgrounds/curve-ripple-static.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/backgrounds/curve-ripple.svg b/src/assets/backgrounds/curve-ripple.svg new file mode 100644 index 0000000..1059cbe --- /dev/null +++ b/src/assets/backgrounds/curve-ripple.svg @@ -0,0 +1,601 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/backgrounds/dual-ripples-static.svg b/src/assets/backgrounds/dual-ripples-static.svg new file mode 100644 index 0000000..6b419e9 --- /dev/null +++ b/src/assets/backgrounds/dual-ripples-static.svg @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/backgrounds/dual-ripples.svg b/src/assets/backgrounds/dual-ripples.svg new file mode 100644 index 0000000..0f60d46 --- /dev/null +++ b/src/assets/backgrounds/dual-ripples.svg @@ -0,0 +1,859 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/backgrounds/ripple-line-static.svg b/src/assets/backgrounds/ripple-line-static.svg new file mode 100644 index 0000000..8ea35a8 --- /dev/null +++ b/src/assets/backgrounds/ripple-line-static.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/backgrounds/ripple-line.svg b/src/assets/backgrounds/ripple-line.svg new file mode 100644 index 0000000..3e3b762 --- /dev/null +++ b/src/assets/backgrounds/ripple-line.svg @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/logo.svg b/src/assets/logo.svg new file mode 100644 index 0000000..2f99376 --- /dev/null +++ b/src/assets/logo.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components/BookNavigation.astro b/src/components/BookNavigation.astro new file mode 100644 index 0000000..09016f5 --- /dev/null +++ b/src/components/BookNavigation.astro @@ -0,0 +1,111 @@ +--- +interface Props { + prevUrl?: string; + prevTitle?: string; + nextUrl?: string; + nextTitle?: string; +} +const { prevUrl, prevTitle, nextUrl, nextTitle } = Astro.props; +--- +
+ +
+ + diff --git a/src/components/GlassContainer.astro b/src/components/GlassContainer.astro new file mode 100644 index 0000000..9b646e0 --- /dev/null +++ b/src/components/GlassContainer.astro @@ -0,0 +1,9 @@ +--- +interface Props { + class?: string; +} +const { class: className = '' } = Astro.props; +--- +
+ +
diff --git a/src/components/Navigation.astro b/src/components/Navigation.astro new file mode 100644 index 0000000..4d4b2e8 --- /dev/null +++ b/src/components/Navigation.astro @@ -0,0 +1,101 @@ +--- +const currentPath = Astro.url.pathname; +import Logo from "../assets/logo.svg"; +--- + + + + + + diff --git a/src/components/WelcomeTypewriter.astro b/src/components/WelcomeTypewriter.astro new file mode 100644 index 0000000..7bfc3b2 --- /dev/null +++ b/src/components/WelcomeTypewriter.astro @@ -0,0 +1,186 @@ +--- +--- + +
+ + +
+ + + + \ No newline at end of file diff --git a/src/content.config.ts b/src/content.config.ts new file mode 100644 index 0000000..3bbb024 --- /dev/null +++ b/src/content.config.ts @@ -0,0 +1,46 @@ +import { z, defineCollection, reference } from 'astro:content'; +import { glob, file } from 'astro/loaders'; + +const blogCollection = defineCollection({ + loader: glob({ pattern: "**/*.(md|mdx)", base: "./src/content/blog" }), + schema: z.object({ + title: z.string(), + summary: z.string(), + pubDate: z.date(), + }), +}); + +const portfolioCollection = defineCollection({ + loader: glob({ pattern: "**/*.(md|mdx)", base: "./src/content/portfolio" }), + schema: z.object({ + title: z.string(), + summary: z.string(), + tags: z.array(z.string()).optional(), + pubDate: z.date(), + }), +}); + +const bookChapters = defineCollection({ + loader: file("./src/content/book/chapters.json"), + schema: z.object({ + name: z.string(), + order: z.number(), + subtitle: z.string(), + }) +}); + +const bookCollection = defineCollection({ + loader: glob({ pattern: "**/*.(md|mdx)", base: "./src/content/book" }), + schema: z.object({ + chapter: reference("bookChapters"), + title: z.string(), + summary: z.string().optional(), + part: z.number(), + }), +}); + +export const collections = { + blog: blogCollection, + portfolio: portfolioCollection, + book: bookCollection, +}; diff --git a/src/content/blog/first-post.md b/src/content/blog/first-post.md new file mode 100644 index 0000000..e34c17a --- /dev/null +++ b/src/content/blog/first-post.md @@ -0,0 +1,9 @@ +--- +title: "Dummy Post" +summary: "Der Blog steht, jetzt fehlt noch Inhalt..." +pubDate: 2026-03-20 +--- + +## Hallo Welt + +Demnächst kommen hier hoffentlich ab und so mal Gedanken hin. diff --git a/src/content/book/chapters.json b/src/content/book/chapters.json new file mode 100644 index 0000000..8c28d4e --- /dev/null +++ b/src/content/book/chapters.json @@ -0,0 +1,7 @@ +{ + "grundlagen": { + "name": "Grundlagen", + "order": 0, + "subtitle": "Hier geht's los" + } +} \ No newline at end of file diff --git a/src/content/book/grundlagen/0-0_der_anfang.mdx b/src/content/book/grundlagen/0-0_der_anfang.mdx new file mode 100644 index 0000000..9295c7a --- /dev/null +++ b/src/content/book/grundlagen/0-0_der_anfang.mdx @@ -0,0 +1,84 @@ +--- +title: Einleitung +chapter: grundlagen +part: 0 +subtitle: Hallo Welt! +--- + +Jeder, der schonmal eine Programmiersprache lernen wollte, kennt diese zwei Worte. + +> "Hallo Welt!" + +Die Ausgabe dieser Zeichenfolge oder des englischen Äquivalents wird meist das Minimalbeispiel für eine Programmiesprache gezeigt. + +Aber was braucht es eigentlich dafür, diesen simplen Satz anzuzeigen? +Auf Papier wäre das ganze trivial, es braucht einen Stift und ein paar gekonnte Handbewegungen. +Doch ein Prozessor kennt keine Handbewegungen. Und unsere Digitaltechnik kennt auch keine Buchstaben oder das Konzept davon. +Das einzige, was es gibt, ist "an" (1), "aus" (0) und Logik, die diese Zustände verknüpft. +Gehen wir also durch, was alles überhaupt passieren muss, damit diese zwei Wörter auf dem Bildschirm erscheinen können: + +1. Wir müssen einen Programmcode schreiben, welcher aussagt, diese beiden Worte auszugeben. +2. Der Programmcode muss in ein Format kodiert werden, welches unsere Maschine lesen kann. +3. Der Maschine muss der Befehl gegeben werden, als nächstes unser kodiertes Programm auszuführen. +4. Die Ausgabe des Programmcode wird visuell auf dem Monitor angezeigt. + +Das klingt erstmal ganz einfach. +Aber sobald man etwas tiefer geht, stellen sich viele Fragen: + +- Wie kann ein Programm überhaupt beschreiben, dass Buchstaben ausgegeben werden, wenn nur Einsen und Nullen existieren? +- Wie kodieren wir denn etwas für eine CPU? Und in welchem Format? +- Wie und woher wird unser Programm den aufgerufen? +- Wie entscheidet sich, wann unser Programm ausgeführt wird? Unser Prozessor muss ja auch einen Desktop anzeigen und vieles mehr. +- Wie landen unsere Buchstaben auf dem Display? Und wie redet der Prozessor mit dem Display? +- ... + +Mich selbst fasziniert die Welt der Digitaltechnik und daher habe ich mich entschlossen, einfach mal meinen Abstieg ins Hasenloch schriftlich festzuhalten, für alle die folgen wollen. + +## Über den Autor + +Vielleicht sollte ich mich erst einmal vorstellen. +Hallo, ich bin Daniel. +Ich habe Informationssystemtechnik studiert und habe Programmieren auch schon vorher als Hobby genannt. + +Was habe ich für Qualifikationen, dass du ausgrechnet diese Seiten lesen solltest? +Nun – keine besonderen. +Ich habe keine Zertifikate, keine Lehrberechtigung und habe auch keine öffentlichen großen Projekte vorzuweisen, die man kennt. +Was ich allerdings habe, ist eine langjährige Leidenschaft für die verschiedensten Themen im Bereich Informatik. +Auf meiner [Startseite](/) hab ich auch mal versucht aufzulisten, in welchen Themengebieten ich mich schon verloren habe. +Einzig und allein das ist letzlich meine Motivation, dies hier anzugehen. + +Zum Programmieren lernen gibt es schon viele Ressourcen in jeder Sprache. +Warum noch eine schaffen? +Aus persönlichem Anreiz. +Und das Folgende ist auch eine rein persönliche Sichtweise. +Gerade im Bereich der Informatik ist mir schon häufig aufgefallen, dass Lernressourcen gerne zeigen, wie man etwas _macht_, aber viel zu selten, wie es _funktioniert_. + +Machen wir das mal an einem Beispiel, das greifbarer ist: +Ein Lied auf einem Klavier lernen und spielen kann prinzipiell jeder nach kurzer Zeit. +Um eigene Melodien zu kreieren, die gut klingen, braucht es aber Hintergrundwissen. +Tonalitäten, Taktarten, Akkorde – nur um mal die wenigen Begriffe in den Raum zu werfen, die ich kenne. +In einer Band muss man dann sogar Rücksicht auf andere Leute nehmen. +Und je mehr man sich mit dem Thema Musik und allem drumherum beschäftigt, desto besser wird man. + +Sehr ähnlich verhält sich damit dem Programmieren: +Ein Programm für sich zu schreiben, um bspw. eine Aufgabe zu automatisieren, geht super schnell und ist überhaupt nicht schwer, wenn man etwas Zeit reinsteckt. +Und selbst ohne Zeit ist die Wahrscheinlichkeit heuzutage hoch, dass man mit nettem Fragen eine KI dazu bekommt, den erforderlichen Code nebst Anwendungsdokumentation auszuspucken. +Wenn das eine einmalige Sache bleiben soll, kann man in diesem Moment auch aufhören. +Aber um programmieren zu lernen, muss das gewonnene Wissen auch verstanden und verinnerlicht werden. +Und dazu gehört auch zu verstehen, was der Code eigentlich an welcher Stelle macht. +Häufig ist es sogar wichtig zu wissen, was man explizit nicht machen sollte, besonders für sicherheitskritische Anwendungen. +Nur so kann man am Ende Code schreiben, der lesbar und wartbar ist und natürlich funktioniert. +Das ist besonders wichtig, wenn man nicht die einzige Person ist, die jemals mit diesem Code arbeitet. +Wenn man dann noch die Hintergründe versteht, wie so ein Prozessor oder ein Betriebssystem überhaupt funktionieren, hat man den praktischen Teil der Informatik eigentlich auch schon durchgespielt. +Dafür lohnt sich dann aber vielleicht doch schon das Studium. + +Mein Ziel für diesen Blog ist es, die Leser auf ihrem Wissensstand abzuholen. +Wenn kein Wissen da ist, kein Problem; dann fängt man einfach ganz vorn an. +Dich langweilt Gerede über Kontrollfluss und objektorientierte Programmierung? Vielleicht gibt's ja am Ende ein paar Themen, die dich interessieren. +Vor allem aber möchte ich, dass auch das Niveau des Textes auf einem greifbaren Level bleibt. +Alles perfekt präzise auszudrücken ist vielleicht akademisch besser, aber ich möchte hier praktische Informatik zeigen, keine Paper schreiben. + +## Bereit loszulegen? + +Während ich diesen ersten Eintrag schreibe, ist die ganze Seite noch im Aufbau. +Aber ich bin mir sicher, jemand baut hier eine schöne Navigation hin... diff --git a/src/content/book/grundlagen/0-1_einsen_und_nullen.mdx b/src/content/book/grundlagen/0-1_einsen_und_nullen.mdx new file mode 100644 index 0000000..5ebe878 --- /dev/null +++ b/src/content/book/grundlagen/0-1_einsen_und_nullen.mdx @@ -0,0 +1,224 @@ +--- +title: Einsen und Nullen +chapter: grundlagen +part: 1 +--- +import { Image } from "astro:assets"; +import transistor from "./assets/01-transistor.svg"; +import cmos from "./assets/02-cmos.svg"; + +Jap, wir fangen ganz von vorn an. + +Die meisten Computer-Produkte heutzutage sind Digitaltechnik. +Digital bedeutet in diesem Fall, dass alle Signale in unserem Gerät zwei Zustände haben können: an oder aus, 1 oder 0, _high_ oder _low_. +Letzteres kommt dabei aus der Elektrotechnik und bezieht sich auf die Spannung. +Denn auch das Spannungssignal kann bei unserer Digitaltechnik nur zwei Werte haben. + +Wie können denn solche einfachen Signale so komplexe Routinen bilden? + +> [!info] +> Der eben gelesene Abschnitt ist in der modernen Technik natürlich stark vereinfacht. +> Für die grundlegende Vorstellung ist es aber komplett ausreichend und wahr genug. + +## Zahlen + +Normalerweise benutzen wir für unsere Zahlen die Ziffern 0-9. +Und weil das insgesamt zehn Ziffern ergibt und Wissenschaft sich gerne bei Griechisch und Latein borgt, nennen wir das ganze Dezimalsystem. + +Bei unseren Einsen und Nullen können wir natürlich aber nur die Ziffern 0-1 benutzen. +Das nennt man dann Binärsystem. + +Grundsätzlich bleiben die Rechenregeln gleich: +Wir zählen von 0 bis 9 aufwärts und wenn wir 9 + 1 rechnen wollen, gibt es einen Überlauf. +Wir schreiben dann eine 1 vorn hin und fangen hinten wieder mit der 0 an - eine 10 ergibt sich. +Analog dazu das Binärsystem. +Wir zählen 0, 1 und 1+1 ergibt dann einen Überlauf und wir kommen auf 10. + +> [!warning] +> Wir reden hier erstmal nur von positiven Ganzzahlen. +> Wie negative Zahlen gehandhabt werden, kommt später. +> Gleitkommazahlen sind nochmal ein ganz anderes Kaliber. + +Wie wir jetzt schon sehen, ist 2 im Dezimalsystem (folgend $2_{dez}$) äquivalent zu 10 im Binärsystem (folgend $10_{bin}$). +Jede Zahl des Dezimalsystems können wir als Binärzahl darstellen und andersrum. + +## Logik + +Wenn wir in der Informatik von Logik reden, ist dies deutlich elementarer gemeint, als die im Alltag benutze Logik. +Logik ist hier ein stumpfer Teil der Mathematik. + +Anfangs soll uns die sogenannte _boolsche_ Logik interessieren. +Diese legt Rechenregeln für das Rechnen mit _wahr_ und _falsch_ fest. +Klingt komisch, aber sobald wir wahr mit 1 und falsch mit 0 ersetzen, sieht es plötzlich wieder nach Mathe aus. + +Wie sehen diese Regeln nun aus? +Nutzen wir wieder mal eine Analogie für die Vorstellung. +Wir wollen für unser morgiges Frühstück einkaufen. + +1. "Bring bitte Eier **und** Milch mit." - Unsere Aufgabe ist nur erledigt, wenn wir beides mitbringen. Bringen wir nur eins oder keins mit, müssen wir nochmal los einkaufen. +2. "Bring bitte Gouda **oder** Edamer mit." - Wir können eins von beidem mitbringen oder beides, in jedem Fall ist der Auftrag erfüllt. +3. "Wir brauchen noch **entweder** Vollkornbrot **oder** Toast." - Beides wäre zu viel. Nur genau eins von beiden wollen wir haben. +4. "Bring **nicht** schon wieder Süßigkeiten mit!" - Hier ist unsere Aufgabe erfüllt, wenn wir etwas nicht tun. +5. "Könntest du noch Orangensaft oder Apfelsaft mitbringen? Nur wenn du willst, Hauptsache **nicht beides**." - Der einzige Weg hier den Auftrag nicht zu erfüllen, ist beides mitzubringen. +6. "Ich möchte **weder** Müsli, **noch** Joghurt auf dem Tisch sehen!" - Keines der beiden Sachen darf eingekauft werden, sonst schlägt unser Einkaufsauftrag fehl. + +Klingt dich erstmal nach einer soliden Einkaufsliste. +Und ohne es zu wollen, benutzen wir hier boolsche Mathematik. + +Schauen wir uns das doch mal am ersten Beispiel an: + +| Eier mitgebracht | Milch mitgebracht | Einkauf erfolgreich (Eier **und** Milch) | +|------------------|-------------------|---------------------| +| nein/falsch | nein/falsch | nein/falsch | +| nein/falsch | ja/wahr | nein/falsch | +| ja/wahr | nein/falsch | nein/falsch | +| ja/wahr | ja/wahr | ja/wahr | + +Was wir hier genutzt haben, ist eine Wahrheitstabelle. +Sie gibt alle Kombinationen unserer Eingangswerte und die zugehörigen Ausgangswerte wieder. +In der Tabelle sehen wir ganz gut, wie die Und-Verknüpfung funktioniert. + +Zurück zur Mathematik. +Statt unseres konkreten Beispiels, nutzen wir doch etwas akademischeres: + +- $a$ und $b$ als Eingangswerte +- $\land$ statt immer "und" zu schreiben +- $1$ für ja/wahr +- $0$ für nein/falsch + +| $a$ | $b$ | $a \land b$ | +|-----|-----|-------------| +| $0$ | $0$ | $0$ | +| $0$ | $1$ | $0$ | +| $1$ | $0$ | $0$ | +| $1$ | $1$ | $1$ | + +Wow, sieht direkt viel krasser aus, ist aber noch genau das gleiche wie vorher! +Im Englischen heißt die Operation übrigens auch einfach "and". + +Kommen wir doch zu den anderen Beispielen. + +Als nächstes steht "Gouda **oder** Edamer" an. +Ob wir eins oder beides mitbringen führt immer zu einem erfolgreichen Einkauf, nichts mitzubringen nicht. +Für "oder" (engl. "or") wollen wir das Symbol $\lor$ benutzen. +Somit ergibt sich auch gleich folgende Wahrheitstabelle. + +| $a$ | $b$ | $a \lor b$ | +|-----|-----|------------| +| $0$ | $0$ | $0$ | +| $0$ | $1$ | $1$ | +| $1$ | $0$ | $1$ | +| $1$ | $1$ | $1$ | + +Oh übrigens, lustige Sache – die Spalten $a$ und $b$ sehen immer gleich aus. +Schließlich sind das alle möglichen Kombinationen der Werte und damit müssen wir sie nicht ändern. + +Jetzt der Fall "**entweder** Vollkornbrot **oder** Toast", wo nur genau eine Sache mitgebracht werden darf. +Das ganze nennt man auch "**exklusives oder**" (engl. "exclusive or" → "xor"). +Als Symbol dafür wollen wir $\veebar$ benutzen. + +| $a$ | $b$ | $a \veebar b$ | +|-----|-----|---------------| +| $0$ | $0$ | $0$ | +| $0$ | $1$ | $1$ | +| $1$ | $0$ | $1$ | +| $1$ | $1$ | $0$ | + +Langsam wird klar, wie dieser ganze Logik-Kram funktioniert, oder? +Sieht aus wie Magie, mit genug Erklärung kann das aber jeder. + +Für das nächste Beispiel müssen wir aus dem gewohnten Umfeld ausbrechen. +Warum? +Weil wir nur eine Bedingung haben: "**nicht** Süßigkeiten mitbringen". +Wenn wir etwas nicht machen, sind wir erfolgreich. +Effektiv drehen wir unsere Bedingung des Mitbringens einfach um. +Dies hat viele Namen, normalerweise wird es im deutschen mit "**nicht**" oder "**invertiert**" bezeichnet, im Englischen ist es dann "not" und "inverted". +Es gibt auch mehrere Varianten zur Kennzeichnung: $\lnot$, $\sim$ und auch $!$ bezeichnen alle dasselbe. +Eine weitere Variante ist ein vertikaler Strich über dem Term, um ihn zu negieren (also $\overline{(\text{Term})}$). +Im Folgenden nutzen wir immer die letzte Variante. +Eine Wahrheitstabelle gib es natürlich auch, wenn auch kleiner: + +| $a$ | $\lnot a$ | +|-----|-----------| +| $0$ | $1$ | +| $1$ | $0$ | + +Weiter geht's mit "Orangensaft oder Apfelsaft, **nicht beides**". +Interessant, wir kennen sowohl ein Symbol für "beides" (und) und "nicht". +Und an diesem Punkt lernen wir die ersten Kombinationen. +Diese hier nennen wir "**nicht und**" (engl. "not and" → "nand") und wie schon beschrieben ist es die Kombination der Zeichen $\overline{(\text{Term})}$ und $\land$. + +| $a$ | $b$ | $\overline{a \land b}$ | +|-----|-----|---------------| +| $0$ | $0$ | $1$ | +| $0$ | $1$ | $1$ | +| $1$ | $0$ | $1$ | +| $1$ | $1$ | $0$ | + +Und als allerletztes betrachten wir das "**weder** Müsli, **noch** Joghurt". +Das ist etwas tricky formuliert, aber auch hier ist es eine Kombination aus nur zwei Symbolen. +Zum Spaß machen wir es doch andersrum, wir stellen zuerst die Wahrheitstabelle auf und schauen dann mal, was es sein könnte. +Wir wissen , dass wir nichts von beidem mitbringen sollen, ist auch nur eine Sache mitgebracht, war der Einkauf nicht ohne Fehler. +Tragen wir das doch mal genau so ein: + +| $a$ | $b$ | ? | +|-----|-----|-----| +| $0$ | $0$ | $1$ | +| $0$ | $1$ | $0$ | +| $1$ | $0$ | $0$ | +| $1$ | $1$ | $0$ | + +Probier doch mal, wie wir die Zeichen von Oben kombinieren können, um auf dasselbe Ergebnis zu kommen. + +Bist du auch auf $\overline{a \lor b}$ gekommen? +Oder hast du $\overline{a} \land \overline{b}$ rausbekommen? +Oha, es gibt also mehrere Lösungen! +Genauer gesagt kann man sogar logische Terme ineinander umwandeln, die wichtigste Umformungen hierfür sind die sogenannten [De-morgansche Gesetze](https://de.wikipedia.org/wiki/De-morgansche_Gesetze). + +Aber das geht jetzt zu weit. +Schweifen lieber kurz ab und danach geht es im nächsten Kapitel darum, wie wir mit Logik rechnen können. + +
+Abschweifung: Wie bekommen wir Logik in Strom? + +Wir reden die ganze Zeit über "einfache" Logik, aber man fragt sich nun, wie wir Strom dazu bekommen, dieser Logik zu folgen. + +Das ist gar nicht so schwer: Mithilfe von Transistoren. + +Okay, vielleicht muss ich doch etwas mehr erzählen. +Ein Transistor ist ein aktives elektrisches Bauelement. +Es gibt verschiedene Arten, aber zu Beginn schauen wir uns einen n-Kanal MOSFET an. +Im Normalfall hat dieser drei nutzbare Konnektoren und macht richtig interessante Sachen in Analogschaltungen, wie Verstärkung von Signalen wie Ton. +Aber analoge Sachen interessieren uns hier nicht. +Und dann wird es plötzlich viel einfacher. + +Betrachten wir den folgenden Schaltkreis: + +Ein n-Kanal MOSFET Transistor mit Eingang In an Source, a am Gate und Ausgang Out am Drain + +Gehen wir davon aus, dass wir am Eingang $In$ eine Spannung von 5V anlegen. +Solange an $a$ keine Spannung anliegt, ist der Transistor "aus" und es fließt kein Strom zum Ausgang $Out$. +An $Out$ liegt also 0V an. +Also das behaupte ich jetzt einfach mal, in Wirklichkeit ist der Knoten gerade in "Schwebe", also undefiniert. + +Sobald wir aber am Gate $a$ auch eine Spannung von 5V anlegen, "schaltet" der Transistor durch und es fließt Strom von $In$ zu $Out$. +Wenn wir den Transistor und unsere Spannungen gut wählen, liegt an $Out$ dann auch fast genau 5V an. +Wenn wir nur damit jetzt ein Und-Gatter bauen wollen, brauchen wir nur noch einen zweiten Transistor. + +Um den Ausgang nicht in Schwebe zu lassen, können wir bei der sogenannten CMOS-Technik (Complementary Metal-Oxide-Semiconductor) noch einen p-Kanal MOSFET hinzufügen. +Dieser funktioniert genau andersrum: Wenn am Gate eine Spannung anliegt, ist der Transistor aus, wenn keine Spannung anliegt, ist er an. +Dadurch ist dann unser Ausgang immer definiert. +Hier nochmal als Schaubild: + +Eine CMOS-Schaltung mit a und b als Eingänge, die ein Und-Gatter bilden. + +Statt je nachdem, ob bei $a$ und $b$ Spannung anliegt, fließt der Strom von "oben" oder "unten" durch die Transistoren und unser $Out$ nimmt die Spannung von $High$ oder $Low$ an. +$High$ und $Low$ sind dabei die Spannungen, die für 1 und 0 stehen. +Was genau die zugehörigen Spannung ist, hängt vom jeweiligen System ab. +Die Spannungen sind so zu wählen, dass sie von den Transistoren sicher erkannt werden können. + +Aber gut, jetzt haben wir schon ein Und-Gatter. +Man kann sich nun selbst überlegen, wie die anderen Gatter mit Transistoren aufgebaut werden können. +Dazu noch der Hinweis: Wir können auch Signale in CMOS sehr einfach invertieren. +Einfach den p-Kanal Transistor an High und den n-Kanal Transistor an Low anschließen. +
diff --git a/src/content/book/grundlagen/0-2_einmal_zahlen_bitte.mdx b/src/content/book/grundlagen/0-2_einmal_zahlen_bitte.mdx new file mode 100644 index 0000000..392db4d --- /dev/null +++ b/src/content/book/grundlagen/0-2_einmal_zahlen_bitte.mdx @@ -0,0 +1,151 @@ +--- +title: Einmal Zahlen bitte! +chapter: grundlagen +part: 2 +--- + +Bevor wir jetzt anfangen können zu rechnen, brauchen wir natürlich Zahlen. +Und zwar mehr als nur 0 und 1. +Also schauen wir uns mal an, wie wir Zahlen im Binärsystem darstellen können. + +## Positive Zahlen +Im Dezimalsystem, also dem Zahlensystem, das wir im Alltag benutzen, haben wir zehn Ziffern: 0 bis 9. +Im Binärsystem gibt's aber nur zwei Ziffern: 0 und 1. +Interessanterweise kann man alle Prinzipien unseres Dezimalsystems auch im Binärsystem anwenden. +Was bedeuted das? + +Zählen wir erstmal hoch. 0, 1, 2, ..., 9, und jetzt? +Wir haben ja nur die Ziffern 0 bis 9. +Also zählen wir die Stelle vor der 9 einmal hoch und fangen neu an. 09 wird also zu 10. +Ok, ich schwöre wir sind nicht im Kindergarten und das ganze hat einen tieferen Sinn! + +Machen wir doch das gleiche im Binärsystem +Wir zählen also: 0, 1, und jetzt? +Jetzt machen wir das gleiche: Wir zählen die Stelle vor der 1 hoch und fangen neu an. 01 wird also zu 10. + +Was in unserem Dezimalsystem eine 2 ist, ist binär ausgedrückt also eine 10. +Und so können wir natürlich weiter zählen. + +| Dezimal | Binär | +|---------|-------| +| 0 | 0 | +| 1 | 1 | +| 2 | 10 | +| 3 | 11 | +| 4 | 100 | +| 5 | 101 | +| 6 | 110 | +| 7 | 111 | +| 8 |1000 | +| ... | ... | + +Das Prinzip sollte klar sein. + +Aber zum Umrechnen wollen wir ja nicht immer hochzählen müssen bis wir zufällig die richtige zahl finden. +Natürlich gibt es aber Umrechnungsformeln, die wir benutzen können. + +### Umrechnung Binär zu Dezimal +Um eine Binärzahl in eine Dezimalzahl umzuwandeln, können wir jede Stelle der Binärzahl mit der entsprechenden Potenz von 2 multiplizieren und die Ergebnisse addieren. +Ihh, das klingt nach Mathe. +Aber so schwierig ist es nicht. +Nehmen wir zum Beispiel die Binärzahl $1101$. + +| Stelle | Wert der Stelle | Potenz von 2 | Berechnung | +|--------|-----------------|---------------|------------------| +| 3 | 1 | $2^3 = 8$ | $1 * 8 = 8$ | +| 2 | 1 | $2^2 = 4$ | $1 * 4 = 4$ | +| 1 | 0 | $2^1 = 2$ | $0 * 2 = 0$ | +| 0 | 1 | $2^0 = 1$ | $1 * 1 = 1$ | +| | | | $8 + 4 + 0 + 1 = 13$ | + +Was hier schon auffällt, dass wir die Stellen von rechts nach links durchnummerieren, beginnend bei 0. +Das können wir übrigens auch im Dezimalsystem machen. + +$42 = 4 * 10^1 + 2 * 10^0 = 4 * 10 + 2 * 1 = 40 + 2 = 42$ + +Die händische Umrechnung ist in der Theorie ganz einfach, praktisch ist es natürlich bei großen Zahlen etwas umständlich. +Daher lasst ihr am besten einen Computer die Umrechnung machen. +Der kennt das schon. + +### Umrechnung Dezimal zu Binär +Um eine Dezimalzahl in eine Binärzahl umzuwandeln, können wir die Zahl durch 2 teilen und den Rest notieren. +Wir wiederholen diesen Vorgang mit dem Ergebnis der Division, bis das Ergebnis 0 ist. +Die Binärzahl ergibt sich dann aus den notierten Resten, gelesen von unten nach oben. +Das klingt doch schon wieder so kompliziert... + +Ist es aber auch nicht, ebenfalls nur aufwendig. + +Nehmen wir zum Beispiel die Dezimalzahl 13 von oben und rechnen wieder zurück: + +| Division | Ergebnis | Rest | +|----------|----------|------| +| $13 / 2$ | 6 | 1 | +| $6 / 2$ | 3 | 0 | +| $3 / 2$ | 1 | 1 | +| $1 / 2$ | 0 | 1 | + +Die Reste von unten nach oben gelesen ergeben die Binärzahl $1101$. + +Auch hier gilt wieder: Probiert es gern mal aus, aber bei großen Zahlen lasst lieber den Computer die Arbeit machen. + +### Wo hoch kann ich gehen? + +In PCs arbeiten wir im Normalfall mit einer festen Anzahl an Bits für eine Ganzzahl. +Je nach Definition im Code kann das unterschiedlich lang sein, aber im Normalfall hat man die Auswahl aus 8, 16, 32, 64 und vielleicht sogar 128 Bit. +Die höchste Zahl in der jeweiligen "Feldbreite" ist dann natürlich die, wo alle Bits auf 1 gesetzt sind. +Also für z.B. 8 Bit: $11111111_2 = 255_{10}$ +Zusammen mit der 0 sind das also $256$ verschiedene Zahlen, die man darstellen kann. + +Man kann diese beiden Werte auch ganz einfach berechnen: +- Die Anzahl der darstellbaren Zahlen (inkl. 0) ist $2^n$, wobei $n$ die Anzahl der Bits ist. +- Die höchste Zahl ist $2^n - 1$, wobei $n$ die Anzahl der Bits ist. + +> [!info] Anzeige des Zahlenraums +> Damit wir nicht durcheinanderkommen, wenn ich mal irgendwo eine Hundert schreibe (Ist es eine $100$? Oder doch $4$?) benutzen wir kleine Hinweise an den Zahlen. +> $10_{10}$ ist eine Zehn im "normalen" Dezimalsystem und wäre binär dargestellt eine $1010_2$. +> $10_2$ muss man wiederum binär lesen und kommt so auf eine Zwei. +> Diese Schreibweise wird ab jetzt häufiger vorkommen, um Missverständnisse zu vermeiden. + +## Negative Zahlen +Bisher haben wir nur positive Zahlen betrachtet. +Wie sieht es aber mit negativen Zahlen aus? +Im Alltag im Dezimalsystem schreiben wir einfach ein Minuszeichen vor die Zahl. +Und das können wir natürlich auch vor unsere Binärzahlen schreiben - aber der PC kann nur 0 und 1, der kann kein Minus. + +Um trotzdem negative Zahlen darstellen zu können, benutzen Computer das sogenannte Zweierkomplement. +Das haben sich ein paar schlaue Köpfe ausgedacht und es ist cool, weil unsere normalen Rechenregeln für Addition und Substraktion weiterhin funktionieren. + +Eine Zahl im Zweierkomplement darzustellen funktioniert so: +1. Man nimmt die Binärdarstellung der positiven Zahl +2. Man invertiert alle Bits (0 wird zu 1 und 1 wird zu 0) +3. Man addiert 1 zur invertierten Zahl + +Schritt 2 ist tricky, weil man etwas bedenken muss: Vor der Zahl gibt es eine feste Anzahl an Bits, die alle 0 sind. +Im Zweierkomplement muss unser Zahlenraum (in Bit angegeben) als begrenzt sein und berücksichtig werden. +Nehmen wir also an, wir arbeiten in einem 8-Bit-System. + +Nehmen wir zum Beispiel die Zahl $-13$: +1. Die Binärdarstellung von $13_{10}$ ist $00001101_2$ +2. Invertieren wir alle Bits: $11110010_2$ +3. Addieren wir $1$: $11110010_2 + 1 = 11110011_2$ + +Also ist die Darstellung von $-13$ im Zweierkomplement $11110011_2$ (in einem 8-Bit-System). + +Die Rechnung zurück ist übrigens exakt gleich. +Nehmen wir also die Zahl $11110011_2$ von eben: +1. Invertieren wir alle Bits: $00001100_2$ +2. Addieren wir $1$: $00001100_2 + 1 = 00001101_2$ +3. Die Binärdarstellung $00001101_2$ ist $13_{10}$ im Dezimalsystem, also ist die ursprüngliche Zahl $-13$. + +Woher wissen wir nun, ob eine Zahl im Zweierkomplement positiv oder negativ ist? +Wir schauen uns einfach das höchstwertige Bit (das ganz links) an. +Wenn es eine $0$ ist, ist die Zahl positiv, wenn es eine $1$ ist, ist die Zahl negativ. +Damit haben wir quasi ein Minus vor die Zahl geschrieben. +Man spricht im englischen auch von "sign bit" und nennt Ganzzahlen mit Vorzeichen "signed integer". +Das Gegenteil ist dann "unsigned integer". + +Jetzt haben wir aus einem 8-Bit-System nur noch 7 Bits für die Zahl selbst übrig, da die erste Stelle, ja das Vorzeichen angibt. +Durch das Nutzen von Vorzeichen, schränken wir die möglichen Zahlen ein. + +Während wir mit 8 Bit noch 255 positive Zahlen und die 0 darstellen konnten, sind es nun nur noch 127 positive Zahlen (0 bis 127) und die 0, aber auch 128 negative Zahlen (-1 bis -128). +Wenn wir später rechnen, müssen wir hier eher aufpassen: $127 + 1$ ist im Zweierkomplement $10000000_2$, und damit $-128$! diff --git a/src/content/book/grundlagen/0-3_addieren_mit_bits.mdx b/src/content/book/grundlagen/0-3_addieren_mit_bits.mdx new file mode 100644 index 0000000..438b524 --- /dev/null +++ b/src/content/book/grundlagen/0-3_addieren_mit_bits.mdx @@ -0,0 +1,236 @@ +--- +title: Addieren mit Bits +chapter: grundlagen +part: 3 +--- + +Nachdem wir zuletzt geklärt haben, wie wir Einsen und Nullen mit Logikgattern darstellen können, wollen wir uns jetzt anschauen, wie wir mit diesen Bits rechnen können. +Und das ist einfacher, als man vielleicht denkt. + + +## Addieren mit 1 Bits +Schauen wir uns zuerst an, wie eine simple Addition mit einer Stelle funktioniert. + +| $a$ | $b$ | $a + b$ | +|-----|-----|---------| +| $0$ | $0$ | $0$ | +| $0$ | $1$ | $1$ | +| $1$ | $0$ | $1$ | +| $1$ | $1$ | $10$ | + +Nun, bis jetzt haben wir nur mit einzelnen Bits gerechnet, aber das Ergebnis von 1 + 1 ist 10, also zwei Bits. +Darum machen wir uns gleich Gedanken. +Aber wenn man nur die hinteren Stellen betrachtet, fällt etwas auf: + +**Die Addition von $a$ und $b$ entspricht genau der Funktion eines XOR-Gatters.** + +Und wenn wir uns den Übertrag ansehen, der im Fall von 1 + 1 entsteht, sehen wir, dass dieser genau dann 1 ist, wenn sowohl $a$ als auch $b$ 1 sind. + +**Der Übertrag entspricht genau der Funktion eines UND-Gatters.** + +Am Ende können wir also sagen, dass eine Addition von zwei Bits $a$ und $b$ folgendes ergibt: +- Das Ergebnis-Bit ist $a$ XOR $b$. +- Der Übertrag ist $a$ UND $b$. + +Wenn wir das nun als Schaubild darstellen, sieht das so aus: + +```mermaid +%%{ init: { 'flowchart': { 'curve': 'linear' }, 'theme': 'dark' } }%% +flowchart TD + A@{ shape: circle, label: "a" } --> XOR1[XOR] + B@{ shape: circle, label: "b" } --> XOR1 + XOR1 --> S@{ shape: dbl-circ, label: "Summe\ns" } + + A --> AND1[AND] + B --> AND1 + AND1 --> C@{ shape: circle, label: "Übertrag\nc" } +``` + +Damit können wir schon die Binärzahlen mit einer Stelle addieren! + +Nun haben wir aber vielleicht auch gigantische Zahlen, wie 4 oder 7! +Dafür brauchen wir mehr als ein Bit. +Aber das Prinzip bleibt das gleiche. +Nur, dass wir nun auch noch den Übertrag beachten müssen. + +Aber halb so wild, denn was macht man mit einem Übertrag im normalen schriftlichen Addieren? +Man addiert ihn einfach zur nächsten Stelle dazu! +Machen wir das also auch hier. +Statt nur $a$ und $b$ zu addieren, addieren wir nun $a$, $b$ und den Übertrag $c_{in}$ der vorherigen Stelle: + +| $a$ | $b$ | $c_{in}$ | $s$ | $c_{out}$ | +|-----|-----|----------|-------|-----------| +| $0$ | $0$ | $0$ | $0$ | $0$ | +| $0$ | $0$ | $1$ | $1$ | $0$ | +| $0$ | $1$ | $1$ | $0$ | $1$ | +| $0$ | $1$ | $1$ | $0$ | $1$ | +| $1$ | $0$ | $0$ | $1$ | $0$ | +| $1$ | $0$ | $1$ | $0$ | $1$ | +| $1$ | $1$ | $0$ | $0$ | $1$ | +| $1$ | $1$ | $1$ | $1$ | $1$ | + +Unser Schaltplan, sieht dann wieder genauso aus, nur dass wir jetzt noch einen weiteren Eingang für den Übertrag haben: + +```mermaid +%%{ init: { 'flowchart': { 'curve': 'linear' }, 'theme': 'dark' } }%% +flowchart TD + A@{ shape: circle, label: "a" } --> XOR1 + B@{ shape: circle, label: "b" } --> XOR1 + + XOR1[XOR] --> XOR2 + Cin@{ shape: circle, label: "c_in" } --> XOR2 + XOR2[XOR] --> S@{ shape: dbl-circ, label: "s" } + + A --> AND1 + B --> AND1 + AND1[AND] --> OR1 + + XOR1 --> AND2 + Cin --> AND2 + AND2[AND] --> OR1 + + OR1[OR] --> Cout@{ shape: dbl-circ, label: "c" } +``` + +Das Ganze nennt man dann einen Volladdierer. +Das vorher (ohne Übertragseingang) ist ein Halbaddierer. +Wir sehen hier auch, dass unser Volladdierer (FA) aus zwei Halbaddierern (HA) und einem ODER-Gatter besteht: + +```mermaid +%%{ init: { 'flowchart': { 'curve': 'linear' }, 'theme': 'dark' } }%% +flowchart TD + A0@{ shape: circle, label: "a" } --> HA1 + B0@{ shape: circle, label: "b" } --> HA1 + HA1[HA] -- s --> HA2 + Cin@{ shape: circle, label: "c_in" } --> HA2 + HA2[HA] --> s_0@{ shape: dbl-circ, label: "s" } + HA1 -- c --> OR + HA2 -- c --> OR + OR[OR] --> Cout@{ shape: dbl-circ, label: "c" } +``` + +> [!Info] +> Das ist ein Vorgeschmack darauf, wie es weitergeht - wir erdenken uns Baublöcke und kombinieren sie, um komplexere Funktionen zu bauen. +> Hier wird eben aus einfachen Logikgattern erst ein Halbaddierer und daraus dann ein Volladdierer. + +## Größere Zahlen addieren + +Normalerweise kommt ein Rechner auch in die Verlegenheit, mehr als ein Bit addieren zu müssen. +Auch hier können wir uns aber anschauen, wie wir das mit Stift und Papier machen. +Bei mehrstelligen dezimalen Zahlen rechnen wir von hinten nach vorn die einzelnen Stellen zusammen, wobei wir den Übertrag der vorherigen Stelle mit einbeziehen. +Und genau so machen wir das auch im Binären. + +Wenn wir nun also zwei 4-Bit-Zahlen addieren wollen, brauchen wir 4 Volladdierer, die hintereinander geschaltet und deren Überträge miteinander verbunden sind: + +
+```mermaid +%%{ init: { 'flowchart': { 'curve': 'linear' }, 'theme': 'dark' } }%% +flowchart TD + subgraph FA3 + A3@{ shape: circle, label: "a_3" } --> FA31 + B3@{ shape: circle, label: "b_3" } --> FA31 + FA31[FA] --> s_3@{ shape: dbl-circ, label: "s_3" } + FA31 -- c --> Cout0@{ shape: dbl-circ, label: "c_out" } + end + subgraph FA2 + A2@{ shape: circle, label: "a_2" } --> FA21 + B2@{ shape: circle, label: "b_2" } --> FA21 + FA21[FA] --> s_2@{ shape: dbl-circ, label: "s_2" } + FA21 -- c --> FA31 + end + subgraph FA1 + A1@{ shape: circle, label: "a_1" } --> FA11 + B1@{ shape: circle, label: "b_1" } --> FA11 + FA11[FA] --> s_1@{ shape: dbl-circ, label: "s_1" } + FA11 -- c --> FA21 + end + subgraph FA0 + Cin0@{ shape: circle, label: "c_in" } --> FA01 + A0@{ shape: circle, label: "a_0" } --> FA01 + B0@{ shape: circle, label: "b_0" } --> FA01 + FA01[FA] --> s_0@{ shape: dbl-circ, label: "s_0" } + FA01 -- c_0 --> FA11 + end +``` +
+ +> [!info] Nomenklatur +> Wie gerade schon gesehen, werden die Bits von rechts nach links durchnummeriert, beginnend mit 0. +> Das von hinten nach vorn zu machen hat gleichzeitig den Vorteil, dass die Nummerierung der Bits mit der Potenz von 2 übereinstimmt, die sie repräsentieren. +> Zu merken ist aber einfach nur: $a_0$ ist das niederwertigste Bit ganz rechts. + +Heraus kommt eine Form, die ein wenig aussieht wie ein Wasserfall, würde man es direkt nebeneinander rendern, käme würde der Übertrag eine Art "Welle" darstellen. +Daher nennt man diese Form auch Ripple-Carry-Adder, da der Übertrag von einem Volladdierer zum nächsten "rippelt". + +Aber was macht denn das c_in dort eigentlich noch? +Normalerweise hat man ja keinen Übertrag in der ersten Stelle, oder? +Prinzipiell richtig. +Beim Addieren ist dieser Eingang normalerweise auch 0, aber er hilft später noch richtig, wenn wir nicht nur addieren, sondern auch subtrahieren wollen. + +## Die Andere Richtung + +Subtrahieren müssen wir natürlich auch können. +Wie negative Zahlen dargestellt werden, haben wir im [vorherigen Kapitel](0-2_einmal_zahlen_bitte.mdx) schon geklärt, aber wie subtrahieren wir eigentlich? +Nun hilft uns das kompliziert aussehende Zweierkomplement, denn es stellt sich heraus, dass die Subtraktion von $b$ von $a$ genau der Addition von $a$ und dem Zweierkomplement von $b$ entspricht. +Das Zweierkomplement zu bilden ist nicht schwer und wird noch einfacher wenn, wir nun unseren Addierer mit $c_{in}$ haben. + +Grundsätzlich sieht die Mathe so aus: +$$a - b = a + (-b) = a + (\overline{b} + 1)$$ +Was jetzt auffällt ist das $+1$ am Ende. +Das ist genau das, was wir mit $c_{in}$ machen können, denn wenn wir $c_{in}$ auf 1 setzen, addieren wir genau die $1$, die wir brauchen. +An dem Punkt müssen wir gar nichts weiter tun, als unser $b$ nur zu invertieren und $c_{in}$ auf 1 zu setzen, um die Subtraktion durchzuführen. + +Und jetzt wird es wild: Das wird noch einfacher! +Wir können nämlich einfach vor jeden Eingang von $b$ ein XOR-Gatter setzen, das mit $c_{in}$ verbunden ist. +Wenn $c_{in}$ 0 ist, passiert nichts, wir addieren also normal. +Wenn $c_{in}$ aber 1 ist, wird jedes Bit von $b$ invertiert, was genau das ist, was wir brauchen, um die Subtraktion durchzuführen. + +Wer mag, kann sich das gern mal aufmalen, aber das Ergebnis ist ein Addierer, der sowohl addieren als auch subtrahieren kann, je nachdem, ob $c_{in}$ 0 oder 1 ist. + +## Achtung, Vorzeichen! + +Der letzt Satz des vorherigen Kapitels hat es schon angedeutet, aber hier müssen wir aufpassen, denn das Problem ist für eine ganze Menge Sicherheitslücken und Fehler verantwortlich: +Angenommen, ich rechne mit 8-Bit-Zahlen mit Vorzeichen und möchte $127 + 1$ rechnen? +Die Binärdarstellung von $127$ ist $01111111_2$. +Wenn ich nun 1 addiere, erhalte ich $10000000_2$, was im Zweierkomplement $-128$ entspricht. +Das ist natürlich nicht das, was wir erwartet haben, aber es ist das, was unser Addierer ausspuckt. +Das Ganze nennt man einen "Integer Overflow" und zusammen mit dem Underflow (wenn zwei negative Zahlen eine positive ergeben) ist er ein großes Problem, da es zu unvorhergesehenen Ergebnissen führen kann. + +Daher sollten wir immer Folgendes prüfen: +- Wenn wir zwei positive Zahlen addieren, sollte das Ergebnis positiv sein, sonst haben wir einen Overflow. +- Wenn wir zwei negative Zahlen addieren, sollte das Ergebnis negativ sein, sonst haben wir einen Underflow. + +Und die Behauptung ist: Wenn das Vorzeichen zweier Zahlen gleich ist, aber ungleich des Vorzeichens des Ergebnisses, dann ist ein Überlauf aufgetreten. + +Nehmen wir wieder an, wir sind im Bereich 8bit signed und stellen einmal die Tabelle auf, um das zu überprüfen: + +| $a_8$ | $b_8$ | $s_8$ | Overflow? ($o$) | +|-------|-------|-------|-----------| +| $0$ | $0$ | $0$ | Nein | +| $0$ | $0$ | $1$ | Ja | +| $0$ | $1$ | $0$ | Nein | +| $0$ | $1$ | $1$ | Nein | +| $1$ | $0$ | $0$ | Nein | +| $1$ | $0$ | $1$ | Nein | +| $1$ | $1$ | $0$ | Ja | +| $1$ | $1$ | $1$ | Nein | + +Das ist sogar gleich mal eine Übung in Logik, wie wir aus der Tabelle jetzt eine Formel für die Überlaufbedingung ableiten können. +Die Formel lautet: +$$o = (a_8 \land b_8 \land \lnot s_8) \lor (\lnot a_8 \land \lnot b_8 \land s_8)$$ + +Nun können wir sicher sein, dass wir immer die richtigen Ergebnisse bekommen, wenn wir die Überlaufbedingung überprüfen und entsprechend handeln, wenn sie erfüllt ist. + +Im nächsten Kapitel schauen wir uns an, wie wir aus diesem einfachen Rechner eine vollwertige Logikeinheit bauen können. + +
+Zusatzaufgabe: Multiplikation + +Etwas komplizierter, aber gar nicht so schwer, ist die Multiplikation. +Wer möchte kann sich an dieser Stelle gerne selbst mal überlegen, wie so etwas zumindest in der Theorie aufgebaut sein könnte. +Die simpelste Variante könnte so aussehen wie eine Treppe, wenn man es sich aufmalt. + +Ein Dividierer wiederum ist hochkompliziert... +
+ + diff --git a/src/content/book/grundlagen/0-4_voll_logisch.mdx b/src/content/book/grundlagen/0-4_voll_logisch.mdx new file mode 100644 index 0000000..d9e47a7 --- /dev/null +++ b/src/content/book/grundlagen/0-4_voll_logisch.mdx @@ -0,0 +1,7 @@ +--- +title: Voll Logisch! +chapter: grundlagen +part: 4 +--- + +Hier wird noch gebaut. \ No newline at end of file diff --git a/src/content/book/grundlagen/assets/01-transistor.json b/src/content/book/grundlagen/assets/01-transistor.json new file mode 100644 index 0000000..5b6cde0 --- /dev/null +++ b/src/content/book/grundlagen/assets/01-transistor.json @@ -0,0 +1,117 @@ +{ + "version": "0.1", + "components": [ + { + "type": "node", + "position": { + "x": 377.953, + "y": -377.953 + }, + "id": "nfet" + }, + { + "type": "rect", + "position": { + "x": 333.071, + "y": -377.953 + }, + "stroke": { + "opacity": 0 + }, + "size": { + "x": 23.622, + "y": 18.898 + }, + "text": { + "text": "a", + "showPlaceholderText": true + } + }, + { + "type": "wire", + "points": [ + { + "x": 377.953, + "y": -377.953 + }, + { + "x": 377.953, + "y": -407.055 + } + ], + "stroke": { + "width": "0.4pt" + }, + "directions": [ + "-|" + ] + }, + { + "type": "rect", + "position": { + "x": 377.953, + "y": -415.748 + }, + "stroke": { + "opacity": 0 + }, + "size": { + "x": 28.346, + "y": 28.346 + }, + "text": { + "text": "In" + } + }, + { + "type": "rect", + "position": { + "x": 377.953, + "y": -340.157 + }, + "stroke": { + "opacity": 0 + }, + "size": { + "x": 37.795, + "y": 28.346 + }, + "text": { + "text": "Out", + "showPlaceholderText": true + } + }, + { + "type": "node", + "position": { + "x": 377.953, + "y": -407.055 + }, + "id": "circ" + }, + { + "type": "node", + "position": { + "x": 377.953, + "y": -348.851 + }, + "id": "circ" + }, + { + "type": "node", + "position": { + "x": 340.914, + "y": -377.953 + }, + "id": "circ" + }, + { + "type": "node", + "position": { + "x": 377.931, + "y": -388.213 + }, + "id": "circ" + } + ] +} \ No newline at end of file diff --git a/src/content/book/grundlagen/assets/01-transistor.svg b/src/content/book/grundlagen/assets/01-transistor.svg new file mode 100644 index 0000000..9f2886f --- /dev/null +++ b/src/content/book/grundlagen/assets/01-transistor.svg @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/content/book/grundlagen/assets/02-cmos.json b/src/content/book/grundlagen/assets/02-cmos.json new file mode 100644 index 0000000..c6b116d --- /dev/null +++ b/src/content/book/grundlagen/assets/02-cmos.json @@ -0,0 +1,411 @@ +{ + "version": "0.1", + "components": [ + { + "type": "node", + "position": { + "x": 377.953, + "y": -377.953 + }, + "id": "nfet" + }, + { + "type": "rect", + "position": { + "x": 321.26, + "y": -349.606 + }, + "stroke": { + "opacity": 0 + }, + "size": { + "x": 23.622, + "y": 18.898 + }, + "text": { + "text": "a", + "showPlaceholderText": true + } + }, + { + "type": "wire", + "points": [ + { + "x": 377.953, + "y": -377.953 + }, + { + "x": 377.953, + "y": -407.055 + } + ], + "stroke": { + "width": "0.4pt" + }, + "directions": [ + "-|" + ] + }, + { + "type": "rect", + "position": { + "x": 368.504, + "y": -477.165 + }, + "stroke": { + "opacity": 0 + }, + "size": { + "x": 28.346, + "y": 28.346 + }, + "text": { + "text": "High" + } + }, + { + "type": "rect", + "position": { + "x": 401.575, + "y": -349.606 + }, + "stroke": { + "opacity": 0 + }, + "size": { + "x": 37.795, + "y": 28.346 + }, + "text": { + "text": "Out", + "showPlaceholderText": true + } + }, + { + "type": "node", + "position": { + "x": 377.953, + "y": -319.748 + }, + "id": "pfet" + }, + { + "type": "wire", + "points": [ + { + "x": 340.914, + "y": -377.953 + }, + { + "x": 333.071, + "y": -349.606 + } + ], + "stroke": { + "width": "0.4pt" + }, + "directions": [ + "|-" + ] + }, + { + "type": "wire", + "points": [ + { + "x": 340.914, + "y": -319.748 + }, + { + "x": 333.071, + "y": -349.606 + } + ], + "stroke": { + "width": "0.4pt" + }, + "directions": [ + "|-" + ] + }, + { + "type": "node", + "position": { + "x": 333.071, + "y": -349.606 + }, + "id": "circ" + }, + { + "type": "node", + "position": { + "x": 340.914, + "y": -349.606 + }, + "id": "circ" + }, + { + "type": "node", + "position": { + "x": 377.953, + "y": -387.402 + }, + "id": "circ" + }, + { + "type": "node", + "position": { + "x": 377.953, + "y": -309.921 + }, + "id": "circ" + }, + { + "type": "wire", + "points": [ + { + "x": 377.953, + "y": -319.748 + }, + { + "x": 377.953, + "y": -309.921 + } + ], + "stroke": { + "width": "0.4pt" + }, + "directions": [ + "|-" + ] + }, + { + "type": "rect", + "position": { + "x": 372.283, + "y": -223.937 + }, + "stroke": { + "opacity": 0 + }, + "size": { + "x": 26.457, + "y": 22.677 + }, + "text": { + "text": "Low", + "showPlaceholderText": true + } + }, + { + "type": "node", + "position": { + "x": 377.953, + "y": -349.606 + }, + "id": "circ" + }, + { + "type": "node", + "position": { + "x": 387.402, + "y": -349.606 + }, + "id": "circ" + }, + { + "type": "wire", + "points": [ + { + "x": 377.953, + "y": -349.606 + }, + { + "x": 387.402, + "y": -349.606 + } + ], + "stroke": { + "width": "0.4pt" + }, + "directions": [ + "-|" + ] + }, + { + "type": "node", + "position": { + "x": 377.953, + "y": -438.614 + }, + "id": "nfet" + }, + { + "type": "node", + "position": { + "x": 377.953, + "y": -448.819 + }, + "id": "circ" + }, + { + "type": "node", + "position": { + "x": 377.953, + "y": -467.717 + }, + "id": "circ" + }, + { + "type": "wire", + "points": [ + { + "x": 377.953, + "y": -438.614 + }, + { + "x": 377.953, + "y": -448.819 + } + ], + "stroke": { + "width": "0.4pt" + }, + "directions": [ + "-|" + ] + }, + { + "type": "node", + "position": { + "x": 377.953, + "y": -260.598 + }, + "id": "pfet" + }, + { + "type": "wire", + "points": [ + { + "x": 377.953, + "y": -289.701 + }, + { + "x": 377.953, + "y": -290.646 + } + ], + "stroke": { + "width": "0.4pt" + }, + "directions": [ + "-|" + ] + }, + { + "type": "wire", + "points": [ + { + "x": 377.953, + "y": -407.055 + }, + { + "x": 377.953, + "y": -409.512 + } + ], + "stroke": { + "width": "0.4pt" + }, + "directions": [ + "|-" + ] + }, + { + "type": "node", + "position": { + "x": 377.953, + "y": -250.394 + }, + "id": "circ" + }, + { + "type": "node", + "position": { + "x": 377.953, + "y": -231.496 + }, + "id": "circ" + }, + { + "type": "node", + "position": { + "x": 340.914, + "y": -260.598 + }, + "id": "circ" + }, + { + "type": "node", + "position": { + "x": 340.914, + "y": -438.614 + }, + "id": "circ" + }, + { + "type": "wire", + "points": [ + { + "x": 377.953, + "y": -260.598 + }, + { + "x": 377.953, + "y": -250.394 + } + ], + "stroke": { + "width": "0.4pt" + }, + "directions": [ + "-|" + ] + }, + { + "type": "rect", + "position": { + "x": 328.346, + "y": -444.094 + }, + "stroke": { + "opacity": 0 + }, + "size": { + "x": 14.173, + "y": 9.449 + }, + "text": { + "text": "b", + "showPlaceholderText": true + } + }, + { + "type": "rect", + "position": { + "x": 328.347, + "y": -264.567 + }, + "stroke": { + "opacity": 0 + }, + "size": { + "x": 14.173, + "y": 9.449 + }, + "text": { + "text": "b", + "showPlaceholderText": true + } + } + ] +} \ No newline at end of file diff --git a/src/content/book/grundlagen/assets/02-cmos.svg b/src/content/book/grundlagen/assets/02-cmos.svg new file mode 100644 index 0000000..4f5187c --- /dev/null +++ b/src/content/book/grundlagen/assets/02-cmos.svg @@ -0,0 +1,511 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/content/portfolio/assets/screenshot.jpg b/src/content/portfolio/assets/screenshot.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b94c635000a2c2ec346632800b2607e8393ab589 GIT binary patch literal 166718 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%0DM=8fLisb1)XChDQ-XIV;1qB$wp9 zSyXM*V?lBYF8AsI?W0+s zk|w4~TWt&Vmi!Q29a&j}XSKup`77{9f9SCrBY&lN2H9a-*lCYyE6S#RnrAQ`YBm<< z$Z<~1b9Qar%-PbSTyv#3JF+x6qGGpNH9dS?2$MT?$O>l!A?%%01fGUyI|$Ps^WfX8 zVnuaRV`EKKZOFl1NIjG{$?zKzoGSuLz!Vp4u(*ub!{n@THDu;xf#jEtG;`c=z(ikw zT1B3*L=0C9m%1dJhB~0l0MYNMGmzT|4|+X%?U%4@wbY@PFA2(-gmDk!h4qj5^21UA zbWPm)167FFT+pfpJ}K9q{o4|cubE&-U35b_n#`p5%Q#UH;43ITq6ro$C7!*g0TMSu ziY@B^qO#FUTThE@j3$LAHh3|e8^->OgGeL!4;J- z-qMrzUg@y;1$?5Tc4dRm;!DIaf9lpOw@yaG9rIA%K609AmY$iGf`$DA`Td^}Dci4} zZ%~K;-`Oca`5R#e#h}-1<6I~%JV8@vC>C^trz#1rZ@9fV44dA?4JoLQrtDC>d(p95 zhpn%-@}z8`KY!<`I;K&YN>FtZI39LGF7;}m)NP)=(LRfA3BF0|o>5_zIv=T7rEdp= z26?LefyK@%ja|fhpK%&;9_wn^+* zn?>xp$rY}RnJsOt-&yt3^zJD;eITEHrIq>wxz}l1Bjesxis@u}l+8U3Y|cUD2J!L= z*$Xrk&G6GUWH~58W{DNHYcotK>DS%nqNiae+$Zlcmd=dOmOf1=bU_8E(MffBvHC^( z3#XeTRC7L$-t%5GWH?lJj)?C+l(Ms!f00NRjJ`D-MmQ*q95Ix?SlxONhM%_PDkVv< zV5UnRSKg|r9@+<$%)Ww`cJC;Y^x)aR--tn(bn$Rl93xgNQx z65@aCpg@c8k`$uW%Bt26B#ZK1iLU}JK2H?g*z&V)S$B2Ysqz(60ziuN6z7P5oRk84 z=i~s1tDd{&2cPCYYIT~BI!Ceh)73aFO*e7X@gX1URvCn_idDlicXH5(VbzahiZqd` zm9@>$q%s8#Z~O5=mfGLgy9qoTNLa>8Rdg4IWuX>+0G+|dk4cV+885*`mfjfZH51rN z3Sxek7z{{i`Ez8^u;(Bv_WakiK$0L=H{~?{spn zc$GK{x}BD|CAHcnKOZ8K*V?xI78#E&-DDH*`A{_eBIa)U_}%@}2FAD9k+Kt8sOG1G zzQm+YC)qKZmovgUE{`hH#Wp3y%o{b8flOW&KbRdPGBl9=;nU0s4>fWRetBhj9XcBu zQ*S#3aK3O)n2@D9SiQ;MuA}_2<cjk9#tM&6fez#$FJ7lA6_*bK4S zhr+}?g*&ZalX40kk%JV8igeAJKHpAdCJns=B7+1SnJY>?%KN^xU(;r1>1PnpbqT30 zMD*N$tq4-Tuq*B351L!78N`{^6_LTdG~VXgkxvteac3iNq%F(sZE~&X?-lvVDEAan z4UL5`JsbJgkP)Z{7^&8)yj_-pFQTIUmE!e_h{UE%EP9d6q39Uj@7wlOyn|-hH^Lh= z9oHVOhIkmlrHob1z1{`Xomh{=%0|%8K)*=lbBqeMSfBk;;-!|zBVlz4;!H&efBYLU zFp1AOjez%@QhJlt8w+A-Y;jWEmEQo#R#tJ`Hv77RBtlY1mbP|lBi<)&c0=R1n#7pg zhq9`i_u9tbQK=>7FG#Vb`TK{64Vn~j^f!d?9EU5FDjqy*d)Zow6jeKF@gu`s+ppGU znkeZ}K?q+E)qgjn@V0)p#IJ=07cHzVin&;SY4N|~TvJoV*m(5Kz14`*lX5Ma)A#pp+?szQj8f|G`J}dQ zWJ8H^@OwU0bi9>>r*WX{1ZFjI5UP<7;GUU5LI|rq#89Qe&oj32Amn=u++@i8VtLFZ zCB-(~_}piUqAk?H@bvdcFrcMJjJed*8f5zI@C8`WHt0mbmMvjk z9CTeD&ifr^Af|Md5uv#2rG1dTN3~4_`Hy{SvLjTZu-9o=14D_KO27o;0SHDc8;Yp6 zcCQoswppI1OEm10%}d$7^NmOXxF~8ct^&SAz6K>d0AHZ~Q#9uz{GnII6LqFn&KKR= z1LB2I2{WVtFJO9Q_+V6AxE-M0g7*H)lahookN^2MjAZ@!2jrUh^W*9OAnbpp5)S3e zDoLmUDxCViExdB(2pNb&TJjT6ZCggFSs! zt3~fJm?mJ=024ms`KsI%caCo%Io0`3sp7y)ET>M^hzmOz&bJT;iEelG*X4lMR4HV& ztHj3`aNn5Kvs<6(Yyk2gKDJ_t+$f(jFHj_Q7=x)~uffgpVRK>r%y%~rj6R>Oe)~ik zDjn6RIrZpvqw(u0%;`u{4u*r!C$U$gM9G_P1GN5v%rH_b?QgLR>1hdVv%|;iS^Z;A zh?^d9U6{PeXfL&UhjzKO5?aav$9{le!zubb#-*M9?gGDfZmjEg zDaH2VU~Wsh=T6esOkLd@wT|7lN)AN!yFbg!K1h9xN(WNWoKN?JH^IuSPXLI}(Ng&Q3GU?#M zkl=z3^nQ8uBVSsiC%ux9%vRzWR*V&}_%mTCPHvU1kKh$Em)ZCka9hC0;oXjNp+)wH z#Ugq+$=Rrh?R}JRV;rZEpv`Prm`r8QPOO$ClS~2_Pflca$zAq z2w6;V0tu;zH%~h<^v+Ig`UGTgRI-&?z`Mhk9XwXN=3P^TQk|iX(9e^!@@~_Y9mw%3 z@{+3M9&?Pf!xqP4qVHJR_F=Ybb!bt1q!KK)OvNeyH)>&_83{nCodgr<_|$h8|DbRB zYK{%)%xgfWm&tl#8!J;8dgxRx989|(s+p|DjCYe!+7Le#FiUxb5fPnm^*=>;m~04h zUIacU7FdCIaC&I+sXpbd{xGroE#qdlB3%i2D=~)$^CvfMdYMViZCnN4tM@7>t*A$Ef(N#=b(NUU{ z@wZQ-Tjnqt_$uLO@v7Me+ARFC%sETVzo7gTy*~Tj9WLl1wYg@1$B0dOmp`xNE+dDy$;KO-_wE?OOr$>Qg`JSqiG!*UMy|0c>1~jjS z5C7Y|7FGd@;{R=48Nh~KkM!Qz1{UW%olw$ajOk&6lB4rlB5FP~Lh20bw?5kEWn#0@ z-r0=$&xtKD`C_#;nuB}@X-&+MbybioMs8vGmp(7Ak$0#aDh)@;pI zb@mS8FsH=|wt|vKyGoalu9UQ-bmwX19vSZfr3-vJ&b~ZtbZe>JRoUmxqKV6p?=@^&~B7-sNc#}$UlB?7A z8z0Q+lDr)~Vig)^bBSrf;WL9Z2tnu|#=a(+Bt|Mc&cNKX1WC1-pWvA~b4qL(PDrYn zf{-d^)i)@ZAupM8!g?BC*d+6qQP`qN86vWve2noCu!*iX86Q7pNCk>m9A{B?^}3Zn zc+9(y5gMm8czD0c=Cmw5gL~yZ5`Gnqofo zkz7}BEDk>M&1|aR_f_${d)W#C8p<@9I@QImVRPQu#@nTi$JEsn80onaSBF9*3L#zc zbukN**x#d(R;D(TJcKNbJ_0K=tBk=Oz}p9vS~&oyZb;Ry6iA&U&Oe9KD56&K_J8pV z6zK8L8qz}U=uDL-0Ur+J88JX;PND;@;ygpd$g?7@P35i%tI72|(vL9>{|PyT{4T7!Im@r51`3u6R$h*~ji zQ(PxtZ8QDHg?{YV43QsI6O8Jb0}!<4GGv_O$s5Jv=p~%7=#ZaZJ3Qq8l$SnZNe^gKp8Eq6$6vD=V z!vC)y_^-(HpV#MiEKYR}aZVs;09a(g1NHhJ$66Bb69t&lW{E&6B%T4JivbQqjG#Rr zu0WIwaA5Z+MEH+SXojR&gVNg%w>^GOrY>?@Px603+CWM}6c-Si(0@lAf_yc;_$T*A zAktO2=*_Hn#MdkGMlBwO!xri$&T@9{d_4haT|!RL$tr^wF}HDn$-rHo{GS^c7A%4k zE-Y=Kdgz+sN`6;4<i1&$EOd9HP(&I!T_iH z5MY6Q0k9N{Av*#;V@+Ma41$S$>6>@cp_@d=%Sq5pL*#MZnE{*Y$5&}_*tiECrjd8d zJoo&bML&`*VkHdhhiOA^KG`cAX9{Pr?4&rvDl*tCh+-AQk;WRX3|9RGvA!q?3nZQ~ z`~|%$e+ZrH$(8-c@AuYF4Bu6!1fnXeJoKDI@Dh3Edr0#VOOaaqELBMN>HoPZ_Nm!J z@a{yZJ?|-E*YCw&H7u{iNT5J(GAv859iHh4<+cB5NUdy#w(Tq2}F zW5r%^hOcIRUgGo@^uX5fKPN}~_B?vW*fRZy)$peP!Yh)gROp*a@4fh6l7*u?Kj`b~ zjOMVi(RL0Vcox#r{UE01>g6BCKxM?6%5(^P>cU_Z{2)WlN7p5= zf`0M3Q&7l(YjKQ3^o0YQR zF{opgz~Xew*iOKI+_K%gi*?VoM@9sbqGghCi0d@b#SPIU)`MvrK?9U<<8c0<5*F0i zt-du}_e_A%$Ijmyb-`XpKVZfSa)*ZJSk@A^G>zpL>aB<-5JF{WFq^yb`xmXJrSZ>f z<9jOS9~Hwnt$Okg8t-P;K)g}-kzOJf;f)s>%maM{;@$O>TM?FhG{$NJ35J!thQG{T01rDWzE(oLfki`JjgU~O)7xjYxb95z5*TLeqR)wxdG#}nk78kI*(YD~ha5%2{8AN!OT>CG)Lpqi$2My30^|5h#_c6kOE=@>h|9q>l7 zhek*zcugHPP>SnF!EXG;P>q{JHygWxeW&ViwEC#>Hg;U9A8$NK12LtCv~4+?n%9)5 zA1ZZLUUTtfyMosh2UO+5Td0Y*E&@g!+FUKQW%hJqe~`bOs-gbs)vc?~^W~!2#=bS+ z%y>en4lgt2fWcVyUA!R=T+)xN4?-wh!_};W>(6u{YmNW0lY{}c;SUx4QHit2B0?-N7{}X_Y}j+De?iLtuL(nhH8ZQV zBH69<;W}mPdBN{gQi*fe>maTL#%gnVRBC-PVOm=soeAOI>u(Rls>U(o+(^UGz0m2y zUfREuiNwv-Bk3WJ3ct;3;+;=^LMhWA!iv^9)b$Ce`EsLMQ>>*q(jbdu?=5zKRcxn| zP^FSYl#cO8RV{Ew6&XhLTd|c_lRiZI=T$%TBzY(IITz1S=7yN**0S^7@3#kT4A=-| zX6e5u(v-bxLScg87N@RN;KsD&%n*$E{!C?_Jt5nI!)v3Cm+N-Oz0)?V^#msZIhIOx0Mw!ue#kCCRe$Y(_iyHNB3KW_2$$C!LeLbE*~W*C-mD0)Brnx-H7Q=b1z- zOCWT1Ge$emtZXhtlHmZ1dkW;9V6Bp>B%5QEBA(sfZVul}VF;=6L;;dU81#zU*5+E?a37FHUN<$*tLovY&_uvj9> z`kelX-lu-xKCCp+hO8wzRTJ_?+Rp0DwoI0xhRRXV&{2%6v(=Q|RUH=tSI&8{h=sHd zz2XYjXPst+uUI}n3~N|%^`llpYh%d5vM_F<47T*36(%dG8+3O?o!3jTar}D3?3lKp zRqxwZ_Q4*?c7$>LHRrL~=*nET_p|HubunHZ_%f!-dk3zj)RYk!Fu_dwmy~=oA#t6G zx`sXDgfFOnL1ReUJ!XdW&+x`S5YLLc{E$j^p+DD`6ikgI-iw!0(_g+ICea8Ij#PU+Qt&j)x zbw1|dr~zXSp<>e*rFXTWPcAk+y7U_YY4nEren02O7KbbbhU;EoNpL^It!9j{KqmPy zgZq|5N|&0670b-s_)m;ul=a9dU8rX@`SS?&bOmq5t%ys~e$3Kg(_93zUEX>=XrXOt z+ZaXE%dN@=(z}G6;ya%GQH2a*iEs;VU9HaQviM2DxX9#gHWgZ{0=P&%esyIniRv*% zY@t8vLY@*JjR}GDWYrCDs(hM~e@6r4Q_TBoAQaGbRzdA3&LDXO7{Xm))eWaa4VpCd zs`__qP84QVDITBF*iLy#0-<1^!RFNaxgDz9h*z(uv6sAFV(c=GhmKG_G$t@>n;p+&`%vb>&3?ue`FFT~1svk_{{`)}V4YMd?VaBbiafB1|4*4u zjlryY(QqfYRmy#)+spUNgD4_Q9UGc$pm_ymy%R76lg0Xj{A>}OfIi}XulZf|Na%c( zqHv01pn&hDZG+EEy`a-pnVK8~br{1r6xQQC=~9{~-in!i9Wy!~rof*}8pYes z^l9^26FPc8vM6I)LZf4|BSz!MCZ)=bQcUq9pXDU+^LmN!3d$*0N&}5^6jIEx5QARs zqRqw3#RB1R$wuI-*XT0XxXu~~AQcV;#k#c!F`y5?|2q73_`y!JcqnxIWc^^|w!9<=T4yV}6oN-^97IzfAVNIx@Auhtib z<%4YdR0w}v656s}a1v4s1b*ejJu!hVZ?_+0lR!}LaA5R)Hj+m?j5DY>jnY!Hb$?UX zW&zVTrB~3Qm4740l0P^-#d4NE8irqcI3o*K`TUrX%*PoSOTEcy zXz)_BcHFw|b*PgoOA6TH%s(&ef;$Fk{r9;|7KM7Z;_eA@inHX&J?RyemrQ(zx|aoH=3YcmAH{tFVA zY1Ys>kv8lmL%5Dqcu}CZmGr0@5_n+rCkzIP#-wpe4II!ly?4VDYV`zo4WS)Vp~g@hH~-Q(A++2)Dbf~+quXkocH#ePD0 zLhk=i^q}B^!PIXSi{5d~qIz=t|FLwI0c|wj+YZGk#R?RM65NWrd+^}e;%>oRODXP9 z+}+*Xy|}x(yY$WT|Gi(6$!2DEcJ}O?`&>8Ts$>|3;7s#VwVsOTblnRbh%BE zk1DZZhyds=MJ35(ndJwFZlq^<68dxvpu~;tBhy?oc7O>dB`&4Teq!Ak{~Qw8Xn=ZR z{}C_Sf(=_d94i<9P*E9@UTTg3b!IVd|yy%kOEVMkAX_4}*vwwfk2@CjAvtpeqg^I!~ngu?u}IKFYHuqHZ@^I%2I zIvC7B!nD~=awML}^+iRIUA|?=Fe+Juc!%Ol?n%79ewt$)ea>1xbp2#a^K@xjxa~?B zi4HPr^LWguEhU*ZOfEqP0>VkaC;!<5@Wx4LX0T<*dulXp5h9v^R255Ppafg5GZN3_ ziS@BLQ{`H)fj@RRfV7T4Qbc;3JeUTNi~Oo-U4oVocj-6d|0NUV_G>bfg|rx(N0Wuq_QN^5gll)b;}mhq^jU7 zw1gBV&H!3tjY5Z^1|v>$2sI)c#}S4SZ9WwJw~GMtHwW7p1%)44k&HwPO+A?UK^^r{ z{`(lZ8Gu5^F!!P8zkPzD|FlkErEI8L3UwB0O+E!q0Vw6oJnd^rkx=_W`c7+?EdTiso>DBZ~$J;A12exdeqg1t4 z+?@C}(-fsMcY97hqwcM2>uPa31EjF3kwh2j2H(y54jG+rhV-%N9VgaUoRofN_{-Qx z&;O)5M94?`vg%d;mtsz5pp<```>Bs5&)`ohoD%C`G51AT;v>CVlCmOA8af0W)#}6g z`c=51<6^@h8nL~*^rYOQ*+BDTd@CAN)#fOlRlAj9s^YKxb?&Ty-kRNBK0aF8>% z7Em~bE(g6C>@UUpzXx|SV!|wDCh;++n$fb{a=f-R`1m14Z$12G99u88;Q&uJ&BlMe zc3t^4`7tWsj!|&IGYL!~oKX>uhn|G@Wcg5+@2FNccHPXPZ5BU4$}1yS>cQ}BTeuN7 z4v4HQ%%#*cyiq{6;_pnXqdslgIj@h~Xr+kWnaZ{Oz#Bjzd+E%DGi>_r}+QE`y}DIv;bGAh$McCMbv#A|LoW zV4&#&>xpsJIZ_}A%%y%-pet81q8DXe+Mt5BQGjr_#7xtGZQE1lsQ69$PxacGc~>@mrBc%i-U}e6V#@Dp;QeCQ6e^L^&V1f32?GidD0{aF7_L_0Ylj* z2)F$6tQP1^iYy{19K^`Jra5Aj1)lpOwzRO)nk`wV+IRoI%p_xf8;5^wF{%VRO)Nivw;6da zblSgG*z!4dT}JR@ySgoiYFr>>eWF)*%eJ_szf)bttOf2NGnL!bp^?`I$VNF(n`Y1q z{HS)`GllKMD~3jCjP$D^Xh9y0&v`@Y^UD;bF44CmJNjq`f;jo(95`*5GSd=pAfOkO zDj?G$A4fVN_xq1@y1&Qazh3(ae8vpKcI*YT@{cqs8dH)db^QMU;)vN&f(sj;=JQ{( zeD|b8Ob2GvOa|n&B+4RctZ*rS9f?$AciAqylnpttX!Tz!{-W+`2n0OsT(I99+e)%p zCK;J8hwHz7m6d&*bgS@Lm{8Q#{xO8EB5Li#;`GxQd$ln%x7<)g)t)!yM+@qkylP-f zcFQa)5<*E~6O+On>g4!_SSCkaq=I}HV+zCcM`hG3*Ev>!6zrjR<-kA@vE&>In09J* zG$gX{z*Tcp(hr$ly5Mq%Zbm|b_ry%?Otsii)B9&%6DtlIN5yGdYqD7;K76|Z44q1P z64%Q`n==kxq?`assPct-A%{E&b{E@@$N`&`yjpB5FZ?Ed7_%2jB><6_IlO&p^Q9@_VYJ?H6SqI;J$pP&&?k*z0_E)5?T8PjJ0E+qfTfOaQt64E)k>%TWN2N1;Bd+V*S? zx`P}GPP`cV9DwzS$q;fqR$AL}N`>zZi1tN9vgH=9Mt!>93J$*@d+#?M73q%R%7_u^ z@BFzPrUqz;QIiEW3CymwVXV;VxEY0jhLN&GgeX6Kh1HvxXj`UfA~|9pu{YQgDn7uU zU|DG8DKky(NmI#Rv;2aaCS|blL%}Qs#K5x@CCoPY_mkgw`5>K3dm;J#pS^>D$IHne z`jqq-d&kMIF_w_a11pFpYKnWJi8L;WhQ=A1W`irDclCxIbGujo_hwWq(lq;oJ6M>M zIsXQ1AGo(P;ijWmx2dP7`S_j0_gN++3`!&uYZba+<8 zO%%#eTO=9_)zg^188v%iOL+Kx4np`2*>#UnxBF6IiNHXv-q_Q2acz z1##^}uzR-je(q3y=>NXAFbw>U4eC@aGPVC-Qt59_mONApqR5OLd&dyZBgQ@)8~Z&! zG58uD%>W!W<(Oivh6T2#kG_(agc&02Ek4CkMuIZQEyKPeE{*CRT|K^?C#_#a}lN53*8X+4Pwps^IDgq!Zbn z39*Hgs&7%kC$A!fhc1-@cRj_hQ{kkbNk5zcx6Bc=(sFv8E{XK&#WJaBgA>cqA7Y+B zmpGSLHt#80LyIOdw^f%=d)E(j*M-9g2^#0?l#f9WYDV65w$H*yd*I&p~N;}-@=NktVEkeh|BQaBb%VDZn~r`b_NBEl7K=k3YMTKBP%0TM>dwB$IBM!Stjip(>7UHVNZ-?P9fH`>_6;Q+;_J4@i+GjVbHgg}0uOEh3dd$FJlE&4KolGBUuYV0+cE$kJ$K%j{*r185?? zVM}HqDUB23;b&#l3M*Gjg(lKS=fg;aD$f`mQzr&9@`xsC6ZU^$EY7 zq5n%Nl#1pem8s5(7XvaK+0S6P_VB+dSmF^`-RUXMQIV3l*4;S#7_}$=)>j_IVc3?$ z>lxvU0Zh03h`EVUM7n5Y7P<@Np&x2M85s;HM`e#GgKt@h^Bt^uZ_>?1+|UVh7x+SkJCG)&4nvj>|et`Qt2Xei5wP&2&Q1lnM#X zz+(dsI;N!@jwrIi?sI9?uZnN|Tp`~uEQv#i3XG0m7YJ2%W!i`QKi9(N_4*>DHkmsp zb4-S*s?eJ5ZP*ku;5E{8apap(i$@yo5u&4T#sTRhR|tZr)I^NVu#++gX}bnxS{meI zzv*LfwBo`cV_ZLe;5$xqH^I93HAHBb2P(lp!Qvz|YDo^jjY)`srMK0&up-EFwX=nP z+Bs-5tKd5Z&3RG{N7Y%IeM<8v;Vi~h8po*r8t*?IxFH9^VjiZ{H0vyvz;bAzpd7SK zFCPm+wEtdj^M%-oGv@c#bYt;F{v!P9vx^cKtQItz3C^o=;P~R_csnVt>-|RaC?olI zCFcoSH8vP-0T=;RW{V-~HNO!I6c7x1b(;r_b*1pvp0%B-6jXBFUc}OQ9yI1G*u4&{WO}{C@bE5D z|4wutOqi)B6S~M&bcW;D@dmGe=^p#-%LqbK*IUhoP=BaK=bF9mvQ9*&A&wloE5)|C z$62Sg+&sLRNFtVp^O2ULKb^$#)p?sRm8=c4ld8Fc9uG{Ovc5Sul8F+3a+vKsXS`IQ zffEU(A+o^?UU$K;i; z0JbCIYkc38ds-H8%jP^K#rwP^i_d=2hC(GZ<>A?AGQTx zNcuq?_oax|7k|+Z7#^U#BnwC)!eJ(n#)bc zcA4A7nZ7BPx`}~8{U||w9zB+JgkqSH-2RjxSc=S&;&m{EB?g9+Hpe6kXn`skvftrz zjGlvS7R51jnE~?;aD-A>-`W7SHm;pOTv2cwKh3vtTwHVUF@Yufo)>OfIUV3YNg}l1 zARG(bt9=#?xVmrY<%iB8ae6^RLIbHuaeZnN;8MznxwpFc+xtoLpatR-3duh}{p1qk z`)_qf78LI4Nd!AyU9u`MH2w0v;2_0M%=R3e`|wh+^S=WzPbC_P!HUEKSRv}s%aUo3 z^A_JT=#P~i-YSgl{+lU@yWA&!9x7qTz%3i_-=!3`!Q}@|o-=3@BF~Bg__Lc=rLqTo zUPsiw7>RJ7+ZoY|rqBcz9NQ8f-)WS-3oR(TUK&Afsr9}c2hRK)CediF{Jv6Cb1Bjj z?+a*m9XIwH!-E44gUr6;mueG!un<%Ek)8@fsPxnzK%B0RwjUHbf=6#SNWMJu{WZM8#vkEzHe4*?R3dKez zwhGQmgq}CLh8MAxS`)49U1~@osU8(E?zV|T5OXHd4Q%*9?~)AAy4se1!T(Kp<1h%_ zH{}qJ3_TTU3=LQG4k7+W9ehW5jr;umNrLQ~@$d48o#U>gB_g+?iQETz26fS9kJ+kM zM-GJUrc7zSxo&^?*gi*U#FNO6o79EfF^vOu%3aCu$)3MTx}E4AO(OV);^^fruOzG8 zA**wD?c+(1B%|&GzBM}GzPHehd0d?S zcXrkA8}tR(O};0akVofm>rgn_{YPl|Iyvmq=30^7+wDJlubRJ8?wJa|`TSLlr7OHy z3BV5BaRDGyxA4-8wlW11KmZDV>k#;N$mw7sojW@N5Brr_1qH~Eu#0+v;NUlwWaWz4 zKxX~VXI@+Vgqd=N&yaFOqNGa~)>uzFI3JHA57S zxJB7S2>?u8&{mQp0TCDt@-D#zH$uyHjzX=k&Ko5E@6x2eLWJPhy_uDUN1X{uNJ} zBb;WSOqyeP%;n}Yi$WyVy!5&>%sY*`HVtZO>8GL$!LiK-#UPV@=6pI1i$Q{3n@I$3 zNT}D98AhslnhSBtoxb0^cqc3BsinBmkkRg0m#ByF=3HI`ZOb=-SF1mW8K3@Je|}#L zG&hi-y1o^u5#8rdDH)>*dA3V5xy86AETZiJsdDodpEo2^H#(YMC_8Iwv5g|?$IdTd zpzA~1XJMHdQ;{@-b^^5tsLpU|lz=YE#KB$ph!_~Dm^dyAX{ah=V<2ghcxQk0vM4h{ zz2Dri6Svb`x*%81tEq{pCU)GkC=F58(Ki-#7q$++y<5moNlQKoH^R2Q;GX%eV>o|d zJDJ`w&+AD?+(}|p?$6$EJP4aqgI{(RU%u2x1t;ggHs|9ZKP^UaG6~FU@BL6)tIIll zItOixDXq2+;EOV)of%B&@W%D`!(V3UEU5t_nwt2i4+u}{&N%$S!itFK-zaW4pH{U2*%i9?Txwz2aa}-DS zT`tM_2LQLup361X-q-AWTm@Xhwv^z?HJftdcNK?{D-%*QMp{`EPK_5c;XNL}=6@PG zib_mnbwWaZvJf@;TRg6f%eP<4ua^}v;{8AiJSZT*Lg1ZkvZd!OFJctJ>w=D4T|I1uGkQ!Tg_$8uz^=&Wb|RB<|5j1oHx{kMk&C5)K>?E)Cxf|$Hp<q!Qw*Hf5Ds`p~u=4ichuim;^mDko@ACNaXnqW$$mYiV=v%Fur&!W#8H z+8d*6d!<%(bPSfnFO^@AvalsT=S?zfW1tBV90-{mU{R#TKZ*DUu(8NQ6VZC8 zO5XnTnO=Xhh?_jR;R}k|lL*OjZ*0YQ-VFQol}jfYY6K$f(eHjFw^1EuJafewhV7#L z$ZcaJ$Fygy6PbXu^4j3I=(A`}jtHm;)ehuW2O&Uw@$$Dy)Idrj4GK_YUCzC1SvrP? zzfaKh*0rD9Ge6W&qSw#QtPNAvWV5YhhuDXUh5!M`SEjX`6Un(Sw9g38-JxPi(6TGh z!KGO;8eQng`LRBT2$T{sk5tT&QdF~$zmp{Lr3z{4{c$=sEvtdpY_y&m$+d93(i;t_ z<46lu@()kX2ITBXV~2U`8OH?Doi$mT*4KU?uzVY*hje1Vf4VOtc^~+xYgZ|=T5|vN z&VZ6FuT4v-GND2i&>Br=W(Rvc`k|2Jq)|mGw*6OT>{?Uj?>?`s@=M-~F&oKOgFf(2 z!}-&QsYGT8HAUYK{-o5*Nn0>$JM#3!r*mIu&{+Nf1nv@II*qg|V`m`~trKb)054Qk zpSSuwqOnVO=#5tN1w=UfSsKTms1;r2Ppses&(!r0(rtCDfO9_IJupmS8#2*29ytxu zc`90dTfsKZgc?)ZJAs&cU#)4f*ODe>`Vr(m1~@q>S4hZd6PCFKoC=}|qQ9Q$){IMN zHBk+_w7K?yf4F>s6dd4TY)0wnu0c$jegk(FBNf7T7Zckycsx%*;wgHom^?Vb?VdWqzYx_lD>b8W~ZiMnwdL*__H*oZK_h3Vf zM@O-vy}PYxv|TuDzp34Rgjp9gVu95Zs_yk9|BWYw@#DFf+>o#20UAZ_tf^z_(EIfVa{2X3Nl!P3 zvH@6g5qYwvp8*GsqWdg_*z^HteRug%Hu3xJIEoG_4XrE+hcU4Y>Rok+FVh#v2>Q2i60e&H0^qsNJuvx$MzSJcY; z^7x|elN3`M!2wbCd6l$>omcwGppFUIc_aC$q(*hj``Gt_b|it@)rA06C3n?QV}13c zRRQh{!&>zFqPO0e-^)CZopEhVIoWxM5(&oOrzum5=w_Zhqwtvp4OY#5Jco#{s4FCP zN|QUKsoqQzfaA1B+pHAM8HUW%KRgpp<0hLnsZr$tQM(fswPk&Er?6CdS}kThnJsg< zp=&_D#6M`?|G?Ue>!!1g*6z|%e+wcre|FPfOH00=yS)BVCc_>+XhT$#9frSDGmzF` zzRgJC7q77;kcNZ?WP@kdFZ<2rwf%`P%o(4s4%^Qg3-+UoGvLapnE@NBy^N zbMqGc1FeJKYOK=U=rXOR?_y+sDzC0B~IjW@*HajD|@l!TaW6Yv1vkD!avdsXScJjeTzhYI%0-i4sQkk@X8_$t4n`L0yj z4`r`ZDh60({jouO3&4DZ0WmL;G)$3NqPUU&m=g;8K&fl%;4K=*_e(ECuuMZllTl&R zhD1Py)^K9++(zXor!s)TC;ydbBlS--lyRCJ#J#T!`McesytLvoAN7U6Jqm0LGxp3cqsIU7#dcE8KNA=SwWi zdSh1Qspku=@L7#%Wz@AI-y_dMiXKTrP1@aZd?J@ula7V!orcKp(2Mq&7{xiJ1iv}M zMJ*Eh%b1N7CH#zCq@xX$Kz(cP+cDVh@g>tl5sUr~i@8^}V*tKda7KneAv^Fl%ln)y zI;Y@%I74u|#g5oG5X~tD^}}5KCu+xUlkIq{BoR>rQADx_$zgg3uXjIv1=Airyq;DKAeNVY z$DeTMwfqSDz;Zo%)#sjP9E^HQ4Ov3BQXc$hsbg|BS(;LRd={B}KXqS$w20Ed4aNK< zZ+TwldO}W(?v#^)DkBG=(H`(lJ-5NJqjxWRWr){|q{ITt-P9BjdEI9ef$xF6ev5u> zDDl&qX+Ce;wey-Bdf0{GKzG}gA<@9y)RdY*1GtWl;3 zsr8_bvg2_<%(s~2FI&XI&AmFlAOF0mZrl50aedZ~_6W}`sh2b(hBfs|zjguc6_#H) z7)_!c6K#AzKTvKz{SnjB-B~u@rnkIJSFrH!IbJGF8UGPPuJcFse{)xZIz2z{4AaiG3fUZ)a!H0 z0eXgA8W+tqbiS5Kw3BMBY?y&pJsOMD zy-{x9VE%#2VkDTBT1e&ZT+o=KEI?UIE;TJ2iw;0PbR#tpjwZ|(rKeEW%GOCQ*-YR0 zyO@bbavIYL^Tv97h&KpeC!s$8LMbcxgU54m2VU1>piY=cg7qRO4OMWp?N?w+q4$cZ zYhqw}aSBTjcK4EeQPQbqi7-)ecTwgfPiCcQj0a^{8{uFr`$+C1dd{x~;U8mg#Qwk#*v~y5Vm^j1nIdwg%eYBmu;ek`toI#W8(8-I7&)%C5xl@%b z4F&}`6T{$W6K^xH1qrgF?qZcWcdEeRXhZ2Q$anwM&+W#UXA^XuDhLV0dvgkWu+Zcqu&%y`qSk| z`Roo+^{Xa2L78CzhcmYTQeLTtR(DBKcj^r&z< zxyPxMT^5zU^X?qo)*K|GNi%2sY$|n2DR=KHluXEMb`zZ z(1@@Ckj5atgor{2AD(ifE~7^VQbc$O~5ch+7Z`?&-$=BMnaPGUGPQEr|rG0aT zWzByTLTqbT+~}#8o|5=fp|^M3jK$|d2qVJA`JPVJL+GIiS zT^NMuYXhnW`BCb`wZW>j{QqFXu`zi( zAEQh-266vT`~LhfcsTo}7@f6j^vIcL&7yIRWSB?NQ2dA{PDeAjG|Qv~M+Md+0OWt84a@rk>U3DQ(JN}H>s=cdlF z24$E_I0y%09EdQ=GA=kjWkz$5nCylm5|~EXuLHvKgsa7gOICQyA^>T^B(m3Oc6W=q zToiM1VUp1q!X0e6ZWj!r7&|roiPh5+#=e##?-B`D?RJX#3d0iThj2T-)$hEh7_g z-hI5}I(73mrNmXGmyIQSD|xf53PoWgtRmxv-)v&}q;2&x5HyC6h#ZSZ$V*eUno(|u zkEIYIr%VzbO#`0Fb4D5V{Lc5v-j*y(nedES=Y$nNz^2C;;+&iF=8B`*Ns)nm-M4!W z<#xf@FGo8dCp2Vy$xDIT?XM!SBD$_~4klnqYE$4wp^pXCo?lOTi=Es}KQv2Y|nl!;&*Dk@Bj$P)k1cr6R}`8d*QFk->o zmj*9Kv^rc@$5^%~H7g_Dj!_<4f8fWKQ{>ed)YIK+V$YWn`iV(DY@?2Jt9r~5haF-? zZycNgL;>Lw`I<(z{EvU0;_p2lW<#ihrewY%c6uD<90tO3!XjX-4J&itfC!BRrBkK!-pCRNO?`2qTdY-txK#oF>=#~$&V zMXUZ3S}oT__*5mo9gD*0Gpe$mdGt8UjM z&g4DbF?bd6G$K6fCXq_Azwr;i|L#zI9XC!EZpeR1llCF4yK1ngTw^!&{nMY0E$ANU z)It;STlVW79i!OK{YPHCcV6S_*FEF%oQUkN?+|6+M>wNsN2Y@XEvCuM>0!?vNO(t* zw|`@=P+I=e0&)T>`$`XA)xq@%^Jy&Apik??LQkv!&c_j9V#j(}BfIWw-bN(YD2K{! z(hi}tQbtDZA4(y4QHo8!5%xZ4Ni#swg9QxI!K=s!I|k|=rrAp%I2&Z;WaSYTo{2|b zr3gqSAwy9siJgTji2f}?;+BZVh{z6-w_YOXu4ulIr1qs{5^-54IdA%634s&M3$j58 z-xLS_!PXw0Ew*gT$s@`8=sNGJ)cD;rq}e2*HqxL;cL$YazS-aoV-knKf#(@rhaq$6 z03`3)?Tc35GYKKG>22vV7($RVq3fs(2^kz#A$a*22v}CToK%#1cW7St!emmG-XZSk9+sqcljo*Hm{4D>Y67Ut^EJj6A{i574f2{in;A z+Muc^-*SehK9)$Ho|DnJCv?$bax7axQsvf z)d}T+Y-qxZB<$I{uY|vy6);Q~*h@DN-Ho0`eB@<+&ax4+-c`>c2qkH@QjckJlTgfz zj!b;e*EdTgX$ji6v?{-NRMz780_so)#EmVY@C^&(Q`Xy}e`aM$cYEAO*4+FD=+t^q zr-u;g`V@G>p7LR;E+k$rPEuGyjxZowItxcN&2=rD9cP!mw1RsZQTLtilt@t8xyznB zz0zdeyF(S@SF)1R!a0eLb;j3Ka1SZ*MnmtPE?QSf%Aeulj~Bsh(} zM&UvSoA4Xgag@~Zr*!ou7B4!CGGi9EJBmZ~%Eu0_fjfe%njhVbu~0O1?oZIU+Li96 zLFB;^t-7lhqcfTK%(pMru@k~18wxcnIt(#}TCFrYDh!c6TdHE~l3X4{ zj%+bGB7wf}4r)3JBMnnxXR6N@Bsbgp;RvAd!iaQkuE>^LrifGULR%F;JH;9*@Z+bk za<6txY(_<8T0G2h8gE2) zPVx8ZnOYA_cm_CAO>sI8cDTw^Kid`!#0`s3V#Ab^?ueSUGwZ0OT!EKHxJNGRZ|(vq zHO8O~D;FhX4RGB(LlVg(2=lI3)PlbW`TO}V?LJk-VHnYJUC17GH4pwhI9@>%MCe>n zba#R%{FV!?!AC%J@S^)Ph-*;w}@kUKrz*dTIQ~j@dIKU5vsX=|P8@l0X&b z5tuqoNlI4O_UD)pYMiiON*2zfjnnlKT_W{Rs=+q&&N06C$Tv8Bbw^}+&P1JfHZ)_4 zMW#p|L`vmaT28Q`6@#*7v4AA$;b-M@+04_O-xpb!UGXi+tcE!>vd*M^bQXj-X3`In ze@x9?lh{yV4D3iE0A)NM?U|uZ_wM$+M3r#K;um>Flp2wkd>hxpBHwZ?%te*|0c3eL zId$~UIc}d<@tW;~)XVu6k7t@V?Wu(Fs|=0tBkh0RwhYYATe({fZfeO8nk{?^aylho zP;ud>*#}C^&O$jh3O*vB2U69yd`^LcSsrtT*|n$-Jb~uV8GV}a(3jb!=R)W34d#l> zQL)5|(++IMuX&cRE}mrU>@MD!YD&em+ZXv!1`k=(cIX$}3IQ$-TVHtWoT66QEc(XLBCc z=Stx|k!k-p!J{a1QeD+gn};)?{=(OT5hcAjW8YAh7v)&UzxL64T)b)P%|k&=kM#t( z3K8#q!L5mGR@cvx!B97i#=a0U@qpL*>1sL8b8y~Mdaax)nt2pn7w1mH{*&w{ZL7@? zU{ELQ35Y0&q0ss~t7u&6JLUopj*fKmge#v@#d~>1U3P#K``c*AJvZtrX~l;U_Ln44 zz5yP^NqIEv`M;Y-8d9CyIEP%|P=h3BMW+-_!&bSrNCE)1kNP zd5w-Os|_}OXuVN!u8^yd{;TP7#ojylH;45uE!1kJ>VYhee zX*o`SI?d>wZ6Yp!d@vW%n}4N3I*T;i_@-wp+p!|yUV)Xry9i7MyyInicpsRa^(MRn z+F`?|6C`v9sNDYn)+1Y{-s@KbxBTzs^yVVg%DaDUFPrE6_*s#M`8`PuC*nF6DN44k zHI&IB(SStsV2W<=MYyb)ljrWf7&2k*T5a?f_&3HgGT&=S<_tT`YLr#qi@V7 z>NVQ_yM>h(I;aIHB^mEh{6ft5U_ zCFFsl_&DF8Gbc$0L!rK79-kaK^{YHzld+6IU@R0b{T^0`ws^AWL?r1Ak?Y%F&ZECV9s`>rS@l7i`LDFMW1=O?r7$29v z3bR&KadMzzoBCq@FO19%C!hfD(#i8*=f3fFJ(5NSL^2|x zSXIjqv%mO>Ol+z=@FHT$+fRcE^*THoDh3Y%FBB&wze%k_kC+=l{n2X7VcB{F?Xe%W zM|;saUC@xPo#6D{vthWi!N2Xlqk=7nG%q{q(3xkLxQ>}=#eQ+P+R4hc=z0XX*zv)6 z!QM=N+Fbd2e<6bn`3LZ58E|Ov+Kf!bw(I5Xtzy&E9r}_5ByYLM`0te5Os@Oz*8R2mJ8Sk-WBzRcWAeH?F)f2)%Q4-f|4T?^?H;9y^7Vib2zpSxTDG@QTW zLWe3g(S4j5SxLhU{F#BXjT(5aH^9$KE89yXnr9^2^ln~pa3E&=U*BS){2ZZILhLsQ z{zAy`^ts{?bga(Ph@7d8jrJc}b#%i~si9YuwEfj-6Wl+DdJ+s=ZH+mD#TE;?n+ZQ^ z#J>V)Slq-s6!^7}dRT}?vU3}018tagN%hy`)95Rl|651&H8krMY|aTFSbTVY3J~^w zQ+$p>4PcXd*$Wpp<{S@-t1+ZdW^3p=nC81B-u!Fn5H^mkSsRq!Qr#4Zv)aid`U06Q zvHu5f5V;62biC&7 zp5mxDC57!G`(Z-5G<}Tv5)B;ejP*n4H;^!#u~|#p;pbn}i!=jEz3@+#nx}_@sfO4_ zEAo4-a$6oYigYA_c1rlU#xO5Q%gB{QKCam)tJRrORI$kPGmbOl>6n|SvBF37fVO69 zN7zOgm_~}g(Ib!J3x7f=Z)1n_jk?5{;ph-8*d|EtlCFB&cz6htyWdogn8kZ&^6JCE z_t}uQS}LIoOF|qqIn=6)(of#*9BZIIvHbhG==bAlSnf~46e%OT9o?}=Kzl_QthC+h z2g3|CL?pn~dbCLRR&{2-a#yO$SK)nbK7G|DV;GsD!O8`t4Zxm#OtU}B1ivC?JK(Bil*PV(ZVc$q&V6CmL-%gSp@o}rhoGJMy-X2GezOj#G zx`nYEz(2dEXq@gURr?0C(zxosHV#~ z_(+tPyG4;v!YiKOL5D7{YAE~DCvxhEgdr7G$tipx?jkE&P~wZ*piD#aj4hlptHV=U zShRxXL91nL$c$=D)EYg7s}J4!*1V^Ai8lbK3yyg!yHvZ^ zhv+I)=23dq%TG~G%IXsfdZQ>J%-}pz-7CIB`xp$MAmjF z08l?)dU=)_eA%Vt;TU=c^My>vU2L&&$uL9&=!k;CQSI#&6lhaj=&5~PY{Y1% z?1)B;oQ)#&9tf**S`RW68(nV;D08U$P>rq#eqWPGps|fM3370{oZjw68dfV1rf|Ge zs4M_mv+m}%Moi=CMx6aan}=={CqV&%76>~6J$aI^{ee!03KqDhMF(lu0qC?q4$Ktn zYIY^Q2DRB;yL!C#geN0+P53pLQ^}`%{>!m$y*1T4+d3r*QHHbXAz)?IbBXg30coJp zZivM6J~cd)Q*KbJM#O_Ms*kG-3Q1vgTtI{}?qf=HhMfy1QMp0*(kkf@;AOp43zptb zNdqX@|N7B&<&UUg%1>W&JYpsB;VkoNP zq8N8NxgGbAR^9=!i8;C~jia#G1-Ci9m7XPrcM^Wk=24u?=&r-UvQM~qm&c>8!p&bg z>k1Vi1{kgn4ymak4(vXpn0glM(l>aZx~b4<#K95`&TYt??#5`6ql?>xD&r0yGsdN* zfbf9a#ifQCcgi9_vd9EFVqPAMM8hV0j`CQ7T9pDnuM~qWI$LS7i}d51>1U)|maZwk zU^s;T$J1L!#j!l^!??Qz5AG72#Ua6iySpv!7J@r0Zi~Av?oMzI?(Ux8kidQS-tXu4 z{;}uunVs&bs;-&osjhk+82IHnN5~&>Mx+mnZ9^p}g6Po$A_9q4qqRO{O2!?(-kpBLh9yH zqwz8Z_2PNvJMHRUF6$-?vq4vTLSMGx4FO{16rG#ADx_Wxn+12B zbtaEZ`WVZfC${rlt6k_H(sH{qc;xBCfpM0J^iqC)!NpRXdGdedA*~4&w*2ExjqwV1 z(|WNMP2_QFl;TMFjr-e_`36rk?Al8$lUCuLZ48_ zm+n2XM3M8GGU-@t8~wC+Y!*|eEWDSol=0QbdSy1Q3~MY|Y!#Kf zePhVqi5HE7QF#L3Bc+BMH2$4}Vv%y1{hV_FOH{11#uq+D-%^85bw z_1Zk!D0iJDTEw3#&^F9st}%s06rYlb_JW|FzwxNFJwd2?Fmld>p#YN<6u}CMr-31? z1n8+OHea?E;I6vYb)mR1EwofC%#Rr#F%%!Iu`lMARp`2cectLePE-xNUElDXo-cDH z4LbQ)qIzZ;g7*VX9ehXFimcfH8r+8n%1x`rMai@65As zY-LQ`*(911K*y5P@W)G#fV5ciuW#Y@*?P4tX>RG!LvBunBGI#Hm9l>$Pmqi4Gb6|Y zMBmaFAu2WZ;N2pB(iTg_>IQP@IENKHciquba{jzX$w5xE{%y2=Z=*|3O7<6>Ee^{^ zJ*q2(&b=O)9R_|KeXsaR*#KucJozf4iK+vHVg-fz z2iz~ACGoLLG=(bGXUk8>UdNM#Ym2>;gfduR7$^kI2dbB zfl`B!uPg6BExtJqsdZ!;+ogmr%%)wdn3Fjcr~R6@AbwAOc_HyhaqCgx0%h#rXnr?FUAFgEsHTD!(#x0$w_AxD#g~B&Ur6^ccU`x~YHOQtu zpU=E?9tGo0aC$ z=6!wwy$t1j2@4GzImG4}+$3{-NkTnV$sN!6%zo&nLu!)Pmuhn<3gg6~Sw#-#qX?{6 zYVl1wYWKDH`-)1R?ko^=!eoOgd=r@9SpqDbSiBKW&5Z>T)aHGF z7m@d?&3A|sDlkDx%%+-%$n!@quSPGG(p#k1e1T}H&F)+J1LnO1g_ga9RXm4)Iuf9U z%XZSn7ed092ZSZ>6igyTz2}f~Q4U91`R-1g#)d2ehaf7f z&Cp#W(e0{KqvyuiX<~0RGV5Ou6)p-`U^@H2lUtvcU0cHVU56=^} zk?mULbxlU95!!<49CgH%3S$l{92SZQr0;-N?NB6|Rpj0Wba;nlaaA#Y;q6w4q(=F2 zkAw>OyRGb?mvzw7PCSlMh5G2No#N^bCQ7|nG{QO zKH8fX@vck8G}$M)XN20FIV6KrG~|t?vhZd5s~Jp0pJ{;FJGe9JR(36eQlZwW<0nT+ z2Klzvme4nZ%D*}ReDQU5@R@7nAnqTu)UcWG;bbX2hA;ekTJs)?QFt1k?9;!Sb0tV4 zi4%TZdG;_VjBQCql2_MC{!|j7j&hE2{j1iI!h&9gn_b;!86{*kK;*5M!R*cr?)DJp z`S*p==nx=X{xC8{*?_M53iZC;z2PGRs}?dAw~?f)tGDP>eWaF+rcrhVEn4wSAW22+ zKgjOdU1lhUhpyUM;G^P z7Qgc(3L3>1+GM`i91(vaj2g{~k)cELau7Mw+{>@9*7Bmf|A+`1B;fJOT#gEo-<1{eCFAZll@Vhz3*$D>O zYTXO?Die~d;~U(aTz~XPRJ{?%PiVjSsOg_(@Qi!%m$F^3W_B^MMSNkNKJ#OpeEMR6 z?9>CCp%9^4UXT}=pM-HCd65<1=ShU2*jl89J23)Nuo+2}`O+^O_QaDzQRqWEkOxNZ z0zB^Q8}+x0U*0+g?HwHnh6h7@bLvMU)e_!Li}p^57-AHwv&`>wn!cE~gZM`VVaP#h z9n<0r@q`13n}*77HK+*r2<~plT90I(=EZy5Az{)JOU$rCyGa ziGSo9smwV$aVqV01e;yj*k+_PC33B-^bq)&>a-^NSDqxJeyy6pu}rlbA(R*){@Z+& z+qkaeaYoxX%Lr6!2p5DoaJT{eT_)pIIVv1idQ1&~ShebZ&Ph#9B~q$nP&zM@_$^11 zYoZX!4m0}s%SaB_JR0c|2|DkWxwOKVPgKXTyiGA2&9Lx2Oknb6D=!EQLRs`M2JUBs zxnS~UfZdY5i4Ax^6>q5?q6G@ z@oB3kg}uVEPy?5cU3Cbq>)u)O4(wlu{X!dRm6smuFN0z$s=?+&QKmt2+J- zYGd2$hdH{%I~;{)2i&>U+++Jn_@5}kO6zeW>j)W$ZP?sCg^mK}&A7TO{h2x}pvV$e zg!z0~ze}vv;ZW(!iy9TkV3h;XYHf??$eCW42or>Fv6GvdzN75gM&Ac>h6p+5%x{pd znXi(0Zim^C(A_!o@~R`;SZ(x!|JWQ$Q&~R?(vI@B095&R9K1DLyewffsB(kH2wsOY zcWFF-o!uUXvAyZ)h!_*C3o_+&Zw z;GtI`^FK-X`-CSeo;bP)AJp@orgfTRW^!UDzCSNsQwy%Nu$d+ZWzfDgX-&xw7#{Rd zEQNUnq(po`s14{@LfSoA^_+&8iG>qM~J_v=GUwHun}p10L!NpJQhPp_smuSivT0Zs^7(I?BdbGCp~T!T3{0r@}v>O8Ebzmm|(8O7nUR-j>1Tjm;(d0*bnRo1xEEd9$?LB{=Kh#v_lOPC`{bE>2 zoPDdI%_AOQi3#d}dHObz;_0{ILR@lL2ryojF+0QEyZi?R&CnYT{d9^al-N)XAj1O+ zT6*HM`qBQ0IlS;bk_z69fUcxo_F=!+(AZe1NTiM9 z${FK#(&e9Ju!}(g*J1=T7!}$w$A9L) z0(6Aji6wb?RYU`MXGQRtl(#}U6~B|&!Q^921)P(u{_%Vw$oaU?t=u9k+f0-rb8o7@ z_l>Hm#x=usG%N-uB&YH8)6g$X1zB3SF4~CIwivJvPQ((aFo{J~ zL9)IH(f2pW<8&lxN~tg%jSOKvmMUWCd}`Jhsf}wl-D25Mi9U{oq`j;q0FE~@gIlzP ziT`||gM-8!{2L}oE~B+?Vs!g?aA@-2yevZ6Tj4x9}z(ly%1)H*m}**FYN zI&I29U z8-Q8gkR7Vx4zZ1N#+hV(T&k!;A$FWV;dYG9{p71hPzqvNhvy|B3o+1pXMR}+bi1F$ z1aMbp6QCmvQhR5p@3JnxgmbYQd&$I;BR=b)a?AT$7s)65Z)OM}($n^sUMusm|7wMI z=(iaD*;pF=Y37>q$?-JK> zcciXzBikn~i4|7zOAvjWgRh=E!pXJYHS-mx?!sYH$n(|!MNL0}FCCh|4q0Ar)u2ro zdT5~K&to#ayc z;Lv>tD!@45J?som6>wdj_I9RN%!eaN``p&xo}xL<$_raX$+&O8jxV?96xRCmLEELf z*OpPs`^Ye9TV}hep|LOGSlGofo`WIW8s{!#K<)xm;`dt-;n!j<&?yQGyA6ej8RM<_ zi3P>3Dr=G;g&q(C+VT3|^(b<7_+eEx4 zGLeo1=8`1%8ysr?dMnY>@`|veh|>V!L^VdZSsI-u2|+_Oy{YQ38T+@g(+vJ@S#O+N z2(PT}ww9{Dm$?LP+)X+$$%y-&wjtMW@5Q+esnvUiZ^^mKP#dMQn^woZMbP<#obaWr zYo*m3xPZw#nKY7*EtQi1U@toSP3a@{sCBfBYha*1r-i+p^8~33OiC9H42)%p;+`0N zXjF|&8v99eM{5?O*3kw&kK_XhGD65FNd!-%><>C?{xKrz=%72b4fPhq28V@$oU8G? zzc!Sc&M_c6FQDKFXNw+ZdedKE(3#88=YVd9z>p>X4Q$fF1Nor&J@GfQg=cmxo}7hZ zPV&#Gukgp^{y1ExLCh7kl4^q~j8pHxz36*{2c0NdW(rz-= zpj2_6qm@nUx$4YZR+icw>o9z>ZlK+W7y7J2%4jWa!k1sBGFCMX#c*+T1oA7tEq!^NDHlz_L(0pb7UtfZ`Jr@|A9@<9 zCrk$%0qcJ60saH?wJ$|Uz9a=oD0037ZEJq;i-4G~NAeAKK~i03LH!|nv2cCp4sN+` z->WqB%gQ|~CMq4at((T3hQeSF5!`L^vjH#%8HF$Q43i|h7WpfV8fQAUcCB+82aYQL zwsL8E zVm}YOQcXVZ@O65%YAyj9{8EQpIt8D-AXE41KxAr$`u0P@%U%0JD+Bcsqo2kIcZEYA>q z1F9+R74nN4wWySujFMkiDYS5JfwJu4;ZNoj*$Z>j=V-jzsCYgI0KEAOjc_>`Tl zuRN91eXJ7d@1ALWvbYU$X*7DhM*02JdLcf)M%fZ@L#~d4q$(p4(hNhVb7u>Cx85OF zaHps72`d5rn?ACG|0WXH6k**V0IYMHcIx!3X8Yn$61nrX^D>OuVm}bb>&`2+2G%`* z1*COo=H^gjTO>-Hx-Ph|1q@mIYxjKUWXcPX{dKH-gG#6aWpz0GO%1ZQ_krxU9m{LJ zHRVc*rF)U>dTy%ovQD;B&Qa=auOArlz7&irwA6EWz z4ajm1H0ZgREYIEz>-N)-Ab9}|m0AqlMr50@3=_4*zy0{mo=H)jZ|XgnrQwI$6A#n) z@$YM4A6Q#n+5dSLS5e={dii|a;gZsFOXW-2;#ym4`urS&PnPe?R;UdE|Da>%jkbt% z0Dbl_9kuT=dNizA4&m3Bk|L>7<(=o&e~k?V5)i!lf4Y7>ZF`bc1+PEKl~Otr{%DjP zpPbSqJa-ety<3vWX8U>0|KyOH<6NbLuiVBlOT{e|#+CSiWYo8xWHdsrBpzok<9S2t zU%wakR~G*rpaZ>qfC*arWYrK(jR=!g{mrus9h}Y)e9I&Fj0HAH>?aA27nb)ygN{yq zPAa+h;XfPlPLpT-)%f+=;@=c1p~)qU0^BjYK5i=U4<=BLD-sc99C@w#SK}4z&ECRt zl4BNww!BX|?VatN*o%jbtMB%6|&jO9*MGH;gPU!HaqL!oGPgeTVvc z(A=T;^M7aZSuyh4je&#~7Y$h6hB6NR>tp->w}8Kd_6vdTlO!#+mS|;`vc`sYa1s|= zdX6+DW0d=f|GS#;ft=9!e|pWW?I=5Q(xhMGccs!V)|hg^;1J-fjtu4OE~4@=+Ts>1 z;daTRgl5WS5F2f@Gu^za=%OUXZd#6!W^&$%e}*Wx3v(*`$(OVD21y_*(YJF zG$N4AnV*l+itQ8z(gc}?tg|}qQd7W`*4`6|qtLg=k0OI%*AomUT4Lk^S`rBJh{BYJ zqY!^pQX-jyznvn;M7H3XAyW$xkc7;6<7OwNDtrD_whj13n4ebYNR^0aH8AsBAcv;l zBnyRv=Hpp!aO}_-C5SsDr|9NcE{%aktS@wWRc3rL`H_CNsaRQ0Het)*U-1>}VmW`S zkc073+R;ndy@=LK!j58S4Y2;J2*buNEsqeL68D!%)I7!YLv~wvgW&4I zPYK7VZ*!m0>Q$ksZ2`ipZ0AL1R8(!Z|&^Dm2hb#G-we{02EBCZ;+%IvnasG z0VPttuByb9!_*MQZR=2gC*clSN#R+C=u!ljfS3)*{9O3Yu#=B{3`4_$sa>5G2HLr) z;2*oyO1k@V|GU%I3u=q+IfT%(WSk2>c7Gteq-1Z zdH(S7ynnAU&U5ksuY+Hz-`oEt3+Ai!>?7N+q@<|E|FI>;mNvwU5J6d8`U1XONnYQU z_iCt6zi?6}ZWpwCxE6TO3KRAjqoH7-4nmC9!tw;`$Oj0G^HNrl;d>e zusMaUYp{L(YMD8jnbCiov?S{M#G^*%n);#_ zV+#GZN3BDarsj=%tahwCY)K&XuA+)KilQ_;*Y3!#UMX3Wz>4Zm3j${2YxM%DRLu%PES-zdDU% zu=q|0R~luz!JNbX+VM-N-SmA-gR}c3Ocs9V6fgs`)o`nR4Q127>9!pQIjuf0I`*Vy zS65g3p+=(%^5X{3&P^QN+{QezsHK>!FjBVLaP=)xH-HT6EEDC0>T#kJ?>=pmgC1)4 z#;vlYp7li}udsO$EiE12Wtz=!ka)!ZTpgxLPin;1OZ0uBE`FWnd^{)b zw|a3FcL9b#tm*+X|1XCAyU(uU)ysW}FWFk*NDQ$@|2)p>XAf-ml(x zt3W0@wkr;Hn`pL`JgLiPW-f=a86m&(yd9MmBe6Nh?QH?`1voeO5Z6V2)(V61LFU6> z2J-gsK!@x-Nq5E_q+c)gdY=T8?&i*i0St>iGO*8+vU47J#0%wN2GUl1#qC5x6_+K) z-gxd7Y{DIq003_xuraz5q?+nWwWSm@_Q@WU4s=jrG(( zzt{AQAw-D;TN3@_zqosom?&dhrpLw=`MJzcZ z2{eHX*ZC%{eh$JCSXE1ZCHXGRWWFCZYW19Hu&I#H=S~kRpLJk_j2%qHW z)VGL1H^Vxr$lztvFe~%|_Es0==Mp0iFYr2QTsjneR5N7ALl{;ak3fz#eJ_(Ptio#G zX!LK4wHmJ*YKJI?Iagk4m{$sGxZn)VAE6cLTi2p*tuPa1!`=J561u@pT57!5>#!4U z-XlVq8>n<`Qv08YkLXMv-gvWRt@U!zsvB;0EVRdE`jq1{#@B1IkZ1Zv3i?U(+UQ_| zu$Nhm=OlNjNCt!5;}RS-N47!FFy5GbKRSwiMMDsXW|>9$+k zd0)db{$XxEO2yLtax^0ZEwZpZuwdz#>I!X@ESdete2gaM)WUq^_@WRYI;4hR6URzm zP4V_XqE@>L8&CO-$>c7y{vB;OpD=G%Ya~tZADC-0DAj^0Ys%%*=PN0=WsVUBN?kr3 zrp-v%Af%DCD-(z11A@iIDy)`tN0?o0#R-w+(FjJ+AH@ufMsMjnCf&$*KwFXvx5A~@ z4zRnun=A;}Yp3X}=Wvlg<}@QNGOC`Sv%p(@aZNQBFq1Crf2t^g4|~ee#l)r(sTNa{ zt|YkbvQ6FE)_g~#;msbpS!aJ58EsCidU(PnqvGl1E6?lN%NpzOP*LJ$Oqx8iJQ#Z2 zUba>~XV%;qgnBg~+hnART7lW+fEf|KsIq%>7XF`~qfE&p=SyhveAG z5fm_;b_A8Cil`nHu^|Ug%@p^hYi2e=_j1sM@?LqkL9gjXx;3Qa&67q{Hzj=Q2N1T- zMtOp~G}N2Ocp3YDU=$%r@obLii-abQDS0uf5A==~yD|Aa@l^Dyyi8Ebu&_VNCTXTWb&Mz}3g{WPI3(bjO^MhJVv|q<8GW;LPavJbRL!_hS1y6`EDewA<%ZocOo)AMl3#kxy=Pb0yYwI< z(N>(j^ChV()kq>f(g;I<8|^FD@LLQYn(8B|ENbPnqGvWL2-A~eBau<_~ z0AJY^9j9sbp|xS2g`R-C@DjrZ+o@4J_yM2xiBudgnXL8CLTW2fj<2wA@0Z-O&BkTc@YiI0D&yZHpkEkSd^$cE) zu7jZf26OT(&h>1|z*dfXO6#PWp|7n0M>PVtZxpjzLXI4#`^gUyE90E{L*uI$lYLrH z*jfT)wS4melpksd%fh5CgSE6`0%lz6e+?Vegth6XLQYTkq8Tskn37wf%KAd+L#}nv z6hKl4gD~grXUv-x&ZFRHclLorn)s_Sf1fOqRwS-K%qo00}EQ*9jLTzs44<=_Fiv@|y6v_bY4=hg&dCa3d;@Y!KFa4OrjxDphTRtQrr(AmIU!rWB)TEde=W z{voy5pQKx)TpKzku$=gvSn^u6Gh1YpfW<>KhD-|_DJNg&ek@x=X)GX0L>hF=v1orN zZab((uU#BPh^de}wpJy^#wMKy1G=$GK*IyI5EkR{@=cmN)5gY6$fJHvy1W1)EjtIai4XzA1&m@rjeP-OzjMSIKg3HJ z10`{ljc%n?p$^eH-LGMc?UQi~1DQD0Fv`L$h2$NX+}u)oWE~`YrDU$YRKRCCNYI(?#yP4hrj;sPRm!M}rv#+_XHqA;V+;JD&b>4UFp!++RjjxEW zmDqz|H8Q*9f8}Hg$L9def2Q?~PR1ePr{@mxfd7%2Y*(d`tSGtGBxIH`$DWgP0T36} zlOJ3+Ju6>(gL~8b`P1X4_rm3S`1dN1T(izBWszXDg)p5%QlbHe>NX8$Kl- zrA2+JCoelRs)R%~%kW>?=N)Hnnbmqb%J~m=5W3a6l5;Owgl|Qqm>(4|6WnWhgTGgK z*mi1*8#wd^i&fQHsFS;$oiW-rtw$cAPEoi|@C09O{=J`qx|D$RIsL-?Ve*LD7#U;b zY;@&K@tK5Uxn2O=n--QmJ0BnP|QU>ex146bT#+uZ$;{*gQ+6Je)tD5QM?cy@&8lhYuj9N@ru&F)~*tXMkJ$O z-?3}0XX9Vc8^k*di(k^TJiHXOoZrxHdh2k$uYQl!QNw`0an#-*=H#db{p)4iI-(xtHC z#$jOldgtuJMR`P_x%ht_`ivw4cob&VJu`lCE-CfqmOlO8^xKUM6IEC0zHhX>YQ3Hr z2b%9Zbvc)s)K+RJFQC3T{U^VspK-=c+1kH0%BLrab~9Ri-)Q~!^k`0pNX4$e5|i4r zYwcv&3&#YgIBI3{%`;a*lcyifD-Rng`ox>x+MMr0FAA^2Goe-78*fyv=OharbN|3Z z>iz3W5eps*(Dr|R1&Ndf1Bnd&fyp&+Ub%{uti8V#UuF-?YtiN1;tkw;41_u?lijQH z@PF=NKSB`u#;t2D`$>^Jh+^WC;7fIq>)6r0!6@41h@4^~|-&<~@)LMe{ z?(+rymB&x)Y_@SV&-W3)FOMf0h`VugS>q$SD*|UPYhaa_sHNd4NYuK?XYy6#UWiAB z@4lGJ3EL;GEiJLbX*9NLz??T@MP+Vt5_WU^3>mBoqO}vMrXtFCuTrltha{+&4zWlc zSN=y+&H;IQnbuA-8PPk=2(z^my`a|c_qe|?gd9c*ECgbVy~!37nL5wLMefRxDJfKO zo)=2|dKrvq?!A~YCN5b}wlngi+ohG1Bgz+5==Q$#+k@s?a)D+xW1pBfpRo(fEUs+C z*yVN;2dKUGP+~c)XLS+vradvR+pddDHjS()Xl(p(9L2fg@!OKw5VBDC$-qZv*M-0^ z|8qXby1t}PnpIK{JQc}A4!MuFw(Vlws-l6S!%tz_tW4yuIpO3`mP!pbgH3$}x+J|X zk*rCJ;DvF_XjfXi&5EAqUmJ&2DI(pQbBU+PImj>(JEbz_+)u2ua2)OtdZBPwGNS$( z8pPIFs+7~K2W6UXTAtqCcI*uxB|bCP#5&5MclPrbxztMYtVb>7K8At~!z#9WQR@K4 z97$4;a#>khb>FQ7^>mm|6~w_`{DR8{>3#K;bp>7SmrPloJLie~I)7r@E+YDwQF zK1efuoIFnWF7CBj)3d8%mV2B=p7>~@0si<*Q~g{Bl=0nD*E*}n1J$czl7NETZzV9f z;hcb+G=}SR@4R95BGu~mpvmNWEGq@RYFJ6N!xZulbs1^#fYQ$*SR5x20vIT4Yi8Rn z$odKH>?1|eivp5KWAsb6TwCp{_Z4@;9E5c3C&Wiuthsm4qQDd5hHs2ETXAl5i{QGA ze_-UfU3J>;R95?E?%wKE1Tl1TJVqtk6hy^M7CDYmff*^%Q&19YaYm!^piYtUQWPf~5&@#-GL-}#y|H_knZ*(J^-(eGS;rrjB~F!H!R zm!#AWpmVGrn6`c!NFrcB6V)>A4*wIKq%>l;2OuhR{+P|+aj z8X=5J9qvHbbEgX;##w-h6SIy>>QH(s_t*2$GBr8HW@azG1e>u8K2?~ft*HHRF-`H? z_#_urDEaEt_t}r>g-To<4#Jkf!L9x3z9>?k{Tg)FSxeuG=1&vZ;)g;7aO4vO@L&`2 znsW5a1Us7NeZyRL#3P{c5fRUh$8a=5mSg5rh)!T;8yRVuk+PM9${t7Dk;tR8x z?7hP%SaoHhw%BZ6&>0kRWFyir?u54YCnNRs&C}S5!;Q8mwy$)9tvOdwGveHzU11YF zQ{p5~bndR5auZi0Z01sNtRSIxHleD>rQ2K>F;+|a>iT0#vbuMCR6iLs&beL-pl%9J z<|3TTUm^~jK;EwV9^h#~u(X5B77Y+OO|T+xoEaW)aY5pLTr5t7RTQA!Ot#ae87^lh z>&E;!N_A|Kf3MB~p-1Iyn8X;zxgT=QQ`-lMI6jQ0wv*fwJSH)II)%Nd)NYK9Nmr5f zcFk)+0-(Ejz*}6>Z=f*Q zMGHT>OiM{adPuuTiaz8s6Z4doE*^HcJ=L))bkT#B`uCz+( zP}zQR`#DH>jd?l3id(v46fZ|MEjcf%J`t8DfxOR>3ooWpn7>FF>76bWpN=! zC{nQ*fY7tH`b-{Ns?zti*9Cp>h>k z5^gNCm!|)&$I@?Scnb*7S!GTbQ=irfg^1X5$olNdU0j!dLm@yfFhd6WW5HDYXmFVN z)RZz@1%*5vTBbEg&CSPgb044<6j{N#(GExMaTFWom^jt@l@S>@K3~DA%&~CdUvUGe zyYGPP+Ly(=V#(M>>KNiDiU_?{-Ok(lR|`7rB`I}})q=dnXlWsCU9n+H=F7Z=6_UgJ z%%w`M6bnDf40O~^sXd9!{hkjs6+4<476kRzKFEP4H=+4)0W*(VbwzYq@hDRrGl$T! zLIdH?Qn_0p&n_w!8#V2!FTW%trX?0GoAJwkZCwo!y`RJb&nef{+AOj#fb!QfD6;_yL|*Au z7$35H6C}ab%Em6GK^8x4+zoZqpFTA1t4D|j!0QHbA2PPi+IDvr5AIom5A4UVN+HTu z7LJvYo_OWX>!KTkNB2blSo}KIiaCc%znN0X_!482i8ATd=u)mqn0mEjL?gR4DSID! z$^_fsA1Un!*6r8DrEAmnN7x$4i2kekatEm?X&P{cSXZ~egYoK?);dq3Zg^LO#Ntsd zfNX33k#6fM^J)UcQ;lH5z{){K|Ah+s&)-#A*)$2cmCZ>RAhwR=Q`m+IZevQvcu6~z zcz$JjF>N9OUA{Bc)QWYZ)zrS_W2b@A_$6dOL@|5`7m9ghq^-(_;+QqCB-JR5E?AV(lj*(6 z2}yVF7G%`z+A;{|7_6Fk$F!Oh$cHR=Lm9cscQ=>QvUa70{4cmFT)*erc)OAr?2J1) zGKK8l3c4e3woa|htdaB!LOP|V4OgN)d$3hktoPQOYdo$vw$(UFY3pU$6UiSHgrDHE zdKC!jmwb9>mAgBFAvfiqm5doDsz@*sH_sXQGmaNh-Mkr1gbW4>0`9J#HrWJ!Wx4S> zP}>ElzG^5D6w5<;drlq1I+-A!`j;Z=W?Fe^-ftc>r?GVqs@u2pAay_l^H$`uqD_?zEcT-pNmk9Ls7xKc> zL4-pcv3cGsC!75M1_S!}t8`X3OZ=MLP#U~alP2PF*;W2Al%Mu^@GKO>QR6~8#2nAd?2EjG#$l4Cs&t_-J6GmQpH`##CaG*l@ zcn{ZQXy#(Nqr&k@gu_vDvfL4rS~qd`ped1bjjKi{?YoJ8Yfn)`!pus(!>*h7X;tvl z?*2vtu=UApmX{r5nLYoJx>Db2Q7iJU7U}LqN*4vklTuk z5YG>Awx#*BBD0p~dE~GQ_X(Dd5D<`iR#4UeK70#ZOZXyyKig0`cJHSW@SJ|DS#Jty)x0TwL+a?+O3$KQc!t%2} z?{}LDaaIeku$PtC;EoaQQMS@A9?`VT&glea-lj}QxhqX5DGA`<@EB(I=`z4mzI+2{ zp^~(1U)FILrGnFzg>AQ9rozL8;X3_`f3%v=r(5E~KQP!!;)uZS9JF6=%7OVId>ZuZ z;mvdBOzgY827TfkzHW^uQ}iXY?x#))2V^IKq@i|1WoNFdqu;9O8+pfQvUEQs`7ZM0 z%fFysx6gW4+kM3OBJ*kuc_!0{9{Lp8n^paev`AoK)zATVb-!A>U+>=@7op2wZgJ`Q z%Z(iL-8g?uTVE{2ouSauDev6&pv_y>Dw%#fWe!m{rSTFFEeKI}B_MvYUlxZ0s_wHw zK`p}VKL+zDveVLgm+i<7t8emZ@Mj9c(u_c+rq9e;pB2hU;71wFLiJo7D|uH&P@L6e zTe`4v{~eGG7^hr0c=rQ5xL*3(wg%7N zrBQCj`H!{Sj@P}0b8W67Eq{woBIM4btQ@aUjnT5f?TaPCUl@R*gZDUP)tdidXqN(1 zMn52?*ZkJ8tw+2Osm&D~&G;KbKgmlfb}}S}>!xr^?@T)yLw&$@rOkTR3vVJ&^ZQhq z4CW;0ciZQS@_gx@JK-0jx|5F9`Zj+%m}KsGcxtf-WdrgKWX4g5gXo>~Z{wzC{Ga5C zABO#AcU2VWart^^XC87nnDN|gE%I9~*V5d>j*eMm>j+Z=_}_P=+k8?~?X%-)PTJV! zc}OIbzlP4WIe0%nMtgO;?jbh67)!))2NRZipsj+U4EcrSjVRBiRk;M7QJN0zBdbGI z7eAX!iq1t$PT9VW(ByO5{bt1%CnApiXl%C2$#nKO{Lsex>b3TC^7mF~3Se*xwNEX?`fZ6U`quz#N@e{IuH`W>?!I>+85A)PZwf?ssWuJX$xc&TxN{W2_bvzOj`ddSYt^u4%UfaPJKAEMSH}LE$}jDTgRw@if4r1p7qh-_X@_>p_~nt4 zl}K*km`IF(sU*VHmiG)2$9fw64ZnRZN=IG=m*_{_<(-; z`u*2Z1C_-nS_Crf?P3<5)&CRCdm5$jgIGZ&N#1$^h_hO;3S@oUoj-Dwq0 z+`6lO|F3l>d*m$x8h=9zb`{_fUZVYthx`7oJ(dU`mKfhYtN$gbRvneG;ywb|m5o=m zEU)wqLXTC?^Ytio*i>?h;&rq({u$-kF z()p7&S!lmXdq{=&Icdi3v=UsB-vMt>i#FfT=xapzGpicKfBi#R^vy?V9P6mThm9Q^ zmz&cQuuc|}?K>I77wsDa)2+E~F(dn2>#;4V+!F?wX1>`4zeKku(ysU4e=hbR0cj!3 z|G=~ZO+s1#h+Ad81{;PS;}6Y7NUMSZwNFJux+3DeI1ZA+KH%IYa`9TBK3cc;kp^{} zRf_RnwLyzKto5z5YH$px<-yWU1^2`H!wA*5ch(&311zhvwb_}2?D=-iQ%2v9+Qdas zsN35?pUGoVM#659j@Vcu7k3zKi{=AlUePHh1gV+uGY}%EzCB>E_Amb?6iji^DYf}~ zE|ZNX-@b~kZlK9!5S0jWTeFBeZhqsootT(gA}_H!tLFUf!rbbRC>2WbTd?33Hv~6| z!n>diX3s^o8WP|&JNeV~u2!FKM1Z)Qy_?}!#r#J8ifrKs@PIGJG2ojPshrED$Z65o z-`%}ga^T`MJFW8#;UAd4(!>rYO@TU|)_LbLoa(ivyY|`p zIhqrbI%bkiaGRv(vdm&(t&Zci9RF2x-vQrkGk>UIn2hQI9&HUq9VBUr)?=I)l>Ns> zKEK|FI^?7>vK|YEelmriXm2}#gMH>vy(?vz9}shK2KFUpWJoy>KQGnAyioag3d*jf z|L$Ro5{Vx^1owG6^-e22jF16Thur)&uvl1%h(YHhT>#og4Jy?=c-66X?ew^GCMRI0 zIN{vWWfVd?yp{j1(&DvAaGBDp!GkXV6)s@c9Y;{iT?PF@=2k^OFj>&ZX&_OUPwdBH z=SBcuSO5E@PFABLI3(npMKLRJtr0`qV{AsZZ~d5bnR&)R=3=#Y+TPs}Hsz()S0c$( zZ=8ky2W-e(-UwF=A-GANg)DsWRX*cGfm`H<5vRm(lQE5;1f?gE`=9MQr`4-)UCrLy z$U)S3K!R9u8rg%dzq3L@V%uv{Q&30SsD8g2ZV(*!va+`(3@B2|C!S9~n3Qj~1eWtD@Cysf$D|;ZMpX)pzZ|;aIIOrP~kQgvS%lztDxPDr9>^zJSX5N-{ zfK%TSvZ?6Hw!3G22jZ^Sw~=U^v0o@Q)-N$#t?MPXe6!`-J+!Vos5=`-#MKBF2cfl{ zYWa!#7Q0XxR>*s!(_1CW0L$AfXAf0T+Y4Ki-g?vJ9=xWcHvEAciYe01A$?}46>&}XC;j}u;l+KK)%TgXd($4)?`ZZKb)ku0{y>Pl}VpnJn z*s~88#dlRws}7V4JFO}#N2$%~f#Oow04P$T#dj`8O1p#jc_PWGdHYW%!vxE!;`nDW zZl)mOqwYk`iV?Xi7q{Uj^}5Mlj31?)f4iR5lvz&i4pi2C##FZ0b0nU3=cG&^qN+YB z5^+YV$5T@2c_aj#Y-EJ@kVscY#EEx|ZJ%cZaA^R{AU&`=SK-1r8@o9NNQI?SRx5N! zKzw)-j|Ua{7z-tnlJ1mp{KTL*o=N&2s$+ZJcL*UV;@;zAGtup2Na!GS$Kv#NO4phg9<5R1pvJ>}`p0k=ig*gsZh6;yZ{#cdl>z!O4tb<+Yq( zJL7ORkdN}hlbGexT>Ue2pL5+NLlcB$<`{HRIl7?wyVq@lAX?SU+unf_8D2uQ zMgQ~ETOnjaF&mg7GBb}(1YITuZFZB4RV zGf?>FE`{iuFGf4S1c}m2EYNOY-TmmwON^sB@EbZ>=IM8Po=s=$=03h^7Fmp2tkqyD_uj{q^=hYdDArhQ5Hs!yy`8k za$95UCiJ~Eb;vtAN*iBmHA^;v0?Ir5gzU#dSjMu<`Bt}Btb76?QgfTb#t#-3&ejt| zwV0$6iQUdwK=Av7_ueJuFB^RYoL-@!R9L@(oX!HiJjzm_v6Qk?_2Zd0UGrjbSSz$d zDpR;~^p)7u!mwBP>|UdM?O=$4>DjU$nPsfMyT1v2@%H?glirm0N8cgOYIEwvTfsO3 z9RZ1|7@&hn$w0gz!C2vR+wpZv1V^xex*AY}mD;Aj92ta8$Y`(o=Yy$N^}Y(atNl%6 zGWSNk9_i#h$FH9svtl4b!TNZOb%`;JKshLI@sT3qI(XgrOKtRiZ1N}(tHNWv&f27j z?}`~m$5`hIFzyWAk3PAz!I<9^I3)E9`|>iMj5wPd0SqK}fZ}_YUrT5$KRXkaVl~eU zb3ln2)4c8hm^w&Q2h!TPS9|Y={sXw$nCXRb#CLpytr`|)Fi6yh@UP3)5~FY`CkEjT z9UYXe?~&M)DDDce0=skO6g%`Hj18@kpfwz0!)D%+RS61YU2J5WBP${xv>JDLdn#q$ z@g;g_9JMbg{3d{9pONw}H%ko>NJBpYv*HS{w`HIi9#n724q=jv$q4hh7pm@_&vsiq zv^rAje!$T(2RolE6K1aELJWrWVXdB#C?MPML7+Lg_;wt(FKttZ_>*jwBc~Ge;BieU zh<F`|Rbhfs|;i7Z*joTx_a4lK96R2v%Fy)Yi)qq5d!Rl_#hTWTW7 z`I!-uZSRff9=S`CEPf{XH9pJpQZ-cGyMDefksGc2&fbSa^W_Fv&$oJPWtG$AH>}c$ z(^v^VpKy5wr5;z%khQ<0)xT2|l(&wFyO&TUEo}F4X!NY+$ra93 z3D3_a5o-U8Gp&+|6lD-T2PcRlHOn#Ywn169q~Mw;s3!O%BNS%`;(hfmZ-jg64xkLX5E**nL(BuC8xN-rv=wq*Zr({uJdf> z=HW&Xrqju?L;xzRLVo;->s{FQGppG29FR} zo{7dd$7-4*>R`VUF1&Ei-r}XgdX)yXrRHYf(y!l~uqU6{9L$d*`79UQ1MQq^j{tks zS`;a2H;-zoH+LuS)wz5_+L3_I&@N%P2deFvPHi%Ytrrk$fT3I7zRS!pE)$~O)h@$y z1hiVYK{hi3d`^tnQRiBFa%aS6WtO#~6{EytlM&)6B@#c7DcqhbJZg{fDa07nR%WtN zMqUe|0C}(OL+JZrrykl*ns{T+p;sHFZC^$lu}%55;(s#}yRG#-X>}QNOe%-Swb6Bj z5Kw;2g1Mjnz}1?Cnc$(A^|b}Zx+E%-Z}k&-F+a|bwfluV<2edXwhIpI*nx5%43X)= zmW&?Xp4jr__a{+5T<)(nkBC5&8y3X7v>2mdaIrjPCqfg{gujjq!rh`TOQV|z)i~Qu zMLe6a-}Uw6&PZ~}f&+L^S6VtgeF2l}NoimkDr5SY(wP=rzuqoChex7Tm| zd7ZD7TJqSB0}&S8P^Od@x4mdKau?XFW1MXsxy(-=SXsh4o|R*Fw+0<=Ua&q~D(%T1 zA&(p$Pi5kb5-teGw`ImJ;9!G0Zgsx~-H_ZB`UAT&6rxA$F5J5()qWq<%XI4fA@UQ_ z8IiHF*v+HYqKyI4pFIUVe!&&EE>KE5N1ITYIS?)!;{ATN<$6-~l9TF7voZe=jgN^4 zvAG@6rU>{t0mXO~zSmdAG^1zhksw7XP@1k_p&!1Mtn}d--3ZCPHDMCj;}Jumt2E-n zw{ST|x9fhl%0eHwmAT!pO|H0g`PKKjTsD~%w?l!%If!D3pRWFC?;j&3FYTCm!bQHcrp7>-J@r>>QVG7-rOxSN@#*eVzBA19szT4j=+clyJ`0GgZ|xgOUFh}JZ4TY1FIy( z>L0-5g#(QrR;$a?(1t%nhU9tkPe<0b1^ZXV)&&8rxLfH!F~QD``)eGlOuSp$<{W2i zX7`UNDoCt6`=q%dp3&SaZT8qCW!Z8c2V5>E$FJ(nDu-JYNuC)5^faw9!R_(<{Ln$a z(IvYP1@?S^&6&Q$Gt#ui%-iSB2Kp%uGYLY(_MoSXV!JkCNpqpD$|{%ms3dg45ho`< zX^&S3_a~)pnwrvUbqBk}e6p=)N~pE`6ZmqnDW7t!aMU4=D~i$BB@yCYHXb`c9Omd`>#$KqnK_t+aCMX0Dkx@=PU&cev4Zp>4L;&7^SOySMG7>OFtO9& zxnV#|cXmC7ct{|m#3`yTRCc)1w)Xe_D+sHTHtmD{!n6&SU7xxj3qx#hV*NJ!xwd>&rx1=B8mz zdax*Nf?KrJXglKx1Amf? z3i#dAyEB^S2zXn>2$aB_(|l*6wj^Dxod5bORU=q?yCr84?oh%zl63By%nL0aiBQRc z!lre5*ust6MqF%5xP3J-ERsh34diW`nEm>qLNpWimpymUL{Q=sg-%-U^f3m}$8Qb$ zld^=-rCwACR$yxuu*2`RyHqIgqnK>eY5gT zzf#&6r6Tef)C2#Zn;HCAu$d$ZH^>mk#Sqv#NJl*9e|HjHideg;H*pa^nxfPOYw5x> zZTP*2f?HlIl2@Hw2My~SJ+avpWJwhLqONirOjKsBh3}s%Lrp$POCaRppHm)nf%n`Y zMY!Uk#BbaaYs``P!rbhtW3`Y$WEg#3jWetyjcWtxd#(IdtL52bB-z!}$9F-XjC*2N zdf;o?N}30xVg?vXtC$D~DKj8;B9!VBC{5t*U@Eu?TT2kf2^^d5~sX)6P8Tauf8y>@G@*jrYzPYnWuIMhg2qA%J)ss8qRx)-=CFO&Az}6r4i&D^UHv)z$N9#zEjCcRVbtEt{?3U zN>_yT8fw6*r(59D$>&99Q}G-N*PReuW!mfdYr-54ss{hIh>Oyf&!(^OR9Z~!**iV3 z6Wc!TR4QpVH(~2J#U(alN@eZ|>}!zT4X=fd$$M?=3j5>&SUWlb!lQ%u@tgG9t*Y@a zHhg}p9CAhezLD0x7XAlJKRs1K+YlJw@kzG~c!t4i;BP=qrbNKRY>ednT&+vD837*tVk+m70zWqjsY*VY)>J9EsQZD)VS* z#vB00?doNy_MO-lP|RL#)r)rB6O|S>x0G~P98KEPBnr|V;zD8Erv}BAK}SAi$V=qJ zPYa)l%9^SRGaS;b%;&2=cKQu4*={7rZjm@KVyeom91o{5+OYHTe11sxx-$HIJL+6I z>1*rmiS-a!*XdMW?@~*g89$RthLr7CI{DSr(b3vw+^#v+YOn;Ae4thL(%=(b}@0x-Q&|BuYkeaROVMS9Z91hZ#a)JTNb?}DQEB?V9f&e2>>+?kvCr72Ft<4 z@Dp-ao^WuEZ!D%zLWS@VZ--l&g3#WOjt^%6vR(L;Lhb69BlfL-&QNH5wG^}tz>v!c85R~2sjt0$%`MrK zcl4>x8B;v?;++Qb)M;DtP$Njm#*fisuCNbtI<%nZZEr;p*NG@k1>du&VCj&&?@~+) z*Dp!MoE)A_ouc+(?^_5K&z}8v-n}c7)K{x>kje9CHf`57eD5#N8bsh#Dn$y!8Gf0+l z5{QA*m>$qXI9Nl{xG#Vo*ViVW$E#X-1v943c%75>^k6SXE1#15RGz`-+NtAh*Y>0O4^$F)DsaLp)ZO<2_V6AmE%}WHkvEq0<^AWFVh2 zfzmKWZ{~KhZfwX&CUA4p0rgR1#*Z1Lf~oq2ap=Gqj4H{MM@dVT+v9`kV+s%&0N<<4 z;zr}cRiSKA;cVJb1T|k`f z{xZ2~gX3j!2h;lAaIiz~(6{8vpthhfoW^lbbaV9zcc=@OJ(J8ikt>BcY}qv_e1UI- ziKX>qbXj&9dt#lTiS!qUljmqx{1|*0;njO~reWzX!bhqv=C2k4u5|=c?2(a&lU(m| zFGR-(7?Ks89Bcp?q}@>sqD@|=@1(=T#r}MXb;&t^&dA zBrQA+{c)#;P6iVGHNl_vJ(I}w{8A03B`ez3V^Y5KU@uX1PF##c3|iQy$N9CWC{%`5 zO+wU-iFPY6Xo=L;#f*`b4XJl6Gx-PYH`Hqb8%08}wONX-fMs zm7A^YSIRYAF(et6Q{u1UzD~SF7^B3ZBBrDrwvIx1!HO7%URA85JKnwcOnMhro`bqJ z9;&}%W{)qOqTKV8nR<&YkKB>N*UvnK7;DA*U))raqm&vX88pIzM9J?-J`+0JN{1_M zu72vnALfAhol|jk56riV5u<7J(Ou4z&LVopJ*f6Rv^>|AD#S|g92KJ1)SN6pBhHoP zjOv)=F(tRw8K|Z}$;66|RnSsOl?%POT^sPm&Od-UP_KjO@hL-4j#iK~2H{IHnUUYY zvj^?8gwbVEr604J)by(zYt^sYXibin(q?g{f6U{+(|_R;`V4$bWR$lR5>ZWnWjOa0 zG)p!8T@hE{`gE#DnhuLK%EePV%$18K0fKk5zAO^6tA(zUsw<=U0feEx=eE+JDazNP zo<)qfC^7vJBKGwT8`Ht?#eHtJ)b4vmp7!mOvfKxXNo-ZiDq)Iy746pjPdQRt%=rYH zC5U)9DQ?jm^y})9N;cmt0EKCTF!_{>7Aa#r8YA;C;ADp2R_HQj9OVhck6$E}^j!3c zgi}^X=p{BNgRNq$*$Xs7mv22)i!*=8fg>g-v85=jWgS+Ib-CwyE{c#p3Y3-JP{uI2 ze2#QKukS!=$Mw1>!JS)BS9>5Q@`Im zmxNo}*&Aw$Vsv~dibKmPA@WP+Az@iDOHt}$@fOt~iZk!|{oxW@l~lvU5Hl(>vbxdM z-r)Y6aYAjUFgd|+NXZZGP&In!>0Sf!g?`mJ>6!(hchLdwwQ1h%opM+yI-zfBbpijD zqaX7p?LZ*?Z>FmASEWAuy>sG`w@AG7SWUhYfA=CRbow+!nofoakXslrbH&(fnbp}L z!+?Vj47mMcgtR+$tt68pab3mGb_F9!I6^69b-{?sB&#f@w@__zfhJ=yV;L2nP^zlZ zGvA!9A>51+8PXKzpL4gt#vtR5m8z8#-mqUqRa%GGcfKHNGw;a!jG&A_V92Kfs%`_0 z)uQ$}8H;$sSl0`7bb|<=R3B_1QqfZ8N^yRSv_5}@<8?MS7(?FO!BLS6VA$5^GHTA$Qc8U%y{wX%8r+ck0Kj?`{ zg~zm!*E<%j2c}O-7ShHYK88{3r|=OQ#|EN5fLXjaR%H&s@xs*+d*AZ-k7tpcbd+O~abiXQnu`4d?#?@|P{22LExk#mz82yhDlEsXOf%wDF=r zXj8X*aNT-cDDBkpWR8orhYfIbbxOHz3`|zr&<GvGHT(7Gow=YF ztuH2Lf(6_U42>EKqf=<{p<@2fVpo$ayuB)Fe6zS+j-H>wHKuM=+W`4w=_xRJn zIfbACjcC4bzAEA?Nl%RRSKCr2DhD-wZImM?-+B&o4|;Kvkcn2%w-sv0nz38?Eq;f!hFpE`xACQHSepMbC& zRc-MR!o)q%-498&CJFL}6z@^;FR~(^(yaKxzMVBr7bf1=%Jz3kmz*vs!j&32j3}ig zQ;(UU_9c#a5|NQPP^_QE>kZ-jOz<{qYmI<1i?zy43e*l%RzNHH1|vsA@C@JidARtS zuyT2tYjy0a5byKly=H!IHLJV-msNSCF+^M*DO#{#KOa?lxn*05ztkXeRgpYDD|HKJ z3q7U_byg3`zK?9((31#5gt?Y*+be1I+v7_qsD10q$MJUSq@-x6(*FGH)e|1FFV-5@ z_yYtJ{X@-VxQxP8-ElXA#9?Sw^z1NF%f4mo#`JY4iK+aY``7Z_<4WYP^`B83JABkR$@rdI6G>(z_FVP(_VH;My4Tre&BVjkm1mVDpsoZwyg@ zdrjwmGXbkhXFi?~AbAC+DXW#|*!YKMufT!GXZ^hZHE*Ro(>=*gEhs)Ax`JlBg?Q(Y zvJ6GB`Dmg&e4hffcv>Da{!T4owDq4o{x$urJm1D=Zn#*HyHH~CFu*Nqz!+xltZdTj zfk(5?JZ1M#3Zwi$oHI^YHK-Q$EeVQ!N%&UrkMFxi-0J_bQL5@pxz^|R1SK%dQRql1 zJyyCrBn#N1T2p)9ikO#0Z3OGN44l(3Kv!m?aV9SL=t%Q7O$3w_LnKZAlq(BE@cf%o zZrjJYwm?(1G>haOq8w4g;VB!q#SRYLiCLY`QxU}F^|k#}&75_ob*rH?x3;-;$6FBW zv7e9r%S3VJ4|{brT;(8ItJ;<|JcctUm{h?52YAtc0EB#e!Mvf0%tZsvLLKW;{%&t2Jyz*&YVb63A=``}AeNvIihb+ZVM_J58*zqDV9D5tM(ZqLQZ{EIYgb%`T6P@^|Xribj3@UulY2 z_=@{j299RE5-bkgHGu&+5&WjR@Yc)siOfCG_Ju%ivldzH7$=*@oLC`k`a3@S`~0bewl9;x{9QRf)A5X0Z%(~5X9D;5KHL%FHoj*o z#Bc*gk$(?s2pBkCa&1AL6(upROIJZuD0F;SIJ*Qi=j`y$K1267_lcy_4*dP~Y-rB4 z>MaFJ;LD!18ae1ksf4RR+FWF(_03olS^WEbEt1`iajT~aZ9H`aZ8>iY4}!Js4ub?A z)bnbLq2{g<0-IqAN)smt-2lkJZKjB>7pwfsT6c;dZ|amGoNrQhav+7-mr>7pR??K= zYk`Us(Pj86;m;@~Ysv&s(*v;ymu<4Nd0>P$+t1M{r_PdV;7Ov8@!KqgP}pk_`DQmY6ekJ8!rZX!NzQ_{3^B-!Gz%7AnJT7MuP zufp#^b9aJ6(%Ri5kQPNOI~D#&VP_EDxk?|JXD=;R0lS??6u!eYRE^GaGu@9XHnyXo z2p&5$qc{y~v&2%#dwcm9Ek1Q(FCkfj6CG(Yx5EQiMlzIlp#T2cKY(inl%sRyF4bWS zYT{yqZ!}h31RBo7X1tvExk3vxvvXwYL6swVYF!xd@q*dDF^ZZ!efwz_R0LGBHt_*q z;kME}B7GTQB~#V)QKGU~IBCW9r$w|0wdI?@$fLOXNs?7XY^K?6CpIa8GF~+(Je#~9 zF6`@KB@PDQHPkvPg3C#HY;4ZLT83_9wqE$Kvi-wQdN@yl%i=|u{S>w^c_|m)a)r`! zCP!TUcE_0+Roq=)TQ{sp?)mLslG7C;>%d zF6ElM#w4{YoTn%E!uHf*T0JCSN}z#?Pr*?!xwVyRpt-d==uepADW!QAD7cp0mCRJ$ zD=_-WT)p1KG4NXp0g3gv7jQ+%n$5iVMQ{{gR!!Qy75E4^-FXg^6q4)aTLbEzGL?YM27>Ycu6xF#~_c{dN?Hm6~5+gh=Z=w znOs8%-gPCJfN_T@rRuOhEw)nA!QA;F%UTo}m9k4BiwloYfvdwmdSK!V^7Qmu2;W7< zshjKEe*E z$BuGD{q)kVg?tpkDO>)?j=6f$F7#86UUEPos{&;O9_D0PMUbIia%o^BMK>|icI11Z z5fX^AO6QCRz7L5 z>SbbRos@D8?AkSVe&auY!zC>3!5{mbKV0dAVcmPKar`YwQcCO^tijYh_jKOn#a1Mh z9Yp5g7#~e$^vYD=JxEF01xWFH&l%Oa>e^akfgdAGf>*y1a!D9Am%Ci?AV5fQ3AE7YNYB(FK0PS1W@8AuLf;lN82`NA`hY;^%PS1+q z_VK?cIp=%@r&y}yjFQBheJ6v@z`!9m>PPLFvN4e`BTp!x4kx$7P7Rl#ArE|Bqsl8Y z`BBf=4sUm$^r3V5(k9)9`EU)!I?1i;Sq?hO+9O+Ie=SVw;5cL}jIvK+DUZ z4RLL9^4Os?0@KuRfWxiYr@FRKk18xm((p7X_6{5)`GH4Z(LwmnxWbl?>-~e{V#*?O#-Y(jVfPay>2c&xGdel51+heQ*{d zGFOETr)@>DMbT#s@LY|zupF;zl0r==fleI@bUE@n%19d9X19;H;93{OJ)o)?)$O1m z$`-U7y=h+IMR>JoXUT?tSJc&(kWQQli_GQQTIkX!q(IQL(^MIG5$_c%K;&u?b;HlQf^M=G(q&y*ViTb`! zg(0@1Qw<$pPih)0GDTE#rP-LZFxsu`COl7(r@o=H{8SQNG(VJ0+F-JDXgDBBL;UtU z%p&Nj`=tjZV{er#*9qcY{dIw>%1CCxUGsZG%uRxr<-JHaBuRQ=-k zj;f<#Q*vbsugfr8r~Jf?OfOJ6;!|Y=#KL7wp79T!tcn8xPQ9hJrnd4>7>b7qzT_w&tVSLo1@&~OzZ*zFK-TML>k;V&HN zJ|FkP8c&lJ9xXi1b=~^H7IfmQ$j)V|l0qlmav>}^?}HsH6&( zt+}-$L5kJ^^H@Py4{UBiZX{hbd5m@}mkXUa-;fvq&M05BV-q7f-J_>&*K_mSK=YOM zcW4xR?1X*-f#x-kX2_^;g>Mz)qd279s%fKK8rqt6R-5tw&P*i0sD@VzTt?__v2l0r zaAI{F>07?6Rz91ZF7YB44=!kqp{qrAr*oK?1z&F{@??n}>*h!8$gtC2RJNvi zm>Z7PfzuxakBV#++jCA>xs8xAGHy7TnyEe2gC{!~?Cx>wC`qyXoa;X>- z=DpO99RwMS#pICXI1Wd~0aqos7(2?wNS|l3)0Qj*={neVlvM`dKo6#Uv2p6*VPYoG zNJX8y)nxUHSaKZ;XL%4?YvxTABHEwAu#YfWnM-WD*)08P9bG$UWX+mw^DLULnjO@w zO=`XMvaihteKk&_%NjgwXR9ZE>OZY@vvdQBDpvFi$78h3lHj+B{Wwo6Y{x5niTJCl z4`uB0#Hkbb`^uw7Y5UrYk}AB`M0Znm2EaK?rux?DlOqSf9)%Z*w$GM!cNN|Ab35(Z z(FSXJ8H>}Zb-~zpq4-rn0GL1yWJ|xCCS<8hsohB!-4yM{Y{Rh&nZ(98NjeAMwJ>za zu}@KW1$Mo4YMj9^b~vpU@#pUVOb(u@-L^kLaAVFSM+n#SbMCgXjRze%UmHLAQ1qp3 zi18BuLb9*b{Stan3yIYoZLyttaob!Xh;49GMHK)DV)AHozj26Ex*O-J43AXWf)_W0 zu^VJCq{lo;f+~L{Wz#CpKgnxksx$;2%FFZb2aW}G@SaTuuQbRtKX2CA z64M(e!$K-rssRc~Y-U$l-dNjO>36r}P`2mz9wWi8r9Km~qg`Q7tGv*ed<>)B5PYV0 z>^zA%5fsc90#)lVbyz8w{14z}EBqfo+~E7H+W46*-K}h1M*d*rwDYf1eWGt`u@_B7 zk<-_ZANYK)UVlziIXV3Zyc(J%1+zVLL%;j6b5pSO#N@YFrVM+YXh0kYiq{j+d{opp zgRRl8WMTLEQZyzV;R2c_-@N~vfZgAPnPsViHQgvB0q{x@&`6iDTCW$V16#@F_}v>`;uOYXSHGRo~6Ty$##rxf{B!OWEs- zrn}>39JCYx*Z!+dcVrDB` zQP$l13z=E#%x%pF(?2zuU8H}Ek`8fW4u@CTopHVLt!jpk>CmX`V;(Hbhp#zDpij_~ zLSQ}q57z$y#2tkwo^v%~R2@uQ!a2TzUCBv zLv;IY-f+K4(VaT;!O~aMfmHT2a{+EoG@=XdTJPmO0W9&qaoYZk^WV|G5r0|E48RRu zo9qPNoIqh?=#AjTJ&fb`-I^<*eb{h*Pr9i4iTv83SL#UHn6qI3%-68{elS9j6x)WK z>kIbtuJZpJAc^if{a-<`ae*iLBqS5z(!V;!AEb<7jpb(JG;*aKGJ_z@@`GtqgX%i6 zpT{MVf{8a=kt5y2a)RkRH4z( zMTky*LDa}qbW)YSoJGu%j@Y5;GRl zHzoJ<)L7b?PY?*ROnca68>SNeu5_8xDBmZ&mu+;Mcw=pNH$ANTYmRn*#?I261kN#C zSDi8*JKl%y_cqLX()v0(N#6*;f!Y-{fxaDf0^(Y=a(&}oC}hqsWRB|VyapdPk;f zu3LifG6MB&4)*aAexi)I7;MLwroSmDcq~-@!(H*t5ugZ{Hor3%WZx&x%cXRoH%kn8 z??(Ix4-l@@ka;q|rH!~?F_UWMDJM#Dp%_-6TQ@D6bTA4TC95I)n}|8ukeF`<_Yh5| z(L9un-;`3;D7R6;BfDS6Cn_t(-5whr=T2s)=Zf&I&O z<>Rv)rl;fQN{YYXSQ&+`{U<(d{e6cA;eJiyuMRtOGm$#d#}E7#_B|xBLj6lh`NVf+ ztbNn5|8qIW^+iKJt^QXBz8gfS&wc410Pep+=ZUQ7koM=nroZazd0#Mc zkt}xMlIY@Ha6-_nj-|Z(hyO7DtKLt3^-A`p^{=o!RA_A&!3diCnF~aX^lNv&YZL8y zg(fVAjBAdGnThsCDA*(CFe0C_E#I2lCB=U&76x|~pZ-(DM`mKW!T3u&S|51(T4C%m zK|{q4LkrynlV=@Zi(S6Ni$^?xW@$X&%LeCy#x;|4ZCHD~rT2Min4Kd|wQeu=EFVFj zz0D*t0cxVdjK}$;I3My^NA5s&9V4SPF}$WBOylb=D(9!Dat2~)#-Md6k1B$1@p)yb z5E~}%>xSq*&WhS6^(!N~9BiIc*y(qt$;wI}pziZ<;PT_>#)x0(%aQEPE#aa6xQdWO5cFsfhF z=8>1YA)&Gw1r&=V9MP>#W^ol-`PtUD8^bd47!e)Wae;) z(|WuQbKjDFY7?qpu*j8aOZmzuIlU4r#Xg5HRGpV1Yt#_Vjik(KCDTt&>wLzoQ$iQH z(SeP~F9z6~6Xv_ucy*BW3|F`fi2*K0-%7M{<;p0O(KL$Xuvks!#RrWCg@oLyd7H+C zLEen9>(8WHYQp4NvnN4iNC@$TBcA+Jq%cde)(U-7^m}J!3b!c62?9SvKK)reh0{+< zc)-SGj8Zc5M&1TN%TBGCk`|~^HTA^xA@Hynv>e#Q4!2#DNxi1Hvz5n9DQSOojmhaG zJ1>i4Xsnb8D={IIh4d3T&Xr6tE(Ga6=xe=VYRuxPWH!#li9=CHQS+^n{0TT2>qh~@ zcX(6Y)(X$pG>~7yKE_<@GE2R6SK-VJ7{c*uh>r<=j!8BsKgO+BFbfy`V9-}b4uF`V zCyX;X=x0Ml8ralRc+Z5zjB-NCe&UZI(B6APZE=%uG|8f?biqhS--@atGD8 zxePunaAP6K68NvP^03DgL-dBER%?@UHWsaR+%==j0Wl>)uNLjQqlDIyMlF{7%})HQKG`^jC`i&%We!i!C{zYVE_@hP5lIBHBco`by| z=K$0V=Z3ZXxnt#?{4#Z-Z3eoj+s~oj8)if+5V}uJXTiq#mJ8XKN|_|D7c--5mY^p; zz%&kC5jrBR8C11DV>!P-iIYxBM{&vd3h9;FgLFmsAY^Q=YK8NSC&e{9zGhgVmn zZT?;j?zQ(0`aFnuD2j#$`$&9`GgEW7ImMH}k2-)-a?XhO;`eyOs=5o2KV;`2lXRunhrQa}D~I$+yPOFtU4y5)l_Z#_Q7QYJ19x=OV0Y`iiDg zFEkZE|JXY>b&#|>h;-OueF84@Kx4!d9+4mUyf~%IDm*^}6=TP}(>79Q`nIuVNMBq8 zS}zirF^5EvWE`6G<;U1r*$mIn{s9>9I(%;e0BrN7R@{Ie(Z-FPlM5A*rC!Sz1_09E z>ho3=z8Zt2>W#N6Nb@Ue+}+ziu%YBp+oiu5aEIOoYfLG;#Rv`%ehuYOj@#3**GUm! zcBn^_A08nz&=w0cD6+deQSXt1|G;6cK4UEGH;2pe2T`No5?mc?t`?@K8%dX@o3%El z+{rUR^QfuR+3`5>2MTsrI$Y~4TN?3$MzVh6V+u-nR%ai;L~z+_g`b_@MLE?|v9f;{ zUk3S+8T~F_OSSZK*-0{ax35X(D01pdK1B&R|HE((xV?Z zPcH82Y_rR6*Y-S1xt|~s61YBGQ|Z9S#VrtqT7TiB^x34LQ`M1sG3`@C19xM-b9TGK zx4zo#n7Vt^b{mbbYbsXRUQLn^`mZI$Towwe#n zw(_F_T%Jc-4uN~HWN5)nIcL_n_$%+9-`yu4e4R&aqKFsZN)WEzbL!po>=`x%{#ZDZ zPvK-%z)jQ94j|=T3}x^hF3TQ}y7%Cs5!gvEKKCl4u0sSP$9hW(%P5DSCz zQuC++e%@CIsRwyk0_Q(<{{k}~wr9di(|l(q`2g4x?rw6vXwH5O_#1Fx_Wy-mA-Q$K zvkIT`u$qKw6;2|P=us5ACacnMxeZv&j+LIfp5Bn`P}?)|I6KLFxi24C!-ncB+4$~!g;1Vm0Baupz)Xq$Gg({I*yG!#p5evE`w;REV9}^Li5ZLTT2*L%ZutFW34$^2qB{50=kKWE z%Pc3hu?DMq?pyIWql^-;UiTL|9S*Rqm7n@xXfDlaiHGb#T6k3c%~|98%e?k5!-apkr8#0DvHQliZ>ePo zFZHv8qr20gtl7C49K^E&RcjA8H!Xjv42kP|dkV~-_rCzakwpd^84y{LR$GWm=*GL>kP_9Ft!{9x>l9uTnwNTUA%IO@Jb zQWJ1|{I?>1!6g~|qDCXx@hAE&V4A-yZ8K-u=%kY#_?tg1F=z)|V!djglX+xl4&8sm z$vv=4eLJ!|?zk5u{%->Qh9lt)NyYo$y2ud)$hH+bGVgRYW-K1S#wkP-|M2064;HqG z;WiNY+5K-`eapW7SK?AV@mlRQ@#3OTRk#M3P-J{sD8P`Qk6PmzqdiaG=GYJgY9%67 zB%2bBv{)BAWM$;u|6Anb|DWNodJiiNigN7$NX39JzfrZ6MIQgR4)_SCuX`cxxBYKE z{{Y;}r~iNLExal;gCFago4!&~-8RIe4*|&d%R!3ebOoj$kY!))(E$O3;7m|jKGwDN zN)MKynA%&=xJAQT{|JSxCZldFT_0DH_89+E#)*TXz3*xNC6g3U{f8KDjW9qW=m_8jU*sfmsxVw^2|15h>HjhHm2q(;&DUsf2n2#V z!QI_8z~JugG7Rn#AlTsU!QCAK1b26LcZVeVPWIW||NCWr^I>jvSJ$bUd%JI)a|Ga7 zZp)c#3IkYR@gESvnOo)eQXW(`EX5XrPPoDwXU_AR!(Lww(# zc!rj^hcWsnD-z+;0-(dAR9{E#GK&dyX2q7a?Ev+ZLL4vD66#W#VB+?X}P+qbI_xHm`cUC=|bv#RPu1*4;j zY6y30G&Kqe*sZ%u4)N#8WQ)sT(pLFE@9JXUF^MV&hmizXIp? zJqbGWVu-!?ENh9gV(3lgX56PZFmw*>b9IXCwM1)^i|U`)H>Ke?Bvs@_M%KN1@@Q+E zYMi)GP$FnT9n2O9Rvc196x{8|M(iJWC)uWB9i*Ff9o+p$6h&7nl_%_u-Zz$J)zz6p z%P@wfnSkX`S}!NxWv7Zl6e5J3Kxl_z7b5`Qpr8}C6FD$5Nz9S;lDuZ_gQ@_l`If-* zRTq2=@PmGDk#--@)qlecn}-L}uVUJA3y)7fi^Zt@OvRDdH7b{NmIcu+GcBKv%|>&& zUclV^*R&|i5kA?|l^f8nXkGkzU4KRX16Wfg{&Vd$*}V4N&ha_PC|glgW>zC*1L9CW zI0;^zV6Y5Wwx-SaxIM)5Ly`4MJZn?~WfI7nW{%$b5=}bs>jST=dAFB?1y6?kQ=Md8 zoWsg{R=A^Ck`xTZU#(T2Ix{}i2I`HJ^pmO9!I={U?vZ&~!DK*uie66}Oex;S$pVkN z=RKh9Wqcg%$ktPB$he*K`D)QR&>(uVc9pI(pQpM^GtEl{?zk_x7qY#5QviZ21U}a* z!A=HqsqdRYn@q~mz;556E`-imd)U!$2xqd7mM0+L2I0Kpfw z`@YAL1M^53yq?oC4(r+RcM?FQEbgMq6H`wfSI*#aa8!U`*82!qj0oy;H5c;c!D&mH z6C&At?^{`o;S%@=i8?pL6u~~H=iFb&Jwt4M(8QRSA1Yw$-isHGs} z?DpI$G{~ZmU$ki?F?a?|TI&GqcozBt#R%Vm&x8Np>?&drMr(EHPN z8*nz8IQ)^c3%VRXpJ$#l?__u`Z{Z-IOsC#+*47m#5d)v$!w3c9az5dvn0 z3M&AW^>LI$J6{7X&Wq2`@Nw%NMYA;H~gS9e2XvaXGc&;K)>t+?#d_3jGv2gu1Qr5wzac9OPiu=;hEM z>@uhTs^PVFNDSss^XyQ`RBXpuWArQZwz&9_3b&J3PuX4kU}-UfEE}dMk|LTP&TbO? z^Sxj8d_`sq$#Eix>r3I_jJIR>v^|KWcH7)zTUmQD%FWx&?u_syKWhk;2k~ZTWv`JL zd5?y7fBE%HpjeuTv2pCp%M$mAzc8*nJ^jnDm2*!S@4fQJVM3S1DyPQA>_fc@a)wfA zAjN*^BsAYKyFW<9J~7%}e?;F(*--@8RTO_!l=jgRnBtaYKF4NfmctqeLs*z|!f?=+rv zxxgvWHUkTr(1E!fHR82*etk%`AV%kRBGgV)O;u?4V6?1Awe*ogW@S(;y7BBua5KS^ z2prZZ>k8Lxx6g07$=U}%MxZSDaVFOi8}5*tvf)~qT&SZ>W66H%Qq|%q5Q)O!a>_AO zCjA;cgFBaVLtuihVWF+khXZ$y_Fa%JzuLA(e{C3(SyP^pC{ersMQ{LJ!`z{kon36p zd&#|>#(Eat_0pYjpe>QA7AiLh3ZqnAPtTE{QMI}5gcb52DYH`jxrIHu6Me5|T1STX zcM;d~Z0GI<^T$(d-Q&IndTB5e!0C&R5=o>YV0#$ldLolg%WNveFnrE2r@X%10Opd9 zvi*tOJVA`1G8B&^5P@yV9}53LJ<6_&eic4!^>CC{Yx|pQIYKQm3YLRRDEDH>k3wSk zf9?cl0R<($H~zl&5U136E$`51$@pM9-KxRyjsNy2jSaTO&EW07pMdjAa^Ef>0+UN( zmfR>6xp&_hWH=+i8;MW?Jg7ZngDpH-B0minZja*rMsF!79H!r|@sBlrN}eX+t{|D_(p+Tua;aLKG&6FUiAlx8xJ0 zX=_-FFGqKCxRStYh-(NVX<4+g{-w(ym?}f!(PiB{iu`?#}n9dwAYLAW*hxy_3zzXwXqb;no*|j=dhRz38C{R1P ze1|*YJ-O3htk{-n#P4^RB#Jre`(Poi*lCIssW> zje-^7!bQPJOR9Iw!zklp)d_x~IC9-Fw(C!~T^r_^nXTb$k!a>`=JK&}PzQ&wvoMVx ziGZd{`nUOCXoumw+G494w7eN{y<_UN^#$B#D&8xzFt0qCL0&Q2fv`O5IJ}rAY+^~s zBMv*El4NEasC=KGlOtB$(rB7zDo&I$H*YZ+7mu$SJQA{1`*?vRmOcixoeBj$NBs+G z@*%9Qt#iiQfKF3bZb*maa_A_ifERB8VV4p5R70pNhz(10 zTqQR-EgFPMTr2$fe&>)qwmaaMUq3mY^1Q?<4ROytS#v$+7ro=E^Av+_qcllpB}W`O z1ji1a&-2qiS{-RC-+JqXfOq*{Po@_~>k!FW*s{Ve%mvJ5Pv7;`OzHE%R~7w=&VWBi zX|jQf0^*Aa^YPUW71`gFAwYSUR=Zjka@1r|=*wVX zmEqlMbFZN7WtR)L#!tB6bp#Gl9Ws%T8OJY~WrO*be2rY3mX#_Ba^DTLk!2*rvKPa88Sn!w)GORoOjEz*sk?bJ@W+r;KCmH;^IwS=k#e zBEKjL$a}as5x|dkW$mmg857H$r~-kmUMKf*({9##6q}cb2dX{Q(l5u-b_OP;y~Rj- z3pBE3sp-iZk5HbTq#7VSdCgtv6O`$mMRbSULXHJ`Ve@QZT zyaoFO$uF1UAzL|D=S4Q{RJws3;WCR>O<`v~rPv6_E}&7swo@~GOEfRPBJsqpEEnOg zMeq|zeE4{S-uuzf@p~EHIbW1Q3cr`eKhwYKT&iI)3Ap2o7DulBsCnw*bMu?4F&T@D zRXmJKt*fACwl{UnIA1J*j#^(^ zn4u$RFC?>^>}|EG)j=#=;Ycf(stgGg8v5Gf-6EU1)(#{x5r<*tKGQC5b?YFGFnji3 zVcqFOyw=de2f_DTWgo@^oZZO{|mn7~IlIVp0JWCz^~m2AdF) zXLEAkxJ-Q+Q)}=_m{Zb<7`=P*?RXznDK8E2(87-X`nPm-s)a)79InP)c}jGO$Zhsk z*cqC$ljk!9b(bgZ4evz;=@dn)uf=vz!H>vw4w$Ju~z7!*4zLVe68<+|tt ztZMWOM!ZfYuiB;}g)F7vwY2{}f!{vV1*s89(s~UU>;qe_0qyh}l~bFR$ftK22WTs@ zqBlkEHFKHxg$-=IXpl}~0$8eM=Xj?xP7^A7RQfl%L858|USk_8JaYFbBZJROGlX^I z&OkA>G~zIRwaI({BGoh_R4;;eqdejM!ImlAf(G$BXu=toLStqbKSCB67glf8D0^jq zShKvxOiiJj1|Q8)kwEtkP1yE~LpSB#`pp8-OkzmmI~)dv0Sg}R7`+QPt@e2v$8tm% zdvDmwW&GV5s)uq_l+2+ij4?PICVNsHLzKtgmMkvxN3c>1@95{d_d-@hNTXD&s_;Oz1wmo#g`I1RiE`c25Ig&B9Yfn+c zJ8rU{t$DRY0DG6K>{9qkUf~+#PtI+8lRgaqTxCR*TtjPsWb(2xs>g+#F{Fcpa^>^I z=O?1)8G$lhQ@JbbeACaUq;l?;oQRXGGBw!vclANB$a06YvTO4`$6_X00&WAC2ZzYe zQ-Q^Ms@g}e{i^dWb!Qo&Vz=Jrdr%kzS`<)-SB1lU#-f{Fh0&Ku))&YMa07|0K6j@jeOQIyqy%XffRqeYF%?Bjk_w|e z63evf8n)w58a$lULKB@=nwdkp`FuIkm(RJ9Xan$KGzxA5bXwhM*&WS=vaBG2i>*YJ z)OZJEaG}|PoVlSft29p$IU+j;_@~onc>SZaXb)s}TNAp<~da9_zc&!cfBCU-T$uzJayMC2Kj2C9%nM z(de&0C7@G6gf{at#3`mAO0{__;``DizBT(9f$04NrOlwvsM2pv;!%iVP#JOzYRjEI#~7~hc$MFl{AS>VcU^oonAQG#tl@q>>lOINO{-B^rePk z8zH;_%PFUG|J~)~YJP*-A7dKf+b0joPY5#4<$c%YuN7!i9!FBy_H*jEn+KCD#w7y(<6|?hobVD0 z16B_$p?P9h+4rLB9Z-P zEs`VcW*<|6g%p(Fo(45#(~Nm+&H8x0L6jc0i1{_b;gFO!rAJ&$QAj=|TSg0b>u-K( zBX2hk78`z;E?W9CT}{%Ek_AauCL$O>vI(Rqbd6>~`>16xFo6>{>+3{8_0a|3biXjLpg&6*!fn zSa&*L&FeC|I(qp?-O>hW!Zdd!r#j#h7o*vZAIs^mB7V+eVs@P*ZDK{qL}RBE45kg~ z3CSL&qFt*V{NimG@@f8Yr1<2}TD&ppaO^njk0xX3bNQ6|!h;+|ZDT}1L(7|b!}tt* zt0}&L-@C&D#P6htkzZppI1L9Ey$onBNU6R+)C642aw%(SSc`idJZ-8&>z8c?K@4JJ zhZWZgu<_Ua_aSOw5KyU={6@{yFlTn)V)Ju;bRIb}^m4tCRYMuK|54#-+`NfjK>{Ck z$j5A+vFjlXW}SgFIq26rC8is+r9ItV)RrTq?1eJ3C>DOqFi(YE6_#o;`qDN$#mwFN zQf{!Bnzu5TpnuZtO*tG7dsyx=*{g0ZFalE!>C0AKlAABSpmMu#GGrisAG4fp&Jcd~ zy`RV<@>?zVQ96SYd@1k5J6EK;X{rs6HTIy8jt}(@7Xa7?v#sO8h7dnW0cl^35+X< zo3Lcm^iY!Rr3wjYaIB+|?q-YpDIzGBiVHO;t9?%JH#YY?xR`YwZ`S8+GIYnw%usl1 z!Z;>G1O+$xS3sbk3)5KIf`g@nC!Z4iW6&E!_--u6WUmXll>c4q4IuZK-A~jWi8wy`i?kr*01^Gv~*Sqehd2)4HftCPBNhn z@w@~{uri!kk0?k+YO7jlbD98{_kXsO4M{#KifVT?$1#tftl*hV0=8XGWju7Femrq( z*v2+cc8<`aV1M>^EQ9kvM zwn;6#6ZKFC_xZm#RRh@&5D8`%r48`id)goq9(D~f%wDvR)hp&){9Sy9Aym;0_$>M;c-lmNni*s)^eYe9=RAr1|UZ!8me}CH(0=$!jrJ6>LTnnS_ z_Q9)iP3=&)lO&H#Gpq4%m-eN%`p-X2Zz28*-h|P`O-;zht=$pzLSka0oDj);mPiqE zuXK;2`<9ug*4uwMg*gqWey)F4zX}4u=@iYsYxv*khVg%ev4YiFSx4uezd8s4gnDOw z)BO*@757!_hf8W59_UQ#p{RijvR-K^PO?W(LD{k81?wl^6wSrKA38uF9~Q$q*8HSe zN~Y_tgBU8^wLx{$l@5&GlI<^yTQrTerSL?RYH;EggWsCm0T{*740a{H2#I3sKjCqcwgiaQ_+8HF$o1rob{BIIiOUlQs8+IM5A3RLmdd`(MdG{3>{~hiTh#I zr_WAi&qv?Wo-|oMV~y(hc@Zx_ov&@bG0^x>=X+rTV zmFi4oKKJJm69X5ATjnW|%8imwE#tB-o}?4WEWd=bLInX%Lm^aI$?W)4{!Upl?p|MD zoY@S0ggDjflkfR7>iNRBxf}>gxnh&{W2UO}yjtbD)envNJ&_GA3+xI*J{^oop}fy8 z6abN24XE}jr)va#l3|D?c^v|iFP4N)&ilyJ0bF%3s zA<6wqli_i$M5P-SZCeX!t=_aT6?(m#fSaLX@sRD?Jp}5`wgz6{hq+kfzo2m2R4#vg zSuC~3vWq%8u`ZaC*u=ZXyW!ILp~=1UYB4Hr`}hQDxt-hl6mefGP@WB}kD?)UCZ!M)^gA z3X~8IOL!^lJ$b!5nc*32h)ql;I`u+ES+ovG1aB(?sqtR~wJZVH^2;7o+rjDDNPl zZ-eXzBecLQ=8X`^dfIoq&iCPUJ28BOg?1CkaVCdBL zTV_|?I%!`twO=qlDp*KAuLq29eOYXcQr{&Oza0v{4-f>iGwrwQh!3rTJBP}kz^Aje zuT9O#1*f>}Ukb%m>I~`+z{~i2BPK1?-@NF-JNBGWgm*Y0(goz$R``OIeF6z=xjI}U zk|)#|`xAXXaBcFEyLa(7m&b@2RuLCW6Mb)6Hq0mqbCRfM&33xXTEb=O!}#!Iy(mZE zf-#tnU{@kn6+RM1ompCFZ>oG0H)o|`=oWRx@OLk18Zr5T2NW7Xhq*W|g`5L)3$dvx zZoyT=zT^1HJP@;yyiq>%;q!Xud4aumC%>j8gHL+X**%cGznPJ<=ASn~x5)-*<^$YE>h8XneKs!0<<~oIThPh%W=n4>#c_ ztV)s{F8hsLk(P~p-`~cJhUgAy0JB#&thxOX*}ks#9*J?=vpthp z)vy}H5wvBY__($u98iE+1pt-@s7j(r%^g3Oq|O-rf-*Y$8B0?>n3X91Dy6Zmf^Z)J zA)5Q~QH)KZvll8+K|&915s9%TzT7b5K7y{RZ|Oq=yga23kR+`b6* z>Hg6{oqpt`RoPKNTeU7dLZ9zBeGhDYFi$;xgwSlEeRn@=qV{8rSf^RXDiES?I;1v+ zkipgs)i-7nG>2C?nuVG6LSJnaS+(|Qwfe#^oc;{x)>==e)lY}pOF^ujUA?)8OMP3#Vd%>s8?^1u=?;>FxD2{&HK z3&%tp%$##@IN{HSJ)QkRA8a$trB80D$a?b5Cne$y4In{~B8{~F&sHWQX~kWYNf|~4&&~}_EvK}oq~*e z6dS&R9%aNamWib$-JB}Hug3*;DZr>PZm+hzws__s+R99OZ}a&s0ks7(8>ao1l$W3% zX<>R!M95vcRRniR-FIGO>ZUH(-{n~#+Ecj%m74QRObR{pk|jyEiSe?QNg9+{dAV4O zjT4G2`79{>_1pZseRS7cX4tI~lWoNC7WXg|yC{QDA)GLxl`bA;-8E}xRk+pzFd&B= z!>%fwy%BhPRqoFp9ifSO;P1e>Ov*AuzUe>SgRWx?*`&6KNB1TLhN?>`bK|8IJde>l z!evk^;+MxIO%l^QaEf3_+@mkKA(FmQNASJS?1dgg$SOI?JkVN%m@&WH3X{VoF6?dBR59h8?{)6QMq@2FHC!e9nSywbec$Vcyyz4??gN|KF` zsV*chzj+7q8LRlQ>2ZxP`QfeKdFvwpKo4fU6QO%C&krc~qt0 z>3K9Hnuq$@(`=AT*6BX?D*adn2dX2nou{abItzm&M_Y$@YVgk#LFG>KZ#F{pbr7cb zz0VTy_x6d=4yQ$+=(uI!b}-Q$WYcn5T7y@>s&l$YGRI9)aH888mNVIS`Jm@PP1?fh zO~;{2J(2l^4Ao=)TdaKaPt3W&xPE5V6|;43RpP#n_u+shqQup6fS;LdpSt$X53K#W z;)vHpkCA-pL|JAl$`ZyfMpT}&(Y>`2#<7@95^j>c6b+amxjF?G!biFI*QI24uaZR1 ziCJ%S#|LnG_;~pUZ(><69ZyH^au`)y3QF8$Q1MK(D0}v7Ri9iS45p2=cdX8Q3sR^o zY*4?+*c2Z_grsGhH{(-j((3T8DkRpE1|l)!Ny<$%;f(1MHw8*z$A#EIQnWpWT2L5T zx|~82xzI=J5e=~mQ%{-&wi&m2wj4iPf2oScfIX{plHM@<ce zMqascG)s}~FpvHkrVV1%-|NPo09n-&Q(*4O{$^MVfbnMWwYf2@d;Tz=ShZ5MKO;v` z$fhUbYQ@Nh+`)<`a{il5Ht}oYfDgQU5N%gd-v?>Fa8|guO^7Tu7h3e&o>JsPY)?+? z7F7VwnMjb3(B)$;PAB^Yq$lLD=to!_(QTb7XlK`_?8GgbpJB%4(>aO@tF%DT z7Z**cK;~WmBpVCfTjc)e4JKAD`&yLWB6yu zH-Vo5$BFuLB%|_8-$Nz}jKM$G7>JBXb%uMchVv+V_G5SdNZfsU8qWRO3vJ!gX526~ zI}g;(ozYuvm-m5NY$mx5WM{gzP4!LZ(A64-@AbV+z9W%rUJ-Gyw3fIH<}T%)p;*2_Ll;(f{z0DO-V1+enq z56I6oEp#t2-#=3jHJ294p~QI&BP21iN@M8%OoEk(_}^L<{A-UzahHMN#4@BQQlRxP zgB&`MaU-+-=l~_l16IC%7X`o4b*0)WY*FvnES=l~pJ?0IY89AsC(8AIE~)>$GRGym zb^><8CY_%7kxIO8Hc9VM0p-$yN^HWF1nCY{I{LO(#l7S{p+U^-?^NO=1~CE@etrw3 zcsuyt0w?h%3)3%l!+2+L>0!9~_D$~GO=hRE9!_$^I`RzZI{~Om%x|P9HY8TYkXoe= zd)T5a?zZ{Dez(JPY;gwQ*ck;0Vfc>RXf{26m@xoCWYcuzamLx#CY&8MMV~QqCUSvi z2T&N=WplPEd$NAgo7%$euUuClwP$-j#KUj*t>4I#7z!H_qpR!p+u2~+V*`G0QwCcf|Y{*|cY zu_{O89w&kNW54^`uA!rT0H+T~R7&s!3ZJ4U=MqJRxpM*8noEoqe3!*;Ox0d_&#^?660zE?PN@NgRKF+Kc%FW_NS zW%e8qY=;{@x2bTUS0%D7(p>93C(_Z9uOfGWj#Lf?nVMSCqBC`|g@*nveiNc+o$`2|*ZmD)%QE4&y)@;sSvR3pb!<{vz8ki~cvl`x zZ|Uk)S};X#;ipDNXjFs%r5Qj~qg4&yFDO}zo1z9;lbT|w9xx;NPZ-;~K&uRY+UPdr zuEbY*c=fJ4rsFRU=KH%f&&caC{lFYi;rX@2Pp+;*PvrWFrG15)`f|P#1acho?PWA& zWX6^ioYfFM1iBOyt>i*uNf&->8Ok=fv*rg9zQ$kjFxI6|1zgN%A2b#opxyd|R~hiaOj;r&B9P$au{_p(fbnO4d~l4X(u^z` zqUPiCi40oe>|*!nQd6e$qbhR@OgjHX6b(*a{cfqG!e`(dt3ZjUMFiGgodEKrNg&D^ zL%)dx7m3|_$+Y0mtarTGm0e1zh~|4?%50z>32oidOLYxww2&zPV7ZZu6wG{8cNS7r znmsZB**i2ulhDYZdGia%E=I$*k}V5+g6x4x@RCPLEHs`9-nu`1UGqW}wTX?J^Nd2( z9PoUrNM-Ds!KqdP2VT_$mC0~9&jBG?_feJgy&suQrRHmv`(3}*`_Vi%xGYkmnj(S- z)BV4oOuEce?c`k(KB-DZ7RIrbi`_Suf2Wf_yI@dUxYthbiLxP(z_mqTrB@FWA!e&t z+c+U88e8pUSmA}ogf=%!pZfVU@4)^Sl%m|Wb@itvaS%KIf!tY8InY9|~tSQfthaLLJula-pUv3;w!pn^euMyidreqZ``?|VeXXgjYQb&wl zj&4AUyr}_|sDOCUb^RrLIzri7Lf9+}lONIx)oGH`Z;@zBh1A26?l^EvoIbZ%61$pUUSGMXR`|y}34%X3yW9xR_!BMY+Cz5Vk167)UE#;&={%+yhsvMrq z-TM~NlEmDk?gkOs!i`V;y|XI#3~_}{iQu+JkENEmGOC;IfJ2wzM2>asTK((BgfZHd zjQ5U9@zCbh!*09+M08fW!ka-RPVd z1+q+Am^iXiY^JTqP-h9i#R^X&v1UVpS;1RDLlpN5a$Zfb>;~{pv!hD;%tBY6PnL7a zcRrJgdQr*Ea#UfS^VO{733Mc1Dfvv61}hx7^yu#GWEC)*)?|aNoPUT*u2_7RIK=D#F#=Q!$0+|yHQ!$uFrn{k%*z5 zFyLB*Nhql3;Ht{m{00QM(MI%z-ivR0#DuYeB)*a=<+5Sg`Ji&M;M%~K#uUbN+RJ;R zgar0@LN9qwo$;?4F)d8gvnx7A>q{3X3vy8_q`}C2!!<$+X(l% zp|pf9*vs?^74~vS?i!mRr?;~Vi5>!d%e^a@i0b>Q;=!Vm9DAE~nB~qXMIS4uZZ;}s zWkwCs-uKp`vpqLx5lNMQ59!y{U-fky=U9`D3XStX>$vv7vEsqkJ7pp4$2RGSqq0CW zt34!v%DF;5pwp|D69?p4d~E9bxZ0dalhGM}iaJK0ZhnBm3J3C!wDdzUTKY<`&MH=- zSI)os<5yn0W2;#+)LG>5bRV4H-LiPKf+for49@I*EN`>E1vSprl8Ddx{a=Fd%mjY^ zQuO$d*($r2V#~HFlt$i@;rqy1uu8vn+c{qQiuQqQ|Fotc$ zsMSG}$BOr1x|Y&0y}JD%$8sD`HC+<{^j#L#N%H}FZHP!Hv_0*K5n8{-;4i4=_8%WK zyNf-A0NT>Pq~zZ$g&hG)c8`1qSJ;wX)q0;7^MbCY*y`<>w?szaEtoxn4=?FTrtd4# z&E!5KT?WPodJubKAaC4=f|pbhmAmX7gW2D|!;b*)2kit4bW{icvGenNqMErA>ThxH zLtum733dHmy&DryEf?~9{i@uN{%!ETz{yhsQ|8e&)^y5SkRc zRGVUOPiNe}RC?BuP6Pn@d!A5;Tt+5wq{sOHvcFdg8=E*7%NPn*EZ#iGsY)l0X#8$; zvJQ+?W(h|8sDwWLAhc_>)R8x-bszMp6|`A;^lrd!m*N;-|Yj!7etY7uyxEeML2J1QV7uiTT z>;v$Q88Q=OX`9D4%i~Y@Q?lIze`rWq>(gIG#YDXPwtv?A;=!I3(kjfk@fQ?&=3h{* z==oGLRP>fu*bvtK)!0zR{ni~Hd@8}JQBkJpQUQ#_k`cqo537Q2L|xK6{V{ozn~0|Q zcfc%9C!ODN;+RCV*jEWat-JompKv&}N?F1F-V;^x1;StXPJ(8;mR|+&eW-?r2GIGm z`lFqmk5ic2;++x16c`(PaS1&hux$s%$Ykfi*F%(C4e?YMO?z{Mek0gx?+YC_1a4F$ zC1pYMv07{sOc(X(2-(s`XH&x(Fv{;qn?UkkZqt?YiE%AK8*n$wC0FdXjDxbnv&tAC73NunB zY)C^`u2=xXG@V1&OSjfbA+8WTPbaUR4?iEQZ-%xf(2?g{kaC_*aBpp9dNbTbv^u6@*^l0uM3k3Y ze+j6~HNK63C$E$(_00FpCe_U^-yw`?&<$mf&AI8lMHII*&M{9U_l@9-*u$X(@5d+b z6c2XVZM(H{0Dk4%2@9URaQff5?(*cEzZnEj7p>h8$4q@t%9mQrTy{t~i7*l^c>fOF z`)WrEyIG0IAN6{BL(nzjJfOKdQL>ZJ7)coD3ECL%PSh2(K3yY_*`5HS&%FTGAhm}t zfcmSmWfu2E^@S9M8qYU##`b1E<(p(hTn^Qx-dg`U)-i_AV{SUV zL1H*#2~HV|f941YIp+(yiy8-qXG4^p+@m%fbC86(HUTe(Mk5t|AGI>2Yg06tDAxwZ zhahc7)WwHYe+EA4+z=tHfJ|H{fI7jGL+P@$6QLh6M;nj?7gM6_Py8CM41X6#7LGlL zyQ0^IS>97#@pE$q-5XWR)|P({?0?7k>-W~*ctQxNL>$U8G<&vt;VPIwon3|?#{pt> z>*wxWz!rq)Co_ceP+-D6U=0E-JWj6)dk8prI|)n5K3TLQ{6RQr$hlF~z|kGVOP~^w z^A++4k?v+;%H1$u$|vdgn_UetGVh5GH-o|JbfA9CmK={_y}d?jT;>uoMwA&{p^l2w0!eOMXvy{5<%XF}X`>LA&8i{&qttM3FFsE0Jnx!Ref<)% z!mR?Qm3pUaf#5JiSTPIsmgLm_BiA)<=NVd0Yv}*hjsz17!_R3irgl9Mt@uez}i3%ko9NHEOP=bu0;NTLD^dM&x&|# zx@V7p7mrAY#$GsOzAz#lTwLD#`~(T*^nkp@f-ip4b{8*{fX{dUS^#xSD}QgT0Hn_I zrQX`f(ut>VO6xltX0;t;oPXGcT;I^!?uEy(832i2V#?ED;FkCxtcm*pTH8EbNV48G6z!_f5~j!8;B%#u5^|$38^@8tQVjVmv+lvCt&}%&Sm6g_CbFmRUP?75TA;XH zy>9>JiYx?5MW_CX6j#QpA!7*33sH!V`<1kWNKK^eMG8iSo5xhgHs{zyZeSNL3x|aJ8`n zA@pl@boXyfJA|daD>O*J4|;kMthf#0r8A`n$Q`_El)PKQTwW9XTXoi3@+|w)N4rK4 z&kG@*Gp1JRuAd5ul&#zj5D)ZoNRSqPzC=_7aGxSA?=7jn=ERoSeSC88OliK&M5^45 zrc5jOaF<`3{Lm{{IIe1N?a))Eog z(xB&mmrmIKzrchz<)0dKDvvft+2H&dxK1`VqXeb%simgEJ}6H5)PY}va1l2sbca~w zzpjpMF1q2)iIsNScxD2~^i6&^djSPjL&UOI)UA-jI|6KlX$<*WTXdPhS`&9N!)OvlUWVC9_ zdZubiVD3Km_;}((1(B4zb>XP5CD#){-FJXcRvrD9Z=f5If8Y(T?@I@I7h9?$#mHP|z0a6%pCEw?kMrHw1?kRYU<# z4Xz_pqsgEQ&kS>UaREL8Xv%&f-ci&%!56#}aI)Q0|6fr5WZdCyz(2JHSw7Q-*R84s zPMNV@3Wyyq59I7)9$mr0Hk~+*l?=+cOsZlCcSD2_CPs_5yw}rC4%Vbc=?7O-KdHU#EZ^byL1|J@X0Rg9R(Q@nUSmsdrvizaMgXg zx$2rtbDTcE;Ed$g^GF<>K&UtbvD5M#|NqbHe->06_a)CZJQH#d^S|tdluF3-jsBEM z+RjpfrkIH%9m5sKI^w z^j8L}!DzC;Tx=*k$hvx}-Jv(!zz$4<9!my^;Vz%3i`q!vGrvNr7wpOV15(XDxSoBBVV>0X@q)*Daic}fclx;&od2X_#M9Kb6j)+mrQDR#RftWvfVX?A2^(iZ}F8%EUy@DxUPG}m>($L%hq6o?@^*jq6mD|Fhq7aU2(h)BR|=uvTKHWe`GH}8B#U9P zTfeRX!A4-D+^1kEbMpj_?^^jJ?ZdY21l6Iock2dyKd>A}e`cAp}F_{2xw&%n7t`>)GBL{Z_g-*l7?SB4w zB6J~yC^MwDXnmZ`mYI2+Td9&W%koFwpC*8?ud9DiKX<6NL9MxqlBlqs;Q1i_C2QO* zB!%^n{x8b?#JySoR!0f?8@=wDd<0iG%Ic14zq}=e#J;Q%mfzi zE*!Mo4)?yEc@jJI*)I9bmSh=}Bg$$@Q&N|3?ic$kDr0PJo$4i7WoA2pAOmK>@>VI> zeL)i;$ATY>r%}f8@s+3IDEiWTT1VhcHjjQecUm&N~_%HJ95OWyDrM4it(9waBc= zMA@nAmwWDJ^+!yaQ@6;QNAy!c6s5xkAunaIoZ9uRnd;a_G_?VK&Capi&n0u}c=ked z;cBqGz@w>^CvB@T@WHhD!S9;r#^XP`>lL)wxZHL#L(^jf3UADqrF+FroP*V; z1Om}x)Ex;P7}dSrPIArvJ`ze197;HWL0`m$v5;8*^?13J8zESRh(b_{Qnx-x+8~n5 z#Hi4$XX;jhAtAA9>$Z)|XYRs^5LL3Q;@AK|?^QAopco1&4sZw`(1^8^HYC>yMnv^Y z&&a46rS#(rP+iJideFC0%;s&WeoqxhTiEFhpk9fm>|#$88&rSs3qk?+{n7 z*F{JdPauu1a$Qkbs7$^USs@;u<7`t#BgIXa+^C0lHCET?k4>kkMTr=3pHUacwF30Q z&z7Zr}Xin|li{ z4k5tkVi%M|XkKq7ZEki;VrQ!Dx^k`sdYm7`Mfzitu|NT`(}PhqvTU%iQFZ!>cgT6Z zuhQ-y%6Hw&t59|&87=11<@{6zj{*YEeXl{xF6X7E#V!f4ZI6`KEF&Pt&ic zH3pY4UYg^w(>&bF;0T-zX@sFK-1JCB2KHSNGabaNho}ObGcv2F%^;ZRy_y2#|6r_% z&Y;-O>5zNx+tV;_YM?(;eAd6UXYLw-EQh)6CJdUQ&36ZChHT!pvgsi7=IRg)O?9(J_>jr6Z)jfKoI_N6cRx4E}S^EO4p_xCj@ zllG-+W2Z1Dg^^d@ zRTNuK;sOU|hWQ?YhMjG8ESOo?nz+-5YnY7F{Km8fI1^{3E9KWl*bH3`~wT?K<8V)akjlrN=di1Pv zE6vrGgX(jt^JK0&|Dm13fTQHRK7z43tFOy(Qtf66CNGi#?B%0&qFKs=zh@NBE6*3r z0jB};#0G~$9nO}s=-B^YYBiJ9sW&jj8!;(R{-o~v?Tf&8E~ycHfv1{=#k%ug+)Wa6 zjIqD-(kNUs$J&TaKF(wi{u%*5!{|VtUN-1Bd0H^|5sm2>mznw^xc*uu{)_3Pl0V$&)v>q`-KQ#EKK8qj? z+n>{x4f^vofthW28aeo3$6)-abK22JhlDjN!vyck)+U;Z{_F1T&73UrHl%@bQ zbH|rrkq;Pr)Q*rcV>y2Uez)jGm8XchIs<%KX?OWWNB*R+$|jOY*h_Hk=(}KyED2~t zKP@jU3pjdn-o)iJX8;zj6W<+7F;$e1ro}mM z!nDlLH^ip4HZ%gP&434*-}?S>3-Y}%H(#CuPw$r{0#Dh)4qcG1kcxQ5Nian}_4~Pk z@$iY*VfWS#3+vY@sXR|x5ApIX?nk%JnU9J7gW2kUvYxh~ zVGdqv7(jcUe;%zu0H9$f8A1jxO&GNKgk%vRvsVNDO*0S=QuXFKe zudJglUhRn@m(rXWcbM2SwSPlyNs(mtoqOqqQw{E^wWrnBMR$oGxHuc7*=HM7EymLA z*+2LH1su7?c(vZ7rLZVn@k7gX6(g#z(*YwganO=tp4*O@jH;mQ0(KC;g|Wo{$ONp3^!c9!);j zTeMED?08370$(m{NRb`T#aO~oqg+cD3G=qmBmwk!TxXYaB;8Osi~W;gMuiU zM^HNAY3^CyVCij?H%CaUGCtIb;vJf$Ut)2-cK1Ev%=iAz2MS)hiN`Z=cD3!4`cX7a zZGETvxe9*~d~^!6ze8l{{7<*NTKmx8W+CEy}!vaDZbWRonBS)m*| zo)>!f1S5I!7RkI@0PeoOgmT7`J&51PS7m&)0LfT}o*4chDQR2#OAYe*nTp{*`}=C}UNFG@$-jnDcm) z(WS-B6j?T$o5E~jU)KRO8-n)i8{J8>8OEWgGmi1tC(?gPjCA-mX=#5257oA=z%;yR z*fdOINK~mLc6=uSOV^RDa`&2byZk1(njADdk3V$*hF)TBgiqGw@Y}^qXO;Q(PN@=S5nq^FOb4 z_YDbktuH6L;!=(<0&^{XU^jEB+0eKxG668YsL3n60?Yb=N8C7bCo4do!BZ! zE-{9F6an#Aq;pB}M!5V|xHyY;z%{T2F#73!q^_cY?pvQJ3=G_IU$nxWPLp7?%!R#q zilwwiq9Mu<{ur;4=Z5`w_U!v=Y=^8_cc<@Ah6BRr#cSdskQdh5c}%94^igD9Uf;L% zO3%AE<2!q5Qra9sTfHcZr3i_N6OV7zpw)8kUSj8LzSfX1>r5cW#iY29!jPLxV@DZ* zeuh1j(+S)-v0dzxXdlPuO-YjydDO?1ZtUg)1E1x(6geGp81IpqOJRIM%>0bij3kt( zlKe#Ivc)R1d2q>zu_?0Re1QkRc1L&43aNRt<+dsgW2lADn?gXkG8FFp45v$3jZ1n< zL%!qVSugw=4k1j-?#&}0b5p8TwR7er;6D+AX;i{)mf&c#vs`eY#XegZWj#WNtb{blZG zwNtH74w~+OpMQI!8GxJq(GBmDjLtUmX*5wW%*FCLSk(67eSG{7f%NM!8E&CynpcM)D>(RXqoXk?ApLxJh-RJ?m7F zt>eniTJp4%8DaBy?O45+1ujNNib+Z-OorXZH8Nw>_4P9nP@a$+`IxK+99x%$- zv-DxVhUOZ2csQ+Kc~F{kbKuFlT;}WV=_G*osa3M~l`9Sb~85ieEkHf(uC&>1WlBq(t83Joz}M5bO(s6Rj& z-Zlxkfa?ow5H7K8Q1K5y~c_u>q7}uti!q(>YRtUY0A-cxt&m)8B_E6naWq9a!%}=)Pt7Dbe`AG>bm1@XX zX!O@aG*?nc@H9(~d-V+r)SKg1g{gKxRkK7q*}#625=IOVZ|`;4vXCbJpWGH4Jpum2 zy;Pt@oXBKS>5&CY(gL{jCZ7(C2GV$E!&l{HA^UR&M1-fMNrXHG0z486T0#}wH+Oxb zP$OjDQ&-_mzPGP9>M^6}G~<3U8u(L4FkYvaP)qhxgXxqkGn(Is2z*gn!zIy^R{7Z7 z+8f5&*d9r`?65UzxWS8=CQl2Ro@fH&BoG_bgcI~HymxBzb^9;lt0)`_3|Tpzmeom} z_)m;zJT3`t*jbBsV7@33H}da6>`9n9DcMN|MHtgi6roE|d@}2=zs@|l)}bL4LtyVz zAS!MGQBcdYsPfmS(ypcUFnckJC?L+~4!4VcWabYYqe9#8jzMjw3OVX(uruCSlYn4$ ze3HweL?XsG`(}%A94AEQ9ftb(AL>8szq_}6VR3m*lsBI`^uTYQ4}g2OMXeTiZ}3BQ zewqq=Tq_4o|E4jR;$-Job{tkq9!ZQ-i_tehUOz5oIf!i2%`P+k1Kp}sL_RuDGqtcl zGWqsYMMQR46yqb4F~zr)6<~pcgRkaE^xLGE!k9=f=S{^lsvtuLqm6j*^91hQ;9E7( zBVh7Tb(pr`nx>Ba8tH2}!r*@}D)`PDSSE9!llNC(HH=k`nC0SWh#}WHt1c`4aG)?l zfqPQK0`?wb;n3BD9*<$I6Qe*cA=f7vB)gy}-I89vdj%Lq5mCnTz_o*0PT~;wi@Z|& zXap)#R4#g=wZ;!+T9$!Xvz9aE*r!w7q@69nRYIRao42a5q?nO|{TEO{-9ufR3F5}~ zdS-^-kLi*CwF^2Ye~GV23|c>dYJ~8?pvN7@q-{xWw0bs+!oWZH$ahVG}_(W75G z>T@NN2g%r}j!3|*7a(Q5Gg*F>D3oyLTrK{}<`UTXm-OweLPfC8Oz%2kzi0raayxwX zf!iyiJ?+zzBe_`@G)klJTNX~UL2mHfZd#jm;FE#1rz$wBPE_x-w8 zzKZwHBapp5{>^=)V`Zq+B>-zjK_UWZw5u4?S?dHQv)KiJ59-)yjdZPdC1f zfkFEUHJPm3Wz0Tx$GU+=l}4MO{ncRkP*Gcv&=n@<-Laq7yt7^*qnOJbUok4fI#oJf z1;W2hBU>l1SG4P|V>N%H$ue0%S(@?$xu7Q^HRnIut9ongk}ifT2Xu4vKu-n4Ax!_T z`d%6%ao1E7v~pz#KAv%n>uaN5{)5T!VIw;n>G?k6sqSR>nfbW0;}Rcuvra%~hiNX$ z=Qic5^KWAmCQ)(%D`8VGum^a3U8#+wP`4^$O!oG;5#Z(Pcgg zm;$!J2{!YRCicShWX`SFc)Z1?ttD1neRl=Sw!4hwu$T0Mv!ilc@J14|ejb>r&yei6 zQQvBkmE{{(op#P#q4^Z%>seXYNwJ@vqTlp*#-luZPs4HEt#M^VEf9mZMT4y-$Dzu= z3Q52W6Y`l)8g#mdGE=L@z_XLN`JbTVBEs>n6A!G1#D7I232zPd>&TT{& z_n|a&HFY+3#V?WNy+=P_W>z+Ip3`8EGoE^}RL01i8SraKI|mwi4*~VUSgdh$t8QQL zgmiSZ?FM}9T4dd6|3bR|R9QE?27)wZxW-jvC$$(XO)(7Iv_UulfdjE|m_Np&Mqfqm z+ZwZcBdFDy2~nMyxmwt)@Nf{{J}s;LF?x~Kf9^kQfvhou&mb0>+8tC#0yoA!{3RHbG$2Co|*xI?kxXAzHXiR@*JB}G~m|5 z2>l=sb{}FrDiv7%jozV5y51MXLD|v&a?ZPb!9xoecWO~Fj4fnGWxZo><`=A6BM~{T#7uN$Z{Sb;i~5I1v*q0bQti7_c(x@XiU<&mRNLY z-6e;bhsU{H28U``Cl_N9EZfBpZY?RG%k0i$ZpKmHtwc2U)3QLg$nV)b%a~lr#O4>p zxE$V(UR~d-jg9cIfFV;cGxV`PwXVz6d{rq2^*Tp76hD~~*9d3`wvVnWhibUhZO7p& zgcwT2yRuwja1g!4rl)w%4PC|cO3MU|@8`RpL>!AIi7Zm3VrdqkCI0WySofx1r)BUe(3aVUNLPk(5^VwUUHT#Gw5a3sw;#@<3&$m@&l@Oybc^U^9(J?Y-7#hztugZ z(wjRt`+fWeGsm$cpue_GlPS;q^B2n5Mw>$k5NejySy_#6TkX70^^HV6v@`nz+uM7? zEpMvk_9t)>_nrW_ayj(Yqjj=|8`(h_{-RRFk`3_(iz4nZ0pMy}{7?;1kq(ChQ&*ud?)zWAm(P|5Xu05<`Cq0~8EQIi@e;V?YWOM-uhB3MJ15B3R9CKHgSu1e$xDWH1 zID*Bl&Z9!i+7%Z^yXxYGY*WdSXI&ZqFMFk}?S1QFO#+9((SnEOuvGlA zEt|SNSRmU4NR{y$giBkNl!d2+4~tn{kED@(@++r8Ocqt*MBpH3GmJw7{%KX8aYg|#EDulL{sRT6a$7|ZXkJ6 z#&B%ST61M%d@3M)nIyCVt3Q?Lc-l9C!QY7&Fg^5RR5si;RX4P9b z8zf3fuVw`&O8gtoO($PU1y6%Z1Lb#qCbbI6??G5Oyid*&e^MmyMG;W&{1*^BG4mcU zvi@d%yNart)V3n86mYz=>TYN3(LfX6kjf zSTG4wIWze+%nD)lDC_8dN3&6i^cswxXFdfLOsbHgC|OzjBA~~WMGQq@{xW&{^dNCs}UZ)0CzPjLB>tgIn=^kT z`CR_})G1z>*EY~UqQjtD_$#rsLXj*>igcmRl2edx*BKmR0ZN*$r7Xm@SCk#z)%LGo zTiJs4I0n<$<&*-g_j;#o_y;(o&RKL<&9Eg<3xPd)g=fupP2D;CU= zt5m{&!}F_S*6qE4GIx=*Fj-*|g2}IvF#;rufLoQuh%J$TlfbXE#uc|8L)&klf&7`M zdp%*nSFYZE-MFLDdyU~seJVm}vFg)|_B)0{REA3sY@er#bhIBl-|TlNqJrrBI&=e% z^=gD~8Y;8X#JF5GKjuFROs6c@DhNe#p+CDF9)6>v`nxb8@HGQ1Nyx()jEZDJEwspWs1`7%qN&{l-$}r<~f_m zT4~sX!Bj;^f}e_f$V^=GQhzpZ72D`#V`TbCX?gPywlMfy0)sh_tdRKa+W4oA9qc?+ z@}jQ4^Eprj>j=#q9c>OMl`H7<9MR1q35yzQ`7EU_%honxMf;jb;KecmAl_ps%(5HM zU;rLcFHad=T4ykpwd%ed?v3#-J@E=TtV$;q-4c(jM^}qgl|_5334{yJJ`lncl6*9t zazJOwwL`CO>l6Cg+}vPGE?`xhDoX|giY)B{y^+x>UH`})4*MHyo~H6yNH{yhnQ3Uz z0sC;Yky?X?;T^lU-w4uZ8?~-2$<47%193hd0qwF64j!kC-cadTnuI~<(rRs!ZB6&@ zI)#zZf*5o3cz5g+FsR4*Q~#LkK#TC!sRs4*Eiudxno7i;dY8Mrq{IN5tVvM6c;s-*n3i*~h5^b0VbZ9JML(s6Fq5FSRQ#onDPJK{L-MlGNf>^v$_ln(HMe-uOgalXZ>vBONT>LZOk=ItZV7QIV@|Wh*kSWzW73k5w279bK75rmmH`p)O~96U2vHybET#XQ@^LS0d zminGXcN7iDo9xe9WHF5aYT4@P(8L{{@2I=mOe2r0Z-tfq(ES8F{PR8a+d-mdE6#` zeP_0>N;HlAk<9SG)Bsph7`c-sKEBACrS5RJ*J;HvU{@AUMZL!X2014Bp4fh2sV;6d z+Fv!Ksg<&1`gNEvzTOe;+4o7N?|MEUIHzv*LFX}=o-MzlEp_ke4qiqV+Zoo};0+$) zoNb2ocd;@(`_No=m2KMGmcMG3$q_r*RE+#Aui(6V)ty*zV0`768103B{jcCT(Av}8 z(<8XoL683*QsmV6W~#8jTX=m9{^v-!v6+#YFs~^mz7x#9*GASY^BCY}88#L{RYoat zHov%sLEI;GyR$AH@`lv$yFmSQjTjk(_-@cU7lQ zo@LLMi7d6xk8+qr?KkCWx13irtj8k zm9C1+m12o2$NA^m;|9CK^mC3IW%YG?>EFTYr=D^83HrPH!Z7f_n;WW%0!7pJNc+Yu z%6c<>gAD^AU2G^xJN;(mk@P^@xnt&nVh3;OdxtvI+z8yKV2+JV#w0Iq@JxjecEv3T zsv$UIwo5xcRPqMv5ZD#4h&DrH%AdWx|-rxSmeVxS@s!5 zUon<0Gt{X|C1gU0SK&iCQjqA=j!4Y-S*wLTz=NqOjelK-kllP-|uf z0H~UJn8^%r1-DyaiA2SdbtI=;(uZ}^ zzs1#%Oj?RjgK6tR#~B12od2b0yK*lL*#^w1&6LrwN?>`ewY|J_n~da^(<1rT=ShK@cwAsN&+1S*)hj@oOlV}EnuAZd@lVoV_I5qrEIwc_8+MJ%$ zTZ&qxIy@SnK{#MJ2|BOZA6RSXKNA-J*;p*6q+i8jWPYqAy8a2yJ`pO9!8dut=altF z!flAwwYapmfN>o_1rrZ#yWUwe%ab;GM6bljV13v2ua&ueS`4V+>H5f(7&)Xue=E7AgHRwe+lg#}>Nh>|WH2(bvIR#rm`BXg|0*EM6K9tQ4%uQmujjafL`_`- zayF=0V9hiIO=MoT zaL<=NvZ{1jc<0j%4=+hu08|dynod|uWE8emRKRKCIOk6 zERNmJRafwu5qr%h7FYTQH`V_(1?$V=%v13t$>LxIaX?H6C8uAevCJ<=Yv;4vA!4b{ zdq^LP3yuF6mlbNG=9YLFOFO$>X&jXIYt)prR>>3k5JD$POH9*F;Hv7aW(sn z4v*?heVr-TBl&!Jlyi9y*r`#X<-?-s;}7mB`8N9yXi7`X+k@vCBPv-;Ng<_2 zbS}eP@s-*0%7Q)Fbwj^Gb~6*$sQF;clogvf;aXboveGS537k~oKD3}dlQplyXF99< z7Vuhj6(8Jv?ZyUdOLK!q`FD~E_R|H^M(rK8Pv5%$2AG$Xzvap4kE}5;HEW<-%w!7N z&a9G&k?(qp`>vUmi4AQa(v=c|U0Oh4%CJJr4|DE04_#PllE>;)mlK&l*{>q!tMUW` zq^~H?3D(XVyV}`kFI7C;keGdQ;eS>Vzq|#F6bW`Lza6vuTdY!Bk{<1MwQ|k-IPB>5 zX{yvaco$B1S9#&)lKB*b7#4bKPfx5 z-M+h*SkAfQz-*lv_DC}0ufPL29c40Sl@q{ii*?8=k~Q>WsNiKD{EsdQhF zbzS|QdO!-fk&}Y8pw-nAH!0BHt4fI;L|sH?bt{1{L-U2xs!lp86iH7=6-5AM5QR~7 zE0B3+$cC)O{3n z(!RJ1u;s&65IXw&(=k#5rzG7mC_xOV8r>3X#5E&KKWHwLqo*g8-*uEzVRY7<`SaQx zu&f}fq68Eb4E+3!)mDp1=IG`7Y>1TjPuO4dU+@@=e+AT@c8~u4I4S$bh=lp^zk`C0 zlL{34&`beF0W8FZx?6`dx-atmsMNkCfKM(QCs$nKd4CQmyTaNUGlvQPgGnp;skix_ zikao{9TR*sVA(jWa6C6{@Fr4zqP3jOz(#J+i1q>A(?GUY}bGs-w8F4lb?XFVNE9!ry9 zE5~GY@{DYyk=0E3R_&O`&La6N+h5KaHmnJt!Bw8eD5Yn3xXW3)Wj)tSI+g&UJKPTy zuMqfS7Dt9}3}u#z%#Q?CgHHN%yADW8)l}X4u{L|&_9%CZKn7b6;u)&n;&5s0=}+Fi9#CR&ohEhNu*e z_|1;(S+B7v<1T27+X@%~H-%)p(?kdj@QM_zOAKcBEtAqAG`VOaT7S2OgYdlQlM@ux zG*A!39JP}9mA7@9Y$_}USUOriKP_rMe;&uR$j<_>`&K*hdC_13?z(7MP zKR`Uc<5d-C@x@iVtvh$`UUvR4Q+iyM21OpX`5<-@c<^^$I@>af@P7*_Dt^BtldOA- ztW)`GSPsB=F@^Lgz{o>j53xw4WqTVmy7AZW=bP&RA4ez~TlIZ*cRJ!>`hS4&^E2(- zw|sqT2RNRE1R)%u7$CfoMoN#A+E^i3$#7|@^BG?SN-Xc)hrd{3n|WKD>E$T9mjqU! zT@Tl;hJ7>Q`@!jG^>aag9`1vJ#uM_5i{e z=dq`LWdmY%F1MqYD$esUa=4Vs;8xgZ5T#`e+g8kFjC5sTd{_}z1kGmDx$B+s(0_CN zi7aL;9sRn>OU^?@MzCA9EBk%cZ8&y;v$k0Q%M+uHj9@odx3n6+SS>W^LL5H$?? z=*eF!l)GGq&UMT7e0`p&l)`~J*&j46)=n}zV*>^EjF1j8Q8*m&xRCFea8lP2;Q`e1 zKcMXEL^c$s1=U7~)tVkvOao6l3{oV2IXazYYp{%2Ye!Dwi~HA@F@>07-sZ7`mcsEV z4?3tjL2HT6i4T!ytC2Pn!J5XIs?GwHfsx(w$}kp*k~Ok-(#(-ySb{fjX9|aP;z!e5 z&T~uOmhG|8p*5NP`1INn$DPZ|G0|{!*-j>OrDtJFCWl0YkT4SKNZxrx;Hwi~FKW_$ zx0t$A<+2cRm6SbdlIwA-BRMN7lVD1Z2yo;n>XYU&rc=?cug7w8RDHzkGZaF<0+l#s za73Kdgirpz7T5BOvQ#vg7RgzY#S<{QmD%G3RNqNzdXl4lUiSq1qe&}g(i!*#*|*KcR=rl?4i|jPnZwN?JmQ;X+i5n9T$l$lE(Qoap@39PkOMI zQn^0rT4n8#)3u>BjdrBeXAuJt6fvj;UJL(EeCnB|79t*I-rfz_yOwOtRJ-FCD5pMT z6kvGBD&`W6mAgqpucNTa{7$j6x5@igBRY<7H_O)BG7mJjA4bc1wRG~Sl$hpHx<5hM zvHBM0UU{u+Om>_muBR-N4<;K-8MZ}qg`cs|gc_amMV^agA`KZ_$}(Zb*9SL)zUMr@ zIQNSO?q{o0ASk>z;m5n#TPYdt?x5P_Z|fk@|Gij$H9@gIoKlz4?l=4Wp3hpC9GMtD zD>$ftK8|0ZQ&X+a#%nn4Us5b~<8W;tWb(_^&1no(Q!8 zlmi4P^V9T%S~nh*x+_@T(i|I)LyE90FZ!WN8ZjqpGKszB%6tm7M5AydL5cTK=zRv< z9nIlIK?zWBY0abtKq|l;-nNSL__%S-pdRvRX!+^hz_=?J zSH~dCHWJxjLNYuZu!Dd^iliF#|8{5*s`+ow4h`{=59^0<6K2MpAu-#&)x@uS%g&bO zPrVs9b*3jc81vpi*+@5VfsIq2UKX@$Pb*pdJd9+xWnetYop>)x(}Kgd{sqekQaakD~t1IxDD^;@n*S1SFc@}Kxp0#s_wUj$9s<@b z2H+)H;V-dB`8V&sz*~Y0C>meW3xQsR_&=Ec{{xNu-v9qQADIF)dKB#5jsN>&jez?X z$N$s%<^REO2V0?t^#S;9G5&WV4b0C@+XDiY(7zAOEvsl1T}dyAu#f-qn8Uj;NdE7Y zEk-QPUXyLGD##Q(9OQSJjcLGsm*X2qwOU=34Z6&=5*|cQIifuctEPU6c!jIUb+9~o zkj3@@dN;bYUO)=`XtA#T8g(sm?GP5nuzJ+cdG?B-# zz1f91k$4wXBhe{f(WwV&x2o1>sbbNGewEKnzx1N>iH>GL5MHs_g@&O0r^2s7@BXT5?Se0N+h}L zpy7<$mohaH9Sp*R;}QmD5uYeFYIi%yp4>ZExrkI)UkdG>s0ZDfhKbq4SD{2jEm3h$(Ucb3`<+!+} z=LOg;xfexWCF&!Ya$-(r&fcIUl2OM{VfpfHJEA~N&f~8@nL6MswRVqDCQ3M@Zehl( zC?45Hdja2QlX`>3NC5qRFi1J+Fubp49|x6$F7*t(E|d4yI=O<-;7*@b?iL___g2iMvjbczf6sHR4! zZeXbBxrvqtAdPdFYuopB*@(_kbk;s`xf=W0d^6o#m!^uJ2MyDJebCF~6oQz=v=UAKXfDijn=&XU z+2Z+Em{^tUg8WTmQwIjoha8~pd|u@>?&w95t7(pLhtp%}K6*Q>^jGr-+SxMU7iwK; zR-sLQ9`q0@%MM|53BE*WPd7s?m&q}d*jWwS?Drq_bzjrgDC-RxH1TX8@L{@Uus{h) z;Nh@Dx3Z>0N9MND0=3Y5I`Sp#nVR@|p6XV1Q+t!X#4#aKVj$9GRMn-(n8ndkua;tB zVG=xnxW0NIr;lyl5q_hO;Wl(tHcDa5*xL2ni#d0flwZ1Y`^44xAg zgO`sf5!Z)#xGG^WokzRH7UcT<$!TBElKlRn#1Wor9U;m{+LQPaiFMr$=1hiY&=k4J zqMc>Vp>J%B=~d5S3LEKnIi|~-l-UMc3~Bt|z1lyjhskSeBMp%(Dz&MrtSAJm8fg190mDOG*dC{uf8;mm z)Bu&=$)Ly{N77z+FRf+ixH*rbDgrF=?9yS}+P4?NgjS!%^(Do3_cc_$8}tWW732Nyh=f zcI>XPoj=IvC5qtVA!pXcX?9!(?i*;niab8!xQ(6JV<89zCf#1dPYcmhX0gBX8h_T( zW_Z9n@>jF0A2(!B4L3APz(o8MHDGmdUH~sIRXA=wk_<;N(6s1sjjcSiKYab|TR6x4 zE6z$aBDzEUr#yy^TiCut(n+UZk@tQxH z!FB-zetKRq(@)Lz?fe|_Z6>}hkNeu%@x@L!3(1>?aR9yV8AY-+&d9-fFH^`>ln_Zo z&}Y&q=MQsKR)cq;abxNQ$c*Gu;eFY9{;OQ~`+I@mhW^msA}#)ba7TS|a&re_4@DF4$sf2f~r< zeqF-smwT#uAAK)Uz=Z<`9V1_nd^sgoNO5s@>tJvnk9T{FrIQM~lXuS;8=D1Z5g{mT zv)EU9=}QNXZ7teSB#1(j8PFztM;|jq0K4ddQr2WsFto03g;i5KUT~XwT)1YBM|3og zlb$i|8Zl$qeU$5KWf1dILrfeg`zszrxb7Ddrgb2LO9ueQF%D*9ysi+Y5_5=2P z1_lA<`Z#7}k2V{&wIRLPor7Z8fOvb;-R3|n+^pj>+x6HDyE}{bz^Furp7fDxpA5Xz z${tq?V||Ml+Ez8phFwD?ST1I}aopCMNv7uDo3Vj)D(6-)(18rznvj%zz@ie} zoKZlT3L+OwGc!p_#w5)F%+KU()G1Z5NJb~1cl(8B1t*D43X7|gd$cUqk=wUEb+sRv zOAqJr6oWXPdy#oie``!K>5aefM=2k2M#}`4C~SvYKsc+R%Pm$r`lXz5Z1zMf-FjfxI1JYI zyI+y~O}{P^GG?tJv2JeuqsV>!Zgq*BEM!g9Gr>7q3I_w%Qd1?E|H{25%%#)NnH2Yk zydNfdjZ2+K6<01H1KPLmEmJ;tHgaGVsNJ`h(I=_lzgHmvWUpR)kh5~M^g>r_NSgfr zgW*y=xH?zu*j;?q7K<16D&&Cnflp5+pNQyRplKIp)Be`CGDrE-dO#7KTC3A)8xbE^ zH}B%tQi5NUC;z{S#lxm0eElC>@qaL1hQxvmcGnJ59_{gm4-Gd(6bNfq?K8jfr7^uQcfAR?rsY}R0Zj;uiKg1MS@=2u7Bs8Isj+JpGgzhwD{ zT1@Nqm&=#4d5t^onk}b~l#=10w`A8f?lAorUdtmOaev53Y?$o%rra(jUHeC9#p~ww zm+h?{u-6(Ah_ap?v+x2D15@Erx1b0*{ytS4($<^5#b2XKViD8``+Bk4k%^yDD0ZXd zJWsm0$yDmpw0U`rxoTjO={4_2Dza*WA?ZZ}dk^EhnXN_lQz+NAogBNjblbT&zjS?g za@w9EK-ZV(`k0mM+WFsN=x1qDCjE>LuiWfUf!->8J#Ww8*k zflOtiIuhB)_%V==_&v2ek~K!I9&UN&<{A%Jmn$|UaAnPV^@UA7CI0&Vq3bQf>S&fO zP&5!UxVvj`haka&y9RgLxNCxL+yZRe-Q5Z9?(Xhx@7>9J&biMfsC!wrsdvj!K#e5{V`Xk`tzxM+SwH<@}7q z`;(`gK<-2%bysM{UdXpjE;+-DG9U8B4TB?$GO(!uZ zi-Th(OZq&8@-Jhu&uj-b&c4si8*Q_lxy*jtD#68tX`0{*O-Pn2uIl zN_9}OBc|LWMZt-Zmajw)PqfN#9qHT`oSzRzGRLO8j%PY6vT0KxXTwqiO40?L4(n2)4rvzsKT;U|iXjn!Tq#vC#Z{3PFMogA-$F1*YB zl@BuoZ~KLBcur3(#D4?&2jWje5+OvCqt~-!0U1P=Efh(Ga`Roo%+ zb7(Q2pKVGIcIU^cqBU&BpO6T$Ggq5bt#NR($lp)h$4L?njppKQP(q$jB4GY-FO+*3 zQ}~-UI4sMJ{~%YW36?{80G~oiMjPSG3*=4IL@)RE8z7#PbYVso9R?R-BaT>_?CP)k0f~>%M@>F5zq}^o7HK1f zF(vJPXo>V#h9tiU*p_fDLfG)(vtPIJn@awYmLs6@KlrO6RBN5AqMcxzR$FU}4CU*ju8`zBvHCJcUz_kHP&QS+P!v5;jgEMYIYAN@N^*I9~b!eMUt>DvHH&7BEg%B*@ zjl=8y2ZzjGm<;>@POxacrE=6Ye%8H+|8f zf#7-}e4P9Q&Q9(*=a)azV^Totf7mE(%dzG+1+SkYhGqY>!!u6gmY{(_7e2qbASO?5 zT;N!V7GhoR9xl$^eYu%O65Wn5>T%jDTF3iX)O+qXuSx?YUER_TcEXtGPQY7eLHIAU*@(=9b4+(U z)Lu#sSh&zDIzu0iR*58hWd=?H;&nQVDX`dVAp5z>*V8XaRy2Lw;@3*sq#)0@*GpL0 z1f*Far4CGN+sU<~M22$#W9v@983){42~#b?yY8zy1YezB3bd@!@f*Vo5>Vo-8NR~O zC&Me#yI`4tD#7JjKEm^?g)*%Ep7;nv$(%1gRgaho3@g2M& zk17RIT9A@t(F(G7uc~28JNu(8VG|c9Uutq>ZLLmaSL3%j_VW|T_N8VMV{(Sp23JTj zD!nt?D8hEcMJATM zj3_!1n?%D#q<3iVHMTUSSuZyflSNrNFWm5yWBF6FNwQaO*npf@z>|Nj4Y2-gjDn6) z(|AP{KLq6nXNIE@-y40Lq>e4In`T~8`$^e5Q=hq&b%AR+u^}6)zZE&Fz9mMYJqUZ( zI789#!-_Gd*@SDY0w#K8>aL;xko?ws?$yjk_Xru;<~*(;3|&Ur*ND-ILdu6z-*0Nq z1U|~c7>0zVydH0OET|)AU&7m-&^wU(w4{rq_d!Zl(=r!Gb`_g6T`T2k8wL6H#R?SP zvLwj}SC@#K&dN<#uNfcsfK1~$c&nAPxcvfB7v*2D9KOz{>QywBEcc)r=jWM@;rK{@82_D(Utbc)sTBN_`D+sWf~E*megGNUB*QCyw8jp?+x>XWkv>3jD`IJi0JJJqou;VeL8kUGG&-hK zRNd){dMjy?u%r{zes7QVW|Od5pz3WbHZf>u6c+}I)S#g@!x<>-l)MD9BL-eGV7Ul% zfp$r3H494f1$$(iA3?H1fxloyz99PP;2W#l$m)qom5mnAQBZ~dqz&OeIKUd9DYWFq zqmdxXP)@3e_?~Hh@<1Oqs}OpiX=H#GB;n>rU;vm@J*r^Jm2B&DXW9-}tab_<|F8&` zwW`XbZ*40yPdBf6IvSK7>mYSfRVKbx3ovhycz!aTu}N8?2$`npIbE-AT3OKwtiW5R zUXbl>4J}hM@H8) z_G(b=tR{A2C-ccCk~RgquOF*hP&CCe;Tu5UK41VdZNE$UUM5IGvC>7EtjVH9Dapxf zGcL=~4^rq>d!NfoRy}ynsf~w`d&*+|f^={Kp}k{89_x@%>us#=V<}J3*?6LWRbKMN zB%5QvrEi~#_9DB76L|*~)b8UMwO6NgSrHCszvB+#j-y8MyAWz8&bq3|QL=Y&4|OFF z@15h0Gt?;$XA=H0LAJ8w2&s({k_6Gv#TN~flr!cx*`z#qDYD2Q`DeKhchtk)HofSC z#0ZpxQz%H)LUE11^;f)hmrYMgT2sbp?zl8W8BIfMI>t2}HF5ry*!U`4)4cymFpm6+c5$UjXLBZX%4&|;nOvz2dYOFnu*7SKn=7r@tXNkpE}44oH-{W3 zfN_{^W}zb&Jr@d9Gub==Kl@gOVoIBaW7n;7F6~iX!tAcZIg;JD~iSifZ0m5iva$$%S+%70kVK+Ifm6m}0z~9exEaYjSk6Zq;&7fv*33b>*llYh58|qF)>QuU~lyIdG zF7|-Ka%i&GPgANY5%6h0QwDVlEMx3*k3~-_-~FiZjT-n}Pm@!WCE}7Q7mk$&cKzOu zF^I{K%?W7DyaOZh12E}1CDhUr{+-BD}|zx4@4g-)N6^^w@S%ZR;>)`i09! zMndSC_?-*N1JZfP7%Srs!y7ZGm9H^jP$lQo;znbn)?&IT9QZU486wf_$_oURl(Csg zxY=3M9A!`uz|!}T_P_Bf>dTL2j!{xev|(f$LrXXe!*CZt&#lMTC;qqA`~@TjY}!W; zqYuF8Dr2kpwU(fuS%V4*hQrFQC99n)|3LWB2z{6EM6{$-a}o0Y0@rC(7lzG~!aCZ! zcmEFre$|XSgJk2}X*swaU9G*nJ?;}Tk>8kcG%c49rTuZ)&C#;Udu$E>I|6w=lW1(T zAzo|5!A##&v^zHHam6$4mX3ysIeFmX>6O(M-MxnWLO9f4X@wb1k-LnljJ+D7nh*n(m;bnzTrdgq&@ z^MTcJD~5=_^*i0Ud4aSyiaA9}P6*O5%3WABrldHA z#aKs#K#vKDAwfr-P>}C$l#ml_VfGUhDk?q|6Ec;a+@cSHR=Ks9`X?-sk{M7DM%+vw zi<>zT@*jwExCiZetdyNS8p)94O1m#Dvl6CLKSG@xWAdV2X$u!O9S>kG0_22&Zm|AG ztB_fjq=2L$BDMjm!)TUzW$CrFN1Z9D@Bs)CTgCwlUORm=!M9s2&8Hw{f(7O9qGgXS z`g+8h_U~0|k{9X`5lrT-b*A+|Sw?V`)~70cgE$7X_zizcUj>j*G%qyC0n(Q>ZF|+` z`5DD@Tj!CF2FQm3$)mvE^EnjJpam|^>RaG#i%>CFJIn;GlyPgEF}+N-D2IIM4``|Y z!#IV*!uq;+4b9sX&U(p)Y5lqUK!f4232bNsQ!z)b0iPAy#)YR1G;byFo|07OzQxal zPrx0?nGayO=e+MXoG3|Zktm1Sbt9He2h>}px0RT~yh_O_3ZJRn`cWJO;4xR9i3=BX zVCoxgf}na&f$2%(V__5wfr5;CERG6tB`4#L5#X2WXKC;TnD~LW_?1N38|6O`DOn9) zqh(tqn;WcYsU(^*_L!GNV#f&}zwUsOs@KhK$QvXcH(67i&Ck|l1mtZifNO$Yg7=C}7aztPFRL%F}hd}nOFz~9z@ zeKwD?_65+$@+fG5D%WB$@FSxCZ-_I0*l%+9`@UGSr)G3ma}OXP_R;DTtx%YU9f~hZ z{C|QKO8FaX_5lby{x|S!1aO<(*}H0i+NA-T5mTy?uV$#r>}@vkp0Grjz6XM^(rr`J z$+{S2tOVcr107NLDCP5Z2B`dYRXh2&KZo6J9MQavq5d6C{23xhbyQhLy2&-Of{UY7 zN}Y_2R)2LpA)8TcMO-+Pm6HZjB?%I5j|<~ME_a#_3#O>ASB@S0LCo(DU>^SmJhn2Y!z|iN;n@X+I;k_Gn@a9ey;e1gcLHw4@L@6PHx1H)`_8IS>qY20&5U1O<_#z0_X>x%xw+YEE!rrS24FEk=x8u?Ow9odbg=SA+(FFq z#4Ks#v%G7aSlsZFbh8AR?p=$)RS0f`rT+EyV~e)!FaPnCVZuFn+m`(=-9=;j6Fosp zxjH!#3k^_f%Us@Yv=FBIPnTBw77L9nsmD0#Q+*R2Fu@-j_9!9=O~AFvc0q!$3fygy z|A#pL8)uP<)C+lf`z zTx!-xu>CxXfaIj!)N%IfjIA!bCS#Y3_NUr}8EK7T9xro;i_@Zq_G zWEs!Ktd&r4*2eh5TimCPBdS{;P&U%Y5)4Be3NBh~Y*4@%cF#@dJN3+$yp0PVt*@ivLW#siy<9%vXYcry-92^iL(k49dr}Z}0Jbqe=uFe}{i&D9$atzdnGb zclj?T!1Vj?(7%n^-zt~eTf*=1KRNiy+ywO7{P#lt_M9`<)hGR$9y44Wbv9z0)}!F7;WN@2IuxNDiQ6m$Wz zWPQB!ls=ohL=N=K)IC)KKV0^7q0g=g4bKqYYUFME9pPTXr$!acch@GXFDS6^stH5t z)KCUWsQv2jRdZCG76%_`zy(t~2bfqS2-F`8_=gQLQ-kGQM;uOKDMu9?>v@uDL$9xg zG1I$;3O?i*cdHu#osR4ksB=?fcm{kWU_E(+Yy+lYA%<3XUd{tk%zqGT?l?jm4)7K# zZ+=?jy&`Lwa{6GztIOSxgBN2Q@9o(UgGXL}Nh^>qx!nqax07nObbv03ukiw(UsvHLWr#%O9ou zJ(R48z^0945D=qLL5;Q8`aY@QEwO}i?6oU2E37%C@#2!W_B)^E-1^4o^WhjkKJxP? zKqLtHGt+YIH$t<8{fpcY6D9XG9-+@mO+5yTl|5 zJxK|b7$IGQ*}3f(BK-lSq;-} zzbvkniQC}^$1J^^>pB~pT%RNQnWHWGbhBa#$q38WhFu3q-JL5Q$**K4GG8U9cJ6pU z=JdLbUt8M(hiP{Lau7zj6!|a~?9WPM^@QL#(^7yX6%;I?2@Sl`j3_%c=T_%lr6*cH zLO|k7GrHeGv(Y#d>c~!{W`3mbNF>?0&|IvdhPNkfiSzT*(%RB_ zjJz@x5HJs*$Wr~tezt`C)66%&p-!VT^=Ys!%(o077j##55sEFZsNWUr4FYr-1kGOj zPtI%V!|Qa|?2HT+zdn3{y%^*jx3YbEPw_DXxZ6#C4RGW(rS(0iblq85Q(eUos9j&P z!npvPrvoNvS+bo?1%)D;gF1kN}%R}aKJTl2^y1JIX3XgEp;8e5IH zhCkz0e`e0ZzF-qa@*b7lN^DpWTs%>2DJY6PL8L^lihPn~qaD(IF+P0n$2$=1oKuupI#h0^PXfoOV&>*AfA zW%{QPm*TKibHK+5enLX?6V9jy?R7~8s4)*--d=hg=(f3}SSOG21Cg1{q@KOO4C#Fs zERo~8U8B}+d1YN?F?H+ubR+c)R>TqmbSaw~^MR|m{C^94pN z2mu0};x?R7-VVy072|9hECJ`{%I5Rs&bA^Zb4))3K{?BKa|Vep?M2M(vV@yaDR>hu z3JuMzuw%E$Dy@QBXD~tO#+f-tnazT0bm}pE=C-i)O#(4FIj9gHU=;$F*}5y(gC?Py zIaK1AN70XK*X4|I;1D5{r|5f2V{yz6s|W`wd?=2)PZa7;leQPm*z01MvMlx!wOJQw zi9?BaL!Tf8ox(F2xyo(Su}*tXzaDr$A0y_pK*s>q8FVzYpC zt#KW93XnTPH1*Q{sLQ(OmKqZZ%`7tPjqhXJ@1eOBB0~jCff%H`rO7J$l?5U*UTC|J zP+{HU8d{y17GBywf?QSU%d&R-MC^SlIM-yNZOM>hSC7Lpj+`(!y+jd)#g4u?Ve{V_<;$jU9Z zH-swYj-0c2d9J=|h$e(SdlA(oJg(php{=5O;>T@*UU@TPY6xh`+j0SKlH5b}YPkWv zx`t%7LO#nRTH;+Ot^*pAdyao@Qok{nZy@lH$g1<@!Pk$%@k#-!AK(ZJX;G z_d`E@s-zpd;JM&!w}emBA1x05=bF0`<9 zYe}c=27ZtYQ*;0Zn+=C`O?4&od^^MdsQFro| z#|Y|!dcE#k(zQe3D(}t0xXw$dc8B)%i(u7@VurC8X!=PUDhoi%|m<( z&kh~_uGKYhk-SK9Ev$=(-ux3F8RhbBTl)k*k86P$5-rh;l=#Or_*u5dDzn?OIp1Eo zK7*jtqJk+;+8|LZFVwLN+|XB5=gRCSprRuZB^SerzVDkb7a~dt0byR$C5kxG^+^60 za~z%yl@t%p;=|O9vOlW~qBOEBvWUT6PCh!TR)oCZmRGxprTX(&?FRNPJa4mBi-8cY z^c}QnF_&erXi-y0L>)0vQ}~AVY))P3*8_1EBbfudMdB-QI2;QM3&#`IV+SHO8rlaq zGBMkR9m;b)MU~H2;^75b74%c?sl4CCX31O84EX%jk_FkyAO|Y3oaLZJ!Ud)gOX$qW zRFUH3A+VC`uEToVJhNub?nX3P%yyNIV2w8kqg1Z(VbVCiPO0jtDAi4uQMb?1Xfhe% z#Yr6I^1RO|Q@F%pP3~!e1>$F+BC#zn#DS9t$dY4HeF*+Pv$&rT<=*8;9>f*)OV*(8 zBIN)6p*dMbIBQrUc(;np<+QdoNZuHL6vulAZbVRapE$7kx#alM;?Z+2``R}T<4Cn` zW8g!y8Z3Sbg;u&)w7ap~+}lX|ylqZ9^6;QXsLJLj9DSx`Ii1Vi{@`A})0&7Xwj7;R zgxK~NqF#H(jP$HgbJGuO6UE=8gxJc$NbKuu^jCOVVsuD_4icM_(E-j{In@3ojA}?z zDk>A;KJRh@VT7#3=59O)aLNh}S;QP_X_M{;!FO*WWzOl^h!OQer?ag`%moR z<$wibi_{-Ud%oe%r)F7dNxDnYbJT{w6fhy z#$9uZL%5}CS>{-B7))CrKpF*Pf3<+ril&tt$rW~ld+OSFODY$#rr9GGS`cqg?vn%+ zQxf`&D7i{I8#d2PItIG+cclU-$Z$YH^73v_u>>f(wxCUJw-I?sIyS7HlAxKiR|fM0 zr^NJrmJ$iDjPAv^Z@Hv=Wct_00vCxBmJNWJTNS)p>7~ZwW{#SR*Z^_T16)|U8LMT~^h{0%@_!vVH{?w2OgO>FmhhFl6oyaj@VqTSf6 zg%UaEhmh){m#1!MM4>|E==aE#+EEi5A%GZ|w)w=yJvi=)g}(74yAiuRvS**){cM*_ zC-3JRdmwMX9)Bj-Z3+_Rvt1X1NrrEcZ!EXxdduSP~dO*h4MRsYUBhB zbO}T0R);JJtbPqgr#Sv<@r%Ggy>6Sgk`cz~F6htQtiU+8MKqxM4T788jB@|Bhq`FL zY9#y~VwCuR>xcI&`cCC7_s{vWyWHsg52eH>(e-RQj2*SZ&F{!?(8>UeZpK?#|C{Swe~HDrnFo9%<@L0m30Vh?1_7=_ zVMcHxV~@q=U&ETbR+AEbRY5vt9Zc^ZJr?oMRX)bO4eyb(+Cro-Y>Dir1SlV>jB?ssVB^qpoRA| z26-+BEFwwS#tXBcJi<{nMAaK#=e`*7sj7pYm?#fEPY^1Q?jb}y?kOWW*^jnELQ_!Z zWMGU!E!BUND|4OE?j|wow3fz1o>1?CCb_nfx!hGcF89DJf{BWgDTm_6RzpCj#?$?Y zcW)bx0&cFt>A<{Kh;%? zUuOe<`(b6rY2#YaL3+Ujal{t<*{wFL+Km-mcDM{nO%^Ti_wR}q^G+<>D-K1iJ}-yy z`{|_#&r(7jU#Ve`H$^8y(SQfcu5)R`3RQDQbu+W-a&48O5Dr@+_&dzRmybA&ToXlu z^Cy;qAi5>m(`nJx_;pEI%+Ii6^956uv3eZJE6J&}PgKIAym_jtA69s;Rs{KrQ{1Db z`8Ch+Xm(xGB{0p;1YXzvfoS7-;#0c9#8_Qg5wS&-8gqlLg@O>5Rs-u5A$XeXh6ldV zn~d6mzy4>f;%=WVOq~TencVR(1KtHKzDnuS)SvEK+E$V|OQlmd6V7}jNaPi!DFq8G zM!hO!(A7oJ@#}aMoum74-?+h7e2Sn9U9ZfB3p)ra@R)|Dh&0|q!l&b% z3*qYBz2zq~=AR`%A#Cmp_bQhj)rj;sV0E36cq9t%7t5k@@R0A?we7IbM-=?72k40| zIUFLKt`-lY9wh7+{=tO`p!80}QQ9_B$x0WZ1QbaV$S#|+ejP3G^jTns>sGz8^6P_|gPYD*xj(Ct zeI;z}N^r2GRvy|7Gs_PUl%roQCoR6wK1`D;x;gv_Y4-&jxqmcDP7UXFn#WxE?&*_< z7>+=804|LYsxLjewN0$lg)!~v_c&d?m{vLn;(LKj<6g9_l$<%S@gvIEwo#(+jLU4l zDulom`aJc+#)V%25d~iC%@;z!2gMV5<>FeZe zpyt&imB(sr)~*dkN4bz)i0I%Z{ues3P@~**|D#KboADw_3Ist$)PCB$vw}p}wvsHD zePs*7Uog|Tk#4cvt5BY*0Vdg)tS}iNMI|XPMFXjGSW*|HvGU!v4%beuABTVQn*vTw z^h<<9g!rk>K9WOj^Gbmi3hw~~2rTwfU89@v$nAS?=rr!fi3#@DHw-U5Rs z8xiqM61!LLQ~Go+5msLILVL5gO?G3rj#SC#WPGyt-BFx0-W76VdEz+TcNOY8PM5~# z!knG^JMyF&XU^<$XS154=(dv;TVj7#hzQoA_CjFMe49Sy$Tyv_*=jsk3rAiqFL&+> z*Xfg_v5$cf-&Wp21N90;OT2m=AcC7g@K(=aJ zJjUr{zpM*7%@(0VNVW=K>h}nbuM(7OD2c{?6qk+Ng|ALjCmZ;Na(v(!4GnLerZknG zV!xA8cw=e8g!yB)YQWX6PW@Wq*C3Jstje&+MX_!X0UqRvBdU)YZAGNg7>-(qUIrp! zQAJ(KSxgSP<5X#Rry*R<*3eS0EA)!GuS&UX`#C|% zPIN=?HnucWlmWl^;QldOMX`I3G}AU0i)e??aK3_*Mm3d&6h1 z($%Ae=?s&4e`tE-OS}nR0lJY9BBvmxoY|cAmih7>N`;T&6V!s(M7u%$@-O&=y!{$U z`~1khV>@Z-hEb<<7Osw#+{;X-!E4%H&G!!HyKl7=zRJEzdQ>#jQ{A4r)(Mf^@x^(*Xf^REsk9M& z#J)#Zp>RYiex{n%+IkI@Ci9*@%%t>w$HpPVxOQWD<5^8z21nvYNyD~$kk{9{%DgJ& zor{S%K;Am5KtDax{iR1U^opBUc}GxOfeDE;xR&w*dTkpJRqtWggD;pOa5drW2*J&U z2O;$w?ZrQ!7?%fItu?aywFS4cAz`T#xkgBiifF#7t(TFTs8!rQ=!2K2cp) zEJG6gtyWW)A$wvuXJP?YxVRMo#XnF|KLrxPeAXNq6J&ssT8!$zn&afrIrD3QV}3B3 zHkGbhx%^II6Gpig6SS_ui_6jKVc4o}%r?Qr=Exf@w_q2tpzx$wJ3S+koH5RGQRqPG zzVl){bZzIzRpy&-N%K+9@;SXD695ZpkTFMt>ZZOJ_jJ=hC91&VVEQ~e1abPcJ=PoR zqyz4IMv-B#FIf}5ezM(7rA6?zodFsKe}&&czV5NN7|V0Oy4V2UxR4em7VcukFxCm605S!TS8e|-ofQ8d(8_8LRJ<_^}kJHU5*cfTM zFm=&aynB)jQF#V(evzKbv8ib#_)9*{>{cPMjs-Nx&(0Wd$pcQ7%M-|$f#djz>k};L;;O}A)xt8DvW^`1(Ys`IRabJE38@Cf(ng?r^#B78#zSpwjt28p{`BPaa*RA_qaeI!c(I^Bxf&XK+ z%WnvulqYek+i|Rg+cgO}w;}ahtn+l|JXmxZ0fUPna-rU!nT}3b8qN0i76E|n zbw#H5*#_dJIiaOzdm+-%v?bqua_rI&iAgVTlWjNfBaC@b2`UYK{K+b8sl{^^I}u$@ z#<-+Vf=F6I(H-);XIr(FK&nN{d21ieq+FkNPh$8o8*cDwAYd&%zJUuu-F^r*P3N)` z-AaQECV02c9EbZYFQ9o`(0?J5-hO6RdU?Ck&y(+SJ3wKTP(M8cfvw^(#p_DRnw1}0w1{_#cw>V z^&w0LiyACKLQ;?Fq{7{vtEJ0`%l2!Ll!iEoD__;?Mf0M}j)@tPWrE=ACLtkOP;^Fi zZJfnLZ-zo05yRRUgLtw;lv=Rak6PWn@q-!TOZkJ=x#>DxL>TT>m4TYI-niCvL`Pk7 z)*oHpO*u&*tRArMwbjdeMNdLbcO|7@tF%m1c~#veL>k`izNl@!X>pE8DsH9Qa?H)n ziLWZ_gh{gCqJ&VuVS$BA&r!+k#&++A@WM3rQaL6Z!w8^iURCm}blLY$latt1s0*p~ z({U(1u6uwbQw6edQhsGZuIX|AbmsRZoMgN$l`s!q1B|cfg;7@D$62O-54Ne-lfJMg zHjf{ptc~OiVHCMHQ;Pf*S-VNU0JCJXB)vPLGDRQ{URb=S#*T|yGPI1`m-l`>tDqS0 zCNzK#sI6>QgD845mgS4>JxY$1^a&U~JDp+E@(YN^cw{;yEh0CR7g&VRcR=;wg1b&| zev5Sp!fEF20B{?k8oXY=ZC`^L2e~W1^Z|TdVY7}Nmf4mZUNxqw7Cx}4)baREY|-%! zuyP(UiB2=T5JbrOYvb)$fS`e;NF-+!&K(MzVRb7$AO3*|?Oo-Dru)QHq?L}jr`X|% z+<2$1HI2+Xq^pqw5F8+(uFlf2#1Kw(Xi%Tk3O5H;_f$L`b;{R+Iv0FyKEto9FN#|- z@;x4{vc&V%_7}=VU+SHxHyKVqQ8BvX8YQt#ewi?_3&cF5$JS1RQ-je_|>#j zfAJ~=PFq`-!*!t%gQ^FDl@uNxZZCH$1E;fY`{Ug@+3bwc95JLdjwz}sq0#{*WcrZc zo!Fik;z$Mk=C8Vu{JJ)7cH9D!0|e3HRkz6M>zT#yv>f?t&hy580lnXG8+BZ$`J|x+ zMl^uHb-{N|P+Q7v24>?{hu~I2ghVK%Y^h~gC2lui4H__8@Su2T#dCVm<4a3(+x)qE zrkb4iowayFf*73f(&jGK>TOs5nq^uP^fvz+6NjK|c#Jg!zUF@*uK69p`hOsBIl;;TmN=f_N1l;K%~8jiXp|c8kQ&fgl-|8F zo^qX78&?vIzvcQG(N>O12}_+D2F>E@bbr!x*`ILcRd2GJ`~Aj2ESBY+MmnRA&(GM( z$ED%Db?|CjF2AiHv_@f_zpHg5a>3maL8V6WN!{Tcf4Wyranl~paBp*zg@(G5km0umZGqIu$kI}`rzZpWg1Vvg3RO`%kd*a9fVKM z47g?c+muQdC!#RLDiik;hu<0&f9emP1YNhnb*na_(nZUnN;fBHar|0XIDVpuQcmDx zJ+j+R7k!fHrcBu>@$^mXh6QZG)hnqI7Lv4LA@W9VrChOIKIHWj0A(!YF+?1DumsGf z-;2U!?ICd1+Mwy}R>TV6cRVvDp>%wHw+mdnvi6PmGga#Rf+KHXCLTYfl>F4i z6}VX5iGrf1Lq9BMLB44QL;^2<)4jlT&T!Vv5|%GDq0+B}8sBH`gm8SA$8R*MBhOAv zYZ_9QX;6`iDe5wG52hht75Qpy+g(s#XX|9!i5Qza@-#W_G_~=JEOzB;5E&rcPBPw( zzkG6#%cv%9xB#%NTLA`eQ!d~9fx&7bjk%+2l75kbJ=(D6DSpMro_)96o=MqDrN78e zchn-K6d@@O9HmRo3FPo?4-acai~TXQzSB$Fy(`rBwY6|nr8y#HnZr>)6Fu>eFj-xx z320>NT+yKFTXNeRVGSFn^A*EQJ-U;-tyIANBu1HpBu#Ntb{X5#!3+27ux4cMN!Da>R^t1`xpEMs`%OP9rx zvJ!qW^GuJW(M|Mkw)6Z>1*`HgpWwswjmo19_3OR52OHkinwHlg(BWjY!fCq>XdQhD zlAU%hmo1-B+uOe`T4}TKi3wDH#8&eQCh{?fKOWP${Ej4-Jy!hv*zNt$>Nz3&0VA~6 z3JOSH@&G|Au~3cfqkiXIv0_QS6`ZjwtBdQvVuEg*Hjr<|Z0o|zJ?(xVk*uiZ<)bKR zxne+yAO=4UCl;;uIilP}r<3s>F>9mG*gch>+mcZ)r{+Eni((IMxA;Ee+p-*nX6@Wv zNHbVWQ0J~K7!5;=g@8pjc7flv`pI(1UEFlOkZ3(S+Y;pVyAhvi7Dp+K;6zeAAfE(Q z4Dv9jF}Jf4E4%$4h;3AQF4s(i5#gZm{7Y_hBvPTOX8WYvFR&-i<$EC=8RSv#Jv}bX zQSeOI*eMH}$u?)FSRP&YOzVlJK2D`D4;o6XamPEc&4IgHpNKCpQ3n(wb14c&`as6E zrPiJjZOfi3YqGFE14VZ?4+%^!Wzc8$M;m)~Zf>aj-{&TX}t2Qo2n z%!LbUO)xk)C6DjE(CSEaTh?9$7iR;AMnPJPpMTFN!1yGVKs!!Btxl6@b`9JwC~vOG z+gks)jg;A?%{X47j88CdLhBIHE|_)~Id#sUtKlv=&~9o1eKC(3sn<0CUPQ-L@@Pog zA_m`{F%@7CNMU1;>g(H}G@X}(QK#52u1;`kSi3j?n~8SSj27Flt;;C=JfK`2nO`W_61zw41s?%3pNlq&RL z<|lEgNsLUX;`4nT%!WON%MjL+rUKJgwGfqKsB-kNgZOi`slvUtDzFy6L}9^(oS#6f zb>scvSS-3Yq}mhsm_C0_ZNz@>)+K(is+DeOYN!u3r5+Y!8Sqo#s`W@SrPXJMez$s7LZTJ)-tBDcYV zH*ApB>)}o{LeE;cEs22kXR2P1)AI0OAAGoQM)-{h#wf}zxRUl8pG5wD45@yIEjoCw z`4`*?OI@*|g7kuwrDbX7$;A~}?&W2PgqCw?6WB!;(%na+vSiJ(8{e&GK^r=cbP{1Vvr{4 z>5E|pVsv^yclIBMw$FV=j2LnGAx=8dhD>7hQ=waV0EUa366i}x_&53gnjzjf{@$YZ z7Yj9Aae!w_et(L!3nSYx;A_J;?mju*k9=D=-+^P!gb$>+&`bEWnTBwH+$Vhc74TA3lREs{F~m z8gk-$KIg20F;xq0**>ftVoOz&WA1rv9F8mH3$j#5xP4_M#SOBMWCKx%MSDEEPc_=m z0SxS(2Eiw%plScQhyNEt)?BME{|R312tR+dg>yaMyXx2E@YDcQjEB-MJ852;A*#8ZuGM7~`Ph|YalBYAnlwt_D;e++0b2Z=EB__`FNahG2mXMN`G@{FTGkH_ zo-1Nl@tlFHLpGyiHkH&Oj!*r(!MuRU1HswWqD+;AdPI*(=JK4nVCpb~Ujwa9=m#W- z1uTw&81)E3&OWl>yubaKRsFHWzDF)!vKwCK6vca6S}mDe!_0bCUthaE zIkZxXbe~L@(ahN!w|en+LysY^6`{fjSShPhz&K&V4trgC(;}h*?mn+E7yelSvd<;* zqn}6q-k_8_>xyV=D=m!d>t|yqB;DYH#H9|BOFnnA`;~m-=wr$E`*HppPAw z`>StCVMSO*h;0b3k*lK$e?w?7M}u*!|B?m9k)#RCs5F&lL@=Y^w@2=xwps~1ptYao zYD3pPMLFx5fU0i0_aS`}-tG&_JcgH_`tqE_{E+025FLjIfB}IoZb2O{&e^iYxnM_a z75*$HUpc@Tllu#32}(*Y&cpMBS(3uJM^ox*r_t~DT1MWH0~l;wV`w~r)RJw>%6R4Z z{RZx~h8T$>Mvb57s9)py8MmIzaW`TCIA&GB-anycSftSMZmn5x6tzpiA@J(6(Bexj@80SLX4#xtaNY0n~q9=t4uaR{<-d#vuhHNg@E0(se_ZXt%tD5Z*cy?IkfPQ}7u|lW zg~B(9lsTJpq<`lFcS?#E>U1ArQJgj>%z9A&2SWbOL1mmzXy<3cKU}HhCYT52Qi~3R zB(k)OhHP6$*llHz@8i>wBxt}#8?6`{afy;mir%^dY+fX+IOG@5%eaNf#A@j`UG7t- zCQKqUjn51-TpUi|1+&j27EcZzUlZ06l9apfDm-GcO-%8~I__GGujbrgDP#J9&9-lh zPAd7|_8g{7PH{4ge15G5`2{f{3l+u<{}+NV%NH9jM8=NjdYhZ`784D;%O0IsZ=p88GJ0QX&Mtd*f=QYuo9; zVvW8f=$9p4hWu#eN#dUWg>i5%0 zdpuJnpE8ECReT09pGmSe+Ok@9nSXe#I^Qk5skv)dB)gQvXOMl!9YNe@I}G)$ZL}8_ zm!@ao?LPKsZe*U;>&{vi9L`t=<@i7!8j7~M)zY`SI%SpiFQn9A3vgoW<#G!Rfy$Bw z-FZ`6LOD!W=(o#J_ z{_jnm#ygoMLx+6xXOtd*;C1Omd&64pqo`hA-z~db-AdC)Rrbj_+tpT)X_}Y28a3_S zmuYhjn{6Gxo3+LkZbC>WZxS~3SGzuV%SkCNouysT&NQtQ{7W0yL8MO;URt)H15VbH zP0sOv*jCO4%r_YoV06T7J}6q|_uWY}hSkzhH`>)fIFFYZ_$qhLT60>`FSTucO;Y1d zFC?M+RGR+)pK>s~q$uSJ;p(NOuDUdZwl+46e6}s7t>>H_t;r;gOk~#8V*$avIc1So;gsFFRaV3mbk1E|ER1QJ(qCS@($Q<4^l+e*!y{@MP z{-XCTiEnFbFDPaw2bhpZz#Cvz>f+N}lTCQVji}U45al z>Uyl6c#y*!Gld={nBe7;r%Y^3N7Ut(&sV>*x4xEmt?nKrlsWW(IM24VoI7QAp{}eg zw4P_a9E&)=0%%Z=NC)KVPI7TnLxeRHG6*1!IExa9(*_`T6M>radMxl+Tgfgf-noD9 zXC-UE_Xn(6#-SFQDAeBSW@9Ar$`(6lm2=K=4sqX{cT;*jt-bdQYubdGw6A?>2Wb_& zWrjeJSDne*2Ri{*nq8IchYnro4W%oaxidY?7rm5@gQRECK98%usUT-^Zi1r5qM$N&bw#zi-yXjfWpqo!R;quSk@ zMrV~C=Lhft~1wel~Fyd>^wgft2OdP46gA-8%ldebRaMQdw&&Zbp0=1vm884owTi_T*-0? zpB<@o3`b46R7>6-*6*~-3n{H_k!>cpm^hm}##RRy$95@$)J_dS$y0p3I_LiY1hjmj zlE+AgiY+cJwKtW~3bbq-^CNG94MDVu;@`&aXFzkxPh5;v+lTmn zQPaDA&_=x2<>h?z%|O+7UsKdL+eW{bL~Jb4*@%BjoQ<~c8w&X!#QwikHx6URU$Q!4 zl2N8|J`1*v>yC8oF7i1hj?#I8#V1we9*;M(73d4wY{WJNv7LwFqk}@VgHnA#EiKmd zmz2y92P50or*;Ga3o*`n`|IaU6PK~mX#9xNtz?bf;x&y-Yq)dNVx7Lfe#|VMRJl77%;#anvXrL)UV9M6W4aBq|)eah92r!+=U8+pSc*LhB)MMi=KREBfrL^ z`J0H400RS(L86Y>Uv{pu|$;;<4c{xVll{6t~qlh6Okaj0}RH$Y2osQoG3Z6Oq z7kJTLZ&b)4OLgZbm6@u-IEu#;J04}VyG20guNX??<4W$o0L z6GtJELzW^#)}xLG(s_m>lNj6?4_f=U{{V<$#|0FhUmSlk$nm!B(Vu=8v9^@l@n00# zZPq&}P2}=;07s%dq}0fGoppV0N7D4WUvu<39)7~yw=+8xIg&%($MI&Zq~L8R7Yb8T)c~y*;>?*`)^`e-j4 z$&w#Ujd9mET|eEat2gA2$-AO8iEcbaQbmAl9Bn`RH4bkm@+v$(0N5?&pwb>9v2}00O_aClsLI_?s3nDZT|obT4Tu{lXHyF#bEyc${*h8dG_36 z{{T%0{GxMbn@hnR!s9>sYEgWVHRu!G(G+~&NQ)+-RD2> z(^fo@`8Qal3c#K}U@~;U_(A-NQh7iuGBm;XPy961hmtGY-wG9j9D5-jtqt-|pZzqG z$FH6A)Ca)a{{X{RRy>jJ&Fv92g&cVNfQ>K`dxgjRH0a}r9BrjAJ_c|2YHG)lKPJ;O z39M1$X%$IrER1;1{{RgnamgT`bFq&Z{{Z2ptiDM6n!PFqw$kk2mmQ=~qBb`f3IVA& ztZH$=Y=5JM<3Fqa0K-H$4~u_-H2|F*rI_-m8!JYEvFan~*70hCF(6`r3Y<{u&|2j7|oc53=L_8oIK1WAbi+ zpiN>u{T^KVn0}xB8Xo?S#h*O?0PxdRUnG7_wrIhuD)H$oLDLG6<3Ic~Lyw6&X`|`? z0O6%Fc_Z>}^FW%yo;_jz0EUmkKjEeO{J`|I?0@>-@Y7abBu%ykbAg{4Jk}I(_$LER z{=fbj4abj=7fT1n{Not^0CuG@o@!8w`8}m>901X;(%&et`m9YN+?mywB zG31ZQxXlX0o;t#3-0YtY-~Jjg#~i~WPyWCD8dEjAO{k^T9Pz}84s^YTf1H2AMtJ4I za~&`N{G6pK_|jT=xYU|>o*!qrJzMk#KU^GX z`2+s|tbZn#9~(4@%(`&=BmNp{YskJ!B;k7mONCn~Le7mGgC`t^s*eDC1}WRlAGW+Q zo119lX+j1hkbMG5;P(;CcOErR+-~dew9-HQZ}@009FlSFX$RLo{4~_QMe**@?M$zGot%`O=Hr-0&81`bQ{ro=P=)dd#0O6xfHe#fm zIaCiDkN9e8#_QytYr^(ct{UFbHGXxIo0yVWK>(6Yshb?hBbAji-PxiO*CGj%<5yDm0uo zX(g-MHKbjOOxFYgN81S`up@ACPUFU^myeW^t)@CK8N*BdJhb|8jFPTm(^Z?feB^KJ z^l3p&5>E)}&2JnYV+e{e{Hh5U406M6;&&sZOuo?KzJVdSfgUtq$T^5AK*m8Ejfo#E zR1P(pAFX_+!R|5m`Ef}1?=$S0Vg~SQpQ%ksF6f;6A*RU`akYd!oN7@N5&%-%#dhu_ z?mASNxOUcCw7Pp(jOY{w2OkIE z;%=Yr)uMS9$$f353ur_zMu`?l7^HBPQBrKE8C%Sb!QZl4qr%;GF0VB$5IbN-BJdJ2w1>^ zJV!HJAkRq~o0+~|cKPbCag(}|nr}8dC)@k9!*Rm{fu+dD_p)dE7c`-=B}KwIbOp>- z5U(;A&I$MggUUD9Wk$ncQm%9uE{wgsx;d4R-187iC&4)#2&fTpgpM+F(aYkq{{Vqe zLAc3~oat;-9-?4#_^Cr;!Y&@Rj{UD=wT*6AmM#hSL}0c$WRCu{&F>4@-rcpu)vC!W zfFCk9D}mFQbA$4VZZ0ub2mHi>JB+*k0A&T^0?*6te=n@gKB`dJ6UL1fVRH$BGZo2W zGLw-ZVS}HOYD~O4Z9ESQw&>Bji4I)kFabdaIR^j?ih_8*as`1T4B$(j{WO!tQUigd zx$pg05A778v2|ypEv33aYZP%pp9NQ--zV|Y-eE6*`Ravu(BmggV1D$=zxQa{jOHtp z(-pn97(d;m4Uu|m{Vp2Lt2gbdq{_h=q8g;bw37|sXVdj9~s zN*f{QH0@chZr)jANF7u}n>Qv4f_*Ba^gfe%c!?gyalxGBeId z#@WYkrw@+?zxQcFWNILY!h|+5Pjz!{A(%_5-oRQC zJ7c*SBh+{CtE;XtmPlk+t>d?spl6exA0`E5<~IuB;d@4qoVM$S&s^rJM>)#+1a}&I z3=_0LB6U*bN3>A7xLJ@0E>LH2hC*mBIl*}4UmTU+<;^W4=2OW0yZjbWROT{LIP?B? zp`;rFC)Gxg@=T|+os@n00uRem3d?)YP;Qg!njzX3=dGd)Jbn{kGA9KHoI&M|Sz%2S<5 z-vAnZSQ{MJ<-puAD^x(UAZXfE&u}#C9PUc?l5e*8H8wPh$aO7FIF%v2xsEmH7Uj7> z_5(z9-DCz+e{wO5!4j_04aU{03An-B3H_}Q`4cvI2;m0yo$ek806KVy9jE!&U5ajqnz$M z;r_Y_s%sslMz5#?>$rceo#uy^20@=3(`AoPLjll$4NVYv87@6TTqg%qzF>RB!|nL# z*PmM}l+~})kN)A#e;rmV%gxRU5_*8&;Yv3v&4~*s?m4SSs!gKA-Rr@Ibu01WR^k4- zbX;q!e_b^IM}M5R*Huk$PID}cjr!v>uR1I-A84o4=9GravlqJ1C$!Y>`r|%uV{FO-sJt{?tiq?M~O99 z!4c{=&A;7Tx7Sq!mQO`_)EZL8So|Cw?W$RA{FC2^_106%t6q%v3EOYSO|KAZpa9yX z_bKt6{<@Bl$TmEf_0r9<4}{o00MeM;bnAM--`#yfKgu8LpxVZ+=h4+Q6(hgSAM2zf zL<|61+eTtxy2c3|cd4m&W6P`SBn;}e-%kGkT_|e0u-&y=)BgbV4nM|_g}dYB9tZ2A z>`<^R8yugxtErzO74EjRjkO!r9;=7?=`E}3=l=i^zaFnRf3BTNMFEPls}AF}E*L|p z-I#&76wtfBVlTS-xZSlKM1TE5s=4RXwE#PhZvOyXG#WmnxBz#IQlpzA2<@=jV1Kf% zs3|f)zSW5s)i3euo&LH@YC5tIPNjSS{{Ze=>!y2QAMvQM!*DT(pxbQZ=jNp%T$drEiB$Tk z(JhZQv#7^_+LhZMR?RqJfO>OY2Ob_D zT}?}~v82?sassvXq)u_nmrj4ior>>LExxC!t92peY=3Px6xPub*g2FP{SX#_xo4CW zhDA};oSu}VTXagE^HPlu`TnNf1t)F2yU@1O?-2vOrK%C&*GKE7C7DX|2^1eyL1|N* znFBhWoT>--*0?6k7fG$^F2}OGyeW;(oi^V&pml9aIQK&J{{a4>hxQtzj9H0Slbv(E za4JLFqcLSpVtTMWY9Qvv=Im}Ap6W+3o~+aJ6YZxDV+w$+8b*Ri4B8_4#q~x#;1OaDXAp4O_En{4rr+fa~dh+ zGqySc1_dl~O^>%D(2S@Z$~l3j8rpw^6PGw?0^*_23d{ zb2uSPV?H9HtbM2q3oZ|EH6?_6zLdw94ulb!sg471yx7AhfdCOeAnMoveb*`asFnqj zbw|MPJJZQ(-?GTR!efzC$k>TjEUs93vq&sNiWSZ?(X;i`rjB4h6E^!2NBGiJdGL(f z$HP5oMM5TrI8zdk4#X3hASU#Hfv^WqPfC;6OZN+$4UR}7=cNa^C;>4NI+h#Kir=vs z6_M09MbCFW1u7)DaNL9g-nkUr&C>G@a-9x&MgaLKtv>oGdDs~v$3S`!@>0<`CSu_i zmRQ}CcduWboxx@1Zq#SEsA^}=RY(!@u_pu;&OSp@B)jHdgl-2wyZdNqB09#L$CZK4 zb_m5g6lz#t!hN7`^HY7KW*?E`8B8 zrS17iK-~rgetMQ^M}dw(zDLhQp+*bfe~m4ml4!w65nOdRJt;7tRXwj{*$IRdMa1p9)OkK6qJ5Uw)=Q@Qr2~LCzxm3PFQUTI1AGo_bI1Wl*V#M z^@=8)Is?DSNEyxmARWQ(r564H9Bi+Yam(OEJklP30qf01^s&rH&$nt!EXGU~1O2LW zEs_LhoU^bSY(*yBu=zQ`J>E37DE&&Q#>ARwULtYKLG^8eR>}JhOM(dJV8^(eie@%N zJgyb-)RVOZiGzcOVV=0B`9m-yMsRz;QYu-hY(P|Ln5OI9gODlVJZgCaWVc?Fi6T{Q zV9|_?z!Xn!4a?Y$NTH-Ba`OfMpmWd|eg&J9RZftO`|V0w(7$4eQE zl`E0!Y?>CiB0b4NyiCXeBbU-A0EFQ%}TWjDW#kC#c*Sj^)c_sR}!d9l9KncJL%^Qi*>BgQB_;imKf`8jjGo2efW) zQvs1pySUk09Cg6|019iiJlK{_Rc?ouV^H0(=a42;xZk;Vr8BMoF_#$XR}~l>IT1@6 zk+B)xr6R~vltZ6mRU&PO%!&_TA0`b)x_O-o6=wkb$jwPek3IpI6XH3A6h>4hnPfr^ zLttTttW>hJIbqp$PO<|g4p5E1w**sdDn%(6Wj%HT(`u+E?EqljBVqGY)nz5QmzZ=L zj0zQe3<)EaQe$T>e&?4T+eYy_F2t^S=Re_2NUDqq0pXBn`$r!OGy`jEDFwp>$NNH; zBuO+JmntR5-wB#pWssL3FYkz?iIye-7-hN)j8L{S6jsrmWllxLFh&8VOd->F%7M`A zX%6!qVS-M23Oi{@m7{lcY;Bxwd=g|J=I%U*imrN`o&83n+QBT*p4}9(jmj}U;Y_PMi_04?v5#7I-Eb}a7J>~d08Bm>>HcB!6c42c`ZEX$6H z8)5!5+(Wa6u$i69o}qD*>)RBOZw0PQs0y~{nXp0mC}{$2+7$*~*OZ)m0&+ex{J8COQ-2XY2;^3bE#3(BCzRyhIA00iU5r7>?T z&m@Y#f{Iv@yAkr#IniQx+!+gjjH;87;ek^$)}80%ctpJWDx_se^?LI{ZOC#+CDUk`SZ0UViU|#-f25wpFm5@eqv~4 z@-YOLc_KG~$6jWMlzVbEqPdj9OV1*@u*n^#FXJm#3fB=~Bv~XN;EaXGuN~CmO!zJ7 zY&Qi#p=Un0A2lvG zrD#h?tTU675Xt$C2u(>9;t{2?#;d>EFfsDfb2mE`WN;U$ia>Emj@DKfj(1ller4Ev zm5jaq%lOSgk!~){y2zy_ch5q|YCB%b8zB%%5r*Gs0|(ohm30lYE0;T z;T1<_P@M0UIj=$T=!FxqFb@bSPQ@CeERm!7P~2ej9Vkz8Dc&IiVD6v{(gvYCav!xL z4)KlZSx1bK5tM|J-WjlV^-)K7oc@ep?Z4YG{goP9r)DNG*|7VT^oPlsTr+a6B({f} z#4ajqRTfEmh`@u5xD9o7E^%~ zNs@Dpx%PNeh^2@xqUzc40AuH-)Z1V<^OZe)R29z5*i+LK1xoGFPXhasCt%{3~x|8A5T8PHE$Ap@(QN zGt|+vDcW;H$WO~kX1ES(-e55cs0TY7(+=$WtXS{ZVy#*wjJyv^C>;Xq%E^@!u3bVR8i zqSFvNmmlJ3Wgj;dz7$2H3TWleF^zSb{B+Yuh04VKmxB{b%W*l_1Y!>0fxQQ@C(UAG&DmkQ!paRj z8b=bAM2|i#)O^)mlBwwut9pl8TE@KKh?{ZTK&66Vor?M_fO@y07awxQGyEl{K(`6@ z$cV>yBkQLlScnA~7d<(R3GN$8+_?)D{YyEt*>+Waqj} zHX1H(TI77wTGlQBHSij%q9YMyO?K*;OK z_kmBawpn^Y!B~tprWQY z?%fC~!1n^D7^DF^N66|__wt|ctB6Y-%u%j-GMZZ|w^mg>Po_mF4vI*jah3G;r+m`k zRFYel+nTnBL|YApe&dj7Quaky2&7^LIdC!f>Lf*FT3WsbF)T5W%ndsYsU>j06XCr~ z9JtEF@s-$@08<8T%#fx5Cvai45=C|ffks0zj~%Gi%}5=Q-1sOX`)Nk*_$M%i+c?_p~B|O&nk&@}@j@sNlfkXA=|LPCjZ>eTf7RGvHWlLC~kWETkln zkaos#L$+2?*|Lw9G}A0R;1Cd#u-gWkk_1c;s(q9nl1kn{ibSi2#tQ&IrlY+InT(en zv$&)Qk$n&XZ_$+ElPu&9^+?zgj%7dLQL>~uZ{;k-l(LV#B;(slie#2B%$RKTQfezn z%D9h}8~4dhM)DZ_HRnDmKg3kBq&py1e}tz!$8X0#M#+)c5Qn{fx^5YzcJ#2UJaL+m zXPz;I3y)C63NWFak1UMDZ_4L!^V7*3j+vEY$=e`wrs2AoCiJ$XnV ze3Y4z6P%oXA3hjO3jDnykuV<0M3^2`YPz^x`V3b1I$s z?nWuFgP?Ps;mj!wA7;WqC>w4Y>&*=k7FAD3r#5|g29UDE9G^ETM|e1SHpc}FidH+Uq9SVQl0Rl_L8JIT!lnWO=vaF{!7$|<8Krc|tfPk1|0UPc5qWe9fM zWL8@#DOx#X=2pvR8*fD-pvb^ty>h+v9g8^oODH+$P-N4{7_KD3=2MWQ z_>SsoKm!GIZ%3m6LK#t{08TUBq*I}rv}KSS9)~*`yc3bOEQ1C!$a}%f7*r)&l}Q~k zC^s{ylI|6c-yG(N zhNy6qV0$S5T=z8@UelA5;QG7i4F$WV82~*qj{04)6^oI|vZ?qdH5gF|q6kmgiS_c( z6Es9&*Oc^Au{5DOt`TF905gz5A1xd5O2NGp-=P@%Ri4edLCnLl<|aYjL0r^$v$vvK zzosf=>{cx>MwH#8*I>` z+C?FG7oRx;FT$zn@r6_JCPAuY^y#y6?4r5419ioYi)=g#MP zeI#`!m;t`T9MyVT8NqmrsN`;0x6M5QO%!-*c_styivypMqhhOqO~uhT3?-0t!0)D@ zyMPvqBgRO`SyX_1S*F$IY+}!{80ngo5H6WeLwDstYFMvvrkJ~xiwNJnVBaM>Zqf+~ z%!SEdj4v5DDDOf_YaZWtx(cqmscBdC_o#;^{DZ^yiu2(xfG14#&hh&KiMNUHb6P* zcBefQC(;l?tq7BY-bCg9kg6bG1x{NS6d#s;L_|bN>J$n|S3` zC0!UFOD7*yMwKL1X3D?H1qD#~zLT~fBr%cKn4QOtK&ck@FwD#z;v)VX-;7jcc@HKb zP<~D6$L#?u=ujQ{W`#t*I)If7q=D2_S?{7*KG7SHHs!%PA7waJGXfV_dG{>byPfJZ zvd0v|5-2C2>p2<4UymLreKgu4?k>1`?f#! zp(kr_TbSF)9zGa|6Y|i$!Y#QAfYSmzdq95`NRruiV>v2&g5ZyqspsZ`Mf-GXor&h< z$Kt6rvfTrdb8RKK1#+%)__|P=dlnpz5)R5CB7XRDn#u53s zfF7a^Jv1vTVAxxNJIaGmRqmIxK@uW;!9^fqgQ3<)>*pd$U2c;##uKOIE08aET1M?^mkg`jHa0qkt(~(7T>`0PMQZdT%j2~Vqwh;)q z%#b>t-pJek0EJ6gVGivQPE>T|Cm-8FT40q7a+R7S4o(5z9^VR6#UzS3kz5Ve83a>F gc^_#10Bez3xZ^)PJZ6!X?Nap_!wrY{(5jFB+0qzK{{R30 literal 0 HcmV?d00001 diff --git a/src/content/portfolio/assets/screenshot.jpg:Zone.Identifier b/src/content/portfolio/assets/screenshot.jpg:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..d6c1ec682968c796b9f5e9e080cc6f674b57c766 GIT binary patch literal 25 dcma!!%Fjy;DN4*MPD?F{<>dl#JyUFr831@K2x + +Ich habe ein paar Dinge unkenntlich gemacht, um meine persönlichen Daten zu schützen. + +## Wie es begann + +Eines Tages habe ich mir einen coolen neuen und viel besseren Monitor für meinen PC gekauft. +Aber was macht man mit dem alten, wenn man keinen Platz für einen dritten hat? + +Die Idee war simpel: Einfach einen Raspberry Pi anschließen und nützliche Informationen anzeigen lassen. +Wetter, Nachrichten, Kalender und so weiter. +Und um immer gut informiert zu sein, wurde der Bildschirm in der Küche platziert. + +## Geschichte +### Die erste Iteration + +Am Anfang war es einfach eine Webseite in Vanilla JS und natürlich dem üblichen HTML und CSS. +Ich hatte zu dem Zeitpunkt nicht viel Erfahrung in JS, aber ich versuchte "gute" Software-Entwicklungspraktiken zu verwenden, wie Klassenvererbung und [ES-Module](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules). + +Warum Web Technologien nutzen, wenn ich davon wenig Ahnung habe? +Weil ich noch weniger Ahnung von anderen GUI-Technologien hatte. +Außerdem nutzen viele Quellen, die ich benutzen wollte, REST-Schnittstellen und JSON, was einfach in JavaScript super einfach zu handhaben ist. + +Das ganze wurde lokal mit dem Standard-[PHP HTTP-Server](https://www.php.net/manual/en/features.commandline.webserver.php) gehostet und Chromium-Browser im Kiosk-Modus geöffnet. + +Wen der Code wirklich interessiert, der kann [hier](https://github.com/C0ntroller/infoscreen-old) den Repository der zweiten Version finden, die den Großteil des Codes der ersten Version nutzt. + +### Die zweite Iteration + +Beim zweiten Mal war die Idee, statt einen Chromium-Browser zu öffnen, eine Electron App zu schreiben. +Klingt erstmal nicht so viel anders, aber ich dachte, dass es vielleicht performanter sein könnte, da zumindest etwas Bloat fehlt. + +Naja, es war nicht performanter. +Der Code dafür ist trotzdem noch [hier](https://github.com/C0ntroller/infoscreen-old) zu finden. + +### Die dritte Iteration + +Einige Zeit später habe ich angefangen, mich mehr mit React zu beschäftigen. +Irgendwie kam mir der Gedanke, dass was ich damals mit Vanilla JS versucht habe, in React viel einfacher und sauberer umzusetzen wäre. +Also habe ich angefangen, den Code zu portieren. + +Ich habe auch schon von Frameworks für React gehört, die statische Seiten generieren können, wie [Next.JS](https://nextjs.org/) und [Gatsby](https://www.gatsbyjs.com/). +Gatsby schien mir eine gute Wahl zu sein, also habe ich mich dafür entschieden. + +Diesmal wurde es in einem Docker-Container auf meinem eigenen Heimserver gehostet und der Pi öffnet wieder einen Chromium-Browser. + +Damit endet die Entwicklungsgeschichte. + +### Das Ende der Geschichte + +Und nun?
+Die brennensten Fragen mal geklärt: + +> Wird der Bildschirm genutzt? + +Nein. Er war eine ganze Weile in Betrieb, aber mittlerweile bin ich umgezogen und habe keinen schönen Platz mehr. Zudem muss ich sagen, dass man über die Zeit immer weniger drauf schaut... + +> Was gab es für coole Erweiterungen? + +Das war eigentlich eine der coolsten Sachen an dem Projekt. +Denn um Nachts nicht geblendet zu werden, gab es einen Nachtmodus. +Dieser bestand aus einem dunklen Hintergrund, dunkleren Farben und des Deaktivieren der großen Wetterkarte.
+Außerdem gab es einen Bewegungsmelder. Nach 10 Minuten ohne Bewegung wurde der Bildschirm dunkel geschaltet. +Sobald jemand den Raum betrat, wurde der Bildschirm wieder aktiviert.
+Zuletzt hab ich unseren [librespot](https://github.com/librespot-org/librespot) Server noch selbst dazu gebracht, den aktuell laufenden Song dem Infoscreen mitzuteilen. + +## Was war denn nun auf dem Bildschirm? + +Folgende Infos wurden zuletzt angezeigt: +- Zeit +- Wetter und Wetterkarte +- zwei RSS News Feeds +- ein Google Kalender +- Abfahrten der nächsten Straßenbahnstation +- derzeit laufendes Spotify oder (falls nichts läuft) Infos von meinen Pflanzensensoren + +Außerdem wird der Hintergrund durch ca. 20 Bilder rotiert. + +Wenn es spät wird, wird ein Nachtmodus aktiviert und die Wetterkarte durch ein süßes GIF von einem schlafenden Pikachu ersetzt. + +### Wetter + +Für das Wetter nutze ich zuerst die [DarkSky API](https://darksky.net/). +Als Apple den Dienst gekauft und den kostenlosen Zugang beschränkt hat, war klar, dass ich eine Alternative brauche. + +Meine Wahl fiel auf [Pirate Weather](https://pirateweather.net/). +Doch der Dienst war oft nicht zuverlässig. +Wahrscheinlich sollte man eher einen anderen Dienst nutzen. + +### RSS News + +Hier hab ich mir einen Spaß erlaubt: +Dem Feed der [Tagesschau](https://www.tagesschau.de/) wurden einige wenige Artikel des [Postillons](https://www.der-postillon.com/) zugefügt. +Manchmal musste man aber echt raten... + +### Google Calendar + +Hier wurde einfach die [Google Calendar API](https://developers.google.com/calendar) genutzt und das Ergebnis in einer Liste nach Tagen gruppiert angezeigt. + +### Haltestellenauskunft + +Die lokalen Verkehrsbetriebe haben eine API bereitgestellt, um die nächsten Abfahrten an einer Haltestelle abzufragen. +Dokumentiert oder offiziell ist sie nicht so recht und ich habe gehört, dass sie seitdem auch stärker limitiert ist. +Auf jeden Fall wurden einfach die nächsten beiden Haltestellen abgefragt und die Ankuftszeiten inkl. Verspätungen angezeigt. + +### Spotify + +Wie das funktioniert hat, ist gar nicht so simpel. +Vielleicht sollte ich mal einen eigenen Blogpost dazu schreiben. + +Falls nichts lief, wurden stattdessen Infos von meinen Pflanzensensoren angezeigt. + +### Pflanzensensoren + +Hier wurden einfach einige Daten aus meinem [Home Assistant](https://www.home-assistant.io/) zu den Pflanzen in der Küche angezeigt. diff --git a/src/content/portfolio/ol-git.mdx b/src/content/portfolio/ol-git.mdx new file mode 100644 index 0000000..70add78 --- /dev/null +++ b/src/content/portfolio/ol-git.mdx @@ -0,0 +1,81 @@ +--- +title: Overleaf Sync with Git +summary: "Overleaf ist ein webbasierter LaTeX-Editor einfach echt gut in seinem Job. Aber ein Projekt backupen ohne Geld zu zahlen? Unmöglich, sogar wenn man seine Instanz selbst hosted. Das fand ich schlimm und hab ein Script geschrieben, dass ein bestimmtes Projekt regelmäßig über git sichert." +repository: "https://git.c0ntroller.de/c0ntroller/overleaf-git-sync" +pubDate: 2022-07-29 +tags: + - Scripting + - Git +--- + +## Das Problem + +Als ich in der Uni wichtige Paper wie meine Abschlussarbeit schreiben musste, wollte ich nicht böse überrascht werden und stattdessen so viele Backups wie möglich haben. +Denn was wenn meine eigene Festplatte oder die der Overleaf-Instanz kaputt geht? + +Da die Arbeit eh mit LaTeX geschrieben werden sollte, bot sich eine selbstgehostete Instanz von [Overleaf](https://overleaf.com/) an. +Overleaf ist einer der besten Editoren für LaTeX und da es webbasiert ist, kann ich von all meinen Geräten darauf zugreifen. +Und da es am Ende nur ein Frontend für Ordner und Dateien ist, sollte es doch eine einfache Möglichkeit geben, die Projekte zu sichern, oder? + +Nö!
+Nicht nur gibt es kann die selbstgehostete Community-Version keine Projekte mit Cloud-Speicher oder git synchronisieren. +Es gibt diese Möglichkeit in der zentralen Version, die von Overleaf selbst gehostet wird aber diese befindet sich hinter einer Paywall. + +Und der Preis dafür ist nichtmal gering, selbst als Student sollte ich damals 70€/Jahr zahlen! +Das ist einfach nur Abzocke und Blödsinn. + +Da muss es doch einen besseren Weg geben. + +## Wo sind meine Daten? + +Erstmal habe ich Overleaf mit Docker aufgesetzt und ein kleines Projekt erstellt. + +Jetzt müssten die Dateien doch irgendwo auf der Festplatte liegen, oder? + +Wieder falsch.
+Also teilweise, Bilder findet man auf der Festplatte. +Aber ich vermute den ganzen LaTeX-Kram pipen sie in die MongoDB, die der Service nutzt. + +Also nochmal von vorn. + +Gibt es eine API? +Klar, das Frontend nutzt ja auch eine. +Aber dokumentiert ist da nichts. +Wir können dank OpenSource aber einfach ins Repo schauen - und finden eine Datei [`router.js`](https://github.com/overleaf/overleaf/blob/main/services/web/app/src/router.js). +Jetzt musste ich nur noch herausfinden, wie man die API nutzt. + +## \*Hackervoice\*: I'm in + +Im Frontend kann man ganz gut nachvollziehen, wie das geht. +Zuerst einmal erfolgt die Authentifizierung über Sessions-IDs. +Beim Einloggen sendet man einen POST-Request an `/login` mit den Zugangsdaten und einem CSRF-Token, in diesem Moment wird die Session-ID gültig. + +Über die zuvor erwähnte Datei war gut nachvollziehbar, welche Routen wir nun nutzen konnten. +Ich brauchte nur eine: Den Download eines ganzen Projekts. + +Und das war einfacher als erwartet, denn man kann auch das im Browser nachvollziehen: `/project/{id}/download/zip` + +Jetzt hatte ich alle Puzzleteile und konnte mir ein einfaches Python-Script schreiben, das diese Requests durchführt. + +## Was tun mit der Zip? + +Theoretisch hätte man hier etwas abkürzen können und einfach alle Befehle in Python mit `subprocess` ausführen können. +Aber das fühlte sich falsch an und stattdessen habe ich liber zwei Bash-Skripte geschrieben. + +Das erste setzt den git-Ordner auf. +Es klont das Repository, in dem wir unsere Sachen ablegen wollen und wechselt auf den Branch, den wir nutzen wollen. +Dann wird die zuvor heruntergeladene Zip-Datei in diesem Ordner entpackt. + +Das zweite Bash-Script erstellt einen git-Commit und pusht die Änderungen ins Remote-Repository. + +Das wars auch schon. + +## Was könnte man besser machen? + +Das ganze ist mehr Script als nutzbares Programm, daher gibt es natürlich Dinge zu verbessern: + +- Eine `.env` Datei benutzen, statt ein Python-Dictionary für die Einstellungen und Zugangsdaten. +- Mehr Sync-Methoden wie verschiedene Cloud-Speicher einbauen. +- OAuth-Support (Werde ich wahrscheinlich eh nie machen). + +Das Projekt ist aber für mich hier abgeschlossen, also werden die anderen Punkte wohl auch nichts... diff --git a/src/content/portfolio/photo-sync.mdx b/src/content/portfolio/photo-sync.mdx new file mode 100644 index 0000000..acc57a2 --- /dev/null +++ b/src/content/portfolio/photo-sync.mdx @@ -0,0 +1,39 @@ +--- +title: Google Photo Sync +summary: "Irgendwelchen Apps vollen Zugriff auf seine Google Photos geben? Uff. Vor allem wenn es um Kleinigkeiten wie Bildschirmschoner geht. Also habe ich kurz gebastelt, um ein Album lokal zu halten und regelmäßig zu synchronisieren." +repository: https://git.c0ntroller.de/c0ntroller/google-photo-album-sync +pubDate: 2022-08-08 +tags: + - Google API + - Scripting +--- + +Warum sollte ich für einen Bildschirmschoner auf meine Privatsphäre verzichten? + +## Storytime + +Auf meinem NVidia Shield mit Android TV wollte ich einen Bildschirmschoner einrichten. +Es gibt natürlich viele davon und Google Photos als Quelle ist natürlich ein sehr einfacher Weg, wenn die eigenen Bilder sowieso dort liegen. + +Also die nächstbeste App installiert und einloggen. + +Oder auch nicht. + +Denn die App wollte nicht nur Zugriff auf meine Bilder. +Sie wollte auch Zugriff auf meine persönlichen Daten, E-Mail-Adresse, Kontaktliste und andere Dinge. +Ja ich weiß, ich rede hier über Privatsphäre und Datenschutz, aber nutze Google Photos - aber lieber hat Google meine Daten als irgendeine App, der ich nicht vertrauen kann. + +Aber vielleicht gibt es ja doch eine Möglichkeit - einfach die Bilder offline bereitstellen, dann bleibt der Google Account privat. + +## Die Lösung + +Ich hatte schon einige Erfahrung mit den Google APIs vom [Infoscreen](/projekt/infoscreen) und dem [Simple Callback Server](/projekt/simple-cb). + +Um auch Leuten ohne diese Erfahrung etas Hilfe zu geben, habe ich gleich eine CLI-Anwendung für das Setup erstellt. +In der `README` sollte eigentlich ein guter Startpunkt sein, um seine eigenen Bilder zu synchen. + +## Was noch? + +Hat man mehrere Bilder mit gleichem Namen, kann noch etaws kaputtgehen. +Grundsätzlich funktioniert aber auch dieser Fall. +Theoretisch könnte man noch Hashing wie MD5 benutzen, um die Bilder besser zu unterscheiden. diff --git a/src/content/portfolio/simple-cb.mdx b/src/content/portfolio/simple-cb.mdx new file mode 100644 index 0000000..8c18792 --- /dev/null +++ b/src/content/portfolio/simple-cb.mdx @@ -0,0 +1,37 @@ +--- +title: Simple Callback Server +summary: "Um große APIs wie von Google oder Spotify zu nutzen, wird häufig ein OAuth2-Flow benutzt. Für meine kleinen privaten Projekte reicht aber eigentlich auch der Refresh-Token, den man nach dem initialen Setup immer wieder verwenden kann. Um diesen Token aus dem Flow zu bekommen, habe ich einen Mini-Webserver erstellt, welcher einfach den Body der Request printed, sodass man den Token ganz einfach bekommt. Simpel aber effektiv." +repository: "https://git.c0ntroller.de/c0ntroller/simple-callback-server" +pubDate: 2022-08-08 +tags: + - JavaScript + - Scripting +--- + +Das wahrscheinlich einfachste Projekt. + +## Was macht es? + +Das einfachste, was man sich vorstellen kann: Ein `express`-Server printed einfach alle Header und den POST-Body oder die GET-Parameter eines Aufrufs. +Manchmal braucht man sowas eben. + +## Für was kann ich das benutzen? + +Am Ende eines OAuth2-Flows gibt es im Normalfall einen "Callback" an den "Dienst", den man betreibt und wo man den Nutzer authentifizieren will. +Callback bedeutet hier einfach nur, dass die konfigurierte Server-URL mit einigen Parametern wie Tokens aufgerufen wird. + +In meinen eigenen Projekten bin der User aber ich selbst und jedes mal den Flow zu durchlaufen, ist mühselig. + +Stattdessen gibt es häufig einen Refresh-Token, der mit dem Callback mitgesendet wird. +Der steckt aber nur im Callback und um ihn auszulesen, muss man den Callback auslesen. + +Nun, hier schließt sich der Kreis. + +## Klingt unnötig kompliziert + +Ist es. Aber OAuth2 ist nunmal kompliziert. + +## Und was ist mit `whoami`? + +Dass es einen Docker-Container gibt, der quasi genau das macht, ist mir leider erst viel später aufgefallen. +Naja, dümmer bin ich nicht geworden. diff --git a/src/content/portfolio/terminal.mdx b/src/content/portfolio/terminal.mdx new file mode 100644 index 0000000..d8d3bd8 --- /dev/null +++ b/src/content/portfolio/terminal.mdx @@ -0,0 +1,109 @@ +--- +title: Terminal (veraltet) +summary: "Das hier beschriebene \"Terminal\" war meine erste eigene Webseite. Nur mit JavaScript programmiert, konnte man die Seite mit Befehlen navigieren. Später war dieses Terminal auch auf der zweiten Iteration eingebunden. Es gab echt viele Funktionen, Eastereggs und Shortcuts. Auch wenn es so nicht mehr verfügbar ist, habe ich hier noch die Dokumentation dazu." +repository: https://git.c0ntroller.de/c0ntroller/frontpage +pubDate: 2022-02-04 +tags: + - Veraltet + - JavaScript + - React +--- + +> [!info] Dieses Projekt ist veraltet. +> Als Kontext: Die ersten Versionen meiner Website waren nur eine "CLI" in React. +> Unschwer zu erkennen, dass sich das geändert hat. +> Mittlerweile habe ich die CLI komplett entfernt. +> Aus nostalgischen Gründen möchte ich die Dokumentation aber hier lassen. + +Hi und Willkommen auf meiner Website. +Dies ist die Dokumentation für meine CLI. +Probiert sie mal aus, wenn ihr es noch nicht gemacht habt! + +## Warum? + +Vor allem aus Langeweile und weil ich Codeschreiben mag. +Und auf meiner eigenen Webseite kann ich auch einfach nerdig sein und wilde Dinge programmieren. + +## Wie? +### Frameworks + +Die Webseite ist komplett in [Next.js](https://nextjs.org/) geschrieben, einem JavaScript/React-Framework. +Also ist das Backend letzlich in [Node.js](https://nodejs.org/). +Die Projekteinträge sind in [AsciiDoc](https://projects.eclipse.org/projects/asciidoc.asciidoc-lang) verfasst. +Das ganze hoste ich in einerm [Docker](https://www.docker.com/) Container auf meinem eigenen Server. + +### Der Beginn +#### Ein eigener Platz im Internet +Ich wollte schon immer mal eine eigene Webseite haben. +Aber langweilig sollte sie auch nicht einfach sein. +Eines Tages kam mir dann die Idee - wie wäre es mit einer Webseite, die im Grunde eine Konsole ist. +Klingt eigentlich nicht so schwer, es besteht ja nur aus einem Eingabefeld und einem Log/Verlauf. + +Aber ich wollte mehr: +Der Code sollte so modular wie möglich sein, damit es in Zukunft einfach ist, Befehle, Projektlogs und Komponenten hinzuzufügen. +Außerdem wollte ich coole Features wie Tab-Vervollständigung und Shortcuts. + +Aber da es schwer ist, Freunden oder Arbeitgebern, die sich nicht mit Informatik auskennen, ein CLI ohne Erklärung hinzuwerfen, entschied ich mich, auch einen "normalen" Frontend-Teil hinzuzufügen. + +#### Implementierung + +> Klingt eigentlich nicht so schwer [...] + +Unsinn. Es war schwer. Aber am Ende hat es sich gelohnt. +Alle Kommandos sind in einer Quelldatei nach einem spezifischen Format definiert, sodass man super einfach neue hinzufügen oder alte entfernen kann. +Man kann Flags und andere Attribute hinzufügen und die Funktion definieren, die ausgeführt wird, wenn das Kommando ausgeführt wird. +Die Projektdateien sind in einer separaten Repository und Ordner auf meinem Server, der als Docker-Volume eingebunden ist. +Somit kann man sie super einfach aktualisieren, ohne das ganze Projekt neu bauen zu müssen. + +Als die CLI fertig war, war sie für einige Monate meine Hauptseite. +Dann habe ich den "normalen" Teil erstellt, der im Grunde ein Blog und mein Portfolio ist. + +#### Autodeployment +Wir mögen hier maximale Automatisierung, also musste auch eine CI/CD-Pipeline her. +Da ich mein eigenes Gitea zum Spielen habe, musste auch die Pipeline selbstgehostet sein. +Also habe ich [Drone](https://www.drone.io/) benutzt. +Der Docker-Container landet in der eigenen Registry, also ist es sicher, wenn ich mal geheime oder private Daten in das Projekt einfügen will. + +Die Projektdateien werden zuerst mit [Asciidoctor](https://asciidoctor.org/) gebaut, um ihre Gültigkeit zu überprüfen. +Dann zieht ein Skript sie auf den Server. +Da das Git-Verzeichnis der Projekte auf dem Server nur im Docker-Container eingebunden ist, reicht ein schnelles Neuladen, damit die Dateien auf dem Server verfügbar sind. + +## Die Zuuukuuunft + +Was wird es noch für Features geben? +Keine Ahnung. + +Wahrscheinlich wird es so sein, wie alles hier: +Ich hab eine Idee (ob die gut oder schlecht ist, ist irrelevant) und setze sie entweder sofort um oder füge sie als Issue hinzu. + +## CLI Shortcuts +Wie vorher erwähnt, gibt es einige Shortcuts, um die Bedienung zu erleichtern. + +| Key | Effect | +|-----|--------| +| Tab | Fügt die aktuellen Vorschläge aus der Autovervollständigung ein. | +| / | Durchsuchen der letzten Befehle. | +| Ctrl+L | Löscht den Verlauf. Ähnlich wie `clear`. | +| Ctrl+D | Verlässt die Seite. Wenn das nicht funktioniert ([JavaScript-Einschränkung](https://developer.mozilla.org/en-US/docs/Web/API/Window/close)) geht es zurück in die Seitenhistorie. Ähnlich wie `exit`. | +| Ctrl+U/Ctrl+C | Entfernt die aktuelle Eingabe. | +| Esc | Schließt das Dialogmodal. | + +## Zeug, auf das ich stolz bin +- Jede Zeile der Historie wird in einem eigenen Format geparst. + * `%{command}` wird als klickbares Kommando dargestellt. + * `#{link text|url}` wird als Link dargestellt. +- Die Projektlogs werden dynamisch geladen. Sie können jederzeit aktualisiert werden. + * Aber sie werden im Backend gerendert. Für die Hauptseite (nicht die CLI) ist theoretisch kein JS notwendig. +- Es gibt viele Eastereggs. Einige sind für bestimmte Personen, einige für mich und einige einfach nur zum Spaß. +- Ich habe einige benutzerdefinierte Anmerkungen für Codeblöcke erstellt, die fehlerhaften Code anzeigen (falsche Syntax/wird nicht kompiliert/etc.). + +
+```rust +// So sieht ein fehlerhafter Codeblock aus +fn main() { + let x = 5; + x = 6; +} +``` +
+ diff --git a/src/content/portfolio/tufast.mdx b/src/content/portfolio/tufast.mdx new file mode 100644 index 0000000..8d2d77f --- /dev/null +++ b/src/content/portfolio/tufast.mdx @@ -0,0 +1,47 @@ +--- +title: TUfast TUD +summary: "TUfast ist eine Browser-Erweiterung, die von mehreren tausend Studierenden der TU Dresden genutzt wird. Sie bietet Auto-Login auf den wichtigsten Portalen der TU Dresden, Shortcuts, Redirects und weitere QoL-Features. Ich war einer der Entwickler." +repository: https://github.com/TUfast-TUD/TUfast_TUD +relatedWebsite: https://tu-fast.de/ +pubDate: 2022-06-23 +tags: + - "Öffentlich" + - TypeScript + - Open Source +--- + +Meine Arbeit an einer Browser-Extension, die von tausenden Stundierenden genutzt wird. + +## Was ist TUfast? +TUfast ist einen Browser-Erweiterung, die von einigen Studierenden der TU Dresden entwickelt wurde. +Ursprünglich ein Ein-Mann-Projekt hab ich schon früh Pull Requests gestellt und somit mitentwickelt. +Nach einer Zeit hat sich ein Team gebildet und die Extension wurde immer weiter verbessert und erweitert. + +Die Hauptfunktion besteht darin, einen Auto-Login auf all den verschiedenen Portalen der TU Dresden zu ermöglichen. +Zusätzlich gibt es noch viele weitere Features, wie Shortcuts, Redirects von Suchmaschinen andere QoL-Features. +Insgesamt hat die Extension mehrere tausend Nutzer. + +Das Projekt ist Open Source und [auf Github gehostet](https://github.com/TUfast-TUD/TUfast_TUD). + +TUfast ist eine Browser-Erweiterung, die von einigen Studierenden der TU Dresden entwickelt wurde. +Die Hauptfunktion besteht darin, Benutzernamen und Passwörter auf verschiedenen Login-Seiten der TU-Portale einzufügen. +Weitere Funktionen sind Shortcuts, Redirects von Suchmaschinen, Verbesserungen und mehr. +Es hat mehrere tausend Nutzer. + +Das Projekt ist Open Source und [auf Github gehostet](https://github.com/TUfast-TUD/TUfast_TUD). +Mittlerweile gibt es leider keinen richtigen Maintainer mehr, aber der Owner ist offen für Merge Requests und Hilfe. + +## Was habe ich gemacht? +Ich war einer der ersten und einer der Hauptprogrammierer des Projekts. +An einem Punkt haben wir beschlossen, die Codebase auf TypeScript umzustellen, [Manifest V3](https://developer.chrome.com/docs/extensions/mv3/intro/) zu unterstützen und dabei gleich mit all den bis dahin verteilten Scripten aufzuräumen. +Zu diesem Zeitpunkt war der komplette Backendcode 100% meine Arbeit. + +Später wurde noch eine 2-Faktor-Authentifizierung für viele Logins hinzugefügt. +Obwohl ich zu diesem Zeitpunkt nicht einmal mehr Student war, habe ich eine Implementierung des TOTP-Algorithmus gebaut, sodass der Auto-Login vollständig von der Extension übernommen werden konnte. +Natürlich ist das absolut nicht optimal, 2FA so einfach zu automatisieren, aber die Realität ist, dass viele Studierende diese Funktion nutzen, um sich den Login zu erleichtern. +Ich selbst würde es nicht nutzen, aber ich verstehe den Nutzen dahinter. + +## Weitere Informationen + +- [Repository](https://github.com/TUfast-TUD/TUfast_TUD) +- [Website](https://tu-fast.de/) diff --git a/src/data/socials.json b/src/data/socials.json new file mode 100644 index 0000000..aef377a --- /dev/null +++ b/src/data/socials.json @@ -0,0 +1,23 @@ +[ + { + "name": "GitHub", + "url": "https://github.com/C0ntroller", + "icon": "simple-icons:github" + }, { + "name": "LinkedIn", + "url": "https://www.linkedin.com/in/c0ntroller/", + "icon": "simple-icons:linkedin" + }, { + "name": "Instagram", + "url": "https://www.instagram.com/c0ntroller/", + "icon": "simple-icons:instagram" + }, { + "name": "Steam", + "url": "https://steamcommunity.com/id/c0ntroller/", + "icon": "simple-icons:steam" + }, { + "name": "Discord", + "url": "https://discordapp.com/users/224208617820127233", + "icon": "simple-icons:discord" + } +] \ No newline at end of file diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro new file mode 100644 index 0000000..969b7ba --- /dev/null +++ b/src/layouts/BaseLayout.astro @@ -0,0 +1,72 @@ +--- +import "../styles/global.css"; +import Navigation from "../components/Navigation.astro"; +import { Font } from "astro:assets"; + +interface Props { + title: string; + theme?: "portfolio" | "blog" | "book" | "default"; + description?: string; +} + +const { + title, + theme = "default", + description = "Persönliche Webseite von Daniel Kluge", +} = Astro.props; +--- + + + + + + + + + + + + + + + + + + + + + + + + + + {title} + + + + +
+ +
+ + diff --git a/src/pages/blog/[...slug].astro b/src/pages/blog/[...slug].astro new file mode 100644 index 0000000..7826ff7 --- /dev/null +++ b/src/pages/blog/[...slug].astro @@ -0,0 +1,41 @@ +--- +import { getCollection, render } from 'astro:content'; +import BaseLayout from '../../layouts/BaseLayout.astro'; +import "katex/dist/katex.min.css"; +import "rehype-callouts/theme/obsidian" + +export async function getStaticPaths() { + const blogEntries = await getCollection('blog'); + return blogEntries.map(entry => ({ + params: { slug: entry.id }, props: { entry }, + })); +} + +const { entry } = Astro.props; +const { Content } = await render(entry); +--- + +
+

{entry.data.title}

+
+ +
+
+ +
+ +
+
+ + diff --git a/src/pages/blog/index.astro b/src/pages/blog/index.astro new file mode 100644 index 0000000..bb79b51 --- /dev/null +++ b/src/pages/blog/index.astro @@ -0,0 +1,47 @@ +--- +import { getCollection } from 'astro:content'; +import BaseLayout from '../../layouts/BaseLayout.astro'; + +const posts = await getCollection('blog'); +posts.sort((a, b) => b.data.pubDate.valueOf() - a.data.pubDate.valueOf()); +--- + +
+

Artikel & Gedanken

+

Gedanken über Technologie, Design und das Leben.

+
+ +
+ + diff --git a/src/pages/book/[...slug].astro b/src/pages/book/[...slug].astro new file mode 100644 index 0000000..5e98ae5 --- /dev/null +++ b/src/pages/book/[...slug].astro @@ -0,0 +1,112 @@ +--- +import { getCollection, render } from 'astro:content'; +import BaseLayout from '../../layouts/BaseLayout.astro'; +import BookNavigation from '../../components/BookNavigation.astro'; +import "katex/dist/katex.min.css"; +import "rehype-callouts/theme/obsidian"; +import "../../styles/md-custom.css"; + +export async function getStaticPaths() { + const pages = await getCollection('book'); + pages.sort((a, b) => a.id.localeCompare(b.id)); + + return pages.map((page, index) => { + return { + params: { slug: page.id }, + props: { + page, + prevPage: index > 0 ? pages[index - 1] : null, + nextPage: index < pages.length - 1 ? pages[index + 1] : null, + allPages: pages + } + }; + }); +} + +const { page, prevPage, nextPage, allPages } = Astro.props; +const { Content } = await render(page); + +const chapters = allPages.reduce((acc, p) => { + const [chapter] = p.id.split('/'); + if (!acc[chapter]) acc[chapter] = []; + acc[chapter].push(p); + return acc; +}, {} as Record); +--- + +
+

{page.data.title}

+ +
+ + +
+ {Object.entries(chapters).map(([chapter, items]) => ( +
+

{chapter.replace(/-/g, ' ').toUpperCase()}

+ +
+ ))} +
+
+
+ + diff --git a/src/pages/book/index.astro b/src/pages/book/index.astro new file mode 100644 index 0000000..a106ade --- /dev/null +++ b/src/pages/book/index.astro @@ -0,0 +1,44 @@ +--- +import { getCollection } from 'astro:content'; +import BaseLayout from '../../layouts/BaseLayout.astro'; + +const pages = await getCollection('book'); +pages.sort((a, b) => a.data.part - b.data.part); + +const chapters = pages.reduce((acc, page) => { + const chapter = page.data.chapter["id"]; + if (!acc[chapter]) acc[chapter] = []; + acc[chapter].push(page); + return acc; +}, {} as Record); +--- + +
+

Das Buch

+

Ein fortlaufendes Werk über Software, Design und Architektur.

+
+ +
+

Inhaltsverzeichnis

+ {Object.entries(chapters).map(([chapter, items]) => ( +
+

{chapter.replace(/-/g, ' ').toUpperCase()}

+ +
+ ))} +
+
+ diff --git a/src/pages/index.astro b/src/pages/index.astro new file mode 100644 index 0000000..0dab9b6 --- /dev/null +++ b/src/pages/index.astro @@ -0,0 +1,226 @@ +--- +import WelcomeTypewriter from '../components/WelcomeTypewriter.astro'; +import BaseLayout from '../layouts/BaseLayout.astro'; +import { Icon } from 'astro-icon/components'; +import socials from "../data/socials.json"; +--- + + + + + diff --git a/src/pages/portfolio/[...slug].astro b/src/pages/portfolio/[...slug].astro new file mode 100644 index 0000000..de85600 --- /dev/null +++ b/src/pages/portfolio/[...slug].astro @@ -0,0 +1,52 @@ +--- +import { getCollection, render } from 'astro:content'; +import BaseLayout from '../../layouts/BaseLayout.astro'; +import "katex/dist/katex.min.css"; +import "rehype-callouts/theme/obsidian" + +export async function getStaticPaths() { + const portfolioEntries = await getCollection('portfolio'); + return portfolioEntries.map(entry => ({ + params: { slug: entry.id }, props: { entry }, + })); +} + +const { entry } = Astro.props; +const { Content } = await render(entry); +--- + +
+

{entry.data.title}

+

{entry.data.summary}

+ {entry.data.tags && ( +
+ {entry.data.tags.map(tech => {tech})} +
+ )} +
+ +
+ +
+
+ + diff --git a/src/pages/portfolio/index.astro b/src/pages/portfolio/index.astro new file mode 100644 index 0000000..699fc05 --- /dev/null +++ b/src/pages/portfolio/index.astro @@ -0,0 +1,55 @@ +--- +import { getCollection } from 'astro:content'; +import BaseLayout from '../../layouts/BaseLayout.astro'; + +const projects = await getCollection('portfolio'); +projects.sort((a, b) => b.data.pubDate.getTime() - a.data.pubDate.getTime()); +--- + +
+

Meine Arbeiten

+

Eine Auswahl aktueller Projekte und Experimente.

+
+ + +
+ diff --git a/src/remark-modified-time.mjs b/src/remark-modified-time.mjs new file mode 100644 index 0000000..1881cca --- /dev/null +++ b/src/remark-modified-time.mjs @@ -0,0 +1,22 @@ +import { execSync } from "child_process"; +import { statSync } from "fs"; + +export function remarkModifiedTime() { + return function (tree, file) { + const filepath = file.history[0]; + try { + const result = execSync(`git log -1 --pretty="format:%cI" "${filepath}"`); + // If result is empty or undefined, fallback to fs stat + if (!result || !result.toString().trim()) { + throw new Error("No git history"); + } + file.data.astro.frontmatter.lastModified = result.toString(); + return; + } catch (e) { + // Ignore, fallback to fs stat + const result = statSync(filepath); + file.data.astro.frontmatter.lastModified = result.mtime.toISOString(); + return; + } + }; +} diff --git a/src/styles/global.css b/src/styles/global.css new file mode 100644 index 0000000..dc8839b --- /dev/null +++ b/src/styles/global.css @@ -0,0 +1,221 @@ +*, *::before, *::after { + box-sizing: border-box; +} + +@view-transition { + navigation: auto; +} + +::view-transition-group(root) { + background-color: var(--bg-color); +} + +@property --accent-base { + syntax: ''; + inherits: true; + initial-value: 214, 134, 249; +} +@property --bg-image { + syntax: ''; + inherits: true; + initial-value: url('../assets/backgrounds/bubble.svg'); +} +@property --bg-image-static { + syntax: ''; + inherits: true; + initial-value: url('../assets/backgrounds/bubble-static.svg'); +} +@property --glass-bg { + syntax: ''; + inherits: true; + initial-value: rgba(20, 25, 35, 0.4); +} +@property --glass-border { + syntax: ''; + inherits: true; + initial-value: rgba(255, 255, 255, 0.08); +} +@property --glass-blur { + syntax: ''; + inherits: true; + initial-value: 16px; +} +@property --glass-shadow { + syntax: ''; + inherits: true; + initial-value: 0 8px 32px 0 rgba(0, 0, 0, 0.37); +} +@property --text-main { + syntax: ''; + inherits: true; + initial-value: #e0e7f0; +} +@property --text-muted { + syntax: ''; + inherits: true; + initial-value: #92a1b6; +} +@property --bg-color { + syntax: ''; + inherits: true; + initial-value: #0d0117; +} +@property --accent-base--default { + syntax: ''; + inherits: true; + initial-value: 214, 134, 249; +} +@property --accent-base--portfolio { + syntax: ''; + inherits: true; + initial-value: 255, 181, 102; +} +@property --accent-base--blog { + syntax: ''; + inherits: true; + initial-value: 111, 221, 246; +} +@property --accent-base--book { + syntax: ''; + inherits: true; + initial-value: 247, 110, 138; +} + +:root { + color-scheme: dark; + --bg-color: #0d0117; + --text-main: #e0e7f0; + --text-muted: #92a1b6; + + --glass-bg: rgba(20, 25, 35, 0.4); + --glass-border: rgba(255, 255, 255, 0.08); + --glass-blur: 16px; + --glass-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.37); + + --accent-base--default: 214, 134, 249; + --accent-base--portfolio: 255, 181, 102; + --accent-base--blog: 111, 221, 246; + --accent-base--book: 247, 110, 138; + --accent-base: var(--accent-base--default); +} + +body[data-theme="default"] { + --bg-image: url('../assets/backgrounds/bubble.svg'); + --bg-image-static: url('../assets/backgrounds/bubble-static.svg'); +} + +body[data-theme="portfolio"] { + --accent-base: var(--accent-base--portfolio); + --bg-image: url('../assets/backgrounds/dual-ripples.svg'); + --bg-image-static: url('../assets/backgrounds/dual-ripples-static.svg'); +} + +body[data-theme="blog"] { + --accent-base: var(--accent-base--blog); + --bg-image: url('../assets/backgrounds/ripple-line.svg'); + --bg-image-static: url('../assets/backgrounds/ripple-line-static.svg'); +} + +body[data-theme="book"] { + --accent-base: var(--accent-base--book); + --bg-image: url('../assets/backgrounds/curve-ripple.svg'); + --bg-image-static: url('../assets/backgrounds/curve-ripple-static.svg'); +} + +html { + background-color: var(--bg-color); +} + +body { + font-family: 'Segoe UI', Arial; + background-color: var(--bg-color); + color: var(--text-main); + margin: 0; + padding: 0; + line-height: 1.6; + min-height: 100vh; + background-image: var(--bg-image), radial-gradient(circle at 50% 0%, rgba(var(--accent-base), 0.15), transparent 60%); + background-size: cover, auto; + background-position: center; + background-attachment: fixed; + transition: background-image 0.6s ease; +} + +@media (prefers-reduced-motion: reduce) { + body { + background-image: var(--bg-image-static), radial-gradient(circle at 50% 0%, rgba(var(--accent-base), 0.15), transparent 60%); + } +} + +h1, h2, h3, h4, h5, h6 { + color: rgb(var(--accent-base)); + font-weight: 600; + margin-top: 2rem; + margin-bottom: 1rem; +} + +a { + color: inherit; + text-decoration: none; + transition: all 0.2s ease-in-out; +} + +a:hover { + text-shadow: 0 0 8px rgba(var(--accent-base), 0.6); +} + +.glass-container { + background: var(--glass-bg); + backdrop-filter: blur(var(--glass-blur)); + -webkit-backdrop-filter: blur(var(--glass-blur)); + border: 1px solid var(--glass-border); + box-shadow: var(--glass-shadow); + border-radius: 1rem; + padding: 2rem; + transition: border-color 0.3s ease, box-shadow 0.3s ease; +} + +.glass-container:hover { + border-color: rgba(var(--accent-base), 0.3); + box-shadow: 0 8px 32px 0 rgba(var(--accent-base), 0.1); +} + +.container { + max-width: 800px; + margin: 0 auto; + padding: 2rem; +} + +/* Typography styles for markdown content */ +.prose code { + font-family: var(--font-cascadia-code); + background: rgba(255, 255, 255, 0.1); + padding: 0.2em 0.4em; + border-radius: 0.25rem; + font-size: 0.9em; +} + +.prose pre { + background: #111827; + padding: 1.5rem; + border-radius: 0.5rem; + overflow-x: auto; + border: 1px solid var(--glass-border); +} + +.prose pre code { + background: transparent; + padding: 0; +} + +/* Mobile Responsiveness */ +@media (max-width: 600px) { + .container { + padding: 1rem; + } + .glass-container { + padding: 1.25rem; + } + h1 { font-size: 1.75rem; } + h2 { font-size: 1.5rem; } +} diff --git a/src/styles/md-custom.css b/src/styles/md-custom.css new file mode 100644 index 0000000..03eaa11 --- /dev/null +++ b/src/styles/md-custom.css @@ -0,0 +1,49 @@ +.callout { + mix-blend-mode: unset !important; +} + +table { + border-collapse: collapse; +} + +th { + border-bottom: 1px solid var(--text-muted, #ccc); + font-weight: bold; +} +td { + border-top: 1px solid var(--text-muted, #ccc); +} + +th:not(:first-child), td:not(:first-child) { + border-left: 1px solid var(--text-muted, #ccc); +} +th:not(:last-child), td:not(:last-child) { + border-right: 1px solid var(--text-muted, #ccc); +} + +th, td { + padding: 0.5em; + text-align: right; +} + +blockquote, output { + position: relative; + border-top: 1px solid var(--text-muted, #ccc); + border-bottom: 1px solid var(--text-muted, #ccc); + margin: 0; + padding: 10px; + padding-left: 25px; + font-family: var(--font-cascadia-code); + + p { + margin: 0; + } +} + +blockquote::before { + content: ">"; + font-weight: bold; + position: absolute; + left: 0; + color: var(--text-muted, #ccc); +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..8bf91d3 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "astro/tsconfigs/strict", + "include": [".astro/types.d.ts", "**/*"], + "exclude": ["dist"] +}