commit edb656807b225d9d684abfe7bbb8fb7e7f7a8902
parent 228bbd314d812180e871ef6ed9c74069b3ed8beb
Author: Damian Myrda <damian@prime8.dev>
Date: Tue, 20 Jan 2026 22:39:59 -0600
feat!: rewrite the website in astro
Diffstat:
99 files changed, 7170 insertions(+), 10695 deletions(-)
diff --git a/Dockerfile b/Dockerfile
@@ -1,18 +0,0 @@
-FROM ghcr.io/getzola/zola:v0.19.2 AS web
-COPY ./web/ /src/
-WORKDIR /src/
-RUN ["zola", "build"]
-
-FROM caddy:builder AS caddy
-RUN xcaddy build \
- --with github.com/caddyserver/cache-handler \
- --with github.com/mholt/caddy-ratelimit
-
-FROM caddy:latest
-COPY --from=caddy /usr/bin/caddy /usr/bin/caddy
-COPY ./caddy /etc/caddy/Caddyfile
-COPY --from=web /src/public/ /web/
-EXPOSE 80 443 443/udp
-
-HEALTHCHECK --interval=60s --timeout=5s --start-period=5s \
- CMD curl -f http://localhost/ || exit 1
diff --git a/LICENSE b/LICENSE
@@ -1,5 +1,5 @@
- GNU AFFERO GENERAL PUBLIC LICENSE
- Version 3, 19 November 2007
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
@@ -7,15 +7,17 @@
Preamble
- The GNU Affero General Public License is a free, copyleft license for
-software and other kinds of works, specifically designed to ensure
-cooperation with the community in the case of network server software.
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
-our General Public Licenses are intended to guarantee your freedom to
+the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
-software for all its users.
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
@@ -24,34 +26,44 @@ them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
- Developers that use our General Public Licenses protect your rights
-with two steps: (1) assert copyright on the software, and (2) offer
-you this License which gives you legal permission to copy, distribute
-and/or modify the software.
-
- A secondary benefit of defending all users' freedom is that
-improvements made in alternate versions of the program, if they
-receive widespread use, become available for other developers to
-incorporate. Many developers of free software are heartened and
-encouraged by the resulting cooperation. However, in the case of
-software used on network servers, this result may fail to come about.
-The GNU General Public License permits making a modified version and
-letting the public access it on a server without ever releasing its
-source code to the public.
-
- The GNU Affero General Public License is designed specifically to
-ensure that, in such cases, the modified source code becomes available
-to the community. It requires the operator of a network server to
-provide the source code of the modified version running there to the
-users of that server. Therefore, public use of a modified version, on
-a publicly accessible server, gives the public access to the source
-code of the modified version.
-
- An older license, called the Affero General Public License and
-published by Affero, was designed to accomplish similar goals. This is
-a different license, not a version of the Affero GPL, but Affero has
-released a new version of the Affero GPL which permits relicensing under
-this license.
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
@@ -60,7 +72,7 @@ modification follow.
0. Definitions.
- "This License" refers to version 3 of the GNU Affero General Public License.
+ "This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
@@ -537,45 +549,35 @@ to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
- 13. Remote Network Interaction; Use with the GNU General Public License.
-
- Notwithstanding any other provision of this License, if you modify the
-Program, your modified version must prominently offer all users
-interacting with it remotely through a computer network (if your version
-supports such interaction) an opportunity to receive the Corresponding
-Source of your version by providing access to the Corresponding Source
-from a network server at no charge, through some standard or customary
-means of facilitating copying of software. This Corresponding Source
-shall include the Corresponding Source for any work covered by version 3
-of the GNU General Public License that is incorporated pursuant to the
-following paragraph.
+ 13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
-under version 3 of the GNU General Public License into a single
+under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
-but the work with which it is combined will remain governed by version
-3 of the GNU General Public License.
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
-the GNU Affero General Public License from time to time. Such new versions
-will be similar in spirit to the present version, but may differ in detail to
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
-Program specifies that a certain numbered version of the GNU Affero General
+Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
-GNU Affero General Public License, you may choose any version ever published
+GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
-versions of the GNU Affero General Public License can be used, that proxy's
+versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
@@ -633,29 +635,40 @@ the "copyright" line and a pointer to where the full notice is found.
Copyright (C) 2026 Damian Myrda
This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License, or
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
+ GNU General Public License for more details.
- You should have received a copy of the GNU Affero General Public License
+ You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
- If your software can interact with users remotely through a computer
-network, you should also make sure that it provides a way for users to
-get its source. For example, if your program is a web application, its
-interface could display a "Source" link that leads users to an archive
-of the code. There are many ways you could offer source, and different
-solutions will be better for different programs; see section 13 for the
-specific requirements.
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) 2026 Damian Myrda
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU AGPL, see
+For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<https://www.gnu.org/licenses/why-not-lgpl.html>.
diff --git a/README.md b/README.md
@@ -2,19 +2,9 @@
Personal website at [prime8.dev](https://prime8.dev).
-## Stack
+## Structure
-- **Zola** - Static site generator
-- **Caddy** - Web server with automatic HTTPS, caching, and rate limiting
-- **Dokploy** - Deployment platform
-
-## Development
-
-Build the Docker image:
-
-```sh
-docker build -t prime8dev .
-```
+- [web](web/) - Astro web application
## Deployment
diff --git a/web/.gitignore b/web/.gitignore
@@ -1,3 +1,30 @@
-/data/
-/config/
-/public/
+# dependencies
+node_modules/
+
+# build output
+dist/
+
+# Astro
+.astro/
+
+# environment variables
+.env
+.env.local
+.env.*.local
+
+# macOS
+.DS_Store
+Thumbs.db
+
+# IDE
+.vscode/
+.idea/
+*.swp
+*.swo
+*~
+
+# logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
diff --git a/web/.husky/pre-commit b/web/.husky/pre-commit
@@ -0,0 +1 @@
+bunx lint-staged
diff --git a/web/.prettierignore b/web/.prettierignore
@@ -0,0 +1,3 @@
+dist
+node_modules
+bun.lock
diff --git a/web/.prettierrc b/web/.prettierrc
@@ -0,0 +1,16 @@
+{
+ "semi": true,
+ "singleQuote": false,
+ "tabWidth": 2,
+ "trailingComma": "all",
+ "printWidth": 80,
+ "plugins": ["prettier-plugin-astro"],
+ "overrides": [
+ {
+ "files": "*.astro",
+ "options": {
+ "parser": "astro"
+ }
+ }
+ ]
+}
diff --git a/web/Dockerfile b/web/Dockerfile
@@ -0,0 +1,22 @@
+FROM oven/bun:1 AS base
+WORKDIR /app
+
+FROM base AS deps
+COPY package.json bun.lock ./
+RUN bun install --frozen-lockfile
+
+FROM base AS build
+COPY --from=deps /app/node_modules ./node_modules
+COPY . .
+RUN bun run build
+
+FROM oven/bun:1-slim AS runtime
+WORKDIR /app
+COPY --from=build /app/dist ./dist
+COPY --from=build /app/node_modules ./node_modules
+
+ENV HOST=0.0.0.0
+ENV PORT=4321
+EXPOSE 4321
+
+CMD ["bun", "./dist/server/entry.mjs"]
diff --git a/web/README.md b/web/README.md
@@ -0,0 +1,36 @@
+# web
+
+Astro web application for [prime8.dev](https://prime8.dev).
+
+## Stack
+
+- **Astro** - Static site generator with SSR
+- **TypeScript** - Type-safe code
+- **Bun** - Package manager and runtime
+- **Docker** - Containerization
+
+## Development
+
+Install dependencies:
+
+```sh
+bun install
+```
+
+Run development server:
+
+```sh
+bun run dev
+```
+
+Build for production:
+
+```sh
+bun run build
+```
+
+Build the Docker image:
+
+```sh
+docker build -t prime8dev .
+```
diff --git a/web/astro.config.mjs b/web/astro.config.mjs
@@ -0,0 +1,16 @@
+import { defineConfig } from "astro/config";
+import bun from "astro-bun-adapter";
+
+export default defineConfig({
+ output: "server",
+ site: "https://prime8.dev",
+ adapter: bun(),
+ server: {
+ host: true,
+ },
+ image: {
+ service: {
+ entrypoint: "astro/assets/services/noop",
+ },
+ },
+});
diff --git a/web/blogs/building-my-portfolio.md b/web/blogs/building-my-portfolio.md
@@ -0,0 +1,46 @@
+---
+id: building-my-portfolio
+title: Building a TUI-Inspired Portfolio
+description: How I built this terminal-style portfolio with Astro
+date: 2026-01-16
+tags:
+ - Astro
+ - TypeScript
+ - TUI
+ - Web Development
+ - Portfolio
+---
+
+I've always been drawn to terminal interfaces. There's something satisfying about the simplicity and efficiency of a well-designed TUI. So when it came time to build my portfolio, I knew I wanted to capture that aesthetic. Keyboard navigation and dark color scheme that feels like home.
+
+## The Stack
+
+This site is built with **Astro** for server-side rendering. At build/request time, READMEs are fetched directly from my GitLab and GitHub repositories: no stale content. **Wakatime integration** pulls my coding stats in real-time, showing weekly activity breakdowns and total hours coded. It's a nice way to show I'm actually writing code, not just talking about it.
+
+## Design Decisions
+
+A few key choices drove the design:
+
+- **Keyboard-first navigation** – Number keys (`1-4`) switch tabs instantly. Arrow keys navigate lists and timelines. `Tab` cycles through sections. `Enter` opens blog posts, `Escape` closes them. It feels like using a real terminal application.
+- **List-detail pattern** – Projects and experience use a sidebar list with detail views, similar to email clients or file managers. The experience page features a timeline visualization that's navigable with arrow keys.
+- **Live data everywhere** – WakaTime stats update on every page load. Project READMEs are fetched fresh from git repositories. No static snapshots that go stale.
+
+## The Color Palette
+
+The palette is inspired by classic terminal emulators:
+
+- Background: `#0d0d0d` (near-black)
+- Foreground: `#c0c0c0` (soft gray)
+- Accent: `#d7af5f` (warm gold)
+- Links: `#5fafff` (light blue)
+- Cyan, magenta, red for semantic colors
+
+JetBrains Mono is the font throughout. It's readable and has great character distinction.
+
+## Conclusion
+
+Building this portfolio was a chance to combine two things I love: terminal aesthetics and modern web development. The result is something that feels personal: a site that reflects how I actually work, not just what I've worked on.
+
+If you're thinking about building your own portfolio, my advice is simple: make it yours. Pick a style that resonates with you, add the features you'd actually want to use, and don't be afraid to over-engineer the parts you find interesting. That's where the best learning happens.
+
+The source code is available at [git.prime8.dev](https://git.prime8.dev/moncheeta/prime8dev).
diff --git a/web/bun.lock b/web/bun.lock
@@ -0,0 +1,1187 @@
+{
+ "lockfileVersion": 1,
+ "configVersion": 1,
+ "workspaces": {
+ "": {
+ "name": "prime8dev",
+ "dependencies": {
+ "astro": "^5.16.11",
+ "astro-bun-adapter": "^1.0.2",
+ "gray-matter": "^4.0.3",
+ "jimp": "^1.6.0",
+ "marked": "^17.0.1",
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.39.2",
+ "eslint": "^9.39.2",
+ "eslint-config-prettier": "^10.1.8",
+ "eslint-plugin-astro": "^1.5.0",
+ "globals": "^17.0.0",
+ "husky": "^9.1.7",
+ "lint-staged": "^16.2.7",
+ "prettier": "^3.8.0",
+ "prettier-plugin-astro": "^0.14.1",
+ "typescript-eslint": "^8.53.0",
+ },
+ },
+ },
+ "packages": {
+ "@astrojs/compiler": ["@astrojs/compiler@2.13.0", "", {}, "sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw=="],
+
+ "@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.7.5", "", {}, "sha512-vreGnYSSKhAjFJCWAwe/CNhONvoc5lokxtRoZims+0wa3KbHBdPHSSthJsKxPd8d/aic6lWKpRTYGY/hsgK6EA=="],
+
+ "@astrojs/markdown-remark": ["@astrojs/markdown-remark@6.3.10", "", { "dependencies": { "@astrojs/internal-helpers": "0.7.5", "@astrojs/prism": "3.3.0", "github-slugger": "^2.0.0", "hast-util-from-html": "^2.0.3", "hast-util-to-text": "^4.0.2", "import-meta-resolve": "^4.2.0", "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": "^3.19.0", "smol-toml": "^1.5.2", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.2", "vfile": "^6.0.3" } }, "sha512-kk4HeYR6AcnzC4QV8iSlOfh+N8TZ3MEStxPyenyCtemqn8IpEATBFMTJcfrNW32dgpt6MY3oCkMM/Tv3/I4G3A=="],
+
+ "@astrojs/prism": ["@astrojs/prism@3.3.0", "", { "dependencies": { "prismjs": "^1.30.0" } }, "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ=="],
+
+ "@astrojs/telemetry": ["@astrojs/telemetry@3.3.0", "", { "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" } }, "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ=="],
+
+ "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="],
+
+ "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="],
+
+ "@babel/parser": ["@babel/parser@7.28.6", "", { "dependencies": { "@babel/types": "^7.28.6" }, "bin": "./bin/babel-parser.js" }, "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ=="],
+
+ "@babel/types": ["@babel/types@7.28.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg=="],
+
+ "@capsizecss/unpack": ["@capsizecss/unpack@4.0.0", "", { "dependencies": { "fontkitten": "^1.0.0" } }, "sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA=="],
+
+ "@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="],
+
+ "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="],
+
+ "@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="],
+
+ "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="],
+
+ "@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="],
+
+ "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="],
+
+ "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="],
+
+ "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="],
+
+ "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="],
+
+ "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="],
+
+ "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="],
+
+ "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="],
+
+ "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="],
+
+ "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="],
+
+ "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="],
+
+ "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="],
+
+ "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="],
+
+ "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="],
+
+ "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="],
+
+ "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="],
+
+ "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="],
+
+ "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="],
+
+ "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="],
+
+ "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="],
+
+ "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="],
+
+ "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="],
+
+ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="],
+
+ "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ=="],
+
+ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="],
+
+ "@eslint/config-array": ["@eslint/config-array@0.21.1", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA=="],
+
+ "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="],
+
+ "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="],
+
+ "@eslint/eslintrc": ["@eslint/eslintrc@3.3.3", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ=="],
+
+ "@eslint/js": ["@eslint/js@9.39.2", "", {}, "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA=="],
+
+ "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="],
+
+ "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="],
+
+ "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="],
+
+ "@humanfs/node": ["@humanfs/node@0.16.7", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ=="],
+
+ "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="],
+
+ "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="],
+
+ "@img/colour": ["@img/colour@1.0.0", "", {}, "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw=="],
+
+ "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="],
+
+ "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="],
+
+ "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="],
+
+ "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="],
+
+ "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="],
+
+ "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="],
+
+ "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.2.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA=="],
+
+ "@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.2.4", "", { "os": "linux", "cpu": "none" }, "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA=="],
+
+ "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="],
+
+ "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="],
+
+ "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="],
+
+ "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="],
+
+ "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="],
+
+ "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="],
+
+ "@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.2.4" }, "os": "linux", "cpu": "ppc64" }, "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA=="],
+
+ "@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.2.4" }, "os": "linux", "cpu": "none" }, "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw=="],
+
+ "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="],
+
+ "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="],
+
+ "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="],
+
+ "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="],
+
+ "@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="],
+
+ "@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.34.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g=="],
+
+ "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="],
+
+ "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="],
+
+ "@jimp/core": ["@jimp/core@1.6.0", "", { "dependencies": { "@jimp/file-ops": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "await-to-js": "^3.0.0", "exif-parser": "^0.1.12", "file-type": "^16.0.0", "mime": "3" } }, "sha512-EQQlKU3s9QfdJqiSrZWNTxBs3rKXgO2W+GxNXDtwchF3a4IqxDheFX1ti+Env9hdJXDiYLp2jTRjlxhPthsk8w=="],
+
+ "@jimp/diff": ["@jimp/diff@1.6.0", "", { "dependencies": { "@jimp/plugin-resize": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "pixelmatch": "^5.3.0" } }, "sha512-+yUAQ5gvRC5D1WHYxjBHZI7JBRusGGSLf8AmPRPCenTzh4PA+wZ1xv2+cYqQwTfQHU5tXYOhA0xDytfHUf1Zyw=="],
+
+ "@jimp/file-ops": ["@jimp/file-ops@1.6.0", "", {}, "sha512-Dx/bVDmgnRe1AlniRpCKrGRm5YvGmUwbDzt+MAkgmLGf+jvBT75hmMEZ003n9HQI/aPnm/YKnXjg/hOpzNCpHQ=="],
+
+ "@jimp/js-bmp": ["@jimp/js-bmp@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "bmp-ts": "^1.0.9" } }, "sha512-FU6Q5PC/e3yzLyBDXupR3SnL3htU7S3KEs4e6rjDP6gNEOXRFsWs6YD3hXuXd50jd8ummy+q2WSwuGkr8wi+Gw=="],
+
+ "@jimp/js-gif": ["@jimp/js-gif@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "gifwrap": "^0.10.1", "omggif": "^1.0.10" } }, "sha512-N9CZPHOrJTsAUoWkWZstLPpwT5AwJ0wge+47+ix3++SdSL/H2QzyMqxbcDYNFe4MoI5MIhATfb0/dl/wmX221g=="],
+
+ "@jimp/js-jpeg": ["@jimp/js-jpeg@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "jpeg-js": "^0.4.4" } }, "sha512-6vgFDqeusblf5Pok6B2DUiMXplH8RhIKAryj1yn+007SIAQ0khM1Uptxmpku/0MfbClx2r7pnJv9gWpAEJdMVA=="],
+
+ "@jimp/js-png": ["@jimp/js-png@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "pngjs": "^7.0.0" } }, "sha512-AbQHScy3hDDgMRNfG0tPjL88AV6qKAILGReIa3ATpW5QFjBKpisvUaOqhzJ7Reic1oawx3Riyv152gaPfqsBVg=="],
+
+ "@jimp/js-tiff": ["@jimp/js-tiff@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "utif2": "^4.1.0" } }, "sha512-zhReR8/7KO+adijj3h0ZQUOiun3mXUv79zYEAKvE0O+rP7EhgtKvWJOZfRzdZSNv0Pu1rKtgM72qgtwe2tFvyw=="],
+
+ "@jimp/plugin-blit": ["@jimp/plugin-blit@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "zod": "^3.23.8" } }, "sha512-M+uRWl1csi7qilnSK8uxK4RJMSuVeBiO1AY0+7APnfUbQNZm6hCe0CCFv1Iyw1D/Dhb8ph8fQgm5mwM0eSxgVA=="],
+
+ "@jimp/plugin-blur": ["@jimp/plugin-blur@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/utils": "1.6.0" } }, "sha512-zrM7iic1OTwUCb0g/rN5y+UnmdEsT3IfuCXCJJNs8SZzP0MkZ1eTvuwK9ZidCuMo4+J3xkzCidRwYXB5CyGZTw=="],
+
+ "@jimp/plugin-circle": ["@jimp/plugin-circle@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0", "zod": "^3.23.8" } }, "sha512-xt1Gp+LtdMKAXfDp3HNaG30SPZW6AQ7dtAtTnoRKorRi+5yCJjKqXRgkewS5bvj8DEh87Ko1ydJfzqS3P2tdWw=="],
+
+ "@jimp/plugin-color": ["@jimp/plugin-color@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "tinycolor2": "^1.6.0", "zod": "^3.23.8" } }, "sha512-J5q8IVCpkBsxIXM+45XOXTrsyfblyMZg3a9eAo0P7VPH4+CrvyNQwaYatbAIamSIN1YzxmO3DkIZXzRjFSz1SA=="],
+
+ "@jimp/plugin-contain": ["@jimp/plugin-contain@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/plugin-blit": "1.6.0", "@jimp/plugin-resize": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "zod": "^3.23.8" } }, "sha512-oN/n+Vdq/Qg9bB4yOBOxtY9IPAtEfES8J1n9Ddx+XhGBYT1/QTU/JYkGaAkIGoPnyYvmLEDqMz2SGihqlpqfzQ=="],
+
+ "@jimp/plugin-cover": ["@jimp/plugin-cover@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/plugin-crop": "1.6.0", "@jimp/plugin-resize": "1.6.0", "@jimp/types": "1.6.0", "zod": "^3.23.8" } }, "sha512-Iow0h6yqSC269YUJ8HC3Q/MpCi2V55sMlbkkTTx4zPvd8mWZlC0ykrNDeAy9IJegrQ7v5E99rJwmQu25lygKLA=="],
+
+ "@jimp/plugin-crop": ["@jimp/plugin-crop@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "zod": "^3.23.8" } }, "sha512-KqZkEhvs+21USdySCUDI+GFa393eDIzbi1smBqkUPTE+pRwSWMAf01D5OC3ZWB+xZsNla93BDS9iCkLHA8wang=="],
+
+ "@jimp/plugin-displace": ["@jimp/plugin-displace@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "zod": "^3.23.8" } }, "sha512-4Y10X9qwr5F+Bo5ME356XSACEF55485j5nGdiyJ9hYzjQP9nGgxNJaZ4SAOqpd+k5sFaIeD7SQ0Occ26uIng5Q=="],
+
+ "@jimp/plugin-dither": ["@jimp/plugin-dither@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0" } }, "sha512-600d1RxY0pKwgyU0tgMahLNKsqEcxGdbgXadCiVCoGd6V6glyCvkNrnnwC0n5aJ56Htkj88PToSdF88tNVZEEQ=="],
+
+ "@jimp/plugin-fisheye": ["@jimp/plugin-fisheye@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "zod": "^3.23.8" } }, "sha512-E5QHKWSCBFtpgZarlmN3Q6+rTQxjirFqo44ohoTjzYVrDI6B6beXNnPIThJgPr0Y9GwfzgyarKvQuQuqCnnfbA=="],
+
+ "@jimp/plugin-flip": ["@jimp/plugin-flip@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0", "zod": "^3.23.8" } }, "sha512-/+rJVDuBIVOgwoyVkBjUFHtP+wmW0r+r5OQ2GpatQofToPVbJw1DdYWXlwviSx7hvixTWLKVgRWQ5Dw862emDg=="],
+
+ "@jimp/plugin-hash": ["@jimp/plugin-hash@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/js-bmp": "1.6.0", "@jimp/js-jpeg": "1.6.0", "@jimp/js-png": "1.6.0", "@jimp/js-tiff": "1.6.0", "@jimp/plugin-color": "1.6.0", "@jimp/plugin-resize": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "any-base": "^1.1.0" } }, "sha512-wWzl0kTpDJgYVbZdajTf+4NBSKvmI3bRI8q6EH9CVeIHps9VWVsUvEyb7rpbcwVLWYuzDtP2R0lTT6WeBNQH9Q=="],
+
+ "@jimp/plugin-mask": ["@jimp/plugin-mask@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0", "zod": "^3.23.8" } }, "sha512-Cwy7ExSJMZszvkad8NV8o/Z92X2kFUFM8mcDAhNVxU0Q6tA0op2UKRJY51eoK8r6eds/qak3FQkXakvNabdLnA=="],
+
+ "@jimp/plugin-print": ["@jimp/plugin-print@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/js-jpeg": "1.6.0", "@jimp/js-png": "1.6.0", "@jimp/plugin-blit": "1.6.0", "@jimp/types": "1.6.0", "parse-bmfont-ascii": "^1.0.6", "parse-bmfont-binary": "^1.0.6", "parse-bmfont-xml": "^1.1.6", "simple-xml-to-json": "^1.2.2", "zod": "^3.23.8" } }, "sha512-zarTIJi8fjoGMSI/M3Xh5yY9T65p03XJmPsuNet19K/Q7mwRU6EV2pfj+28++2PV2NJ+htDF5uecAlnGyxFN2A=="],
+
+ "@jimp/plugin-quantize": ["@jimp/plugin-quantize@1.6.0", "", { "dependencies": { "image-q": "^4.0.0", "zod": "^3.23.8" } }, "sha512-EmzZ/s9StYQwbpG6rUGBCisc3f64JIhSH+ncTJd+iFGtGo0YvSeMdAd+zqgiHpfZoOL54dNavZNjF4otK+mvlg=="],
+
+ "@jimp/plugin-resize": ["@jimp/plugin-resize@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "zod": "^3.23.8" } }, "sha512-uSUD1mqXN9i1SGSz5ov3keRZ7S9L32/mAQG08wUwZiEi5FpbV0K8A8l1zkazAIZi9IJzLlTauRNU41Mi8IF9fA=="],
+
+ "@jimp/plugin-rotate": ["@jimp/plugin-rotate@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/plugin-crop": "1.6.0", "@jimp/plugin-resize": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "zod": "^3.23.8" } }, "sha512-JagdjBLnUZGSG4xjCLkIpQOZZ3Mjbg8aGCCi4G69qR+OjNpOeGI7N2EQlfK/WE8BEHOW5vdjSyglNqcYbQBWRw=="],
+
+ "@jimp/plugin-threshold": ["@jimp/plugin-threshold@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/plugin-color": "1.6.0", "@jimp/plugin-hash": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "zod": "^3.23.8" } }, "sha512-M59m5dzLoHOVWdM41O8z9SyySzcDn43xHseOH0HavjsfQsT56GGCC4QzU1banJidbUrePhzoEdS42uFE8Fei8w=="],
+
+ "@jimp/types": ["@jimp/types@1.6.0", "", { "dependencies": { "zod": "^3.23.8" } }, "sha512-7UfRsiKo5GZTAATxm2qQ7jqmUXP0DxTArztllTcYdyw6Xi5oT4RaoXynVtCD4UyLK5gJgkZJcwonoijrhYFKfg=="],
+
+ "@jimp/utils": ["@jimp/utils@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0", "tinycolor2": "^1.6.0" } }, "sha512-gqFTGEosKbOkYF/WFj26jMHOI5OH2jeP1MmC/zbK6BF6VJBf8rIC5898dPfSzZEbSA0wbbV5slbntWVc5PKLFA=="],
+
+ "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
+
+ "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
+
+ "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
+
+ "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="],
+
+ "@oslojs/encoding": ["@oslojs/encoding@1.1.0", "", {}, "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ=="],
+
+ "@pkgr/core": ["@pkgr/core@0.2.9", "", {}, "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA=="],
+
+ "@rollup/pluginutils": ["@rollup/pluginutils@5.3.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q=="],
+
+ "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.55.1", "", { "os": "android", "cpu": "arm" }, "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg=="],
+
+ "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.55.1", "", { "os": "android", "cpu": "arm64" }, "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg=="],
+
+ "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.55.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg=="],
+
+ "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.55.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ=="],
+
+ "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.55.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg=="],
+
+ "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.55.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw=="],
+
+ "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.55.1", "", { "os": "linux", "cpu": "arm" }, "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ=="],
+
+ "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.55.1", "", { "os": "linux", "cpu": "arm" }, "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg=="],
+
+ "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.55.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ=="],
+
+ "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.55.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA=="],
+
+ "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.55.1", "", { "os": "linux", "cpu": "none" }, "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g=="],
+
+ "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.55.1", "", { "os": "linux", "cpu": "none" }, "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw=="],
+
+ "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.55.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw=="],
+
+ "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.55.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw=="],
+
+ "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.55.1", "", { "os": "linux", "cpu": "none" }, "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw=="],
+
+ "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.55.1", "", { "os": "linux", "cpu": "none" }, "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg=="],
+
+ "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.55.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg=="],
+
+ "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.55.1", "", { "os": "linux", "cpu": "x64" }, "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg=="],
+
+ "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.55.1", "", { "os": "linux", "cpu": "x64" }, "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w=="],
+
+ "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.55.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg=="],
+
+ "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.55.1", "", { "os": "none", "cpu": "arm64" }, "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw=="],
+
+ "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.55.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g=="],
+
+ "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.55.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA=="],
+
+ "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.55.1", "", { "os": "win32", "cpu": "x64" }, "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg=="],
+
+ "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.55.1", "", { "os": "win32", "cpu": "x64" }, "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw=="],
+
+ "@shikijs/core": ["@shikijs/core@3.21.0", "", { "dependencies": { "@shikijs/types": "3.21.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-AXSQu/2n1UIQekY8euBJlvFYZIw0PHY63jUzGbrOma4wPxzznJXTXkri+QcHeBNaFxiiOljKxxJkVSoB3PjbyA=="],
+
+ "@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.21.0", "", { "dependencies": { "@shikijs/types": "3.21.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.4" } }, "sha512-ATwv86xlbmfD9n9gKRiwuPpWgPENAWCLwYCGz9ugTJlsO2kOzhOkvoyV/UD+tJ0uT7YRyD530x6ugNSffmvIiQ=="],
+
+ "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.21.0", "", { "dependencies": { "@shikijs/types": "3.21.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-OYknTCct6qiwpQDqDdf3iedRdzj6hFlOPv5hMvI+hkWfCKs5mlJ4TXziBG9nyabLwGulrUjHiCq3xCspSzErYQ=="],
+
+ "@shikijs/langs": ["@shikijs/langs@3.21.0", "", { "dependencies": { "@shikijs/types": "3.21.0" } }, "sha512-g6mn5m+Y6GBJ4wxmBYqalK9Sp0CFkUqfNzUy2pJglUginz6ZpWbaWjDB4fbQ/8SHzFjYbtU6Ddlp1pc+PPNDVA=="],
+
+ "@shikijs/themes": ["@shikijs/themes@3.21.0", "", { "dependencies": { "@shikijs/types": "3.21.0" } }, "sha512-BAE4cr9EDiZyYzwIHEk7JTBJ9CzlPuM4PchfcA5ao1dWXb25nv6hYsoDiBq2aZK9E3dlt3WB78uI96UESD+8Mw=="],
+
+ "@shikijs/types": ["@shikijs/types@3.21.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-zGrWOxZ0/+0ovPY7PvBU2gIS9tmhSUUt30jAcNV0Bq0gb2S98gwfjIs1vxlmH5zM7/4YxLamT6ChlqqAJmPPjA=="],
+
+ "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="],
+
+ "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="],
+
+ "@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="],
+
+ "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
+
+ "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="],
+
+ "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
+
+ "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="],
+
+ "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="],
+
+ "@types/nlcst": ["@types/nlcst@2.0.3", "", { "dependencies": { "@types/unist": "*" } }, "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA=="],
+
+ "@types/node": ["@types/node@16.9.1", "", {}, "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g=="],
+
+ "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
+
+ "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.53.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.53.0", "@typescript-eslint/type-utils": "8.53.0", "@typescript-eslint/utils": "8.53.0", "@typescript-eslint/visitor-keys": "8.53.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.53.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-eEXsVvLPu8Z4PkFibtuFJLJOTAV/nPdgtSjkGoPpddpFk3/ym2oy97jynY6ic2m6+nc5M8SE1e9v/mHKsulcJg=="],
+
+ "@typescript-eslint/parser": ["@typescript-eslint/parser@8.53.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.53.0", "@typescript-eslint/types": "8.53.0", "@typescript-eslint/typescript-estree": "8.53.0", "@typescript-eslint/visitor-keys": "8.53.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-npiaib8XzbjtzS2N4HlqPvlpxpmZ14FjSJrteZpPxGUaYPlvhzlzUZ4mZyABo0EFrOWnvyd0Xxroq//hKhtAWg=="],
+
+ "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.53.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.53.0", "@typescript-eslint/types": "^8.53.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-Bl6Gdr7NqkqIP5yP9z1JU///Nmes4Eose6L1HwpuVHwScgDPPuEWbUVhvlZmb8hy0vX9syLk5EGNL700WcBlbg=="],
+
+ "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.53.0", "", { "dependencies": { "@typescript-eslint/types": "8.53.0", "@typescript-eslint/visitor-keys": "8.53.0" } }, "sha512-kWNj3l01eOGSdVBnfAF2K1BTh06WS0Yet6JUgb9Cmkqaz3Jlu0fdVUjj9UI8gPidBWSMqDIglmEXifSgDT/D0g=="],
+
+ "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.53.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-K6Sc0R5GIG6dNoPdOooQ+KtvT5KCKAvTcY8h2rIuul19vxH5OTQk7ArKkd4yTzkw66WnNY0kPPzzcmWA+XRmiA=="],
+
+ "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.53.0", "", { "dependencies": { "@typescript-eslint/types": "8.53.0", "@typescript-eslint/typescript-estree": "8.53.0", "@typescript-eslint/utils": "8.53.0", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-BBAUhlx7g4SmcLhn8cnbxoxtmS7hcq39xKCgiutL3oNx1TaIp+cny51s8ewnKMpVUKQUGb41RAUWZ9kxYdovuw=="],
+
+ "@typescript-eslint/types": ["@typescript-eslint/types@8.53.0", "", {}, "sha512-Bmh9KX31Vlxa13+PqPvt4RzKRN1XORYSLlAE+sO1i28NkisGbTtSLFVB3l7PWdHtR3E0mVMuC7JilWJ99m2HxQ=="],
+
+ "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.53.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.53.0", "@typescript-eslint/tsconfig-utils": "8.53.0", "@typescript-eslint/types": "8.53.0", "@typescript-eslint/visitor-keys": "8.53.0", "debug": "^4.4.3", "minimatch": "^9.0.5", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-pw0c0Gdo7Z4xOG987u3nJ8akL9093yEEKv8QTJ+Bhkghj1xyj8cgPaavlr9rq8h7+s6plUJ4QJYw2gCZodqmGw=="],
+
+ "@typescript-eslint/utils": ["@typescript-eslint/utils@8.53.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.53.0", "@typescript-eslint/types": "8.53.0", "@typescript-eslint/typescript-estree": "8.53.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-XDY4mXTez3Z1iRDI5mbRhH4DFSt46oaIFsLg+Zn97+sYrXACziXSQcSelMybnVZ5pa1P6xYkPr5cMJyunM1ZDA=="],
+
+ "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.53.0", "", { "dependencies": { "@typescript-eslint/types": "8.53.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-LZ2NqIHFhvFwxG0qZeLL9DvdNAHPGCY5dIRwBhyYeU+LfLhcStE1ImjsuTG/WaVh3XysGaeLW8Rqq7cGkPCFvw=="],
+
+ "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="],
+
+ "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="],
+
+ "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="],
+
+ "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],
+
+ "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="],
+
+ "ansi-align": ["ansi-align@3.0.1", "", { "dependencies": { "string-width": "^4.1.0" } }, "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w=="],
+
+ "ansi-escapes": ["ansi-escapes@7.2.0", "", { "dependencies": { "environment": "^1.0.0" } }, "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw=="],
+
+ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
+
+ "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
+
+ "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="],
+
+ "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="],
+
+ "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
+
+ "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="],
+
+ "array-iterate": ["array-iterate@2.0.1", "", {}, "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg=="],
+
+ "astro": ["astro@5.16.11", "", { "dependencies": { "@astrojs/compiler": "^2.13.0", "@astrojs/internal-helpers": "0.7.5", "@astrojs/markdown-remark": "6.3.10", "@astrojs/telemetry": "3.3.0", "@capsizecss/unpack": "^4.0.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.3.0", "acorn": "^8.15.0", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", "boxen": "8.0.1", "ci-info": "^4.3.1", "clsx": "^2.1.1", "common-ancestor-path": "^1.0.1", "cookie": "^1.1.1", "cssesc": "^3.0.0", "debug": "^4.4.3", "deterministic-object-hash": "^2.0.2", "devalue": "^5.6.2", "diff": "^8.0.3", "dlv": "^1.1.3", "dset": "^3.1.4", "es-module-lexer": "^1.7.0", "esbuild": "^0.25.0", "estree-walker": "^3.0.3", "flattie": "^1.1.1", "fontace": "~0.4.0", "github-slugger": "^2.0.0", "html-escaper": "3.0.3", "http-cache-semantics": "^4.2.0", "import-meta-resolve": "^4.2.0", "js-yaml": "^4.1.1", "magic-string": "^0.30.21", "magicast": "^0.5.1", "mrmime": "^2.0.1", "neotraverse": "^0.6.18", "p-limit": "^6.2.0", "p-queue": "^8.1.1", "package-manager-detector": "^1.6.0", "piccolore": "^0.1.3", "picomatch": "^4.0.3", "prompts": "^2.4.2", "rehype": "^13.0.2", "semver": "^7.7.3", "shiki": "^3.20.0", "smol-toml": "^1.6.0", "svgo": "^4.0.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tsconfck": "^3.1.6", "ultrahtml": "^1.6.0", "unifont": "~0.7.1", "unist-util-visit": "^5.0.0", "unstorage": "^1.17.3", "vfile": "^6.0.3", "vite": "^6.4.1", "vitefu": "^1.1.1", "xxhash-wasm": "^1.1.0", "yargs-parser": "^21.1.1", "yocto-spinner": "^0.2.3", "zod": "^3.25.76", "zod-to-json-schema": "^3.25.1", "zod-to-ts": "^1.2.0" }, "optionalDependencies": { "sharp": "^0.34.0" }, "bin": { "astro": "astro.js" } }, "sha512-Z7kvkTTT5n6Hn5lCm6T3WU6pkxx84Hn25dtQ6dR7ATrBGq9eVa8EuB/h1S8xvaoVyCMZnIESu99Z9RJfdLRLDA=="],
+
+ "astro-bun-adapter": ["astro-bun-adapter@1.0.2", "", { "peerDependencies": { "astro": "^4.0.7" } }, "sha512-ugiguVhpLq/O0HTA/DIokAGX9u/aOr+JiwR0++xURN6aAY9zjXU0dfj9A3V4KGXgNXMEEFiZ5gobMhcURAM3Fw=="],
+
+ "astro-eslint-parser": ["astro-eslint-parser@1.2.2", "", { "dependencies": { "@astrojs/compiler": "^2.0.0", "@typescript-eslint/scope-manager": "^7.0.0 || ^8.0.0", "@typescript-eslint/types": "^7.0.0 || ^8.0.0", "astrojs-compiler-sync": "^1.0.0", "debug": "^4.3.4", "entities": "^6.0.0", "eslint-scope": "^8.0.1", "eslint-visitor-keys": "^4.0.0", "espree": "^10.0.0", "fast-glob": "^3.3.3", "is-glob": "^4.0.3", "semver": "^7.3.8" } }, "sha512-JepyLROIad6f44uyqMF6HKE2QbunNzp3mYKRcPoDGt0QkxXmH222FAFC64WTyQu2Kg8NNEXHTN/sWuUId9sSxw=="],
+
+ "astrojs-compiler-sync": ["astrojs-compiler-sync@1.1.1", "", { "dependencies": { "synckit": "^0.11.0" }, "peerDependencies": { "@astrojs/compiler": ">=0.27.0" } }, "sha512-0mKvB9sDQRIZPsEJadw6OaFbGJ92cJPPR++ICca9XEyiUAZqgVuk25jNmzHPT0KF80rI94trSZrUR5iHFXGGOQ=="],
+
+ "await-to-js": ["await-to-js@3.0.0", "", {}, "sha512-zJAaP9zxTcvTHRlejau3ZOY4V7SRpiByf3/dxx2uyKxxor19tpmpV2QRsTKikckwhaPmr2dVpxxMr7jOCYVp5g=="],
+
+ "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
+
+ "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="],
+
+ "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
+
+ "base-64": ["base-64@1.0.0", "", {}, "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg=="],
+
+ "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="],
+
+ "bmp-ts": ["bmp-ts@1.0.9", "", {}, "sha512-cTEHk2jLrPyi+12M3dhpEbnnPOsaZuq7C45ylbbQIiWgDFZq4UVYPEY5mlqjvsj/6gJv9qX5sa+ebDzLXT28Vw=="],
+
+ "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="],
+
+ "boxen": ["boxen@8.0.1", "", { "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^8.0.0", "chalk": "^5.3.0", "cli-boxes": "^3.0.0", "string-width": "^7.2.0", "type-fest": "^4.21.0", "widest-line": "^5.0.0", "wrap-ansi": "^9.0.0" } }, "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw=="],
+
+ "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="],
+
+ "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
+
+ "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="],
+
+ "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="],
+
+ "camelcase": ["camelcase@8.0.0", "", {}, "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA=="],
+
+ "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="],
+
+ "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
+
+ "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="],
+
+ "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="],
+
+ "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="],
+
+ "chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="],
+
+ "ci-info": ["ci-info@4.3.1", "", {}, "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA=="],
+
+ "cli-boxes": ["cli-boxes@3.0.0", "", {}, "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g=="],
+
+ "cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="],
+
+ "cli-truncate": ["cli-truncate@5.1.1", "", { "dependencies": { "slice-ansi": "^7.1.0", "string-width": "^8.0.0" } }, "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A=="],
+
+ "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
+
+ "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
+
+ "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
+
+ "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="],
+
+ "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="],
+
+ "commander": ["commander@14.0.2", "", {}, "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ=="],
+
+ "common-ancestor-path": ["common-ancestor-path@1.0.1", "", {}, "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w=="],
+
+ "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
+
+ "cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="],
+
+ "cookie-es": ["cookie-es@1.2.2", "", {}, "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg=="],
+
+ "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
+
+ "crossws": ["crossws@0.3.5", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA=="],
+
+ "css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="],
+
+ "css-tree": ["css-tree@3.1.0", "", { "dependencies": { "mdn-data": "2.12.2", "source-map-js": "^1.0.1" } }, "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w=="],
+
+ "css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="],
+
+ "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="],
+
+ "csso": ["csso@5.0.5", "", { "dependencies": { "css-tree": "~2.2.0" } }, "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ=="],
+
+ "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
+
+ "decode-named-character-reference": ["decode-named-character-reference@1.2.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q=="],
+
+ "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="],
+
+ "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="],
+
+ "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="],
+
+ "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="],
+
+ "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
+
+ "deterministic-object-hash": ["deterministic-object-hash@2.0.2", "", { "dependencies": { "base-64": "^1.0.0" } }, "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ=="],
+
+ "devalue": ["devalue@5.6.2", "", {}, "sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg=="],
+
+ "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="],
+
+ "diff": ["diff@8.0.3", "", {}, "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ=="],
+
+ "dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="],
+
+ "dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="],
+
+ "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="],
+
+ "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="],
+
+ "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="],
+
+ "dset": ["dset@3.1.4", "", {}, "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA=="],
+
+ "emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="],
+
+ "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="],
+
+ "environment": ["environment@1.1.0", "", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="],
+
+ "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="],
+
+ "esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="],
+
+ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],
+
+ "eslint": ["eslint@9.39.2", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.1", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.39.2", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw=="],
+
+ "eslint-compat-utils": ["eslint-compat-utils@0.6.5", "", { "dependencies": { "semver": "^7.5.4" }, "peerDependencies": { "eslint": ">=6.0.0" } }, "sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ=="],
+
+ "eslint-config-prettier": ["eslint-config-prettier@10.1.8", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w=="],
+
+ "eslint-plugin-astro": ["eslint-plugin-astro@1.5.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@jridgewell/sourcemap-codec": "^1.4.14", "@typescript-eslint/types": "^7.7.1 || ^8", "astro-eslint-parser": "^1.0.2", "eslint-compat-utils": "^0.6.0", "globals": "^16.0.0", "postcss": "^8.4.14", "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "eslint": ">=8.57.0" } }, "sha512-IWy4kY3DKTJxd7g652zIWpBGFuxw7NIIt16kyqc8BlhnIKvI8yGJj+Maua0DiNYED3F/D8AmzoTTTA6A95WX9g=="],
+
+ "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="],
+
+ "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="],
+
+ "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="],
+
+ "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="],
+
+ "esquery": ["esquery@1.7.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g=="],
+
+ "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="],
+
+ "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="],
+
+ "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="],
+
+ "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="],
+
+ "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="],
+
+ "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="],
+
+ "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="],
+
+ "exif-parser": ["exif-parser@0.1.12", "", {}, "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw=="],
+
+ "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="],
+
+ "extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="],
+
+ "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
+
+ "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
+
+ "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="],
+
+ "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="],
+
+ "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="],
+
+ "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
+
+ "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="],
+
+ "file-type": ["file-type@16.5.4", "", { "dependencies": { "readable-web-to-node-stream": "^3.0.0", "strtok3": "^6.2.4", "token-types": "^4.1.1" } }, "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw=="],
+
+ "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
+
+ "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="],
+
+ "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="],
+
+ "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="],
+
+ "flattie": ["flattie@1.1.1", "", {}, "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ=="],
+
+ "fontace": ["fontace@0.4.0", "", { "dependencies": { "fontkitten": "^1.0.0" } }, "sha512-moThBCItUe2bjZip5PF/iZClpKHGLwMvR79Kp8XpGRBrvoRSnySN4VcILdv3/MJzbhvUA5WeiUXF5o538m5fvg=="],
+
+ "fontkitten": ["fontkitten@1.0.1", "", { "dependencies": { "tiny-inflate": "^1.0.3" } }, "sha512-m+/cO+/kAU9farlejecXLgQH20+UXyH0K6oosGtogAz7BWco+KTYE60epKwMt8eVxqlOE2Fs+GoHVlGDUbKOoA=="],
+
+ "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
+
+ "get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="],
+
+ "gifwrap": ["gifwrap@0.10.1", "", { "dependencies": { "image-q": "^4.0.0", "omggif": "^1.0.10" } }, "sha512-2760b1vpJHNmLzZ/ubTtNnEx5WApN/PYWJvXvgS+tL1egTTthayFYIQQNi136FLEDcN/IyEY2EcGpIITD6eYUw=="],
+
+ "github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="],
+
+ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
+
+ "globals": ["globals@17.0.0", "", {}, "sha512-gv5BeD2EssA793rlFWVPMMCqefTlpusw6/2TbAVMy0FzcG8wKJn4O+NqJ4+XWmmwrayJgw5TzrmWjFgmz1XPqw=="],
+
+ "gray-matter": ["gray-matter@4.0.3", "", { "dependencies": { "js-yaml": "^3.13.1", "kind-of": "^6.0.2", "section-matter": "^1.0.0", "strip-bom-string": "^1.0.0" } }, "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q=="],
+
+ "h3": ["h3@1.15.5", "", { "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" } }, "sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg=="],
+
+ "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
+
+ "hast-util-from-html": ["hast-util-from-html@2.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.1.0", "hast-util-from-parse5": "^8.0.0", "parse5": "^7.0.0", "vfile": "^6.0.0", "vfile-message": "^4.0.0" } }, "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw=="],
+
+ "hast-util-from-parse5": ["hast-util-from-parse5@8.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "hastscript": "^9.0.0", "property-information": "^7.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", "web-namespaces": "^2.0.0" } }, "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg=="],
+
+ "hast-util-is-element": ["hast-util-is-element@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g=="],
+
+ "hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="],
+
+ "hast-util-raw": ["hast-util-raw@9.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "@ungap/structured-clone": "^1.0.0", "hast-util-from-parse5": "^8.0.0", "hast-util-to-parse5": "^8.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "parse5": "^7.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw=="],
+
+ "hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="],
+
+ "hast-util-to-parse5": ["hast-util-to-parse5@8.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA=="],
+
+ "hast-util-to-text": ["hast-util-to-text@4.0.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "hast-util-is-element": "^3.0.0", "unist-util-find-after": "^5.0.0" } }, "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A=="],
+
+ "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="],
+
+ "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="],
+
+ "html-escaper": ["html-escaper@3.0.3", "", {}, "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ=="],
+
+ "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="],
+
+ "http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="],
+
+ "husky": ["husky@9.1.7", "", { "bin": { "husky": "bin.js" } }, "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA=="],
+
+ "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
+
+ "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
+
+ "image-q": ["image-q@4.0.0", "", { "dependencies": { "@types/node": "16.9.1" } }, "sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw=="],
+
+ "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="],
+
+ "import-meta-resolve": ["import-meta-resolve@4.2.0", "", {}, "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg=="],
+
+ "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="],
+
+ "iron-webcrypto": ["iron-webcrypto@1.2.1", "", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="],
+
+ "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="],
+
+ "is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="],
+
+ "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
+
+ "is-fullwidth-code-point": ["is-fullwidth-code-point@5.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.1" } }, "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ=="],
+
+ "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
+
+ "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="],
+
+ "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
+
+ "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="],
+
+ "is-wsl": ["is-wsl@3.1.0", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="],
+
+ "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
+
+ "jimp": ["jimp@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/diff": "1.6.0", "@jimp/js-bmp": "1.6.0", "@jimp/js-gif": "1.6.0", "@jimp/js-jpeg": "1.6.0", "@jimp/js-png": "1.6.0", "@jimp/js-tiff": "1.6.0", "@jimp/plugin-blit": "1.6.0", "@jimp/plugin-blur": "1.6.0", "@jimp/plugin-circle": "1.6.0", "@jimp/plugin-color": "1.6.0", "@jimp/plugin-contain": "1.6.0", "@jimp/plugin-cover": "1.6.0", "@jimp/plugin-crop": "1.6.0", "@jimp/plugin-displace": "1.6.0", "@jimp/plugin-dither": "1.6.0", "@jimp/plugin-fisheye": "1.6.0", "@jimp/plugin-flip": "1.6.0", "@jimp/plugin-hash": "1.6.0", "@jimp/plugin-mask": "1.6.0", "@jimp/plugin-print": "1.6.0", "@jimp/plugin-quantize": "1.6.0", "@jimp/plugin-resize": "1.6.0", "@jimp/plugin-rotate": "1.6.0", "@jimp/plugin-threshold": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0" } }, "sha512-YcwCHw1kiqEeI5xRpDlPPBGL2EOpBKLwO4yIBJcXWHPj5PnA5urGq0jbyhM5KoNpypQ6VboSoxc9D8HyfvngSg=="],
+
+ "jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="],
+
+ "jpeg-js": ["jpeg-js@0.4.4", "", {}, "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg=="],
+
+ "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
+
+ "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="],
+
+ "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
+
+ "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="],
+
+ "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="],
+
+ "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="],
+
+ "kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="],
+
+ "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="],
+
+ "lint-staged": ["lint-staged@16.2.7", "", { "dependencies": { "commander": "^14.0.2", "listr2": "^9.0.5", "micromatch": "^4.0.8", "nano-spawn": "^2.0.0", "pidtree": "^0.6.0", "string-argv": "^0.3.2", "yaml": "^2.8.1" }, "bin": { "lint-staged": "bin/lint-staged.js" } }, "sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow=="],
+
+ "listr2": ["listr2@9.0.5", "", { "dependencies": { "cli-truncate": "^5.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.1.0", "rfdc": "^1.4.1", "wrap-ansi": "^9.0.0" } }, "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g=="],
+
+ "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="],
+
+ "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="],
+
+ "log-update": ["log-update@6.1.0", "", { "dependencies": { "ansi-escapes": "^7.0.0", "cli-cursor": "^5.0.0", "slice-ansi": "^7.1.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w=="],
+
+ "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="],
+
+ "lru-cache": ["lru-cache@11.2.4", "", {}, "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg=="],
+
+ "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
+
+ "magicast": ["magicast@0.5.1", "", { "dependencies": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "source-map-js": "^1.2.1" } }, "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw=="],
+
+ "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="],
+
+ "marked": ["marked@17.0.1", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-boeBdiS0ghpWcSwoNm/jJBwdpFaMnZWRzjA6SkUMYb40SVaN1x7mmfGKp0jvexGcx+7y2La5zRZsYFZI6Qpypg=="],
+
+ "mdast-util-definitions": ["mdast-util-definitions@6.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ=="],
+
+ "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg=="],
+
+ "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA=="],
+
+ "mdast-util-gfm": ["mdast-util-gfm@3.1.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", "mdast-util-gfm-footnote": "^2.0.0", "mdast-util-gfm-strikethrough": "^2.0.0", "mdast-util-gfm-table": "^2.0.0", "mdast-util-gfm-task-list-item": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ=="],
+
+ "mdast-util-gfm-autolink-literal": ["mdast-util-gfm-autolink-literal@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-find-and-replace": "^3.0.0", "micromark-util-character": "^2.0.0" } }, "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ=="],
+
+ "mdast-util-gfm-footnote": ["mdast-util-gfm-footnote@2.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0" } }, "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ=="],
+
+ "mdast-util-gfm-strikethrough": ["mdast-util-gfm-strikethrough@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg=="],
+
+ "mdast-util-gfm-table": ["mdast-util-gfm-table@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "markdown-table": "^3.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg=="],
+
+ "mdast-util-gfm-task-list-item": ["mdast-util-gfm-task-list-item@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ=="],
+
+ "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="],
+
+ "mdast-util-to-hast": ["mdast-util-to-hast@13.2.1", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA=="],
+
+ "mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA=="],
+
+ "mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="],
+
+ "mdn-data": ["mdn-data@2.12.2", "", {}, "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA=="],
+
+ "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],
+
+ "micromark": ["micromark@4.0.2", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="],
+
+ "micromark-core-commonmark": ["micromark-core-commonmark@2.0.3", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-destination": "^2.0.0", "micromark-factory-label": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-title": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-html-tag-name": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg=="],
+
+ "micromark-extension-gfm": ["micromark-extension-gfm@3.0.0", "", { "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", "micromark-extension-gfm-footnote": "^2.0.0", "micromark-extension-gfm-strikethrough": "^2.0.0", "micromark-extension-gfm-table": "^2.0.0", "micromark-extension-gfm-tagfilter": "^2.0.0", "micromark-extension-gfm-task-list-item": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w=="],
+
+ "micromark-extension-gfm-autolink-literal": ["micromark-extension-gfm-autolink-literal@2.1.0", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw=="],
+
+ "micromark-extension-gfm-footnote": ["micromark-extension-gfm-footnote@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw=="],
+
+ "micromark-extension-gfm-strikethrough": ["micromark-extension-gfm-strikethrough@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw=="],
+
+ "micromark-extension-gfm-table": ["micromark-extension-gfm-table@2.1.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg=="],
+
+ "micromark-extension-gfm-tagfilter": ["micromark-extension-gfm-tagfilter@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg=="],
+
+ "micromark-extension-gfm-task-list-item": ["micromark-extension-gfm-task-list-item@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw=="],
+
+ "micromark-factory-destination": ["micromark-factory-destination@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="],
+
+ "micromark-factory-label": ["micromark-factory-label@2.0.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg=="],
+
+ "micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="],
+
+ "micromark-factory-title": ["micromark-factory-title@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw=="],
+
+ "micromark-factory-whitespace": ["micromark-factory-whitespace@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ=="],
+
+ "micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="],
+
+ "micromark-util-chunked": ["micromark-util-chunked@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA=="],
+
+ "micromark-util-classify-character": ["micromark-util-classify-character@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q=="],
+
+ "micromark-util-combine-extensions": ["micromark-util-combine-extensions@2.0.1", "", { "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg=="],
+
+ "micromark-util-decode-numeric-character-reference": ["micromark-util-decode-numeric-character-reference@2.0.2", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw=="],
+
+ "micromark-util-decode-string": ["micromark-util-decode-string@2.0.1", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ=="],
+
+ "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="],
+
+ "micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="],
+
+ "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="],
+
+ "micromark-util-resolve-all": ["micromark-util-resolve-all@2.0.1", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg=="],
+
+ "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="],
+
+ "micromark-util-subtokenize": ["micromark-util-subtokenize@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA=="],
+
+ "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="],
+
+ "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="],
+
+ "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
+
+ "mime": ["mime@3.0.0", "", { "bin": { "mime": "cli.js" } }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="],
+
+ "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="],
+
+ "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
+
+ "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="],
+
+ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
+
+ "nano-spawn": ["nano-spawn@2.0.0", "", {}, "sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw=="],
+
+ "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
+
+ "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="],
+
+ "neotraverse": ["neotraverse@0.6.18", "", {}, "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA=="],
+
+ "nlcst-to-string": ["nlcst-to-string@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0" } }, "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA=="],
+
+ "node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="],
+
+ "node-mock-http": ["node-mock-http@1.0.4", "", {}, "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ=="],
+
+ "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="],
+
+ "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="],
+
+ "ofetch": ["ofetch@1.5.1", "", { "dependencies": { "destr": "^2.0.5", "node-fetch-native": "^1.6.7", "ufo": "^1.6.1" } }, "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA=="],
+
+ "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="],
+
+ "omggif": ["omggif@1.0.10", "", {}, "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw=="],
+
+ "onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="],
+
+ "oniguruma-parser": ["oniguruma-parser@0.12.1", "", {}, "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w=="],
+
+ "oniguruma-to-es": ["oniguruma-to-es@4.3.4", "", { "dependencies": { "oniguruma-parser": "^0.12.1", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA=="],
+
+ "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="],
+
+ "p-limit": ["p-limit@6.2.0", "", { "dependencies": { "yocto-queue": "^1.1.1" } }, "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA=="],
+
+ "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="],
+
+ "p-queue": ["p-queue@8.1.1", "", { "dependencies": { "eventemitter3": "^5.0.1", "p-timeout": "^6.1.2" } }, "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ=="],
+
+ "p-timeout": ["p-timeout@6.1.4", "", {}, "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg=="],
+
+ "package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="],
+
+ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="],
+
+ "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="],
+
+ "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="],
+
+ "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="],
+
+ "parse-bmfont-xml": ["parse-bmfont-xml@1.1.6", "", { "dependencies": { "xml-parse-from-string": "^1.0.0", "xml2js": "^0.5.0" } }, "sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA=="],
+
+ "parse-latin": ["parse-latin@7.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "@types/unist": "^3.0.0", "nlcst-to-string": "^4.0.0", "unist-util-modify-children": "^4.0.0", "unist-util-visit-children": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ=="],
+
+ "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="],
+
+ "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="],
+
+ "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
+
+ "peek-readable": ["peek-readable@4.1.0", "", {}, "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg=="],
+
+ "piccolore": ["piccolore@0.1.3", "", {}, "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw=="],
+
+ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
+
+ "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="],
+
+ "pidtree": ["pidtree@0.6.0", "", { "bin": { "pidtree": "bin/pidtree.js" } }, "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g=="],
+
+ "pixelmatch": ["pixelmatch@5.3.0", "", { "dependencies": { "pngjs": "^6.0.0" }, "bin": { "pixelmatch": "bin/pixelmatch" } }, "sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q=="],
+
+ "pngjs": ["pngjs@7.0.0", "", {}, "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow=="],
+
+ "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="],
+
+ "postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="],
+
+ "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="],
+
+ "prettier": ["prettier@3.8.0", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-yEPsovQfpxYfgWNhCfECjG5AQaO+K3dp6XERmOepyPDVqcJm+bjyCVO3pmU+nAPe0N5dDvekfGezt/EIiRe1TA=="],
+
+ "prettier-plugin-astro": ["prettier-plugin-astro@0.14.1", "", { "dependencies": { "@astrojs/compiler": "^2.9.1", "prettier": "^3.0.0", "sass-formatter": "^0.7.6" } }, "sha512-RiBETaaP9veVstE4vUwSIcdATj6dKmXljouXc/DDNwBSPTp8FRkLGDSGFClKsAFeeg+13SB0Z1JZvbD76bigJw=="],
+
+ "prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="],
+
+ "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="],
+
+ "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="],
+
+ "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="],
+
+ "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
+
+ "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
+
+ "radix3": ["radix3@1.1.2", "", {}, "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="],
+
+ "readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="],
+
+ "readable-web-to-node-stream": ["readable-web-to-node-stream@3.0.4", "", { "dependencies": { "readable-stream": "^4.7.0" } }, "sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw=="],
+
+ "readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="],
+
+ "regex": ["regex@6.1.0", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg=="],
+
+ "regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="],
+
+ "regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="],
+
+ "rehype": ["rehype@13.0.2", "", { "dependencies": { "@types/hast": "^3.0.0", "rehype-parse": "^9.0.0", "rehype-stringify": "^10.0.0", "unified": "^11.0.0" } }, "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A=="],
+
+ "rehype-parse": ["rehype-parse@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-from-html": "^2.0.0", "unified": "^11.0.0" } }, "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag=="],
+
+ "rehype-raw": ["rehype-raw@7.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-raw": "^9.0.0", "vfile": "^6.0.0" } }, "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww=="],
+
+ "rehype-stringify": ["rehype-stringify@10.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-to-html": "^9.0.0", "unified": "^11.0.0" } }, "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA=="],
+
+ "remark-gfm": ["remark-gfm@4.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", "micromark-extension-gfm": "^3.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg=="],
+
+ "remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="],
+
+ "remark-rehype": ["remark-rehype@11.1.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw=="],
+
+ "remark-smartypants": ["remark-smartypants@3.0.2", "", { "dependencies": { "retext": "^9.0.0", "retext-smartypants": "^6.0.0", "unified": "^11.0.4", "unist-util-visit": "^5.0.0" } }, "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA=="],
+
+ "remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="],
+
+ "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="],
+
+ "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="],
+
+ "retext": ["retext@9.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "retext-latin": "^4.0.0", "retext-stringify": "^4.0.0", "unified": "^11.0.0" } }, "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA=="],
+
+ "retext-latin": ["retext-latin@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "parse-latin": "^7.0.0", "unified": "^11.0.0" } }, "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA=="],
+
+ "retext-smartypants": ["retext-smartypants@6.2.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ=="],
+
+ "retext-stringify": ["retext-stringify@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", "unified": "^11.0.0" } }, "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA=="],
+
+ "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
+
+ "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="],
+
+ "rollup": ["rollup@4.55.1", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.55.1", "@rollup/rollup-android-arm64": "4.55.1", "@rollup/rollup-darwin-arm64": "4.55.1", "@rollup/rollup-darwin-x64": "4.55.1", "@rollup/rollup-freebsd-arm64": "4.55.1", "@rollup/rollup-freebsd-x64": "4.55.1", "@rollup/rollup-linux-arm-gnueabihf": "4.55.1", "@rollup/rollup-linux-arm-musleabihf": "4.55.1", "@rollup/rollup-linux-arm64-gnu": "4.55.1", "@rollup/rollup-linux-arm64-musl": "4.55.1", "@rollup/rollup-linux-loong64-gnu": "4.55.1", "@rollup/rollup-linux-loong64-musl": "4.55.1", "@rollup/rollup-linux-ppc64-gnu": "4.55.1", "@rollup/rollup-linux-ppc64-musl": "4.55.1", "@rollup/rollup-linux-riscv64-gnu": "4.55.1", "@rollup/rollup-linux-riscv64-musl": "4.55.1", "@rollup/rollup-linux-s390x-gnu": "4.55.1", "@rollup/rollup-linux-x64-gnu": "4.55.1", "@rollup/rollup-linux-x64-musl": "4.55.1", "@rollup/rollup-openbsd-x64": "4.55.1", "@rollup/rollup-openharmony-arm64": "4.55.1", "@rollup/rollup-win32-arm64-msvc": "4.55.1", "@rollup/rollup-win32-ia32-msvc": "4.55.1", "@rollup/rollup-win32-x64-gnu": "4.55.1", "@rollup/rollup-win32-x64-msvc": "4.55.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A=="],
+
+ "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
+
+ "s.color": ["s.color@0.0.15", "", {}, "sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA=="],
+
+ "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
+
+ "sass-formatter": ["sass-formatter@0.7.9", "", { "dependencies": { "suf-log": "^2.5.3" } }, "sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw=="],
+
+ "sax": ["sax@1.4.4", "", {}, "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw=="],
+
+ "section-matter": ["section-matter@1.0.0", "", { "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" } }, "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA=="],
+
+ "semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="],
+
+ "sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "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" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="],
+
+ "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
+
+ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
+
+ "shiki": ["shiki@3.21.0", "", { "dependencies": { "@shikijs/core": "3.21.0", "@shikijs/engine-javascript": "3.21.0", "@shikijs/engine-oniguruma": "3.21.0", "@shikijs/langs": "3.21.0", "@shikijs/themes": "3.21.0", "@shikijs/types": "3.21.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-N65B/3bqL/TI2crrXr+4UivctrAGEjmsib5rPMMPpFp1xAx/w03v8WZ9RDDFYteXoEgY7qZ4HGgl5KBIu1153w=="],
+
+ "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
+
+ "simple-xml-to-json": ["simple-xml-to-json@1.2.3", "", {}, "sha512-kWJDCr9EWtZ+/EYYM5MareWj2cRnZGF93YDNpH4jQiHB+hBIZnfPFSQiVMzZOdk+zXWqTZ/9fTeQNu2DqeiudA=="],
+
+ "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="],
+
+ "slice-ansi": ["slice-ansi@7.1.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w=="],
+
+ "smol-toml": ["smol-toml@1.6.0", "", {}, "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw=="],
+
+ "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
+
+ "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="],
+
+ "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="],
+
+ "string-argv": ["string-argv@0.3.2", "", {}, "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q=="],
+
+ "string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
+
+ "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="],
+
+ "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="],
+
+ "strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
+
+ "strip-bom-string": ["strip-bom-string@1.0.0", "", {}, "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g=="],
+
+ "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="],
+
+ "strtok3": ["strtok3@6.3.0", "", { "dependencies": { "@tokenizer/token": "^0.3.0", "peek-readable": "^4.1.0" } }, "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw=="],
+
+ "suf-log": ["suf-log@2.5.3", "", { "dependencies": { "s.color": "0.0.15" } }, "sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow=="],
+
+ "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
+
+ "svgo": ["svgo@4.0.0", "", { "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.4.1" }, "bin": "./bin/svgo.js" }, "sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw=="],
+
+ "synckit": ["synckit@0.11.12", "", { "dependencies": { "@pkgr/core": "^0.2.9" } }, "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ=="],
+
+ "tiny-inflate": ["tiny-inflate@1.0.3", "", {}, "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="],
+
+ "tinycolor2": ["tinycolor2@1.6.0", "", {}, "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw=="],
+
+ "tinyexec": ["tinyexec@1.0.2", "", {}, "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg=="],
+
+ "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="],
+
+ "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
+
+ "token-types": ["token-types@4.2.1", "", { "dependencies": { "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ=="],
+
+ "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="],
+
+ "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="],
+
+ "ts-api-utils": ["ts-api-utils@2.4.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA=="],
+
+ "tsconfck": ["tsconfck@3.1.6", "", { "peerDependencies": { "typescript": "^5.0.0" }, "optionalPeers": ["typescript"], "bin": { "tsconfck": "bin/tsconfck.js" } }, "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w=="],
+
+ "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
+
+ "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],
+
+ "type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="],
+
+ "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
+
+ "typescript-eslint": ["typescript-eslint@8.53.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.53.0", "@typescript-eslint/parser": "8.53.0", "@typescript-eslint/typescript-estree": "8.53.0", "@typescript-eslint/utils": "8.53.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-xHURCQNxZ1dsWn0sdOaOfCSQG0HKeqSj9OexIxrz6ypU6wHYOdX2I3D2b8s8wFSsSOYJb+6q283cLiLlkEsBYw=="],
+
+ "ufo": ["ufo@1.6.3", "", {}, "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q=="],
+
+ "ultrahtml": ["ultrahtml@1.6.0", "", {}, "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw=="],
+
+ "uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="],
+
+ "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="],
+
+ "unifont": ["unifont@0.7.3", "", { "dependencies": { "css-tree": "^3.1.0", "ofetch": "^1.5.1", "ohash": "^2.0.11" } }, "sha512-b0GtQzKCyuSHGsfj5vyN8st7muZ6VCI4XD4vFlr7Uy1rlWVYxC3npnfk8MyreHxJYrz1ooLDqDzFe9XqQTlAhA=="],
+
+ "unist-util-find-after": ["unist-util-find-after@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ=="],
+
+ "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="],
+
+ "unist-util-modify-children": ["unist-util-modify-children@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "array-iterate": "^2.0.0" } }, "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw=="],
+
+ "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="],
+
+ "unist-util-remove-position": ["unist-util-remove-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q=="],
+
+ "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="],
+
+ "unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="],
+
+ "unist-util-visit-children": ["unist-util-visit-children@3.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA=="],
+
+ "unist-util-visit-parents": ["unist-util-visit-parents@6.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="],
+
+ "unstorage": ["unstorage@1.17.4", "", { "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" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/functions", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw=="],
+
+ "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="],
+
+ "utif2": ["utif2@4.1.0", "", { "dependencies": { "pako": "^1.0.11" } }, "sha512-+oknB9FHrJ7oW7A2WZYajOcv4FcDR4CfoGB0dPNfxbi4GO05RRnFmt5oa23+9w32EanrYcSJWspUiJkLMs+37w=="],
+
+ "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
+
+ "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="],
+
+ "vfile-location": ["vfile-location@5.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg=="],
+
+ "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="],
+
+ "vite": ["vite@6.4.1", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g=="],
+
+ "vitefu": ["vitefu@1.1.1", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" }, "optionalPeers": ["vite"] }, "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ=="],
+
+ "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="],
+
+ "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
+
+ "which-pm-runs": ["which-pm-runs@1.1.0", "", {}, "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA=="],
+
+ "widest-line": ["widest-line@5.0.0", "", { "dependencies": { "string-width": "^7.0.0" } }, "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA=="],
+
+ "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="],
+
+ "wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="],
+
+ "xml-parse-from-string": ["xml-parse-from-string@1.0.1", "", {}, "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g=="],
+
+ "xml2js": ["xml2js@0.5.0", "", { "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" } }, "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA=="],
+
+ "xmlbuilder": ["xmlbuilder@11.0.1", "", {}, "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="],
+
+ "xxhash-wasm": ["xxhash-wasm@1.1.0", "", {}, "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA=="],
+
+ "yaml": ["yaml@2.8.2", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A=="],
+
+ "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
+
+ "yocto-queue": ["yocto-queue@1.2.2", "", {}, "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ=="],
+
+ "yocto-spinner": ["yocto-spinner@0.2.3", "", { "dependencies": { "yoctocolors": "^2.1.1" } }, "sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ=="],
+
+ "yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="],
+
+ "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="],
+
+ "zod-to-json-schema": ["zod-to-json-schema@3.25.1", "", { "peerDependencies": { "zod": "^3.25 || ^4" } }, "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA=="],
+
+ "zod-to-ts": ["zod-to-ts@1.2.0", "", { "peerDependencies": { "typescript": "^4.9.4 || ^5.0.2", "zod": "^3" } }, "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA=="],
+
+ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="],
+
+ "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
+
+ "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="],
+
+ "@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
+
+ "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="],
+
+ "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
+
+ "ansi-align/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
+
+ "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
+
+ "boxen/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="],
+
+ "cli-truncate/string-width": ["string-width@8.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.0", "strip-ansi": "^7.1.0" } }, "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg=="],
+
+ "csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="],
+
+ "dom-serializer/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
+
+ "eslint-plugin-astro/globals": ["globals@16.5.0", "", {}, "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ=="],
+
+ "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
+
+ "gray-matter/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="],
+
+ "mdast-util-find-and-replace/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="],
+
+ "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
+
+ "p-locate/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
+
+ "pixelmatch/pngjs": ["pngjs@6.0.0", "", {}, "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg=="],
+
+ "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
+
+ "svgo/commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="],
+
+ "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
+
+ "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
+
+ "ansi-align/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
+
+ "ansi-align/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
+
+ "ansi-align/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
+
+ "csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="],
+
+ "gray-matter/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="],
+
+ "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
+
+ "ansi-align/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
+ }
+}
diff --git a/web/config.toml b/web/config.toml
@@ -1,6 +0,0 @@
-base_url = "https://prime8.dev"
-
-[extra]
-tabs = [
- { name = "home", url = "/" },
-]
diff --git a/web/config/about.json b/web/config/about.json
@@ -0,0 +1,18 @@
+{
+ "name": "Damian Myrda",
+ "handle": "moncheeta",
+ "bio": "Passionate about low-level systems programming, TUI/CLI tooling, and UNIX philosophy. Always learning just like Curious George 🐒",
+ "location": "Chicago, IL",
+ "profession": "Software Engineer",
+ "profession_short": "SWE",
+ "languages": ["Zig", "Rust", "C", "Go", "TypeScript", "Python"],
+ "interests": [
+ "Low-level systems",
+ "TUI/CLI tooling",
+ "Embedded OS",
+ "UNIX philosophy"
+ ],
+ "tools": ["Zed (Vim mode)", "OpenCode", "Linux", "Fish"],
+ "school": "Prospect High School (Senior)",
+ "graduating": "May 2026"
+}
diff --git a/web/config/contact.json b/web/config/contact.json
@@ -0,0 +1,5 @@
+{
+ "email": "damian@prime8.dev",
+ "gitlab": "https://git.prime8.dev/moncheeta",
+ "linkedin": "https://linkedin.com/in/damian-myrda"
+}
diff --git a/web/config/experience.json b/web/config/experience.json
@@ -0,0 +1,35 @@
+[
+ {
+ "id": "mandolin",
+ "company": "Mandolin",
+ "role": "Senior SWE Intern",
+ "startDate": "2024-10",
+ "description": [
+ "Building AI agents for specialty drug access. Automating prior authorizations, benefits verification, and revenue cycle management.",
+ "Mandolin raised $40M to automate access to life-saving medicines, wiring AI labor into thousands of infusion centers, specialty pharmacies, and health systems."
+ ],
+ "tech": ["TypeScript", "Temporal"],
+ "url": "https://mandolin.com",
+ "logo": "/mandolin/logo.svg",
+ "images": [
+ "/mandolin/company.jpeg",
+ "/mandolin/company_silly.jpeg",
+ "/mandolin/employee_polaroids.jpeg",
+ "/mandolin/moment_polaroids.jpeg"
+ ]
+ },
+ {
+ "id": "amplifier-health",
+ "company": "Amplifier Health",
+ "role": "SWE Intern",
+ "startDate": "2024-06",
+ "endDate": "2024-08",
+ "description": [
+ "Voice AI for early disease detection. Large Acoustic Model analyzing 1000+ voice biomarkers across 30+ health conditions."
+ ],
+ "tech": ["Python", "PyTorch"],
+ "url": "https://amplifierhealth.com",
+ "logo": "/amplifier/logo.svg",
+ "logoFilter": "logo-invert"
+ }
+]
diff --git a/web/config/projects.json b/web/config/projects.json
@@ -0,0 +1,38 @@
+[
+ {
+ "id": "janitor",
+ "name": "janitor",
+ "subtitle": "Audio classification with AST",
+ "tech": ["Rust", "CUDA"],
+ "url": "https://git.prime8.dev/moncheeta/janitor",
+ "dateCreated": "2025-09-15",
+ "dateModified": "2026-01-10"
+ },
+ {
+ "id": "summarizer",
+ "name": "summarizer",
+ "subtitle": "Audio transcription microservices",
+ "tech": ["Python", "Docker", "Kafka"],
+ "url": "https://git.prime8.dev/moncheeta/summarizer",
+ "dateCreated": "2025-06-01",
+ "dateModified": "2025-12-20"
+ },
+ {
+ "id": "finger",
+ "name": "finger",
+ "subtitle": "Mobile auth app",
+ "tech": ["TypeScript", "React Native", "Supabase"],
+ "url": "https://git.prime8.dev/moncheeta/finger",
+ "dateCreated": "2025-03-10",
+ "dateModified": "2025-08-15"
+ },
+ {
+ "id": "computer-science-club",
+ "name": "computer-science-club",
+ "subtitle": "CS Club website",
+ "tech": ["Python"],
+ "url": "https://github.com/moncheeta/computer-science-club",
+ "dateCreated": "2024-09-01",
+ "dateModified": "2025-05-20"
+ }
+]
diff --git a/web/env.example b/web/env.example
@@ -0,0 +1 @@
+WAKATIME_API_KEY=your_wakatime_api_key_here
diff --git a/web/eslint.config.js b/web/eslint.config.js
@@ -0,0 +1,24 @@
+import js from "@eslint/js";
+import globals from "globals";
+import prettier from "eslint-config-prettier";
+import eslintPluginAstro from "eslint-plugin-astro";
+import tseslint from "typescript-eslint";
+
+export default [
+ { ignores: ["dist", "node_modules", ".astro"] },
+ js.configs.recommended,
+ ...tseslint.configs.recommended,
+ ...eslintPluginAstro.configs.recommended,
+ prettier,
+ {
+ files: ["**/*.js", "**/*.ts"],
+ languageOptions: {
+ ecmaVersion: 2022,
+ sourceType: "module",
+ globals: {
+ ...globals.browser,
+ ...globals.node,
+ },
+ },
+ },
+];
diff --git a/web/package.json b/web/package.json
@@ -0,0 +1,42 @@
+{
+ "name": "prime8dev",
+ "private": true,
+ "version": "1.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "astro dev",
+ "build": "astro build",
+ "preview": "astro preview",
+ "lint": "bun eslint .",
+ "format": "bun prettier --write .",
+ "prepare": "husky"
+ },
+ "lint-staged": {
+ "*.{ts,astro,js}": [
+ "eslint --fix",
+ "prettier --write"
+ ],
+ "*.{json,md,css}": [
+ "prettier --write"
+ ]
+ },
+ "dependencies": {
+ "astro-bun-adapter": "^1.0.2",
+ "astro": "^5.16.11",
+ "gray-matter": "^4.0.3",
+ "jimp": "^1.6.0",
+ "marked": "^17.0.1"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.39.2",
+ "eslint": "^9.39.2",
+ "eslint-config-prettier": "^10.1.8",
+ "eslint-plugin-astro": "^1.5.0",
+ "globals": "^17.0.0",
+ "husky": "^9.1.7",
+ "lint-staged": "^16.2.7",
+ "prettier": "^3.8.0",
+ "prettier-plugin-astro": "^0.14.1",
+ "typescript-eslint": "^8.53.0"
+ }
+}
diff --git a/web/public/amplifier/logo.svg b/web/public/amplifier/logo.svg
@@ -0,0 +1,9 @@
+<svg width="165" height="50" viewBox="0 0 165 50" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<rect width="164.167" height="50" fill="url(#pattern0_1_14974)"/>
+<defs>
+<pattern id="pattern0_1_14974" patternContentUnits="objectBoundingBox" width="1" height="1">
+<use xlink:href="#image0_1_14974" transform="matrix(0.00200374 0 0 0.00657895 -0.00093511 0)"/>
+</pattern>
+<image id="image0_1_14974" width="500" height="152" xlink:href="data:image/png;base64,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"/>
+</defs>
+</svg>
diff --git a/web/public/favicon.png b/web/public/favicon.png
Binary files differ.
diff --git a/web/public/mandolin/company.jpeg b/web/public/mandolin/company.jpeg
Binary files differ.
diff --git a/web/public/mandolin/company_silly.jpeg b/web/public/mandolin/company_silly.jpeg
Binary files differ.
diff --git a/web/public/mandolin/employee_polaroids.jpeg b/web/public/mandolin/employee_polaroids.jpeg
Binary files differ.
diff --git a/web/public/mandolin/logo.svg b/web/public/mandolin/logo.svg
@@ -0,0 +1,11 @@
+<svg width="148" height="25" viewBox="0 0 148 25" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_5341_382)">
+<path d="M-11.2273 8.155C-7.23482 12.1475 -5.14863 14.3079 -3.5057 16.0249C-1.86502 17.7397 -0.677597 19.0004 1.52874 21.2068C3.73442 23.4125 4.78203 24.3868 6.39141 25.922C8.00364 27.46 10.1643 29.5467 14.5808 33.9631L13.4783 35.0653C13.8714 35.457 14.2851 35.8694 14.7204 36.3046L13.4009 37.6244C8.99312 33.2167 6.84298 31.1405 5.24295 29.6142C3.64008 28.0851 2.57372 27.0932 0.348847 24.8684C-1.87525 22.6443 -3.0784 21.3666 -4.7143 19.6569C-6.34804 17.9494 -8.42472 15.7988 -12.4072 11.8164L-11.3077 10.7169C-11.6994 10.3236 -12.1116 9.91002 -12.5469 9.47478L-11.2273 8.155ZM17.6108 32.3116L16.291 33.6314L-9.51682 7.82329L-8.19727 6.50351L17.6108 32.3116ZM-4.88882 5.40061C-2.86324 7.42619 -0.715327 9.37416 1.45242 11.34C3.61427 13.3004 5.79612 15.2788 7.85905 17.3418C10.1334 19.6161 12.2837 21.9698 14.4179 24.3054C16.5566 26.646 18.6792 28.9686 20.9193 31.2087L19.5995 32.5285C17.3248 30.2538 15.1744 27.9 13.0402 25.5644C10.9015 23.2237 8.77896 20.9012 6.53927 18.6615C4.51403 16.6363 2.36645 14.6884 0.198711 12.7226C-1.96313 10.7622 -4.14513 8.78363 -6.20837 6.72039L-4.88882 5.40061ZM-3.23618 3.05881C0.710573 7.00557 3.07486 8.77848 4.99531 10.1134C6.93579 11.4622 8.5358 12.4355 10.8228 14.7225C13.1149 17.0146 13.9018 18.4334 15.161 20.2816C16.4043 22.1064 18.1952 24.4904 22.5717 28.8669L21.2521 30.1867C16.8045 25.739 14.9361 23.266 13.6187 21.3323C12.3171 19.422 11.6416 18.1807 9.50325 16.0422C7.35972 13.8987 5.91766 13.0275 3.93 11.6459C1.92231 10.2504 -0.52773 8.40683 -4.55597 4.3786L-3.23618 3.05881ZM-1.03062 0.439756C2.8884 4.35878 5.43193 5.9252 7.53303 7.06167C9.66269 8.21359 11.5369 9.01396 13.8699 11.347C16.2126 13.6897 16.8051 15.3708 17.845 17.3809C18.8661 19.3548 20.4255 21.8957 24.7774 26.2476L23.4577 27.5674C18.9855 23.0952 17.3062 20.4012 16.1874 18.2385C15.0873 16.1121 14.6383 14.7547 12.5504 12.6668C10.453 10.5694 8.86419 9.9035 6.64498 8.70314C4.39719 7.48732 1.70572 5.81521 -2.35018 1.75931L-1.03062 0.439756ZM0.966248 -1.55689C4.8157 2.29255 7.75733 3.3601 10.2835 4.02182C12.8243 4.68735 15.3518 4.9902 17.7894 7.42779C20.2431 9.8815 20.3273 12.2362 20.8835 14.6416C21.4338 17.0216 22.4866 19.9636 26.7741 24.2512L25.4545 25.5707C20.918 21.0342 19.6936 17.7799 19.0652 15.0619C18.4427 12.3694 18.4466 10.7244 16.4699 8.74757C14.4769 6.75464 12.5801 6.55255 9.81058 5.8271C7.02661 5.09785 3.77191 3.88832 -0.353533 -0.237108L0.966248 -1.55689ZM2.88885 -3.47949C6.63379 0.265398 10.149 0.670448 13.3728 0.663706C14.9562 0.660392 16.6569 0.543751 18.1533 0.715422C19.7176 0.894902 21.2221 1.39527 22.522 2.69521C23.8261 3.99936 24.2842 5.4596 24.407 6.97556C24.4671 7.71701 24.4477 8.47791 24.412 9.23169C24.3754 10.0048 24.3232 10.7469 24.3038 11.5466C24.2658 13.116 24.3623 14.7549 24.9709 16.5161C25.5782 18.274 26.7153 20.2091 28.8345 22.3284L27.515 23.6481C25.2222 21.3553 23.9181 19.1841 23.2068 17.1258C22.4968 15.0708 22.3972 13.1836 22.4379 11.5015C22.4579 10.6755 22.5137 9.86057 22.5477 9.1433C22.5827 8.40674 22.5966 7.7438 22.5466 7.12638C22.4492 5.92451 22.1136 4.92589 21.2024 4.01476C20.2871 3.09944 19.2266 2.71723 17.9405 2.56968C16.5864 2.41433 15.1509 2.52632 13.3767 2.53004C9.88532 2.53734 5.7991 2.0701 1.56907 -2.15994L2.88885 -3.47949Z" fill="white"/>
+</g>
+<path d="M32.4499 23.1855V2.38053H35.5707L42.9119 20.2134L50.2233 2.38053H53.3738V23.1855H50.8772V6.71986L44.1007 23.1855H41.6933L34.9465 6.77931V23.1855H32.4499ZM61.8154 23.4233C58.2488 23.4233 55.9603 21.5806 55.9603 18.6976C55.9603 15.0716 59.4674 14.388 62.6179 14.0611C65.0253 13.8233 67.1058 13.853 67.1355 12.575C67.1058 10.5837 65.4711 9.18674 63.0934 9.18674C60.8049 9.18674 59.0216 10.4648 58.7541 12.3372H56.3169C56.6141 9.24619 59.408 7.07652 63.1529 7.07652C67.0464 7.07652 69.543 9.39479 69.543 12.7236V20.3917C69.543 20.897 69.8105 21.1645 70.3454 21.1645H71.2371V23.1855H69.8402C68.1461 23.1855 67.2544 22.4128 67.2544 20.9564V20.4809C66.3331 22.2939 64.5498 23.4233 61.8154 23.4233ZM58.4271 18.6382C58.4271 20.2728 59.9132 21.3131 62.1721 21.3131C65.1145 21.3131 67.1355 19.4406 67.1355 16.8252V14.7744C66.4519 15.6957 64.6984 15.8741 62.7665 16.0821C60.5968 16.3199 58.4271 16.6171 58.4271 18.6382ZM72.814 23.1855V7.43318H74.7756L75.0133 9.84062C76.0833 8.17622 78.1341 7.07652 80.4821 7.07652C83.8703 7.07652 86.1292 9.27591 86.1292 12.7533V23.1855H83.6623V12.8425C83.6623 10.6431 82.2357 9.24619 79.8579 9.24619C77.0344 9.24619 75.3106 11.2078 75.2808 13.6152V23.1855H72.814ZM95.1682 23.5125C90.9478 23.5125 88.0053 20.1242 88.0053 15.2202C88.0053 10.4053 90.918 7.07652 95.1385 7.07652C97.5162 7.07652 99.5075 8.11677 100.637 9.78117V0.89446H103.104V23.1855H101.142L100.875 20.154C99.8345 22.2047 97.754 23.5125 95.1682 23.5125ZM90.5614 15.2202C90.5614 18.8462 92.6122 21.3725 95.5546 21.3725C98.5564 21.3725 100.637 18.8165 100.637 15.1608C100.637 11.6239 98.6159 9.18674 95.7032 9.18674C92.6716 9.18674 90.5614 11.6536 90.5614 15.2202ZM112.975 23.5125C107.922 23.5125 105.247 19.9162 105.247 15.1608C105.247 9.90006 108.695 7.07652 112.975 7.07652C117.998 7.07652 120.702 10.7025 120.702 15.1608C120.702 20.5998 117.403 23.5125 112.975 23.5125ZM107.774 15.1608C107.774 19.2029 110.122 21.3725 112.975 21.3725C116.333 21.3725 118.176 18.5787 118.176 15.1608C118.176 11.6239 116.125 9.21647 112.975 9.21647C109.824 9.21647 107.774 11.6239 107.774 15.1608ZM122.829 23.1855V0.89446H125.296V23.1855H122.829ZM128.227 23.1855V7.43318H130.694V23.1855H128.227ZM127.633 2.94524C127.633 1.90499 128.435 1.13223 129.475 1.13223C130.516 1.13223 131.288 1.90499 131.288 2.94524C131.288 3.98549 130.516 4.78797 129.475 4.78797C128.435 4.78797 127.633 3.98549 127.633 2.94524ZM133.54 23.1855V7.43318H135.501L135.739 9.84062C136.809 8.17622 138.86 7.07652 141.208 7.07652C144.596 7.07652 146.855 9.27591 146.855 12.7533V23.1855H144.388V12.8425C144.388 10.6431 142.961 9.24619 140.584 9.24619C137.76 9.24619 136.036 11.2078 136.007 13.6152V23.1855H133.54Z" fill="white"/>
+<defs>
+<clipPath id="clip0_5341_382">
+<rect x="0.168457" y="0.563477" width="24.2623" height="24.2623" rx="4.41133" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/web/public/mandolin/moment_polaroids.jpeg b/web/public/mandolin/moment_polaroids.jpeg
Binary files differ.
diff --git a/web/public/me.jpg b/web/public/me.jpg
Binary files differ.
diff --git a/web/public/robots.txt b/web/public/robots.txt
@@ -0,0 +1,4 @@
+User-agent: *
+Allow: /
+
+Sitemap: https://prime8.dev/sitemap.xml
diff --git a/web/public/site.webmanifest b/web/public/site.webmanifest
@@ -0,0 +1,21 @@
+{
+ "name": "Damian Myrda | Software Engineer",
+ "short_name": "Damian Myrda",
+ "description": "Software Engineer portfolio - low-level programming, TUI development, and embedded systems",
+ "start_url": "/",
+ "display": "standalone",
+ "background_color": "#0d0d0d",
+ "theme_color": "#0d0d0d",
+ "icons": [
+ {
+ "src": "/favicon.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "/favicon.png",
+ "sizes": "512x512",
+ "type": "image/png"
+ }
+ ]
+}
diff --git a/web/src/components/Article.astro b/web/src/components/Article.astro
@@ -0,0 +1,418 @@
+---
+import type Blog from "../lib/types/blog";
+
+interface Props {
+ blog: Blog;
+ isStandalone?: boolean;
+}
+
+const { blog, isStandalone = true } = Astro.props;
+---
+
+<article class="blog-article" data-id={blog.id} data-blog-id={blog.id}>
+ {
+ isStandalone ? (
+ <a href="/#blog" class="blog-back-btn">
+ ← See all posts
+ </a>
+ ) : (
+ <button class="blog-back-btn blog-back-btn-internal">
+ <span class="color-dim">← Back to posts</span>
+ </button>
+ )
+ }
+ <header class="blog-article-header">
+ <div class="blog-article-header-top">
+ <h1 class="blog-article-title">{blog.title}</h1>
+ <button
+ class="blog-share-btn"
+ data-blog-id={blog.id}
+ data-blog-title={blog.title}
+ >
+ [Share]
+ </button>
+ </div>
+ <time class="blog-article-date" datetime={blog.date}>{blog.date}</time>
+ </header>
+ <div class="blog-article-content" data-blog-id={blog.id}>
+ {
+ blog.url ? (
+ <a
+ class="external-link"
+ href={blog.url}
+ target="_blank"
+ rel="noopener noreferrer"
+ >
+ Read on external site →
+ </a>
+ ) : blog.content ? (
+ <Fragment set:html={blog.content} />
+ ) : (
+ <p class="color-dim">Content not available</p>
+ )
+ }
+ </div>
+</article>
+
+<style>
+ .blog-back-btn {
+ display: inline-block;
+ background: transparent;
+ border: 1px solid var(--border);
+ color: var(--fg-dim);
+ padding: 8px 16px;
+ cursor: pointer;
+ font-family: inherit;
+ font-size: 12px;
+ margin-bottom: 24px;
+ transition: all 0.15s;
+ text-decoration: none;
+ }
+
+ .blog-back-btn:hover {
+ background: var(--bg-alt);
+ color: var(--accent);
+ border-color: var(--accent);
+ }
+
+ .blog-article {
+ animation: fadeIn 0.2s ease;
+ }
+
+ @keyframes fadeIn {
+ from {
+ opacity: 0;
+ }
+ to {
+ opacity: 1;
+ }
+ }
+
+ .blog-article-header {
+ margin-bottom: 24px;
+ padding-bottom: 16px;
+ border-bottom: 1px solid var(--border);
+ }
+
+ .blog-article-header-top {
+ display: flex;
+ align-items: flex-start;
+ justify-content: space-between;
+ gap: 16px;
+ }
+
+ .blog-article-title {
+ font-size: 28px;
+ font-weight: 500;
+ color: var(--accent);
+ margin: 0 0 8px 0;
+ line-height: 1.3;
+ }
+
+ .blog-share-btn {
+ background: transparent;
+ border: 1px solid var(--border);
+ color: var(--fg-dim);
+ padding: 6px 12px;
+ cursor: pointer;
+ font-family: inherit;
+ font-size: 12px;
+ transition: all 0.15s;
+ flex-shrink: 0;
+ }
+
+ .blog-share-btn:hover {
+ background: var(--bg-alt);
+ color: var(--accent);
+ border-color: var(--accent);
+ }
+
+ .blog-share-btn.copied {
+ color: var(--green);
+ border-color: var(--green);
+ }
+
+ .blog-article-date {
+ color: var(--fg-dim);
+ font-size: 13px;
+ }
+
+ .blog-article-content {
+ font-size: 14px;
+ line-height: 1.7;
+ color: var(--fg);
+ padding-bottom: 64px;
+ }
+
+ .blog-article-content :global(p) {
+ margin-bottom: 16px;
+ }
+
+ .blog-article-content :global(p:last-child) {
+ margin-bottom: 0;
+ }
+
+ .blog-article-content :global(h2) {
+ font-size: 20px;
+ color: var(--accent);
+ margin: 32px 0 12px;
+ font-weight: 600;
+ }
+
+ .blog-article-content :global(h2:first-child) {
+ margin-top: 0;
+ }
+
+ .blog-article-content :global(h3) {
+ font-size: 17px;
+ color: var(--accent);
+ margin: 24px 0 10px;
+ font-weight: 500;
+ }
+
+ .blog-article-content :global(h4) {
+ font-size: 15px;
+ color: var(--fg);
+ margin: 20px 0 8px;
+ font-weight: 500;
+ }
+
+ .blog-article-content :global(h5),
+ .blog-article-content :global(h6) {
+ font-size: 14px;
+ color: var(--fg-dim);
+ margin: 16px 0 8px;
+ font-weight: 500;
+ }
+
+ .blog-article-content :global(ul),
+ .blog-article-content :global(ol) {
+ margin: 12px 0;
+ padding-left: 24px;
+ }
+
+ .blog-article-content :global(li) {
+ margin-bottom: 8px;
+ }
+
+ .blog-article-content :global(li > ul),
+ .blog-article-content :global(li > ol) {
+ margin: 6px 0;
+ }
+
+ .blog-article-content :global(code) {
+ background: var(--bg-alt);
+ padding: 2px 6px;
+ font-size: 13px;
+ border-radius: 2px;
+ }
+
+ .blog-article-content :global(pre) {
+ display: block;
+ background: var(--bg-alt);
+ border: 1px solid var(--border);
+ padding: 16px;
+ margin: 16px 0;
+ overflow-x: auto;
+ font-size: 13px;
+ line-height: 1.5;
+ }
+
+ .blog-article-content :global(pre code) {
+ background: none;
+ padding: 0;
+ font-size: inherit;
+ }
+
+ .blog-article-content :global(a) {
+ color: var(--light-blue);
+ text-decoration: none;
+ }
+
+ .blog-article-content :global(a:hover) {
+ opacity: 0.8;
+ }
+
+ .blog-article-content :global(strong) {
+ font-weight: 600;
+ color: var(--fg);
+ }
+
+ .blog-article-content :global(em) {
+ font-style: italic;
+ color: var(--fg-dim);
+ }
+
+ .blog-article-content :global(del) {
+ text-decoration: line-through;
+ color: var(--fg-dim);
+ }
+
+ .blog-article-content :global(blockquote) {
+ border-left: 3px solid var(--accent);
+ margin: 16px 0;
+ padding: 12px 20px;
+ color: var(--fg-dim);
+ background: var(--bg-alt);
+ }
+
+ .blog-article-content :global(blockquote p) {
+ margin-bottom: 0;
+ }
+
+ .blog-article-content :global(hr) {
+ border: none;
+ border-top: 1px solid var(--border);
+ margin: 24px 0;
+ }
+
+ .blog-article-content :global(table) {
+ width: 100%;
+ border-collapse: collapse;
+ margin: 16px 0;
+ font-size: 13px;
+ }
+
+ .blog-article-content :global(th),
+ .blog-article-content :global(td) {
+ border: 1px solid var(--border);
+ padding: 10px 14px;
+ text-align: left;
+ }
+
+ .blog-article-content :global(th) {
+ background: var(--bg-alt);
+ color: var(--accent);
+ font-weight: 500;
+ }
+
+ .blog-article-content :global(tr:nth-child(even)) {
+ background: rgba(255, 255, 255, 0.02);
+ }
+
+ .blog-article-content :global(img) {
+ max-width: 100%;
+ height: auto;
+ margin: 16px 0;
+ }
+
+ .external-link {
+ color: var(--light-blue);
+ text-decoration: none;
+ font-size: 14px;
+ }
+
+ .external-link:hover {
+ opacity: 0.8;
+ }
+
+ @media (max-width: 768px) {
+ .blog-back-btn {
+ padding: 6px 12px;
+ font-size: 11px;
+ margin-bottom: 16px;
+ }
+
+ .blog-article-header {
+ margin-bottom: 16px;
+ padding-bottom: 12px;
+ }
+
+ .blog-article-header-top {
+ flex-direction: column;
+ gap: 12px;
+ }
+
+ .blog-article-title {
+ font-size: 22px;
+ }
+
+ .blog-share-btn {
+ align-self: flex-start;
+ }
+
+ .blog-article-content {
+ font-size: 13px;
+ padding-bottom: 32px;
+ }
+
+ .blog-article-content :global(h2) {
+ font-size: 18px;
+ margin: 24px 0 10px;
+ }
+
+ .blog-article-content :global(h3) {
+ font-size: 15px;
+ margin: 20px 0 8px;
+ }
+
+ .blog-article-content :global(pre) {
+ padding: 12px;
+ font-size: 12px;
+ }
+
+ .blog-article-content :global(code) {
+ font-size: 12px;
+ }
+
+ .blog-article-content :global(table) {
+ font-size: 12px;
+ }
+
+ .blog-article-content :global(th),
+ .blog-article-content :global(td) {
+ padding: 8px 10px;
+ }
+ }
+</style>
+
+<script>
+ import { closeBlogPost } from "../scripts/ui/blog";
+ import { updateUrl } from "../scripts/ui/url";
+
+ document.addEventListener("DOMContentLoaded", () => {
+ const shareButtons = document.querySelectorAll(".blog-share-btn");
+
+ shareButtons.forEach((btn) => {
+ btn.addEventListener("click", async (e) => {
+ e.stopPropagation();
+ const button = e.currentTarget as HTMLButtonElement;
+ const blogId = button.dataset.blogId;
+ const title = button.dataset.blogTitle;
+ const url = `${window.location.origin}/#blog/${blogId}`;
+
+ if (navigator.share) {
+ try {
+ await navigator.share({
+ title,
+ url,
+ });
+ } catch {
+ // User cancelled share dialog
+ }
+ } else {
+ copyToClipboard(url, button);
+ }
+ });
+ });
+
+ function copyToClipboard(text: string, btn: HTMLButtonElement) {
+ navigator.clipboard.writeText(text).then(() => {
+ const originalText = btn.textContent;
+ btn.textContent = "[Copied!]";
+ btn.classList.add("copied");
+ setTimeout(() => {
+ btn.textContent = originalText;
+ btn.classList.remove("copied");
+ }, 2000);
+ });
+ }
+
+ document.querySelectorAll(".blog-back-btn-internal").forEach((btn) => {
+ btn.addEventListener("click", () => {
+ closeBlogPost();
+ updateUrl();
+ });
+ });
+ });
+</script>
diff --git a/web/src/components/Footer.astro b/web/src/components/Footer.astro
@@ -0,0 +1,51 @@
+---
+import type { WakaTimeData } from "../lib/wakatime";
+
+interface Props {
+ wakaTimeData: WakaTimeData | null;
+}
+
+const { wakaTimeData } = Astro.props;
+---
+
+<footer id="statusbar">
+ <span class="time" id="status-time"></span>
+ <span class="spacer"></span>
+ {
+ wakaTimeData?.weeklyStats && (
+ <span class="wakatime">{wakaTimeData.allTimeStats?.totalText}</span>
+ )
+ }
+</footer>
+
+<style>
+ #statusbar {
+ display: flex;
+ align-items: center;
+ background: var(--bg-alt);
+ border-top: 1px solid var(--border);
+ padding: 0 12px;
+ height: 24px;
+ font-size: 12px;
+ flex-shrink: 0;
+ }
+
+ #statusbar .time {
+ color: var(--cyan);
+ }
+
+ #statusbar .spacer {
+ flex: 1;
+ }
+
+ #statusbar .wakatime {
+ color: var(--magenta);
+ }
+
+ @media (max-width: 768px) {
+ #statusbar {
+ font-size: 11px;
+ padding: 0 10px;
+ }
+ }
+</style>
diff --git a/web/src/components/Header.astro b/web/src/components/Header.astro
@@ -0,0 +1,140 @@
+<header id="tabs">
+ <nav class="tab-nav" aria-label="Main navigation">
+ <div class="tab active" data-tab="about" aria-current="page">[1] About</div>
+ <div class="tab" data-tab="experience">[2] Experience</div>
+ <div class="tab" data-tab="projects">[3] Projects</div>
+ <div class="tab" data-tab="blog">[4] Blog</div>
+ </nav>
+ <div class="tab-spacer"></div>
+ <div class="status" id="header-status">
+ <span class="dpad">
+ <span class="dpad-row"><span class="dpad-key">↑</span></span>
+ <span class="dpad-row"
+ ><span class="dpad-key">←</span><span class="dpad-key">↓</span><span
+ class="dpad-key">→</span
+ ></span
+ >
+ </span>
+ <span class="navigate"> navigate · Tab cycle</span>
+ </div>
+</header>
+
+<style>
+ #tabs {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ background: var(--bg-alt);
+ border-bottom: 1px solid var(--border);
+ padding: 0 12px;
+ height: 36px;
+ flex-shrink: 0;
+ position: relative;
+ z-index: 10;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ }
+
+ #tabs * {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ }
+
+ .tab-nav {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ }
+
+ .tab {
+ padding: 6px 12px;
+ color: var(--fg-dim);
+ cursor: pointer;
+ border-bottom: 2px solid transparent;
+ transition:
+ color 0.15s,
+ border-color 0.15s;
+ }
+
+ .tab:hover {
+ color: var(--fg);
+ }
+
+ .tab.active {
+ color: var(--accent);
+ border-bottom-color: var(--accent);
+ }
+
+ .tab-spacer {
+ flex: 1;
+ }
+
+ .status {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ color: var(--fg-dim);
+ font-size: 11px;
+ margin-right: 8px;
+ }
+
+ .dpad {
+ display: inline-flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 1px;
+ font-size: 8px;
+ line-height: 1;
+ }
+
+ .dpad-row {
+ display: flex;
+ gap: 1px;
+ }
+
+ .dpad-key {
+ width: 12px;
+ height: 10px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: var(--border);
+ border-radius: 2px;
+ color: var(--fg);
+ }
+
+ @media (max-width: 768px) {
+ #tabs {
+ flex-wrap: wrap;
+ height: auto;
+ min-height: 36px;
+ padding: 8px 12px;
+ gap: 8px;
+ }
+
+ .tab-nav {
+ width: 100%;
+ justify-content: space-between;
+ gap: 0;
+ }
+
+ .tab {
+ padding: 6px 8px;
+ font-size: 12px;
+ flex: 1;
+ text-align: center;
+ }
+
+ .tab-spacer {
+ display: none;
+ }
+
+ .status {
+ display: none;
+ }
+ }
+</style>
diff --git a/web/src/components/Lightbox.astro b/web/src/components/Lightbox.astro
@@ -0,0 +1,139 @@
+---
+
+---
+
+<div id="image-lightbox" class="lightbox hidden">
+ <div class="lightbox-overlay"></div>
+ <div class="lightbox-content">
+ <img src="" alt="" class="lightbox-image" />
+ <button class="lightbox-close">[X]</button>
+ </div>
+</div>
+
+<style>
+ .lightbox {
+ position: fixed;
+ inset: 0;
+ z-index: 1000;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ .lightbox.hidden {
+ display: none;
+ }
+
+ .lightbox-overlay {
+ position: absolute;
+ inset: 0;
+ background: rgba(0, 0, 0, 0.9);
+ cursor: pointer;
+ }
+
+ .lightbox-content {
+ position: relative;
+ max-width: 90vw;
+ max-height: 90vh;
+ z-index: 1;
+ }
+
+ .lightbox-image {
+ max-width: 100%;
+ max-height: 90vh;
+ border-radius: 4px;
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
+ }
+
+ .lightbox-close {
+ position: absolute;
+ top: 8px;
+ right: 8px;
+ background: rgba(0, 0, 0, 0.7);
+ border: 1px solid var(--border);
+ color: var(--fg);
+ font-family: "JetBrains Mono", monospace;
+ font-size: 12px;
+ cursor: pointer;
+ padding: 4px 8px;
+ line-height: 1;
+ transition:
+ color 0.15s,
+ background 0.15s;
+ z-index: 10;
+ }
+
+ .lightbox-close:hover {
+ color: var(--accent);
+ background: rgba(0, 0, 0, 0.9);
+ }
+</style>
+
+<script>
+ document.addEventListener("DOMContentLoaded", () => {
+ const lightbox = document.getElementById("image-lightbox");
+ const lightboxImage = lightbox?.querySelector(
+ ".lightbox-image",
+ ) as HTMLImageElement;
+ const lightboxOverlay = lightbox?.querySelector(".lightbox-overlay");
+ const lightboxClose = lightbox?.querySelector(".lightbox-close");
+
+ let lightboxImages: string[] = [];
+ let currentLightboxIndex = 0;
+
+ (window as Window & { isLightboxOpen?: () => boolean }).isLightboxOpen =
+ () => !lightbox?.classList.contains("hidden");
+
+ (
+ window as Window & {
+ openLightbox?: (images: string[], startIndex?: number) => void;
+ }
+ ).openLightbox = (images: string[], startIndex: number = 0) => {
+ if (lightbox && lightboxImage && images.length > 0) {
+ lightboxImages = images;
+ currentLightboxIndex = startIndex;
+ lightboxImage.src = images[startIndex];
+ lightbox.classList.remove("hidden");
+ }
+ };
+
+ function closeLightbox() {
+ lightbox?.classList.add("hidden");
+ lightboxImages = [];
+ currentLightboxIndex = 0;
+ }
+
+ function navigateLightboxImage(direction: number) {
+ if (lightboxImages.length <= 1) return;
+ currentLightboxIndex =
+ (currentLightboxIndex + direction + lightboxImages.length) %
+ lightboxImages.length;
+ if (lightboxImage) {
+ lightboxImage.src = lightboxImages[currentLightboxIndex];
+ }
+ }
+
+ (
+ window as Window & { navigateLightboxImage?: (direction: number) => void }
+ ).navigateLightboxImage = navigateLightboxImage;
+
+ lightboxOverlay?.addEventListener("click", closeLightbox);
+ lightboxClose?.addEventListener("click", closeLightbox);
+
+ document.addEventListener("keydown", (e) => {
+ if (!lightbox?.classList.contains("hidden")) {
+ if (e.key === "Escape") {
+ closeLightbox();
+ } else if (e.key === "ArrowLeft") {
+ e.preventDefault();
+ e.stopPropagation();
+ navigateLightboxImage(-1);
+ } else if (e.key === "ArrowRight") {
+ e.preventDefault();
+ e.stopPropagation();
+ navigateLightboxImage(1);
+ }
+ }
+ });
+ });
+</script>
diff --git a/web/src/components/pages/About.astro b/web/src/components/pages/About.astro
@@ -0,0 +1,393 @@
+---
+import rawAbout from "../../../config/about.json";
+import type About from "../../lib/types/about";
+import rawContact from "../../../config/contact.json";
+import type Contact from "../../lib/types/contact";
+import type { WakaTimeData } from "../../lib/wakatime";
+import { getTagClass } from "../../lib/utils/tags";
+
+const about = rawAbout as About;
+const contact = rawContact as Contact;
+
+interface Props {
+ wakaTimeData: WakaTimeData | null;
+}
+
+const { wakaTimeData } = Astro.props;
+---
+
+<section id="about" class="page active">
+ <div class="about-layout">
+ <div class="about-left">
+ <img
+ class="profile-image"
+ src="/me.jpg"
+ alt="Damian Myrda - Software Engineer and high school senior from Chicago"
+ width="280"
+ height="280"
+ loading="eager"
+ />
+ <div class="contact-box">
+ <div class="box-title">─ Contact ─</div>
+ <div class="contact-item">
+ <span class="label">Email</span>
+ <a href={`mailto:${contact.email}`}>{contact.email}</a>
+ </div>
+ <div class="contact-item">
+ <span class="label">GitLab</span>
+ <a href={contact.gitlab} target="_blank" rel="noopener noreferrer me"
+ >git.prime8.dev/moncheeta</a
+ >
+ </div>
+ <div class="contact-item">
+ <span class="label">LinkedIn</span>
+ <a
+ href={contact.linkedin}
+ target="_blank"
+ rel="noopener noreferrer me">linkedin.com/in/damian-myrda</a
+ >
+ </div>
+ </div>
+ </div>
+ <div class="about-right">
+ <div class="section">
+ <h1>
+ {about.name}
+ <span class="dim">@{about.handle}</span>
+ </h1>
+ <p class="bio">{about.bio}</p>
+ </div>
+ <div class="section">
+ <div class="box-title">─ Info ─</div>
+ <div class="info-row">
+ <span class="label">Location</span>
+ {about.location}
+ </div>
+ <div class="info-row">
+ <span class="label">School</span>
+ {about.school}
+ </div>
+ <div class="info-row">
+ <span class="label">Graduating</span>
+ {about.graduating}
+ </div>
+ </div>
+ <div class="section">
+ <div class="box-title">─ Interests ─</div>
+ <div class="tags">
+ {
+ about.interests.map((interest) => (
+ <span class={`tag ${getTagClass(interest)}`}>{interest}</span>
+ ))
+ }
+ </div>
+ </div>
+ <div class="section">
+ <div class="box-title">─ Tools ─</div>
+ <div class="tags">
+ {
+ about.tools.map((tool) => (
+ <span class={`tag ${getTagClass(tool)}`}>{tool}</span>
+ ))
+ }
+ </div>
+ </div>
+ <div class="section">
+ <div class="box-title">─ Languages ─</div>
+ <div class="tags">
+ {
+ about.languages.map((lang) => (
+ <span class={`tag ${getTagClass(lang)}`}>{lang}</span>
+ ))
+ }
+ </div>
+ </div>
+ {
+ wakaTimeData?.weeklyStats && (
+ <div class="section">
+ <div class="box-title">─ Activity ─</div>
+ <div class="weekly-stats">
+ <div class="weekly-total">
+ {wakaTimeData.weeklyStats.totalText}
+ </div>
+ <div class="weekly-days">
+ {wakaTimeData.weeklyStats.days.map((day) => (
+ <div class="weekly-day-row">
+ <span class="weekly-day-name">{day.dayText}</span>
+ <div class="weekly-day-bar-container">
+ <div
+ class="weekly-day-bar"
+ style={`width: ${day.barWidthPercent}`}
+ />
+ </div>
+ <span class="weekly-day-time">{day.timeText}</span>
+ </div>
+ ))}
+ </div>
+ </div>
+ </div>
+ )
+ }
+ </div>
+ </div>
+</section>
+
+<style>
+ .about-layout {
+ display: flex;
+ width: 100%;
+ height: 100%;
+ }
+
+ .about-left {
+ width: 320px;
+ flex-shrink: 0;
+ border-right: 1px solid var(--border);
+ display: flex;
+ flex-direction: column;
+ padding: 16px;
+ gap: 16px;
+ overflow-y: auto;
+ }
+
+ .about-right {
+ flex: 1;
+ padding: 24px 32px;
+ overflow-y: auto;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-evenly;
+ }
+
+ .profile-image {
+ width: 100%;
+ max-width: 280px;
+ height: auto;
+ border-radius: 4px;
+ border: 1px solid var(--border);
+ }
+
+ .contact-box {
+ border: 1px solid var(--border);
+ padding: 12px;
+ }
+
+ .box-title {
+ color: var(--accent);
+ font-size: 12px;
+ margin-bottom: 8px;
+ text-align: center;
+ }
+
+ .contact-item {
+ display: flex;
+ margin-bottom: 4px;
+ font-size: 12px;
+ }
+
+ .contact-item .label {
+ color: var(--fg-dim);
+ width: 70px;
+ flex-shrink: 0;
+ }
+
+ .contact-item a {
+ color: var(--light-blue);
+ text-decoration: none;
+ }
+
+ .contact-item a:hover {
+ opacity: 0.8;
+ }
+
+ .section {
+ flex-shrink: 0;
+ }
+
+ .section h1 {
+ font-size: 18px;
+ font-weight: 400;
+ margin-bottom: 4px;
+ }
+
+ .section h1 .dim {
+ color: var(--fg-dim);
+ font-size: 14px;
+ }
+
+ .section .bio {
+ color: var(--fg-dim);
+ font-style: italic;
+ }
+
+ .info-row {
+ display: flex;
+ font-size: 13px;
+ margin-bottom: 4px;
+ }
+
+ .info-row .label {
+ color: var(--fg-dim);
+ width: 100px;
+ flex-shrink: 0;
+ }
+
+ .tags {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+ }
+
+ .weekly-stats {
+ background: var(--bg-alt);
+ border: 1px solid var(--border);
+ padding: 12px;
+ }
+
+ .weekly-total {
+ font-size: 16px;
+ font-weight: 500;
+ color: var(--accent);
+ margin-bottom: 12px;
+ }
+
+ .weekly-days {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+ }
+
+ .weekly-day-row {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ font-size: 12px;
+ }
+
+ .weekly-day-name {
+ width: 32px;
+ flex-shrink: 0;
+ color: var(--fg-dim);
+ }
+
+ .weekly-day-bar-container {
+ flex: 1;
+ height: 8px;
+ background: var(--bg);
+ border-radius: 2px;
+ overflow: hidden;
+ }
+
+ .weekly-day-bar {
+ height: 100%;
+ background: var(--accent);
+ border-radius: 2px;
+ }
+
+ .weekly-day-time {
+ min-width: 50px;
+ flex-shrink: 0;
+ text-align: right;
+ color: var(--fg-dim);
+ white-space: nowrap;
+ }
+
+ @media (max-width: 768px) {
+ .about-layout {
+ flex-direction: column;
+ }
+
+ .about-left {
+ width: 100%;
+ border-right: none;
+ border-bottom: 1px solid var(--border);
+ padding: 16px;
+ flex-direction: row;
+ flex-wrap: wrap;
+ gap: 16px;
+ }
+
+ .profile-image {
+ width: 120px;
+ max-width: 120px;
+ height: 120px;
+ }
+
+ .contact-box {
+ flex: 1;
+ min-width: 200px;
+ }
+
+ .about-right {
+ padding: 16px;
+ display: block;
+ }
+
+ .section {
+ margin-bottom: 16px;
+ }
+
+ .section h1 {
+ font-size: 16px;
+ }
+
+ .section h1 .dim {
+ font-size: 12px;
+ }
+
+ .tags {
+ gap: 4px;
+ }
+
+ .tag {
+ font-size: 11px;
+ padding: 2px 6px;
+ }
+
+ .weekly-stats {
+ padding: 10px;
+ }
+
+ .weekly-total {
+ font-size: 14px;
+ }
+
+ .weekly-day-row {
+ font-size: 11px;
+ }
+
+ .weekly-day-name {
+ width: 28px;
+ }
+
+ .weekly-day-time {
+ min-width: 45px;
+ }
+ }
+
+ @media (max-width: 480px) {
+ .about-left {
+ flex-direction: column;
+ align-items: center;
+ }
+
+ .profile-image {
+ width: 150px;
+ max-width: 150px;
+ height: 150px;
+ }
+
+ .contact-box {
+ width: 100%;
+ }
+
+ .contact-item {
+ flex-direction: column;
+ gap: 2px;
+ }
+
+ .contact-item .label {
+ width: auto;
+ }
+ }
+</style>
diff --git a/web/src/components/pages/Blog.astro b/web/src/components/pages/Blog.astro
@@ -0,0 +1,205 @@
+---
+import rawBlogs from "../../lib/blogs";
+import type Blog from "../../lib/types/blog";
+import BlogArticle from "../Article.astro";
+
+const blogs = rawBlogs as Blog[];
+---
+
+<section id="blog" class="page">
+ {
+ blogs.length === 0 ? (
+ <div class="blog-empty">
+ <p class="color-dim">No blog posts yet.</p>
+ <p class="color-dim">Check back soon!</p>
+ </div>
+ ) : (
+ <>
+ <div id="blog-list-view" class="blog-list-view">
+ <div class="blog-list-container">
+ {blogs.map((blog, i) => (
+ <div class="blog-list-item" data-index={i} data-id={blog.id}>
+ <span class="blog-list-date">{blog.date}</span>
+ <span class="blog-list-title">{blog.title}</span>
+ <span class="blog-list-arrow">→</span>
+ </div>
+ ))}
+ </div>
+ </div>
+
+ <div id="blog-post-view" class="blog-post-view hidden">
+ <div class="blog-post-container">
+ {blogs.map((blog, i) => (
+ <div
+ class="blog-post hidden"
+ data-index={i}
+ data-id={blog.id}
+ data-blog-id={blog.id}
+ >
+ <BlogArticle blog={blog} isStandalone={false} />
+ </div>
+ ))}
+ </div>
+ </div>
+ </>
+ )
+ }
+</section>
+
+<style>
+ .blog-empty {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ height: 100%;
+ width: 100%;
+ gap: 8px;
+ }
+
+ .blog-list-view {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 100%;
+ width: 100%;
+ }
+
+ .blog-list-view.hidden {
+ display: none;
+ }
+
+ .blog-list-container {
+ max-width: 600px;
+ width: 100%;
+ padding: 32px;
+ }
+
+ .blog-list-item {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+ padding: 16px 20px;
+ border: 1px solid var(--border);
+ margin-bottom: 12px;
+ cursor: pointer;
+ transition:
+ background 0.15s ease,
+ border-color 0.15s ease;
+ text-decoration: none;
+ color: inherit;
+ }
+
+ .blog-list-item:hover {
+ background: var(--selection);
+ border-color: var(--accent);
+ }
+
+ .blog-list-item.selected {
+ background: var(--bg-alt);
+ border-color: var(--accent);
+ }
+
+ .blog-list-item.selected:hover {
+ background: var(--selection);
+ }
+
+ .blog-list-item:last-child {
+ margin-bottom: 0;
+ }
+
+ .blog-list-date {
+ color: var(--fg-dim);
+ font-size: 12px;
+ flex-shrink: 0;
+ width: 90px;
+ }
+
+ .blog-list-title {
+ flex: 1;
+ color: var(--fg);
+ font-weight: 500;
+ }
+
+ .blog-list-arrow {
+ color: var(--fg-dim);
+ font-size: 14px;
+ transition:
+ transform 0.15s,
+ color 0.15s;
+ }
+
+ .blog-list-item:hover .blog-list-arrow {
+ color: var(--accent);
+ transform: translateX(4px);
+ }
+
+ .blog-post-view {
+ display: flex;
+ justify-content: center;
+ height: 100%;
+ width: 100%;
+ overflow-y: auto;
+ padding: 32px;
+ }
+
+ .blog-post-view.hidden {
+ display: none;
+ }
+
+ .blog-post-container {
+ max-width: 700px;
+ width: 100%;
+ }
+
+ .blog-post.hidden {
+ display: none;
+ }
+
+ @media (max-width: 768px) {
+ .blog-list-container {
+ padding: 16px;
+ }
+
+ .blog-list-item {
+ gap: 12px;
+ padding: 12px 16px;
+ margin-bottom: 10px;
+ }
+
+ .blog-list-date {
+ font-size: 11px;
+ width: 80px;
+ }
+
+ .blog-list-title {
+ font-size: 14px;
+ }
+
+ .blog-post-view {
+ padding: 16px;
+ }
+ }
+
+ @media (max-width: 480px) {
+ .blog-list-item {
+ flex-wrap: wrap;
+ gap: 4px;
+ }
+
+ .blog-list-date {
+ width: auto;
+ order: 2;
+ }
+
+ .blog-list-title {
+ width: 100%;
+ order: 1;
+ }
+
+ .blog-list-arrow {
+ order: 3;
+ margin-left: auto;
+ }
+ }
+</style>
diff --git a/web/src/components/pages/Experience.astro b/web/src/components/pages/Experience.astro
@@ -0,0 +1,628 @@
+---
+import rawExperience from "../../../config/experience.json";
+import type Experience from "../../lib/types/experience";
+import currentJob from "../../lib/utils/job";
+import { MONTH_NAMES } from "../../constants/calendar";
+import { calculateMonths } from "../../lib/utils/period";
+import { getTagClass } from "../../lib/utils/tags";
+
+const experience = (rawExperience as Experience[]).sort((a, b) =>
+ a.startDate.localeCompare(b.startDate),
+);
+
+const currentRoleIndex = currentJob
+ ? experience.findIndex((exp) => exp.id === currentJob.id)
+ : 0;
+
+const dates = experience.map((exp) => {
+ const [year, month] = exp.startDate.split("-").map(Number);
+ return new Date(year, month - 1, 1);
+});
+const endDates = experience.map((exp) =>
+ exp.endDate
+ ? new Date(
+ parseInt(exp.endDate.split("-")[0]),
+ parseInt(exp.endDate.split("-")[1]) - 1,
+ 28,
+ )
+ : new Date(),
+);
+const earliestDate = new Date(Math.min(...dates.map((d) => d.getTime())));
+const latestDate = new Date(Math.max(...endDates.map((d) => d.getTime())));
+
+const timelineStart = new Date(
+ earliestDate.getFullYear(),
+ earliestDate.getMonth(),
+ 1,
+);
+const timelineEnd = latestDate;
+const totalDays = Math.ceil(
+ (timelineEnd.getTime() - timelineStart.getTime()) / (1000 * 60 * 60 * 24),
+);
+
+const startYear = timelineStart.getFullYear();
+const endYear = timelineEnd.getFullYear();
+const years = Array.from(
+ { length: endYear - startYear + 1 },
+ (_, i) => startYear + i,
+);
+
+const monthTicks: string[] = [];
+let current = new Date(timelineStart);
+while (current <= timelineEnd) {
+ monthTicks.push(MONTH_NAMES[current.getMonth()][0]);
+ current.setMonth(current.getMonth() + 1);
+}
+---
+
+<section id="experience" class="page">
+ <article class="experience-layout">
+ <div class="timeline-container">
+ <div class="timeline-years">
+ {years.map((year) => <span class="year-marker">{year}</span>)}
+ </div>
+
+ <div class="timeline-bar">
+ {
+ experience.map((exp) => {
+ const [startYear, startMonth] = exp.startDate
+ .split("-")
+ .map(Number);
+ const expStart = new Date(startYear, startMonth - 1, 1);
+ const expEnd = exp.endDate
+ ? new Date(
+ parseInt(exp.endDate.split("-")[0]),
+ parseInt(exp.endDate.split("-")[1]) - 1,
+ 28,
+ )
+ : new Date();
+
+ const startOffset = Math.max(
+ 0,
+ (expStart.getTime() - timelineStart.getTime()) /
+ (1000 * 60 * 60 * 24),
+ );
+ const duration =
+ (expEnd.getTime() - expStart.getTime()) / (1000 * 60 * 60 * 24);
+
+ const leftPercent = (startOffset / totalDays) * 100;
+ const widthPercent = (duration / totalDays) * 100;
+ const months = calculateMonths(exp.startDate, exp.endDate);
+
+ const originalIndex = experience.findIndex((e) => e.id === exp.id);
+
+ return (
+ <div
+ class={`timeline-segment ${originalIndex === currentRoleIndex ? "selected" : ""}`}
+ style={`left: ${leftPercent}%; width: ${widthPercent}%;`}
+ data-index={originalIndex}
+ data-id={exp.id}
+ >
+ <div class="segment-content">
+ <span class="segment-company">{exp.company}</span>
+ <span class="segment-duration">{months} mos</span>
+ </div>
+ </div>
+ );
+ })
+ }
+ </div>
+
+ <div class="timeline-ticks">
+ {monthTicks.map((m) => <span class="tick-mark">{m}</span>)}
+ </div>
+ </div>
+
+ <div class="experience-detail">
+ {
+ experience.map((exp, index) => {
+ const months = calculateMonths(exp.startDate, exp.endDate);
+ const [startYear, startMonth] = exp.startDate.split("-").map(Number);
+ const startStr = `${MONTH_NAMES[startMonth - 1]} ${startYear}`;
+ const endStr = exp.endDate
+ ? `${MONTH_NAMES[parseInt(exp.endDate.split("-")[1]) - 1]} ${exp.endDate.split("-")[0]}`
+ : "Present";
+
+ return (
+ <div
+ class={`exp-card ${index !== currentRoleIndex ? "hidden" : ""}`}
+ data-for={index}
+ >
+ <div class="exp-card-header">
+ <div class="exp-card-title">
+ {exp.logo ? (
+ <div class="exp-title-with-logo">
+ <img
+ src={exp.logo}
+ alt={`${exp.company} logo`}
+ class={`exp-logo ${exp.logoFilter || ""}`}
+ />
+ <span class="exp-role">{exp.role}</span>
+ </div>
+ ) : (
+ <div class="exp-title-text">
+ <h2>{exp.company}</h2>
+ <span class="exp-role">{exp.role}</span>
+ </div>
+ )}
+ </div>
+ <div class="exp-card-meta">
+ <span class="exp-dates">
+ {startStr} → {endStr}
+ </span>
+ <span class="exp-duration">{months} months</span>
+ {exp.url && (
+ <a
+ class="external-link"
+ href={exp.url}
+ target="_blank"
+ rel="noopener noreferrer"
+ >
+ {new URL(exp.url).hostname} →
+ </a>
+ )}
+ </div>
+ </div>
+ <div class="exp-card-tech">
+ {exp.tech.map((tech) => (
+ <span class={`tag ${getTagClass(tech)}`}>{tech}</span>
+ ))}
+ </div>
+ <div class="exp-card-body">
+ {exp.description.map((description) => (
+ <p>{description}</p>
+ ))}
+ </div>
+ {exp.images && exp.images.length > 0 && (
+ <div class="exp-card-images">
+ <img
+ src={exp.images[0]}
+ alt={`${exp.company} workplace, ${exp.role} experience at ${exp.company}`}
+ class="exp-image-hero"
+ loading="lazy"
+ data-idx="0"
+ />
+ {exp.images.length > 1 && (
+ <div class="exp-image-grid">
+ {exp.images.slice(1).map((image, index) => (
+ <img
+ src={image}
+ alt={`${exp.company} team and office environment, image ${index + 2} of ${exp.images!.length}`}
+ class="exp-image-thumb"
+ loading="lazy"
+ data-idx={index + 1}
+ />
+ ))}
+ </div>
+ )}
+ </div>
+ )}
+ </div>
+ );
+ })
+ }
+ </div>
+ </article>
+</section>
+
+<script>
+ document.addEventListener("DOMContentLoaded", () => {
+ document
+ .querySelectorAll(".exp-image-hero, .exp-image-thumb")
+ .forEach((img) => {
+ img.addEventListener("click", () => {
+ const container = (img as HTMLElement).closest(".exp-card-images");
+ const allImages = container
+ ? Array.from(container.querySelectorAll("img")).map(
+ (i) => (i as HTMLImageElement).src,
+ )
+ : [];
+ const startIndex = allImages.indexOf((img as HTMLImageElement).src);
+ (
+ window as Window & {
+ openLightbox?: (images: string[], startIndex?: number) => void;
+ }
+ ).openLightbox?.(allImages, startIndex);
+ });
+ });
+ });
+</script>
+
+<style>
+ .experience-layout {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ width: 100%;
+ padding: 32px 48px;
+ gap: 24px;
+ }
+
+ .timeline-container {
+ flex-shrink: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+ }
+
+ .timeline-years {
+ display: flex;
+ justify-content: space-between;
+ padding: 0 4px;
+ font-size: 12px;
+ color: var(--fg-dim);
+ }
+
+ .year-marker {
+ font-weight: 500;
+ }
+
+ .timeline-bar {
+ position: relative;
+ height: 48px;
+ background: var(--bg-alt);
+ border: 1px solid var(--border);
+ border-radius: 4px;
+ }
+
+ .timeline-segment {
+ position: absolute;
+ top: 4px;
+ bottom: 4px;
+ background: var(--border);
+ border-radius: 3px;
+ cursor: pointer;
+ transition: all 0.2s ease;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ overflow: hidden;
+ }
+
+ .timeline-segment:hover {
+ background: var(--fg-dim);
+ }
+
+ .timeline-segment.selected {
+ background: var(--accent);
+ box-shadow:
+ 0 0 0 2px var(--accent),
+ 0 0 12px rgba(215, 175, 95, 0.3);
+ }
+
+ .segment-content {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 2px;
+ padding: 0 8px;
+ min-width: 0;
+ }
+
+ .segment-company {
+ font-size: 11px;
+ font-weight: 600;
+ color: var(--bg);
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ max-width: 100%;
+ }
+
+ .segment-duration {
+ font-size: 9px;
+ color: var(--bg);
+ opacity: 0.8;
+ }
+
+ .timeline-segment.selected .segment-company,
+ .timeline-segment.selected .segment-duration {
+ color: var(--bg);
+ }
+
+ .timeline-ticks {
+ display: flex;
+ justify-content: space-between;
+ padding: 0 2px;
+ font-size: 9px;
+ color: var(--fg-dim);
+ opacity: 0.6;
+ }
+
+ .tick-mark {
+ width: 5%;
+ text-align: center;
+ }
+
+ .experience-detail {
+ flex: 1;
+ overflow-y: auto;
+ display: flex;
+ flex-direction: column;
+ }
+
+ .exp-card {
+ background: var(--bg-alt);
+ border: 1px solid var(--border);
+ border-radius: 4px;
+ padding: 24px;
+ width: 100%;
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 0;
+ animation: slideUp 0.2s ease;
+ }
+
+ @keyframes slideUp {
+ from {
+ opacity: 0;
+ transform: translateY(8px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+ }
+
+ .exp-card.hidden {
+ display: none;
+ }
+
+ .exp-card-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-start;
+ margin-bottom: 16px;
+ gap: 24px;
+ }
+
+ .exp-card-title {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+ }
+
+ .exp-logo {
+ height: 32px;
+ width: auto;
+ flex-shrink: 0;
+ }
+
+ .exp-logo.logo-invert {
+ filter: brightness(0) invert(1);
+ }
+
+ .exp-title-with-logo {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ }
+
+ .exp-title-with-logo .exp-role {
+ color: #999;
+ font-size: 14px;
+ }
+
+ .exp-title-with-logo .exp-duration {
+ color: #aaa;
+ font-size: 12px;
+ }
+
+ .exp-title-text h2 {
+ font-size: 22px;
+ font-weight: 500;
+ color: var(--accent);
+ margin: 0 0 4px 0;
+ }
+
+ .exp-title-text .exp-role {
+ font-size: 14px;
+ color: #999;
+ }
+
+ .exp-card-meta {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-end;
+ gap: 4px;
+ font-size: 13px;
+ }
+
+ .exp-dates {
+ color: var(--fg);
+ }
+
+ .exp-duration {
+ color: #aaa;
+ font-size: 12px;
+ }
+
+ .exp-card-tech {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+ margin-bottom: 20px;
+ }
+
+ .exp-card-body {
+ color: var(--fg);
+ line-height: 1.7;
+ padding-bottom: 0;
+ margin-bottom: 0;
+ }
+
+ .exp-card-body p {
+ margin-bottom: 12px;
+ }
+
+ .exp-card-body p:last-child {
+ margin-bottom: 0;
+ }
+
+ .exp-card-images {
+ display: flex;
+ gap: 16px;
+ margin-top: 12px;
+ padding-top: 12px;
+ border-top: 1px solid var(--border);
+ flex: 1;
+ min-height: 0;
+ overflow: hidden;
+ }
+
+ .exp-image-hero {
+ flex: 1;
+ min-width: 0;
+ height: 100%;
+ border-radius: 4px;
+ border: 1px solid var(--border);
+ object-fit: cover;
+ cursor: pointer;
+ transition:
+ transform 0.15s,
+ box-shadow 0.15s;
+ }
+
+ .exp-image-hero:hover {
+ opacity: 0.8;
+ border-color: var(--accent);
+ }
+
+ .exp-image-grid {
+ width: 180px;
+ flex-shrink: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ }
+
+ .exp-image-thumb {
+ width: 100%;
+ flex: 1;
+ min-height: 50px;
+ border-radius: 4px;
+ border: 1px solid var(--border);
+ object-fit: cover;
+ cursor: pointer;
+ transition:
+ opacity 0.15s,
+ border-color 0.15s;
+ }
+
+ .exp-image-thumb:hover {
+ opacity: 0.8;
+ border-color: var(--accent);
+ }
+
+ .external-link {
+ color: var(--light-blue);
+ text-decoration: none;
+ font-size: 12px;
+ }
+
+ .external-link:hover {
+ opacity: 0.8;
+ }
+
+ @media (max-width: 768px) {
+ .experience-layout {
+ padding: 16px;
+ gap: 16px;
+ }
+
+ .timeline-container {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+
+ .timeline-bar {
+ min-width: 500px;
+ height: 40px;
+ }
+
+ .timeline-years {
+ min-width: 500px;
+ font-size: 11px;
+ }
+
+ .timeline-ticks {
+ min-width: 500px;
+ font-size: 8px;
+ }
+
+ .segment-content {
+ padding: 0 4px;
+ }
+
+ .segment-company {
+ font-size: 9px;
+ }
+
+ .segment-duration {
+ font-size: 8px;
+ }
+
+ .exp-card {
+ padding: 16px;
+ }
+
+ .exp-card-header {
+ flex-direction: column;
+ gap: 12px;
+ }
+
+ .exp-card-meta {
+ align-items: flex-start;
+ }
+
+ .exp-logo {
+ height: 28px;
+ }
+
+ .exp-title-text h2 {
+ font-size: 18px;
+ }
+
+ .exp-card-tech {
+ gap: 4px;
+ }
+
+ .exp-card-body {
+ font-size: 13px;
+ }
+
+ .exp-card-images {
+ flex-direction: column;
+ gap: 12px;
+ }
+
+ .exp-image-hero {
+ height: auto;
+ max-height: 200px;
+ }
+
+ .exp-image-grid {
+ width: 100%;
+ flex-direction: row;
+ flex-wrap: wrap;
+ gap: 8px;
+ }
+
+ .exp-image-thumb {
+ width: calc(33.33% - 6px);
+ min-height: 60px;
+ max-height: 80px;
+ }
+ }
+
+ @media (max-width: 480px) {
+ .timeline-bar {
+ height: 36px;
+ }
+
+ .exp-image-thumb {
+ width: calc(50% - 4px);
+ }
+ }
+</style>
diff --git a/web/src/components/pages/Projects.astro b/web/src/components/pages/Projects.astro
@@ -0,0 +1,404 @@
+---
+import rawProjects from "../../../config/projects.json";
+import type Project from "../../lib/types/project";
+import { getTagClass, getTechMeta } from "../../lib/utils/tags";
+
+const projects = rawProjects as Project[];
+
+interface Props {
+ readmes?: Record<string, string>;
+}
+
+const { readmes } = Astro.props;
+---
+
+<section id="projects" class="page">
+ <aside class="list-view" aria-label="Project list">
+ {
+ projects.map((prg, i) => (
+ <div
+ class={`list-item ${i === 0 ? "selected" : ""}`}
+ data-index={i}
+ data-id={prg.id}
+ >
+ <div class="list-header">
+ <span class="list-title">{prg.name}</span>
+ <span class="list-meta">{getTechMeta(prg.tech)}</span>
+ </div>
+ <div class="list-subtitle">{prg.subtitle}</div>
+ </div>
+ ))
+ }
+ </aside>
+ <article class="detail-view">
+ {
+ projects.map((prg, index) => (
+ <div
+ class={`detail-content ${index !== 0 ? "hidden" : ""}`}
+ data-for={index}
+ data-id={prg.id}
+ >
+ <div class="detail-header">
+ <h2>{prg.name}</h2>
+ <a
+ class="external-link"
+ href={prg.url}
+ target="_blank"
+ rel="noopener noreferrer"
+ >
+ {prg.url.includes("github.com") ? "GitHub" : "GitLab"} →
+ </a>
+ </div>
+ <div class="tech-stack">
+ {prg.tech.map((tech) => (
+ <span class={`tag ${getTagClass(tech)}`}>{tech}</span>
+ ))}
+ </div>
+ <div class="readme-content" data-readme={prg.id}>
+ {readmes?.[prg.id] ? (
+ <Fragment set:html={readmes[prg.id]} />
+ ) : (
+ <p class="color-dim">README not available</p>
+ )}
+ </div>
+ </div>
+ ))
+ }
+ </article>
+</section>
+
+<style>
+ aside.list-view {
+ width: 300px;
+ flex-shrink: 0;
+ border-right: 1px solid var(--border);
+ overflow-y: auto;
+ }
+
+ article.detail-view {
+ flex: 1;
+ padding: 24px 32px;
+ overflow: hidden;
+ display: flex;
+ flex-direction: column;
+ }
+
+ .list-item {
+ padding: 12px 16px;
+ border-bottom: 1px solid var(--border);
+ cursor: pointer;
+ transition: background 0.1s;
+ }
+
+ .list-item:hover {
+ background: var(--bg-alt);
+ }
+
+ .list-item.selected {
+ background: var(--selection);
+ border-left: 3px solid var(--accent);
+ }
+
+ .list-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 2px;
+ }
+
+ .list-title {
+ font-weight: 600;
+ color: var(--fg);
+ }
+
+ .list-meta {
+ font-size: 11px;
+ color: var(--fg-dim);
+ }
+
+ .list-subtitle {
+ font-size: 12px;
+ color: var(--fg-dim);
+ }
+
+ .detail-content {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ }
+
+ .detail-content.hidden {
+ display: none;
+ }
+
+ .detail-content h2 {
+ font-size: 20px;
+ font-weight: 400;
+ color: var(--accent);
+ margin-bottom: 4px;
+ }
+
+ .detail-content .tech-stack {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+ margin-bottom: 16px;
+ }
+
+ .detail-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 12px;
+ }
+
+ .detail-header h2 {
+ margin-bottom: 0;
+ }
+
+ .external-link {
+ color: var(--light-blue);
+ text-decoration: none;
+ font-size: 12px;
+ }
+
+ .external-link:hover {
+ opacity: 0.8;
+ }
+
+ .readme-content {
+ flex: 1;
+ min-height: 0;
+ overflow-y: auto;
+ font-size: 13px;
+ line-height: 1.6;
+ color: var(--fg);
+ margin-top: 16px;
+ padding-top: 16px;
+ border-top: 1px solid var(--border);
+ }
+
+ .readme-content :global(p) {
+ margin-bottom: 12px;
+ }
+
+ .readme-content :global(p:last-child) {
+ margin-bottom: 0;
+ }
+
+ .readme-content :global(h2),
+ .readme-content :global(.readme-h1) {
+ font-size: 16px;
+ color: var(--accent);
+ margin: 20px 0 8px;
+ font-weight: 600;
+ }
+
+ .readme-content :global(h2:first-child),
+ .readme-content :global(.readme-h1:first-child) {
+ margin-top: 0;
+ }
+
+ .readme-content :global(h3),
+ .readme-content :global(.readme-h2) {
+ font-size: 14px;
+ color: var(--accent);
+ margin: 16px 0 8px;
+ font-weight: 500;
+ }
+
+ .readme-content :global(h4),
+ .readme-content :global(.readme-h3) {
+ font-size: 13px;
+ color: var(--fg);
+ margin: 12px 0 6px;
+ font-weight: 500;
+ }
+
+ .readme-content :global(h5),
+ .readme-content :global(h6) {
+ font-size: 12px;
+ color: var(--fg-dim);
+ margin: 10px 0 6px;
+ font-weight: 500;
+ }
+
+ .readme-content :global(pre) {
+ display: block;
+ background: var(--bg-alt);
+ border: 1px solid var(--border);
+ padding: 12px;
+ margin: 12px 0;
+ overflow-x: auto;
+ font-size: 12px;
+ line-height: 1.4;
+ }
+
+ .readme-content :global(pre code) {
+ background: none;
+ padding: 0;
+ font-size: inherit;
+ }
+
+ .readme-content :global(code) {
+ background: var(--bg-alt);
+ padding: 2px 6px;
+ font-size: 12px;
+ border-radius: 2px;
+ }
+
+ .readme-content :global(a) {
+ color: var(--light-blue);
+ text-decoration: none;
+ }
+
+ .readme-content :global(a:hover) {
+ opacity: 0.8;
+ }
+
+ .readme-content :global(ul),
+ .readme-content :global(ol) {
+ margin: 8px 0;
+ padding-left: 20px;
+ }
+
+ .readme-content :global(li) {
+ margin-bottom: 4px;
+ }
+
+ .readme-content :global(li > ul),
+ .readme-content :global(li > ol) {
+ margin: 4px 0;
+ }
+
+ .readme-content :global(table) {
+ width: 100%;
+ border-collapse: collapse;
+ margin: 12px 0;
+ font-size: 12px;
+ }
+
+ .readme-content :global(th),
+ .readme-content :global(td) {
+ border: 1px solid var(--border);
+ padding: 8px 12px;
+ text-align: left;
+ }
+
+ .readme-content :global(th) {
+ background: var(--bg-alt);
+ color: var(--accent);
+ font-weight: 500;
+ }
+
+ .readme-content :global(tr:nth-child(even)) {
+ background: rgba(255, 255, 255, 0.02);
+ }
+
+ .readme-content :global(blockquote) {
+ border-left: 3px solid var(--accent);
+ margin: 12px 0;
+ padding: 8px 16px;
+ color: var(--fg-dim);
+ background: var(--bg-alt);
+ }
+
+ .readme-content :global(blockquote p) {
+ margin-bottom: 0;
+ }
+
+ .readme-content :global(hr) {
+ border: none;
+ border-top: 1px solid var(--border);
+ margin: 20px 0;
+ }
+
+ .readme-content :global(img) {
+ max-width: 100%;
+ height: auto;
+ margin: 12px 0;
+ }
+
+ .readme-content :global(strong) {
+ color: var(--fg);
+ font-weight: 600;
+ }
+
+ .readme-content :global(em) {
+ font-style: italic;
+ color: var(--fg-dim);
+ }
+
+ .readme-content :global(del) {
+ text-decoration: line-through;
+ color: var(--fg-dim);
+ }
+
+ @media (max-width: 768px) {
+ #projects {
+ flex-direction: column;
+ }
+
+ aside.list-view {
+ width: 100%;
+ border-right: none;
+ border-bottom: 1px solid var(--border);
+ max-height: 200px;
+ overflow-y: auto;
+ }
+
+ .list-item {
+ padding: 10px 14px;
+ }
+
+ .list-title {
+ font-size: 13px;
+ }
+
+ .list-subtitle {
+ font-size: 11px;
+ }
+
+ article.detail-view {
+ padding: 16px;
+ overflow-y: auto;
+ }
+
+ .detail-content h2 {
+ font-size: 18px;
+ }
+
+ .detail-header {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 8px;
+ }
+
+ .readme-content {
+ font-size: 12px;
+ }
+
+ .readme-content :global(pre) {
+ font-size: 11px;
+ padding: 10px;
+ }
+
+ .readme-content :global(code) {
+ font-size: 11px;
+ }
+ }
+
+ @media (max-width: 480px) {
+ aside.list-view {
+ max-height: 150px;
+ }
+
+ .list-item {
+ padding: 8px 12px;
+ }
+
+ .list-meta {
+ display: none;
+ }
+ }
+</style>
diff --git a/web/src/components/styles.css b/web/src/components/styles.css
@@ -0,0 +1,111 @@
+/* Tag colors */
+.tag {
+ border: none;
+ padding: 2px 8px;
+ font-size: 12px;
+ color: var(--bg);
+ background: var(--fg-dim);
+}
+
+/* Language tags */
+.tag.lang-zig {
+ background: #f7a41d;
+}
+.tag.lang-rust {
+ background: #dea584;
+}
+.tag.lang-c {
+ background: #a8b1c2;
+}
+.tag.lang-go {
+ background: #00add8;
+}
+.tag.lang-ts {
+ background: #3178c6;
+ color: #fff;
+}
+.tag.lang-python {
+ background: #3572a5;
+ color: #fff;
+}
+
+/* Tool tags */
+.tag.tool-zed {
+ background: #084ccf;
+ color: #fff;
+}
+.tag.tool-neovim {
+ background: #57a143;
+}
+.tag.tool-opencode {
+ background: #af5faf;
+ color: #fff;
+}
+.tag.tool-linux {
+ background: #f7c94c;
+}
+.tag.tool-fish {
+ background: #d78700;
+}
+.tag.tool-ghostty {
+ background: #8b5cf6;
+ color: #fff;
+}
+
+/* Interest tags */
+.tag.interest-lowlevel {
+ background: #d75f5f;
+ color: #fff;
+}
+.tag.interest-tui {
+ background: #5faf5f;
+ color: #0d0d0d;
+}
+.tag.interest-embedded {
+ background: #5fafaf;
+ color: #0d0d0d;
+}
+.tag.interest-unix {
+ background: #d7af5f;
+ color: #0d0d0d;
+}
+
+/* Tech tags */
+.tag.tech-temporal {
+ background: #4c35c9;
+ color: #fff;
+}
+.tag.tech-postgres {
+ background: #336791;
+ color: #fff;
+}
+.tag.tech-pytorch {
+ background: #ee4c2c;
+ color: #fff;
+}
+.tag.tech-cuda {
+ background: #76b900;
+}
+.tag.tech-docker {
+ background: #2496ed;
+ color: #fff;
+}
+.tag.tech-kafka {
+ background: #4c35c9;
+ color: #fff;
+}
+.tag.tech-rn {
+ background: #61dafb;
+}
+.tag.tech-supabase {
+ background: #3ecf8e;
+}
+
+/* Utility classes */
+.color-dim {
+ color: var(--fg-dim);
+}
+
+.hidden {
+ display: none;
+}
diff --git a/web/src/constants/calendar.ts b/web/src/constants/calendar.ts
@@ -0,0 +1,24 @@
+export const MONTH_NAMES = [
+ "January",
+ "February",
+ "March",
+ "April",
+ "May",
+ "June",
+ "July",
+ "August",
+ "September",
+ "October",
+ "November",
+ "December",
+];
+
+export const DAY_NAMES = [
+ "Sunday",
+ "Monday",
+ "Tuesday",
+ "Wednesday",
+ "Thursday",
+ "Friday",
+ "Saturday",
+];
diff --git a/web/src/constants/tags.ts b/web/src/constants/tags.ts
@@ -0,0 +1,33 @@
+export const TAG_CLASS_MAP: Record<string, string> = {
+ // Languages
+ Zig: "lang-zig",
+ Rust: "lang-rust",
+ C: "lang-c",
+ Go: "lang-go",
+ TypeScript: "lang-ts",
+ Python: "lang-python",
+ // Tools
+ "Zed (Vim mode)": "tool-zed",
+ Neovim: "tool-neovim",
+ OpenCode: "tool-opencode",
+ Linux: "tool-linux",
+ Fish: "tool-fish",
+ Ghostty: "tool-ghostty",
+ // Interests
+ "Low-level systems": "interest-lowlevel",
+ "TUI/CLI tooling": "interest-tui",
+ "Embedded OS": "interest-embedded",
+ "UNIX philosophy": "interest-unix",
+ // Tech
+ Temporal: "tech-temporal",
+ PyTorch: "tech-pytorch",
+ CUDA: "tech-cuda",
+ Docker: "tech-docker",
+ Kafka: "tech-kafka",
+ "React Native": "tech-rn",
+ Supabase: "tech-supabase",
+};
+
+export const TECH_ABBREVIATIONS: Record<string, string> = {
+ TypeScript: "TS",
+};
diff --git a/web/src/constants/website.ts b/web/src/constants/website.ts
@@ -0,0 +1 @@
+export const URL = "https://prime8.dev";
diff --git a/web/src/layouts/Layout.astro b/web/src/layouts/Layout.astro
@@ -0,0 +1,557 @@
+---
+import Lightbox from "../components/Lightbox.astro";
+import about from "../../config/about.json";
+import { URL } from "../constants/website";
+
+interface Props {
+ title: string;
+ description: string;
+ type: "website" | "article";
+ url: string;
+ image?: string;
+ keywords?: string;
+ publishedTime?: string;
+ modifiedTime?: string;
+}
+
+const {
+ title,
+ description,
+ type,
+ url,
+ image,
+ keywords,
+ publishedTime,
+ modifiedTime,
+} = Astro.props;
+
+const ogImage = image
+ ? image.startsWith("http")
+ ? image
+ : `${URL}${image}`
+ : `${URL}/me.jpg`;
+---
+
+<!doctype html>
+<html lang="en">
+ <head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <title>{title}</title>
+ <meta name="description" content={description} />
+ {keywords && <meta name="keywords" content={keywords} />}
+
+ <link rel="canonical" href={url} />
+ <link rel="alternate" hreflang="en" href={url} />
+ <link rel="alternate" hreflang="x-default" href={url} />
+
+ <!-- Preconnect for external resources -->
+ <link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
+ <link rel="dns-prefetch" href="https://cdn.jsdelivr.net" />
+
+ <!-- Preload font for performance -->
+ <link
+ rel="preload"
+ href="https://cdn.jsdelivr.net/npm/@fontsource/jetbrains-mono@5.0.18/files/jetbrains-mono-latin-400-normal.woff2"
+ as="font"
+ type="font/woff2"
+ crossorigin
+ />
+
+ <!-- Open Graph -->
+ <meta property="og:type" content={type} />
+ <meta property="og:url" content={url} />
+ <meta property="og:title" content={title} />
+ <meta property="og:description" content={description} />
+ <meta property="og:image" content={ogImage} />
+ <meta property="og:image:width" content="1200" />
+ <meta property="og:image:height" content="630" />
+ <meta property="og:site_name" content={about.name} />
+ <meta property="og:locale" content="en_US" />
+ {
+ type === "article" && publishedTime && (
+ <meta property="article:published_time" content={publishedTime} />
+ )
+ }
+ {
+ type === "article" && modifiedTime && (
+ <meta property="article:modified_time" content={modifiedTime} />
+ )
+ }
+ {
+ type === "article" && (
+ <meta property="article:author" content={about.name} />
+ )
+ }
+
+ <!-- Twitter Card -->
+ <meta name="twitter:card" content="summary_large_image" />
+ <meta name="twitter:url" content={url} />
+ <meta name="twitter:title" content={title} />
+ <meta name="twitter:description" content={description} />
+ <meta name="twitter:image" content={ogImage} />
+
+ <!-- Additional Meta -->
+ <meta name="author" content={about.name} />
+ <meta name="robots" content="index, follow" />
+ <meta name="theme-color" content="#0d0d0d" />
+
+ <!-- Favicons -->
+ <link rel="icon" type="image/png" href="/favicon.png" />
+ <link rel="apple-touch-icon" href="/favicon.png" />
+ <link rel="manifest" href="/site.webmanifest" />
+ </head>
+ <body>
+ <div id="app">
+ <slot />
+ </div>
+
+ <Lightbox />
+ </body>
+</html>
+
+<style is:global>
+ * {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+ }
+
+ :root {
+ --bg: #0d0d0d;
+ --bg-alt: #161616;
+ --fg: #c0c0c0;
+ --fg-dim: #606060;
+ --accent: #d7af5f;
+ --accent-dim: #a68a3d;
+ --cyan: #5fafaf;
+ --blue: #5f87d7;
+ --light-blue: #5fafff;
+ --yellow: #d7af5f;
+ --magenta: #af5faf;
+ --red: #d75f5f;
+ --border: #333;
+ --selection: #3d3520;
+ }
+
+ @font-face {
+ font-family: "JetBrains Mono";
+ src: url("https://cdn.jsdelivr.net/npm/@fontsource/jetbrains-mono@5.0.18/files/jetbrains-mono-latin-400-normal.woff2")
+ format("woff2");
+ font-weight: 400;
+ }
+
+ body {
+ background: var(--bg);
+ color: var(--fg);
+ font-family: "JetBrains Mono", "SF Mono", "Fira Code", monospace;
+ font-size: 14px;
+ line-height: 1.5;
+ min-height: 100vh;
+ overflow: hidden;
+ }
+
+ ::-webkit-scrollbar {
+ width: 8px;
+ }
+
+ ::-webkit-scrollbar-track {
+ background: var(--bg);
+ }
+
+ ::-webkit-scrollbar-thumb {
+ background: var(--fg-dim);
+ border-radius: 4px;
+ }
+
+ ::-webkit-scrollbar-thumb:hover {
+ background: var(--fg);
+ }
+
+ .link {
+ color: var(--light-blue);
+ text-decoration: underline;
+ cursor: pointer;
+ }
+
+ .link:hover {
+ color: var(--light-blue);
+ opacity: 0.8;
+ }
+
+ a {
+ color: var(--light-blue);
+ text-decoration: none;
+ }
+
+ a:hover {
+ opacity: 0.8;
+ }
+
+ .color-green {
+ color: var(--accent);
+ }
+ .color-blue {
+ color: var(--blue);
+ }
+ .color-cyan {
+ color: var(--cyan);
+ }
+ .color-yellow {
+ color: var(--yellow);
+ }
+ .color-red {
+ color: var(--red);
+ }
+ .color-magenta {
+ color: var(--magenta);
+ }
+ .color-dim {
+ color: var(--fg-dim);
+ }
+ .bold {
+ font-weight: 700;
+ }
+
+ #app {
+ display: flex;
+ flex-direction: column;
+ height: 100vh;
+ opacity: 0;
+ }
+
+ #app.ready {
+ opacity: 1;
+ }
+
+ #content {
+ flex: 1;
+ overflow: hidden;
+ }
+
+ .page {
+ display: none;
+ height: 100%;
+ }
+
+ .page.active {
+ display: flex;
+ }
+
+ .tag {
+ border: none;
+ padding: 2px 8px;
+ font-size: 12px;
+ color: var(--bg);
+ background: var(--fg-dim);
+ }
+
+ .tag.lang-zig {
+ background: #f7a41d;
+ }
+ .tag.lang-rust {
+ background: #dea584;
+ }
+ .tag.lang-c {
+ background: #a8b1c2;
+ }
+ .tag.lang-go {
+ background: #00add8;
+ }
+ .tag.lang-ts {
+ background: #3178c6;
+ color: #fff;
+ }
+ .tag.lang-python {
+ background: #3572a5;
+ color: #fff;
+ }
+
+ .tag.tool-zed {
+ background: #084ccf;
+ color: #fff;
+ }
+ .tag.tool-neovim {
+ background: #57a143;
+ }
+ .tag.tool-opencode {
+ background: #af5faf;
+ color: #fff;
+ }
+ .tag.tool-linux {
+ background: #f7c94c;
+ }
+ .tag.tool-fish {
+ background: #d78700;
+ }
+ .tag.tool-ghostty {
+ background: #8b5cf6;
+ color: #fff;
+ }
+
+ .tag.interest-lowlevel {
+ background: #d75f5f;
+ color: #fff;
+ }
+ .tag.interest-tui {
+ background: #5faf5f;
+ color: #0d0d0d;
+ }
+ .tag.interest-embedded {
+ background: #5fafaf;
+ color: #0d0d0d;
+ }
+ .tag.interest-unix {
+ background: #d7af5f;
+ color: #0d0d0d;
+ }
+
+ .tag.tech-temporal {
+ background: #4c35c9;
+ color: #fff;
+ }
+ .tag.tech-postgres {
+ background: #336791;
+ color: #fff;
+ }
+ .tag.tech-pytorch {
+ background: #ee4c2c;
+ color: #fff;
+ }
+ .tag.tech-cuda {
+ background: #76b900;
+ }
+ .tag.tech-docker {
+ background: #2496ed;
+ color: #fff;
+ }
+ .tag.tech-kafka {
+ background: #4c35c9;
+ color: #fff;
+ }
+ .tag.tech-rn {
+ background: #61dafb;
+ }
+ .tag.tech-supabase {
+ background: #3ecf8e;
+ }
+
+ @media (max-width: 768px) {
+ body {
+ font-size: 13px;
+ overflow-y: auto;
+ }
+
+ #app {
+ display: flex;
+ flex-direction: column;
+ min-height: 100vh;
+ height: auto;
+ }
+
+ #content {
+ flex: 1;
+ overflow: visible;
+ }
+
+ .page {
+ height: auto;
+ min-height: calc(100vh - 60px - 24px);
+ }
+
+ .page.active {
+ display: block;
+ }
+ }
+
+ /* Boot Animation */
+ #boot-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100vw;
+ height: 100vh;
+ background: var(--bg);
+ z-index: 9999;
+ display: flex;
+ align-items: flex-start;
+ justify-content: flex-start;
+ padding: 20px;
+ overflow: hidden;
+ }
+
+ #boot-overlay.fade-out {
+ animation: bootFadeOut 0.6s ease-out forwards;
+ }
+
+ .boot-scanline {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: linear-gradient(
+ to bottom,
+ transparent 50%,
+ rgba(0, 0, 0, 0.1) 50%
+ );
+ background-size: 100% 4px;
+ pointer-events: none;
+ opacity: 0.3;
+ z-index: 1;
+ }
+
+ .boot-terminal {
+ font-family: "JetBrains Mono", monospace;
+ font-size: 14px;
+ color: var(--fg);
+ line-height: 1.6;
+ position: relative;
+ z-index: 2;
+ }
+
+ .boot-content {
+ white-space: pre-wrap;
+ }
+
+ .boot-line {
+ transition:
+ opacity 0.15s ease-out,
+ transform 0.15s ease-out;
+ }
+
+ .boot-line-hidden {
+ opacity: 0;
+ transform: translateX(-10px);
+ }
+
+ .boot-line-visible {
+ opacity: 1;
+ transform: translateX(0);
+ }
+
+ .boot-cursor {
+ display: inline;
+ animation: blink 0.7s step-end infinite;
+ color: #ffffff;
+ }
+
+ .boot-progress {
+ margin-top: 16px;
+ width: 200px;
+ height: 4px;
+ background: var(--border);
+ border-radius: 2px;
+ overflow: hidden;
+ }
+
+ .boot-progress-bar {
+ height: 100%;
+ width: 0;
+ background: linear-gradient(90deg, var(--cyan), var(--accent));
+ animation: progressFill 1s ease-out forwards;
+ }
+
+ @keyframes progressFill {
+ 0% {
+ width: 0;
+ }
+ 100% {
+ width: 100%;
+ }
+ }
+
+ /* ANSI colors */
+ .ansi-bold-yellow {
+ color: #d7af5f;
+ font-weight: bold;
+ }
+
+ .ansi-bold-cyan {
+ color: #5fafaf;
+ font-weight: bold;
+ }
+
+ .ansi-accent {
+ color: var(--accent);
+ font-weight: bold;
+ }
+
+ .ansi-bold-accent {
+ color: var(--accent);
+ font-weight: bold;
+ }
+
+ .ansi-bold-green {
+ color: #5faf5f;
+ font-weight: bold;
+ }
+
+ .ansi-white {
+ color: #e0e0e0;
+ }
+
+ .ansi-dim {
+ color: #606060;
+ }
+
+ /* Color blocks for neofetch */
+ .ansi-block-black {
+ background: #0d0d0d;
+ }
+ .ansi-block-red {
+ background: #d75f5f;
+ }
+ .ansi-block-green {
+ background: #5faf5f;
+ }
+ .ansi-block-yellow {
+ background: #d7af5f;
+ }
+ .ansi-block-blue {
+ background: #5f87d7;
+ }
+ .ansi-block-magenta {
+ background: #af5faf;
+ }
+ .ansi-block-cyan {
+ background: #5fafaf;
+ }
+ .ansi-block-white {
+ background: #c0c0c0;
+ }
+
+ @keyframes blink {
+ 0%,
+ 100% {
+ opacity: 1;
+ }
+ 50% {
+ opacity: 0;
+ }
+ }
+
+ @keyframes bootFadeOut {
+ 0% {
+ opacity: 1;
+ }
+ 100% {
+ opacity: 0;
+ }
+ }
+
+ #app.boot-reveal {
+ animation: revealContent 0.5s ease-out;
+ }
+
+ @keyframes revealContent {
+ 0% {
+ opacity: 0;
+ transform: translateY(15px);
+ }
+ 100% {
+ opacity: 1;
+ transform: translateY(0);
+ }
+ }
+</style>
diff --git a/web/src/lib/blogs.ts b/web/src/lib/blogs.ts
@@ -0,0 +1,52 @@
+import matter from "gray-matter";
+import { parseMarkdown } from "./readme/render";
+import type BlogPost from "./types/blog";
+
+const blogModules = import.meta.glob<string>("../../blogs/*.md", {
+ eager: true,
+ query: "?raw",
+ import: "default",
+});
+
+const blogs = Object.values(blogModules)
+ .map((raw) => {
+ const { data, content } = matter(raw);
+
+ const blog: Partial<BlogPost> = {
+ id: data.id as string | undefined,
+ title: data.title as string | undefined,
+ description: data.description as string | undefined,
+ date:
+ data.date instanceof Date
+ ? data.date.toISOString().split("T")[0]
+ : (data.date as string | undefined),
+ modifiedDate: data.modifiedDate
+ ? data.modifiedDate instanceof Date
+ ? data.modifiedDate.toISOString().split("T")[0]
+ : (data.modifiedDate as string)
+ : undefined,
+ url: data.url as string | undefined,
+ content: parseMarkdown(content),
+ image: data.image as string | undefined,
+ tags: data.tags as string[] | undefined,
+ };
+
+ const missingKeys = ["id", "title", "description", "date"].filter(
+ (key) => !blog[key as keyof typeof blog],
+ );
+ if (missingKeys.length > 0) {
+ throw new Error(`Missing keys: ${missingKeys.join(", ")}`);
+ }
+
+ if (blog.url && blog.content) {
+ throw new Error("Blogs cannot have both a URL and content");
+ } else if (!blog.url && !blog.content) {
+ throw new Error("Blogs must have either a URL or content");
+ }
+
+ return blog as BlogPost;
+ })
+ .filter((blog) => blog.id && blog.title)
+ .sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime());
+
+export default blogs satisfies BlogPost[];
diff --git a/web/src/lib/readme/fetch.ts b/web/src/lib/readme/fetch.ts
@@ -0,0 +1,132 @@
+import { parseMarkdown, removeFirstH1 } from "./render";
+
+export async function fetchAllReadmes(): Promise<Record<string, string>> {
+ const readmes: Record<string, string> = {};
+
+ const results = await Promise.allSettled(
+ README_CONFIGS.map(async (config) => {
+ const result = await fetchWithFallback(config.sources);
+ if (result) {
+ const fixed = fixRelativePaths(result.content, result.baseUrl);
+ const html = parseMarkdown(removeFirstH1(fixed));
+ return { name: config.name, html };
+ }
+ return { name: config.name, html: "" };
+ }),
+ );
+
+ for (const result of results) {
+ if (result.status === "fulfilled" && result.value.html) {
+ readmes[result.value.name] = result.value.html;
+ }
+ }
+
+ return readmes;
+}
+
+export async function fetchReadmeForProject(
+ projectId: string,
+): Promise<string | null> {
+ const config = README_CONFIGS.find((c) => c.name === projectId);
+ if (!config) return null;
+
+ const result = await fetchWithFallback(config.sources);
+ if (result) {
+ const fixed = fixRelativePaths(result.content, result.baseUrl);
+ return parseMarkdown(removeFirstH1(fixed));
+ }
+ return null;
+}
+
+async function fetchWithFallback(sources: ReadmeSource[]): Promise<{
+ content: string;
+ baseUrl: string;
+} | null> {
+ for (const source of sources) {
+ try {
+ const response = await fetch(source.url, {
+ headers: { "User-Agent": "prime8dev-portfolio" },
+ });
+ if (response.ok) {
+ return {
+ content: await response.text(),
+ baseUrl: source.baseUrl,
+ };
+ }
+ } catch {
+ // Try next source
+ }
+ }
+ return null;
+}
+
+function fixRelativePaths(markdown: string, baseUrl: string): string {
+ // Fix relative image paths:  -> 
+ let fixed = markdown.replace(
+ /!\[([^\]]*)\]\(\.\/([^)]+)\)/g,
+ ``,
+ );
+
+ // Fix relative link paths (not images): [text](./path) -> [text](baseUrl/path)
+ fixed = fixed.replace(
+ /(?<!!)\[([^\]]+)\]\(\.\/([^)]+)\)/g,
+ `[$1](${baseUrl}/$2)`,
+ );
+
+ return fixed;
+}
+
+interface ReadmeConfig {
+ name: string;
+ sources: ReadmeSource[];
+}
+
+interface ReadmeSource {
+ url: string;
+ baseUrl: string;
+}
+
+const README_CONFIGS: ReadmeConfig[] = [
+ {
+ name: "janitor",
+ sources: [
+ {
+ url: "https://git.prime8.dev/moncheeta/janitor/-/raw/master/README.md",
+ baseUrl: "https://git.prime8.dev/moncheeta/janitor/-/raw/master",
+ },
+ ],
+ },
+ {
+ name: "summarizer",
+ sources: [
+ {
+ url: "https://git.prime8.dev/moncheeta/summarizer/-/raw/master/README.md",
+ baseUrl: "https://git.prime8.dev/moncheeta/summarizer/-/raw/master",
+ },
+ ],
+ },
+ {
+ name: "finger",
+ sources: [
+ {
+ url: "https://git.prime8.dev/moncheeta/finger/-/raw/master/README.md",
+ baseUrl: "https://git.prime8.dev/moncheeta/finger/-/raw/master",
+ },
+ ],
+ },
+ {
+ name: "computer-science-club",
+ sources: [
+ {
+ url: "https://raw.githubusercontent.com/moncheeta/computer-science-club/main/README.md",
+ baseUrl:
+ "https://cdn.jsdelivr.net/gh/moncheeta/computer-science-club@main",
+ },
+ {
+ url: "https://raw.githubusercontent.com/moncheeta/computer-science-club/master/README.md",
+ baseUrl:
+ "https://cdn.jsdelivr.net/gh/moncheeta/computer-science-club@master",
+ },
+ ],
+ },
+];
diff --git a/web/src/lib/readme/render.ts b/web/src/lib/readme/render.ts
@@ -0,0 +1,149 @@
+import { marked } from "marked";
+import type { Tokens, RendererThis } from "marked";
+
+export function parseMarkdown(markdown: string): string {
+ return marked.parse(markdown) as string;
+}
+
+export function removeFirstH1(markdown: string): string {
+ return markdown.replace(/^#\s+.+\n+/, "");
+}
+
+const renderer = {
+ heading(this: RendererThis, token: Tokens.Heading): string {
+ const level = token.depth;
+ const tag = `h${level + 1}`;
+ const text = this.parser.parseInline(token.tokens);
+ return `<${tag} class="readme-h${level}">${text}</${tag}>`;
+ },
+
+ code(token: Tokens.Code): string {
+ const escaped = token.text.replace(/</g, "<").replace(/>/g, ">");
+ return `<pre class="readme-code"><code>${escaped}</code></pre>`;
+ },
+
+ codespan(token: Tokens.Codespan): string {
+ const escaped = token.text.replace(/</g, "<").replace(/>/g, ">");
+ return `<code class="readme-inline-code">${escaped}</code>`;
+ },
+
+ link(this: RendererThis, token: Tokens.Link): string {
+ const text = this.parser.parseInline(token.tokens);
+ return `<a href="${token.href}" target="_blank" rel="noopener noreferrer" class="readme-link">${text}</a>`;
+ },
+
+ image(token: Tokens.Image): string {
+ return `<img src="${token.href}" alt="${token.text || ""}" class="readme-img" loading="lazy" />`;
+ },
+
+ list(this: RendererThis, token: Tokens.List): string {
+ function renderList(
+ parser: RendererThis["parser"],
+ token: Tokens.List,
+ ): string {
+ const tag = token.ordered ? "ol" : "ul";
+ const items = token.items
+ .map((item) => {
+ let content = "";
+ for (const tok of item.tokens) {
+ if (tok.type === "paragraph" && "tokens" in tok && tok.tokens) {
+ content += parser.parseInline(tok.tokens as Tokens.Generic[]);
+ } else if (tok.type === "text") {
+ const textToken = tok as Tokens.Text;
+ if (textToken.tokens && textToken.tokens.length > 0) {
+ content += parser.parseInline(textToken.tokens);
+ } else {
+ const inlineTokens = marked.lexer(
+ textToken.raw || textToken.text,
+ { gfm: true },
+ );
+ if (
+ inlineTokens.length > 0 &&
+ inlineTokens[0].type === "paragraph" &&
+ "tokens" in inlineTokens[0]
+ ) {
+ content += parser.parseInline(
+ (inlineTokens[0] as Tokens.Paragraph).tokens,
+ );
+ } else {
+ content += textToken.text || "";
+ }
+ }
+ } else if (tok.type === "list") {
+ content += renderList(parser, tok as Tokens.List);
+ } else {
+ content += parser.parse([tok as Tokens.Generic]);
+ }
+ }
+ return `<li>${content}</li>`;
+ })
+ .join("");
+ return `<${tag} class="readme-list">${items}</${tag}>`;
+ }
+
+ return renderList(this.parser, token);
+ },
+
+ paragraph(this: RendererThis, token: Tokens.Paragraph): string {
+ const text = this.parser.parseInline(token.tokens);
+ return `<p class="readme-p">${text}</p>`;
+ },
+
+ table(this: RendererThis, token: Tokens.Table): string {
+ const headerCells = token.header
+ .map((h) => {
+ const text = this.parser.parseInline(h.tokens as Tokens.Generic[]);
+ return `<th>${text}</th>`;
+ })
+ .join("");
+ const bodyRows = token.rows
+ .map((row) => {
+ const cells = row
+ .map((cell) => {
+ const text = this.parser.parseInline(
+ cell.tokens as Tokens.Generic[],
+ );
+ return `<td>${text}</td>`;
+ })
+ .join("");
+ return `<tr>${cells}</tr>`;
+ })
+ .join("");
+ return `<table class="readme-table"><thead><tr>${headerCells}</tr></thead><tbody>${bodyRows}</tbody></table>`;
+ },
+
+ blockquote(this: RendererThis, token: Tokens.Blockquote): string {
+ const text = this.parser.parse(token.tokens);
+ return `<blockquote class="readme-blockquote">${text}</blockquote>`;
+ },
+
+ hr(): string {
+ return "<hr />";
+ },
+
+ strong(this: RendererThis, token: Tokens.Strong): string {
+ const text = this.parser.parseInline(token.tokens);
+ return `<strong>${text}</strong>`;
+ },
+
+ em(this: RendererThis, token: Tokens.Em): string {
+ const text = this.parser.parseInline(token.tokens);
+ return `<em>${text}</em>`;
+ },
+
+ del(this: RendererThis, token: Tokens.Del): string {
+ const text = this.parser.parseInline(token.tokens);
+ return `<del>${text}</del>`;
+ },
+
+ text(token: Tokens.Text | Tokens.Escape): string {
+ return token.text;
+ },
+};
+
+marked.use({ renderer });
+
+marked.setOptions({
+ gfm: true,
+ breaks: true,
+});
diff --git a/web/src/lib/schemas/blog.ts b/web/src/lib/schemas/blog.ts
@@ -0,0 +1,61 @@
+import type Blog from "../types/blog";
+import personSchema from "./person";
+import { URL } from "../../constants/website";
+
+export function getSchemaForBlog(blog: Blog) {
+ const schema: Record<string, unknown> = {
+ "@context": "https://schema.org",
+ "@type": "BlogPosting",
+ headline: blog.title,
+ description: blog.description,
+ datePublished: blog.date,
+ dateModified: blog.modifiedDate || blog.date,
+ url: `${URL}/blog/${blog.id}`,
+ author: personSchema,
+ publisher: personSchema,
+ mainEntityOfPage: {
+ "@type": "WebPage",
+ "@id": `${URL}/blog/${blog.id}`,
+ },
+ articleSection: "Technology",
+ };
+
+ if (blog.image) {
+ schema.image = blog.image.startsWith("http")
+ ? blog.image
+ : `${URL}${blog.image}`;
+ }
+
+ if (blog.tags && blog.tags.length > 0) {
+ schema.keywords = blog.tags.join(", ");
+ }
+
+ return schema;
+}
+
+export function getBreadcrumbSchema(blog: Blog) {
+ return {
+ "@context": "https://schema.org",
+ "@type": "BreadcrumbList",
+ itemListElement: [
+ {
+ "@type": "ListItem",
+ position: 1,
+ name: "Home",
+ item: URL,
+ },
+ {
+ "@type": "ListItem",
+ position: 2,
+ name: "Blog",
+ item: `${URL}/#blog`,
+ },
+ {
+ "@type": "ListItem",
+ position: 3,
+ name: blog.title,
+ item: `${URL}/blog/${blog.id}`,
+ },
+ ],
+ };
+}
diff --git a/web/src/lib/schemas/experience.ts b/web/src/lib/schemas/experience.ts
@@ -0,0 +1,54 @@
+import type Experience from "../types/experience";
+import personSchema from "./person";
+import { URL } from "../../constants/website";
+
+export function getSchemaForExperience(experience: Experience) {
+ return {
+ "@context": "https://schema.org",
+ "@type": "Person",
+ name: personSchema.name,
+ url: personSchema.url,
+ worksFor: {
+ "@type": "Organization",
+ name: experience.company,
+ url: experience.url,
+ },
+ hasOccupation: {
+ "@type": "Occupation",
+ name: experience.role,
+ startDate: experience.startDate,
+ ...(experience.endDate && { endDate: experience.endDate }),
+ occupationLocation: {
+ "@type": "City",
+ name: "Remote",
+ },
+ },
+ };
+}
+
+export function getBreadcrumbSchema(experience: Experience) {
+ return {
+ "@context": "https://schema.org",
+ "@type": "BreadcrumbList",
+ itemListElement: [
+ {
+ "@type": "ListItem",
+ position: 1,
+ name: "Home",
+ item: URL,
+ },
+ {
+ "@type": "ListItem",
+ position: 2,
+ name: "Experience",
+ item: `${URL}/#experience`,
+ },
+ {
+ "@type": "ListItem",
+ position: 3,
+ name: experience.company,
+ item: `${URL}/experience/${experience.id}`,
+ },
+ ],
+ };
+}
diff --git a/web/src/lib/schemas/person.ts b/web/src/lib/schemas/person.ts
@@ -0,0 +1,24 @@
+import about from "../../../config/about.json";
+import currentJob from "../utils/job";
+import contact from "../../../config/contact.json";
+import { URL } from "../../constants/website";
+
+export default {
+ "@context": "https://schema.org",
+ "@type": "Person",
+ name: about.name,
+ alternateName: about.handle,
+ email: contact.email,
+ sameAs: [contact.gitlab, contact.linkedin],
+ url: URL,
+ image: `${URL}/me.jpg`,
+ ...(currentJob && {
+ jobTitle: currentJob.role,
+ worksFor: {
+ "@type": "Organization",
+ name: currentJob.company,
+ url: currentJob.url,
+ },
+ }),
+ knowsAbout: [...about.interests],
+};
diff --git a/web/src/lib/schemas/project.ts b/web/src/lib/schemas/project.ts
@@ -0,0 +1,45 @@
+import type Project from "../types/project";
+import personSchema from "./person";
+import { URL } from "../../constants/website";
+
+export function getSchemaForProject(project: Project) {
+ return {
+ "@context": "https://schema.org",
+ "@type": "SoftwareSourceCode",
+ name: project.name,
+ description: project.subtitle,
+ url: `${URL}/projects/${project.id}`,
+ codeRepository: project.url,
+ programmingLanguage: project.tech,
+ author: personSchema,
+ ...(project.dateCreated && { dateCreated: project.dateCreated }),
+ ...(project.dateModified && { dateModified: project.dateModified }),
+ };
+}
+
+export function getBreadcrumbSchema(project: Project) {
+ return {
+ "@context": "https://schema.org",
+ "@type": "BreadcrumbList",
+ itemListElement: [
+ {
+ "@type": "ListItem",
+ position: 1,
+ name: "Home",
+ item: URL,
+ },
+ {
+ "@type": "ListItem",
+ position: 2,
+ name: "Projects",
+ item: `${URL}/#projects`,
+ },
+ {
+ "@type": "ListItem",
+ position: 3,
+ name: project.name,
+ item: `${URL}/projects/${project.id}`,
+ },
+ ],
+ };
+}
diff --git a/web/src/lib/schemas/website.ts b/web/src/lib/schemas/website.ts
@@ -0,0 +1,13 @@
+import about from "../../../config/about.json";
+import { URL } from "../../constants/website";
+import currentJob from "../utils/job";
+import personSchema from "./person";
+
+export default {
+ "@context": "https://schema.org",
+ "@type": "WebSite",
+ name: about.name,
+ url: URL,
+ description: `Portfolio and blog of ${about.name}, a ${about.profession.toLowerCase()}${currentJob?.company ? ` at ${currentJob.company}` : ""}. ${about.bio}.`,
+ author: personSchema,
+};
diff --git a/web/src/lib/types/about.ts b/web/src/lib/types/about.ts
@@ -0,0 +1,11 @@
+export default interface About {
+ name: string;
+ handle: string;
+ bio: string;
+ location: string;
+ school?: string;
+ graduating?: string;
+ languages: string[];
+ interests: string[];
+ tools: string[];
+}
diff --git a/web/src/lib/types/blog.ts b/web/src/lib/types/blog.ts
@@ -0,0 +1,11 @@
+export default interface Blog {
+ id: string;
+ title: string;
+ description: string;
+ date: string;
+ modifiedDate?: string;
+ content?: string;
+ url?: string;
+ image?: string;
+ tags?: string[];
+}
diff --git a/web/src/lib/types/contact.ts b/web/src/lib/types/contact.ts
@@ -0,0 +1,5 @@
+export default interface Contact {
+ email: string;
+ gitlab: string;
+ linkedin: string;
+}
diff --git a/web/src/lib/types/experience.ts b/web/src/lib/types/experience.ts
@@ -0,0 +1,13 @@
+export default interface Experience {
+ id: string;
+ company: string;
+ role: string;
+ startDate: string;
+ endDate?: string;
+ description: string[];
+ tech: string[];
+ url: string;
+ logo: string;
+ logoFilter?: string;
+ images?: string[];
+}
diff --git a/web/src/lib/types/project.ts b/web/src/lib/types/project.ts
@@ -0,0 +1,9 @@
+export default interface Project {
+ id: string;
+ name: string;
+ subtitle: string;
+ tech: string[];
+ url: string;
+ dateCreated?: string;
+ dateModified?: string;
+}
diff --git a/web/src/lib/utils/duration.ts b/web/src/lib/utils/duration.ts
@@ -0,0 +1,11 @@
+export function formatDuration(seconds: number): string {
+ const hours = Math.floor(seconds / 3600);
+ const minutes = Math.floor((seconds % 3600) / 60);
+
+ if (hours > 0) {
+ return `${hours}h ${minutes}m`;
+ } else if (minutes > 0) {
+ return `${minutes}m`;
+ }
+ return "0m";
+}
diff --git a/web/src/lib/utils/job.ts b/web/src/lib/utils/job.ts
@@ -0,0 +1,8 @@
+import rawExperiences from "../../../config/experience.json";
+import type Experience from "../types/experience";
+
+const experiences = rawExperiences as Experience[];
+
+const currentJob = experiences.find((exp) => !exp.endDate) || null;
+
+export default currentJob;
diff --git a/web/src/lib/utils/period.ts b/web/src/lib/utils/period.ts
@@ -0,0 +1,37 @@
+export function formatPeriod(startDate: string, endDate?: string): string {
+ const months = [
+ "Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "May",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Oct",
+ "Nov",
+ "Dec",
+ ];
+ const [startYear, startMonth] = startDate.split("-").map(Number);
+ const startStr = `${months[startMonth - 1]} ${startYear}`;
+
+ if (!endDate) {
+ const totalMonths = calculateMonths(startDate);
+ return `${startStr} – Present (${totalMonths} mos)`;
+ }
+
+ const [endYear, endMonth] = endDate.split("-").map(Number);
+ const endStr = `${months[endMonth - 1]} ${endYear}`;
+ const totalMonths = calculateMonths(startDate, endDate);
+ return `${startStr} – ${endStr} (${totalMonths} mos)`;
+}
+
+export function calculateMonths(startDate: string, endDate?: string): number {
+ const [startYear, startMonth] = startDate.split("-").map(Number);
+ const end = endDate
+ ? endDate.split("-").map(Number)
+ : [new Date().getFullYear(), new Date().getMonth() + 1];
+ const [endYear, endMonth] = end;
+ return (endYear - startYear) * 12 + (endMonth - startMonth) + 1;
+}
diff --git a/web/src/lib/utils/tags.ts b/web/src/lib/utils/tags.ts
@@ -0,0 +1,12 @@
+import { TAG_CLASS_MAP, TECH_ABBREVIATIONS } from "../../constants/tags";
+
+export function getTagClass(tag: string): string {
+ return TAG_CLASS_MAP[tag] || "";
+}
+
+export function getTechMeta(tech: string[]): string {
+ return tech
+ .slice(0, 2)
+ .map((t) => TECH_ABBREVIATIONS[t] || t)
+ .join(", ");
+}
diff --git a/web/src/lib/wakatime.ts b/web/src/lib/wakatime.ts
@@ -0,0 +1,159 @@
+import { DAY_NAMES, MONTH_NAMES } from "../constants/calendar";
+import { formatDuration } from "./utils/duration";
+
+const WAKATIME_API_BASE = "https://wakatime.com/api/v1";
+
+const WAKATIME_API_KEY = import.meta.env.WAKATIME_API_KEY;
+
+export interface WakaTimeData {
+ allTimeStats: AllTimeStats | null;
+ weeklyStats: WeeklyStats | null;
+}
+
+export async function fetchWakaTimeData(): Promise<WakaTimeData | null> {
+ if (!WAKATIME_API_KEY) {
+ return null;
+ }
+
+ try {
+ const [allTimeStats, weeklyStats] = await Promise.all([
+ fetchAllTimeStats(),
+ fetchWeeklyStats(),
+ ]);
+
+ return { allTimeStats, weeklyStats };
+ } catch (error) {
+ console.error("Failed to fetch WakaTime data:", error);
+ return null;
+ }
+}
+
+export interface AllTimeStats {
+ totalText: string;
+ dailyAverageText: string;
+}
+
+export async function fetchAllTimeStats(): Promise<AllTimeStats | null> {
+ try {
+ const [statsResponse, languagesResponse] = [
+ await fetch(`${WAKATIME_API_BASE}/users/current/all_time_since_today`, {
+ headers: {
+ Authorization: `Basic ${Buffer.from(WAKATIME_API_KEY).toString("base64")}`,
+ },
+ }),
+ await fetch(`${WAKATIME_API_BASE}/users/current/stats/last_year`, {
+ headers: {
+ Authorization: `Basic ${Buffer.from(WAKATIME_API_KEY).toString("base64")}`,
+ },
+ }),
+ ];
+ if ([statsResponse, languagesResponse].some((r) => !r.ok)) {
+ return null;
+ }
+
+ const [statsData, langData] = await Promise.all(
+ [statsResponse, languagesResponse].map((r) => r.json()),
+ );
+
+ let dailyAverageText = "1 hr";
+ if (langData.data?.daily_average_including_other_language) {
+ const avgSeconds = langData.data.daily_average_including_other_language;
+ dailyAverageText = formatDuration(avgSeconds);
+ }
+
+ const totalSeconds = statsData.data?.total_seconds || 0;
+ const totalHours = Math.floor(totalSeconds / 3600);
+ const totalText = `${totalHours.toLocaleString()}+ hrs coded`;
+
+ return {
+ totalText,
+ dailyAverageText,
+ };
+ } catch (error) {
+ console.error("Failed to fetch WakaTime stats:", error);
+ return null;
+ }
+}
+
+export interface WeeklyStats {
+ totalText: string;
+ days: DailyEntry[];
+}
+
+export interface DailyEntry {
+ dayText: string; // e.g., "Mon", "Tue"
+ dateText: string; // e.g., "Jan 10"
+ timeText: string; // e.g., "2 hrs 30 mins"
+ barWidthPercent: string; // e.g., "75%"
+}
+
+export async function fetchWeeklyStats(): Promise<WeeklyStats | null> {
+ try {
+ const start = new Date();
+ start.setDate(start.getDate() - 6); // 7 days including today
+ const end = new Date();
+
+ const formatDate = (d: Date) => d.toISOString().split("T")[0];
+
+ const response = await fetch(
+ `${WAKATIME_API_BASE}/users/current/summaries?start=${formatDate(start)}&end=${formatDate(end)}`,
+ {
+ headers: {
+ Authorization: `Basic ${Buffer.from(WAKATIME_API_KEY).toString("base64")}`,
+ },
+ },
+ );
+
+ if (!response.ok) {
+ console.error("WakaTime weekly stats error:", response.status);
+ return null;
+ }
+
+ const { data } = await response.json();
+
+ let totalSeconds = 0;
+ let maxMinutes = 0;
+
+ const minutesPerDay: number[] = [];
+ const days: DailyEntry[] = (data || []).map(
+ (
+ {
+ range,
+ grand_total,
+ }: {
+ range: { date: string };
+ grand_total: { total_seconds?: number };
+ },
+ i: number,
+ ) => {
+ const date = new Date(range.date);
+ const dayText = DAY_NAMES[date.getUTCDay()].slice(0, 3);
+ const dateText = `${MONTH_NAMES[date.getUTCMonth()].slice(0, 3)} ${date.getUTCDate()}`;
+
+ const seconds = grand_total?.total_seconds || 0;
+ totalSeconds += seconds;
+
+ const totalMinutes = Math.floor(seconds / 60);
+ minutesPerDay[i] = totalMinutes;
+ if (totalMinutes > maxMinutes) maxMinutes = totalMinutes;
+
+ const timeText = formatDuration(seconds);
+
+ return { dayText, dateText, timeText, barWidthPercent: "0%" };
+ },
+ );
+
+ const effectiveMax = maxMinutes || 1;
+ for (let i = 0; i < days.length; i++) {
+ days[i].barWidthPercent =
+ `${Math.round((minutesPerDay[i] / effectiveMax) * 100)}%`;
+ }
+
+ const totalText = formatDuration(totalSeconds);
+
+ return { totalText, days };
+ } catch (error) {
+ console.error("Failed to fetch weekly stats:", error);
+ return null;
+ }
+}
diff --git a/web/src/pages/404.astro b/web/src/pages/404.astro
@@ -0,0 +1,78 @@
+---
+import Layout from "../layouts/Layout.astro";
+import about from "../../config/about.json";
+import { URL } from "../constants/website";
+---
+
+<Layout
+ title={`404 - Page Not Found | ${about.name}`}
+ description="The page you're looking for doesn't exist."
+ type="website"
+ url={`${URL}/404`}
+>
+ <main class="error-page">
+ <div class="error-content">
+ <h1>404</h1>
+ <p class="error-message">Page not found</p>
+ <p class="error-description">
+ The page you're looking for doesn't exist or has been moved.
+ </p>
+ <a href="/" class="home-link">← Return home</a>
+ </div>
+ </main>
+</Layout>
+
+<style>
+ .error-page {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ min-height: 100vh;
+ padding: 24px;
+ }
+
+ .error-content {
+ text-align: center;
+ }
+
+ h1 {
+ font-size: 72px;
+ font-weight: 400;
+ color: var(--accent);
+ margin-bottom: 8px;
+ }
+
+ .error-message {
+ font-size: 24px;
+ color: var(--fg);
+ margin-bottom: 16px;
+ }
+
+ .error-description {
+ color: var(--fg-dim);
+ margin-bottom: 32px;
+ }
+
+ .home-link {
+ display: inline-block;
+ color: var(--light-blue);
+ padding: 8px 16px;
+ border: 1px solid var(--border);
+ transition: border-color 0.2s;
+ }
+
+ .home-link:hover {
+ border-color: var(--light-blue);
+ opacity: 1;
+ }
+
+ @media (max-width: 768px) {
+ h1 {
+ font-size: 48px;
+ }
+
+ .error-message {
+ font-size: 18px;
+ }
+ }
+</style>
diff --git a/web/src/pages/blog/[slug].astro b/web/src/pages/blog/[slug].astro
@@ -0,0 +1,77 @@
+---
+import Layout from "../../layouts/Layout.astro";
+import BlogArticle from "../../components/Article.astro";
+import blogs from "../../lib/blogs";
+import { getSchemaForBlog, getBreadcrumbSchema } from "../../lib/schemas/blog";
+
+const blog = blogs.find((blog) => blog.id === Astro.params.slug);
+if (!blog) {
+ return new Response(null, {
+ status: 404,
+ statusText: "Not Found",
+ });
+}
+
+const keywords = blog.tags?.join(", ");
+---
+
+<Layout
+ title={`${blog.title} | Damian Myrda`}
+ description={blog.description}
+ type="article"
+ url={`https://prime8.dev/blog/${blog.id}`}
+ publishedTime={blog.date}
+ modifiedTime={blog.modifiedDate || blog.date}
+ keywords={keywords}
+ image={blog.image}
+>
+ <main id="content">
+ <div class="blog-page">
+ <BlogArticle blog={blog} />
+ </div>
+ <div id="blog-data" data-blog-id={blog.id}></div>
+ <script
+ type="application/ld+json"
+ set:html={JSON.stringify(getSchemaForBlog(blog))}
+ />
+ <script
+ type="application/ld+json"
+ set:html={JSON.stringify(getBreadcrumbSchema(blog))}
+ />
+ </main>
+</Layout>
+
+<script>
+ document.getElementById("app")?.classList.add("ready");
+</script>
+
+<style>
+ :global(body) {
+ overflow: auto;
+ }
+
+ :global(#app) {
+ height: auto;
+ min-height: 100vh;
+ }
+
+ :global(#content) {
+ overflow: visible;
+ }
+
+ .blog-page {
+ max-width: 720px;
+ margin: 0 auto;
+ padding: 40px 24px;
+ min-height: 100vh;
+ }
+</style>
+
+<script>
+ import { setCurrentBlogId } from "../../scripts/ui/state";
+
+ document.addEventListener("DOMContentLoaded", () => {
+ const blogId = document.getElementById("blog-data")?.dataset.blogId;
+ if (blogId) setCurrentBlogId(blogId);
+ });
+</script>
diff --git a/web/src/pages/experience/[id].astro b/web/src/pages/experience/[id].astro
@@ -0,0 +1,309 @@
+---
+import Layout from "../../layouts/Layout.astro";
+import rawExperience from "../../../config/experience.json";
+import type Experience from "../../lib/types/experience";
+import { URL } from "../../constants/website";
+import { getTagClass } from "../../lib/utils/tags";
+import {
+ getSchemaForExperience,
+ getBreadcrumbSchema,
+} from "../../lib/schemas/experience";
+
+const experiences = rawExperience as Experience[];
+const experience = experiences.find((e) => e.id === Astro.params.id);
+
+if (!experience) {
+ return new Response(null, {
+ status: 404,
+ statusText: "Not Found",
+ });
+}
+
+function formatDate(dateStr: string): string {
+ const [year, month] = dateStr.split("-");
+ const date = new Date(parseInt(year), parseInt(month) - 1);
+ return date.toLocaleDateString("en-US", { month: "short", year: "numeric" });
+}
+
+const dateRange = experience.endDate
+ ? `${formatDate(experience.startDate)} - ${formatDate(experience.endDate)}`
+ : `${formatDate(experience.startDate)} - Present`;
+
+const keywords = [...experience.tech, experience.company, experience.role].join(
+ ", ",
+);
+const description = `${experience.role} at ${experience.company}. ${experience.description[0]}`;
+---
+
+<Layout
+ title={`${experience.company} - ${experience.role} | Damian Myrda`}
+ description={description}
+ type="website"
+ url={`${URL}/experience/${experience.id}`}
+ keywords={keywords}
+ image={experience.logo}
+>
+ <main id="content">
+ <div class="experience-page">
+ <a href="/#experience" class="back-btn">← Back to experience</a>
+
+ <header class="experience-header">
+ <div class="header-top">
+ <div class="company-info">
+ {
+ experience.logo && (
+ <img
+ src={experience.logo}
+ alt={`${experience.company} logo`}
+ class={`company-logo ${experience.logoFilter || ""}`}
+ width="48"
+ height="48"
+ />
+ )
+ }
+ <div>
+ <h1>{experience.company}</h1>
+ <p class="role">{experience.role}</p>
+ </div>
+ </div>
+ <a
+ class="external-link"
+ href={experience.url}
+ target="_blank"
+ rel="noopener noreferrer"
+ >
+ Visit website →
+ </a>
+ </div>
+ <time class="date-range" datetime={experience.startDate}
+ >{dateRange}</time
+ >
+ </header>
+
+ <section class="description">
+ {experience.description.map((paragraph) => <p>{paragraph}</p>)}
+ </section>
+
+ <section class="tech-section">
+ <h2>Technologies</h2>
+ <div class="tech-stack">
+ {
+ experience.tech.map((tech) => (
+ <span class={`tag ${getTagClass(tech)}`}>{tech}</span>
+ ))
+ }
+ </div>
+ </section>
+
+ {
+ experience.images && experience.images.length > 0 && (
+ <section class="images-section">
+ <h2>Photos</h2>
+ <div class="image-grid">
+ {experience.images.map((img, i) => (
+ <img
+ src={img}
+ alt={`${experience.company} photo ${i + 1}`}
+ class="experience-image"
+ loading="lazy"
+ />
+ ))}
+ </div>
+ </section>
+ )
+ }
+ </div>
+ <script
+ type="application/ld+json"
+ set:html={JSON.stringify(getSchemaForExperience(experience))}
+ />
+ <script
+ type="application/ld+json"
+ set:html={JSON.stringify(getBreadcrumbSchema(experience))}
+ />
+ </main>
+</Layout>
+
+<script>
+ document.getElementById("app")?.classList.add("ready");
+</script>
+
+<style>
+ :global(body) {
+ overflow: auto;
+ }
+
+ :global(#app) {
+ height: auto;
+ min-height: 100vh;
+ }
+
+ :global(#content) {
+ overflow: visible;
+ }
+
+ .experience-page {
+ max-width: 800px;
+ margin: 0 auto;
+ padding: 40px 24px;
+ min-height: 100vh;
+ }
+
+ .back-btn {
+ display: inline-block;
+ background: transparent;
+ border: 1px solid var(--border);
+ color: var(--fg-dim);
+ padding: 8px 16px;
+ cursor: pointer;
+ font-family: inherit;
+ font-size: 12px;
+ margin-bottom: 24px;
+ transition: all 0.15s;
+ text-decoration: none;
+ }
+
+ .back-btn:hover {
+ background: var(--bg-alt);
+ color: var(--accent);
+ border-color: var(--accent);
+ }
+
+ .experience-header {
+ margin-bottom: 32px;
+ padding-bottom: 24px;
+ border-bottom: 1px solid var(--border);
+ }
+
+ .header-top {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-start;
+ margin-bottom: 12px;
+ }
+
+ .company-info {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+ }
+
+ .company-logo {
+ width: 48px;
+ height: 48px;
+ object-fit: contain;
+ }
+
+ .company-logo.logo-invert {
+ filter: invert(1);
+ }
+
+ .experience-header h1 {
+ font-size: 28px;
+ font-weight: 500;
+ color: var(--accent);
+ margin: 0;
+ }
+
+ .role {
+ color: var(--fg);
+ font-size: 16px;
+ margin: 4px 0 0 0;
+ }
+
+ .external-link {
+ color: var(--light-blue);
+ text-decoration: none;
+ font-size: 14px;
+ }
+
+ .external-link:hover {
+ opacity: 0.8;
+ }
+
+ .date-range {
+ color: var(--fg-dim);
+ font-size: 14px;
+ }
+
+ .description {
+ margin-bottom: 32px;
+ }
+
+ .description p {
+ color: var(--fg);
+ font-size: 14px;
+ line-height: 1.7;
+ margin-bottom: 12px;
+ }
+
+ .description p:last-child {
+ margin-bottom: 0;
+ }
+
+ .tech-section {
+ margin-bottom: 32px;
+ }
+
+ .tech-section h2,
+ .images-section h2 {
+ font-size: 16px;
+ color: var(--accent);
+ margin-bottom: 12px;
+ font-weight: 500;
+ }
+
+ .tech-stack {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ }
+
+ .images-section {
+ margin-bottom: 32px;
+ }
+
+ .image-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
+ gap: 16px;
+ }
+
+ .experience-image {
+ width: 100%;
+ height: auto;
+ border-radius: 4px;
+ border: 1px solid var(--border);
+ cursor: pointer;
+ transition: transform 0.15s;
+ }
+
+ .experience-image:hover {
+ transform: scale(1.02);
+ }
+
+ @media (max-width: 768px) {
+ .experience-page {
+ padding: 24px 16px;
+ }
+
+ .header-top {
+ flex-direction: column;
+ gap: 16px;
+ }
+
+ .company-info {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 12px;
+ }
+
+ .experience-header h1 {
+ font-size: 22px;
+ }
+
+ .image-grid {
+ grid-template-columns: 1fr;
+ }
+ }
+</style>
diff --git a/web/src/pages/index.astro b/web/src/pages/index.astro
@@ -0,0 +1,63 @@
+---
+import Layout from "../layouts/Layout.astro";
+import { fetchWakaTimeData } from "../lib/wakatime";
+import { fetchAllReadmes } from "../lib/readme/fetch";
+
+import about from "../../config/about.json";
+import currentJob from "../lib/utils/job";
+import personSchema from "../lib/schemas/person";
+import websiteSchema from "../lib/schemas/website";
+import { URL } from "../constants/website";
+
+import Header from "../components/Header.astro";
+import AboutPage from "../components/pages/About.astro";
+import ExperiencePage from "../components/pages/Experience.astro";
+import ProjectsPage from "../components/pages/Projects.astro";
+import BlogPage from "../components/pages/Blog.astro";
+import Footer from "../components/Footer.astro";
+
+const [wakaTimeData, readmes] = await Promise.all([
+ fetchWakaTimeData(),
+ fetchAllReadmes(),
+]);
+---
+
+<Layout
+ title={`${about.name} | ${about.profession_short}`}
+ description={`${about.name} - ${about.profession}${currentJob?.company ? ` at ${currentJob.company}` : ""}`}
+ type="website"
+ url={URL}
+ keywords={[
+ about.name,
+ about.profession,
+ currentJob?.company,
+ about.languages,
+ about.interests,
+ about.school,
+ ]
+ .flat()
+ .filter(Boolean)
+ .join(", ")}
+>
+ <Header />
+
+ <main id="content">
+ <AboutPage wakaTimeData={wakaTimeData} />
+ <ExperiencePage />
+ <ProjectsPage readmes={readmes} />
+ <BlogPage isStandalone={false} />
+ </main>
+
+ <Footer wakaTimeData={wakaTimeData} />
+
+ <script type="application/ld+json" set:html={JSON.stringify(personSchema)} />
+ <script type="application/ld+json" set:html={JSON.stringify(websiteSchema)} />
+</Layout>
+
+<script>
+ import { initUI } from "../scripts/ui/index";
+
+ document.addEventListener("DOMContentLoaded", () => {
+ initUI();
+ });
+</script>
diff --git a/web/src/pages/projects/[id].astro b/web/src/pages/projects/[id].astro
@@ -0,0 +1,275 @@
+---
+import Layout from "../../layouts/Layout.astro";
+import rawProjects from "../../../config/projects.json";
+import type Project from "../../lib/types/project";
+import { URL } from "../../constants/website";
+import { getTagClass } from "../../lib/utils/tags";
+import { fetchReadmeForProject } from "../../lib/readme/fetch";
+import {
+ getSchemaForProject,
+ getBreadcrumbSchema,
+} from "../../lib/schemas/project";
+
+const projects = rawProjects as Project[];
+const project = projects.find((p) => p.id === Astro.params.id);
+
+if (!project) {
+ return new Response(null, {
+ status: 404,
+ statusText: "Not Found",
+ });
+}
+
+const readme = await fetchReadmeForProject(project.id);
+const keywords = project.tech.join(", ");
+---
+
+<Layout
+ title={`${project.name} | Damian Myrda`}
+ description={project.subtitle}
+ type="website"
+ url={`${URL}/projects/${project.id}`}
+ keywords={keywords}
+>
+ <main id="content">
+ <div class="project-page">
+ <a href="/#projects" class="back-btn">← Back to projects</a>
+
+ <header class="project-header">
+ <div class="header-top">
+ <h1>{project.name}</h1>
+ <a
+ class="external-link"
+ href={project.url}
+ target="_blank"
+ rel="noopener noreferrer"
+ >
+ {project.url.includes("github.com") ? "GitHub" : "GitLab"} →
+ </a>
+ </div>
+ <p class="subtitle">{project.subtitle}</p>
+ <div class="tech-stack">
+ {
+ project.tech.map((tech) => (
+ <span class={`tag ${getTagClass(tech)}`}>{tech}</span>
+ ))
+ }
+ </div>
+ </header>
+
+ <div class="readme-content">
+ {
+ readme ? (
+ <Fragment set:html={readme} />
+ ) : (
+ <p class="color-dim">README not available</p>
+ )
+ }
+ </div>
+ </div>
+ <script
+ type="application/ld+json"
+ set:html={JSON.stringify(getSchemaForProject(project))}
+ />
+ <script
+ type="application/ld+json"
+ set:html={JSON.stringify(getBreadcrumbSchema(project))}
+ />
+ </main>
+</Layout>
+
+<script>
+ document.getElementById("app")?.classList.add("ready");
+</script>
+
+<style>
+ :global(body) {
+ overflow: auto;
+ }
+
+ :global(#app) {
+ height: auto;
+ min-height: 100vh;
+ }
+
+ :global(#content) {
+ overflow: visible;
+ }
+
+ .project-page {
+ max-width: 800px;
+ margin: 0 auto;
+ padding: 40px 24px;
+ min-height: 100vh;
+ }
+
+ .back-btn {
+ display: inline-block;
+ background: transparent;
+ border: 1px solid var(--border);
+ color: var(--fg-dim);
+ padding: 8px 16px;
+ cursor: pointer;
+ font-family: inherit;
+ font-size: 12px;
+ margin-bottom: 24px;
+ transition: all 0.15s;
+ text-decoration: none;
+ }
+
+ .back-btn:hover {
+ background: var(--bg-alt);
+ color: var(--accent);
+ border-color: var(--accent);
+ }
+
+ .project-header {
+ margin-bottom: 32px;
+ padding-bottom: 24px;
+ border-bottom: 1px solid var(--border);
+ }
+
+ .header-top {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 8px;
+ }
+
+ .project-header h1 {
+ font-size: 28px;
+ font-weight: 500;
+ color: var(--accent);
+ margin: 0;
+ }
+
+ .external-link {
+ color: var(--light-blue);
+ text-decoration: none;
+ font-size: 14px;
+ }
+
+ .external-link:hover {
+ opacity: 0.8;
+ }
+
+ .subtitle {
+ color: var(--fg-dim);
+ font-size: 14px;
+ margin-bottom: 16px;
+ }
+
+ .tech-stack {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ }
+
+ .readme-content {
+ font-size: 14px;
+ line-height: 1.7;
+ color: var(--fg);
+ }
+
+ .readme-content :global(p) {
+ margin-bottom: 16px;
+ }
+
+ .readme-content :global(h2),
+ .readme-content :global(.readme-h1) {
+ font-size: 20px;
+ color: var(--accent);
+ margin: 32px 0 12px;
+ font-weight: 600;
+ }
+
+ .readme-content :global(h2:first-child),
+ .readme-content :global(.readme-h1:first-child) {
+ margin-top: 0;
+ }
+
+ .readme-content :global(h3),
+ .readme-content :global(.readme-h2) {
+ font-size: 17px;
+ color: var(--accent);
+ margin: 24px 0 10px;
+ font-weight: 500;
+ }
+
+ .readme-content :global(pre) {
+ display: block;
+ background: var(--bg-alt);
+ border: 1px solid var(--border);
+ padding: 16px;
+ margin: 16px 0;
+ overflow-x: auto;
+ font-size: 13px;
+ line-height: 1.5;
+ }
+
+ .readme-content :global(pre code) {
+ background: none;
+ padding: 0;
+ font-size: inherit;
+ }
+
+ .readme-content :global(code) {
+ background: var(--bg-alt);
+ padding: 2px 6px;
+ font-size: 13px;
+ border-radius: 2px;
+ }
+
+ .readme-content :global(a) {
+ color: var(--light-blue);
+ text-decoration: none;
+ }
+
+ .readme-content :global(a:hover) {
+ opacity: 0.8;
+ }
+
+ .readme-content :global(ul),
+ .readme-content :global(ol) {
+ margin: 12px 0;
+ padding-left: 24px;
+ }
+
+ .readme-content :global(li) {
+ margin-bottom: 8px;
+ }
+
+ .readme-content :global(blockquote) {
+ border-left: 3px solid var(--accent);
+ margin: 16px 0;
+ padding: 12px 20px;
+ color: var(--fg-dim);
+ background: var(--bg-alt);
+ }
+
+ .readme-content :global(img) {
+ max-width: 100%;
+ height: auto;
+ margin: 16px 0;
+ }
+
+ @media (max-width: 768px) {
+ .project-page {
+ padding: 24px 16px;
+ }
+
+ .header-top {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 12px;
+ }
+
+ .project-header h1 {
+ font-size: 22px;
+ }
+
+ .readme-content {
+ font-size: 13px;
+ }
+ }
+</style>
diff --git a/web/src/pages/sitemap.xml.ts b/web/src/pages/sitemap.xml.ts
@@ -0,0 +1,70 @@
+import type { APIRoute } from "astro";
+import blogs from "../lib/blogs";
+import rawProjects from "../../config/projects.json";
+import rawExperience from "../../config/experience.json";
+import type Project from "../lib/types/project";
+import type Experience from "../lib/types/experience";
+
+const projects = rawProjects as Project[];
+const experiences = rawExperience as Experience[];
+const siteUrl = "https://prime8.dev";
+
+export const GET: APIRoute = () => {
+ const now = new Date().toISOString().split("T")[0];
+
+ // Static pages
+ const staticPages = [
+ { url: "/", changefreq: "weekly", priority: "1.0", lastmod: now },
+ ];
+
+ // Project pages
+ const projectPages = projects.map((project) => ({
+ url: `/projects/${project.id}`,
+ changefreq: "monthly",
+ priority: "0.7",
+ lastmod: project.dateModified || project.dateCreated || now,
+ }));
+
+ // Experience pages
+ const experiencePages = experiences.map((experience) => ({
+ url: `/experience/${experience.id}`,
+ changefreq: "monthly",
+ priority: "0.7",
+ lastmod: experience.endDate || experience.startDate || now,
+ }));
+
+ // Blog posts
+ const blogPages = blogs.map((blog) => ({
+ url: `/blog/${blog.id}`,
+ changefreq: "monthly",
+ priority: "0.8",
+ lastmod: blog.date,
+ }));
+
+ const allPages = [
+ ...staticPages,
+ ...projectPages,
+ ...experiencePages,
+ ...blogPages,
+ ];
+
+ const sitemap = `<?xml version="1.0" encoding="UTF-8"?>
+<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
+${allPages
+ .map(
+ (page) => ` <url>
+ <loc>${siteUrl}${page.url}</loc>
+ <lastmod>${page.lastmod || now}</lastmod>
+ <changefreq>${page.changefreq}</changefreq>
+ <priority>${page.priority}</priority>
+ </url>`,
+ )
+ .join("\n")}
+</urlset>`;
+
+ return new Response(sitemap, {
+ headers: {
+ "Content-Type": "application/xml",
+ },
+ });
+};
diff --git a/web/src/scripts/ui/blog.ts b/web/src/scripts/ui/blog.ts
@@ -0,0 +1,58 @@
+import { selectedIndex, setCurrentBlogId } from "./state";
+import { updateUrl } from "./url";
+
+export function setupBlogNavigation(): void {
+ document.querySelectorAll("#blog .blog-list-item").forEach((item) => {
+ item.addEventListener("click", () => {
+ const blogId = item.getAttribute("data-id");
+ if (blogId) {
+ const index = parseInt(item.getAttribute("data-index") || "0");
+ selectedIndex.blog = index;
+
+ document.querySelectorAll("#blog .blog-list-item").forEach((li, i) => {
+ li.classList.toggle("selected", i === index);
+ });
+
+ openBlogPost(blogId);
+ }
+ });
+ });
+
+ const listItems = document.querySelectorAll("#blog .blog-list-item");
+ if (listItems.length > 0) {
+ listItems[0].classList.add("selected");
+ }
+}
+
+export function openBlogPost(blogId: string): void {
+ setCurrentBlogId(blogId);
+
+ const listView = document.getElementById("blog-list-view");
+ const postView = document.getElementById("blog-post-view");
+
+ if (listView && postView) {
+ listView.classList.add("hidden");
+ postView.classList.remove("hidden");
+
+ document.querySelectorAll(".blog-post").forEach((post) => {
+ post.classList.toggle(
+ "hidden",
+ post.getAttribute("data-blog-id") !== blogId,
+ );
+ });
+ }
+
+ updateUrl();
+}
+
+export function closeBlogPost(): void {
+ setCurrentBlogId(null);
+
+ const listView = document.getElementById("blog-list-view");
+ const postView = document.getElementById("blog-post-view");
+
+ if (listView && postView) {
+ listView.classList.remove("hidden");
+ postView.classList.add("hidden");
+ }
+}
diff --git a/web/src/scripts/ui/boot.ts b/web/src/scripts/ui/boot.ts
@@ -0,0 +1,177 @@
+interface SystemInfo {
+ platform: string;
+ browser: string;
+ screen: string;
+ locale: string;
+ uptime: string;
+ timezone: string;
+}
+
+function getSystemInfo(): SystemInfo {
+ const ua = navigator.userAgent;
+
+ let platform = "Unknown";
+ if (ua.includes("Mac")) platform = "Darwin";
+ else if (ua.includes("Win")) platform = "Windows";
+ else if (ua.includes("Linux")) platform = "Linux";
+ else if (ua.includes("Android")) platform = "Android";
+ else if (ua.includes("iPhone") || ua.includes("iPad")) platform = "iOS";
+
+ let browser = "Unknown";
+ if (ua.includes("Firefox")) browser = "Firefox";
+ else if (ua.includes("Edg")) browser = "Edge";
+ else if (ua.includes("Chrome")) browser = "Chrome";
+ else if (ua.includes("Safari")) browser = "Safari";
+
+ const screen = `${window.screen.width}x${window.screen.height}`;
+ const locale = navigator.language || "en-US";
+
+ const now = new Date();
+ const hours = now.getHours().toString().padStart(2, "0");
+ const minutes = now.getMinutes().toString().padStart(2, "0");
+ const seconds = now.getSeconds().toString().padStart(2, "0");
+ const uptime = `${hours}:${minutes}:${seconds}`;
+
+ const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
+
+ return { platform, browser, screen, locale, uptime, timezone };
+}
+
+function generateNeofetch(sys: SystemInfo): string[] {
+ const logo = [
+ " .--. ",
+ " |o_o | ",
+ " |:_/ | ",
+ " // \\ \\ ",
+ " (| | ) ",
+ " /'\\_ _/`\\ ",
+ " \\___)=(___/ ",
+ ];
+
+ const info = [
+ `<span class="ansi-bold-accent">prime8</span>@<span class="ansi-bold-accent">dev</span>`,
+ '<span class="ansi-dim">──────────────</span>',
+ `<span class="ansi-bold-accent">OS</span>: <span class="ansi-white">${sys.platform}</span>`,
+ `<span class="ansi-bold-accent">Browser</span>: <span class="ansi-white">${sys.browser}</span>`,
+ `<span class="ansi-bold-accent">Resolution</span>: <span class="ansi-white">${sys.screen}</span>`,
+ `<span class="ansi-bold-accent">Time</span>: <span class="ansi-white">${sys.uptime}</span>`,
+ `<span class="ansi-bold-accent">Timezone</span>: <span class="ansi-white">${sys.timezone}</span>`,
+ `<span class="ansi-bold-accent">Locale</span>: <span class="ansi-white">${sys.locale}</span>`,
+ ];
+
+ const lines: string[] = [];
+ const maxLen = Math.max(logo.length, info.length);
+
+ for (let i = 0; i < maxLen; i++) {
+ const left = logo[i] || " ";
+ const right = info[i] || "";
+ lines.push(
+ `<span class="ansi-bold-white">${left.replace(/ /g, " ")}</span> ${right}`,
+ );
+ }
+
+ return lines;
+}
+
+function generateBootMessages(): string[] {
+ const sys = getSystemInfo();
+ const neofetchLines = generateNeofetch(sys);
+
+ return [...neofetchLines];
+}
+
+const CURSOR_CHAR = "█";
+
+function createBootOverlay(): HTMLElement {
+ const overlay = document.createElement("div");
+ overlay.id = "boot-overlay";
+ overlay.innerHTML = `
+ <div class="boot-terminal">
+ <div class="boot-content"></div>
+ <div class="boot-cursor">${CURSOR_CHAR}</div>
+ </div>
+ `;
+ document.body.appendChild(overlay);
+ return overlay;
+}
+
+function sleep(ms: number): Promise<void> {
+ return new Promise((resolve) => setTimeout(resolve, ms));
+}
+
+async function runBootSequence(overlay: HTMLElement): Promise<void> {
+ const content = overlay.querySelector(".boot-content") as HTMLElement;
+ const cursor = overlay.querySelector(".boot-cursor") as HTMLElement;
+ const messages = generateBootMessages();
+
+ await sleep(200);
+
+ for (let i = 0; i < messages.length; i++) {
+ const line = messages[i];
+ const lineEl = document.createElement("div");
+ lineEl.className = "boot-line boot-line-hidden";
+ lineEl.innerHTML = line || " ";
+ content.appendChild(lineEl);
+
+ await sleep(50);
+ lineEl.classList.remove("boot-line-hidden");
+ lineEl.classList.add("boot-line-visible");
+ }
+
+ await sleep(400);
+
+ const startMsg = document.createElement("div");
+ startMsg.className = "boot-line boot-line-hidden";
+ startMsg.innerHTML =
+ '<br><span class="ansi-bold-green">Starting prime8dev...</span>';
+ content.appendChild(startMsg);
+ await sleep(60);
+ startMsg.classList.remove("boot-line-hidden");
+ startMsg.classList.add("boot-line-visible");
+
+ await sleep(500);
+
+ cursor.style.display = "none";
+
+ const progressBar = document.createElement("div");
+ progressBar.className = "boot-line boot-line-visible";
+ content.appendChild(progressBar);
+
+ const progressWidth = 30;
+ for (let i = 0; i <= progressWidth; i++) {
+ const filled = "=".repeat(i);
+ const arrow = i < progressWidth ? ">" : "=";
+ const empty = " ".repeat(progressWidth - i);
+ progressBar.innerHTML = `<span class="ansi-bold-green">[${filled}${arrow}${empty}]</span> ${Math.round((i / progressWidth) * 100)}%`;
+ await sleep(25);
+ }
+
+ await sleep(250);
+
+ overlay.classList.add("fade-out");
+ await sleep(400);
+
+ overlay.remove();
+}
+
+export async function playBootAnimation(): Promise<void> {
+ const BOOT_KEY = "prime8dev-boot-shown";
+ const app = document.getElementById("app");
+
+ if (sessionStorage.getItem(BOOT_KEY)) {
+ if (app) {
+ app.classList.add("ready");
+ }
+ return;
+ }
+
+ const overlay = createBootOverlay();
+
+ await runBootSequence(overlay);
+
+ sessionStorage.setItem(BOOT_KEY, "1");
+
+ if (app) {
+ app.classList.add("ready", "boot-reveal");
+ }
+}
diff --git a/web/src/scripts/ui/clicks.ts b/web/src/scripts/ui/clicks.ts
@@ -0,0 +1,39 @@
+import { selectedIndex } from "./state";
+import { updateUrl } from "./url";
+import { updateExperienceDetail, updateDetailView } from "./detail";
+
+export function setupTimelineClicks(): void {
+ document.querySelectorAll(".timeline-segment").forEach((segment) => {
+ segment.addEventListener("click", () => {
+ const index = parseInt(segment.getAttribute("data-index") || "0");
+ selectedIndex.experience = index;
+
+ document.querySelectorAll(".timeline-segment").forEach((s) => {
+ s.classList.toggle(
+ "selected",
+ parseInt(s.getAttribute("data-index") || "0") === index,
+ );
+ });
+
+ updateExperienceDetail();
+ updateUrl();
+ });
+ });
+}
+
+export function setupListClicks(): void {
+ document.querySelectorAll("#projects .list-item").forEach((item) => {
+ item.addEventListener("click", () => {
+ const index = parseInt(item.getAttribute("data-index") || "0");
+
+ selectedIndex.projects = index;
+
+ document.querySelectorAll("#projects .list-item").forEach((li, i) => {
+ li.classList.toggle("selected", i === index);
+ });
+
+ updateDetailView("projects");
+ updateUrl();
+ });
+ });
+}
diff --git a/web/src/scripts/ui/detail.ts b/web/src/scripts/ui/detail.ts
@@ -0,0 +1,27 @@
+import { selectedIndex } from "./state";
+
+export function updateExperienceDetail(): void {
+ const index = selectedIndex.experience;
+ const detailContents = document.querySelectorAll("#experience .exp-card");
+
+ detailContents.forEach((content) => {
+ content.classList.toggle(
+ "hidden",
+ parseInt(content.getAttribute("data-for") || "0") !== index,
+ );
+ });
+}
+
+export function updateDetailView(pageId: string): void {
+ const index = selectedIndex[pageId];
+ const detailContents = document.querySelectorAll(
+ `#${pageId} .detail-content`,
+ );
+
+ detailContents.forEach((content) => {
+ content.classList.toggle(
+ "hidden",
+ parseInt(content.getAttribute("data-for") || "0") !== index,
+ );
+ });
+}
diff --git a/web/src/scripts/ui/index.ts b/web/src/scripts/ui/index.ts
@@ -0,0 +1,28 @@
+import { applyInitialState } from "./state";
+import { loadFromUrl } from "./url";
+import { setupTabs } from "./tabs";
+import { setupKeyboard } from "./keyboard";
+import { setupTimelineClicks, setupListClicks } from "./clicks";
+import { setupBlogNavigation } from "./blog";
+import { updateStatusTime } from "./status";
+import { playBootAnimation } from "./boot";
+
+export async function initUI(): Promise<void> {
+ await playBootAnimation();
+
+ loadFromUrl();
+ setupTabs();
+ setupKeyboard();
+ setupTimelineClicks();
+ setupListClicks();
+ setupBlogNavigation();
+ applyInitialState();
+
+ updateStatusTime();
+ setInterval(updateStatusTime, 1000);
+
+ window.addEventListener("popstate", () => {
+ loadFromUrl();
+ applyInitialState();
+ });
+}
diff --git a/web/src/scripts/ui/keyboard.ts b/web/src/scripts/ui/keyboard.ts
@@ -0,0 +1,82 @@
+import { currentTab, currentBlogId, selectedIndex } from "./state";
+import { getItemId, updateUrl } from "./url";
+import { switchTab, cycleTab } from "./tabs";
+import { navigateList, navigateTimeline } from "./navigation";
+import { openBlogPost, closeBlogPost } from "./blog";
+
+export function setupKeyboard(): void {
+ document.addEventListener("keydown", (e) => {
+ if (
+ e.target instanceof HTMLInputElement ||
+ e.target instanceof HTMLTextAreaElement
+ )
+ return;
+
+ switch (e.key) {
+ case "1":
+ switchTab("about");
+ break;
+ case "2":
+ switchTab("experience");
+ break;
+ case "3":
+ switchTab("projects");
+ break;
+ case "4":
+ switchTab("blog");
+ break;
+ case "ArrowDown":
+ e.preventDefault();
+ navigateList(1);
+ break;
+ case "ArrowUp":
+ e.preventDefault();
+ navigateList(-1);
+ break;
+ case "ArrowLeft":
+ if (
+ (
+ window as Window & { isLightboxOpen?: () => boolean }
+ ).isLightboxOpen?.()
+ )
+ return;
+ e.preventDefault();
+ if (currentTab === "experience") {
+ navigateTimeline(-1);
+ } else {
+ cycleTab(-1);
+ }
+ break;
+ case "ArrowRight":
+ if (
+ (
+ window as Window & { isLightboxOpen?: () => boolean }
+ ).isLightboxOpen?.()
+ )
+ return;
+ e.preventDefault();
+ if (currentTab === "experience") {
+ navigateTimeline(1);
+ } else {
+ cycleTab(1);
+ }
+ break;
+ case "Tab":
+ e.preventDefault();
+ cycleTab(e.shiftKey ? -1 : 1);
+ break;
+ case "Enter":
+ if (currentTab === "blog" && !currentBlogId) {
+ const blogId = getItemId("blog", selectedIndex.blog);
+ openBlogPost(blogId);
+ }
+ break;
+ case "Escape":
+ if (currentTab === "blog" && currentBlogId) {
+ closeBlogPost();
+ updateUrl();
+ }
+ break;
+ }
+ });
+}
diff --git a/web/src/scripts/ui/navigation.ts b/web/src/scripts/ui/navigation.ts
@@ -0,0 +1,86 @@
+import { currentTab, selectedIndex, currentBlogId } from "./state";
+import { updateUrl } from "./url";
+import { updateExperienceDetail, updateDetailView } from "./detail";
+import { cycleTab } from "./tabs";
+
+export function navigateList(direction: number): void {
+ if (currentTab === "about") return;
+ if (currentTab === "experience") {
+ navigateTimeline(direction);
+ return;
+ }
+ if (currentTab === "blog") {
+ if (!currentBlogId) {
+ navigateBlogList(direction);
+ }
+ return;
+ }
+
+ const listItems = document.querySelectorAll(`#${currentTab} .list-item`);
+ const maxIndex = listItems.length - 1;
+
+ selectedIndex[currentTab] = Math.max(
+ 0,
+ Math.min(maxIndex, selectedIndex[currentTab] + direction),
+ );
+
+ listItems.forEach((item, i) => {
+ item.classList.toggle("selected", i === selectedIndex[currentTab]);
+ });
+
+ updateDetailView(currentTab);
+ updateUrl();
+
+ listItems[selectedIndex[currentTab]]?.scrollIntoView({ block: "nearest" });
+}
+
+export function navigateTimeline(direction: number): void {
+ const segments = document.querySelectorAll("#experience .timeline-segment");
+
+ const sortedSegments = Array.from(segments).sort((a, b) => {
+ const aLeft = parseFloat((a as HTMLElement).style.left) || 0;
+ const bLeft = parseFloat((b as HTMLElement).style.left) || 0;
+ return aLeft - bLeft;
+ });
+
+ const sortedIndices = sortedSegments.map((s) =>
+ parseInt(s.getAttribute("data-index") || "0"),
+ );
+ const currentPos = sortedIndices.indexOf(selectedIndex.experience);
+ const newPos = currentPos + direction;
+
+ if (newPos < 0) {
+ cycleTab(-1);
+ return;
+ }
+ if (newPos >= sortedIndices.length) {
+ cycleTab(1);
+ return;
+ }
+
+ selectedIndex.experience = sortedIndices[newPos];
+
+ segments.forEach((segment) => {
+ const idx = parseInt(segment.getAttribute("data-index") || "0");
+ segment.classList.toggle("selected", idx === selectedIndex.experience);
+ });
+
+ updateExperienceDetail();
+ updateUrl();
+}
+
+export function navigateBlogList(direction: number): void {
+ const listItems = document.querySelectorAll("#blog .blog-list-item");
+ const maxIndex = listItems.length - 1;
+
+ selectedIndex.blog = Math.max(
+ 0,
+ Math.min(maxIndex, selectedIndex.blog + direction),
+ );
+
+ listItems.forEach((item, i) => {
+ item.classList.toggle("selected", i === selectedIndex.blog);
+ });
+
+ listItems[selectedIndex.blog]?.scrollIntoView({ block: "nearest" });
+}
diff --git a/web/src/scripts/ui/state.ts b/web/src/scripts/ui/state.ts
@@ -0,0 +1,78 @@
+import { openBlogPost } from "./blog";
+import { updateDetailView, updateExperienceDetail } from "./detail";
+
+export let currentTab = "about";
+
+export const selectedIndex: Record<string, number> = {
+ experience: getInitialExperienceIndex(),
+ projects: getInitialProjectsIndex(),
+ blog: getInitialBlogIndex(),
+};
+export let currentBlogId: string | null = null;
+
+export function applyInitialState(): void {
+ const tabs = document.querySelectorAll(".tab");
+ const pages = document.querySelectorAll(".page");
+
+ tabs.forEach((tab) => {
+ const isActive = tab.getAttribute("data-tab") === currentTab;
+ tab.classList.toggle("active", isActive);
+ if (isActive) {
+ tab.setAttribute("aria-current", "page");
+ } else {
+ tab.removeAttribute("aria-current");
+ }
+ });
+ pages.forEach((page) => {
+ page.classList.toggle("active", page.id === currentTab);
+ });
+
+ const timelineSegments = document.querySelectorAll(
+ "#experience .timeline-segment",
+ );
+ timelineSegments.forEach((segment) => {
+ const idx = parseInt(segment.getAttribute("data-index") || "0");
+ segment.classList.toggle("selected", idx === selectedIndex.experience);
+ });
+ updateExperienceDetail();
+
+ const projectItems = document.querySelectorAll("#projects .list-item");
+ projectItems.forEach((item, i) => {
+ item.classList.toggle("selected", i === selectedIndex.projects);
+ });
+ updateDetailView("projects");
+
+ const blogItems = document.querySelectorAll("#blog .blog-list-item");
+ blogItems.forEach((item, i) => {
+ item.classList.toggle("selected", i === selectedIndex.blog);
+ });
+
+ if (currentTab === "blog" && currentBlogId) {
+ openBlogPost(currentBlogId);
+ }
+}
+
+export function setCurrentTab(tab: string): void {
+ currentTab = tab;
+}
+
+function getInitialExperienceIndex(): number {
+ const selected = document.querySelector(
+ "#experience .timeline-segment.selected",
+ );
+ return selected ? parseInt(selected.getAttribute("data-index") || "0") : 0;
+}
+
+function getInitialProjectsIndex(): number {
+ const selected = document.querySelector("#projects .list-item.selected");
+ return selected ? parseInt(selected.getAttribute("data-index") || "0") : 0;
+}
+
+function getInitialBlogIndex(): number {
+ const selected = document.querySelector("#blog .blog-list-item.selected");
+ return selected ? parseInt(selected.getAttribute("data-index") || "0") : 0;
+}
+
+export function setCurrentBlogId(id: string | null): void {
+ currentBlogId = id;
+}
diff --git a/web/src/scripts/ui/status.ts b/web/src/scripts/ui/status.ts
@@ -0,0 +1,17 @@
+export function updateStatusTime(): void {
+ const el = document.getElementById("status-time");
+ if (!el) return;
+
+ const now = new Date();
+ const time = now.toLocaleTimeString("en-US", {
+ hour: "2-digit",
+ minute: "2-digit",
+ second: "2-digit",
+ hour12: false,
+ });
+ const date = now.toLocaleDateString("en-US", {
+ month: "short",
+ day: "numeric",
+ });
+ el.textContent = `${date} ${time}`;
+}
diff --git a/web/src/scripts/ui/tabs.ts b/web/src/scripts/ui/tabs.ts
@@ -0,0 +1,48 @@
+import { currentTab, setCurrentTab } from "./state";
+import { updateUrl } from "./url";
+import { closeBlogPost } from "./blog";
+
+export function setupTabs(): void {
+ const tabs = document.querySelectorAll(".tab");
+ tabs.forEach((tab) => {
+ tab.addEventListener("click", () => {
+ const tabName = tab.getAttribute("data-tab");
+ if (tabName) switchTab(tabName);
+ });
+ });
+}
+
+export function switchTab(tabName: string): void {
+ setCurrentTab(tabName);
+
+ if (tabName === "blog") {
+ closeBlogPost();
+ }
+
+ const tabs = document.querySelectorAll(".tab");
+ const pages = document.querySelectorAll(".page");
+
+ tabs.forEach((tab) => {
+ const isActive = tab.getAttribute("data-tab") === tabName;
+ tab.classList.toggle("active", isActive);
+ if (isActive) {
+ tab.setAttribute("aria-current", "page");
+ } else {
+ tab.removeAttribute("aria-current");
+ }
+ });
+
+ pages.forEach((page) => {
+ page.classList.toggle("active", page.id === tabName);
+ });
+
+ updateUrl();
+}
+
+export function cycleTab(direction: number): void {
+ const tabOrder = ["about", "experience", "projects", "blog"];
+ const currentIndex = tabOrder.indexOf(currentTab);
+ const newIndex =
+ (currentIndex + direction + tabOrder.length) % tabOrder.length;
+ switchTab(tabOrder[newIndex]);
+}
diff --git a/web/src/scripts/ui/url.ts b/web/src/scripts/ui/url.ts
@@ -0,0 +1,94 @@
+import {
+ currentTab,
+ selectedIndex,
+ currentBlogId,
+ setCurrentTab,
+ setCurrentBlogId,
+} from "./state";
+
+export function getItemId(tab: string, index: number): string {
+ if (tab === "experience") {
+ const item = document.querySelector(
+ `#experience .timeline-segment[data-index="${index}"]`,
+ );
+ return item?.getAttribute("data-id") || String(index);
+ } else if (tab === "projects") {
+ const item = document.querySelector(
+ `#projects .list-item[data-index="${index}"]`,
+ );
+ return item?.getAttribute("data-id") || String(index);
+ } else if (tab === "blog") {
+ const item = document.querySelector(
+ `#blog .blog-list-item[data-index="${index}"]`,
+ );
+ return item?.getAttribute("data-id") || String(index);
+ }
+ return String(index);
+}
+
+export function getIndexFromId(tab: string, id: string): number {
+ if (tab === "experience") {
+ const items = document.querySelectorAll(`#experience .timeline-segment`);
+ for (let i = 0; i < items.length; i++) {
+ if (items[i].getAttribute("data-id") === id) {
+ return parseInt(items[i].getAttribute("data-index") || "0");
+ }
+ }
+ } else if (tab === "projects") {
+ const items = document.querySelectorAll(`#projects .list-item`);
+ for (let i = 0; i < items.length; i++) {
+ if (items[i].getAttribute("data-id") === id) {
+ return i;
+ }
+ }
+ } else if (tab === "blog") {
+ const items = document.querySelectorAll(`#blog .blog-list-item`);
+ for (let i = 0; i < items.length; i++) {
+ if (items[i].getAttribute("data-id") === id) {
+ return parseInt(items[i].getAttribute("data-index") || "0");
+ }
+ }
+ }
+ return 0;
+}
+
+export function updateUrl(): void {
+ let newHash: string;
+
+ if (currentTab === "about") {
+ newHash = "#about";
+ } else if (currentTab === "blog") {
+ if (currentBlogId) {
+ newHash = `#blog/${currentBlogId}`;
+ } else {
+ newHash = "#blog";
+ }
+ } else {
+ newHash = `#${currentTab}/${getItemId(currentTab, selectedIndex[currentTab])}`;
+ }
+
+ if (window.location.hash !== newHash) {
+ history.pushState(null, "", newHash);
+ }
+}
+
+export function loadFromUrl(): void {
+ const hash = window.location.hash.slice(1);
+ if (!hash) return;
+
+ const parts = hash.split("/");
+ const tab = parts[0];
+ const id = parts[1];
+
+ if (["about", "experience", "projects", "blog"].includes(tab)) {
+ setCurrentTab(tab);
+ if (tab === "blog" && id) {
+ setCurrentBlogId(id);
+ selectedIndex.blog = getIndexFromId("blog", id);
+ } else if (tab === "blog") {
+ setCurrentBlogId(null);
+ } else if (tab !== "about" && id) {
+ selectedIndex[tab] = getIndexFromId(tab, id);
+ }
+ }
+}
diff --git a/web/start.sh b/web/start.sh
@@ -1,3 +0,0 @@
-#!/usr/bin/env bash
-
-zola serve -p 8000
diff --git a/web/static/css/bootstrap-responsive.css b/web/static/css/bootstrap-responsive.css
@@ -1,937 +0,0 @@
-/*!
- * Bootstrap Responsive v2.3.1
- *
- * Copyright 2012 Twitter, Inc
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
- */
-
-.clearfix {
- *zoom: 1;
-}
-
-.clearfix:before,
-.clearfix:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.clearfix:after {
- clear: both;
-}
-
-.hide-text {
- font: 0/0 a;
- color: transparent;
- text-shadow: none;
- background-color: transparent;
- border: 0;
-}
-
-.input-block-level {
- display: block;
- width: 100%;
- min-height: 20px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-
-@-ms-viewport {
- width: device-width;
-}
-
-.hidden {
- display: none;
- visibility: hidden;
-}
-
-.visible-phone {
- display: none !important;
-}
-
-.visible-tablet {
- display: none !important;
-}
-
-.hidden-desktop {
- display: none !important;
-}
-
-.visible-desktop {
- display: inherit !important;
-}
-
-@media (min-width: 768px) and (max-width: 979px) {
- .hidden-desktop {
- display: inherit !important;
- }
- .visible-desktop {
- display: none !important ;
- }
- .visible-tablet {
- display: inherit !important;
- }
- .hidden-tablet {
- display: none !important;
- }
-}
-
-@media (max-width: 767px) {
- .hidden-desktop {
- display: inherit !important;
- }
- .visible-desktop {
- display: none !important;
- }
- .visible-phone {
- display: inherit !important;
- }
- .hidden-phone {
- display: none !important;
- }
-}
-
-.visible-print {
- display: none !important;
-}
-
-@media print {
- .visible-print {
- display: inherit !important;
- }
- .hidden-print {
- display: none !important;
- }
-}
-
-@media (min-width: 1200px) {
- .row {
- margin-left: -24px;
- *zoom: 1;
- }
- .row:before,
- .row:after {
- display: table;
- line-height: 0;
- content: "";
- }
- .row:after {
- clear: both;
- }
- [class*="span"] {
- float: left;
- min-height: 1px;
- margin-left: 16px;
- }
- .container,
- .span12 {
- width: 1128px;
- }
- .span11 {
- width: 1032px;
- }
- .span10 {
- width: 936px;
- }
- .span9 {
- width: 840px;
- }
- .span8 {
- width: 744px;
- }
- .span7 {
- width: 648px;
- }
- .span6 {
- width: 552px;
- }
- .span5 {
- width: 456px;
- }
- .span4 {
- width: 360px;
- }
- .span3 {
- width: 264px;
- }
- .span2 {
- width: 168px;
- }
- .span1 {
- width: 72px;
- }
- .offset12 {
- margin-left: 1176px;
- }
- .offset11 {
- margin-left: 1080px;
- }
- .offset10 {
- margin-left: 984px;
- }
- .offset9 {
- margin-left: 888px;
- }
- .offset8 {
- margin-left: 792px;
- }
- .offset7 {
- margin-left: 696px;
- }
- .offset6 {
- margin-left: 600px;
- }
- .offset5 {
- margin-left: 504px;
- }
- .offset4 {
- margin-left: 408px;
- }
- .offset3 {
- margin-left: 312px;
- }
- .offset2 {
- margin-left: 216px;
- }
- .offset1 {
- margin-left: 120px;
- }
- .row-fluid {
- width: 100%;
- *zoom: 1;
- }
- .row-fluid:before,
- .row-fluid:after {
- display: table;
- line-height: 0;
- content: "";
- }
- .row-fluid:after {
- clear: both;
- }
- .row-fluid [class*="span"] {
- display: block;
- float: left;
- width: 100%;
- min-height: 20px;
- margin-left: 2.127659574468085%;
- *margin-left: 2.07469347277317%;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- }
- .row-fluid [class*="span"]:first-child {
- margin-left: 0;
- }
- .row-fluid .controls-row [class*="span"] + [class*="span"] {
- margin-left: 2.127659574468085%;
- }
- .row-fluid .span12 {
- width: 100%;
- *width: 99.94703389830508%;
- }
- .row-fluid .span11 {
- width: 91.48936170212765%;
- *width: 91.43639560043273%;
- }
- .row-fluid .span10 {
- width: 82.97872340425532%;
- *width: 82.9257573025604%;
- }
- .row-fluid .span9 {
- width: 74.46808510638297%;
- *width: 74.41511900468805%;
- }
- .row-fluid .span8 {
- width: 65.95744680851064%;
- *width: 65.90448070681572%;
- }
- .row-fluid .span7 {
- width: 57.44680851063829%;
- *width: 57.39384240894338%;
- }
- .row-fluid .span6 {
- width: 48.93617021276595%;
- *width: 48.88320411107104%;
- }
- .row-fluid .span5 {
- width: 40.42553191489362%;
- *width: 40.372565813198705%;
- }
- .row-fluid .span4 {
- width: 31.914893617021278%;
- *width: 31.86192751532636%;
- }
- .row-fluid .span3 {
- width: 23.404255319148934%;
- *width: 23.351289217454017%;
- }
- .row-fluid .span2 {
- width: 14.893617021276595%;
- *width: 14.84065091958168%;
- }
- .row-fluid .span1 {
- width: 6.382978723404255%;
- *width: 6.33001262170934%;
- }
- .row-fluid .offset12 {
- margin-left: 104.25531914893617%;
- *margin-left: 104.14938694554633%;
- }
- .row-fluid .offset12:first-child {
- margin-left: 102.12765957446808%;
- *margin-left: 102.02172737107824%;
- }
- .row-fluid .offset11 {
- margin-left: 95.74468085106382%;
- *margin-left: 95.63874864767398%;
- }
- .row-fluid .offset11:first-child {
- margin-left: 93.61702127659574%;
- *margin-left: 93.5110890732059%;
- }
- .row-fluid .offset10 {
- margin-left: 87.23404255319149%;
- *margin-left: 87.12811034980164%;
- }
- .row-fluid .offset10:first-child {
- margin-left: 85.1063829787234%;
- *margin-left: 85.00045077533356%;
- }
- .row-fluid .offset9 {
- margin-left: 78.72340425531914%;
- *margin-left: 78.6174720519293%;
- }
- .row-fluid .offset9:first-child {
- margin-left: 76.59574468085106%;
- *margin-left: 76.48981247746121%;
- }
- .row-fluid .offset8 {
- margin-left: 70.2127659574468%;
- *margin-left: 70.10683375405696%;
- }
- .row-fluid .offset8:first-child {
- margin-left: 68.08510638297872%;
- *margin-left: 67.97917417958888%;
- }
- .row-fluid .offset7 {
- margin-left: 61.70212765957446%;
- *margin-left: 61.59619545618464%;
- }
- .row-fluid .offset7:first-child {
- margin-left: 59.574468085106375%;
- *margin-left: 59.46853588171655%;
- }
- .row-fluid .offset6 {
- margin-left: 53.191489361702125%;
- *margin-left: 53.08555715831229%;
- }
- .row-fluid .offset6:first-child {
- margin-left: 51.063829787234035%;
- *margin-left: 50.95789758384421%;
- }
- .row-fluid .offset5 {
- margin-left: 44.68085106382979%;
- *margin-left: 44.57491886043996%;
- }
- .row-fluid .offset5:first-child {
- margin-left: 42.5531914893617%;
- *margin-left: 42.447259285971874%;
- }
- .row-fluid .offset4 {
- margin-left: 36.170212765957444%;
- *margin-left: 36.06428056256762%;
- }
- .row-fluid .offset4:first-child {
- margin-left: 34.04255319148936%;
- *margin-left: 33.936620988099534%;
- }
- .row-fluid .offset3 {
- margin-left: 27.659574468085104%;
- *margin-left: 27.55364226469527%;
- }
- .row-fluid .offset3:first-child {
- margin-left: 25.53191489361702%;
- *margin-left: 25.425982690227183%;
- }
- .row-fluid .offset2 {
- margin-left: 19.148936170212764%;
- *margin-left: 19.043003966822933%;
- }
- .row-fluid .offset2:first-child {
- margin-left: 17.02127659574468%;
- *margin-left: 16.91534439235485%;
- }
- .row-fluid .offset1 {
- margin-left: 10.638297872340425%;
- *margin-left: 10.532365668950595%;
- }
- .row-fluid .offset1:first-child {
- margin-left: 8.51063829787234%;
- *margin-left: 8.40470609448251%;
- }
- input,
- textarea,
- .uneditable-input {
- margin-left: 0;
- }
- .controls-row [class*="span"] + [class*="span"] {
- margin-left: 24px;
- }
- input.span12,
- textarea.span12,
- .uneditable-input.span12 {
- width: 1114px;
- }
- input.span11,
- textarea.span11,
- .uneditable-input.span11 {
- width: 1018px;
- }
- input.span10,
- textarea.span10,
- .uneditable-input.span10 {
- width: 922px;
- }
- input.span9,
- textarea.span9,
- .uneditable-input.span9 {
- width: 826px;
- }
- input.span8,
- textarea.span8,
- .uneditable-input.span8 {
- width: 730px;
- }
- input.span7,
- textarea.span7,
- .uneditable-input.span7 {
- width: 634px;
- }
- input.span6,
- textarea.span6,
- .uneditable-input.span6 {
- width: 538px;
- }
- input.span5,
- textarea.span5,
- .uneditable-input.span5 {
- width: 442px;
- }
- input.span4,
- textarea.span4,
- .uneditable-input.span4 {
- width: 346px;
- }
- input.span3,
- textarea.span3,
- .uneditable-input.span3 {
- width: 250px;
- }
- input.span2,
- textarea.span2,
- .uneditable-input.span2 {
- width: 154px;
- }
- input.span1,
- textarea.span1,
- .uneditable-input.span1 {
- width: 58px;
- }
- .thumbnails {
- margin-left: -24px;
- }
- .thumbnails > li {
- margin-left: 24px;
- }
- .row-fluid .thumbnails {
- margin-left: 0;
- }
-}
-
-@media (min-width: 768px) and (max-width: 979px) {
- .row {
- margin-left: -16px;
- *zoom: 1;
- }
- .row:before,
- .row:after {
- display: table;
- line-height: 0;
- content: "";
- }
- .row:after {
- clear: both;
- }
- [class*="span"] {
- float: left;
- min-height: 1px;
- margin-left: 16px;
- }
- .container,
- .span12 {
- width: 656px;
- }
- .span11 {
- width: 600px;
- }
- .span10 {
- width: 544px;
- }
- .span9 {
- width: 488px;
- }
- .span8 {
- width: 432px;
- }
- .span7 {
- width: 376px;
- }
- .span6 {
- width: 320px;
- }
- .span5 {
- width: 264px;
- }
- .span4 {
- width: 208px;
- }
- .span3 {
- width: 152px;
- }
- .span2 {
- width: 96px;
- }
- .span1 {
- width: 40px;
- }
- .offset12 {
- margin-left: 688px;
- }
- .offset11 {
- margin-left: 632px;
- }
- .offset10 {
- margin-left: 576px;
- }
- .offset9 {
- margin-left: 520px;
- }
- .offset8 {
- margin-left: 464px;
- }
- .offset7 {
- margin-left: 408px;
- }
- .offset6 {
- margin-left: 352px;
- }
- .offset5 {
- margin-left: 296px;
- }
- .offset4 {
- margin-left: 240px;
- }
- .offset3 {
- margin-left: 184px;
- }
- .offset2 {
- margin-left: 128px;
- }
- .offset1 {
- margin-left: 72px;
- }
- .row-fluid {
- width: 100%;
- *zoom: 1;
- }
- .row-fluid:before,
- .row-fluid:after {
- display: table;
- line-height: 0;
- content: "";
- }
- .row-fluid:after {
- clear: both;
- }
- .row-fluid [class*="span"] {
- display: block;
- float: left;
- width: 100%;
- min-height: 20px;
- margin-left: 2.4390243902439024%;
- *margin-left: 2.386058288548987%;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- }
- .row-fluid [class*="span"]:first-child {
- margin-left: 0;
- }
- .row-fluid .controls-row [class*="span"] + [class*="span"] {
- margin-left: 2.4390243902439024%;
- }
- .row-fluid .span12 {
- width: 100%;
- *width: 99.94703389830508%;
- }
- .row-fluid .span11 {
- width: 91.46341463414635%;
- *width: 91.41044853245143%;
- }
- .row-fluid .span10 {
- width: 82.92682926829268%;
- *width: 82.87386316659776%;
- }
- .row-fluid .span9 {
- width: 74.39024390243902%;
- *width: 74.3372778007441%;
- }
- .row-fluid .span8 {
- width: 65.85365853658537%;
- *width: 65.80069243489045%;
- }
- .row-fluid .span7 {
- width: 57.31707317073171%;
- *width: 57.2641070690368%;
- }
- .row-fluid .span6 {
- width: 48.78048780487805%;
- *width: 48.727521703183136%;
- }
- .row-fluid .span5 {
- width: 40.24390243902439%;
- *width: 40.190936337329475%;
- }
- .row-fluid .span4 {
- width: 31.70731707317073%;
- *width: 31.654350971475814%;
- }
- .row-fluid .span3 {
- width: 23.170731707317074%;
- *width: 23.117765605622157%;
- }
- .row-fluid .span2 {
- width: 14.634146341463415%;
- *width: 14.5811802397685%;
- }
- .row-fluid .span1 {
- width: 6.097560975609756%;
- *width: 6.044594873914841%;
- }
- .row-fluid .offset12 {
- margin-left: 104.8780487804878%;
- *margin-left: 104.77211657709796%;
- }
- .row-fluid .offset12:first-child {
- margin-left: 102.4390243902439%;
- *margin-left: 102.33309218685406%;
- }
- .row-fluid .offset11 {
- margin-left: 96.34146341463415%;
- *margin-left: 96.23553121124431%;
- }
- .row-fluid .offset11:first-child {
- margin-left: 93.90243902439025%;
- *margin-left: 93.7965068210004%;
- }
- .row-fluid .offset10 {
- margin-left: 87.80487804878048%;
- *margin-left: 87.69894584539064%;
- }
- .row-fluid .offset10:first-child {
- margin-left: 85.36585365853658%;
- *margin-left: 85.25992145514674%;
- }
- .row-fluid .offset9 {
- margin-left: 79.26829268292683%;
- *margin-left: 79.16236047953699%;
- }
- .row-fluid .offset9:first-child {
- margin-left: 76.82926829268293%;
- *margin-left: 76.72333608929308%;
- }
- .row-fluid .offset8 {
- margin-left: 70.73170731707317%;
- *margin-left: 70.62577511368333%;
- }
- .row-fluid .offset8:first-child {
- margin-left: 68.29268292682927%;
- *margin-left: 68.18675072343943%;
- }
- .row-fluid .offset7 {
- margin-left: 62.19512195121951%;
- *margin-left: 62.089189747829685%;
- }
- .row-fluid .offset7:first-child {
- margin-left: 59.75609756097561%;
- *margin-left: 59.650165357585784%;
- }
- .row-fluid .offset6 {
- margin-left: 53.65853658536585%;
- *margin-left: 53.552604381976025%;
- }
- .row-fluid .offset6:first-child {
- margin-left: 51.21951219512195%;
- *margin-left: 51.113579991732124%;
- }
- .row-fluid .offset5 {
- margin-left: 45.12195121951219%;
- *margin-left: 45.016019016122364%;
- }
- .row-fluid .offset5:first-child {
- margin-left: 42.68292682926829%;
- *margin-left: 42.57699462587846%;
- }
- .row-fluid .offset4 {
- margin-left: 36.58536585365854%;
- *margin-left: 36.4794336502687%;
- }
- .row-fluid .offset4:first-child {
- margin-left: 34.146341463414636%;
- *margin-left: 34.0404092600248%;
- }
- .row-fluid .offset3 {
- margin-left: 28.04878048780488%;
- *margin-left: 27.942848284415046%;
- }
- .row-fluid .offset3:first-child {
- margin-left: 25.609756097560975%;
- *margin-left: 25.50382389417114%;
- }
- .row-fluid .offset2 {
- margin-left: 19.51219512195122%;
- *margin-left: 19.40626291856139%;
- }
- .row-fluid .offset2:first-child {
- margin-left: 17.073170731707318%;
- *margin-left: 16.967238528317484%;
- }
- .row-fluid .offset1 {
- margin-left: 10.975609756097562%;
- *margin-left: 10.86967755270773%;
- }
- .row-fluid .offset1:first-child {
- margin-left: 8.536585365853659%;
- *margin-left: 8.430653162463829%;
- }
- input,
- textarea,
- .uneditable-input {
- margin-left: 0;
- }
- .controls-row [class*="span"] + [class*="span"] {
- margin-left: 16px;
- }
- input.span12,
- textarea.span12,
- .uneditable-input.span12 {
- width: 642px;
- }
- input.span11,
- textarea.span11,
- .uneditable-input.span11 {
- width: 586px;
- }
- input.span10,
- textarea.span10,
- .uneditable-input.span10 {
- width: 530px;
- }
- input.span9,
- textarea.span9,
- .uneditable-input.span9 {
- width: 474px;
- }
- input.span8,
- textarea.span8,
- .uneditable-input.span8 {
- width: 418px;
- }
- input.span7,
- textarea.span7,
- .uneditable-input.span7 {
- width: 362px;
- }
- input.span6,
- textarea.span6,
- .uneditable-input.span6 {
- width: 306px;
- }
- input.span5,
- textarea.span5,
- .uneditable-input.span5 {
- width: 250px;
- }
- input.span4,
- textarea.span4,
- .uneditable-input.span4 {
- width: 194px;
- }
- input.span3,
- textarea.span3,
- .uneditable-input.span3 {
- width: 138px;
- }
- input.span2,
- textarea.span2,
- .uneditable-input.span2 {
- width: 82px;
- }
- input.span1,
- textarea.span1,
- .uneditable-input.span1 {
- width: 26px;
- }
-}
-
-@media (max-width: 767px) {
- body {
- padding-right: 18px;
- padding-left: 18px;
- }
- .container-fluid {
- padding: 0;
- }
- .dl-horizontal dt {
- float: none;
- width: auto;
- clear: none;
- text-align: left;
- }
- .dl-horizontal dd {
- margin-left: 0;
- }
- .container {
- width: auto;
- }
- .row-fluid {
- width: 100%;
- }
- .row,
- .thumbnails {
- margin-left: 0;
- }
- .thumbnails > li {
- float: none;
- margin-left: 0;
- }
- [class*="span"],
- .uneditable-input[class*="span"],
- .row-fluid [class*="span"] {
- display: block;
- float: none;
- width: 100%;
- margin-left: 0;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- }
- .span12,
- .row-fluid .span12 {
- width: 100%;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- }
- .row-fluid [class*="offset"]:first-child {
- margin-left: 0;
- }
- .input-large,
- .input-xlarge,
- .input-xxlarge,
- input[class*="span"],
- select[class*="span"],
- textarea[class*="span"],
- .uneditable-input {
- display: block;
- width: 100%;
- min-height: 20px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- }
- .input-prepend input,
- .input-append input,
- .input-prepend input[class*="span"],
- .input-append input[class*="span"] {
- display: inline-block;
- width: auto;
- }
- .controls-row [class*="span"] + [class*="span"] {
- margin-left: 0;
- }
- .modal {
- position: fixed;
- top: 20px;
- right: 20px;
- left: 20px;
- width: auto;
- margin: 0;
- }
- .modal.fade {
- top: -100px;
- }
- .modal.fade.in {
- top: 18px;
- }
-}
-
-@media (max-width: 480px) {
- .page-header h1 small {
- display: block;
- line-height: 20px;
- }
- input[type="checkbox"],
- input[type="radio"] {
- border: 1px solid #ccc;
- }
- .form-horizontal .control-label {
- float: none;
- width: auto;
- padding-top: 0;
- text-align: left;
- }
- .form-horizontal .controls {
- margin-left: 0;
- }
- .form-horizontal .control-list {
- padding-top: 0;
- }
- .form-horizontal .form-actions {
- padding-right: 10px;
- padding-left: 10px;
- }
- .media .pull-left,
- .media .pull-right {
- display: block;
- float: none;
- margin-bottom: 20px;
- }
- .media-object {
- margin-right: 0;
- margin-left: 0;
- }
- .modal {
- top: 9px;
- right: 4px;
- left: 4px;
- }
- .modal-header .close {
- padding: 10px;
- margin: -10px;
- }
- .carousel-caption {
- position: static;
- }
-}
-
-@media (max-width: 979px) {
- body {
- padding-top: 0;
- }
-}
diff --git a/web/static/css/bootstrap.css b/web/static/css/bootstrap.css
@@ -1,6204 +0,0 @@
-/*!
- * Bootstrap v2.3.1
- *
- * Copyright 2012 Twitter, Inc
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
- */
-
-.clearfix {
- *zoom: 1;
-}
-
-.clearfix:before,
-.clearfix:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.clearfix:after {
- clear: both;
-}
-
-.hide-text {
- font: 0/0 a;
- color: transparent;
- text-shadow: none;
- background-color: transparent;
- border: 0;
-}
-
-.input-block-level {
- display: block;
- width: 100%;
- min-height: 20px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-nav,
-section {
- display: block;
-}
-
-audio,
-canvas,
-video {
- display: inline-block;
- *display: inline;
- *zoom: 1;
-}
-
-audio:not([controls]) {
- display: none;
-}
-
-html {
- font-size: 100%;
- -webkit-text-size-adjust: 100%;
- -ms-text-size-adjust: 100%;
-}
-
-a:focus {
- outline: thin solid #333;
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
-}
-
-a:hover,
-a:active {
- outline: 0;
-}
-
-sub,
-sup {
- position: relative;
- font-size: 75%;
- line-height: 0;
- vertical-align: baseline;
-}
-
-sup {
- top: -0.5em;
-}
-
-sub {
- bottom: -0.25em;
-}
-
-img {
- width: auto\9;
- height: auto;
- max-width: 100%;
- vertical-align: middle;
- border: 0;
- -ms-interpolation-mode: bicubic;
-}
-
-#map_canvas img,
-.google-maps img {
- max-width: none;
-}
-
-button,
-input,
-select,
-textarea {
- margin: 0;
- font-size: 100%;
- vertical-align: middle;
-}
-
-button,
-input {
- *overflow: visible;
- line-height: normal;
-}
-
-button::-moz-focus-inner,
-input::-moz-focus-inner {
- padding: 0;
- border: 0;
-}
-
-button,
-html input[type="button"],
-input[type="reset"],
-input[type="submit"] {
- cursor: pointer;
- -webkit-appearance: button;
-}
-
-label,
-select,
-button,
-input[type="button"],
-input[type="reset"],
-input[type="submit"],
-input[type="radio"],
-input[type="checkbox"] {
- cursor: pointer;
-}
-
-input[type="search"] {
- -webkit-box-sizing: content-box;
- -moz-box-sizing: content-box;
- box-sizing: content-box;
- -webkit-appearance: textfield;
-}
-
-input[type="search"]::-webkit-search-decoration,
-input[type="search"]::-webkit-search-cancel-button {
- -webkit-appearance: none;
-}
-
-textarea {
- overflow: auto;
- vertical-align: top;
-}
-
-@media print {
- * {
- color: #000 !important;
- text-shadow: none !important;
- background: transparent !important;
- box-shadow: none !important;
- }
- a,
- a:visited {
- text-decoration: none;
- }
- a[href]:after {
- content: " (" attr(href) ")";
- }
- abbr[title]:after {
- content: " (" attr(title) ")";
- }
- .ir a:after,
- a[href^="javascript:"]:after,
- a[href^="#"]:after {
- content: "";
- }
- pre,
- blockquote {
- border: 1px solid #999;
- page-break-inside: avoid;
- }
- thead {
- display: table-header-group;
- }
- tr,
- img {
- page-break-inside: avoid;
- }
- img {
- max-width: 100% !important;
- }
- @page {
- margin: 0.5cm;
- }
- p,
- h2,
- h3 {
- orphans: 3;
- widows: 3;
- }
- h2,
- h3 {
- page-break-after: avoid;
- }
-}
-
-@font-face {
- font-family: "DOS";
- font-style: normal;
- font-weight: normal;
- src: url("fonts/Fixedsys500c.eot");
- src:
- local("☺"),
- url("fonts/Fixedsys500c.woff") format("woff"),
- url("fonts/Fixedsys500c.ttf") format("truetype"),
- url("fonts/Fixedsys500c.svg") format("svg");
-}
-
-body {
- margin: 0;
- font-family: DOS, Monaco, Menlo, Consolas, "Courier New", monospace;
- font-size: 18px;
- line-height: 20px;
- color: #bbbbbb;
- background-color: #000084;
-}
-
-a {
- color: #fefe54;
- text-decoration: none;
-}
-
-a:hover,
-a:focus {
- color: #fefe54;
- background: #aa5500;
-}
-
-.img-rounded {
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.img-polaroid {
- padding: 9px 4px 9px 4px;
- background-color: #ffffff;
- border: 2px solid #000000;
-}
-
-.row {
- margin-left: -16px;
- *zoom: 1;
-}
-
-.row:before,
-.row:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.row:after {
- clear: both;
-}
-
-[class*="span"] {
- float: left;
- min-height: 1px;
- margin-left: 16px;
-}
-
-.container,
-.navbar-static-top .container,
-.navbar-fixed-top .container,
-.navbar-fixed-bottom .container {
- width: 944px;
-}
-
-.span12 {
- width: 944px;
-}
-
-.span11 {
- width: 864px;
-}
-
-.span10 {
- width: 784px;
-}
-
-.span9 {
- width: 704px;
-}
-
-.span8 {
- width: 624px;
-}
-
-.span7 {
- width: 544px;
-}
-
-.span6 {
- width: 464px;
-}
-
-.span5 {
- width: 384px;
-}
-
-.span4 {
- width: 304px;
-}
-
-.span3 {
- width: 224px;
-}
-
-.span2 {
- width: 144px;
-}
-
-.span1 {
- width: 64px;
-}
-
-.offset12 {
- margin-left: 976px;
-}
-
-.offset11 {
- margin-left: 896px;
-}
-
-.offset10 {
- margin-left: 816px;
-}
-
-.offset9 {
- margin-left: 736px;
-}
-
-.offset8 {
- margin-left: 656px;
-}
-
-.offset7 {
- margin-left: 576px;
-}
-
-.offset6 {
- margin-left: 496px;
-}
-
-.offset5 {
- margin-left: 416px;
-}
-
-.offset4 {
- margin-left: 336px;
-}
-
-.offset3 {
- margin-left: 256px;
-}
-
-.offset2 {
- margin-left: 176px;
-}
-
-.offset1 {
- margin-left: 96px;
-}
-
-.row-fluid {
- width: 100%;
- *zoom: 1;
-}
-
-.row-fluid:before,
-.row-fluid:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.row-fluid:after {
- clear: both;
-}
-
-.row-fluid [class*="span"] {
- display: block;
- float: left;
- width: 100%;
- min-height: 20px;
- margin-left: 1.694915254237288%;
- *margin-left: 1.6419491525423728%;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-
-.row-fluid [class*="span"]:first-child {
- margin-left: 0;
-}
-
-.row-fluid .controls-row [class*="span"] + [class*="span"] {
- margin-left: 1.694915254237288%;
-}
-
-.row-fluid .span12 {
- width: 100%;
- *width: 99.94703389830508%;
-}
-
-.row-fluid .span11 {
- width: 91.52542372881356%;
- *width: 91.47245762711864%;
-}
-
-.row-fluid .span10 {
- width: 83.0508474576271%;
- *width: 82.99788135593218%;
-}
-
-.row-fluid .span9 {
- width: 74.57627118644066%;
- *width: 74.52330508474574%;
-}
-
-.row-fluid .span8 {
- width: 66.10169491525423%;
- *width: 66.04872881355931%;
-}
-
-.row-fluid .span7 {
- width: 57.6271186440678%;
- *width: 57.574152542372886%;
-}
-
-.row-fluid .span6 {
- width: 49.152542372881356%;
- *width: 49.09957627118644%;
-}
-
-.row-fluid .span5 {
- width: 40.677966101694906%;
- *width: 40.62499999999999%;
-}
-
-.row-fluid .span4 {
- width: 32.20338983050847%;
- *width: 32.15042372881356%;
-}
-
-.row-fluid .span3 {
- width: 23.728813559322035%;
- *width: 23.675847457627118%;
-}
-
-.row-fluid .span2 {
- width: 15.254237288135592%;
- *width: 15.201271186440676%;
-}
-
-.row-fluid .span1 {
- width: 6.779661016949152%;
- *width: 6.726694915254237%;
-}
-
-.row-fluid .offset12 {
- margin-left: 103.38983050847457%;
- *margin-left: 103.28389830508473%;
-}
-
-.row-fluid .offset12:first-child {
- margin-left: 101.69491525423729%;
- *margin-left: 101.58898305084745%;
-}
-
-.row-fluid .offset11 {
- margin-left: 94.91525423728814%;
- *margin-left: 94.8093220338983%;
-}
-
-.row-fluid .offset11:first-child {
- margin-left: 93.22033898305085%;
- *margin-left: 93.11440677966101%;
-}
-
-.row-fluid .offset10 {
- margin-left: 86.44067796610167%;
- *margin-left: 86.33474576271183%;
-}
-
-.row-fluid .offset10:first-child {
- margin-left: 84.74576271186439%;
- *margin-left: 84.63983050847455%;
-}
-
-.row-fluid .offset9 {
- margin-left: 77.96610169491524%;
- *margin-left: 77.8601694915254%;
-}
-
-.row-fluid .offset9:first-child {
- margin-left: 76.27118644067795%;
- *margin-left: 76.16525423728811%;
-}
-
-.row-fluid .offset8 {
- margin-left: 69.4915254237288%;
- *margin-left: 69.38559322033896%;
-}
-
-.row-fluid .offset8:first-child {
- margin-left: 67.79661016949152%;
- *margin-left: 67.69067796610167%;
-}
-
-.row-fluid .offset7 {
- margin-left: 61.016949152542374%;
- *margin-left: 60.91101694915255%;
-}
-
-.row-fluid .offset7:first-child {
- margin-left: 59.32203389830509%;
- *margin-left: 59.21610169491526%;
-}
-
-.row-fluid .offset6 {
- margin-left: 52.54237288135593%;
- *margin-left: 52.436440677966104%;
-}
-
-.row-fluid .offset6:first-child {
- margin-left: 50.847457627118644%;
- *margin-left: 50.74152542372882%;
-}
-
-.row-fluid .offset5 {
- margin-left: 44.06779661016948%;
- *margin-left: 43.961864406779654%;
-}
-
-.row-fluid .offset5:first-child {
- margin-left: 42.37288135593219%;
- *margin-left: 42.26694915254237%;
-}
-
-.row-fluid .offset4 {
- margin-left: 35.593220338983045%;
- *margin-left: 35.48728813559322%;
-}
-
-.row-fluid .offset4:first-child {
- margin-left: 33.89830508474576%;
- *margin-left: 33.79237288135593%;
-}
-
-.row-fluid .offset3 {
- margin-left: 27.11864406779661%;
- *margin-left: 27.01271186440678%;
-}
-
-.row-fluid .offset3:first-child {
- margin-left: 25.423728813559322%;
- *margin-left: 25.317796610169488%;
-}
-
-.row-fluid .offset2 {
- margin-left: 18.644067796610166%;
- *margin-left: 18.538135593220336%;
-}
-
-.row-fluid .offset2:first-child {
- margin-left: 16.94915254237288%;
- *margin-left: 16.84322033898305%;
-}
-
-.row-fluid .offset1 {
- margin-left: 10.169491525423728%;
- *margin-left: 10.063559322033898%;
-}
-
-.row-fluid .offset1:first-child {
- margin-left: 8.47457627118644%;
- *margin-left: 8.36864406779661%;
-}
-
-[class*="span"].hide,
-.row-fluid [class*="span"].hide {
- display: none;
-}
-
-[class*="span"].pull-right,
-.row-fluid [class*="span"].pull-right {
- float: right;
-}
-
-.container {
- margin-left: 20px;
- *zoom: 1;
-}
-
-.container:before,
-.container:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.container:after {
- clear: both;
-}
-
-.container-fluid {
- padding-right: 16px;
- padding-left: 16px;
- *zoom: 1;
-}
-
-.container-fluid:before,
-.container-fluid:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.container-fluid:after {
- clear: both;
-}
-
-img {
- -webkit-filter: contrast(800%);
- -moz-filter: contrast(1000%);
- -ms-filter: contrast(800%);
- -o-filter: contrast(800%);
- filter: contrast(1000%);
-}
-
-p {
- margin: 0 0 20px;
-}
-
-.lead {
- padding: 9px 14px 9px 14px;
- margin: 9px 4px 9px 4px;
- font-size: 18px;
- color: #ffffff;
- border: 2px solid #bbbbbb;
-}
-
-small {
- font-size: 100%;
-}
-
-strong {
- font-weight: normal;
- color: #ffffff;
-}
-
-em {
- font-weight: normal;
- color: #ffffff;
-}
-
-cite {
- font-style: normal;
-}
-
-i,
-cite,
-em,
-var,
-address,
-dfn {
- font-style: normal;
-}
-
-i:before,
-cite:before,
-em:before,
-var:before,
-address:before,
-dfn:before,
-i:after,
-cite:after,
-em:after,
-var:after,
-address:after,
-dfn:after {
- content: "/";
-}
-
-.muted {
- display: none;
- color: #bbbbbb;
-}
-
-.text-warning {
- color: #ffffff;
-}
-
-a.text-warning:hover,
-a.text-warning:focus {
- color: #ffffff;
-}
-
-.text-error {
- color: #ffffff;
-}
-
-a.text-error:hover,
-a.text-error:focus {
- color: #ffffff;
-}
-
-.text-info {
- color: #000000;
-}
-
-a.text-info:hover,
-a.text-info:focus {
- color: #000000;
-}
-
-.text-success {
- color: #00aa00;
-}
-
-a.text-success:hover,
-a.text-success:focus {
- color: #00aa00;
-}
-
-.text-left {
- text-align: left;
-}
-
-.text-right {
- text-align: right;
-}
-
-.text-center {
- text-align: center;
-}
-
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
- margin: 0;
- font-family: inherit;
- font-weight: inherit;
- line-height: 20px;
- color: #ffffff;
- text-rendering: optimizelegibility;
-}
-
-h1 small,
-h2 small,
-h3 small,
-h4 small,
-h5 small,
-h6 small {
- font-weight: normal;
- line-height: 1;
- color: #bbbbbb;
-}
-
-h1,
-h2,
-h3 {
- line-height: 20px;
-}
-
-h3:before {
- content: ">>> ";
-}
-
-h3:after {
- content: " <<<";
-}
-
-h1 {
- font-size: 18px;
- text-transform: uppercase;
-}
-
-h2 {
- font-size: 18px;
- text-align: center;
- white-space: nowrap;
-}
-
-h3 {
- font-size: 18px;
-}
-
-h4 {
- font-size: 18px;
- color: #fe54fe;
-}
-
-h5 {
- font-size: 18px;
-}
-
-h6 {
- font-size: 18px;
-}
-
-h1 small {
- font-size: 18px;
-}
-
-h2 small {
- font-size: 18px;
-}
-
-h3 small {
- font-size: 18px;
-}
-
-h4 small {
- font-size: 18px;
-}
-
-.page-header {
- padding: 20px 20px;
- margin: 20px 0 20px;
- background: #00aaaa;
-}
-
-.page-header h1 {
- color: #000000;
-}
-
-ul,
-ol {
- padding: 0;
- margin: 0 0 20px 18px;
-}
-
-ul {
- list-style: square;
-}
-
-ol {
- margin-left: 21px;
- list-style: decimal;
-}
-
-ol > li {
- padding-left: 0;
-}
-
-ul ul,
-ul ol,
-ol ol,
-ol ul {
- margin-bottom: 0;
- list-style: square;
-}
-
-li {
- padding-left: 4px;
- margin-left: 0;
- line-height: 20px;
-}
-
-ol > li {
- margin-left: 12px;
-}
-
-ul.unstyled,
-ol.unstyled {
- margin-left: 0;
- list-style: none;
-}
-
-ul.unstyled > li,
-ol.unstyled > li {
- padding-left: 0;
-}
-
-ul.inline,
-ol.inline {
- margin-left: 0;
- list-style: none;
-}
-
-ul.inline > li,
-ol.inline > li {
- display: inline-block;
- *display: inline;
- padding-right: 9.5px;
- padding-left: 10.7px;
- *zoom: 1;
-}
-
-dl {
- margin-bottom: 20px;
-}
-
-dt,
-dd {
- line-height: 20px;
-}
-
-dt {
- font-weight: normal;
-}
-
-dd {
- margin-left: 21px;
-}
-
-.dl-horizontal {
- *zoom: 1;
-}
-
-.dl-horizontal:before,
-.dl-horizontal:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.dl-horizontal:after {
- clear: both;
-}
-
-.dl-horizontal dt {
- float: left;
- width: 162px;
- overflow: hidden;
- clear: left;
- text-align: right;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-
-.dl-horizontal dd {
- margin-left: 182px;
-}
-
-hr {
- margin: 6px 0 7px;
- border: 0;
- border-top: 0px solid #bbbbbb;
- border-bottom: 2px solid #ffffff;
-}
-
-abbr[title],
-abbr[data-original-title] {
- cursor: help;
- border: 0;
-}
-
-abbr.initialism {
- font-size: 90%;
- text-transform: uppercase;
-}
-
-blockquote {
- padding: 0 0 0 15px;
- margin: 0 0 20px;
- border-left: 5px solid #bbbbbb;
-}
-
-blockquote p {
- margin-bottom: 0;
- font-size: 18px;
- line-height: 20px;
-}
-
-blockquote small {
- display: block;
- line-height: 20px;
- color: #bbbbbb;
-}
-
-blockquote small:before {
- content: "\2014 \00A0";
-}
-
-blockquote.pull-right {
- float: right;
- padding-right: 1em;
- padding-left: 0;
- border-right: 5px solid #bbbbbb;
- border-left: 0;
-}
-
-blockquote.pull-right p,
-blockquote.pull-right small {
- text-align: right;
-}
-
-blockquote.pull-right small:before {
- content: "";
-}
-
-blockquote.pull-right small:after {
- content: "\00A0 \2014";
-}
-
-q:before,
-q:after,
-blockquote:before,
-blockquote:after {
- content: "";
-}
-
-address {
- display: block;
- margin-bottom: 20px;
- font-style: normal;
- line-height: 20px;
-}
-
-code,
-pre {
- padding: 0;
- font-family: DOS, Monaco, Menlo, Consolas, "Courier New", monospace;
- font-size: 18px;
- color: #555555;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-code {
- padding: 0;
- color: #ffffff;
- white-space: nowrap;
- background-color: #000000;
- border: 0;
-}
-
-pre {
- display: block;
- padding: 0;
- margin: 0 0 10px;
- font-size: 18px;
- font-weight: normal;
- line-height: 20px;
- word-break: break-all;
- word-wrap: break-word;
- white-space: pre;
- white-space: pre-wrap;
- background-color: #000000;
- border: 0;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-pre.prettyprint {
- margin-bottom: 20px;
-}
-
-pre code {
- padding: 0;
- color: inherit;
- white-space: pre;
- white-space: pre-wrap;
- background-color: transparent;
- border: 0;
-}
-
-.pre-scrollable {
- max-height: 340px;
- overflow-y: scroll;
-}
-
-form {
- margin: 0 0 20px;
-}
-
-fieldset {
- padding: 0;
- margin: 0;
- border: 0;
-}
-
-legend {
- display: block;
- width: 100%;
- padding: 0;
- margin-bottom: 20px;
- font-size: 18px;
- line-height: 40px;
- color: #ffffff;
- border: 0;
-}
-
-legend small {
- font-size: 20px;
- color: #bbbbbb;
-}
-
-legend:before {
- content: "## ";
-}
-
-legend:after {
- content: " ##";
-}
-
-label,
-input,
-button,
-select,
-textarea {
- font-size: 18px;
- font-weight: normal;
- line-height: 20px;
-}
-
-input,
-button,
-select,
-textarea {
- font-family: DOS, Monaco, Menlo, Consolas, "Courier New", monospace;
-}
-
-label {
- display: block;
- margin-bottom: 5px;
-}
-
-select,
-textarea,
-input[type="text"],
-input[type="password"],
-input[type="datetime"],
-input[type="datetime-local"],
-input[type="date"],
-input[type="month"],
-input[type="time"],
-input[type="week"],
-input[type="number"],
-input[type="email"],
-input[type="url"],
-input[type="search"],
-input[type="tel"],
-input[type="color"],
-.uneditable-input {
- display: inline-block;
- height: 20px;
- padding: 0 0;
- margin: 10px 5px;
- font-size: 18px;
- line-height: 20px;
- color: #000000;
- vertical-align: middle;
- background: #bbbbbb;
- border: 2px solid #000000;
-}
-
-input[type="text"]:before {
- content: "[";
-}
-
-input[type="text"]:after {
- content: "]";
-}
-
-input,
-textarea,
-.uneditable-input {
- width: 206px;
-}
-
-textarea {
- height: auto;
-}
-
-textarea,
-input[type="text"],
-input[type="password"],
-input[type="datetime"],
-input[type="datetime-local"],
-input[type="date"],
-input[type="month"],
-input[type="time"],
-input[type="week"],
-input[type="number"],
-input[type="email"],
-input[type="url"],
-input[type="search"],
-input[type="tel"],
-input[type="color"],
-.uneditable-input {
- background-color: #bbbbbb;
- border: 0;
-}
-
-textarea:focus,
-input[type="text"]:focus,
-input[type="password"]:focus,
-input[type="datetime"]:focus,
-input[type="datetime-local"]:focus,
-input[type="date"]:focus,
-input[type="month"]:focus,
-input[type="time"]:focus,
-input[type="week"]:focus,
-input[type="number"]:focus,
-input[type="email"]:focus,
-input[type="url"]:focus,
-input[type="search"]:focus,
-input[type="tel"]:focus,
-input[type="color"]:focus,
-.uneditable-input:focus {
- outline: 0;
-}
-
-input[type="radio"],
-input[type="checkbox"] {
- margin: 4px 0 0;
- margin-top: 1px \9;
- *margin-top: 0;
- line-height: normal;
-}
-
-input[type="file"],
-input[type="image"],
-input[type="submit"],
-input[type="reset"],
-input[type="button"],
-input[type="radio"],
-input[type="checkbox"] {
- width: auto;
-}
-
-select,
-input[type="file"] {
- height: 20px;
- /* In IE7, the height of the select element cannot be changed by height, only font-size */
-
- *margin-top: 4px;
- /* For IE7, add top margin to align select with labels */
-
- line-height: 20px;
-}
-
-select {
- width: 220px;
- background-color: #ffffff;
- border: 1px solid #cccccc;
-}
-
-select[multiple],
-select[size] {
- height: auto;
-}
-
-select:focus,
-input[type="file"]:focus,
-input[type="radio"]:focus,
-input[type="checkbox"]:focus {
- outline: thin solid #333;
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
-}
-
-.uneditable-input,
-.uneditable-textarea {
- color: #bbbbbb;
- cursor: not-allowed;
- background-color: #fcfcfc;
- border-color: #cccccc;
-}
-
-.uneditable-input {
- overflow: hidden;
- white-space: nowrap;
-}
-
-.uneditable-textarea {
- width: auto;
- height: auto;
-}
-
-input:-moz-placeholder,
-textarea:-moz-placeholder {
- color: #bbbbbb;
-}
-
-input:-ms-input-placeholder,
-textarea:-ms-input-placeholder {
- color: #bbbbbb;
-}
-
-input::-webkit-input-placeholder,
-textarea::-webkit-input-placeholder {
- color: #bbbbbb;
-}
-
-.radio,
-.checkbox {
- min-height: 20px;
- padding-left: 20px;
-}
-
-.radio input[type="radio"],
-.checkbox input[type="checkbox"] {
- float: left;
- margin-left: -20px;
-}
-
-.controls > .radio:first-child,
-.controls > .checkbox:first-child {
- padding-top: 5px;
-}
-
-.radio.inline,
-.checkbox.inline {
- display: inline-block;
- padding-top: 5px;
- margin-bottom: 0;
- vertical-align: middle;
-}
-
-.radio.inline + .radio.inline,
-.checkbox.inline + .checkbox.inline {
- margin-left: 10px;
-}
-
-.input-mini {
- width: 60px;
-}
-
-.input-small {
- width: 90px;
-}
-
-.input-medium {
- width: 150px;
-}
-
-.input-large {
- width: 210px;
-}
-
-.input-xlarge {
- width: 270px;
-}
-
-.input-xxlarge {
- width: 530px;
-}
-
-input[class*="span"],
-select[class*="span"],
-textarea[class*="span"],
-.uneditable-input[class*="span"],
-.row-fluid input[class*="span"],
-.row-fluid select[class*="span"],
-.row-fluid textarea[class*="span"],
-.row-fluid .uneditable-input[class*="span"] {
- float: none;
- margin-left: 0;
-}
-
-.input-append input[class*="span"],
-.input-append .uneditable-input[class*="span"],
-.input-prepend input[class*="span"],
-.input-prepend .uneditable-input[class*="span"],
-.row-fluid input[class*="span"],
-.row-fluid select[class*="span"],
-.row-fluid textarea[class*="span"],
-.row-fluid .uneditable-input[class*="span"],
-.row-fluid .input-prepend [class*="span"],
-.row-fluid .input-append [class*="span"] {
- display: inline-block;
-}
-
-input,
-textarea,
-.uneditable-input {
- margin-left: 0;
-}
-
-.controls-row [class*="span"] + [class*="span"] {
- margin-left: 16px;
-}
-
-input.span12,
-textarea.span12,
-.uneditable-input.span12 {
- width: 930px;
-}
-
-input.span11,
-textarea.span11,
-.uneditable-input.span11 {
- width: 850px;
-}
-
-input.span10,
-textarea.span10,
-.uneditable-input.span10 {
- width: 770px;
-}
-
-input.span9,
-textarea.span9,
-.uneditable-input.span9 {
- width: 690px;
-}
-
-input.span8,
-textarea.span8,
-.uneditable-input.span8 {
- width: 610px;
-}
-
-input.span7,
-textarea.span7,
-.uneditable-input.span7 {
- width: 530px;
-}
-
-input.span6,
-textarea.span6,
-.uneditable-input.span6 {
- width: 450px;
-}
-
-input.span5,
-textarea.span5,
-.uneditable-input.span5 {
- width: 370px;
-}
-
-input.span4,
-textarea.span4,
-.uneditable-input.span4 {
- width: 290px;
-}
-
-input.span3,
-textarea.span3,
-.uneditable-input.span3 {
- width: 210px;
-}
-
-input.span2,
-textarea.span2,
-.uneditable-input.span2 {
- width: 130px;
-}
-
-input.span1,
-textarea.span1,
-.uneditable-input.span1 {
- width: 50px;
-}
-
-.controls-row {
- *zoom: 1;
-}
-
-.controls-row:before,
-.controls-row:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.controls-row:after {
- clear: both;
-}
-
-.controls-row [class*="span"],
-.row-fluid .controls-row [class*="span"] {
- float: left;
-}
-
-.controls-row .checkbox[class*="span"],
-.controls-row .radio[class*="span"] {
- padding-top: 5px;
-}
-
-input[disabled],
-select[disabled],
-textarea[disabled],
-input[readonly],
-select[readonly],
-textarea[readonly] {
- cursor: not-allowed;
- background-color: #bbbbbb;
-}
-
-input[type="radio"][disabled],
-input[type="checkbox"][disabled],
-input[type="radio"][readonly],
-input[type="checkbox"][readonly] {
- background-color: transparent;
-}
-
-.control-group.warning .control-label,
-.control-group.warning .help-block,
-.control-group.warning .help-inline {
- color: #ffffff;
-}
-
-.control-group.warning .checkbox,
-.control-group.warning .radio,
-.control-group.warning input,
-.control-group.warning select,
-.control-group.warning textarea {
- color: #ffffff;
-}
-
-.control-group.warning input,
-.control-group.warning select,
-.control-group.warning textarea {
- border-color: #ffffff;
-}
-
-.control-group.warning input:focus,
-.control-group.warning select:focus,
-.control-group.warning textarea:focus {
- border-color: #ffffff;
- -webkit-box-shadow: 0;
- -moz-box-shadow: 0;
- box-shadow: 0;
-}
-
-.control-group.warning .input-prepend .add-on,
-.control-group.warning .input-append .add-on {
- color: #ffffff;
- background-color: #00aaaa;
- border-color: #ffffff;
-}
-
-.control-group.error .control-label,
-.control-group.error .help-block,
-.control-group.error .help-inline {
- color: #ffffff;
-}
-
-.control-group.error .checkbox,
-.control-group.error .radio,
-.control-group.error input,
-.control-group.error select,
-.control-group.error textarea {
- color: #ffffff;
-}
-
-.control-group.error input,
-.control-group.error select,
-.control-group.error textarea {
- border-color: #ffffff;
-}
-
-.control-group.error input:focus,
-.control-group.error select:focus,
-.control-group.error textarea:focus {
- border-color: #ffffff;
- -webkit-box-shadow: 0;
- -moz-box-shadow: 0;
- box-shadow: 0;
-}
-
-.control-group.error .input-prepend .add-on,
-.control-group.error .input-append .add-on {
- color: #ffffff;
- background-color: #aa0000;
- border-color: #ffffff;
-}
-
-.control-group.success .control-label,
-.control-group.success .help-block,
-.control-group.success .help-inline {
- color: #00aa00;
-}
-
-.control-group.success .checkbox,
-.control-group.success .radio,
-.control-group.success input,
-.control-group.success select,
-.control-group.success textarea {
- color: #00aa00;
-}
-
-.control-group.success input,
-.control-group.success select,
-.control-group.success textarea {
- border-color: #00aa00;
-}
-
-.control-group.success input:focus,
-.control-group.success select:focus,
-.control-group.success textarea:focus {
- border-color: #00aa00;
- -webkit-box-shadow: 0;
- -moz-box-shadow: 0;
- box-shadow: 0;
-}
-
-.control-group.success .input-prepend .add-on,
-.control-group.success .input-append .add-on {
- color: #00aa00;
- background-color: #000000;
- border-color: #00aa00;
-}
-
-.control-group.info .control-label,
-.control-group.info .help-block,
-.control-group.info .help-inline {
- color: #000000;
-}
-
-.control-group.info .checkbox,
-.control-group.info .radio,
-.control-group.info input,
-.control-group.info select,
-.control-group.info textarea {
- color: #000000;
-}
-
-.control-group.info input,
-.control-group.info select,
-.control-group.info textarea {
- border-color: #000000;
-}
-
-.control-group.info input:focus,
-.control-group.info select:focus,
-.control-group.info textarea:focus {
- border-color: #000000;
- -webkit-box-shadow: 0;
- -moz-box-shadow: 0;
- box-shadow: 0;
-}
-
-.control-group.info .input-prepend .add-on,
-.control-group.info .input-append .add-on {
- color: #000000;
- background-color: #000000;
- border-color: #000000;
-}
-
-input:focus:invalid,
-textarea:focus:invalid,
-select:focus:invalid {
- color: #b94a48;
- border-color: #ee5f5b;
-}
-
-input:focus:invalid:focus,
-textarea:focus:invalid:focus,
-select:focus:invalid:focus {
- border-color: #e9322d;
- -webkit-box-shadow: 0 0 6px #f8b9b7;
- -moz-box-shadow: 0 0 6px #f8b9b7;
- box-shadow: 0 0 6px #f8b9b7;
-}
-
-.form-actions {
- padding: 19px 20px 20px;
- margin-top: 20px;
- margin-bottom: 20px;
- background-color: #f5f5f5;
- border-top: 1px solid #e5e5e5;
- *zoom: 1;
-}
-
-.form-actions:before,
-.form-actions:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.form-actions:after {
- clear: both;
-}
-
-.help-block,
-.help-inline {
- color: #e1e1e1;
-}
-
-.help-block {
- display: block;
- margin-bottom: 10px;
-}
-
-.help-inline {
- display: inline-block;
- *display: inline;
- padding-left: 5px;
- vertical-align: middle;
- *zoom: 1;
-}
-
-.input-append,
-.input-prepend {
- display: inline-block;
- margin-bottom: 10px;
- font-size: 0;
- white-space: nowrap;
- vertical-align: middle;
-}
-
-.input-append input,
-.input-prepend input,
-.input-append select,
-.input-prepend select,
-.input-append .uneditable-input,
-.input-prepend .uneditable-input,
-.input-append .dropdown-menu,
-.input-prepend .dropdown-menu,
-.input-append .popover,
-.input-prepend .popover {
- font-size: 18px;
-}
-
-.input-append input,
-.input-prepend input,
-.input-append select,
-.input-prepend select,
-.input-append .uneditable-input,
-.input-prepend .uneditable-input {
- position: relative;
- margin-bottom: 0;
- *margin-left: 0;
- vertical-align: top;
- -webkit-border-radius: 0 0 0px 0;
- -moz-border-radius: 0 0 0px 0;
- border-radius: 0 0 0px 0;
-}
-
-.input-append input:focus,
-.input-prepend input:focus,
-.input-append select:focus,
-.input-prepend select:focus,
-.input-append .uneditable-input:focus,
-.input-prepend .uneditable-input:focus {
- z-index: 2;
-}
-
-.input-append .add-on,
-.input-prepend .add-on {
- display: inline-block;
- width: auto;
- height: 20px;
- min-width: 16px;
- padding: 4px 5px;
- font-size: 18px;
- font-weight: normal;
- line-height: 20px;
- text-align: center;
- text-shadow: 0;
- background-color: #bbbbbb;
- border: 0;
-}
-
-.input-append .add-on,
-.input-prepend .add-on,
-.input-append .btn,
-.input-prepend .btn,
-.input-append .btn-group > .dropdown-toggle,
-.input-prepend .btn-group > .dropdown-toggle {
- vertical-align: top;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.input-prepend .add-on,
-.input-prepend .btn {
- margin-right: -1px;
-}
-
-.input-prepend .add-on:first-child,
-.input-prepend .btn:first-child {
- -webkit-border-radius: 0 0 0 0px;
- -moz-border-radius: 0 0 0 0px;
- border-radius: 0 0 0 0px;
-}
-
-.input-append input,
-.input-append select,
-.input-append .uneditable-input {
- -webkit-border-radius: 0 0 0 0px;
- -moz-border-radius: 0 0 0 0px;
- border-radius: 0 0 0 0px;
-}
-
-.input-append input + .btn-group .btn:last-child,
-.input-append select + .btn-group .btn:last-child,
-.input-append .uneditable-input + .btn-group .btn:last-child {
- -webkit-border-radius: 0 0 0px 0;
- -moz-border-radius: 0 0 0px 0;
- border-radius: 0 0 0px 0;
-}
-
-.input-append .add-on,
-.input-append .btn,
-.input-append .btn-group {
- margin-left: -1px;
-}
-
-.input-append .add-on:last-child,
-.input-append .btn:last-child,
-.input-append .btn-group:last-child > .dropdown-toggle {
- -webkit-border-radius: 0 0 0px 0;
- -moz-border-radius: 0 0 0px 0;
- border-radius: 0 0 0px 0;
-}
-
-.input-prepend.input-append input,
-.input-prepend.input-append select,
-.input-prepend.input-append .uneditable-input {
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.input-prepend.input-append input + .btn-group .btn,
-.input-prepend.input-append select + .btn-group .btn,
-.input-prepend.input-append .uneditable-input + .btn-group .btn {
- -webkit-border-radius: 0 0 0px 0;
- -moz-border-radius: 0 0 0px 0;
- border-radius: 0 0 0px 0;
-}
-
-.input-prepend.input-append .add-on:first-child,
-.input-prepend.input-append .btn:first-child {
- margin-right: -1px;
- -webkit-border-radius: 0 0 0 0px;
- -moz-border-radius: 0 0 0 0px;
- border-radius: 0 0 0 0px;
-}
-
-.input-prepend.input-append .add-on:last-child,
-.input-prepend.input-append .btn:last-child {
- margin-left: -1px;
- -webkit-border-radius: 0 0 0px 0;
- -moz-border-radius: 0 0 0px 0;
- border-radius: 0 0 0px 0;
-}
-
-.input-prepend.input-append .btn-group:first-child {
- margin-left: 0;
-}
-
-input.search-query {
- padding-right: 14px;
- padding-right: 4px \9;
- padding-left: 14px;
- padding-left: 4px \9;
- /* IE7-8 doesn't have border-radius, so don't indent the padding */
-
- margin-bottom: 0;
-}
-
-/* Allow for input prepend/append in search forms */
-
-.form-search .input-append .search-query,
-.form-search .input-prepend .search-query {
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.form-search input,
-.form-inline input,
-.form-horizontal input,
-.form-search textarea,
-.form-inline textarea,
-.form-horizontal textarea,
-.form-search select,
-.form-inline select,
-.form-horizontal select,
-.form-search .help-inline,
-.form-inline .help-inline,
-.form-horizontal .help-inline,
-.form-search .uneditable-input,
-.form-inline .uneditable-input,
-.form-horizontal .uneditable-input,
-.form-search .input-prepend,
-.form-inline .input-prepend,
-.form-horizontal .input-prepend,
-.form-search .input-append,
-.form-inline .input-append,
-.form-horizontal .input-append {
- display: inline-block;
- *display: inline;
- margin-bottom: 0;
- vertical-align: middle;
- *zoom: 1;
-}
-
-.form-search .hide,
-.form-inline .hide,
-.form-horizontal .hide {
- display: none;
-}
-
-.form-search label,
-.form-inline label,
-.form-search .btn-group,
-.form-inline .btn-group {
- display: inline-block;
-}
-
-.form-search .input-append,
-.form-inline .input-append,
-.form-search .input-prepend,
-.form-inline .input-prepend {
- margin-bottom: 0;
-}
-
-.form-search .radio,
-.form-search .checkbox,
-.form-inline .radio,
-.form-inline .checkbox {
- padding-left: 0;
- margin-bottom: 0;
- vertical-align: middle;
-}
-
-.form-search .radio input[type="radio"],
-.form-search .checkbox input[type="checkbox"],
-.form-inline .radio input[type="radio"],
-.form-inline .checkbox input[type="checkbox"] {
- float: left;
- margin-right: 3px;
- margin-left: 0;
-}
-
-.control-group {
- margin-bottom: 10px;
-}
-
-legend + .control-group {
- margin-top: 20px;
- -webkit-margin-top-collapse: separate;
-}
-
-.form-horizontal .control-group {
- margin-bottom: 20px;
- *zoom: 1;
-}
-
-.form-horizontal .control-group:before,
-.form-horizontal .control-group:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.form-horizontal .control-group:after {
- clear: both;
-}
-
-.form-horizontal .control-label {
- float: left;
- width: 162px;
- padding-top: 5px;
- text-align: right;
-}
-
-.form-horizontal .controls {
- *display: inline-block;
- *padding-left: 20px;
- margin-left: 182px;
- *margin-left: 0;
-}
-
-.form-horizontal .controls:first-child {
- *padding-left: 182px;
-}
-
-.form-horizontal .help-block {
- margin-bottom: 0;
-}
-
-.form-horizontal input + .help-block,
-.form-horizontal select + .help-block,
-.form-horizontal textarea + .help-block,
-.form-horizontal .uneditable-input + .help-block,
-.form-horizontal .input-prepend + .help-block,
-.form-horizontal .input-append + .help-block {
- margin-top: 10px;
-}
-
-.form-horizontal .form-actions {
- padding-left: 182px;
-}
-
-table {
- max-width: 100%;
- background-color: transparent;
- border-collapse: collapse;
- border-spacing: 0;
-}
-
-.table {
- width: 100%;
- margin-bottom: 20px;
-}
-
-.table th,
-.table td {
- padding: 8px;
- line-height: 20px;
- text-align: left;
- vertical-align: top;
- border-top: 2px solid #dddddd;
-}
-
-.table th {
- font-weight: normal;
-}
-
-.table thead th {
- vertical-align: bottom;
-}
-
-.table caption + thead tr:first-child th,
-.table caption + thead tr:first-child td,
-.table colgroup + thead tr:first-child th,
-.table colgroup + thead tr:first-child td,
-.table thead:first-child tr:first-child th,
-.table thead:first-child tr:first-child td {
- border-top: 0;
-}
-
-.table tbody + tbody {
- border-top: 2px solid #dddddd;
-}
-
-.table .table {
- background-color: #000084;
-}
-
-.table-condensed th,
-.table-condensed td {
- padding: 4px 5px;
-}
-
-.table-bordered {
- margin-left: 4px;
- border: 2px solid #dddddd;
- border-collapse: separate;
- *border-collapse: collapse;
- border-left: 0;
-}
-
-.table-bordered th,
-.table-bordered td {
- padding: inherit 5.2px;
- border-left: 2px solid #dddddd;
-}
-
-.table-bordered caption + thead tr:first-child th,
-.table-bordered caption + tbody tr:first-child th,
-.table-bordered caption + tbody tr:first-child td,
-.table-bordered colgroup + thead tr:first-child th,
-.table-bordered colgroup + tbody tr:first-child th,
-.table-bordered colgroup + tbody tr:first-child td,
-.table-bordered thead:first-child tr:first-child th,
-.table-bordered tbody:first-child tr:first-child th,
-.table-bordered tbody:first-child tr:first-child td {
- border-top: 0;
-}
-
-.table-bordered thead:first-child tr:first-child > th:first-child,
-.table-bordered tbody:first-child tr:first-child > td:first-child,
-.table-bordered tbody:first-child tr:first-child > th:first-child {
- -webkit-border-top-left-radius: 0;
- border-top-left-radius: 0;
- -moz-border-radius-topleft: 0;
-}
-
-.table-bordered thead:first-child tr:first-child > th:last-child,
-.table-bordered tbody:first-child tr:first-child > td:last-child,
-.table-bordered tbody:first-child tr:first-child > th:last-child {
- -webkit-border-top-right-radius: 0;
- border-top-right-radius: 0;
- -moz-border-radius-topright: 0;
-}
-
-.table-bordered thead:last-child tr:last-child > th:first-child,
-.table-bordered tbody:last-child tr:last-child > td:first-child,
-.table-bordered tbody:last-child tr:last-child > th:first-child,
-.table-bordered tfoot:last-child tr:last-child > td:first-child,
-.table-bordered tfoot:last-child tr:last-child > th:first-child {
- -webkit-border-bottom-left-radius: 0;
- border-bottom-left-radius: 0;
- -moz-border-radius-bottomleft: 0;
-}
-
-.table-bordered thead:last-child tr:last-child > th:last-child,
-.table-bordered tbody:last-child tr:last-child > td:last-child,
-.table-bordered tbody:last-child tr:last-child > th:last-child,
-.table-bordered tfoot:last-child tr:last-child > td:last-child,
-.table-bordered tfoot:last-child tr:last-child > th:last-child {
- -webkit-border-bottom-right-radius: 0;
- border-bottom-right-radius: 0;
- -moz-border-radius-bottomright: 0;
-}
-
-.table-bordered tfoot + tbody:last-child tr:last-child td:first-child {
- -webkit-border-bottom-left-radius: 0;
- border-bottom-left-radius: 0;
- -moz-border-radius-bottomleft: 0;
-}
-
-.table-bordered tfoot + tbody:last-child tr:last-child td:last-child {
- -webkit-border-bottom-right-radius: 0;
- border-bottom-right-radius: 0;
- -moz-border-radius-bottomright: 0;
-}
-
-.table-bordered caption + thead tr:first-child th:first-child,
-.table-bordered caption + tbody tr:first-child td:first-child,
-.table-bordered colgroup + thead tr:first-child th:first-child,
-.table-bordered colgroup + tbody tr:first-child td:first-child {
- -webkit-border-top-left-radius: 0;
- border-top-left-radius: 0;
- -moz-border-radius-topleft: 0;
-}
-
-.table-bordered caption + thead tr:first-child th:last-child,
-.table-bordered caption + tbody tr:first-child td:last-child,
-.table-bordered colgroup + thead tr:first-child th:last-child,
-.table-bordered colgroup + tbody tr:first-child td:last-child {
- -webkit-border-top-right-radius: 0;
- border-top-right-radius: 0;
- -moz-border-radius-topright: 0;
-}
-
-.table-striped tbody > tr:nth-child(odd) > td,
-.table-striped tbody > tr:nth-child(odd) > th {
- background-color: transparent;
-}
-
-.table-hover tbody tr:hover > td,
-.table-hover tbody tr:hover > th {
- background-color: #f5f5f5;
-}
-
-table td[class*="span"],
-table th[class*="span"],
-.row-fluid table td[class*="span"],
-.row-fluid table th[class*="span"] {
- display: table-cell;
- float: none;
- margin-left: 0;
-}
-
-.table td.span1,
-.table th.span1 {
- float: none;
- width: 48px;
- margin-left: 0;
-}
-
-.table td.span2,
-.table th.span2 {
- float: none;
- width: 128px;
- margin-left: 0;
-}
-
-.table td.span3,
-.table th.span3 {
- float: none;
- width: 208px;
- margin-left: 0;
-}
-
-.table td.span4,
-.table th.span4 {
- float: none;
- width: 288px;
- margin-left: 0;
-}
-
-.table td.span5,
-.table th.span5 {
- float: none;
- width: 368px;
- margin-left: 0;
-}
-
-.table td.span6,
-.table th.span6 {
- float: none;
- width: 448px;
- margin-left: 0;
-}
-
-.table td.span7,
-.table th.span7 {
- float: none;
- width: 528px;
- margin-left: 0;
-}
-
-.table td.span8,
-.table th.span8 {
- float: none;
- width: 608px;
- margin-left: 0;
-}
-
-.table td.span9,
-.table th.span9 {
- float: none;
- width: 688px;
- margin-left: 0;
-}
-
-.table td.span10,
-.table th.span10 {
- float: none;
- width: 768px;
- margin-left: 0;
-}
-
-.table td.span11,
-.table th.span11 {
- float: none;
- width: 848px;
- margin-left: 0;
-}
-
-.table td.span12,
-.table th.span12 {
- float: none;
- width: 928px;
- margin-left: 0;
-}
-
-.table tbody tr.success > td {
- background-color: #000000;
-}
-
-.table tbody tr.error > td {
- background-color: #aa0000;
-}
-
-.table tbody tr.warning > td {
- background-color: #00aaaa;
-}
-
-.table tbody tr.info > td {
- background-color: #000000;
-}
-
-.table-hover tbody tr.success:hover > td {
- background-color: #000000;
-}
-
-.table-hover tbody tr.error:hover > td {
- background-color: #910000;
-}
-
-.table-hover tbody tr.warning:hover > td {
- background-color: #009091;
-}
-
-.table-hover tbody tr.info:hover > td {
- background-color: #000000;
-}
-
-[class^="icon-"],
-[class*=" icon-"] {
- display: none;
- width: 14px;
- height: 14px;
- margin-top: 1px;
- *margin-right: 0.3em;
- line-height: 20px;
- vertical-align: text-top;
- background-image: url("../img/glyphicons-halflings.png");
- background-position: 14px 14px;
- background-repeat: no-repeat;
-}
-
-/* White icons with optional class, or on hover/focus/active states of certain elements */
-
-.icon-white,
-.nav-pills > .active > a > [class^="icon-"],
-.nav-pills > .active > a > [class*=" icon-"],
-.nav-list > .active > a > [class^="icon-"],
-.nav-list > .active > a > [class*=" icon-"],
-.navbar-inverse .nav > .active > a > [class^="icon-"],
-.navbar-inverse .nav > .active > a > [class*=" icon-"],
-.dropdown-menu > li > a:hover > [class^="icon-"],
-.dropdown-menu > li > a:focus > [class^="icon-"],
-.dropdown-menu > li > a:hover > [class*=" icon-"],
-.dropdown-menu > li > a:focus > [class*=" icon-"],
-.dropdown-menu > .active > a > [class^="icon-"],
-.dropdown-menu > .active > a > [class*=" icon-"],
-.dropdown-submenu:hover > a > [class^="icon-"],
-.dropdown-submenu:focus > a > [class^="icon-"],
-.dropdown-submenu:hover > a > [class*=" icon-"],
-.dropdown-submenu:focus > a > [class*=" icon-"] {
- background-image: url("../img/glyphicons-halflings-white.png");
-}
-
-.icon-glass {
- background-position: 0 0;
-}
-
-.icon-music {
- background-position: -24px 0;
-}
-
-.icon-search {
- background-position: -48px 0;
-}
-
-.icon-envelope {
- background-position: -72px 0;
-}
-
-.icon-heart {
- background-position: -96px 0;
-}
-
-.icon-star {
- background-position: -120px 0;
-}
-
-.icon-star-empty {
- background-position: -144px 0;
-}
-
-.icon-user {
- background-position: -168px 0;
-}
-
-.icon-film {
- background-position: -192px 0;
-}
-
-.icon-th-large {
- background-position: -216px 0;
-}
-
-.icon-th {
- background-position: -240px 0;
-}
-
-.icon-th-list {
- background-position: -264px 0;
-}
-
-.icon-ok {
- background-position: -288px 0;
-}
-
-.icon-remove {
- background-position: -312px 0;
-}
-
-.icon-zoom-in {
- background-position: -336px 0;
-}
-
-.icon-zoom-out {
- background-position: -360px 0;
-}
-
-.icon-off {
- background-position: -384px 0;
-}
-
-.icon-signal {
- background-position: -408px 0;
-}
-
-.icon-cog {
- background-position: -432px 0;
-}
-
-.icon-trash {
- background-position: -456px 0;
-}
-
-.icon-home {
- background-position: 0 -24px;
-}
-
-.icon-file {
- background-position: -24px -24px;
-}
-
-.icon-time {
- background-position: -48px -24px;
-}
-
-.icon-road {
- background-position: -72px -24px;
-}
-
-.icon-download-alt {
- background-position: -96px -24px;
-}
-
-.icon-download {
- background-position: -120px -24px;
-}
-
-.icon-upload {
- background-position: -144px -24px;
-}
-
-.icon-inbox {
- background-position: -168px -24px;
-}
-
-.icon-play-circle {
- background-position: -192px -24px;
-}
-
-.icon-repeat {
- background-position: -216px -24px;
-}
-
-.icon-refresh {
- background-position: -240px -24px;
-}
-
-.icon-list-alt {
- background-position: -264px -24px;
-}
-
-.icon-lock {
- background-position: -287px -24px;
-}
-
-.icon-flag {
- background-position: -312px -24px;
-}
-
-.icon-headphones {
- background-position: -336px -24px;
-}
-
-.icon-volume-off {
- background-position: -360px -24px;
-}
-
-.icon-volume-down {
- background-position: -384px -24px;
-}
-
-.icon-volume-up {
- background-position: -408px -24px;
-}
-
-.icon-qrcode {
- background-position: -432px -24px;
-}
-
-.icon-barcode {
- background-position: -456px -24px;
-}
-
-.icon-tag {
- background-position: 0 -48px;
-}
-
-.icon-tags {
- background-position: -25px -48px;
-}
-
-.icon-book {
- background-position: -48px -48px;
-}
-
-.icon-bookmark {
- background-position: -72px -48px;
-}
-
-.icon-print {
- background-position: -96px -48px;
-}
-
-.icon-camera {
- background-position: -120px -48px;
-}
-
-.icon-font {
- background-position: -144px -48px;
-}
-
-.icon-bold {
- background-position: -167px -48px;
-}
-
-.icon-italic {
- background-position: -192px -48px;
-}
-
-.icon-text-height {
- background-position: -216px -48px;
-}
-
-.icon-text-width {
- background-position: -240px -48px;
-}
-
-.icon-align-left {
- background-position: -264px -48px;
-}
-
-.icon-align-center {
- background-position: -288px -48px;
-}
-
-.icon-align-right {
- background-position: -312px -48px;
-}
-
-.icon-align-justify {
- background-position: -336px -48px;
-}
-
-.icon-list {
- background-position: -360px -48px;
-}
-
-.icon-indent-left {
- background-position: -384px -48px;
-}
-
-.icon-indent-right {
- background-position: -408px -48px;
-}
-
-.icon-facetime-video {
- background-position: -432px -48px;
-}
-
-.icon-picture {
- background-position: -456px -48px;
-}
-
-.icon-pencil {
- background-position: 0 -72px;
-}
-
-.icon-map-marker {
- background-position: -24px -72px;
-}
-
-.icon-adjust {
- background-position: -48px -72px;
-}
-
-.icon-tint {
- background-position: -72px -72px;
-}
-
-.icon-edit {
- background-position: -96px -72px;
-}
-
-.icon-share {
- background-position: -120px -72px;
-}
-
-.icon-check {
- background-position: -144px -72px;
-}
-
-.icon-move {
- background-position: -168px -72px;
-}
-
-.icon-step-backward {
- background-position: -192px -72px;
-}
-
-.icon-fast-backward {
- background-position: -216px -72px;
-}
-
-.icon-backward {
- background-position: -240px -72px;
-}
-
-.icon-play {
- background-position: -264px -72px;
-}
-
-.icon-pause {
- background-position: -288px -72px;
-}
-
-.icon-stop {
- background-position: -312px -72px;
-}
-
-.icon-forward {
- background-position: -336px -72px;
-}
-
-.icon-fast-forward {
- background-position: -360px -72px;
-}
-
-.icon-step-forward {
- background-position: -384px -72px;
-}
-
-.icon-eject {
- background-position: -408px -72px;
-}
-
-.icon-chevron-left {
- background-position: -432px -72px;
-}
-
-.icon-chevron-right {
- background-position: -456px -72px;
-}
-
-.icon-plus-sign {
- background-position: 0 -96px;
-}
-
-.icon-minus-sign {
- background-position: -24px -96px;
-}
-
-.icon-remove-sign {
- background-position: -48px -96px;
-}
-
-.icon-ok-sign {
- background-position: -72px -96px;
-}
-
-.icon-question-sign {
- background-position: -96px -96px;
-}
-
-.icon-info-sign {
- background-position: -120px -96px;
-}
-
-.icon-screenshot {
- background-position: -144px -96px;
-}
-
-.icon-remove-circle {
- background-position: -168px -96px;
-}
-
-.icon-ok-circle {
- background-position: -192px -96px;
-}
-
-.icon-ban-circle {
- background-position: -216px -96px;
-}
-
-.icon-arrow-left {
- background-position: -240px -96px;
-}
-
-.icon-arrow-right {
- background-position: -264px -96px;
-}
-
-.icon-arrow-up {
- background-position: -289px -96px;
-}
-
-.icon-arrow-down {
- background-position: -312px -96px;
-}
-
-.icon-share-alt {
- background-position: -336px -96px;
-}
-
-.icon-resize-full {
- background-position: -360px -96px;
-}
-
-.icon-resize-small {
- background-position: -384px -96px;
-}
-
-.icon-plus {
- background-position: -408px -96px;
-}
-
-.icon-minus {
- background-position: -433px -96px;
-}
-
-.icon-asterisk {
- background-position: -456px -96px;
-}
-
-.icon-exclamation-sign {
- background-position: 0 -120px;
-}
-
-.icon-gift {
- background-position: -24px -120px;
-}
-
-.icon-leaf {
- background-position: -48px -120px;
-}
-
-.icon-fire {
- background-position: -72px -120px;
-}
-
-.icon-eye-open {
- background-position: -96px -120px;
-}
-
-.icon-eye-close {
- background-position: -120px -120px;
-}
-
-.icon-warning-sign {
- background-position: -144px -120px;
-}
-
-.icon-plane {
- background-position: -168px -120px;
-}
-
-.icon-calendar {
- background-position: -192px -120px;
-}
-
-.icon-random {
- width: 16px;
- background-position: -216px -120px;
-}
-
-.icon-comment {
- background-position: -240px -120px;
-}
-
-.icon-magnet {
- background-position: -264px -120px;
-}
-
-.icon-chevron-up {
- background-position: -288px -120px;
-}
-
-.icon-chevron-down {
- background-position: -313px -119px;
-}
-
-.icon-retweet {
- background-position: -336px -120px;
-}
-
-.icon-shopping-cart {
- background-position: -360px -120px;
-}
-
-.icon-folder-close {
- width: 16px;
- background-position: -384px -120px;
-}
-
-.icon-folder-open {
- width: 16px;
- background-position: -408px -120px;
-}
-
-.icon-resize-vertical {
- background-position: -432px -119px;
-}
-
-.icon-resize-horizontal {
- background-position: -456px -118px;
-}
-
-.icon-hdd {
- background-position: 0 -144px;
-}
-
-.icon-bullhorn {
- background-position: -24px -144px;
-}
-
-.icon-bell {
- background-position: -48px -144px;
-}
-
-.icon-certificate {
- background-position: -72px -144px;
-}
-
-.icon-thumbs-up {
- background-position: -96px -144px;
-}
-
-.icon-thumbs-down {
- background-position: -120px -144px;
-}
-
-.icon-hand-right {
- background-position: -144px -144px;
-}
-
-.icon-hand-left {
- background-position: -168px -144px;
-}
-
-.icon-hand-up {
- background-position: -192px -144px;
-}
-
-.icon-hand-down {
- background-position: -216px -144px;
-}
-
-.icon-circle-arrow-right {
- background-position: -240px -144px;
-}
-
-.icon-circle-arrow-left {
- background-position: -264px -144px;
-}
-
-.icon-circle-arrow-up {
- background-position: -288px -144px;
-}
-
-.icon-circle-arrow-down {
- background-position: -312px -144px;
-}
-
-.icon-globe {
- background-position: -336px -144px;
-}
-
-.icon-wrench {
- background-position: -360px -144px;
-}
-
-.icon-tasks {
- background-position: -384px -144px;
-}
-
-.icon-filter {
- background-position: -408px -144px;
-}
-
-.icon-briefcase {
- background-position: -432px -144px;
-}
-
-.icon-fullscreen {
- background-position: -456px -144px;
-}
-
-.dropup,
-.dropdown {
- position: relative;
-}
-
-.dropdown-toggle {
- *margin-bottom: -3px;
-}
-
-.dropdown-toggle:active,
-.open .dropdown-toggle {
- outline: 0;
-}
-
-.caret {
- display: inline-block;
- width: 0;
- height: 0;
- vertical-align: top;
- /*
- border-top: 4px solid @black;
- border-right: 4px solid transparent;
- border-left: 4px solid transparent;
- */
-}
-
-.caret:before {
- content: "▼";
-}
-
-.dropdown .caret {
- margin-top: 8px;
- margin-left: 2px;
-}
-
-.dropdown-menu {
- position: absolute;
- top: 100%;
- left: 0;
- z-index: 1000;
- display: none;
- float: left;
- min-width: 160px;
- padding: 9px 4px 9px 4px;
- margin: -15.5px 4px 8px 4px;
- list-style: none;
- background-color: #bbbbbb;
- border: 1px solid #000000;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
- -webkit-box-shadow: 0px 0px 0 5px #bbbbbb;
- -moz-box-shadow: 0px 0px 0 5px #bbbbbb;
- box-shadow: 0px 0px 0 5px #bbbbbb;
- -webkit-background-clip: padding-box;
- -moz-background-clip: padding;
- background-clip: padding-box;
-}
-
-.dropdown-menu.pull-right {
- right: 0;
- left: auto;
-}
-
-.dropdown-menu .divider {
- *width: 100%;
- height: 1px;
- height: 0;
- margin: 9px 1px;
- *margin: -5px 0 5px;
- overflow: hidden;
- background-color: #e5e5e5;
- border-bottom: 1px solid #000000;
-}
-
-.dropdown-menu > li > a {
- display: block;
- padding: 0 10px;
- clear: both;
- font-weight: normal;
- line-height: 20px;
- color: #000000;
- white-space: nowrap;
-}
-
-.dropdown-menu > li > a:hover,
-.dropdown-menu > li > a:focus,
-.dropdown-submenu:hover > a,
-.dropdown-submenu:focus > a {
- color: #bbbbbb;
- text-decoration: none;
-}
-
-.dropdown-menu > .active > a,
-.dropdown-menu > .active > a:hover,
-.dropdown-menu > .active > a:focus {
- color: #bbbbbb;
- text-decoration: none;
- background-color: #fefe4a;
- background-image: -moz-linear-gradient(top, #fefe54, #fefe3b);
- background-image: -webkit-gradient(
- linear,
- 0 0,
- 0 100%,
- from(#fefe54),
- to(#fefe3b)
- );
- background-image: -webkit-linear-gradient(top, #fefe54, #fefe3b);
- background-image: -o-linear-gradient(top, #fefe54, #fefe3b);
- background-image: linear-gradient(to bottom, #fefe54, #fefe3b);
- background-repeat: repeat-x;
- outline: 0;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffefe54', endColorstr='#fffefe3b', GradientType=0);
-}
-
-.dropdown-menu > .disabled > a,
-.dropdown-menu > .disabled > a:hover,
-.dropdown-menu > .disabled > a:focus {
- color: #bbbbbb;
-}
-
-.dropdown-menu > .disabled > a:hover,
-.dropdown-menu > .disabled > a:focus {
- text-decoration: none;
- cursor: default;
- background-color: transparent;
- background-image: none;
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.open {
- *z-index: 1000;
-}
-
-.open > .dropdown-menu {
- display: block;
-}
-
-.pull-right > .dropdown-menu {
- right: 0;
- left: auto;
-}
-
-.dropup .caret,
-.navbar-fixed-bottom .dropdown .caret {
- border-top: 0;
- border-bottom: 1px solid #000000;
- content: "";
-}
-
-.dropup .dropdown-menu,
-.navbar-fixed-bottom .dropdown .dropdown-menu {
- top: auto;
- bottom: 100%;
- margin-bottom: 1px;
-}
-
-.dropdown-submenu {
- position: relative;
-}
-
-.dropdown-submenu > .dropdown-menu {
- top: 0;
- left: 100%;
- margin-top: -6px;
- margin-left: -1px;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.dropdown-submenu:hover > .dropdown-menu {
- display: block;
-}
-
-.dropup .dropdown-submenu > .dropdown-menu {
- top: auto;
- bottom: 0;
- margin-top: 0;
- margin-bottom: -2px;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.dropdown-submenu > a:after {
- display: block;
- float: right;
- width: 0;
- height: 0;
- margin-top: 5px;
- margin-right: -10px;
- border-color: transparent;
- border-left-color: #cccccc;
- border-style: solid;
- border-width: 1px;
- content: " ";
-}
-
-.dropdown-submenu:hover > a:after {
- border-left-color: #bbbbbb;
-}
-
-.dropdown-submenu.pull-left {
- float: none;
-}
-
-.dropdown-submenu.pull-left > .dropdown-menu {
- left: -100%;
- margin-left: 10px;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.dropdown .dropdown-menu .nav-header {
- padding-right: 16px;
- padding-left: 16px;
-}
-
-.typeahead {
- z-index: 1051;
- margin-top: 2px;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.well {
- min-height: 20px;
- padding: 19px;
- margin-bottom: 20px;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.well blockquote {
- border-color: #ddd;
- border-color: rgba(0, 0, 0, 0);
-}
-
-.well-large {
- padding: 24px;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.well-small {
- padding: 9px;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.fade {
- opacity: 0;
- -webkit-transition: opacity 0.15s linear;
- -moz-transition: opacity 0.15s linear;
- -o-transition: opacity 0.15s linear;
- transition: opacity 0.15s linear;
-}
-
-.fade.in {
- opacity: 1;
-}
-
-.collapse {
- position: relative;
- height: 0;
- overflow: hidden;
- -webkit-transition: height 0.35s ease;
- -moz-transition: height 0.35s ease;
- -o-transition: height 0.35s ease;
- transition: height 0.35s ease;
-}
-
-.collapse.in {
- height: auto;
-}
-
-.close {
- float: right;
- font-size: 18px;
- font-weight: normal;
- line-height: 20px;
- color: #000000;
- opacity: 0.2;
- filter: alpha(opacity=20);
-}
-
-.close:hover,
-.close:focus {
- color: #000000;
- text-decoration: none;
- cursor: pointer;
-}
-
-button.close {
- padding: 0;
- cursor: pointer;
- background: transparent;
- border: 0;
- -webkit-appearance: none;
-}
-
-.btn:hover:before,
-.btn:hover:after {
- color: #ffffff;
-}
-
-.btn:before {
- content: "< ";
-}
-
-.btn:after {
- content: " >";
-}
-
-.btn {
- display: inline-block;
- *display: inline;
- padding: 0 10px;
- margin-bottom: 20px;
- *margin-left: 0.3em;
- font-size: 18px;
- line-height: 20px;
- color: #000000;
- text-align: center;
- vertical-align: middle;
- cursor: default;
- background: #bbbbbb;
- border: 0;
- border-width: 0;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
- *zoom: 1;
- -webkit-box-shadow: 10px 10px 0 #000000;
- -moz-box-shadow: 10px 10px 0 #000000;
- box-shadow: 10px 10px 0 #000000;
-}
-
-.btn:first-child {
- *margin-left: 0;
-}
-
-.btn:hover,
-.btn:focus {
- color: #ffffff;
- text-decoration: none;
- background: #555555;
- outline: 0;
-}
-
-.btn:focus {
- outline: thin solid #333;
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
-}
-
-.btn.active,
-.btn:active {
- margin: 10px 0 10px 10px;
- outline: 0;
- -webkit-box-shadow: 0 0 0;
- -moz-box-shadow: 0 0 0;
- box-shadow: 0 0 0;
-}
-
-.btn.disabled,
-.btn[disabled] {
- cursor: default;
- background-image: none;
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
- box-shadow: none;
-}
-
-.btn-large {
- padding: 10px 10px;
- font-size: 18px;
- color: #000000;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.btn-large [class^="icon-"],
-.btn-large [class*=" icon-"] {
- margin-top: 4px;
-}
-
-.btn-small {
- padding: 0;
- font-size: 18px;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.btn-small [class^="icon-"],
-.btn-small [class*=" icon-"] {
- margin-top: 0;
-}
-
-.btn-mini [class^="icon-"],
-.btn-mini [class*=" icon-"] {
- margin-top: -1px;
-}
-
-.btn-mini {
- padding: 0;
- font-size: 18px;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.btn-block {
- display: block;
- width: 100%;
- padding-right: 0;
- padding-left: 0;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-
-.btn-block + .btn-block {
- margin-top: 5px;
-}
-
-input[type="submit"].btn-block,
-input[type="reset"].btn-block,
-input[type="button"].btn-block {
- width: 100%;
-}
-
-.btn-primary {
- color: #000000;
- background: #bbbbbb;
-}
-
-.btn-warning {
- *background-color: #f47a00;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.btn-warning:hover,
-.btn-warning:focus,
-.btn-warning:active,
-.btn-warning.active,
-.btn-warning.disabled,
-.btn-warning[disabled] {
- color: #ffffff;
-}
-
-.btn-danger {
- *background-color: #ee5f5b;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.btn-danger:hover,
-.btn-danger:focus,
-.btn-danger:active,
-.btn-danger.active,
-.btn-danger.disabled,
-.btn-danger[disabled] {
- color: #ffffff;
-}
-
-.btn-success {
- *background-color: #62c462;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.btn-success:hover,
-.btn-success:focus,
-.btn-success:active,
-.btn-success.active,
-.btn-success.disabled,
-.btn-success[disabled] {
- color: #ffffff;
-}
-
-.btn-info {
- *background-color: #5bc0de;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.btn-info:hover,
-.btn-info:focus,
-.btn-info:active,
-.btn-info.active,
-.btn-info.disabled,
-.btn-info[disabled] {
- color: #ffffff;
-}
-
-.btn-inverse {
- *background-color: #555555;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.btn-inverse:hover,
-.btn-inverse:focus,
-.btn-inverse:active,
-.btn-inverse.active,
-.btn-inverse.disabled,
-.btn-inverse[disabled] {
- color: #ffffff;
-}
-
-button.btn,
-input[type="submit"].btn {
- *padding-top: 3px;
- *padding-bottom: 3px;
-}
-
-button.btn::-moz-focus-inner,
-input[type="submit"].btn::-moz-focus-inner {
- padding: 0;
- border: 0;
-}
-
-button.btn.btn-large,
-input[type="submit"].btn.btn-large {
- *padding-top: 7px;
- *padding-bottom: 7px;
-}
-
-button.btn.btn-small,
-input[type="submit"].btn.btn-small {
- *padding-top: 0;
- *padding-bottom: 0;
-}
-
-button.btn.btn-mini,
-input[type="submit"].btn.btn-mini {
- *padding-top: 0;
- *padding-bottom: 0;
-}
-
-.btn-link,
-.btn-link:active,
-.btn-link[disabled] {
- background-color: transparent;
- background-image: none;
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
- box-shadow: none;
-}
-
-.btn-link {
- color: #fefe54;
- cursor: pointer;
- border-color: transparent;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.btn-link:hover,
-.btn-link:focus {
- color: #fefe54;
- text-decoration: none;
- background-color: #00aa00;
-}
-
-.btn-link[disabled]:hover,
-.btn-link[disabled]:focus {
- color: #555555;
- text-decoration: none;
-}
-
-.btn-group {
- position: relative;
- display: inline-block;
- *display: inline;
- *margin-left: 0.3em;
- font-size: 0;
- white-space: nowrap;
- vertical-align: middle;
- *zoom: 1;
-}
-
-.btn-group:first-child {
- *margin-left: 0;
-}
-
-.btn-group + .btn-group {
- margin-left: 0;
-}
-
-.btn-toolbar {
- margin-top: 20px;
- margin-bottom: 20px;
- font-size: 0;
-}
-
-.btn-toolbar > .btn + .btn,
-.btn-toolbar > .btn-group + .btn,
-.btn-toolbar > .btn + .btn-group {
- margin-left: 5px;
-}
-
-.btn-group > .btn {
- position: relative;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.btn-group > .btn + .btn {
- margin-left: -1px;
-}
-
-.btn-group > .btn,
-.btn-group > .dropdown-menu,
-.btn-group > .popover {
- font-size: 18px;
-}
-
-.btn-group > .btn-mini {
- font-size: 18px;
-}
-
-.btn-group > .btn-small {
- font-size: 18px;
-}
-
-.btn-group > .btn-large {
- font-size: 18px;
-}
-
-.btn-group > .btn:first-child {
- margin-left: 0;
- -webkit-border-bottom-left-radius: 0;
- border-bottom-left-radius: 0;
- -webkit-border-top-left-radius: 0;
- border-top-left-radius: 0;
- -moz-border-radius-bottomleft: 0;
- -moz-border-radius-topleft: 0;
-}
-
-.btn-group > .btn:last-child,
-.btn-group > .dropdown-toggle {
- -webkit-border-top-right-radius: 0;
- border-top-right-radius: 0;
- -webkit-border-bottom-right-radius: 0;
- border-bottom-right-radius: 0;
- -moz-border-radius-topright: 0;
- -moz-border-radius-bottomright: 0;
-}
-
-.btn-group > .btn.large:first-child {
- margin-left: 0;
- -webkit-border-bottom-left-radius: 0;
- border-bottom-left-radius: 0;
- -webkit-border-top-left-radius: 0;
- border-top-left-radius: 0;
- -moz-border-radius-bottomleft: 0;
- -moz-border-radius-topleft: 0;
-}
-
-.btn-group > .btn.large:last-child,
-.btn-group > .large.dropdown-toggle {
- -webkit-border-top-right-radius: 0;
- border-top-right-radius: 0;
- -webkit-border-bottom-right-radius: 0;
- border-bottom-right-radius: 0;
- -moz-border-radius-topright: 0;
- -moz-border-radius-bottomright: 0;
-}
-
-.btn-group .dropdown-toggle:active,
-.btn-group.open .dropdown-toggle {
- outline: 0;
-}
-
-.btn-group > .btn + .dropdown-toggle {
- *padding-top: 14px;
- padding-right: 8px;
- *padding-bottom: 14px;
- padding-left: 8px;
-}
-
-.btn-group > .btn-mini + .dropdown-toggle {
- *padding-top: 2px;
- padding-right: 5px;
- *padding-bottom: 2px;
- padding-left: 5px;
-}
-
-.btn-group > .btn-small + .dropdown-toggle {
- *padding-top: 5px;
- *padding-bottom: 4px;
-}
-
-.btn-group > .btn-large + .dropdown-toggle {
- *padding-top: 7px;
- padding-right: 12px;
- *padding-bottom: 7px;
- padding-left: 12px;
-}
-
-.btn-group.open .dropdown-toggle {
- background-image: none;
-}
-
-.btn-group.open .btn.dropdown-toggle {
- background-color: #aa5500;
-}
-
-.btn-group.open .btn-primary.dropdown-toggle {
- background-color: #fefe54;
-}
-
-.btn-group.open .btn-warning.dropdown-toggle {
- background-color: #a85400;
-}
-
-.btn-group.open .btn-danger.dropdown-toggle {
- background-color: #bd362f;
-}
-
-.btn-group.open .btn-success.dropdown-toggle {
- background-color: #51a351;
-}
-
-.btn-group.open .btn-info.dropdown-toggle {
- background-color: #2f96b4;
-}
-
-.btn-group.open .btn-inverse.dropdown-toggle {
- background-color: #555555;
-}
-
-.btn .caret {
- margin-top: 0;
- margin-left: 0;
-}
-
-.btn-large .caret {
- margin-top: 0;
-}
-
-.btn-large .caret {
- border-top-width: 5px;
- border-right-width: 5px;
- border-left-width: 5px;
-}
-
-.btn-mini .caret,
-.btn-small .caret {
- margin-top: 0;
-}
-
-.dropup .btn-large .caret {
- border-bottom-width: 5px;
-}
-
-.btn-primary .caret,
-.btn-warning .caret,
-.btn-danger .caret,
-.btn-info .caret,
-.btn-success .caret,
-.btn-inverse .caret {
- border-top-color: #ffffff;
- border-bottom-color: #ffffff;
-}
-
-.btn-group-vertical {
- display: inline-block;
- *display: inline;
- /* IE7 inline-block hack */
-
- *zoom: 1;
-}
-
-.btn-group-vertical > .btn {
- display: block;
- float: none;
- max-width: 100%;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.btn-group-vertical > .btn + .btn {
- margin-top: -1px;
- margin-left: 0;
-}
-
-.btn-group-vertical > .btn:first-child {
- -webkit-border-radius: 0 0px 0 0;
- -moz-border-radius: 0 0px 0 0;
- border-radius: 0 0px 0 0;
-}
-
-.btn-group-vertical > .btn:last-child {
- -webkit-border-radius: 0 0 0 0px;
- -moz-border-radius: 0 0 0 0px;
- border-radius: 0 0 0 0px;
-}
-
-.btn-group-vertical > .btn-large:first-child {
- -webkit-border-radius: 0 0px 0 0;
- -moz-border-radius: 0 0px 0 0;
- border-radius: 0 0px 0 0;
-}
-
-.btn-group-vertical > .btn-large:last-child {
- -webkit-border-radius: 0 0 0 0px;
- -moz-border-radius: 0 0 0 0px;
- border-radius: 0 0 0 0px;
-}
-
-.alert {
- padding: 8px 35px 8px 14px;
- margin-bottom: 20px;
- text-shadow: 0;
- background-color: #00aaaa;
- border: 1px solid #00aaaa;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.alert,
-.alert h4 {
- color: #ffffff;
-}
-
-.alert h4 {
- margin: 0;
-}
-
-.alert .close {
- position: relative;
- top: -2px;
- right: -21px;
- line-height: 20px;
-}
-
-.alert-success {
- color: #00aa00;
- background-color: #000000;
- border-color: #000000;
-}
-
-.alert-success h4 {
- color: #00aa00;
-}
-
-.alert-danger,
-.alert-error {
- color: #ffffff;
- background-color: #aa0000;
- border-color: #aa0000;
-}
-
-.alert-danger h4,
-.alert-error h4 {
- color: #ffffff;
-}
-
-.alert-info {
- color: #000000;
- background-color: #000000;
- border-color: #000000;
-}
-
-.alert-info h4 {
- color: #000000;
-}
-
-.alert-block {
- padding-top: 14px;
- padding-bottom: 14px;
-}
-
-.alert-block > p,
-.alert-block > ul {
- margin-bottom: 0;
-}
-
-.alert-block p + p {
- margin-top: 5px;
-}
-
-.nav {
- margin-bottom: 20px;
- margin-left: 0;
- list-style: none;
- background: #bbbbbb;
-}
-
-.nav > li > a {
- display: block;
-}
-
-.nav > li > a::first-letter {
- color: #aa0000;
-}
-
-.nav > li > a:hover,
-.nav > li > a:focus {
- color: #bbbbbb;
- text-decoration: none;
- background-color: #000000;
-}
-
-.nav > li > a > img {
- max-width: none;
-}
-
-.nav > .pull-right {
- float: right;
-}
-
-.nav-header {
- display: block;
- font-weight: normal;
- line-height: 20px;
- color: #000000;
- text-transform: uppercase;
-}
-
-.nav li + .nav-header {
- line-height: 20px;
-}
-
-.nav-list {
- display: block;
- padding: 10px 15px;
- margin: 10px 5px;
- margin-left: -5px;
- border: 2px solid #000000;
- -webkit-box-shadow:
- 0 0 0 5px,
- 11px 13px 0 4px black;
- -moz-box-shadow:
- 0 0 0 5px,
- 11px 13px 0 4px black;
- box-shadow:
- 0 0 0 5px,
- 11px 13px 0 4px black;
-}
-
-.nav-list > li > a,
-.nav-list .nav-header {
- margin-right: -10px;
- margin-left: -10px;
-}
-
-.nav-list > li > a {
- padding: 0 8px;
- color: #000000;
-}
-
-.nav-list > .active > a,
-.nav-list > .active > a:hover,
-.nav-list > .active > a:focus {
- color: #ffffff;
- background-color: #00aaaa;
-}
-
-.nav-list [class^="icon-"],
-.nav-list [class*=" icon-"] {
- margin-right: 0;
-}
-
-.nav-list .divider {
- *width: 100%;
- height: 1px;
- margin: 9px 1px;
- *margin: -5px 0 5px;
- overflow: hidden;
- background-color: #000000;
- border-bottom: 1px solid #000000;
-}
-
-.nav-tabs,
-.nav-pills {
- *zoom: 1;
-}
-
-.nav-tabs:before,
-.nav-pills:before,
-.nav-tabs:after,
-.nav-pills:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.nav-tabs:after,
-.nav-pills:after {
- clear: both;
-}
-
-.nav-tabs > li,
-.nav-pills > li {
- float: left;
-}
-
-.nav-tabs > li > a,
-.nav-pills > li > a {
- padding-right: 8px;
- padding-left: 8px;
- margin-right: 0;
- line-height: 20px;
- color: #000000;
-}
-
-.nav-tabs {
- border-bottom: 0.5em solid #bbbbbb;
-}
-
-.nav-tabs > li {
- margin-bottom: -1px;
-}
-
-.nav-tabs > li > a {
- line-height: 20px;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.nav-tabs > li > a:hover,
-.nav-tabs > li > a:focus {
- background: #000000;
-}
-
-.nav-tabs > .active > a,
-.nav-tabs > .active > a:hover,
-.nav-tabs > .active > a:focus {
- color: #bbbbbb;
- cursor: default;
- background-color: #000084;
- border: 0;
- border-bottom-color: transparent;
-}
-
-.nav-pills > li > a {
- padding-top: 0;
- padding-bottom: 0;
- margin-top: 0;
- margin-bottom: 0;
- line-height: 20px;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.nav-pills > .active > a,
-.nav-pills > .active > a:hover,
-.nav-pills > .active > a:focus {
- color: #bbbbbb;
- background-color: #fefe54;
-}
-
-.nav-stacked > li {
- float: none;
-}
-
-.nav-stacked > li > a {
- margin-right: 0;
-}
-
-.nav-tabs.nav-stacked {
- border-bottom: 0;
-}
-
-.nav-tabs.nav-stacked > li > a {
- border: 1px solid #ddd;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.nav-tabs.nav-stacked > li:first-child > a {
- -webkit-border-top-right-radius: 0;
- border-top-right-radius: 0;
- -webkit-border-top-left-radius: 0;
- border-top-left-radius: 0;
- -moz-border-radius-topright: 0;
- -moz-border-radius-topleft: 0;
-}
-
-.nav-tabs.nav-stacked > li:last-child > a {
- -webkit-border-bottom-right-radius: 0;
- border-bottom-right-radius: 0;
- -webkit-border-bottom-left-radius: 0;
- border-bottom-left-radius: 0;
- -moz-border-radius-bottomright: 0;
- -moz-border-radius-bottomleft: 0;
-}
-
-.nav-tabs.nav-stacked > li > a:hover,
-.nav-tabs.nav-stacked > li > a:focus {
- z-index: 2;
- border-color: #ddd;
-}
-
-.nav-pills.nav-stacked > li > a {
- margin-bottom: 3px;
-}
-
-.nav-pills.nav-stacked > li:last-child > a {
- margin-bottom: 1px;
-}
-
-.nav-tabs .dropdown-menu {
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.nav-pills .dropdown-menu {
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.nav .dropdown-toggle .caret {
- margin-top: 6px;
- border-top-color: #fefe54;
- border-bottom-color: #fefe54;
-}
-
-.nav .dropdown-toggle:hover .caret,
-.nav .dropdown-toggle:focus .caret {
- border-top-color: #fefe54;
- border-bottom-color: #fefe54;
-}
-
-/* move down carets for tabs */
-
-.nav .active .dropdown-toggle .caret {
- border-top-color: #fff;
- border-bottom-color: #fff;
-}
-
-.nav-tabs .active .dropdown-toggle .caret {
- border-top-color: #bbbbbb;
- border-bottom-color: #bbbbbb;
-}
-
-.nav > .dropdown.active > a:hover,
-.nav > .dropdown.active > a:focus {
- cursor: pointer;
-}
-
-.nav-tabs .open .dropdown-toggle,
-.nav-pills .open .dropdown-toggle,
-.nav > li.dropdown.open.active > a:hover,
-.nav > li.dropdown.open.active > a:focus {
- color: #ffffff;
- background-color: #bbbbbb;
- border-color: #bbbbbb;
-}
-
-.nav li.dropdown.open .caret,
-.nav li.dropdown.open.active .caret,
-.nav li.dropdown.open a:hover .caret,
-.nav li.dropdown.open a:focus .caret {
- border-top-color: #ffffff;
- border-bottom-color: #ffffff;
- opacity: 1;
- filter: alpha(opacity=100);
-}
-
-.tabs-stacked .open > a:hover,
-.tabs-stacked .open > a:focus {
- border-color: #bbbbbb;
-}
-
-.tabbable {
- *zoom: 1;
-}
-
-.tabbable:before,
-.tabbable:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.tabbable:after {
- clear: both;
-}
-
-.tab-content {
- overflow: auto;
-}
-
-.tabs-below > .nav-tabs,
-.tabs-right > .nav-tabs,
-.tabs-left > .nav-tabs {
- border-bottom: 0;
-}
-
-.tab-content > .tab-pane,
-.pill-content > .pill-pane {
- display: none;
-}
-
-.tab-content > .active,
-.pill-content > .active {
- display: block;
-}
-
-.tabs-below > .nav-tabs {
- border-top: 1px solid #ddd;
-}
-
-.tabs-below > .nav-tabs > li {
- margin-top: -1px;
- margin-bottom: 0;
-}
-
-.tabs-below > .nav-tabs > li > a {
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.tabs-below > .nav-tabs > li > a:hover,
-.tabs-below > .nav-tabs > li > a:focus {
- border-top-color: #ddd;
- border-bottom-color: transparent;
-}
-
-.tabs-below > .nav-tabs > .active > a,
-.tabs-below > .nav-tabs > .active > a:hover,
-.tabs-below > .nav-tabs > .active > a:focus {
- border-color: transparent #ddd #ddd #ddd;
-}
-
-.tabs-left > .nav-tabs > li,
-.tabs-right > .nav-tabs > li {
- float: none;
-}
-
-.tabs-left > .nav-tabs > li > a,
-.tabs-right > .nav-tabs > li > a {
- min-width: 74px;
- margin-right: 0;
- margin-bottom: 0;
-}
-
-.tabs-left > .nav-tabs {
- float: left;
- margin-right: 18px;
- border-right: 1px solid #ddd;
-}
-
-.tabs-left > .nav-tabs > li > a {
- margin-right: -1px;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.tabs-left > .nav-tabs > li > a:hover,
-.tabs-left > .nav-tabs > li > a:focus {
- border-color: #bbbbbb #dddddd #bbbbbb #bbbbbb;
-}
-
-.tabs-left > .nav-tabs .active > a,
-.tabs-left > .nav-tabs .active > a:hover,
-.tabs-left > .nav-tabs .active > a:focus {
- border-color: #ddd transparent #ddd #ddd;
- *border-right-color: #ffffff;
-}
-
-.tabs-right > .nav-tabs {
- float: right;
- margin-left: 19px;
- border-left: 1px solid #ddd;
-}
-
-.tabs-right > .nav-tabs > li > a {
- margin-left: -1px;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.tabs-right > .nav-tabs > li > a:hover,
-.tabs-right > .nav-tabs > li > a:focus {
- border-color: #bbbbbb #bbbbbb #bbbbbb #dddddd;
-}
-
-.tabs-right > .nav-tabs .active > a,
-.tabs-right > .nav-tabs .active > a:hover,
-.tabs-right > .nav-tabs .active > a:focus {
- border-color: #ddd #ddd #ddd transparent;
- *border-left-color: #ffffff;
-}
-
-.nav > .disabled > a {
- color: #bbbbbb;
-}
-
-.nav > .disabled > a:hover,
-.nav > .disabled > a:focus {
- text-decoration: none;
- cursor: default;
- background-color: transparent;
-}
-
-.navbar {
- *position: relative;
- *z-index: 2;
- margin-bottom: 20px;
- overflow: visible;
-}
-
-.navbar-inner {
- min-height: 20px;
- padding-right: 12.4px;
- padding-left: 12.4px;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
- *zoom: 1;
- -webkit-box-shadow: 0;
- -moz-box-shadow: 0;
- box-shadow: 0;
-}
-
-.navbar-inner:before,
-.navbar-inner:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.navbar-inner:after {
- clear: both;
-}
-
-.navbar .container {
- width: auto;
-}
-
-.nav-collapse.collapse {
- height: auto;
- overflow: visible;
-}
-
-.navbar .brand {
- display: block;
- float: left;
- padding: 0 10px;
- margin-left: -10px;
- font-size: 18px;
- color: #000084;
- text-shadow: 0;
-}
-
-.navbar .brand:hover,
-.navbar .brand:focus {
- text-decoration: none;
-}
-
-.navbar-text {
- margin-bottom: 0;
- line-height: 20px;
- color: #000000;
-}
-
-.navbar-link {
- color: #000000;
-}
-
-.navbar-link:hover,
-.navbar-link:focus {
- color: #555555;
-}
-
-.navbar .divider-vertical {
- height: 20px;
- margin: 0 12.4px;
- border-right: 1px solid #ffffff;
- border-left: 1px solid #bbbbbb;
-}
-
-.navbar .btn,
-.navbar .btn-group {
- margin-top: -5px;
-}
-
-.navbar .btn-group .btn,
-.navbar .input-prepend .btn,
-.navbar .input-append .btn,
-.navbar .input-prepend .btn-group,
-.navbar .input-append .btn-group {
- margin-top: 0;
-}
-
-.navbar-form {
- margin-bottom: 0;
- *zoom: 1;
-}
-
-.navbar-form:before,
-.navbar-form:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.navbar-form:after {
- clear: both;
-}
-
-.navbar-form input,
-.navbar-form select,
-.navbar-form .radio,
-.navbar-form .checkbox {
- margin-top: -5px;
-}
-
-.navbar-form input,
-.navbar-form select,
-.navbar-form .btn {
- display: inline-block;
- margin-bottom: 0;
- -webkit-box-shadow: 0 0;
- -moz-box-shadow: 0 0;
- box-shadow: 0 0;
-}
-
-.navbar-form input[type="image"],
-.navbar-form input[type="checkbox"],
-.navbar-form input[type="radio"] {
- margin-top: 3px;
-}
-
-.navbar-form .input-append,
-.navbar-form .input-prepend {
- margin-top: 5px;
- white-space: nowrap;
-}
-
-.navbar-form .input-append input,
-.navbar-form .input-prepend input {
- margin-top: 0;
-}
-
-.navbar-search {
- position: relative;
- float: left;
- margin-top: -5px;
- margin-bottom: 0;
-}
-
-.navbar-search .search-query {
- padding: 4px 12.4px;
- margin-bottom: 0;
- font-family: DOS, Monaco, Menlo, Consolas, "Courier New", monospace;
- font-size: 18px;
- font-weight: normal;
- line-height: 1;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.navbar-static-top {
- position: static;
- margin-bottom: 0;
-}
-
-.navbar-static-top .navbar-inner {
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.navbar-fixed-top,
-.navbar-fixed-bottom {
- position: fixed;
- right: 0;
- left: 0;
- z-index: 1030;
- margin-bottom: 0;
-}
-
-.navbar-fixed-top .navbar-inner,
-.navbar-static-top .navbar-inner {
- border-width: 0;
-}
-
-.navbar-fixed-bottom .navbar-inner {
- border-width: 0;
-}
-
-.navbar-fixed-top .navbar-inner,
-.navbar-fixed-bottom .navbar-inner {
- padding-right: 0;
- padding-left: 0;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.navbar-static-top .container,
-.navbar-fixed-top .container,
-.navbar-fixed-bottom .container {
- width: 944px;
-}
-
-.navbar-fixed-top {
- top: 0;
-}
-
-.navbar-fixed-top .navbar-inner,
-.navbar-static-top .navbar-inner {
- -webkit-box-shadow: 0;
- -moz-box-shadow: 0;
- box-shadow: 0;
-}
-
-.navbar-fixed-bottom {
- bottom: 0;
-}
-
-.navbar-fixed-bottom .navbar-inner {
- -webkit-box-shadow: 0;
- -moz-box-shadow: 0;
- box-shadow: 0;
-}
-
-.navbar .nav {
- position: relative;
- left: 0;
- display: block;
- float: left;
- margin: 0 20px 0 0;
-}
-
-.navbar .nav.pull-right {
- float: right;
- margin-right: 0;
-}
-
-.navbar .nav > li {
- float: left;
- padding-left: 0;
-}
-
-.navbar .nav > li > a {
- float: none;
- padding: 0 10px;
- color: #000000;
- text-decoration: none;
- text-shadow: 0;
-}
-
-.navbar .nav .dropdown-toggle .caret {
- margin-top: 0;
-}
-
-.navbar .nav > li > a:focus,
-.navbar .nav > li > a:hover {
- color: #555555;
- text-decoration: none;
- background-color: transparent;
-}
-
-.navbar .nav > .active > a,
-.navbar .nav > .active > a:hover,
-.navbar .nav > .active > a:focus {
- color: #bbbbbb;
- text-decoration: none;
- background-color: #bbbbbb;
-}
-
-.navbar .btn-navbar {
- display: none;
- float: right;
- padding: 0 12.4px;
- margin-right: 12.4px;
- margin-left: 12.4px;
- *background-color: #aeaeae;
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.navbar .btn-navbar:hover,
-.navbar .btn-navbar:focus,
-.navbar .btn-navbar:active,
-.navbar .btn-navbar.active,
-.navbar .btn-navbar.disabled,
-.navbar .btn-navbar[disabled] {
- color: #ffffff;
-}
-
-.navbar .btn-navbar .icon-bar {
- display: block;
- width: 18px;
- height: 2px;
- background-color: #f5f5f5;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.btn-navbar .icon-bar + .icon-bar {
- margin-top: 3px;
-}
-
-.navbar .nav > li > .dropdown-menu:before {
- position: absolute;
- top: -7px;
- left: 9px;
- display: inline-block;
- border-right: 7px solid transparent;
- border-bottom: 7px solid #ccc;
- border-left: 7px solid transparent;
- border-bottom-color: rgba(0, 0, 0, 0.2);
- content: "";
-}
-
-.navbar .nav > li > .dropdown-menu:after {
- position: absolute;
- top: -6px;
- left: 10px;
- display: inline-block;
- border-right: 6px solid transparent;
- border-bottom: 6px solid #ffffff;
- border-left: 6px solid transparent;
- content: "";
-}
-
-.navbar-fixed-bottom .nav > li > .dropdown-menu:before {
- top: auto;
- bottom: -7px;
- border-top: 7px solid #ccc;
- border-bottom: 0;
- border-top-color: rgba(0, 0, 0, 0.2);
-}
-
-.navbar-fixed-bottom .nav > li > .dropdown-menu:after {
- top: auto;
- bottom: -6px;
- border-top: 6px solid #ffffff;
- border-bottom: 0;
-}
-
-.navbar .nav li.dropdown > a:hover .caret,
-.navbar .nav li.dropdown > a:focus .caret {
- border-top-color: #555555;
- border-bottom-color: #555555;
-}
-
-.navbar .nav li.dropdown.open > .dropdown-toggle,
-.navbar .nav li.dropdown.active > .dropdown-toggle,
-.navbar .nav li.dropdown.open.active > .dropdown-toggle {
- color: #bbbbbb;
- background-color: #bbbbbb;
-}
-
-.navbar .nav li.dropdown > .dropdown-toggle .caret {
- border-top-color: #000000;
- border-bottom-color: #000000;
-}
-
-.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
-.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
-.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
- border-top-color: #bbbbbb;
- border-bottom-color: #bbbbbb;
-}
-
-.navbar .pull-right > li > .dropdown-menu,
-.navbar .nav > li > .dropdown-menu.pull-right {
- right: 0;
- left: auto;
-}
-
-.navbar .pull-right > li > .dropdown-menu:before,
-.navbar .nav > li > .dropdown-menu.pull-right:before {
- right: 12px;
- left: auto;
-}
-
-.navbar .pull-right > li > .dropdown-menu:after,
-.navbar .nav > li > .dropdown-menu.pull-right:after {
- right: 13px;
- left: auto;
-}
-
-.navbar .pull-right > li > .dropdown-menu .dropdown-menu,
-.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {
- right: 100%;
- left: auto;
- margin-right: -1px;
- margin-left: 0;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.navbar-inverse .navbar-inner {
- background: #bbbbbb;
-}
-
-.navbar-inverse .brand,
-.navbar-inverse .nav > li > a {
- color: #000000;
- text-shadow: 0;
- background: #bbbbbb;
-}
-
-.navbar-inverse .brand:hover,
-.navbar-inverse .nav > li > a:hover,
-.navbar-inverse .brand:focus,
-.navbar-inverse .nav > li > a:focus {
- color: #bbbbbb;
- background: #000000;
-}
-
-.navbar-inverse .brand {
- color: #000084;
-}
-
-.navbar-inverse .navbar-text {
- color: #000000;
-}
-
-.navbar-inverse .nav > li > a:focus,
-.navbar-inverse .nav > li > a:hover {
- color: #bbbbbb;
- background: #000000;
-}
-
-.navbar-inverse .nav .active > a,
-.navbar-inverse .nav .active > a:hover,
-.navbar-inverse .nav .active > a:focus {
- color: #bbbbbb;
- text-decoration: none;
- background: #000000;
-}
-
-.navbar-inverse .navbar-link {
- color: #000000;
-}
-
-.navbar-inverse .navbar-link:hover,
-.navbar-inverse .navbar-link:focus {
- color: #ffffff;
-}
-
-.navbar-inverse .divider-vertical {
- border-right-color: #000000;
- border-left-color: #000000;
-}
-
-.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
-.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
-.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {
- color: #ffffff;
- background-color: #000000;
-}
-
-.navbar-inverse .nav li.dropdown > a:hover .caret,
-.navbar-inverse .nav li.dropdown > a:focus .caret {
- border-top-color: #ffffff;
- border-bottom-color: #ffffff;
-}
-
-.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {
- border-top-color: #000000;
- border-bottom-color: #000000;
-}
-
-.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,
-.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,
-.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {
- border-top-color: #ffffff;
- border-bottom-color: #ffffff;
-}
-
-.navbar-inverse .navbar-search .search-query {
- color: #ffffff;
- background-color: #404040;
- border-color: #000000;
- -webkit-transition: none;
- -moz-transition: none;
- -o-transition: none;
- transition: none;
-}
-
-.navbar-inverse .navbar-search .search-query:-moz-placeholder {
- color: #cccccc;
-}
-
-.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {
- color: #cccccc;
-}
-
-.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {
- color: #cccccc;
-}
-
-.navbar-inverse .navbar-search .search-query:focus,
-.navbar-inverse .navbar-search .search-query.focused {
- padding: 0 20px;
- color: #555555;
- text-shadow: 0;
- background-color: #ffffff;
- border: 0;
- outline: 0;
-}
-
-.navbar-inverse .btn-navbar {
- *background-color: #000000;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.navbar-inverse .btn-navbar:hover,
-.navbar-inverse .btn-navbar:focus,
-.navbar-inverse .btn-navbar:active,
-.navbar-inverse .btn-navbar.active,
-.navbar-inverse .btn-navbar.disabled,
-.navbar-inverse .btn-navbar[disabled] {
- color: #ffffff;
-}
-
-.breadcrumb:before {
- content: ">>";
-}
-
-.breadcrumb {
- padding: 0 20px;
- margin: 0 0 20px;
- list-style: none;
- background-color: #000000;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.breadcrumb > li {
- display: inline-block;
- *display: inline;
- text-shadow: 0;
- *zoom: 1;
-}
-
-.breadcrumb > li > .divider {
- padding: 0 10px;
- color: #bbbbbb;
-}
-
-.breadcrumb > .active {
- color: #bbbbbb;
-}
-
-.pagination {
- margin: 20px 0;
-}
-
-.pagination ul {
- display: inline-block;
- *display: inline;
- margin-bottom: 0;
- margin-left: 0;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
- *zoom: 1;
- -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.pagination ul > li {
- display: inline;
-}
-
-.pagination ul > li > a,
-.pagination ul > li > span {
- float: left;
- padding: 20px 10px;
- line-height: 20px;
- text-decoration: none;
- background-color: #00aa00;
- border: 0;
- border-left-width: 0;
-}
-
-.pagination ul > li > a:hover,
-.pagination ul > li > a:focus,
-.pagination ul > .active > a,
-.pagination ul > .active > span {
- background-color: #f5f5f5;
-}
-
-.pagination ul > .active > a,
-.pagination ul > .active > span {
- color: #bbbbbb;
- cursor: default;
-}
-
-.pagination ul > .disabled > span,
-.pagination ul > .disabled > a,
-.pagination ul > .disabled > a:hover,
-.pagination ul > .disabled > a:focus {
- color: #bbbbbb;
- cursor: default;
- background-color: transparent;
-}
-
-.pagination ul > li:first-child > a,
-.pagination ul > li:first-child > span {
- border-left-width: 1px;
- -webkit-border-bottom-left-radius: 0;
- border-bottom-left-radius: 0;
- -webkit-border-top-left-radius: 0;
- border-top-left-radius: 0;
- -moz-border-radius-bottomleft: 0;
- -moz-border-radius-topleft: 0;
-}
-
-.pagination ul > li:last-child > a,
-.pagination ul > li:last-child > span {
- -webkit-border-top-right-radius: 0;
- border-top-right-radius: 0;
- -webkit-border-bottom-right-radius: 0;
- border-bottom-right-radius: 0;
- -moz-border-radius-topright: 0;
- -moz-border-radius-bottomright: 0;
-}
-
-.pagination-centered {
- text-align: center;
-}
-
-.pagination-right {
- text-align: right;
-}
-
-.pagination-large ul > li > a,
-.pagination-large ul > li > span {
- padding: 18px;
- font-size: 18px;
-}
-
-.pagination-large ul > li:first-child > a,
-.pagination-large ul > li:first-child > span {
- -webkit-border-bottom-left-radius: 0;
- border-bottom-left-radius: 0;
- -webkit-border-top-left-radius: 0;
- border-top-left-radius: 0;
- -moz-border-radius-bottomleft: 0;
- -moz-border-radius-topleft: 0;
-}
-
-.pagination-large ul > li:last-child > a,
-.pagination-large ul > li:last-child > span {
- -webkit-border-top-right-radius: 0;
- border-top-right-radius: 0;
- -webkit-border-bottom-right-radius: 0;
- border-bottom-right-radius: 0;
- -moz-border-radius-topright: 0;
- -moz-border-radius-bottomright: 0;
-}
-
-.pagination-mini ul > li:first-child > a,
-.pagination-small ul > li:first-child > a,
-.pagination-mini ul > li:first-child > span,
-.pagination-small ul > li:first-child > span {
- -webkit-border-bottom-left-radius: 0;
- border-bottom-left-radius: 0;
- -webkit-border-top-left-radius: 0;
- border-top-left-radius: 0;
- -moz-border-radius-bottomleft: 0;
- -moz-border-radius-topleft: 0;
-}
-
-.pagination-mini ul > li:last-child > a,
-.pagination-small ul > li:last-child > a,
-.pagination-mini ul > li:last-child > span,
-.pagination-small ul > li:last-child > span {
- -webkit-border-top-right-radius: 0;
- border-top-right-radius: 0;
- -webkit-border-bottom-right-radius: 0;
- border-bottom-right-radius: 0;
- -moz-border-radius-topright: 0;
- -moz-border-radius-bottomright: 0;
-}
-
-.pagination-small ul > li > a,
-.pagination-small ul > li > span {
- padding: 0;
- font-size: 18px;
-}
-
-.pagination-mini ul > li > a,
-.pagination-mini ul > li > span {
- padding: 0;
- font-size: 18px;
-}
-
-.pager {
- margin: 20px 0;
- text-align: center;
- list-style: none;
- *zoom: 1;
-}
-
-.pager:before,
-.pager:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.pager:after {
- clear: both;
-}
-
-.pager li {
- display: inline;
-}
-
-.pager li > a,
-.pager li > span {
- display: inline-block;
- padding: 0 20px;
- background-color: #555555;
-}
-
-.pager li > a:hover,
-.pager li > a:focus {
- text-decoration: none;
-}
-
-.pager .next > a,
-.pager .next > span {
- float: right;
-}
-
-.pager .previous > a,
-.pager .previous > span {
- float: left;
-}
-
-.pager .disabled > a,
-.pager .disabled > a:hover,
-.pager .disabled > a:focus,
-.pager .disabled > span {
- color: #bbbbbb;
- cursor: default;
- background-color: #555555;
-}
-
-.modal-backdrop {
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 1040;
- background-color: #000000;
-}
-
-.modal-backdrop.fade {
- opacity: 0;
-}
-
-.modal-backdrop,
-.modal-backdrop.fade.in {
- opacity: 0.8;
- filter: alpha(opacity=80);
-}
-
-.modal {
- position: fixed;
- top: 10%;
- left: 50%;
- z-index: 1050;
- width: 560px;
- margin-left: -280px;
- background-color: #ffffff;
- border: 1px solid #999;
- border: 1px solid rgba(0, 0, 0, 0.3);
- *border: 1px solid #999;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
- outline: none;
- -webkit-background-clip: padding-box;
- -moz-background-clip: padding-box;
- background-clip: padding-box;
-}
-
-.modal.fade {
- top: -25%;
-}
-
-.modal.fade.in {
- top: 10%;
-}
-
-.modal-header {
- padding: 9px 15px;
- border-bottom: 1px solid #eee;
-}
-
-.modal-header .close {
- margin-top: 2px;
-}
-
-.modal-header h3 {
- margin: 0;
- line-height: 30px;
-}
-
-.modal-body {
- position: relative;
- max-height: 400px;
- padding: 15px;
- overflow-y: auto;
-}
-
-.modal-form {
- margin-bottom: 0;
-}
-
-.modal-footer {
- padding: 14px 15px 15px;
- margin-bottom: 0;
- text-align: right;
- background-color: #f5f5f5;
- border-top: 1px solid #ddd;
- *zoom: 1;
-}
-
-.modal-footer:before,
-.modal-footer:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.modal-footer:after {
- clear: both;
-}
-
-.modal-footer .btn + .btn {
- margin-bottom: 0;
- margin-left: 5px;
-}
-
-.modal-footer .btn-group .btn + .btn {
- margin-left: -1px;
-}
-
-.modal-footer .btn-block + .btn-block {
- margin-left: 0;
-}
-
-.tooltip {
- position: absolute;
- z-index: 1030;
- display: block;
- font-size: 18px;
- line-height: 1;
- opacity: 0;
- filter: alpha(opacity=0);
- visibility: visible;
-}
-
-.tooltip.in {
- opacity: 0.8;
- filter: alpha(opacity=80);
-}
-
-.tooltip.top {
- padding: 9px 0 9px;
- margin-top: -3px;
-}
-
-.tooltip.right {
- padding: 0 4px 0 4px;
- margin-left: 3px;
-}
-
-.tooltip.bottom {
- padding: 9px 0 9px;
- margin-top: 3px;
-}
-
-.tooltip.left {
- padding: 0 4px 0 4px;
- margin-left: -3px;
-}
-
-.tooltip-inner {
- max-width: 310px;
- padding: 9px 4px 9px 4px;
- color: #ffffff;
- text-align: center;
- text-decoration: none;
- background-color: #000000;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.tooltip-arrow {
- position: absolute;
- width: 0;
- height: 0;
- border-color: transparent;
- border-style: solid;
-}
-
-.tooltip.top .tooltip-arrow {
- bottom: 0;
- left: 50%;
- margin-left: -5px;
- border-top-color: #000000;
- border-width: 5px 5px 0;
-}
-
-.tooltip.right .tooltip-arrow {
- top: 50%;
- left: 0;
- margin-top: -5px;
- border-right-color: #000000;
- border-width: 5px 5px 5px 0;
-}
-
-.tooltip.left .tooltip-arrow {
- top: 50%;
- right: 0;
- margin-top: -5px;
- border-left-color: #000000;
- border-width: 5px 0 5px 5px;
-}
-
-.tooltip.bottom .tooltip-arrow {
- top: 0;
- left: 50%;
- margin-left: -5px;
- border-bottom-color: #000000;
- border-width: 0 5px 5px;
-}
-
-.popover {
- position: absolute;
- top: 0;
- left: 0;
- z-index: 1010;
- display: none;
- max-width: 496px;
- padding: 1px;
- text-align: left;
- white-space: normal;
- background-color: #ffffff;
- -webkit-background-clip: padding-box;
- -moz-background-clip: padding;
- background-clip: padding-box;
-}
-
-.popover.top {
- margin-top: -10px;
-}
-
-.popover.right {
- margin-left: 10px;
-}
-
-.popover.bottom {
- margin-top: 10px;
-}
-
-.popover.left {
- margin-left: -10px;
-}
-
-.popover-title {
- padding: 8px 14px;
- margin: 0;
- font-size: 14px;
- font-weight: normal;
- line-height: 18px;
- background-color: #ffffff;
- border-bottom: 1px solid #f2f2f2;
-}
-
-.popover-title:empty {
- display: none;
-}
-
-.popover-content {
- padding: 9px 14px;
-}
-
-.popover .arrow,
-.popover .arrow:after {
- position: absolute;
- display: block;
- width: 0;
- height: 0;
- border-color: transparent;
- border-style: solid;
-}
-
-.popover .arrow {
- border-width: 11px;
-}
-
-.popover .arrow:after {
- border-width: 10px;
- content: "";
-}
-
-.popover.top .arrow {
- bottom: -11px;
- left: 50%;
- margin-left: -11px;
- border-top-color: #999;
- border-top-color: rgba(0, 0, 0, 0.25);
- border-bottom-width: 0;
-}
-
-.popover.top .arrow:after {
- bottom: 1px;
- margin-left: -10px;
- border-top-color: #ffffff;
- border-bottom-width: 0;
-}
-
-.popover.right .arrow {
- top: 50%;
- left: -11px;
- margin-top: -11px;
- border-right-color: #999;
- border-right-color: rgba(0, 0, 0, 0.25);
- border-left-width: 0;
-}
-
-.popover.right .arrow:after {
- bottom: -10px;
- left: 1px;
- border-right-color: #ffffff;
- border-left-width: 0;
-}
-
-.popover.bottom .arrow {
- top: -11px;
- left: 50%;
- margin-left: -11px;
- border-bottom-color: #999;
- border-bottom-color: rgba(0, 0, 0, 0.25);
- border-top-width: 0;
-}
-
-.popover.bottom .arrow:after {
- top: 1px;
- margin-left: -10px;
- border-bottom-color: #ffffff;
- border-top-width: 0;
-}
-
-.popover.left .arrow {
- top: 50%;
- right: -11px;
- margin-top: -11px;
- border-left-color: #999;
- border-left-color: rgba(0, 0, 0, 0.25);
- border-right-width: 0;
-}
-
-.popover.left .arrow:after {
- right: 1px;
- bottom: -10px;
- border-left-color: #ffffff;
- border-right-width: 0;
-}
-
-.thumbnails {
- margin-left: -16px;
- list-style: none;
- *zoom: 1;
-}
-
-.thumbnails:before,
-.thumbnails:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.thumbnails:after {
- clear: both;
-}
-
-.row-fluid .thumbnails {
- margin-left: 0;
-}
-
-.thumbnails > li {
- float: left;
- margin-bottom: 20px;
- margin-left: 16px;
-}
-
-.thumbnail {
- display: block;
- padding: 3px 6px;
- margin: 4px 3px;
- line-height: 20px;
- border: 1px solid #ddd;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
- -webkit-box-shadow: 0;
- -moz-box-shadow: 0;
- box-shadow: 0;
-}
-
-a.thumbnail:hover,
-a.thumbnail:focus {
- border-color: #fefe54;
- -webkit-box-shadow: 0;
- -moz-box-shadow: 0;
- box-shadow: 0;
-}
-
-.thumbnail > img {
- display: block;
- max-width: 100%;
- margin-right: auto;
- margin-left: auto;
-}
-
-.thumbnail .caption {
- padding: 9px;
- color: #bbbbbb;
-}
-
-.media,
-.media-body {
- overflow: hidden;
- *overflow: visible;
- zoom: 1;
-}
-
-.media,
-.media .media {
- margin-top: 15px;
-}
-
-.media:first-child {
- margin-top: 0;
-}
-
-.media-object {
- display: block;
-}
-
-.media-heading {
- margin: 0 0 5px;
-}
-
-.media > .pull-left {
- margin-right: 10px;
-}
-
-.media > .pull-right {
- margin-left: 10px;
-}
-
-.media-list {
- margin-left: 0;
- list-style: none;
-}
-
-.label,
-.badge {
- display: inline-block;
- padding: 0 12.4px;
- font-size: 18px;
- line-height: 20px;
- color: #ffffff;
- white-space: nowrap;
- vertical-align: baseline;
- background-color: #555555;
-}
-
-.badge {
- padding-right: 12.4px;
- padding-left: 12.4px;
-}
-
-.label:empty,
-.badge:empty {
- display: none;
-}
-
-a.label:hover,
-a.label:focus,
-a.badge:hover,
-a.badge:focus {
- color: #ffffff;
- text-decoration: none;
- cursor: pointer;
-}
-
-.label-important,
-.badge-important {
- background-color: #aa0000;
-}
-
-.label-important[href],
-.badge-important[href] {
- background-color: #aa0000;
-}
-
-.label-warning,
-.badge-warning {
- background-color: #a85400;
-}
-
-.label-warning[href],
-.badge-warning[href] {
- background-color: #a85400;
-}
-
-.label-success,
-.badge-success {
- background-color: #00aa00;
-}
-
-.label-success[href],
-.badge-success[href] {
- background-color: #00aa00;
-}
-
-.label-info,
-.badge-info {
- background-color: #000000;
-}
-
-.label-info[href],
-.badge-info[href] {
- background-color: #000000;
-}
-
-.label-inverse,
-.badge-inverse {
- background-color: #555555;
-}
-
-.label-inverse[href],
-.badge-inverse[href] {
- background-color: #555555;
-}
-
-.btn .label,
-.btn .badge {
- position: relative;
- top: -1px;
-}
-
-.btn-mini .label,
-.btn-mini .badge {
- top: 0;
-}
-
-@-webkit-keyframes progress-bar-stripes {
- from {
- background-position: 40px 0;
- }
- to {
- background-position: 0 0;
- }
-}
-
-@-moz-keyframes progress-bar-stripes {
- from {
- background-position: 40px 0;
- }
- to {
- background-position: 0 0;
- }
-}
-
-@-ms-keyframes progress-bar-stripes {
- from {
- background-position: 40px 0;
- }
- to {
- background-position: 0 0;
- }
-}
-
-@-o-keyframes progress-bar-stripes {
- from {
- background-position: 0 0;
- }
- to {
- background-position: 40px 0;
- }
-}
-
-@keyframes progress-bar-stripes {
- from {
- background-position: 40px 0;
- }
- to {
- background-position: 0 0;
- }
-}
-
-.progress {
- height: 20px;
- margin-bottom: 20px;
- overflow: hidden;
- background-color: #f7f7f7;
- background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
- background-image: -webkit-gradient(
- linear,
- 0 0,
- 0 100%,
- from(#f5f5f5),
- to(#f9f9f9)
- );
- background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
- background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
- background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);
- background-repeat: repeat-x;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);
-}
-
-.progress .bar {
- float: left;
- width: 0;
- height: 100%;
- font-size: 12px;
- color: #ffffff;
- text-align: center;
- text-shadow: 0;
- background-color: #0e90d2;
- background-image: -moz-linear-gradient(top, #149bdf, #0480be);
- background-image: -webkit-gradient(
- linear,
- 0 0,
- 0 100%,
- from(#149bdf),
- to(#0480be)
- );
- background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
- background-image: -o-linear-gradient(top, #149bdf, #0480be);
- background-image: linear-gradient(to bottom, #149bdf, #0480be);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- -webkit-transition: width 0.6s ease;
- -moz-transition: width 0.6s ease;
- -o-transition: width 0.6s ease;
- transition: width 0.6s ease;
-}
-
-.progress-striped .bar {
- background-color: #149bdf;
- background-image: -webkit-gradient(
- linear,
- 0 100%,
- 100% 0,
- color-stop(0.25, rgba(255, 255, 255, 0.15)),
- color-stop(0.25, transparent),
- color-stop(0.5, transparent),
- color-stop(0.5, rgba(255, 255, 255, 0.15)),
- color-stop(0.75, rgba(255, 255, 255, 0.15)),
- color-stop(0.75, transparent),
- to(transparent)
- );
- background-image: -webkit-linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-image: -moz-linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-image: -o-linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-image: linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- -webkit-background-size: 40px 40px;
- -moz-background-size: 40px 40px;
- -o-background-size: 40px 40px;
- background-size: 40px 40px;
-}
-
-.progress.active .bar {
- -webkit-animation: progress-bar-stripes 2s linear infinite;
- -moz-animation: progress-bar-stripes 2s linear infinite;
- -ms-animation: progress-bar-stripes 2s linear infinite;
- -o-animation: progress-bar-stripes 2s linear infinite;
- animation: progress-bar-stripes 2s linear infinite;
-}
-
-.progress-danger .bar,
-.progress .bar-danger {
- background-color: #dd514c;
- background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
- background-image: -webkit-gradient(
- linear,
- 0 0,
- 0 100%,
- from(#ee5f5b),
- to(#c43c35)
- );
- background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
- background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
- background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);
-}
-
-.progress-danger.progress-striped .bar,
-.progress-striped .bar-danger {
- background-color: #ee5f5b;
- background-image: -webkit-gradient(
- linear,
- 0 100%,
- 100% 0,
- color-stop(0.25, rgba(255, 255, 255, 0.15)),
- color-stop(0.25, transparent),
- color-stop(0.5, transparent),
- color-stop(0.5, rgba(255, 255, 255, 0.15)),
- color-stop(0.75, rgba(255, 255, 255, 0.15)),
- color-stop(0.75, transparent),
- to(transparent)
- );
- background-image: -webkit-linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-image: -moz-linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-image: -o-linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-image: linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
-}
-
-.progress-success .bar,
-.progress .bar-success {
- background-color: #5eb95e;
- background-image: -moz-linear-gradient(top, #62c462, #57a957);
- background-image: -webkit-gradient(
- linear,
- 0 0,
- 0 100%,
- from(#62c462),
- to(#57a957)
- );
- background-image: -webkit-linear-gradient(top, #62c462, #57a957);
- background-image: -o-linear-gradient(top, #62c462, #57a957);
- background-image: linear-gradient(to bottom, #62c462, #57a957);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);
-}
-
-.progress-success.progress-striped .bar,
-.progress-striped .bar-success {
- background-color: #62c462;
- background-image: -webkit-gradient(
- linear,
- 0 100%,
- 100% 0,
- color-stop(0.25, rgba(255, 255, 255, 0.15)),
- color-stop(0.25, transparent),
- color-stop(0.5, transparent),
- color-stop(0.5, rgba(255, 255, 255, 0.15)),
- color-stop(0.75, rgba(255, 255, 255, 0.15)),
- color-stop(0.75, transparent),
- to(transparent)
- );
- background-image: -webkit-linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-image: -moz-linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-image: -o-linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-image: linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
-}
-
-.progress-info .bar,
-.progress .bar-info {
- background-color: #4bb1cf;
- background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
- background-image: -webkit-gradient(
- linear,
- 0 0,
- 0 100%,
- from(#5bc0de),
- to(#339bb9)
- );
- background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
- background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
- background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);
-}
-
-.progress-info.progress-striped .bar,
-.progress-striped .bar-info {
- background-color: #5bc0de;
- background-image: -webkit-gradient(
- linear,
- 0 100%,
- 100% 0,
- color-stop(0.25, rgba(255, 255, 255, 0.15)),
- color-stop(0.25, transparent),
- color-stop(0.5, transparent),
- color-stop(0.5, rgba(255, 255, 255, 0.15)),
- color-stop(0.75, rgba(255, 255, 255, 0.15)),
- color-stop(0.75, transparent),
- to(transparent)
- );
- background-image: -webkit-linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-image: -moz-linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-image: -o-linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-image: linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
-}
-
-.progress-warning .bar,
-.progress .bar-warning {
- background-color: #d66b00;
- background-image: -moz-linear-gradient(top, #f47a00, #a85400);
- background-image: -webkit-gradient(
- linear,
- 0 0,
- 0 100%,
- from(#f47a00),
- to(#a85400)
- );
- background-image: -webkit-linear-gradient(top, #f47a00, #a85400);
- background-image: -o-linear-gradient(top, #f47a00, #a85400);
- background-image: linear-gradient(to bottom, #f47a00, #a85400);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff47a00', endColorstr='#ffa85400', GradientType=0);
-}
-
-.progress-warning.progress-striped .bar,
-.progress-striped .bar-warning {
- background-color: #f47a00;
- background-image: -webkit-gradient(
- linear,
- 0 100%,
- 100% 0,
- color-stop(0.25, rgba(255, 255, 255, 0.15)),
- color-stop(0.25, transparent),
- color-stop(0.5, transparent),
- color-stop(0.5, rgba(255, 255, 255, 0.15)),
- color-stop(0.75, rgba(255, 255, 255, 0.15)),
- color-stop(0.75, transparent),
- to(transparent)
- );
- background-image: -webkit-linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-image: -moz-linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-image: -o-linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-image: linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
-}
-
-.accordion {
- margin-bottom: 20px;
-}
-
-.accordion-group {
- margin-bottom: 2px;
- border: 1px solid #e5e5e5;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.accordion-heading {
- border-bottom: 0;
-}
-
-.accordion-heading .accordion-toggle {
- display: block;
- padding: 8px 15px;
-}
-
-.accordion-toggle {
- cursor: pointer;
-}
-
-.accordion-inner {
- padding: 9px 15px;
- border-top: 1px solid #e5e5e5;
-}
-
-.carousel {
- position: relative;
- margin-bottom: 20px;
- line-height: 1;
-}
-
-.carousel-inner {
- position: relative;
- width: 100%;
- overflow: hidden;
-}
-
-.carousel-inner > .item {
- position: relative;
- display: none;
-}
-
-.carousel-inner > .item > img,
-.carousel-inner > .item > a > img {
- display: block;
- line-height: 1;
-}
-
-.carousel-inner > .active,
-.carousel-inner > .next,
-.carousel-inner > .prev {
- display: block;
-}
-
-.carousel-inner > .active {
- left: 0;
-}
-
-.carousel-inner > .next,
-.carousel-inner > .prev {
- position: absolute;
- top: 0;
- width: 100%;
-}
-
-.carousel-inner > .next {
- left: 100%;
-}
-
-.carousel-inner > .prev {
- left: -100%;
-}
-
-.carousel-inner > .next.left,
-.carousel-inner > .prev.right {
- left: 0;
-}
-
-.carousel-inner > .active.left {
- left: -100%;
-}
-
-.carousel-inner > .active.right {
- left: 100%;
-}
-
-.carousel-control {
- position: absolute;
- top: 40%;
- left: 15px;
- width: 40px;
- height: 40px;
- margin-top: -20px;
- font-size: 60px;
- font-weight: 100;
- line-height: 30px;
- color: #ffffff;
- text-align: center;
- background: #555555;
- border: 3px solid #ffffff;
- opacity: 0.5;
- filter: alpha(opacity=50);
-}
-
-.carousel-control.right {
- right: 15px;
- left: auto;
-}
-
-.carousel-control:hover,
-.carousel-control:focus {
- color: #ffffff;
- text-decoration: none;
- opacity: 0.9;
- filter: alpha(opacity=90);
-}
-
-.carousel-indicators {
- position: absolute;
- top: 15px;
- right: 15px;
- z-index: 5;
- margin: 0;
- list-style: none;
-}
-
-.carousel-indicators li {
- display: block;
- float: left;
- width: 10px;
- height: 10px;
- margin-left: 5px;
- text-indent: -999px;
- background-color: #ccc;
- background-color: rgba(255, 255, 255, 0.25);
-}
-
-.carousel-indicators .active {
- background-color: #fff;
-}
-
-.carousel-caption {
- position: absolute;
- right: 0;
- bottom: 0;
- left: 0;
- padding: 15px;
- background: #555555;
- background: rgba(0, 0, 0, 0.75);
-}
-
-.carousel-caption h4,
-.carousel-caption p {
- line-height: 20px;
- color: #ffffff;
-}
-
-.carousel-caption h4 {
- margin: 0 0 5px;
-}
-
-.carousel-caption p {
- margin-bottom: 0;
-}
-
-.hero-unit {
- padding: 16px 20.8px;
- margin-bottom: 20px;
- font-size: 18px;
- line-height: 20px;
- color: #ffffff;
- background-color: #00aaaa;
- border: 4px double #ffffff;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
- box-shadow: 0 0 0 4px #00aaaa;
-}
-
-.hero-unit h1 {
- margin-bottom: 20px;
- font-size: 18px;
- line-height: 1;
- color: #ffffff;
- text-align: center;
- text-decoration: blink;
-}
-
-.hero-unit li {
- line-height: 20px;
-}
-
-.pull-right {
- float: right;
-}
-
-.pull-left {
- float: left;
-}
-
-.hide {
- display: none;
-}
-
-.show {
- display: block;
-}
-
-.invisible {
- visibility: hidden;
-}
-
-#wrap386 {
- position: fixed;
- right: 0;
- bottom: 0;
- z-index: 9999999;
- width: 100%;
- height: 100%;
- background: #000084;
-}
-
-#bar386 {
- float: right;
- width: 100%;
- height: 20px;
- margin-top: -20px;
- font-weight: bold;
- color: #ffffff;
- background: #000084;
-}
-
-#cursor386 {
- position: fixed;
- right: 0;
- bottom: 0;
- z-index: 9999999;
- font-weight: bold;
- color: #ffffff;
-}
diff --git a/web/static/css/fonts/Fixedsys500c.eot b/web/static/css/fonts/Fixedsys500c.eot
Binary files differ.
diff --git a/web/static/css/fonts/Fixedsys500c.otf b/web/static/css/fonts/Fixedsys500c.otf
Binary files differ.
diff --git a/web/static/css/fonts/Fixedsys500c.svg b/web/static/css/fonts/Fixedsys500c.svg
@@ -1,646 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
-<metadata>
-Created by FontForge 20190801 at Sun Aug 5 10:20:04 2001
- By chris
-GPL, see http://www.gnu.org/licenses/gpl.txt
-</metadata>
-<defs>
-<font id="FixedsysTTF" horiz-adv-x="550" >
- <font-face
- font-family="FixedsysTTF"
- font-weight="600"
- font-stretch="normal"
- units-per-em="1000"
- panose-1="2 0 0 9 0 0 0 0 0 0"
- ascent="800"
- descent="-200"
- x-height="465"
- cap-height="610"
- bbox="-1 -288 550 813"
- underline-thickness="50"
- underline-position="-125"
- unicode-range="U+0001-20AC"
- />
-<missing-glyph
- />
- <glyph glyph-name=".notdef"
- />
- <glyph glyph-name=".null"
- />
- <glyph glyph-name="nonmarkingreturn"
- />
- <glyph glyph-name="space" unicode=" "
- />
- <glyph glyph-name="space" unicode=" "
- />
- <glyph glyph-name=".0015"
-d="M10 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v130h-135v-130h-125v470h125v-130h135v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5
-h-260q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-470z" />
- <glyph glyph-name="exclam" unicode="!"
-d="M226 130v-130h120v130h-120zM221 335v-125h130v125h65v205q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-120q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-205h65z" />
- <glyph glyph-name="quotedbl" unicode="""
-d="M54 602v-200h130v200h-130v0zM324 602v-200h130v200h-130v0z" />
- <glyph glyph-name="numbersign" unicode="#"
-d="M119 135v-135h123v130h90v-130h127v135h69v70h-68v200h68v70h-69v135h-127v-130h-85v130h-128v-135h-69v-70h64v-200h-64v-70h69v0zM247 400h80v-190h-80v190v0z" />
- <glyph glyph-name="dollar" unicode="$"
-d="M187 1v-134h128v136h70v69l69 2v138h-68v69h-71v61h-69l-1 70h-59v141h129v-70h140v70h-69l-1 69h-70v139h-129v-139h-70v-71h-69v-138h70v-69h69v-61h60v-70l68 1v-142h-128v69h-141v-67h69q0 -19 0.5 -35.5t0.5 -35.5q3 -1 13 -1h22h22q11 0 15 -1z" />
- <glyph glyph-name="percent" unicode="%"
-d="M266 10v-65h205q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-205v-65h-55v-140h55zM341 145h60v-130h-60v130zM71 215v-130h60q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5
-q1 1 10 2.5t19.5 2.5t19.5 2t11 3q3 3 5.5 12t4 19.5t2 20t-1.5 13.5h50q-2 4 -2 13q0 10 1.5 20.5t4.5 19.5t6 12t12 6t19.5 4.5t19.5 1.5q10 0 14 -2v50q4 -2 13.5 -1.5t20 2t19.5 4t12 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v130h-60
-q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5q-2 -2 -11 -3t-19.5 -2t-19.5 -2.5t-10 -2.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-2 -2 -11 -3t-19.5 -2t-19.5 -2.5t-10 -2.5q-3 -3 -5.5 -11.5t-4 -18t-2 -18t1.5 -12.5q-3 1 -10.5 0.5t-15.5 -2t-15 -3.5t-9 -5
-t-4.5 -10t-4 -15t-2.5 -15t1 -10q-4 2 -12.5 1.5t-18 -2t-18 -4t-11.5 -5.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5zM1 495q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h190q-2 4 -1.5 12.5t2 18
-t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-190q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-130zM141 625h60v-130h-60v130z" />
- <glyph glyph-name="ampersand" unicode="&"
-d="M56 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h195v60h70v-60h135v65h-60v140h60v65h-270v-65h60v-135h-120v265h120q-2 4 -1.5 13.5t2 20t4 19.5t5.5 12t11.5 5.5t18 4t18 2t12.5 -1.5v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5
-t-5.5 11.5t-4 18t-2 18t1.5 12.5h-190q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-135h60v-70h-60v-265zM196 540h50v-130h-50v130z" />
- <glyph glyph-name="quotesingle" unicode="'"
-d="M178 604v-200h120v200h-120v0z" />
- <glyph glyph-name="parenleft" unicode="("
-d="M282 -66v-65h135v65h-65v140h-65v340h65v140h65v65h-135v-65h-60v-140h-65v-340h65v-140h60v0z" />
- <glyph glyph-name="parenright" unicode=")"
-d="M165 -61l1 -68h121v65h75v140h65v340h-65v137h-70v68h-126l-1 -72h66l1 -133h55v-340h-55l-1 -137h-66z" />
- <glyph glyph-name="asterisk" unicode="*"
-d="M109 216v-65h125v60h70v-60h135v65h-60v70h130v60h-130v70h60v65h-135v-60h-70v60h-125v-65h60v-70h-130v-60h130v-70h-60v0z" />
- <glyph glyph-name="plus" unicode="+"
-d="M194 252v-135h130v135h135v60h-135v135h-130v-135h-135v-60h135v0z" />
- <glyph glyph-name="comma" unicode=","
-d="M200 -63v-65h120q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v200h-190v-135h50v-70h-50z" />
- <glyph glyph-name="minus" unicode="-"
-d="M56 303v-50h400v50h-400z" />
- <glyph glyph-name="period" unicode="."
-d="M198 130v-130h190v130h-190v0z" />
- <glyph glyph-name="slash" unicode="/"
-d="M87 -64h99l301 631v49h-108l-292 -584v-96z" />
- <glyph glyph-name="zero" unicode="0"
-d="M82 71q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18
-t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-470zM218 134h60v140h-60v265h130v-65h-60v-140h60v-265h-130v65z" />
- <glyph glyph-name="one" unicode="1"
-d="M249 406v-405h135v610h-135v-65h-60v-70h-135v-70h195v0z" />
- <glyph glyph-name="two" unicode="2"
-d="M98 0h400v65h-260v70h58q-2 4 -3 13.5t-1 19.5q0 11 1.5 20t4.5 12q1 1 10 2.5t19.5 2.5t19.5 2t11 3q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 12 5.5t19.5 4t20 2t13.5 -1.5v55h65v205q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260
-q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-130h135v130h125v-205h-60q1 -3 1 -11t-1.5 -17t-4 -16.5t-5.5 -10.5q-2 -3 -9.5 -4.5t-16.5 -2.5t-18 -1q-8 0 -11 2q2 -4 3.5 -14t1.5 -22q0 -11 -1 -21t-4 -13q-2 -2 -12 -1.5t-22.5 1.5
-t-23.5 1q-10 0 -11 -1q-2 -2 -2 -12t0.5 -22.5t0 -23t-1.5 -11.5q-3 -3 -12 -4t-19 -1t-19 1.5t-13 3.5v-135z" />
- <glyph glyph-name="three" unicode="3"
-d="M95 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v205h-60v60h60v205q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5
-t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-130h135v130h125v-205h-120v-60h120v-205h-125v130h-135v-130z" />
- <glyph glyph-name="four" unicode="4"
-d="M319 135v-135h140v135h65v70h-65v265h-140v-260h-125v65h50v335h-125v-335h-65v-140h265v0z" />
- <glyph glyph-name="five" unicode="5"
-d="M44 65v-65h313q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5q1 1 10 2.5t19.5 2.5t19.5 2t11 3q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v135h-65v60h-248v210h313v65h-453v-335h313v-135q-4 2 -12.5 1.5t-18 -2t-18 -4t-11.5 -5.5t-5.5 -12t-4 -19.5
-t-2 -20t1.5 -13.5h-243z" />
- <glyph glyph-name="six" unicode="6"
-d="M95 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v260q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 12t-4 19.5t-2 20t1.5 13.5h-130v65q4 -2 12.5 -1.5t18 2t18 4
-t11.5 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v60h-195v-130q-4 2 -13.5 1.5t-20 -2t-19.5 -4t-12 -5.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-330zM235 330h120v-260h-120v260z" />
- <glyph glyph-name="seven" unicode="7"
-d="M157 205v-205h125v205h70v130h70v140h65v135h-400v-65h260v-70h-65v-140h-60v-130h-65v0z" />
- <glyph glyph-name="eight" unicode="8"
-d="M87 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v205h-60v60h60v205q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5
-t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-205h60v-60h-60v-205zM227 270h50q-2 -4 -1.5 -12.5t2 -18t4 -18t5.5 -11.5t11.5 -5.5t18 -4t18 -2t12.5 1.5v-130h-120v200zM282 405h-55v135h120v-200h-65v65z" />
- <glyph glyph-name="nine" unicode="9"
-d="M156 60v-60h195v130q4 -2 13.5 -1.5t20 2t19.5 4t12 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v330q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5
-t-18 -4t-18 -2t-12.5 1.5v-260q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -12t4 -19.5t2 -20t-1.5 -13.5h120v-70h-50q2 -4 1.5 -13.5t-2 -20t-4 -19.5t-5.5 -12t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5zM226 540h120v-260h-120v260z" />
- <glyph glyph-name="colon" unicode=":"
-d="M193 139v-130h190v130h-190v0zM193 479v-130h190v130h-190v0z" />
- <glyph glyph-name="semicolon" unicode=";"
-d="M198 -66v-65h120q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v200h-190v-135h50v-70h-50zM198 479v-130h190v130h-190z" />
- <glyph glyph-name="less" unicode="<"
-d="M494 0h-102l-301 300l301 310h102v-42l-267 -269l267 -262v-37z" />
- <glyph glyph-name="equal" unicode="="
-d="M99 283v-60h401v60h-401v0zM99 422v-60h401v60h-401v0z" />
- <glyph glyph-name="greater" unicode=">"
-d="M92 0h102l301 300l-301 310h-102v-42l259 -261l-259 -265v-42z" />
- <glyph glyph-name="question" unicode="?"
-d="M211 130v-130h120v130h-120zM211 335v-125h125v120q4 -2 13.5 -1.5t20 2t19.5 4t12 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18
-t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-130h135v130h125v-130q-4 2 -12.5 1.5t-18 -2t-18 -4t-11.5 -5.5t-5.5 -12t-4 -19.5t-2 -20t1.5 -13.5h-50z" />
- <glyph glyph-name="at" unicode="@"
-d="M7 71q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h470v65h-400v481h265v-141h-140v-70h-55v-130h55v-65h275v404h-66l-4 66h-406v-65l-64 -1v-474zM359 335h72v-130h-72v130z" />
- <glyph glyph-name="A" unicode="A"
-d="M59 470v-470h135v200h130v-200h135v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-2 1 -11 2.5t-19.5 2.5t-19.5 2t-10 3q-3 3 -5.5 11.5t-4 18t-2 18t1.5 12.5h-120q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5q-2 -2 -11 -3
-t-19.5 -2t-19.5 -2.5t-10 -2.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5zM199 470h120v-190h-120v190z" />
- <glyph glyph-name="B" unicode="B"
-d="M62 610v-610h330q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v205h-60v60h60v205q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-330zM202 270h120v-200h-120v200zM202 540h120v-200h-120v200z" />
- <glyph glyph-name="C" unicode="C"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v130h-135v-130h-125v470h125v-130h135v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5
-h-260q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-470z" />
- <glyph glyph-name="D" unicode="D"
-d="M54 610v-610h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5q1 1 10 2.5t19.5 2.5t19.5 2t11 3q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v330q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-2 1 -11 2.5t-19.5 2.5
-t-19.5 2t-10 3q-3 3 -5.5 11.5t-4 18t-2 18t1.5 12.5h-260zM194 540h50q-2 -4 -1.5 -12.5t2 -18t4 -18t5.5 -11.5t11.5 -5.5t18 -4t18 -2t12.5 1.5v-330q-4 2 -12.5 1.5t-18 -2t-18 -4t-11.5 -5.5t-5.5 -11.5t-4 -18t-2 -18t1.5 -12.5h-50v470z" />
- <glyph glyph-name="E" unicode="E"
-d="M59 610v-610h400v65h-260v210h190v60h-190v210h260v65h-400v0z" />
- <glyph glyph-name="F" unicode="F"
-d="M59 610v-610h135v275h195v60h-190v210h260v65h-400v0z" />
- <glyph glyph-name="G" unicode="G"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v270h-200v-65h60v-135h-120v470h125v-130h135v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5
-t-18 -4t-18 -2t-12.5 1.5v-470z" />
- <glyph glyph-name="H" unicode="H"
-d="M59 610v-610h135v270h130v-270h135v610h-135v-270h-130v270h-135v0z" />
- <glyph glyph-name="I" unicode="I"
-d="M124 65v-65h260v65h-60v480h60v65h-260v-65h60v-480h-60v0z" />
- <glyph glyph-name="J" unicode="J"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v540h-135v-540h-130v130h-135v-130z" />
- <glyph glyph-name="K" unicode="K"
-d="M56 610v-610h135v270h60v-135h70v-135h135v135h-65v140h-65v60h65v140h65v135h-135v-135h-70v-135h-60v270h-135v0z" />
- <glyph glyph-name="L" unicode="L"
-d="M59 610v-610h400v65h-265v545h-135v0z" />
- <glyph glyph-name="M" unicode="M"
-d="M44 610v-610h135v405h55v70h-55v135h-135zM379 400v-400h135v610h-135v-130q-4 2 -13.5 1.5t-20 -2t-19.5 -4t-12 -5.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-190h65v190h70z" />
- <glyph glyph-name="N" unicode="N"
-d="M56 610v-610h135v350l200 -176v-174h135v610h-135v-301l-200 191v110h-135z" />
- <glyph glyph-name="O" unicode="O"
-d="M75 69q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18
-t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-470zM215 539h120v-470h-120v470z" />
- <glyph glyph-name="P" unicode="P"
-d="M57 615v-615h139v275h200v60h65v209l-65 1v70h-339v0zM196 544h129v-209h-129v209v0z" />
- <glyph glyph-name="Q" unicode="Q"
-d="M247 0q-2 -4 -1.5 -13.5t2 -20t4 -19.5t5.5 -12q1 -2 10 -3t19.5 -2t19.5 -2.5t11 -2.5q3 -3 5.5 -11.5t4 -18t2 -18t-1.5 -12.5h130v65h-60v140h60v475q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18
-t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-470q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -12t4 -19.5t2 -20t-1.5 -13.5h120zM197 545h120v-470h-120v470z" />
- <glyph glyph-name="R" unicode="R"
-d="M79 610v-610h135v270h55q-2 -4 -1.5 -12.5t2 -18t4 -18t5.5 -11.5t12 -5.5t19.5 -4t20 -2t13.5 1.5v-200h135v205h-60v130h60v205q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-330zM219 540h120v-200h-120v200z" />
- <glyph glyph-name="S" unicode="S"
-d="M51 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-3 3 -12 5.5t-19.5 4t-20 2
-t-13.5 -1.5v50q-4 -2 -14 -2q-9 0 -19.5 1.5t-19.5 4.5t-12 6t-6 12t-4.5 19.5t-1.5 19.5q0 10 2 14h-50v135h125v-60h135v60q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4
-t-18 -2t-12.5 1.5v-130q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5q1 -2 2.5 -11t2.5 -19.5t2 -19.5t3 -10q3 -3 11.5 -5.5t18 -4t18 -2t12.5 1.5q-2 -3 -1 -10.5t2.5 -15.5t4 -15t4.5 -9t9 -4.5t15 -4t15.5 -2.5t10.5 1q-2 -4 -1.5 -12.5t2 -18t4 -18t5.5 -11.5t11.5 -5.5t18 -4
-t18 -2t12.5 1.5v-130h-125v60h-135v-60z" />
- <glyph glyph-name="T" unicode="T"
-d="M194 545v-545h130v545h135v65h-400v-65h135v0z" />
- <glyph glyph-name="U" unicode="U"
-d="M56 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v540h-135v-540h-130v540h-135v-540z" />
- <glyph glyph-name="V" unicode="V"
-d="M54 140q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5q1 -2 2.5 -11t2.5 -19.5t2 -19.5t3 -10q1 -2 10 -3t19.5 -2t19.5 -2.5t11 -2.5q3 -3 5.5 -11.5t4 -18t2 -18t-1.5 -12.5h120q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5q1 1 10 2.5t19.5 2.5t19.5 2t11 3q1 1 2.5 10t2.5 19.5t2 19.5
-t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v470h-135v-470h-130v470h-135v-470z" />
- <glyph glyph-name="W" unicode="W"
-d="M119 205v-205h130v205h65v195h-65v-190h-60v400h-135v-405h65v0zM324 205v-205h135v205h65v405h-135v-405h-65v0z" />
- <glyph glyph-name="X" unicode="X"
-d="M56 200v-200h135v270h55q-2 -4 -1.5 -12.5t2 -18t4 -18t5.5 -11.5t12 -5.5t19.5 -4t20 -2t13.5 1.5v-200h135v200q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-3 3 -11.5 5.5t-18 4t-18 2t-12.5 -1.5v120q4 -2 12.5 -1.5t18 2t18 4
-t11.5 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v130h-135v-200h-70v65h-60v135h-135v-130q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5q1 -2 2.5 -11t2.5 -19.5t2 -19.5t3 -10q3 -3 11.5 -5.5t18 -4t18 -2t12.5 1.5v-120q-4 2 -12.5 1.5t-18 -2
-t-18 -4t-11.5 -5.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5z" />
- <glyph glyph-name="Y" unicode="Y"
-d="M189 275v-275h130v275h70v60h65v275h-135v-270h-130v270h-135v-275h65v-60h70v0z" />
- <glyph glyph-name="Z" unicode="Z"
-d="M56 200v-200h400v65h-260v140h50q-2 4 -2 13q0 10 1.5 20.5t4.5 19.5t6 12t12 6t19.5 4.5t19.5 1.5q10 0 14 -2v50q4 -2 13.5 -1.5t20 2t19.5 4t12 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v200h-400v-65h260v-135q-4 2 -12.5 1.5t-18 -2
-t-18 -4t-11.5 -5.5t-5.5 -11.5t-4 -18t-2 -18t1.5 -12.5q-3 1 -10.5 0.5t-15.5 -2t-15 -3.5t-9 -5t-4.5 -9.5t-4 -14.5t-2.5 -15.5t1 -10.5q-4 2 -12.5 1.5t-18 -2t-18 -4t-11.5 -5.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5z
-" />
- <glyph glyph-name="bracketleft" unicode="["
-d="M121 623v-798h269v55h-130v678h130v65h-269v0z" />
- <glyph glyph-name="backslash" unicode="\"
-d="M372 -60l110 -3l-2 53l-314 625l-84 2v-99z" />
- <glyph glyph-name="bracketright" unicode="]"
-d="M166 -132v-55h260v810h-260v-65h120v-690h-120v0z" />
- <glyph glyph-name="asciicircum" unicode="^"
-d="M208 717v-60v0h-60v0v-60v0h-60v0v-60v0h120v0v60h120v0v-60v0h108v0v60v0h-48v0v60v0h-60v0v60v0h-120v0z" />
- <glyph glyph-name="underscore" unicode="_"
-d="M0 -158v-50h550v50h-550z" />
- <glyph glyph-name="grave" unicode="`"
-d="M282 589v-69h140v69h-70v140h-199v-70h70v-70h59z" />
- <glyph glyph-name="a" unicode="a"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v400q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260v-65h190v-130h-190q2 -4 1.5 -13.5t-2 -20t-4 -19.5t-5.5 -12t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5
-v-130zM199 200h120v-130h-120v130z" />
- <glyph glyph-name="b" unicode="b"
-d="M97 610v-610h330q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v330h-66v75h-199v135h-135zM237 400h120v-330h-120v330z" />
- <glyph glyph-name="c" unicode="c"
-d="M56 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v60h-135v-60h-125v330h125v-60h135v60q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5
-h-260q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-330z" />
- <glyph glyph-name="d" unicode="d"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v610h-135v-135h-195q2 -4 1.5 -13.5t-2 -20t-4 -19.5t-5.5 -12t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-330zM199 400h120v-330h-120v330z" />
- <glyph glyph-name="e" unicode="e"
-d="M51 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260v65h-190v140h260v195q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5
-v-330zM191 400h120v-120h-120v120z" />
- <glyph glyph-name="f" unicode="f"
-d="M124 275v-275h130v275h209v61h-208v211h208v67h-267v-68h-72v-211h-70v-60h70v0z" />
- <glyph glyph-name="g" unicode="g"
-d="M62 -140v-55h335v55h65v615h-330q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-330q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -12t4 -19.5t2 -20t-1.5 -13.5h190v-140h-260zM202 405h120v-330h-120v330z" />
- <glyph glyph-name="h" unicode="h"
-d="M62 610v-610h135v400h130v-400h135v400q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 12t-4 19.5t-2 20t1.5 13.5h-195v135h-135z" />
- <glyph glyph-name="i" unicode="i"
-d="M59 65v-65h400v65h-135v405h-265v-65h130v-340h-130v0zM199 660v-110h120v110h-120v0z" />
- <glyph glyph-name="j" unicode="j"
-d="M59 -155v-55h265v55h65v615h-260v-65h120v-550h-190v0zM259 650v-110h130v110h-130v0z" />
- <glyph glyph-name="k" unicode="k"
-d="M62 610v-610h135v200h55q-2 -4 -1.5 -12.5t2 -18t4 -18t5.5 -11.5t12 -5.5t19.5 -4t20 -2t13.5 1.5v-130h135v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-3 3 -11.5 5.5t-18 4t-18 2t-12.5 -1.5v65h65v60h65v135h-135v-135h-65
-q2 -3 1.5 -11t-2 -17t-4 -16.5t-5.5 -10.5t-11 0t-16.5 7.5t-16.5 8.5t-11 4v310h-135z" />
- <glyph glyph-name="l" unicode="l"
-d="M59 65v-65h400v65h-135v545h-265v-65h130v-480h-130v0z" />
- <glyph glyph-name="m" unicode="m"
-d="M59 470v-470h135v400h60v-330h70v330h70v-400h135v400h-65v70h-405v0z" />
- <glyph glyph-name="n" unicode="n"
-d="M59 470v-470h135v400h130v-400h135v400l-65 7v63h-335v0z" />
- <glyph glyph-name="o" unicode="o"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v330q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18
-t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-330zM199 400h120v-330h-120v330z" />
- <glyph glyph-name="p" unicode="p"
-d="M56 470v-664h134v193h193q-2 4 -1.5 13.5t2 19.5t4 19t5.5 13q3 3 11 5.5t17.5 4t17.5 1.5q9 0 13 -1v326q-4 -2 -12.5 -1.5t-18 2t-17.5 4t-11 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-327zM195 400h118v-326h-118v326z" />
- <glyph glyph-name="q" unicode="q"
-d="M324 1v-194h135v664h-327q1 -4 2 -15t1 -23t-1 -21.5t-4 -9.5q-4 0 -13.5 -0.5t-20 -1t-20.5 -0.5q-9 0 -13 2v-327q4 2 14 3t21.5 0.5t21.5 -1.5t13 -4t4 -13.5t0 -22t-2.5 -22t-2.5 -14.5h192zM201 402h119v-327h-119v327z" />
- <glyph glyph-name="r" unicode="r"
-d="M62 470v-470h135v276l60 1l1 58h204v135h-135l1 -63h-70l-2 -72h-59v135h-135z" />
- <glyph glyph-name="s" unicode="s"
-d="M62 65v-65h330q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 12t-4 19.5t-2 20t1.5 13.5h-190v130h260v65h-330q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5
-v-120q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -12t4 -19.5t2 -20t-1.5 -13.5h190v-140h-260z" />
- <glyph glyph-name="t" unicode="t"
-d="M124 70q4 2 13.5 1.5t20 -2t19.5 -4t12 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260v65h-200v340h200v70h-205v135h-130v-135h-65v-70h65v-335z" />
- <glyph glyph-name="u" unicode="u"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v470h-135v-400h-130v400h-135v-400z" />
- <glyph glyph-name="v" unicode="v"
-d="M59 140q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5q1 -2 2.5 -11t2.5 -19.5t2 -19.5t3 -10q1 -2 10 -3t19.5 -2t19.5 -2.5t11 -2.5q3 -3 5.5 -11.5t4 -18t2 -18t-1.5 -12.5h120q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5q1 1 10 2.5t19.5 2.5t19.5 2t11 3q1 1 2.5 10t2.5 19.5t2 19.5
-t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v330h-135v-330h-130v330h-135v-330z" />
- <glyph glyph-name="w" unicode="w"
-d="M113 133v-133h129v133h64v263h-64v-257h-59v326h-135v-332h65v0zM316 133v-133h134v133h64v332h-133v-332h-65v0z" />
- <glyph glyph-name="x" unicode="x"
-d="M59 130v-130h135v130h130v-130h135v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-3 3 -11.5 5.5t-18 4t-18 2t-12.5 -1.5v65h65v60h65v135h-135v-130h-130v130h-135v-135h65v-60h65v-65q-4 2 -12.5 1.5t-18 -2t-18 -4t-11.5 -5.5
-q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5z" />
- <glyph glyph-name="y" unicode="y"
-d="M22 -141v-55h265v50q4 -2 13.5 -1.5t20 2t19.5 4t12 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 12 5.5t19.5 4t20 2t13.5 -1.5v135h65v405h-135v-400h-130v400h-135v-400q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -12t4 -19.5t2 -20t-1.5 -13.5h120v-70h-55v-70h-205z
-" />
- <glyph glyph-name="z" unicode="z"
-d="M59 130v-130h400v65h-260v70h50q-2 4 -1.5 13.5t2 20t4 19.5t5.5 12q1 1 10 2.5t19.5 2.5t19.5 2t11 3q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 12 5.5t19.5 4t20 2t13.5 -1.5v55h65v135h-400v-65h260v-70h-60q1 -3 1 -11t-1.5 -17t-4 -16.5t-5.5 -10.5q-2 -3 -9 -5.5
-t-15 -4t-15.5 -2t-10.5 1.5q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5q-2 -2 -11 -3t-19.5 -2t-19.5 -2.5t-10 -2.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5z" />
- <glyph glyph-name="braceleft" unicode="{"
-d="M240 -47v-65h135v65h-65v205h-68v75h-57v65h60v65h65v199h65v65h-135v-65h-60v-199h-70v-65h-65v-65h66v-75h69v-205h60z" />
- <glyph glyph-name="bar" unicode="|"
-d="M228 611v-810h120v810h-120v0z" />
- <glyph glyph-name="braceright" unicode="}"
-d="M101 -61v-65h139v70h75v200h72v80h63v65h-65v76h-70v200h-77v65h-139v-65h71v-200h78l2 -76h60v-65h-59v-75h-79v-210h-71z" />
- <glyph glyph-name="asciitilde" unicode="~"
-d="M1 557v-134h61v65h67v68h77v-68h60v-65h216v65h59v135h-60v-63h-80v-67h-60v68h-80v71h-195v-75h-65z" />
- <glyph glyph-name="tilde" unicode="˜"
-d="M1 557v-134h61v65h67v68h77v-68h60v-65h216v65h59v135h-60v-63h-80v-67h-60v68h-80v71h-195v-75h-65z" />
- <glyph glyph-name="sf256"
- />
- <glyph glyph-name="sf260"
-d="M0 479v-480h120v400h160v-400h152q0 82 1.5 150t-2.5 122.5t-18 94.5t-44 67t-80.5 40.5t-128.5 13.5q-9 0 -32 -1.5t-48.5 -3t-48 -2.5t-31.5 -1z" />
- <glyph glyph-name="sf264"
-d="M6 236q0 -62 6.5 -106t26.5 -72.5t58.5 -41.5t103.5 -13t103.5 13t59 41.5t26.5 72.5t6 106t-6 106t-26.5 72t-59 41t-103.5 13t-103.5 -13t-58.5 -41t-26.5 -72t-6.5 -106zM164 386h75v-300h-75v300z" />
- <glyph glyph-name="sf265"
-d="M8 417v-705q6 0 17 2.5t23 7t22 9.5t13 11q6 6 16 28t21.5 47t21.5 47t16 28t28 17t47 23t47 22t28 13q8 6 21 17t25 23t20.5 22t8.5 13t1 21t2.5 42t2.5 48.5t1 38.5t-1 38t-2.5 48t-2.5 42.5t-1 21.5q-3 8 -12 19.5t-20.5 23t-23 20.5t-19.5 12q-3 0 -21.5 1t-42.5 2.5
-t-48 2.5t-38 1q-9 0 -30 -1t-45 -2.5t-45.5 -2.5t-29.5 -1zM158 342h75v-300h-75v300z" />
- <glyph glyph-name="sf259"
-d="M69 448v-450h75l3 372l109 -297l150 300v-375h143q0 15 -1.5 45t-4.5 67t-6.5 78t-6.5 77.5t-6 65.5t-5 42q0 8 -8.5 21t-20.5 25t-25 20.5t-21 8.5q-3 0 -25.5 1t-52 2.5t-60 2.5t-50.5 1q-11 0 -37.5 -1t-56 -2.5t-56 -2.5t-37.5 -1z" />
- <glyph glyph-name="sf261"
-d="M10 610v-610h135v311q3 0 11 4t16.5 8t16.5 6.5t11 0.5t5.5 -9t4 -15t2 -15.5t-1.5 -10.5q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5q1 -2 2.5 -11t2.5 -19.5t2 -19.5t3 -10q3 -3 12 -5.5t19.5 -4t20 -2t13.5 1.5v-200h135v610h-135v-270h-65q2 4 1.5 12.5t-2 18t-4 18
-t-5.5 11.5q-2 1 -11 2.5t-19.5 2.5t-19.5 2t-10 3q-3 3 -5.5 12t-4 19.5t-2 20t1.5 13.5h-55v135h-135z" />
- <glyph glyph-name="sf263"
-d="M7 457v-457h102v233q2 0 8 3t12.5 6t12.5 5t8 0t4 -6.5t3 -10.5t1 -12q0 -5 -1 -8q3 1 9 1q7 0 14 -1.5t13.5 -3.5t8.5 -4q1 -1 2 -8t2 -14.5t2 -14.5t2 -8q3 -2 9.5 -4t14 -3t15 -1.5t10.5 1.5v-150h101v457h-101v-202h-49q1 3 1 9q0 7 -1.5 14t-3.5 13.5t-4 8.5
-q-1 1 -8 2t-14.5 1.5t-14.5 1.5t-8 2q-2 3 -4 9.5t-3 14.5t-1.5 15t1.5 10h-41v101h-102z" />
- <glyph glyph-name="sf262"
-d="M7 457v-457h102v304h41v52h-41v101h-102zM259 300v-300h101v457h-101v-97q-3 1 -11 1q-7 0 -14.5 -1.5t-14 -3.5t-9.5 -4q-1 -1 -2 -8t-2 -14.5t-2 -14.5t-2 -8q-2 -2 -8.5 -4t-13.5 -3t-13.5 -1.5t-9.5 1.5v-143h49v143h53z" />
- <glyph glyph-name="sf266"
-d="M10 130v-130h135v130h130v-130h135v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-3 3 -11.5 5.5t-18 4t-18 2t-12.5 -1.5v65h65v60h65v135h-135v-130h-130v130h-135v-135h65v-60h65v-65q-4 2 -12.5 1.5t-18 -2t-18 -4t-11.5 -5.5
-q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5z" />
- <glyph glyph-name="sf267"
-d="M6 -139v-55h265v50q4 -2 13.5 -1.5t20 2t19.5 4t12 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 12 5.5t19.5 4t20 2t13.5 -1.5v135h65v405h-135v-400h-130v400h-135v-400q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -12t4 -19.5t2 -20t-1.5 -13.5h120v-70h-55v-70h-205z" />
- <glyph glyph-name="sf268"
-d="M145 4v-130h130v130q4 -2 13.5 -1.5t20 2t19.5 4t12 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-3 3 -12 5.5t-19.5 4t-20 2t-13.5 -1.5v50
-q-4 -2 -14 -2q-9 0 -19.5 1.5t-19.5 4.5t-12 6t-6 12t-4.5 19.5t-1.5 19.5q0 10 2 14h-50v135h125v-60h135v60q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-3 3 -12 5.5t-19.5 4t-20 2t-13.5 -1.5v90h-130v-90q-4 2 -13.5 1.5t-20 -2
-t-19.5 -4t-12 -5.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-130q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5q1 -2 2.5 -11t2.5 -19.5t2 -19.5t3 -10q3 -3 11.5 -5.5t18 -4t18 -2t12.5 1.5q-2 -3 -1 -10t2.5 -15t4 -15t4.5 -10t9 -5
-t15 -3.5t15.5 -2t10.5 0.5q-2 -4 -1.5 -12.5t2 -18t4 -18t5.5 -11.5t11.5 -5.5t18 -4t18 -2t12.5 1.5v-130h-125v60h-135v-60q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5q1 -2 2.5 -11t2.5 -19.5t2 -19.5t3 -10q3 -3 12 -5.5t19.5 -4t20 -2t13.5 1.5z" />
- <glyph glyph-name="sf269"
-d="M10 810v-810h260v55h-130v690h130v65h-260v0z" />
- <glyph glyph-name="sf270"
-d="M56 603v-200h130v200h-130v0zM326 603v-200h130v200h-130v0z" />
- <glyph glyph-name="acute" unicode="´"
-d="M292 589v-69h-140v69h70v140h199v-70h-70v-70h-59z" />
- <glyph glyph-name="degree" unicode="°"
-d="M146 649v-63v0h-67v0v-127v0h67v0v-63v0h271v0v63v0h63v0v127v0h-63v0v63v0h-271v0zM354 586v-127h-139v127h139z" />
- <glyph glyph-name="section" unicode="§"
-d="M148 578v-60v0h-60v0v-120v0h60v-120v0h-60v0v-120v0h60v0v-60v0h60v0v-66v0h120v-136h-120v0v68v0h-120v0v-68v0h60v0v-66v0h240v0v66v0h60v0v136v0h-60v126v0h60v0v120v0h-60v0v60v0h-60v0v60v0h-120v120v0h120v0v-60v0h120v0v60v0h-60v0v60v0h-240v0zM328 278v-120
-h-120v120h120z" />
- <glyph glyph-name="adieresis" unicode="ä"
-d="M136 440v-60v0h202v-141v0h-202v0v-60v0h-60v0v-120v0h60v0v-60v0h322v0v381v0h-60v0v60v0h-262v0zM338 179v-120h-134v120h134zM81 641v-120v0h120v0v120v0h-120v0zM321 641v-120v0h120v0v120v0h-120v0z" />
- <glyph glyph-name="Adieresis" unicode="Ä"
-d="M57 770v-129v0h134v0v129v0h-134v0zM330 770v-129v0h134v0v129v0h-134v0zM198 576v-66v0h-68v0v-69v0h-66v0v-442v0h134v0v180h139v-180v0h134v0v442v0h-66v0v69v0h-68v0v66v0h-139v0zM337 441v-202h-139v0v202h139z" />
- <glyph glyph-name="odieresis" unicode="ö"
-d="M81 641v-120v0h120v0v120v0h-120v0zM321 641v-120v0h120v0v120v0h-120v0zM141 447v-60v0h-60v0v-327v0h60v0v-60v0h240v0v60v0h60v0v327v0h-60v0v60v0h-240v0zM321 387v-327h-120v0v327h120z" />
- <glyph glyph-name="Odieresis" unicode="Ö"
-d="M119 580v-70v0h-60v0v-447v0h60v0v-60v0h279v0v60v0h60v0v447v0h-60v0v70v0h-279v0zM338 510v0v-447h-143v0v447h143zM57 770v-129v0h134v0v129v0h-134v0zM330 770v-129v0h134v0v129v0h-134v0z" />
- <glyph glyph-name="udieresis" unicode="ü"
-d="M83 435v-377v0h60v0v-60v0h300v0v437v0h-120v0v-377h-120v0v377v0h-120v0zM81 641v-120v0h120v0v120v0h-120v0zM321 641v-120v0h120v0v120v0h-120v0z" />
- <glyph glyph-name="Udieresis" unicode="Ü"
-d="M59 572v-513v0h60v0v-60v0h281v0v60v0h60v0v513v0h-120v0v-513h-149v0v513v0h-132v0zM57 770v-129v0h134v0v129v0h-134v0zM330 770v-129v0h134v0v129v0h-134v0z" />
- <glyph glyph-name="germandbls" unicode="ß"
-d="M138 576v-60v0h-60v0v-517v0h120v0v517v0h60v-204v0h60v0v-253v0h-60v0v-60v0h120v0v60v0h60v0v253v0h-60v0v204v0h-60v0v60v0h-180v0z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001" unicode="…"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001" unicode="
"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="glyph124"
-d="M267 600h133v-267h-200z" />
- <glyph glyph-name="uni0091"
-d="M266 600h132v-66h-68v-68h68v-133h-200v201h68v66z" />
- <glyph glyph-name="uni0092"
-d="M200 600h200v-199h-67v-68h-133v68h66v67h-66v132z" />
- <glyph glyph-name="exclamdown" unicode="¡"
-d="M200 400h133v-133h-133v133zM200 200h132v-133h68v-200h-67v-67h-133v67h-67v200h67v133z" />
- <glyph glyph-name="cent" unicode="¢"
-d="M200 600h133v-133h66v-67h67v-67h-133v67h-133v-267h132v67h133v-66h-65v-66h-67v-135h-133v135h-67v65h-66v267h65v68h68v132z" />
- <glyph glyph-name="sterling" unicode="£"
-d="M0 133h67v135h-67v65h67v200h66v67h267v-66h66v-67h-133v66h-133v-200h200v-65h-201v-134h-66v-67h334v-67h-467v133z" />
- <glyph glyph-name="currency" unicode="¤"
-d="M200 400v-133h133v133h-133zM67 533h132v-66h134v66h134v-66h-67v-67h66v-133h-67v-66h68v-68h-134v68h-133v-68h-133v67h66v67h-66v133h66v67h-66v66z" />
- <glyph glyph-name="yen" unicode="¥"
-d="M67 600h132v-199h134v199h133v-199h-66v-68h66v-66h-133v-67h132v-67h-132v-133h-133v133h-133v67h133v67h-133v66h65v68h-65v199z" />
- <glyph glyph-name="brokenbar" unicode="¦"
-d="M200 133h133v-333h-133v333zM200 600h133v-333h-133v333z" />
- <glyph glyph-name="dieresis" unicode="¨"
-d="M67 667h133v-134h-133v134zM333 667h134v-134h-134v134z" />
- <glyph glyph-name="uni00AD" unicode="­"
-d="M466 268h-400v65h400v-65z" />
- <glyph glyph-name="macron" unicode="¯"
-d="M0 800h532v-66h-532v66z" />
- <glyph glyph-name="periodcentered" unicode="·"
-d="M200 400h200v-133h-200v133z" />
- <glyph glyph-name="logicalnot" unicode="¬"
-d="M467 333v-200h-135v134h-265v66h400z" />
- <glyph glyph-name="uni00B2" unicode="²"
-d="M133 600h200v-67h67v-66h-68v-66h-65v-68h133v-66h-267v133h67v67h67v66h-134v67z" />
- <glyph glyph-name="plusminus" unicode="±"
-d="M466 68v-68h-399v68h399zM200 467h133v-134h133v-66h-133v-134h-133v134h-133v66h133v134z" />
- <glyph glyph-name="uni00B3" unicode="³"
-d="M133 600h200v-67h67v-65h-67v-67h66v-67h-66v-67h-200v66h134v68h-67v66h67v66h-134v67z" />
- <glyph glyph-name="divide" unicode="÷"
-d="M200 200h133v-133h-133v133zM200 533h133v-133h-133v133zM465 333v-66h-398v66h398z" />
- <glyph glyph-name="edieresis" unicode="ë"
-d="M67 667h133v-134h-133v134zM200 400v-133h133v133h-133zM133 467h266v-67h68v-200h-267v-133h199v-66h-266v66h-66v334h66v66zM333 667h134v-134h-134v134z" />
- <glyph glyph-name="copyright" unicode="©"
-d="M200 467h132v-67h68v-67h-67v68h-133v-201h-67v200h67v67zM67 468v-334h66v-66h267v66h67v335h-67v65h-268v-66h-65zM0 533h66v67h399v-67h68v-466h-67v-67h-399v67h-67v466zM200 200h133v67h67v-66h-68v-67h-132v66z" />
- <glyph glyph-name="ordfeminine" unicode="ª"
-d="M200 400v-67h133v67h-133zM467 200v-67h-400v67h400zM134 601h266v-68h67v-266h-335v66h-65v67h65v67h201v66h-199v68z" />
- <glyph glyph-name="guillemotleft" unicode="«"
-d="M266 334v-66h-68v-66h-66v-68h66v-67h68v-66h-133v67h-67v66h-67v66h67v67h66v67h134zM400 334h133v-65h-67v-67h-66v-68h64v-66h69v-68h-133v67h-68v67h-65v66h66v66h67v68z" />
- <glyph glyph-name="registered" unicode="®"
-d="M67 467v-333h66v-66h267v66h66v333h-66v66h-267v-66h-66zM132 133v334h200v-67h68v-133h-67v133h-133v-132h132v-68h67v-66h-67v67h-133v-68h-67zM0 533h67v67h398v-67h68v-466h-67v-67h-400v67h-66v466z" />
- <glyph glyph-name="egrave" unicode="è"
-d="M200 400v-133h133v133h-133zM333 600v-67h-134v67h-66v67h-66v67h199v-134h67zM133 467h267v-67h66v-200h-266v-133h199v-68h-266v68h-66v333h66v67z" />
- <glyph glyph-name="eacute" unicode="é"
-d="M200 400v-133h133v133h-133zM133 467h267v-67h67v-200h-267v-133h199v-68h-266v68h-66v334h66v66zM267 733h198v-65h-65v-67h-67v-68h-133v67h67v133z" />
- <glyph glyph-name="ecircumflex" unicode="ê"
-d="M200 400v-133h133v133h-133zM133 467h267v-67h67v-200h-267v-133h199v-66h-266v66h-66v334h66v66zM200 733h132v-66h68v-66h66v-67h-134v66h-132v-67h-133v68h66v66h67v66z" />
- <glyph glyph-name="Agrave" unicode="À"
-d="M59 470v-470h135v200h130v-200h135v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-2 1 -11 2.5t-19.5 2.5t-19.5 2t-10 3q-3 3 -5.5 11.5t-4 18t-2 18t1.5 12.5h-120q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5q-2 -2 -11 -3
-t-19.5 -2t-19.5 -2.5t-10 -2.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5zM199 470h120v-190h-120v190zM129 803h133v-67h66v-67h-133v67h-66v67z" />
- <glyph glyph-name="Aacute" unicode="Á"
-d="M59 470v-470h135v200h130v-200h135v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-2 1 -11 2.5t-19.5 2.5t-19.5 2t-10 3q-3 3 -5.5 11.5t-4 18t-2 18t1.5 12.5h-120q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5q-2 -2 -11 -3
-t-19.5 -2t-19.5 -2.5t-10 -2.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5zM199 470h120v-190h-120v190zM263 737v66h134v-65h-68v-68h-131v67h65z" />
- <glyph glyph-name="Acircumflex" unicode="Â"
-d="M59 470v-470h135v200h130v-200h135v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-2 1 -11 2.5t-19.5 2.5t-19.5 2t-10 3q-3 3 -5.5 11.5t-4 18t-2 18t1.5 12.5h-120q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5q-2 -2 -11 -3
-t-19.5 -2t-19.5 -2.5t-10 -2.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5zM199 470h120v-190h-120v190zM130 803h267v-66h67v-68h-134v67h-133v-66h-133v66h66v67z" />
- <glyph glyph-name="Atilde" unicode="Ã"
-d="M59 470v-470h135v200h130v-200h135v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-2 1 -11 2.5t-19.5 2.5t-19.5 2t-10 3q-3 3 -5.5 11.5t-4 18t-2 18t1.5 12.5h-120q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5q-2 -2 -11 -3
-t-19.5 -2t-19.5 -2.5t-10 -2.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5zM199 470h120v-190h-120v190zM129 803h200v-66h67v66h132v-67h-67v-65h-198v65h-67v-65h-133v65h66v67z" />
- <glyph glyph-name="Aring" unicode="Å"
-d="M59 470v-470h135v200h130v-200h135v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-2 1 -11 2.5t-19.5 2.5t-19.5 2t-10 3q-3 3 -5.5 11.5t-4 18t-2 18t75.5 6.5v71h66v63h-65v66h-265v-65h-68v-64h65v-69q75 0 74.5 -8.5t-2 -18
-t-4 -18t-5.5 -11.5q-2 -2 -11 -3t-19.5 -2t-19.5 -2.5t-10 -2.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5zM199 470h120v-190h-120v190zM194 739h133v-66h-133v66z" />
- <glyph glyph-name="Egrave" unicode="È"
-d="M59 610v-610h400v65h-260v210h190v60h-190v210h260v65h-400v0zM127 805h131v-64h67v-63h-134v62h-64v65z" />
- <glyph glyph-name="Eacute" unicode="É"
-d="M59 610v-610h400v65h-260v210h190v60h-190v210h260v65h-400v0zM260 803h132v-66h-66v-66h-133v66h67v66z" />
- <glyph glyph-name="Ecircumflex" unicode="Ê"
-d="M59 610v-610h400v65h-260v210h190v60h-190v210h260v65h-400v0zM129 806h265v-66h67v-66h-132v65h-134v-66h-133v67h67v66z" />
- <glyph glyph-name="Edieresis" unicode="Ë"
-d="M59 610v-610h400v65h-260v210h190v60h-190v210h260v65h-400v0zM62 807h132v-133h-132v133zM326 806h132v-133h-132v133z" />
- <glyph glyph-name="Igrave" unicode="Ì"
-d="M124 65v-65h260v65h-60v480h60v65h-260v-65h60v-480h-60v0zM127 806h133v-67h66v-65h-133v66h-66v66z" />
- <glyph glyph-name="Iacute" unicode="Í"
-d="M124 65v-65h260v65h-60v480h60v65h-260v-65h60v-480h-60v0zM261 805h132v-67h-66v-66h-133v65h67v68z" />
- <glyph glyph-name="Icircumflex" unicode="Î"
-d="M124 65v-65h260v65h-60v480h60v65h-260v-65h60v-480h-60v0zM124 809h266v-66h67v-66h-133v66h-134v-66h-132v65h66v67z" />
- <glyph glyph-name="Idieresis" unicode="Ï"
-d="M124 65v-65h260v65h-60v480h60v65h-260v-65h60v-480h-60v0zM55 813h133v-131h-133v131zM322 812h132v-132h-132v132z" />
- <glyph glyph-name="Ograve" unicode="Ò"
-d="M75 69q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18
-t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-470zM215 539h120v-470h-120v470zM142 808h133v-66h67v-68h-133v68h-67v66z" />
- <glyph glyph-name="Oacute" unicode="Ó"
-d="M75 69q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18
-t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-470zM215 539h120v-470h-120v470zM276 806h132v-66h-66v-66h-133v65h67v67z" />
- <glyph glyph-name="Ocircumflex" unicode="Ô"
-d="M75 69q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18
-t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-470zM215 539h120v-470h-120v470zM141 808h266v-68h66v-65h-132v67h-133v-66h-133v65h66v67z" />
- <glyph glyph-name="Otilde" unicode="Õ"
-d="M75 69q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18
-t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-470zM215 539h120v-470h-120v470zM138 807h200v-66h67v66h132v-66h-66v-66h-199v65h-67v-65h-133v65h66v67z" />
- <glyph glyph-name="Ugrave" unicode="Ù"
-d="M56 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v540h-135v-540h-130v540h-135v-540zM124 809h133v-65h65v-67h-131v67h-67v65z" />
- <glyph glyph-name="Uacute" unicode="Ú"
-d="M56 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v540h-135v-540h-130v540h-135v-540zM259 809h133v-66h-68v-66h-132v66h67v66z" />
- <glyph glyph-name="Ucircumflex" unicode="Û"
-d="M56 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v540h-135v-540h-130v540h-135v-540zM124 809h268v-66h65v-65h-132v65h-132v-66h-134v66h65v66z" />
- <glyph glyph-name="ograve" unicode="ò"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v330q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18
-t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-330zM199 400h120v-330h-120v330zM59 742h200v-133h66v-67h-132v67h-68v67h-66v66z" />
- <glyph glyph-name="oacute" unicode="ó"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v330q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18
-t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-330zM199 400h120v-330h-120v330zM254 741h199v-66h-65v-67h-67v-67h-133v66h66v134z" />
- <glyph glyph-name="ocircumflex" unicode="ô"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v330q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18
-t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-330zM199 400h120v-330h-120v330zM192 737h133v-66h67v-68h65v-66h-132v67h-134v-68h-132v67h65v67h68v67z" />
- <glyph glyph-name="otilde" unicode="õ"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v330q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18
-t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-330zM199 400h120v-330h-120v330zM0 672h67v65h199v-66h66v-67h68v68h65v65h67v-132h-67l1 -67h-199v67h-67v67h-68v-68h-66v-66h-66v134z" />
- <glyph glyph-name="ugrave" unicode="ù"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v470h-135v-400h-130v400h-135v-400zM58 738h199v-132h67v-68h-133v68h-67v67h-66v65z" />
- <glyph glyph-name="uacute" unicode="ú"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v470h-135v-400h-130v400h-135v-400zM259 737h199v-66h-66v-66h-67v-67h-133v66h67v133z" />
- <glyph glyph-name="ucircumflex" unicode="û"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v470h-135v-400h-130v400h-135v-400zM193 736h132v-65h67v-67h66v-67h-133v67h-133v-68h-132v67h66v67h67v66z" />
- <glyph glyph-name="Ntilde" unicode="Ñ"
-d="M63 610v-610h135v311q3 0 11 4t16.5 8t16.5 6.5t11 0.5t5.5 -9t4 -15t2 -15.5t-1.5 -10.5q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5q1 -2 2.5 -11t2.5 -19.5t2 -19.5t3 -10q3 -3 12 -5.5t19.5 -4t20 -2t13.5 1.5v-200h135v610h-135v-270h-65q2 4 1.5 12.5t-2 18t-4 18
-t-5.5 11.5q-2 1 -11 2.5t-19.5 2.5t-19.5 2t-10 3q-3 3 -5.5 12t-4 19.5t-2 20t1.5 13.5h-55v135h-135zM132 800h201v-66h66l1 66h132v-66h-66v-66h-199v66h-68v-66h-134v66h67v66z" />
- <glyph glyph-name="Eth" unicode="Ð"
-d="M55 611v-271h-55v-64h54v-276h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5q1 1 10 2.5t19.5 2.5t19.5 2t11 3q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v330q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11
-q-2 1 -11 2.5t-19.5 2.5t-19.5 2t-10 3q-3 3 -5.5 11.5t-4 18t-2 18t1.5 12.5zM194 540h50q-2 -4 -1.5 -12.5t2 -18t4 -18t5.5 -11.5t11.5 -5.5t18 -4t18 -2t12.5 1.5v-330q-4 2 -12.5 1.5t-18 -2t-18 -4t-11.5 -5.5t-5.5 -11.5t-4 -18t-2 -18t1.5 -12.5h-50v205h67v65h-67
-v200z" />
- <glyph glyph-name="Yacute" unicode="Ý"
-d="M189 275v-275h130v275h70v60h65v275h-135v-270h-130v270h-135v-275h65v-60h70v0zM189 743h68v67h132v-66h-66v-66h-134v65z" />
- <glyph glyph-name="agrave" unicode="à"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v400q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260v-65h190v-130h-190q2 -4 1.5 -13.5t-2 -20t-4 -19.5t-5.5 -12t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5
-v-130zM199 200h120v-130h-120v130zM63 737h198v-133h66v-67h-133v67h-66v68h-65v65z" />
- <glyph glyph-name="aacute" unicode="á"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v400q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260v-65h190v-130h-190q2 -4 1.5 -13.5t-2 -20t-4 -19.5t-5.5 -12t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5
-v-130zM199 200h120v-130h-120v130zM459 739l1 -65h-67v-67h-66v-68h-133v67h67v133h198z" />
- <glyph glyph-name="acircumflex" unicode="â"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v400q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260v-65h190v-130h-190q2 -4 1.5 -13.5t-2 -20t-4 -19.5t-5.5 -12t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5
-v-130zM199 200h120v-130h-120v130zM461 606v-68h-133v68h-134v-67h-133v66h67v67h66v66h133v-66h67v-66h67z" />
- <glyph glyph-name="atilde" unicode="ã"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v400q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260v-65h190v-130h-190q2 -4 1.5 -13.5t-2 -20t-4 -19.5t-5.5 -12t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5
-v-130zM199 200h120v-130h-120v130zM532 736v-132h-67v-68h-198v67h-67v67h-68v-66h-66v-67h-66v133h67v67h200v-67h66v-67h66v67h66v66h67z" />
- <glyph glyph-name="aring" unicode="å"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v400q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260v-65h190v-130h-190q2 -4 1.5 -13.5t-2 -20t-4 -19.5t-5.5 -12t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5
-v-130zM199 200h120v-130h-120v130zM459 674h-67v66h-266v-66h-66v-67h65v-67h268v68h66v66zM194 672h133v-67h-132z" />
- <glyph glyph-name="igrave" unicode="ì"
-d="M59 65v-65h400v65h-135v405h-265v-65h130v-340h-130v0zM194 537h133v67h-67v133h-200v-65h67v-67h67v-68z" />
- <glyph glyph-name="iacute" unicode="í"
-d="M59 65v-65h400v65h-135v405h-265v-65h130v-340h-130v0zM109 577zM257 606h-66v-67h132v67h67v67h67v65h-200v-132z" />
- <glyph glyph-name="icircumflex" unicode="î"
-d="M59 65v-65h400v65h-135v405h-265v-65h130v-340h-130v0zM192 737v-66h-67v-67h-66v-67h133v68h133v-67h134v66h-66v67h-67v66h-134v0z" />
- <glyph glyph-name="idieresis" unicode="ï"
-d="M59 65v-65h400v65h-135v405h-265v-65h130v-340h-130v0zM323 672v-135h134v135h-134v0zM58 672v-135h134v135h-134v0z" />
- <glyph glyph-name="ntilde" unicode="ñ"
-d="M59 470v-470h135v400h130v-400h135v400l-65 7v63h-335v0zM533 736v-133h-67v-68h-199v67h-67v67h-68v-66h-66v-68h-67v134h67v67h200v-66h66v-67h68v66h66v67h67z" />
- <glyph glyph-name="yacute" unicode="ý"
-d="M6 -139v-55h265v50q4 -2 13.5 -1.5t20 2t19.5 4t12 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 12 5.5t19.5 4t20 2t13.5 -1.5v135h65v405h-135v-400h-130v400h-135v-400q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -12t4 -19.5t2 -20t-1.5 -13.5h120v-70h-55v-70h-205z
-M272 744h200v-66h-66v-67h-67v-68h-133v67h67z" />
- <glyph glyph-name="ydieresis" unicode="ÿ"
-d="M6 -139v-55h265v50q4 -2 13.5 -1.5t20 2t19.5 4t12 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 12 5.5t19.5 4t20 2t13.5 -1.5v135h65v405h-135v-400h-130v400h-135v-400q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -12t4 -19.5t2 -20t-1.5 -13.5h120v-70h-55v-70h-205z
-M207 674v-134h-133v134h133zM476 674v-134h-134v134h134z" />
- <glyph glyph-name="oslash" unicode="ø"
-d="M200 133v-66h133v133h-66v-67h-67zM200 400v-133h66v66h67v67h-133zM133 467h333v-400h-66v-67h-333v400h66v67z" />
- <glyph glyph-name="cedilla" unicode="¸"
-d="M200 0h132v-67h68v-65h-67v-68h-200v67h134v66h-67v67z" />
- <glyph glyph-name="uni00B9" unicode="¹"
-d="M200 600h133v-333h-133v200h-67v67h67v66z" />
- <glyph glyph-name="ordmasculine" unicode="º"
-d="M135 600v-66h-66v-201h65v-66h268v66h66v200h-66v67h-267zM466 200v-67h-399v67h399zM200 333v200h133v-200h-133z" />
- <glyph glyph-name="paragraph" unicode="¶"
-d="M533 600v-67h-67v-733h-133v333h-133v67h-67v67h-66v200h66v66h67v67h333z" />
- <glyph glyph-name="mu" unicode="µ"
-d="M199 467v-400h134v400h132v-400h68v-67h-133v68h-67v-68h-133v-132h-67v-68h-133v67h67v600h132z" />
- <glyph glyph-name="Thorn" unicode="Þ"
-d="M200 200h133v200h-133v-200zM67 600h133v-132h199v-68h66v-199h-66v-67h-199v-134h-133v600z" />
- <glyph glyph-name="thorn" unicode="þ"
-d="M200 68h133v266h-133v-266zM67 600h133v-199h199v-68h66v-266h-65v-67h-200v-200h-133v800z" />
- <glyph glyph-name="guillemotright" unicode="»"
-d="M266 334v-66h68v-66h66v-68h-66v-67h-68v-66h133v67h67v66h67v66h-67v67h-66v67h-134zM132 334h-133v-65h67v-67h66v-68h-64v-66h-69v-68h133v67h68v67h65v66h-66v66h-67v68z" />
- <glyph glyph-name="Ccedilla" unicode="Ç"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h64v-66h72v-65h-137v-68h204v68h66v64h-67v67h58q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v130h-135v-130h-125v470h125v-130h135v130q-4 -2 -12.5 -1.5t-18 2
-t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-470z" />
- <glyph glyph-name="Oslash" unicode="Ø"
-d="M200 133v-66h133v201h-66v-135h-67zM199 533v-200h67v134h66v66h-133zM133 600l333 1v-534h-66v-67h-333v534h66v66z" />
- <glyph glyph-name="multiply" unicode="×"
-d="M67 200v-132h65v65h68v68h133v-67h66v-66h66v132h-66v67h-67v67h68v66h66v134h-66v-67h-67v-67h-134v68h-67v66h-65v-133h66v-67h66v-67h-67v-67h-65z" />
- <glyph glyph-name="questiondown" unicode="¿"
-d="M328 270v130h-120v-130h120zM329 72v125h-125v-120q-4 2 -13.5 1.5t-20 -2t-19.5 -4t-12 -5.5q-1 -1 -2.5 -10t-2.5 -19.5t-2 -19.5t-3 -11q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-130q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260
-q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v130h-135v-130h-125v130q4 -2 12.5 -1.5t18 2t18 4t11.5 5.5t5.5 12t4 19.5t2 20t-1.5 13.5h50z" />
- <glyph glyph-name="ccedilla" unicode="ç"
-d="M56 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h67v-64h68v-63h-130v-69h198v69h66v62h-66v67h56q-1 2 -0.5 10.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v60h-135v-60h-125v330h125v-60h135v60q-4 -2 -12.5 -1.5t-18 2t-18 4
-t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-330z" />
- <glyph glyph-name="eth" unicode="ð"
-d="M200 334h133v-267h-133v267zM332 600v-67h-66v67h-133v-67h67v-66h-133v-67h133v-67h-133v-266h66v-67h267v68h65v333h-65v66h-68v67h133v66h-133zM200 400h67v67h-67v-67z" />
- <glyph glyph-name="ae" unicode="æ"
-d="M533 401v-200h-200v-133h199v-68h-199v68h-66v-68h-200v68h-67v133h66v67h134v133h-133v67h132v-67h67v67h199v-67h68zM333 267h67v133h-67v-133zM133 67h67v133h-67v-133z" />
- <glyph glyph-name="AE" unicode="Æ"
-d="M267 600h266v-67h-133v-199h132v-66h-132v-201h132v-67h-265v201h-68v-201h-132v400h65v67h67v66h68v67zM200 267h67v133h-67v-133z" />
- <glyph glyph-name="onequarter" unicode="¼"
-d="M67 667h132v-334h68v68h66v66h66v66h134v-65h-68v-67h-66v-67h-66v-67h200v-334h-133v67h-200v133h-68v-66h-132v66h66v67h67v67h67v66h-134v200h-66v68h67v66zM333 67h67v66h-67v-66zM267 200h66v67h-66v-67zM200 133h67v67h-67v-67z" />
- <glyph glyph-name="onehalf" unicode="½"
-d="M67 667h132v-334h68v68h66v66h66v66h134v-65h-68v-67h-66v-67h-66v-67h132v-66h67v-67h-67v-66h-65v-68h133v-67h-267v135h66v66h67v67h-199v-68h-68v-66h-132v66h66v67h67v67h67v66h-134v200h-66v68h67v66z" />
- <glyph glyph-name="threequarters" unicode="¾"
-d="M0 667h199v-67h67v-66h-67v-67h67v-66h-67v-68h68v68h66v66h66v66h134v-65h-68v-67h-66v-67h-66v-67h199v-334h-132v66h-200v135h67v66h66v67h-67v-66h-66v-68h-68v-66h-132v66h66v67h67v67h67v66h-200v68h132v67h-66v65h67v68h-133v66zM333 67h67v66h-67v-66z" />
- <glyph glyph-name="Euro" unicode="€"
-d="M125 625h311v-61h63v-64h-124v63h-188v-162h188v-57l-189 -1v-63h126v-64h-126v-153h188v62h125v-61h-62v-64h-313v64h-61v154h-63v63h63v63h-63v56h62v163h63v62z" />
- </font>
-</defs></svg>
diff --git a/web/static/css/fonts/Fixedsys500c.ttf b/web/static/css/fonts/Fixedsys500c.ttf
Binary files differ.
diff --git a/web/static/css/fonts/Fixedsys500c.woff b/web/static/css/fonts/Fixedsys500c.woff
Binary files differ.
diff --git a/web/static/css/fonts/Px437_IBM_EGA8.otf b/web/static/css/fonts/Px437_IBM_EGA8.otf
Binary files differ.
diff --git a/web/static/img/moncheeta.png b/web/static/img/moncheeta.png
Binary files differ.
diff --git a/web/static/js/bootstrap.js b/web/static/js/bootstrap.js
@@ -1,2425 +0,0 @@
-/* ===================================================
- * bootstrap-transition.js v2.3.1
- * http://twitter.github.com/bootstrap/javascript.html#transitions
- * ===================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
-
-!(function ($) {
- "use strict"; // jshint ;_;
-
- /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
- * ======================================================= */
-
- $(function () {
- $.support.transition = (function () {
- var transitionEnd = (function () {
- var el = document.createElement("bootstrap"),
- transEndEventNames = {
- WebkitTransition: "webkitTransitionEnd",
- MozTransition: "transitionend",
- OTransition: "oTransitionEnd otransitionend",
- transition: "transitionend",
- },
- name;
-
- for (name in transEndEventNames) {
- if (el.style[name] !== undefined) {
- return transEndEventNames[name];
- }
- }
- })();
-
- return (
- transitionEnd && {
- end: transitionEnd,
- }
- );
- })();
- });
-})(window.jQuery); /* ==========================================================
- * bootstrap-alert.js v2.3.1
- * http://twitter.github.com/bootstrap/javascript.html#alerts
- * ==========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
-
-!(function ($) {
- "use strict"; // jshint ;_;
-
- /* ALERT CLASS DEFINITION
- * ====================== */
-
- var dismiss = '[data-dismiss="alert"]',
- Alert = function (el) {
- $(el).on("click", dismiss, this.close);
- };
-
- Alert.prototype.close = function (e) {
- var $this = $(this),
- selector = $this.attr("data-target"),
- $parent;
-
- if (!selector) {
- selector = $this.attr("href");
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, ""); //strip for ie7
- }
-
- $parent = $(selector);
-
- e && e.preventDefault();
-
- $parent.length ||
- ($parent = $this.hasClass("alert") ? $this : $this.parent());
-
- $parent.trigger((e = $.Event("close")));
-
- if (e.isDefaultPrevented()) return;
-
- $parent.removeClass("in");
-
- function removeElement() {
- $parent.trigger("closed").remove();
- }
-
- $.support.transition && $parent.hasClass("fade")
- ? $parent.on($.support.transition.end, removeElement)
- : removeElement();
- };
-
- /* ALERT PLUGIN DEFINITION
- * ======================= */
-
- var old = $.fn.alert;
-
- $.fn.alert = function (option) {
- return this.each(function () {
- var $this = $(this),
- data = $this.data("alert");
- if (!data) $this.data("alert", (data = new Alert(this)));
- if (typeof option == "string") data[option].call($this);
- });
- };
-
- $.fn.alert.Constructor = Alert;
-
- /* ALERT NO CONFLICT
- * ================= */
-
- $.fn.alert.noConflict = function () {
- $.fn.alert = old;
- return this;
- };
-
- /* ALERT DATA-API
- * ============== */
-
- $(document).on("click.alert.data-api", dismiss, Alert.prototype.close);
-})(
- window.jQuery,
-); /* ============================================================
- * bootstrap-button.js v2.3.1
- * http://twitter.github.com/bootstrap/javascript.html#buttons
- * ============================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================ */
-
-!(function ($) {
- "use strict"; // jshint ;_;
-
- /* BUTTON PUBLIC CLASS DEFINITION
- * ============================== */
-
- var Button = function (element, options) {
- this.$element = $(element);
- this.options = $.extend({}, $.fn.button.defaults, options);
- };
-
- Button.prototype.setState = function (state) {
- var d = "disabled",
- $el = this.$element,
- data = $el.data(),
- val = $el.is("input") ? "val" : "html";
-
- state = state + "Text";
- data.resetText || $el.data("resetText", $el[val]());
-
- $el[val](data[state] || this.options[state]);
-
- // push to event loop to allow forms to submit
- setTimeout(function () {
- state == "loadingText"
- ? $el.addClass(d).attr(d, d)
- : $el.removeClass(d).removeAttr(d);
- }, 0);
- };
-
- Button.prototype.toggle = function () {
- var $parent = this.$element.closest('[data-toggle="buttons-radio"]');
-
- $parent && $parent.find(".active").removeClass("active");
-
- this.$element.toggleClass("active");
- };
-
- /* BUTTON PLUGIN DEFINITION
- * ======================== */
-
- var old = $.fn.button;
-
- $.fn.button = function (option) {
- return this.each(function () {
- var $this = $(this),
- data = $this.data("button"),
- options = typeof option == "object" && option;
- if (!data) $this.data("button", (data = new Button(this, options)));
- if (option == "toggle") data.toggle();
- else if (option) data.setState(option);
- });
- };
-
- $.fn.button.defaults = {
- loadingText: "loading...",
- };
-
- $.fn.button.Constructor = Button;
-
- /* BUTTON NO CONFLICT
- * ================== */
-
- $.fn.button.noConflict = function () {
- $.fn.button = old;
- return this;
- };
-
- /* BUTTON DATA-API
- * =============== */
-
- $(document).on(
- "click.button.data-api",
- "[data-toggle^=button]",
- function (e) {
- var $btn = $(e.target);
- if (!$btn.hasClass("btn")) $btn = $btn.closest(".btn");
- $btn.button("toggle");
- },
- );
-})(window.jQuery); /* ==========================================================
- * bootstrap-carousel.js v2.3.1
- * http://twitter.github.com/bootstrap/javascript.html#carousel
- * ==========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
-
-!(function ($) {
- "use strict"; // jshint ;_;
-
- /* CAROUSEL CLASS DEFINITION
- * ========================= */
-
- var Carousel = function (element, options) {
- this.$element = $(element);
- this.$indicators = this.$element.find(".carousel-indicators");
- this.options = options;
- this.options.pause == "hover" &&
- this.$element
- .on("mouseenter", $.proxy(this.pause, this))
- .on("mouseleave", $.proxy(this.cycle, this));
- };
-
- Carousel.prototype = {
- cycle: function (e) {
- if (!e) this.paused = false;
- if (this.interval) clearInterval(this.interval);
- this.options.interval &&
- !this.paused &&
- (this.interval = setInterval(
- $.proxy(this.next, this),
- this.options.interval,
- ));
- return this;
- },
-
- getActiveIndex: function () {
- this.$active = this.$element.find(".item.active");
- this.$items = this.$active.parent().children();
- return this.$items.index(this.$active);
- },
-
- to: function (pos) {
- var activeIndex = this.getActiveIndex(),
- that = this;
-
- if (pos > this.$items.length - 1 || pos < 0) return;
-
- if (this.sliding) {
- return this.$element.one("slid", function () {
- that.to(pos);
- });
- }
-
- if (activeIndex == pos) {
- return this.pause().cycle();
- }
-
- return this.slide(
- pos > activeIndex ? "next" : "prev",
- $(this.$items[pos]),
- );
- },
-
- pause: function (e) {
- if (!e) this.paused = true;
- if (
- this.$element.find(".next, .prev").length &&
- $.support.transition.end
- ) {
- this.$element.trigger($.support.transition.end);
- this.cycle(true);
- }
- clearInterval(this.interval);
- this.interval = null;
- return this;
- },
-
- next: function () {
- if (this.sliding) return;
- return this.slide("next");
- },
-
- prev: function () {
- if (this.sliding) return;
- return this.slide("prev");
- },
-
- slide: function (type, next) {
- var $active = this.$element.find(".item.active"),
- $next = next || $active[type](),
- isCycling = this.interval,
- direction = type == "next" ? "left" : "right",
- fallback = type == "next" ? "first" : "last",
- that = this,
- e;
-
- this.sliding = true;
-
- isCycling && this.pause();
-
- $next = $next.length ? $next : this.$element.find(".item")[fallback]();
-
- e = $.Event("slide", {
- relatedTarget: $next[0],
- direction: direction,
- });
-
- if ($next.hasClass("active")) return;
-
- if (this.$indicators.length) {
- this.$indicators.find(".active").removeClass("active");
- this.$element.one("slid", function () {
- var $nextIndicator = $(
- that.$indicators.children()[that.getActiveIndex()],
- );
- $nextIndicator && $nextIndicator.addClass("active");
- });
- }
-
- if ($.support.transition && this.$element.hasClass("slide")) {
- this.$element.trigger(e);
- if (e.isDefaultPrevented()) return;
- $next.addClass(type);
- $next[0].offsetWidth; // force reflow
- $active.addClass(direction);
- $next.addClass(direction);
- this.$element.one($.support.transition.end, function () {
- $next.removeClass([type, direction].join(" ")).addClass("active");
- $active.removeClass(["active", direction].join(" "));
- that.sliding = false;
- setTimeout(function () {
- that.$element.trigger("slid");
- }, 0);
- });
- } else {
- this.$element.trigger(e);
- if (e.isDefaultPrevented()) return;
- $active.removeClass("active");
- $next.addClass("active");
- this.sliding = false;
- this.$element.trigger("slid");
- }
-
- isCycling && this.cycle();
-
- return this;
- },
- };
-
- /* CAROUSEL PLUGIN DEFINITION
- * ========================== */
-
- var old = $.fn.carousel;
-
- $.fn.carousel = function (option) {
- return this.each(function () {
- var $this = $(this),
- data = $this.data("carousel"),
- options = $.extend(
- {},
- $.fn.carousel.defaults,
- typeof option == "object" && option,
- ),
- action = typeof option == "string" ? option : options.slide;
- if (!data) $this.data("carousel", (data = new Carousel(this, options)));
- if (typeof option == "number") data.to(option);
- else if (action) data[action]();
- else if (options.interval) data.pause().cycle();
- });
- };
-
- $.fn.carousel.defaults = {
- interval: 5000,
- pause: "hover",
- };
-
- $.fn.carousel.Constructor = Carousel;
-
- /* CAROUSEL NO CONFLICT
- * ==================== */
-
- $.fn.carousel.noConflict = function () {
- $.fn.carousel = old;
- return this;
- };
-
- /* CAROUSEL DATA-API
- * ================= */
-
- $(document).on(
- "click.carousel.data-api",
- "[data-slide], [data-slide-to]",
- function (e) {
- var $this = $(this),
- href,
- $target = $(
- $this.attr("data-target") ||
- ((href = $this.attr("href")) && href.replace(/.*(?=#[^\s]+$)/, "")),
- ), //strip for ie7
- options = $.extend({}, $target.data(), $this.data()),
- slideIndex;
-
- $target.carousel(options);
-
- if ((slideIndex = $this.attr("data-slide-to"))) {
- $target.data("carousel").pause().to(slideIndex).cycle();
- }
-
- e.preventDefault();
- },
- );
-})(
- window.jQuery,
-); /* =============================================================
- * bootstrap-collapse.js v2.3.1
- * http://twitter.github.com/bootstrap/javascript.html#collapse
- * =============================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================ */
-
-!(function ($) {
- "use strict"; // jshint ;_;
-
- /* COLLAPSE PUBLIC CLASS DEFINITION
- * ================================ */
-
- var Collapse = function (element, options) {
- this.$element = $(element);
- this.options = $.extend({}, $.fn.collapse.defaults, options);
-
- if (this.options.parent) {
- this.$parent = $(this.options.parent);
- }
-
- this.options.toggle && this.toggle();
- };
-
- Collapse.prototype = {
- constructor: Collapse,
-
- dimension: function () {
- var hasWidth = this.$element.hasClass("width");
- return hasWidth ? "width" : "height";
- },
-
- show: function () {
- var dimension, scroll, actives, hasData;
-
- if (this.transitioning || this.$element.hasClass("in")) return;
-
- dimension = this.dimension();
- scroll = $.camelCase(["scroll", dimension].join("-"));
- actives = this.$parent && this.$parent.find("> .accordion-group > .in");
-
- if (actives && actives.length) {
- hasData = actives.data("collapse");
- if (hasData && hasData.transitioning) return;
- actives.collapse("hide");
- hasData || actives.data("collapse", null);
- }
-
- this.$element[dimension](0);
- this.transition("addClass", $.Event("show"), "shown");
- $.support.transition &&
- this.$element[dimension](this.$element[0][scroll]);
- },
-
- hide: function () {
- var dimension;
- if (this.transitioning || !this.$element.hasClass("in")) return;
- dimension = this.dimension();
- this.reset(this.$element[dimension]());
- this.transition("removeClass", $.Event("hide"), "hidden");
- this.$element[dimension](0);
- },
-
- reset: function (size) {
- var dimension = this.dimension();
-
- this.$element.removeClass("collapse")[dimension](size || "auto")[0]
- .offsetWidth;
-
- this.$element[size !== null ? "addClass" : "removeClass"]("collapse");
-
- return this;
- },
-
- transition: function (method, startEvent, completeEvent) {
- var that = this,
- complete = function () {
- if (startEvent.type == "show") that.reset();
- that.transitioning = 0;
- that.$element.trigger(completeEvent);
- };
-
- this.$element.trigger(startEvent);
-
- if (startEvent.isDefaultPrevented()) return;
-
- this.transitioning = 1;
-
- this.$element[method]("in");
-
- $.support.transition && this.$element.hasClass("collapse")
- ? this.$element.one($.support.transition.end, complete)
- : complete();
- },
-
- toggle: function () {
- this[this.$element.hasClass("in") ? "hide" : "show"]();
- },
- };
-
- /* COLLAPSE PLUGIN DEFINITION
- * ========================== */
-
- var old = $.fn.collapse;
-
- $.fn.collapse = function (option) {
- return this.each(function () {
- var $this = $(this),
- data = $this.data("collapse"),
- options = $.extend(
- {},
- $.fn.collapse.defaults,
- $this.data(),
- typeof option == "object" && option,
- );
- if (!data) $this.data("collapse", (data = new Collapse(this, options)));
- if (typeof option == "string") data[option]();
- });
- };
-
- $.fn.collapse.defaults = {
- toggle: true,
- };
-
- $.fn.collapse.Constructor = Collapse;
-
- /* COLLAPSE NO CONFLICT
- * ==================== */
-
- $.fn.collapse.noConflict = function () {
- $.fn.collapse = old;
- return this;
- };
-
- /* COLLAPSE DATA-API
- * ================= */
-
- $(document).on(
- "click.collapse.data-api",
- "[data-toggle=collapse]",
- function (e) {
- var $this = $(this),
- href,
- target =
- $this.attr("data-target") ||
- e.preventDefault() ||
- ((href = $this.attr("href")) && href.replace(/.*(?=#[^\s]+$)/, "")), //strip for ie7
- option = $(target).data("collapse") ? "toggle" : $this.data();
- $this[$(target).hasClass("in") ? "addClass" : "removeClass"]("collapsed");
- $(target).collapse(option);
- },
- );
-})(
- window.jQuery,
-); /* ============================================================
- * bootstrap-dropdown.js v2.3.1
- * http://twitter.github.com/bootstrap/javascript.html#dropdowns
- * ============================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================ */
-
-!(function ($) {
- "use strict"; // jshint ;_;
-
- /* DROPDOWN CLASS DEFINITION
- * ========================= */
-
- var toggle = "[data-toggle=dropdown]",
- Dropdown = function (element) {
- var $el = $(element).on("click.dropdown.data-api", this.toggle);
- $("html").on("click.dropdown.data-api", function () {
- $el.parent().removeClass("open");
- });
- };
-
- Dropdown.prototype = {
- constructor: Dropdown,
-
- toggle: function (e) {
- var $this = $(this),
- $parent,
- isActive;
-
- if ($this.is(".disabled, :disabled")) return;
-
- $parent = getParent($this);
-
- isActive = $parent.hasClass("open");
-
- clearMenus();
-
- if (!isActive) {
- $parent.toggleClass("open");
- }
-
- $this.focus();
-
- return false;
- },
-
- keydown: function (e) {
- var $this, $items, $active, $parent, isActive, index;
-
- if (!/(38|40|27)/.test(e.keyCode)) return;
-
- $this = $(this);
-
- e.preventDefault();
- e.stopPropagation();
-
- if ($this.is(".disabled, :disabled")) return;
-
- $parent = getParent($this);
-
- isActive = $parent.hasClass("open");
-
- if (!isActive || (isActive && e.keyCode == 27)) {
- if (e.which == 27) $parent.find(toggle).focus();
- return $this.click();
- }
-
- $items = $("[role=menu] li:not(.divider):visible a", $parent);
-
- if (!$items.length) return;
-
- index = $items.index($items.filter(":focus"));
-
- if (e.keyCode == 38 && index > 0) index--; // up
- if (e.keyCode == 40 && index < $items.length - 1) index++; // down
- if (!~index) index = 0;
-
- $items.eq(index).focus();
- },
- };
-
- function clearMenus() {
- $(toggle).each(function () {
- getParent($(this)).removeClass("open");
- });
- }
-
- function getParent($this) {
- var selector = $this.attr("data-target"),
- $parent;
-
- if (!selector) {
- selector = $this.attr("href");
- selector =
- selector &&
- /#/.test(selector) &&
- selector.replace(/.*(?=#[^\s]*$)/, ""); //strip for ie7
- }
-
- $parent = selector && $(selector);
-
- if (!$parent || !$parent.length) $parent = $this.parent();
-
- return $parent;
- }
-
- /* DROPDOWN PLUGIN DEFINITION
- * ========================== */
-
- var old = $.fn.dropdown;
-
- $.fn.dropdown = function (option) {
- return this.each(function () {
- var $this = $(this),
- data = $this.data("dropdown");
- if (!data) $this.data("dropdown", (data = new Dropdown(this)));
- if (typeof option == "string") data[option].call($this);
- });
- };
-
- $.fn.dropdown.Constructor = Dropdown;
-
- /* DROPDOWN NO CONFLICT
- * ==================== */
-
- $.fn.dropdown.noConflict = function () {
- $.fn.dropdown = old;
- return this;
- };
-
- /* APPLY TO STANDARD DROPDOWN ELEMENTS
- * =================================== */
-
- $(document)
- .on("click.dropdown.data-api", clearMenus)
- .on("click.dropdown.data-api", ".dropdown form", function (e) {
- e.stopPropagation();
- })
- .on("click.dropdown-menu", function (e) {
- e.stopPropagation();
- })
- .on("click.dropdown.data-api", toggle, Dropdown.prototype.toggle)
- .on(
- "keydown.dropdown.data-api",
- toggle + ", [role=menu]",
- Dropdown.prototype.keydown,
- );
-})(window.jQuery);
-/* =========================================================
- * bootstrap-modal.js v2.3.1
- * http://twitter.github.com/bootstrap/javascript.html#modals
- * =========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================= */
-
-!(function ($) {
- "use strict"; // jshint ;_;
-
- /* MODAL CLASS DEFINITION
- * ====================== */
-
- var Modal = function (element, options) {
- this.options = options;
- this.$element = $(element).delegate(
- '[data-dismiss="modal"]',
- "click.dismiss.modal",
- $.proxy(this.hide, this),
- );
- this.options.remote &&
- this.$element.find(".modal-body").load(this.options.remote);
- };
-
- Modal.prototype = {
- constructor: Modal,
-
- toggle: function () {
- return this[!this.isShown ? "show" : "hide"]();
- },
-
- show: function () {
- var that = this,
- e = $.Event("show");
-
- this.$element.trigger(e);
-
- if (this.isShown || e.isDefaultPrevented()) return;
-
- this.isShown = true;
-
- this.escape();
-
- this.backdrop(function () {
- var transition = $.support.transition && that.$element.hasClass("fade");
-
- if (!that.$element.parent().length) {
- that.$element.appendTo(document.body); //don't move modals dom position
- }
-
- that.$element.show();
-
- if (transition) {
- that.$element[0].offsetWidth; // force reflow
- }
-
- that.$element.addClass("in").attr("aria-hidden", false);
-
- that.enforceFocus();
-
- transition
- ? that.$element.one($.support.transition.end, function () {
- that.$element.focus().trigger("shown");
- })
- : that.$element.focus().trigger("shown");
- });
- },
-
- hide: function (e) {
- e && e.preventDefault();
-
- var that = this;
-
- e = $.Event("hide");
-
- this.$element.trigger(e);
-
- if (!this.isShown || e.isDefaultPrevented()) return;
-
- this.isShown = false;
-
- this.escape();
-
- $(document).off("focusin.modal");
-
- this.$element.removeClass("in").attr("aria-hidden", true);
-
- $.support.transition && this.$element.hasClass("fade")
- ? this.hideWithTransition()
- : this.hideModal();
- },
-
- enforceFocus: function () {
- var that = this;
- $(document).on("focusin.modal", function (e) {
- if (
- that.$element[0] !== e.target &&
- !that.$element.has(e.target).length
- ) {
- that.$element.focus();
- }
- });
- },
-
- escape: function () {
- var that = this;
- if (this.isShown && this.options.keyboard) {
- this.$element.on("keyup.dismiss.modal", function (e) {
- e.which == 27 && that.hide();
- });
- } else if (!this.isShown) {
- this.$element.off("keyup.dismiss.modal");
- }
- },
-
- hideWithTransition: function () {
- var that = this,
- timeout = setTimeout(function () {
- that.$element.off($.support.transition.end);
- that.hideModal();
- }, 500);
-
- this.$element.one($.support.transition.end, function () {
- clearTimeout(timeout);
- that.hideModal();
- });
- },
-
- hideModal: function () {
- var that = this;
- this.$element.hide();
- this.backdrop(function () {
- that.removeBackdrop();
- that.$element.trigger("hidden");
- });
- },
-
- removeBackdrop: function () {
- this.$backdrop && this.$backdrop.remove();
- this.$backdrop = null;
- },
-
- backdrop: function (callback) {
- var that = this,
- animate = this.$element.hasClass("fade") ? "fade" : "";
-
- if (this.isShown && this.options.backdrop) {
- var doAnimate = $.support.transition && animate;
-
- this.$backdrop = $(
- '<div class="modal-backdrop ' + animate + '" />',
- ).appendTo(document.body);
-
- this.$backdrop.click(
- this.options.backdrop == "static"
- ? $.proxy(this.$element[0].focus, this.$element[0])
- : $.proxy(this.hide, this),
- );
-
- if (doAnimate) this.$backdrop[0].offsetWidth; // force reflow
-
- this.$backdrop.addClass("in");
-
- if (!callback) return;
-
- doAnimate
- ? this.$backdrop.one($.support.transition.end, callback)
- : callback();
- } else if (!this.isShown && this.$backdrop) {
- this.$backdrop.removeClass("in");
-
- $.support.transition && this.$element.hasClass("fade")
- ? this.$backdrop.one($.support.transition.end, callback)
- : callback();
- } else if (callback) {
- callback();
- }
- },
- };
-
- /* MODAL PLUGIN DEFINITION
- * ======================= */
-
- var old = $.fn.modal;
-
- $.fn.modal = function (option) {
- return this.each(function () {
- var $this = $(this),
- data = $this.data("modal"),
- options = $.extend(
- {},
- $.fn.modal.defaults,
- $this.data(),
- typeof option == "object" && option,
- );
- if (!data) $this.data("modal", (data = new Modal(this, options)));
- if (typeof option == "string") data[option]();
- else if (options.show) data.show();
- });
- };
-
- $.fn.modal.defaults = {
- backdrop: true,
- keyboard: true,
- show: true,
- };
-
- $.fn.modal.Constructor = Modal;
-
- /* MODAL NO CONFLICT
- * ================= */
-
- $.fn.modal.noConflict = function () {
- $.fn.modal = old;
- return this;
- };
-
- /* MODAL DATA-API
- * ============== */
-
- $(document).on("click.modal.data-api", '[data-toggle="modal"]', function (e) {
- var $this = $(this),
- href = $this.attr("href"),
- $target = $(
- $this.attr("data-target") ||
- (href && href.replace(/.*(?=#[^\s]+$)/, "")),
- ), //strip for ie7
- option = $target.data("modal")
- ? "toggle"
- : $.extend(
- { remote: !/#/.test(href) && href },
- $target.data(),
- $this.data(),
- );
-
- e.preventDefault();
-
- $target.modal(option).one("hide", function () {
- $this.focus();
- });
- });
-})(window.jQuery);
-/* ===========================================================
- * bootstrap-tooltip.js v2.3.1
- * http://twitter.github.com/bootstrap/javascript.html#tooltips
- * Inspired by the original jQuery.tipsy by Jason Frame
- * ===========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
-
-!(function ($) {
- "use strict"; // jshint ;_;
-
- /* TOOLTIP PUBLIC CLASS DEFINITION
- * =============================== */
-
- var Tooltip = function (element, options) {
- this.init("tooltip", element, options);
- };
-
- Tooltip.prototype = {
- constructor: Tooltip,
-
- init: function (type, element, options) {
- var eventIn, eventOut, triggers, trigger, i;
-
- this.type = type;
- this.$element = $(element);
- this.options = this.getOptions(options);
- this.enabled = true;
-
- triggers = this.options.trigger.split(" ");
-
- for (i = triggers.length; i--; ) {
- trigger = triggers[i];
- if (trigger == "click") {
- this.$element.on(
- "click." + this.type,
- this.options.selector,
- $.proxy(this.toggle, this),
- );
- } else if (trigger != "manual") {
- eventIn = trigger == "hover" ? "mouseenter" : "focus";
- eventOut = trigger == "hover" ? "mouseleave" : "blur";
- this.$element.on(
- eventIn + "." + this.type,
- this.options.selector,
- $.proxy(this.enter, this),
- );
- this.$element.on(
- eventOut + "." + this.type,
- this.options.selector,
- $.proxy(this.leave, this),
- );
- }
- }
-
- this.options.selector
- ? (this._options = $.extend({}, this.options, {
- trigger: "manual",
- selector: "",
- }))
- : this.fixTitle();
- },
-
- getOptions: function (options) {
- options = $.extend(
- {},
- $.fn[this.type].defaults,
- this.$element.data(),
- options,
- );
-
- if (options.delay && typeof options.delay == "number") {
- options.delay = {
- show: options.delay,
- hide: options.delay,
- };
- }
-
- return options;
- },
-
- enter: function (e) {
- var defaults = $.fn[this.type].defaults,
- options = {},
- self;
-
- this._options &&
- $.each(
- this._options,
- function (key, value) {
- if (defaults[key] != value) options[key] = value;
- },
- this,
- );
-
- self = $(e.currentTarget)[this.type](options).data(this.type);
-
- if (!self.options.delay || !self.options.delay.show) return self.show();
-
- clearTimeout(this.timeout);
- self.hoverState = "in";
- this.timeout = setTimeout(function () {
- if (self.hoverState == "in") self.show();
- }, self.options.delay.show);
- },
-
- leave: function (e) {
- var self = $(e.currentTarget)[this.type](this._options).data(this.type);
-
- if (this.timeout) clearTimeout(this.timeout);
- if (!self.options.delay || !self.options.delay.hide) return self.hide();
-
- self.hoverState = "out";
- this.timeout = setTimeout(function () {
- if (self.hoverState == "out") self.hide();
- }, self.options.delay.hide);
- },
-
- show: function () {
- var $tip,
- pos,
- actualWidth,
- actualHeight,
- placement,
- tp,
- e = $.Event("show");
-
- if (this.hasContent() && this.enabled) {
- this.$element.trigger(e);
- if (e.isDefaultPrevented()) return;
- $tip = this.tip();
- this.setContent();
-
- if (this.options.animation) {
- $tip.addClass("fade");
- }
-
- placement =
- typeof this.options.placement == "function"
- ? this.options.placement.call(this, $tip[0], this.$element[0])
- : this.options.placement;
-
- $tip.detach().css({ top: 0, left: 0, display: "block" });
-
- this.options.container
- ? $tip.appendTo(this.options.container)
- : $tip.insertAfter(this.$element);
-
- pos = this.getPosition();
-
- actualWidth = $tip[0].offsetWidth;
- actualHeight = $tip[0].offsetHeight;
-
- switch (placement) {
- case "bottom":
- tp = {
- top: pos.top + pos.height,
- left: pos.left + pos.width / 2 - actualWidth / 2,
- };
- break;
- case "top":
- tp = {
- top: pos.top - actualHeight,
- left: pos.left + pos.width / 2 - actualWidth / 2,
- };
- break;
- case "left":
- tp = {
- top: pos.top + pos.height / 2 - actualHeight / 2,
- left: pos.left - actualWidth,
- };
- break;
- case "right":
- tp = {
- top: pos.top + pos.height / 2 - actualHeight / 2,
- left: pos.left + pos.width,
- };
- break;
- }
-
- this.applyPlacement(tp, placement);
- this.$element.trigger("shown");
- }
- },
-
- applyPlacement: function (offset, placement) {
- var $tip = this.tip(),
- width = $tip[0].offsetWidth,
- height = $tip[0].offsetHeight,
- actualWidth,
- actualHeight,
- delta,
- replace;
-
- $tip.offset(offset).addClass(placement).addClass("in");
-
- actualWidth = $tip[0].offsetWidth;
- actualHeight = $tip[0].offsetHeight;
-
- if (placement == "top" && actualHeight != height) {
- offset.top = offset.top + height - actualHeight;
- replace = true;
- }
-
- if (placement == "bottom" || placement == "top") {
- delta = 0;
-
- if (offset.left < 0) {
- delta = offset.left * -2;
- offset.left = 0;
- $tip.offset(offset);
- actualWidth = $tip[0].offsetWidth;
- actualHeight = $tip[0].offsetHeight;
- }
-
- this.replaceArrow(delta - width + actualWidth, actualWidth, "left");
- } else {
- this.replaceArrow(actualHeight - height, actualHeight, "top");
- }
-
- if (replace) $tip.offset(offset);
- },
-
- replaceArrow: function (delta, dimension, position) {
- this.arrow().css(
- position,
- delta ? 50 * (1 - delta / dimension) + "%" : "",
- );
- },
-
- setContent: function () {
- var $tip = this.tip(),
- title = this.getTitle();
-
- $tip.find(".tooltip-inner")[this.options.html ? "html" : "text"](title);
- $tip.removeClass("fade in top bottom left right");
- },
-
- hide: function () {
- var that = this,
- $tip = this.tip(),
- e = $.Event("hide");
-
- this.$element.trigger(e);
- if (e.isDefaultPrevented()) return;
-
- $tip.removeClass("in");
-
- function removeWithAnimation() {
- var timeout = setTimeout(function () {
- $tip.off($.support.transition.end).detach();
- }, 500);
-
- $tip.one($.support.transition.end, function () {
- clearTimeout(timeout);
- $tip.detach();
- });
- }
-
- $.support.transition && this.$tip.hasClass("fade")
- ? removeWithAnimation()
- : $tip.detach();
-
- this.$element.trigger("hidden");
-
- return this;
- },
-
- fixTitle: function () {
- var $e = this.$element;
- if (
- $e.attr("title") ||
- typeof $e.attr("data-original-title") != "string"
- ) {
- $e.attr("data-original-title", $e.attr("title") || "").attr(
- "title",
- "",
- );
- }
- },
-
- hasContent: function () {
- return this.getTitle();
- },
-
- getPosition: function () {
- var el = this.$element[0];
- return $.extend(
- {},
- typeof el.getBoundingClientRect == "function"
- ? el.getBoundingClientRect()
- : {
- width: el.offsetWidth,
- height: el.offsetHeight,
- },
- this.$element.offset(),
- );
- },
-
- getTitle: function () {
- var title,
- $e = this.$element,
- o = this.options;
-
- title =
- $e.attr("data-original-title") ||
- (typeof o.title == "function" ? o.title.call($e[0]) : o.title);
-
- return title;
- },
-
- tip: function () {
- return (this.$tip = this.$tip || $(this.options.template));
- },
-
- arrow: function () {
- return (this.$arrow = this.$arrow || this.tip().find(".tooltip-arrow"));
- },
-
- validate: function () {
- if (!this.$element[0].parentNode) {
- this.hide();
- this.$element = null;
- this.options = null;
- }
- },
-
- enable: function () {
- this.enabled = true;
- },
-
- disable: function () {
- this.enabled = false;
- },
-
- toggleEnabled: function () {
- this.enabled = !this.enabled;
- },
-
- toggle: function (e) {
- var self = e
- ? $(e.currentTarget)[this.type](this._options).data(this.type)
- : this;
- self.tip().hasClass("in") ? self.hide() : self.show();
- },
-
- destroy: function () {
- this.hide()
- .$element.off("." + this.type)
- .removeData(this.type);
- },
- };
-
- /* TOOLTIP PLUGIN DEFINITION
- * ========================= */
-
- var old = $.fn.tooltip;
-
- $.fn.tooltip = function (option) {
- return this.each(function () {
- var $this = $(this),
- data = $this.data("tooltip"),
- options = typeof option == "object" && option;
- if (!data) $this.data("tooltip", (data = new Tooltip(this, options)));
- if (typeof option == "string") data[option]();
- });
- };
-
- $.fn.tooltip.Constructor = Tooltip;
-
- $.fn.tooltip.defaults = {
- animation: true,
- placement: "top",
- selector: false,
- template:
- '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
- trigger: "hover focus",
- title: "",
- delay: 0,
- html: false,
- container: false,
- };
-
- /* TOOLTIP NO CONFLICT
- * =================== */
-
- $.fn.tooltip.noConflict = function () {
- $.fn.tooltip = old;
- return this;
- };
-})(window.jQuery);
-/* ===========================================================
- * bootstrap-popover.js v2.3.1
- * http://twitter.github.com/bootstrap/javascript.html#popovers
- * ===========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * =========================================================== */
-
-!(function ($) {
- "use strict"; // jshint ;_;
-
- /* POPOVER PUBLIC CLASS DEFINITION
- * =============================== */
-
- var Popover = function (element, options) {
- this.init("popover", element, options);
- };
-
- /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
- ========================================== */
-
- Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
- constructor: Popover,
-
- setContent: function () {
- var $tip = this.tip(),
- title = this.getTitle(),
- content = this.getContent();
-
- $tip.find(".popover-title")[this.options.html ? "html" : "text"](title);
- $tip
- .find(".popover-content")
- [this.options.html ? "html" : "text"](content);
-
- $tip.removeClass("fade top bottom left right in");
- },
-
- hasContent: function () {
- return this.getTitle() || this.getContent();
- },
-
- getContent: function () {
- var content,
- $e = this.$element,
- o = this.options;
-
- content =
- (typeof o.content == "function" ? o.content.call($e[0]) : o.content) ||
- $e.attr("data-content");
-
- return content;
- },
-
- tip: function () {
- if (!this.$tip) {
- this.$tip = $(this.options.template);
- }
- return this.$tip;
- },
-
- destroy: function () {
- this.hide()
- .$element.off("." + this.type)
- .removeData(this.type);
- },
- });
-
- /* POPOVER PLUGIN DEFINITION
- * ======================= */
-
- var old = $.fn.popover;
-
- $.fn.popover = function (option) {
- return this.each(function () {
- var $this = $(this),
- data = $this.data("popover"),
- options = typeof option == "object" && option;
- if (!data) $this.data("popover", (data = new Popover(this, options)));
- if (typeof option == "string") data[option]();
- });
- };
-
- $.fn.popover.Constructor = Popover;
-
- $.fn.popover.defaults = $.extend({}, $.fn.tooltip.defaults, {
- placement: "right",
- trigger: "click",
- content: "",
- template:
- '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>',
- });
-
- /* POPOVER NO CONFLICT
- * =================== */
-
- $.fn.popover.noConflict = function () {
- $.fn.popover = old;
- return this;
- };
-})(window.jQuery);
-/* =============================================================
- * bootstrap-scrollspy.js v2.3.1
- * http://twitter.github.com/bootstrap/javascript.html#scrollspy
- * =============================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================== */
-
-!(function ($) {
- "use strict"; // jshint ;_;
-
- /* SCROLLSPY CLASS DEFINITION
- * ========================== */
-
- function ScrollSpy(element, options) {
- var process = $.proxy(this.process, this),
- $element = $(element).is("body") ? $(window) : $(element),
- href;
- this.options = $.extend({}, $.fn.scrollspy.defaults, options);
- this.$scrollElement = $element.on("scroll.scroll-spy.data-api", process);
- this.selector =
- (this.options.target ||
- ((href = $(element).attr("href")) &&
- href.replace(/.*(?=#[^\s]+$)/, "")) || //strip for ie7
- "") + " .nav li > a";
- this.$body = $("body");
- this.refresh();
- this.process();
- }
-
- ScrollSpy.prototype = {
- constructor: ScrollSpy,
-
- refresh: function () {
- var self = this,
- $targets;
-
- this.offsets = $([]);
- this.targets = $([]);
-
- $targets = this.$body
- .find(this.selector)
- .map(function () {
- var $el = $(this),
- href = $el.data("target") || $el.attr("href"),
- $href = /^#\w/.test(href) && $(href);
- return (
- ($href &&
- $href.length && [
- [
- $href.position().top +
- (!$.isWindow(self.$scrollElement.get(0)) &&
- self.$scrollElement.scrollTop()),
- href,
- ],
- ]) ||
- null
- );
- })
- .sort(function (a, b) {
- return a[0] - b[0];
- })
- .each(function () {
- self.offsets.push(this[0]);
- self.targets.push(this[1]);
- });
- },
-
- process: function () {
- var scrollTop = this.$scrollElement.scrollTop() + this.options.offset,
- scrollHeight =
- this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight,
- maxScroll = scrollHeight - this.$scrollElement.height(),
- offsets = this.offsets,
- targets = this.targets,
- activeTarget = this.activeTarget,
- i;
-
- if (scrollTop >= maxScroll) {
- return activeTarget != (i = targets.last()[0]) && this.activate(i);
- }
-
- for (i = offsets.length; i--; ) {
- activeTarget != targets[i] &&
- scrollTop >= offsets[i] &&
- (!offsets[i + 1] || scrollTop <= offsets[i + 1]) &&
- this.activate(targets[i]);
- }
- },
-
- activate: function (target) {
- var active, selector;
-
- this.activeTarget = target;
-
- $(this.selector).parent(".active").removeClass("active");
-
- selector =
- this.selector +
- '[data-target="' +
- target +
- '"],' +
- this.selector +
- '[href="' +
- target +
- '"]';
-
- active = $(selector).parent("li").addClass("active");
-
- if (active.parent(".dropdown-menu").length) {
- active = active.closest("li.dropdown").addClass("active");
- }
-
- active.trigger("activate");
- },
- };
-
- /* SCROLLSPY PLUGIN DEFINITION
- * =========================== */
-
- var old = $.fn.scrollspy;
-
- $.fn.scrollspy = function (option) {
- return this.each(function () {
- var $this = $(this),
- data = $this.data("scrollspy"),
- options = typeof option == "object" && option;
- if (!data) $this.data("scrollspy", (data = new ScrollSpy(this, options)));
- if (typeof option == "string") data[option]();
- });
- };
-
- $.fn.scrollspy.Constructor = ScrollSpy;
-
- $.fn.scrollspy.defaults = {
- offset: 10,
- };
-
- /* SCROLLSPY NO CONFLICT
- * ===================== */
-
- $.fn.scrollspy.noConflict = function () {
- $.fn.scrollspy = old;
- return this;
- };
-
- /* SCROLLSPY DATA-API
- * ================== */
-
- $(window).on("load", function () {
- $('[data-spy="scroll"]').each(function () {
- var $spy = $(this);
- $spy.scrollspy($spy.data());
- });
- });
-})(window.jQuery); /* ========================================================
- * bootstrap-tab.js v2.3.1
- * http://twitter.github.com/bootstrap/javascript.html#tabs
- * ========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ======================================================== */
-
-!(function ($) {
- "use strict"; // jshint ;_;
-
- /* TAB CLASS DEFINITION
- * ==================== */
-
- var Tab = function (element) {
- this.element = $(element);
- };
-
- Tab.prototype = {
- constructor: Tab,
-
- show: function () {
- var $this = this.element,
- $ul = $this.closest("ul:not(.dropdown-menu)"),
- selector = $this.attr("data-target"),
- previous,
- $target,
- e;
-
- if (!selector) {
- selector = $this.attr("href");
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, ""); //strip for ie7
- }
-
- if ($this.parent("li").hasClass("active")) return;
-
- previous = $ul.find(".active:last a")[0];
-
- e = $.Event("show", {
- relatedTarget: previous,
- });
-
- $this.trigger(e);
-
- if (e.isDefaultPrevented()) return;
-
- $target = $(selector);
-
- this.activate($this.parent("li"), $ul);
- this.activate($target, $target.parent(), function () {
- $this.trigger({
- type: "shown",
- relatedTarget: previous,
- });
- });
- },
-
- activate: function (element, container, callback) {
- var $active = container.find("> .active"),
- transition =
- callback && $.support.transition && $active.hasClass("fade");
-
- function next() {
- $active
- .removeClass("active")
- .find("> .dropdown-menu > .active")
- .removeClass("active");
-
- element.addClass("active");
-
- if (transition) {
- element[0].offsetWidth; // reflow for transition
- element.addClass("in");
- } else {
- element.removeClass("fade");
- }
-
- if (element.parent(".dropdown-menu")) {
- element.closest("li.dropdown").addClass("active");
- }
-
- callback && callback();
- }
-
- transition ? $active.one($.support.transition.end, next) : next();
-
- $active.removeClass("in");
- },
- };
-
- /* TAB PLUGIN DEFINITION
- * ===================== */
-
- var old = $.fn.tab;
-
- $.fn.tab = function (option) {
- return this.each(function () {
- var $this = $(this),
- data = $this.data("tab");
- if (!data) $this.data("tab", (data = new Tab(this)));
- if (typeof option == "string") data[option]();
- });
- };
-
- $.fn.tab.Constructor = Tab;
-
- /* TAB NO CONFLICT
- * =============== */
-
- $.fn.tab.noConflict = function () {
- $.fn.tab = old;
- return this;
- };
-
- /* TAB DATA-API
- * ============ */
-
- $(document).on(
- "click.tab.data-api",
- '[data-toggle="tab"], [data-toggle="pill"]',
- function (e) {
- e.preventDefault();
- $(this).tab("show");
- },
- );
-})(
- window.jQuery,
-); /* =============================================================
- * bootstrap-typeahead.js v2.3.1
- * http://twitter.github.com/bootstrap/javascript.html#typeahead
- * =============================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================ */
-
-!(function ($) {
- "use strict"; // jshint ;_;
-
- /* TYPEAHEAD PUBLIC CLASS DEFINITION
- * ================================= */
-
- var Typeahead = function (element, options) {
- this.$element = $(element);
- this.options = $.extend({}, $.fn.typeahead.defaults, options);
- this.matcher = this.options.matcher || this.matcher;
- this.sorter = this.options.sorter || this.sorter;
- this.highlighter = this.options.highlighter || this.highlighter;
- this.updater = this.options.updater || this.updater;
- this.source = this.options.source;
- this.$menu = $(this.options.menu);
- this.shown = false;
- this.listen();
- };
-
- Typeahead.prototype = {
- constructor: Typeahead,
-
- select: function () {
- var val = this.$menu.find(".active").attr("data-value");
- this.$element.val(this.updater(val)).change();
- return this.hide();
- },
-
- updater: function (item) {
- return item;
- },
-
- show: function () {
- var pos = $.extend({}, this.$element.position(), {
- height: this.$element[0].offsetHeight,
- });
-
- this.$menu
- .insertAfter(this.$element)
- .css({
- top: pos.top + pos.height,
- left: pos.left,
- })
- .show();
-
- this.shown = true;
- return this;
- },
-
- hide: function () {
- this.$menu.hide();
- this.shown = false;
- return this;
- },
-
- lookup: function (event) {
- var items;
-
- this.query = this.$element.val();
-
- if (!this.query || this.query.length < this.options.minLength) {
- return this.shown ? this.hide() : this;
- }
-
- items = $.isFunction(this.source)
- ? this.source(this.query, $.proxy(this.process, this))
- : this.source;
-
- return items ? this.process(items) : this;
- },
-
- process: function (items) {
- var that = this;
-
- items = $.grep(items, function (item) {
- return that.matcher(item);
- });
-
- items = this.sorter(items);
-
- if (!items.length) {
- return this.shown ? this.hide() : this;
- }
-
- return this.render(items.slice(0, this.options.items)).show();
- },
-
- matcher: function (item) {
- return ~item.toLowerCase().indexOf(this.query.toLowerCase());
- },
-
- sorter: function (items) {
- var beginswith = [],
- caseSensitive = [],
- caseInsensitive = [],
- item;
-
- while ((item = items.shift())) {
- if (!item.toLowerCase().indexOf(this.query.toLowerCase()))
- beginswith.push(item);
- else if (~item.indexOf(this.query)) caseSensitive.push(item);
- else caseInsensitive.push(item);
- }
-
- return beginswith.concat(caseSensitive, caseInsensitive);
- },
-
- highlighter: function (item) {
- var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
- return item.replace(
- new RegExp("(" + query + ")", "ig"),
- function ($1, match) {
- return "<strong>" + match + "</strong>";
- },
- );
- },
-
- render: function (items) {
- var that = this;
-
- items = $(items).map(function (i, item) {
- i = $(that.options.item).attr("data-value", item);
- i.find("a").html(that.highlighter(item));
- return i[0];
- });
-
- items.first().addClass("active");
- this.$menu.html(items);
- return this;
- },
-
- next: function (event) {
- var active = this.$menu.find(".active").removeClass("active"),
- next = active.next();
-
- if (!next.length) {
- next = $(this.$menu.find("li")[0]);
- }
-
- next.addClass("active");
- },
-
- prev: function (event) {
- var active = this.$menu.find(".active").removeClass("active"),
- prev = active.prev();
-
- if (!prev.length) {
- prev = this.$menu.find("li").last();
- }
-
- prev.addClass("active");
- },
-
- listen: function () {
- this.$element
- .on("focus", $.proxy(this.focus, this))
- .on("blur", $.proxy(this.blur, this))
- .on("keypress", $.proxy(this.keypress, this))
- .on("keyup", $.proxy(this.keyup, this));
-
- if (this.eventSupported("keydown")) {
- this.$element.on("keydown", $.proxy(this.keydown, this));
- }
-
- this.$menu
- .on("click", $.proxy(this.click, this))
- .on("mouseenter", "li", $.proxy(this.mouseenter, this))
- .on("mouseleave", "li", $.proxy(this.mouseleave, this));
- },
-
- eventSupported: function (eventName) {
- var isSupported = eventName in this.$element;
- if (!isSupported) {
- this.$element.setAttribute(eventName, "return;");
- isSupported = typeof this.$element[eventName] === "function";
- }
- return isSupported;
- },
-
- move: function (e) {
- if (!this.shown) return;
-
- switch (e.keyCode) {
- case 9: // tab
- case 13: // enter
- case 27: // escape
- e.preventDefault();
- break;
-
- case 38: // up arrow
- e.preventDefault();
- this.prev();
- break;
-
- case 40: // down arrow
- e.preventDefault();
- this.next();
- break;
- }
-
- e.stopPropagation();
- },
-
- keydown: function (e) {
- this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40, 38, 9, 13, 27]);
- this.move(e);
- },
-
- keypress: function (e) {
- if (this.suppressKeyPressRepeat) return;
- this.move(e);
- },
-
- keyup: function (e) {
- switch (e.keyCode) {
- case 40: // down arrow
- case 38: // up arrow
- case 16: // shift
- case 17: // ctrl
- case 18: // alt
- break;
-
- case 9: // tab
- case 13: // enter
- if (!this.shown) return;
- this.select();
- break;
-
- case 27: // escape
- if (!this.shown) return;
- this.hide();
- break;
-
- default:
- this.lookup();
- }
-
- e.stopPropagation();
- e.preventDefault();
- },
-
- focus: function (e) {
- this.focused = true;
- },
-
- blur: function (e) {
- this.focused = false;
- if (!this.mousedover && this.shown) this.hide();
- },
-
- click: function (e) {
- e.stopPropagation();
- e.preventDefault();
- this.select();
- this.$element.focus();
- },
-
- mouseenter: function (e) {
- this.mousedover = true;
- this.$menu.find(".active").removeClass("active");
- $(e.currentTarget).addClass("active");
- },
-
- mouseleave: function (e) {
- this.mousedover = false;
- if (!this.focused && this.shown) this.hide();
- },
- };
-
- /* TYPEAHEAD PLUGIN DEFINITION
- * =========================== */
-
- var old = $.fn.typeahead;
-
- $.fn.typeahead = function (option) {
- return this.each(function () {
- var $this = $(this),
- data = $this.data("typeahead"),
- options = typeof option == "object" && option;
- if (!data) $this.data("typeahead", (data = new Typeahead(this, options)));
- if (typeof option == "string") data[option]();
- });
- };
-
- $.fn.typeahead.defaults = {
- source: [],
- items: 8,
- menu: '<ul class="typeahead dropdown-menu"></ul>',
- item: '<li><a href="#"></a></li>',
- minLength: 1,
- };
-
- $.fn.typeahead.Constructor = Typeahead;
-
- /* TYPEAHEAD NO CONFLICT
- * =================== */
-
- $.fn.typeahead.noConflict = function () {
- $.fn.typeahead = old;
- return this;
- };
-
- /* TYPEAHEAD DATA-API
- * ================== */
-
- $(document).on(
- "focus.typeahead.data-api",
- '[data-provide="typeahead"]',
- function (e) {
- var $this = $(this);
- if ($this.data("typeahead")) return;
- $this.typeahead($this.data());
- },
- );
-})(window.jQuery);
-/* ==========================================================
- * bootstrap-affix.js v2.3.1
- * http://twitter.github.com/bootstrap/javascript.html#affix
- * ==========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
-
-!(function ($) {
- "use strict"; // jshint ;_;
-
- /* AFFIX CLASS DEFINITION
- * ====================== */
-
- var Affix = function (element, options) {
- this.options = $.extend({}, $.fn.affix.defaults, options);
- this.$window = $(window)
- .on("scroll.affix.data-api", $.proxy(this.checkPosition, this))
- .on(
- "click.affix.data-api",
- $.proxy(function () {
- setTimeout($.proxy(this.checkPosition, this), 1);
- }, this),
- );
- this.$element = $(element);
- this.checkPosition();
- };
-
- Affix.prototype.checkPosition = function () {
- if (!this.$element.is(":visible")) return;
-
- var scrollHeight = $(document).height(),
- scrollTop = this.$window.scrollTop(),
- position = this.$element.offset(),
- offset = this.options.offset,
- offsetBottom = offset.bottom,
- offsetTop = offset.top,
- reset = "affix affix-top affix-bottom",
- affix;
-
- if (typeof offset != "object") offsetBottom = offsetTop = offset;
- if (typeof offsetTop == "function") offsetTop = offset.top();
- if (typeof offsetBottom == "function") offsetBottom = offset.bottom();
-
- affix =
- this.unpin != null && scrollTop + this.unpin <= position.top
- ? false
- : offsetBottom != null &&
- position.top + this.$element.height() >= scrollHeight - offsetBottom
- ? "bottom"
- : offsetTop != null && scrollTop <= offsetTop
- ? "top"
- : false;
-
- if (this.affixed === affix) return;
-
- this.affixed = affix;
- this.unpin = affix == "bottom" ? position.top - scrollTop : null;
-
- this.$element
- .removeClass(reset)
- .addClass("affix" + (affix ? "-" + affix : ""));
- };
-
- /* AFFIX PLUGIN DEFINITION
- * ======================= */
-
- var old = $.fn.affix;
-
- $.fn.affix = function (option) {
- return this.each(function () {
- var $this = $(this),
- data = $this.data("affix"),
- options = typeof option == "object" && option;
- if (!data) $this.data("affix", (data = new Affix(this, options)));
- if (typeof option == "string") data[option]();
- });
- };
-
- $.fn.affix.Constructor = Affix;
-
- $.fn.affix.defaults = {
- offset: 0,
- };
-
- /* AFFIX NO CONFLICT
- * ================= */
-
- $.fn.affix.noConflict = function () {
- $.fn.affix = old;
- return this;
- };
-
- /* AFFIX DATA-API
- * ============== */
-
- $(window).on("load", function () {
- $('[data-spy="affix"]').each(function () {
- var $spy = $(this),
- data = $spy.data();
-
- data.offset = data.offset || {};
-
- data.offsetBottom && (data.offset.bottom = data.offsetBottom);
- data.offsetTop && (data.offset.top = data.offsetTop);
-
- $spy.affix(data);
- });
- });
-})(window.jQuery);
-self._386 = self._386 || {};
-
-$(function () {
- var character = { height: 20, width: 12.4 };
-
- function scrollLock() {
- var last = 0;
- $(window).bind("scroll", function (e) {
- var func,
- off = $(window).scrollTop();
-
- console.log(off, last, off < last ? "up" : "down");
-
- // this determines whether the user is intending to go up or down.
- func = off < last ? "floor" : "ceil";
-
- // make sure we don't run this from ourselves
- if (off % character.height === 0) {
- return;
- }
- last = off;
-
- window.scrollTo(0, Math[func](off / character.height) * character.height);
- });
- }
-
- function loading() {
- if (_386.fastLoad) {
- document.body.style.visibility = "visible";
- return;
- }
-
- var onePass = _386.onePass,
- speedFactor = (1 / (_386.speedFactor || 1)) * 165000;
- (wrap = document.createElement("div")),
- (bar = wrap.appendChild(document.createElement("div"))),
- (cursor = document.createElement("div")),
- // If the user specified that the visibility is hidden, then we
- // start at the first pass ... otherwise we just do the
- // cursor fly-by
- (pass = $(document.body).css("visibility") == "visible" ? 1 : 0),
- (height = $(window).height()),
- (width = $(window).width()),
- // this makes the loading of the screen proportional to the real-estate of the window.
- // it helps keep the cool sequence there while not making it waste too much time.
- (rounds = (height * width) / speedFactor),
- (column = width),
- (row = height - character.height);
-
- wrap.id = "wrap386";
- bar.id = "bar386";
- cursor.id = "cursor386";
-
- cursor.innerHTML = bar.innerHTML = "▄";
-
- // only inject the wrap if the pass is 0
- if (pass === 0) {
- document.body.appendChild(wrap);
- document.body.style.visibility = "visible";
- } else {
- document.body.appendChild(cursor);
- rounds /= 2;
- character.height *= 4;
- }
-
- var ival = setInterval(function () {
- for (var m = 0; m < rounds; m++) {
- column -= character.width;
-
- if (column <= 0) {
- column = width;
- row -= character.height;
- }
- if (row <= 0) {
- pass++;
- row = height - character.height;
-
- if (pass == 2) {
- document.body.removeChild(cursor);
- clearInterval(ival);
- } else {
- wrap.parentNode.removeChild(wrap);
- if (onePass) {
- clearInterval(ival);
- } else {
- document.body.appendChild(cursor);
- rounds /= 2;
- character.height *= 4;
- }
- }
- }
-
- if (pass === 0) {
- bar.style.width = column + "px";
- wrap.style.height = row + "px";
- } else {
- cursor.style.right = column + "px";
- cursor.style.bottom = row + "px";
- }
- }
- }, 1);
- }
- loading();
-});
diff --git a/web/static/js/wakatime.js b/web/static/js/wakatime.js
@@ -1,56 +0,0 @@
-function createRow(data, max_length, total_hours) {
- const { date, hours, text } = data;
- var row = date.toLowerCase().padEnd(max_length);
- row += " | ";
-
- if (hours > 0 && total_hours > 0) {
- const bar_length = Math.ceil((hours / total_hours) * (100 / 5));
- const bar = "#".repeat(bar_length);
- if (bar.length !== 0) {
- row += `${bar} `;
- }
- }
- row += `${text}\n`;
- return row;
-}
-
-function createChart(data) {
- const table = [];
- var max_length = 0;
- var total_hours = 0;
- data.forEach((entry) => {
- const date = entry.range.text.replace(/\s*\d{4}$/, "");
- max_length = Math.max(max_length, date.length);
- const { total_seconds, text: timeText } = entry.grand_total;
- const hours = total_seconds / 60 / 60;
- total_hours += hours;
- table.push({ date, hours, text: timeText });
- });
-
- var chart = "";
- table.forEach((row) => {
- chart += createRow(row, max_length, total_hours);
- });
- var total_minutes = total_hours % 1;
- total_hours -= total_minutes;
- total_minutes = Math.ceil(total_minutes * 60);
- chart += `total: ${total_hours} hours and ${total_minutes} minutes`;
- return chart;
-}
-
-$.ajax({
- type: "GET",
- url: "https://wakatime.com/share/@Moncheeta/235513c0-b88a-483b-a5a5-d0f54e7c471e.json",
- dataType: "jsonp",
- success: function (response) {
- const chart = createChart(response.data);
- for (let element of document.getElementsByClassName("activity")) {
- element.textContent = chart;
- }
- },
- error: function (error) {
- console.error("Error fetching data:", error);
- document.getElementById("activity-small").textContent = "Failed to load chart";
- document.getElementById("activity-big").textContent = "Failed to load chart";
- },
-});
diff --git a/web/templates/404.html b/web/templates/404.html
@@ -1,9 +0,0 @@
-{% extends "error.html" %}
-
-{% block title %}
-<title>not found</title>
-{% endblock %}
-
-{% block message %}
-<h1 id="message">not found (404)</h1>
-{% endblock %}
diff --git a/web/templates/429.html b/web/templates/429.html
@@ -1,9 +0,0 @@
-{% extends "error.html" %}
-
-{% block title %}
-<title>too many requests</title>
-{% endblock %}
-
-{% block message %}
-<h1 id="message">too many requests (429)</h1>
-{% endblock %}
diff --git a/web/templates/500.html b/web/templates/500.html
@@ -1,9 +0,0 @@
-{% extends "error.html" %}
-
-{% block title %}
-<title>server error</title>
-{% endblock %}
-
-{% block message %}
-<h1 id="message">server error (500)</h1>
-{% endblock %}
diff --git a/web/templates/base.html b/web/templates/base.html
@@ -1,52 +0,0 @@
-<!doctype html>
-<html lang="en">
- <head>
- <meta charset="UTF-8" />
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-
- <title>Damian Myrda</title>
- <link rel="icon" type="image/png" href="/img/moncheeta.png" />
- <meta
- name="description"
- content="Terminal enthusiast, learning from Curious George (the curious part, not the monkey business). Systems and backend programming are my focus. Striving to turn spaghetti code into well-structured algorithms and make every line count with efficiency and creativity."
- />
-
- {% block title %}{% endblock %}
-
- <style>
- body {
- visibility: hidden;
- min-height: 100vh;
- }
-
- #content {
- max-width: 800px;
- margin: 0 auto 0 auto;
- padding: 1rem 0 1rem 0;
- }
-
- pre {
- color: #e8e6e3 !important;
- background-color: #000084 !important;
- }
-
- h3 {
- text-align: center !important;
- }
- </style>
- <link href="/css/bootstrap.css" rel="stylesheet" media="screen" />
- <link href="/css/bootstrap-responsive.css" rel="stylesheet" />
-
- <script src="https://code.jquery.com/jquery.js"></script>
- <script>
- _386 = { onePass: true };
- </script>
- <script src="/js/bootstrap.js"></script>
- </head>
-
- <body>
- {% block navbar %}{% endblock %}
-
- <div id="content">{% block content %}{% endblock %}</div>
- </body>
-</html>
diff --git a/web/templates/error.html b/web/templates/error.html
@@ -1,29 +0,0 @@
-{% extends "base.html" %}
-
-{% import "nav.html" as nav %}
-{% block navbar %}
-{{ nav::bar(active="") }}
-{% endblock %}
-
-{% block content %}
-<div>
- {% block message %}
- {% endblock %}
-</div>
-<style>
- #content {
- padding: 0px !important;
- }
-
- #message {
- color: #ff5555;
- display: flex;
- justify-content: center;
- align-items: center;
- height: 100vh;
- }
-</style>
-<script>
- _386 = { fastLoad: true };
-</script>
-{% endblock %}
diff --git a/web/templates/index.html b/web/templates/index.html
@@ -1,107 +0,0 @@
-{% extends "base.html" %}
-
-{% import "projects.html" as projects %}
-
-{% block title %}
-<title>prime8.dev</title>
-{% endblock %}
-
-{% block content %}
-<div id="logo">
- <div>
- <pre id="firstname">
- _ _
- | | (_)
- __| | __ _ _ __ ___ _ __ _ _ __
- / _` |/ _` | '_ ` _ \| |/ _` | '_ \
-| (_| | (_| | | | | | | | (_| | | | |
- \__,_|\__,_|_| |_| |_|_|\__,_|_| |_|
- </pre>
- <div style="display: table; width: 100%">
- <div class="d-table-cell">
- <a href="mailto:damian@prime8.dev">damian@prime8.dev</a>
- </div>
- <div style="display: table-cell; text-align: right">
- <pre class="hidden-phone">chicago,</pre>
- <a class="visible-phone" href="https://www.linkedin.com/in/damian-myrda/">linkedin</a></pre>
- </div>
- </div>
- </div>
- <pre id="middle" class="hidden-phone"></pre>
- <pre id="lastname" class="hidden-phone">
- _
- | |
- _ __ ___ _ _ _ __ __| | __ _
-| '_ ` _ \| | | | '__/ _` |/ _` |
-| | | | | | |_| | | | (_| | (_| |
-|_| |_| |_|\__, |_| \__,_|\__,_|
- __/ |
-illinois |___/ <a class="align-right" href="https://www.linkedin.com/in/damian-myrda/">linkedin</a></pre>
- <script>
- const heights = [
- document.getElementById("firstname").textContent.split("\n").length,
- document.getElementById("lastname").textContent.split("\n").length,
- ];
- const max_height = Math.max(...heights);
- document.getElementById("middle").textContent = " \n".repeat(max_height);
- </script>
- <style>
- #logo {
- display: table;
- margin-left: auto;
- margin-right: auto;
- }
-
- #firstname, #middle, #lastname {
- display: table-cell;
- }
-
- @media (max-width: 480px) {
- #firstname, #middle, #lastname {
- font-size: 16px !important;
- line-height: 18px !important;
- }
- }
- </style>
-</div>
-<div id="content">
- <p class="lead" style="text-align: center">
- Terminal enthusiast, learning from Curious George (the curious part, not the
- monkey business). Systems and backend programming are my focus. Striving to
- turn spaghetti code into well-structured algorithms and make every line
- count with efficiency and creativity.
- </p>
- <div style="display: table; width: 100%">
- <div class="d-table-cell">
- <h3>techonologies:</h3>
- <ul>
- <li style="color: #fff">languages: <span style="color: #fefe54">zig</span>, <span style="color: #ff5555">rust</span>, <span style="color: #55ffff">go</span>, <span style="color: #bbb">c</span>, <span style="color: #00aaaa">c++</span>, <span style="color: #fefe54">python</span></li>
- <li style="color: #fff">frameworks: <span style="color: #ff5555">tokio</span>, <span style="color: #55ff55">fastapi<span>, <span style="color: #bbb">flask</span></li>
- <li style="color: #fff">libraries: <span style="color: #ff5555">torch</span>, <span style="color: #fe54fe">kafka</span>
- <li style="color: #fff">tools: <span style="color: #bbb">git</span>, <span style="color: #55ff55">bash</span>, <span style="color: #aa5500">make</span>, <span style="color: #bbb">gdb</span>, <span style="color: #00aaaa">docker</span></li>
- </ul>
- <h3>learning:</h3>
- <ul>
- <li style="color: #00aaaa">typescript</li>
- <li style="color: #a85400">java</li>
- </ul>
- <div class="visible-phone">
- <h3>activity:</h3>
- <pre class="activity" style="color: #bbb !important">Loading activity...</pre>
- </div>
- </div>
- <div style="display: table-cell; vertical-align: middle">
- <div style="display: flex; justify-content: center">
- <div class="hidden-phone">
- <h3>activity:</h3>
- <pre class="activity" style="color: #bbb !important">Loading activity...</pre>
- </div>
- </div>
- </div>
- </div
- <div>
- {{ projects::list() }}
- </div>
-</div>
-<script src="js/wakatime.js"></script>
-{% endblock %}
diff --git a/web/templates/nav.html b/web/templates/nav.html
@@ -1,19 +0,0 @@
-{% macro bar(active) %}
-<div class="navbar navbar-inverse navbar-fixed-top">
- <div class="navbar-inner">
- <a class="brand" href="/">prime8</a>
- <ul class="nav">
- {% for tab in config.extra.tabs %}
- <li {% if tab.name == active %} class="active" {% endif %}>
- <a href="{{ tab.url }}">{{ tab.name }}</a>
- </li>
- {% endfor %}
- </ul>
- </div>
-</div>
-<style>
- .brand {
- margin-left: 0 !important;
- }
-</style>
-{% endmacro %}
diff --git a/web/templates/projects.html b/web/templates/projects.html
@@ -1,83 +0,0 @@
-{% macro list() %}
-<pre style="color: #fff !important">
- _ _
- (_) | |
- _ __ _ __ ___ _ ___ ___| |_ ___
-| '_ \| '__/ _ \| |/ _ \/ __| __/ __|
-| |_) | | | (_) | | __/ (__| |_\__ \
-| .__/|_| \___/| |\___|\___|\__|___/
-| | _/ |
-|_| |__/
-
-</pre>
-<div class="row-fluid">
- <div class="span4 w-100">
- <h3>MOS</h3>
- <p>
- In my free time, I work on MOS, my minimal operating system. This project
- has deepened my understanding of OS internals, and I'm planning to rewrite
- it for the RISC-V architecture. Users interact with the terminal through
- command line and terminal user interfaces designed for ease of use and
- efficiency.
- </p>
- <a href="https://git.prime8.dev/?p=mos.git" class="btn">src</a>
- </div>
- <div class="span4 w-100">
- <h3>Janitor</h3>
- <p>
- During my summer internship at Amplifier Health, I developed a service
- that sorts audio files into three categories: speech, music, and noise. I
- wrote it in Rust with tch-rs and Axum aiming for better performance. The
- service is designed to be fast, using efficient multithreading on the CPU
- and taking advantage of the GPU for highly parallel processing.
- </p>
- <a href="https://git.prime8.dev/?p=janitor.git" class="btn">src</a>
- </div>
- <div class="span4 w-100">
- <h3>Summarizer</h3>
- <p>
- An experiment using a microservice architecture that transcribes and
- summarizes audio into text using OpenAI's API. Each service has its own
- function that it performs, and the services communicate with each other
- through Kafka, where jobs are requested and results are received. The
- entire system can be easily deployed with a Docker Compose file.
- </p>
- <a href="https://github.com/moncheeta/summarizer" class="btn">src</a>
- </div>
-</div>
-<div class="row-fluid">
- <div class="span4 w-100">
- <h3>Tutor Connect</h3>
- <p>
- For HSHacks 2024, my friends and I developed a website to help students
- find tutors. Recognizing that not every school has a dedicated portal for
- peer tutoring, we created a district-wide, easily accessible platform. We
- used ReactJS for the user interface and Firebase for storage and
- authentication. In the end, we won 3rd place!
- </p>
- <a href="https://d214tutorconnect.prime8.dev" class="btn">src</a>
- </div>
- <div class="span4 w-100">
- <h3>CSC Website</h3>
- <p>
- I built a website for the Computer Science Club (CSC) at Prospect High
- School during a mini-hackathon. The site displays important information it
- fetches from the Schoology API. Members can share their projects using
- their Google account and uploading their work to a SQLite database.
- </p>
- <a href="https://git.prime8.dev/?p=csc.git" class="btn">src</a>
- <a href="https://csc.prime8.dev" class="btn">live</a>
- </div>
- <div class="span4 w-100">
- <h3>Veterans Website</h3>
- <p>
- For HSHacks 2023, my very first hackathon, I created a website for an
- organization that helps veterans manage donations. Donors can use their
- Venmo account to donate to the organization. They receive a notification
- on their phone for confirmation, and each donor gets a thank-you email as
- a gesture of appreciation.
- </p>
- <a href="https://github.com/moncheeta/veteran_donations" class="btn">src</a>
- </div>
-</div>
-{% endmacro %}
diff --git a/web/tsconfig.json b/web/tsconfig.json
@@ -0,0 +1,6 @@
+{
+ "extends": "astro/tsconfigs/strict",
+ "compilerOptions": {
+ "strictNullChecks": true
+ }
+}