--- /dev/null
+<!doctype html>
+<title>404 Not Found</title>
+<h1>404 Not Found</h1>
--- /dev/null
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="utf-8">
+ <title>first post - MyBlog</title>
+ <link rel="icon" type="image/x-icon" href="https://taranathan.com/favicon.ico">
+ <link rel="stylesheet" href="https://taranathan.com/styles.css">
+</head>
+
+<body>
+ <div class="container">
+ <div class="kaomoji-sidebar kaomoji-left">
+ <div class="scroll-text" id="kaomoji-left"></div>
+ </div>
+
+ <main class="content">
+ <header class="header">
+ <h1 href="/">My Blog</h1>
+ <nav class="nav">
+ <a href="/">Home</a>
+ <a href="/blog">Blog</a>
+ <a href="/miniblog">Miniblog</a>
+ <a href="/boo" target="_blank">Fun</a>
+ </nav>
+ </header>
+
+ <section class="content-body">
+
+ <article class="post">
+ <h1 class="title">first post</h1>
+ <p class="subtitle"><strong>2026-04-16</strong></p>
+ <div class="post-content"><p>first post</p>
+</div>
+ </article>
+
+ </section>
+ </main>
+
+ <div class="kaomoji-sidebar kaomoji-right">
+ <div class="scroll-text" id="kaomoji-right"></div>
+ </div>
+ </div>
+
+ <script>
+ // Smooth scrolling for internal links
+ document.querySelectorAll('nav a').forEach(anchor => {
+ anchor.addEventListener('click', function (e) {
+ const href = this.getAttribute('href');
+ if (href && href.startsWith('#')) {
+ e.preventDefault();
+ document.querySelector(href).scrollIntoView({ behavior: 'smooth' });
+ }
+ });
+ });
+
+ // Fetch kaomoji text if available
+ fetch('https://taranathan.com/kaomoji.txt').then(r => { if (r.ok) return r.text(); }).then(data => {
+ if (data) {
+ const l = document.getElementById('kaomoji-left');
+ const rgt = document.getElementById('kaomoji-right');
+ if (l) l.textContent = data;
+ if (rgt) rgt.textContent = data;
+ }
+ }).catch(()=>{});
+ </script>
+</body>
+
+</html>
--- /dev/null
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="utf-8">
+ <title>Blog posts - MyBlog</title>
+ <link rel="icon" type="image/x-icon" href="https://taranathan.com/favicon.ico">
+ <link rel="stylesheet" href="https://taranathan.com/styles.css">
+</head>
+
+<body>
+ <div class="container">
+ <div class="kaomoji-sidebar kaomoji-left">
+ <div class="scroll-text" id="kaomoji-left"></div>
+ </div>
+
+ <main class="content">
+ <header class="header">
+ <h1 href="/">My Blog</h1>
+ <nav class="nav">
+ <a href="/">Home</a>
+ <a href="/blog">Blog</a>
+ <a href="/miniblog">Miniblog</a>
+ <a href="/boo" target="_blank">Fun</a>
+ </nav>
+ </header>
+
+ <section class="content-body">
+
+ <h2 class="section-title">Blog posts</h2>
+ <ul class="post-list">
+
+ <li class="post-list-item">
+ <a href="https://taranathan.com/blog/second/">second post</a>
+
+ </li>
+
+ <li class="post-list-item">
+ <a href="https://taranathan.com/blog/first/">first post</a>
+
+ </li>
+
+ </ul>
+
+ </section>
+ </main>
+
+ <div class="kaomoji-sidebar kaomoji-right">
+ <div class="scroll-text" id="kaomoji-right"></div>
+ </div>
+ </div>
+
+ <script>
+ // Smooth scrolling for internal links
+ document.querySelectorAll('nav a').forEach(anchor => {
+ anchor.addEventListener('click', function (e) {
+ const href = this.getAttribute('href');
+ if (href && href.startsWith('#')) {
+ e.preventDefault();
+ document.querySelector(href).scrollIntoView({ behavior: 'smooth' });
+ }
+ });
+ });
+
+ // Fetch kaomoji text if available
+ fetch('https://taranathan.com/kaomoji.txt').then(r => { if (r.ok) return r.text(); }).then(data => {
+ if (data) {
+ const l = document.getElementById('kaomoji-left');
+ const rgt = document.getElementById('kaomoji-right');
+ if (l) l.textContent = data;
+ if (rgt) rgt.textContent = data;
+ }
+ }).catch(()=>{});
+ </script>
+</body>
+
+</html>
--- /dev/null
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="utf-8">
+ <title>second post - MyBlog</title>
+ <link rel="icon" type="image/x-icon" href="https://taranathan.com/favicon.ico">
+ <link rel="stylesheet" href="https://taranathan.com/styles.css">
+</head>
+
+<body>
+ <div class="container">
+ <div class="kaomoji-sidebar kaomoji-left">
+ <div class="scroll-text" id="kaomoji-left"></div>
+ </div>
+
+ <main class="content">
+ <header class="header">
+ <h1 href="/">My Blog</h1>
+ <nav class="nav">
+ <a href="/">Home</a>
+ <a href="/blog">Blog</a>
+ <a href="/miniblog">Miniblog</a>
+ <a href="/boo" target="_blank">Fun</a>
+ </nav>
+ </header>
+
+ <section class="content-body">
+
+ <article class="post">
+ <h1 class="title">second post</h1>
+ <p class="subtitle"><strong>2026-06-01</strong></p>
+ <div class="post-content"><p>so, what does this mean?</p>
+</div>
+ </article>
+
+ </section>
+ </main>
+
+ <div class="kaomoji-sidebar kaomoji-right">
+ <div class="scroll-text" id="kaomoji-right"></div>
+ </div>
+ </div>
+
+ <script>
+ // Smooth scrolling for internal links
+ document.querySelectorAll('nav a').forEach(anchor => {
+ anchor.addEventListener('click', function (e) {
+ const href = this.getAttribute('href');
+ if (href && href.startsWith('#')) {
+ e.preventDefault();
+ document.querySelector(href).scrollIntoView({ behavior: 'smooth' });
+ }
+ });
+ });
+
+ // Fetch kaomoji text if available
+ fetch('https://taranathan.com/kaomoji.txt').then(r => { if (r.ok) return r.text(); }).then(data => {
+ if (data) {
+ const l = document.getElementById('kaomoji-left');
+ const rgt = document.getElementById('kaomoji-right');
+ if (l) l.textContent = data;
+ if (rgt) rgt.textContent = data;
+ }
+ }).catch(()=>{});
+ </script>
+</body>
+
+</html>
--- /dev/null
+<!DOCTYPE html>
+<html>
+
+<head>
+ <meta charset="UTF-8">
+ <title>moo</title>
+ <link rel="icon" type="image/x-icon" href="../images/favicon.ico">
+ <link rel="stylesheet" href="styles.css">
+
+</head>
+
+<body class="main">
+ <div class="container">
+ <h1>BOO</h1>
+ <p>I scared you</p>
+ </div>
+</body>
+
+</html>
\ No newline at end of file
--- /dev/null
+h1 {
+ font-family: Creepster;
+}
+
+p {
+ font-family: Dosis;
+}
+
+@font-face {
+ font-family: Creepster;
+ src: url(../fonts/Creepster/Creepster-Regular.ttf);
+}
+
+@font-face {
+ font-family: 'Dosis';
+ src: url('../fonts/Dosis/static/Dosis-Medium.ttf') format('truetype');
+}
+
+.container {
+ text-align: center;
+}
\ No newline at end of file
--- /dev/null
+Copyright (c) 2011, Font Diner, Inc (diner@fontdiner.com),\r
+with Reserved Font Names "Creepster"\r
+\r
+This Font Software is licensed under the SIL Open Font License, Version 1.1.\r
+This license is copied below, and is also available with a FAQ at:\r
+https://openfontlicense.org\r
+\r
+\r
+-----------------------------------------------------------\r
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007\r
+-----------------------------------------------------------\r
+\r
+PREAMBLE\r
+The goals of the Open Font License (OFL) are to stimulate worldwide\r
+development of collaborative font projects, to support the font creation\r
+efforts of academic and linguistic communities, and to provide a free and\r
+open framework in which fonts may be shared and improved in partnership\r
+with others.\r
+\r
+The OFL allows the licensed fonts to be used, studied, modified and\r
+redistributed freely as long as they are not sold by themselves. The\r
+fonts, including any derivative works, can be bundled, embedded, \r
+redistributed and/or sold with any software provided that any reserved\r
+names are not used by derivative works. The fonts and derivatives,\r
+however, cannot be released under any other type of license. The\r
+requirement for fonts to remain under this license does not apply\r
+to any document created using the fonts or their derivatives.\r
+\r
+DEFINITIONS\r
+"Font Software" refers to the set of files released by the Copyright\r
+Holder(s) under this license and clearly marked as such. This may\r
+include source files, build scripts and documentation.\r
+\r
+"Reserved Font Name" refers to any names specified as such after the\r
+copyright statement(s).\r
+\r
+"Original Version" refers to the collection of Font Software components as\r
+distributed by the Copyright Holder(s).\r
+\r
+"Modified Version" refers to any derivative made by adding to, deleting,\r
+or substituting -- in part or in whole -- any of the components of the\r
+Original Version, by changing formats or by porting the Font Software to a\r
+new environment.\r
+\r
+"Author" refers to any designer, engineer, programmer, technical\r
+writer or other person who contributed to the Font Software.\r
+\r
+PERMISSION & CONDITIONS\r
+Permission is hereby granted, free of charge, to any person obtaining\r
+a copy of the Font Software, to use, study, copy, merge, embed, modify,\r
+redistribute, and sell modified and unmodified copies of the Font\r
+Software, subject to the following conditions:\r
+\r
+1) Neither the Font Software nor any of its individual components,\r
+in Original or Modified Versions, may be sold by itself.\r
+\r
+2) Original or Modified Versions of the Font Software may be bundled,\r
+redistributed and/or sold with any software, provided that each copy\r
+contains the above copyright notice and this license. These can be\r
+included either as stand-alone text files, human-readable headers or\r
+in the appropriate machine-readable metadata fields within text or\r
+binary files as long as those fields can be easily viewed by the user.\r
+\r
+3) No Modified Version of the Font Software may use the Reserved Font\r
+Name(s) unless explicit written permission is granted by the corresponding\r
+Copyright Holder. This restriction only applies to the primary font name as\r
+presented to the users.\r
+\r
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font\r
+Software shall not be used to promote, endorse or advertise any\r
+Modified Version, except to acknowledge the contribution(s) of the\r
+Copyright Holder(s) and the Author(s) or with their explicit written\r
+permission.\r
+\r
+5) The Font Software, modified or unmodified, in part or in whole,\r
+must be distributed entirely under this license, and must not be\r
+distributed under any other license. The requirement for fonts to\r
+remain under this license does not apply to any document created\r
+using the Font Software.\r
+\r
+TERMINATION\r
+This license becomes null and void if any of the above conditions are\r
+not met.\r
+\r
+DISCLAIMER\r
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF\r
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT\r
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE\r
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\r
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL\r
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM\r
+OTHER DEALINGS IN THE FONT SOFTWARE.\r
--- /dev/null
+Copyright 2011 The Dosis Project Authors (https://github.com/googlefonts/dosis-vf)\r
+\r
+This Font Software is licensed under the SIL Open Font License, Version 1.1.\r
+This license is copied below, and is also available with a FAQ at:\r
+https://openfontlicense.org\r
+\r
+\r
+-----------------------------------------------------------\r
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007\r
+-----------------------------------------------------------\r
+\r
+PREAMBLE\r
+The goals of the Open Font License (OFL) are to stimulate worldwide\r
+development of collaborative font projects, to support the font creation\r
+efforts of academic and linguistic communities, and to provide a free and\r
+open framework in which fonts may be shared and improved in partnership\r
+with others.\r
+\r
+The OFL allows the licensed fonts to be used, studied, modified and\r
+redistributed freely as long as they are not sold by themselves. The\r
+fonts, including any derivative works, can be bundled, embedded, \r
+redistributed and/or sold with any software provided that any reserved\r
+names are not used by derivative works. The fonts and derivatives,\r
+however, cannot be released under any other type of license. The\r
+requirement for fonts to remain under this license does not apply\r
+to any document created using the fonts or their derivatives.\r
+\r
+DEFINITIONS\r
+"Font Software" refers to the set of files released by the Copyright\r
+Holder(s) under this license and clearly marked as such. This may\r
+include source files, build scripts and documentation.\r
+\r
+"Reserved Font Name" refers to any names specified as such after the\r
+copyright statement(s).\r
+\r
+"Original Version" refers to the collection of Font Software components as\r
+distributed by the Copyright Holder(s).\r
+\r
+"Modified Version" refers to any derivative made by adding to, deleting,\r
+or substituting -- in part or in whole -- any of the components of the\r
+Original Version, by changing formats or by porting the Font Software to a\r
+new environment.\r
+\r
+"Author" refers to any designer, engineer, programmer, technical\r
+writer or other person who contributed to the Font Software.\r
+\r
+PERMISSION & CONDITIONS\r
+Permission is hereby granted, free of charge, to any person obtaining\r
+a copy of the Font Software, to use, study, copy, merge, embed, modify,\r
+redistribute, and sell modified and unmodified copies of the Font\r
+Software, subject to the following conditions:\r
+\r
+1) Neither the Font Software nor any of its individual components,\r
+in Original or Modified Versions, may be sold by itself.\r
+\r
+2) Original or Modified Versions of the Font Software may be bundled,\r
+redistributed and/or sold with any software, provided that each copy\r
+contains the above copyright notice and this license. These can be\r
+included either as stand-alone text files, human-readable headers or\r
+in the appropriate machine-readable metadata fields within text or\r
+binary files as long as those fields can be easily viewed by the user.\r
+\r
+3) No Modified Version of the Font Software may use the Reserved Font\r
+Name(s) unless explicit written permission is granted by the corresponding\r
+Copyright Holder. This restriction only applies to the primary font name as\r
+presented to the users.\r
+\r
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font\r
+Software shall not be used to promote, endorse or advertise any\r
+Modified Version, except to acknowledge the contribution(s) of the\r
+Copyright Holder(s) and the Author(s) or with their explicit written\r
+permission.\r
+\r
+5) The Font Software, modified or unmodified, in part or in whole,\r
+must be distributed entirely under this license, and must not be\r
+distributed under any other license. The requirement for fonts to\r
+remain under this license does not apply to any document created\r
+using the Font Software.\r
+\r
+TERMINATION\r
+This license becomes null and void if any of the above conditions are\r
+not met.\r
+\r
+DISCLAIMER\r
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF\r
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT\r
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE\r
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\r
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL\r
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM\r
+OTHER DEALINGS IN THE FONT SOFTWARE.\r
--- /dev/null
+Dosis Variable Font
+===================
+
+This download contains Dosis as both a variable font and static fonts.
+
+Dosis is a variable font with this axis:
+ wght
+
+This means all the styles are contained in a single file:
+ Dosis-VariableFont_wght.ttf
+
+If your app fully supports variable fonts, you can now pick intermediate styles
+that aren’t available as static fonts. Not all apps support variable fonts, and
+in those cases you can use the static font files for Dosis:
+ static/Dosis-ExtraLight.ttf
+ static/Dosis-Light.ttf
+ static/Dosis-Regular.ttf
+ static/Dosis-Medium.ttf
+ static/Dosis-SemiBold.ttf
+ static/Dosis-Bold.ttf
+ static/Dosis-ExtraBold.ttf
+
+Get started
+-----------
+
+1. Install the font files you want to use
+
+2. Use your app's font picker to view the font family and all the
+available styles
+
+Learn more about variable fonts
+-------------------------------
+
+ https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts
+ https://variablefonts.typenetwork.com
+ https://medium.com/variable-fonts
+
+In desktop apps
+
+ https://theblog.adobe.com/can-variable-fonts-illustrator-cc
+ https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts
+
+Online
+
+ https://developers.google.com/fonts/docs/getting_started
+ https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide
+ https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts
+
+Installing fonts
+
+ MacOS: https://support.apple.com/en-us/HT201749
+ Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux
+ Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows
+
+Android Apps
+
+ https://developers.google.com/fonts/docs/android
+ https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts
+
+License
+-------
+Please read the full license text (OFL.txt) to understand the permissions,
+restrictions and requirements for usage, redistribution, and modification.
+
+You can use them in your products & projects – print or digital,
+commercial or otherwise.
+
+This isn't legal advice, please consider consulting a lawyer and see the full
+license for all details.
--- /dev/null
+Copyright 2024 The Funnel Project Authors (https://github.com/Dicotype/Funnel)\r
+\r
+This Font Software is licensed under the SIL Open Font License, Version 1.1.\r
+This license is copied below, and is also available with a FAQ at:\r
+https://openfontlicense.org\r
+\r
+\r
+-----------------------------------------------------------\r
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007\r
+-----------------------------------------------------------\r
+\r
+PREAMBLE\r
+The goals of the Open Font License (OFL) are to stimulate worldwide\r
+development of collaborative font projects, to support the font creation\r
+efforts of academic and linguistic communities, and to provide a free and\r
+open framework in which fonts may be shared and improved in partnership\r
+with others.\r
+\r
+The OFL allows the licensed fonts to be used, studied, modified and\r
+redistributed freely as long as they are not sold by themselves. The\r
+fonts, including any derivative works, can be bundled, embedded, \r
+redistributed and/or sold with any software provided that any reserved\r
+names are not used by derivative works. The fonts and derivatives,\r
+however, cannot be released under any other type of license. The\r
+requirement for fonts to remain under this license does not apply\r
+to any document created using the fonts or their derivatives.\r
+\r
+DEFINITIONS\r
+"Font Software" refers to the set of files released by the Copyright\r
+Holder(s) under this license and clearly marked as such. This may\r
+include source files, build scripts and documentation.\r
+\r
+"Reserved Font Name" refers to any names specified as such after the\r
+copyright statement(s).\r
+\r
+"Original Version" refers to the collection of Font Software components as\r
+distributed by the Copyright Holder(s).\r
+\r
+"Modified Version" refers to any derivative made by adding to, deleting,\r
+or substituting -- in part or in whole -- any of the components of the\r
+Original Version, by changing formats or by porting the Font Software to a\r
+new environment.\r
+\r
+"Author" refers to any designer, engineer, programmer, technical\r
+writer or other person who contributed to the Font Software.\r
+\r
+PERMISSION & CONDITIONS\r
+Permission is hereby granted, free of charge, to any person obtaining\r
+a copy of the Font Software, to use, study, copy, merge, embed, modify,\r
+redistribute, and sell modified and unmodified copies of the Font\r
+Software, subject to the following conditions:\r
+\r
+1) Neither the Font Software nor any of its individual components,\r
+in Original or Modified Versions, may be sold by itself.\r
+\r
+2) Original or Modified Versions of the Font Software may be bundled,\r
+redistributed and/or sold with any software, provided that each copy\r
+contains the above copyright notice and this license. These can be\r
+included either as stand-alone text files, human-readable headers or\r
+in the appropriate machine-readable metadata fields within text or\r
+binary files as long as those fields can be easily viewed by the user.\r
+\r
+3) No Modified Version of the Font Software may use the Reserved Font\r
+Name(s) unless explicit written permission is granted by the corresponding\r
+Copyright Holder. This restriction only applies to the primary font name as\r
+presented to the users.\r
+\r
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font\r
+Software shall not be used to promote, endorse or advertise any\r
+Modified Version, except to acknowledge the contribution(s) of the\r
+Copyright Holder(s) and the Author(s) or with their explicit written\r
+permission.\r
+\r
+5) The Font Software, modified or unmodified, in part or in whole,\r
+must be distributed entirely under this license, and must not be\r
+distributed under any other license. The requirement for fonts to\r
+remain under this license does not apply to any document created\r
+using the Font Software.\r
+\r
+TERMINATION\r
+This license becomes null and void if any of the above conditions are\r
+not met.\r
+\r
+DISCLAIMER\r
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF\r
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT\r
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE\r
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\r
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL\r
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM\r
+OTHER DEALINGS IN THE FONT SOFTWARE.\r
--- /dev/null
+Funnel Display Variable Font
+============================
+
+This download contains Funnel Display as both a variable font and static fonts.
+
+Funnel Display is a variable font with this axis:
+ wght
+
+This means all the styles are contained in a single file:
+ FunnelDisplay-VariableFont_wght.ttf
+
+If your app fully supports variable fonts, you can now pick intermediate styles
+that aren’t available as static fonts. Not all apps support variable fonts, and
+in those cases you can use the static font files for Funnel Display:
+ static/FunnelDisplay-Light.ttf
+ static/FunnelDisplay-Regular.ttf
+ static/FunnelDisplay-Medium.ttf
+ static/FunnelDisplay-SemiBold.ttf
+ static/FunnelDisplay-Bold.ttf
+ static/FunnelDisplay-ExtraBold.ttf
+
+Get started
+-----------
+
+1. Install the font files you want to use
+
+2. Use your app's font picker to view the font family and all the
+available styles
+
+Learn more about variable fonts
+-------------------------------
+
+ https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts
+ https://variablefonts.typenetwork.com
+ https://medium.com/variable-fonts
+
+In desktop apps
+
+ https://theblog.adobe.com/can-variable-fonts-illustrator-cc
+ https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts
+
+Online
+
+ https://developers.google.com/fonts/docs/getting_started
+ https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide
+ https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts
+
+Installing fonts
+
+ MacOS: https://support.apple.com/en-us/HT201749
+ Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux
+ Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows
+
+Android Apps
+
+ https://developers.google.com/fonts/docs/android
+ https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts
+
+License
+-------
+Please read the full license text (OFL.txt) to understand the permissions,
+restrictions and requirements for usage, redistribution, and modification.
+
+You can use them in your products & projects – print or digital,
+commercial or otherwise.
+
+This isn't legal advice, please consider consulting a lawyer and see the full
+license for all details.
--- /dev/null
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="UTF-8">
+ <title>moo</title>
+ <link rel="icon" type="image/x-icon" href="images/favicon.ico">
+ <link rel="stylesheet" href="styles.css">
+</head>
+
+<body>
+ <div class="container">
+ <div class="kaomoji-sidebar kaomoji-left">
+ <div class="scroll-text" id="kaomoji-left"></div>
+ </div>
+
+ <main class="content">
+ <header class="header">
+ <h1>Welcome to<br> this webpage...</h1>
+ <nav class="nav">
+ <a href="#about">About</a>
+ <a href="#projects">Projects</a>
+ <a href="#more">More</a>
+ <a href="boo" target="_blank">Fun</a>
+ <div class="prooject">
+ <a href="tictactoe" class="project-link">Project</a>
+ <p class="works">⬆ Kinda Works Now!</p>
+ </div>
+ </nav>
+ </header>
+
+ <section class="about-section" id="about">
+ <h2>About Me</h2>
+ <p>Hello! I like 'pooters and cats.</p>
+ </section>
+
+ <section class="project-section" id="projects">
+ <div>
+ <h2>Recent Project</h2>
+ <p>Look! I made a cute little lizard </p>
+ </div>
+ <img src="images/lizard.jpg" alt="2D computer animated lizard and snake" width=400 height=300>
+ <div class="decorations">
+ <div class="stronk">
+ <p>ᕙ( •̀ ᗜ •́ )ᕗ</p>
+ </div>
+ </div>
+ </section>
+
+ <section class="more-section" id="more">
+ <h2>More</h2>
+ <p>If you're here, you know me irl or are just wierd. Either way, what you lookin
+ at? 🤨
+ <br><br>also, this website is open source, so visit the github repo here:
+ </p>
+ <a href="https://github.com/moogoesmeow0/website" target="_blank"> link </a>
+ </section>
+
+ </main>
+
+ <div class="kaomoji-sidebar kaomoji-right">
+ <div class="scroll-text" id="kaomoji-right"></div>
+ </div>
+
+
+ </div>
+
+ <script>
+ // Add smooth scrolling for navigation links
+ document.querySelectorAll('nav a').forEach(anchor => {
+ anchor.addEventListener('click', function (e) {
+ const href = this.getAttribute('href');
+ if (href.startsWith('#')) {
+ // Smooth scroll for internal links
+ e.preventDefault();
+ document.querySelector(href).scrollIntoView({
+ behavior: 'smooth'
+ });
+ }
+ // Do nothing for external links, let the default behavior handle them
+ });
+ });
+
+ // Fetch kaomoji from the kaomoji.txt file and populate the scroll-text elements
+ fetch('kaomoji.txt')
+ .then(response => {
+ if (!response.ok) {
+ throw new Error('Could not fetch kaomoji.txt');
+ }
+ return response.text();
+ })
+ .then(data => {
+ document.getElementById('kaomoji-left').textContent = data;
+ document.getElementById('kaomoji-right').textContent = data;
+ })
+ .catch(error => {
+ console.error('Error fetching kaomoji:', error);
+ });
+
+ // Infinite scrolling animation restart
+ const scrollTexts = document.querySelectorAll('.scroll-text');
+ scrollTexts.forEach(text => {
+ text.addEventListener('animationend', () => {
+ text.style.animation = 'none';
+ text.offsetHeight;
+ text.style.animation = 'scroll 90s linear infinite';
+ });
+ });
+ </script>
+</body>
+
+</html>
+
--- /dev/null
+( ͡° ͜ʖ ͡°) (╯°□°)╯︵ ┻━┻ ༼ つ ◕_◕ ༽つ (☞゚ヮ゚)☞ ᕕ( ᐛ )ᕗ ლ(ಠ益ಠლ) (̿▀̿ ̿Ĺ̯̿̿▀̿ ̿) ლ,ᔑ•ﺪ͟͠•ᔐ. ᕦ(ò_óˇ) ¯\_(⊙︿⊙)_/¯ ლ(=ↀωↀ=)ლ ༼ ༎ຶ ෴ ༎ຶ༽ [̲̅$̲̅(̲̅ ͡° ͜ʖ ͡°̲̅)̲̅$̲̅] ( ͠≖ ͜ʖ͠≖) O(≧∇≦)O ≧(´▽`)≦ ༼ ºل͟º༼ ºل͟º༼ ºل͟º༼ ºل͟º ༽ºل͟º ༽ºل͟º ༽ºل͟º ༽ (∩ ͡° ͜ʖ ͡°)⊃━☆゚. * ・ 。゚, (╭☞´ิ∀´ิ)╭☞
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="utf-8">
+ <title>first mini - MyBlog</title>
+ <link rel="icon" type="image/x-icon" href="https://taranathan.com/favicon.ico">
+ <link rel="stylesheet" href="https://taranathan.com/styles.css">
+</head>
+
+<body>
+ <div class="container">
+ <div class="kaomoji-sidebar kaomoji-left">
+ <div class="scroll-text" id="kaomoji-left"></div>
+ </div>
+
+ <main class="content">
+ <header class="header">
+ <h1 href="/">My Blog</h1>
+ <nav class="nav">
+ <a href="/">Home</a>
+ <a href="/blog">Blog</a>
+ <a href="/miniblog">Miniblog</a>
+ <a href="/boo" target="_blank">Fun</a>
+ </nav>
+ </header>
+
+ <section class="content-body">
+
+ <article class="post miniblog-post">
+ <h1 class="title">first mini</h1>
+ <p class="subtitle"><strong>2026-04-16</strong></p>
+ <div class="post-content"><p>first mini post</p>
+</div>
+ </article>
+
+ </section>
+ </main>
+
+ <div class="kaomoji-sidebar kaomoji-right">
+ <div class="scroll-text" id="kaomoji-right"></div>
+ </div>
+ </div>
+
+ <script>
+ // Smooth scrolling for internal links
+ document.querySelectorAll('nav a').forEach(anchor => {
+ anchor.addEventListener('click', function (e) {
+ const href = this.getAttribute('href');
+ if (href && href.startsWith('#')) {
+ e.preventDefault();
+ document.querySelector(href).scrollIntoView({ behavior: 'smooth' });
+ }
+ });
+ });
+
+ // Fetch kaomoji text if available
+ fetch('https://taranathan.com/kaomoji.txt').then(r => { if (r.ok) return r.text(); }).then(data => {
+ if (data) {
+ const l = document.getElementById('kaomoji-left');
+ const rgt = document.getElementById('kaomoji-right');
+ if (l) l.textContent = data;
+ if (rgt) rgt.textContent = data;
+ }
+ }).catch(()=>{});
+ </script>
+</body>
+
+</html>
--- /dev/null
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="utf-8">
+ <title>Miniblog/journal posts - MyBlog</title>
+ <link rel="icon" type="image/x-icon" href="https://taranathan.com/favicon.ico">
+ <link rel="stylesheet" href="https://taranathan.com/styles.css">
+</head>
+
+<body>
+ <div class="container">
+ <div class="kaomoji-sidebar kaomoji-left">
+ <div class="scroll-text" id="kaomoji-left"></div>
+ </div>
+
+ <main class="content">
+ <header class="header">
+ <h1 href="/">My Blog</h1>
+ <nav class="nav">
+ <a href="/">Home</a>
+ <a href="/blog">Blog</a>
+ <a href="/miniblog">Miniblog</a>
+ <a href="/boo" target="_blank">Fun</a>
+ </nav>
+ </header>
+
+ <section class="content-body">
+
+ <h2 class="section-title">Miniblog/journal posts</h2>
+ <ul class="post-list">
+
+ <li class="post-list-item">
+ <a href="https://taranathan.com/miniblog/firstmini/">first mini</a>
+
+ </li>
+
+ </ul>
+
+ </section>
+ </main>
+
+ <div class="kaomoji-sidebar kaomoji-right">
+ <div class="scroll-text" id="kaomoji-right"></div>
+ </div>
+ </div>
+
+ <script>
+ // Smooth scrolling for internal links
+ document.querySelectorAll('nav a').forEach(anchor => {
+ anchor.addEventListener('click', function (e) {
+ const href = this.getAttribute('href');
+ if (href && href.startsWith('#')) {
+ e.preventDefault();
+ document.querySelector(href).scrollIntoView({ behavior: 'smooth' });
+ }
+ });
+ });
+
+ // Fetch kaomoji text if available
+ fetch('https://taranathan.com/kaomoji.txt').then(r => { if (r.ok) return r.text(); }).then(data => {
+ if (data) {
+ const l = document.getElementById('kaomoji-left');
+ const rgt = document.getElementById('kaomoji-right');
+ if (l) l.textContent = data;
+ if (rgt) rgt.textContent = data;
+ }
+ }).catch(()=>{});
+ </script>
+</body>
+
+</html>
--- /dev/null
+User-agent: *
+Disallow:
+Allow: /
+Sitemap: https://taranathan.com/sitemap.xml
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
+ <url>
+ <loc>https://taranathan.com/</loc>
+ </url>
+ <url>
+ <loc>https://taranathan.com/blog/</loc>
+ </url>
+ <url>
+ <loc>https://taranathan.com/blog/first/</loc>
+ <lastmod>2026-04-16</lastmod>
+ </url>
+ <url>
+ <loc>https://taranathan.com/blog/second/</loc>
+ <lastmod>2026-06-01</lastmod>
+ </url>
+ <url>
+ <loc>https://taranathan.com/miniblog/</loc>
+ </url>
+ <url>
+ <loc>https://taranathan.com/miniblog/firstmini/</loc>
+ <lastmod>2026-04-16</lastmod>
+ </url>
+</urlset>
--- /dev/null
+html{background-color:linen}*{margin:0;padding:0;box-sizing:border-box;border-radius:5%;background-color:linen}@font-face{font-family:"Funnel";src:url("fonts/Funnel_Display/static/FunnelDisplay-SemiBold.ttf") format("truetype")}@font-face{font-family:"BoldFunnel";src:url("fonts/Funnel_Display/static/FunnelDisplay-Bold.ttf") format("truetype")}@font-face{font-family:"Dosis";src:url("fonts/Dosis/static/Dosis-Medium.ttf") format("truetype")}h1,h2,h3,h4,h5,h6{font-family:Funnel,Arial}p,a{font-family:Dosis,Arial}body{min-height:100vh;overflow-x:hidden;background:linen;display:flex}.container{display:flex;width:100%;min-height:100vh;position:relative}.kaomoji-sidebar{position:fixed;top:0;height:100vh;width:60px;font-size:24px;display:flex;align-items:center;justify-content:center;background:linen;overflow:hidden;z-index:100}.kaomoji-sidebar .scroll-text{transform:rotate(.25turn);white-space:nowrap;animation:scroll 90s linear infinite}.kaomoji-left{left:0;border-right:1px solid #000}.kaomoji-right{right:0;border-left:1px solid #000}.kaomoji-right .scroll-text{transform:rotate(.5turn)}@keyframes scroll{0%{transform:rotate(90deg) translateX(-64%)}100%{transform:rotate(90deg) translateX(80%)}}.content{flex:1;margin:0 60px;padding:20px;width:calc(100% - 120px);max-width:1400px;margin-left:auto;margin-right:auto;position:relative}.section-container{position:relative;margin-bottom:40px}.header{position:relative;padding:40px;margin-left:40px;background:rgba(0,0,0,0);margin-bottom:40px}.header h1{font-family:BoldFunnel}.header .nav .prooject{text-size-adjust:.5}.header::after{content:"";position:absolute;bottom:-20px;left:-60px;width:calc(100% + 120px);height:2px;background:#000;transform:rotate(-3deg);transform-origin:center}.about-section{position:relative;padding:40px;background:rgba(0,0,0,0);margin-bottom:40px;margin-left:20px}.project-section{position:relative;padding:40px;background:linen;margin-bottom:40px;margin-left:20px;display:grid;grid-template-columns:1fr 1fr;gap:40px;align-items:center}.project-section::before{content:"";position:absolute;top:-20px;left:-60px;width:calc(100% + 120px);height:2px;background:#000;transform:rotate(3deg);transform-origin:center}.more-section{position:relative;padding:40px;margin-left:20px;background:linen}.more-section::before{content:"";position:absolute;top:-20px;left:-60px;width:calc(100% + 120px);height:2px;background:#000;transform:rotate(-5deg);transform-origin:center}.image-placeholder{border:3px dashed #000;border-radius:10px;height:300px;display:flex;align-items:center;justify-content:center;font-size:24px}nav{display:flex;gap:20px;margin-top:20px}nav a{color:#000;text-decoration:none;font-weight:bold}nav a:hover{text-decoration:underline}h1 a{color:#000;text-decoration:none}h1 a:hover{text-decoration:underline}h1{font-size:2.5em;margin-bottom:10px;color:#000}h2{font-size:2em;margin-bottom:20px;color:#000}p{font-size:1.1em;line-height:1.6;color:#000}.content-body,.post,.about-section,.project-section,.more-section{position:relative;padding:40px;margin-left:20px;background:rgba(0,0,0,0)}.section-title{font-size:2.1em;margin-bottom:24px}.post-list{list-style:none;display:flex;flex-direction:column;gap:24px}.post-list-item{position:relative;padding-bottom:20px}.post-list-item::after{content:"";position:absolute;left:0;right:0;bottom:0;height:1px;background:#000;transform:rotate(-1deg)}.post-list-item a{color:#000;text-decoration:none;font-size:1.3em}.post-list-item a:hover{text-decoration:underline}.post-excerpt,.post-content{margin-top:12px}.subtitle{margin-bottom:20px}.miniblog-post{padding-top:28px;padding-bottom:28px}@media (max-width: 768px){.project-section{grid-template-columns:1fr}.content-body,.post,.about-section,.project-section,.more-section{padding:24px}}.decorations .stronk{transform:rotate(6deg);text-align:center}.woah{transform:rotate(-8deg);text-align:middle;vertical-align:top;font-family:Arial,Helvetica,sans-serif}
\ No newline at end of file
--- /dev/null
+@import"https://fonts.googleapis.com/css2?family=Bebas+Neue&family=Offside&display=swap";:root{font-family:Inter,system-ui,Avenir,Helvetica,Arial,sans-serif;line-height:1.5;font-weight:400;color-scheme:light dark;color:#ffffffde;background-color:#242424;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a{font-weight:500;color:#646cff;text-decoration:inherit}a:hover{color:#535bf2}body{margin:0;display:flex;place-items:center;min-width:320px;min-height:100vh}h1{font-size:3.2em;line-height:1.1}.card{padding:2em}#app{max-width:1280px;margin:0 auto;padding:2rem;text-align:center}button{border-radius:8px;border:1px solid transparent;padding:.6em 1.2em;font-size:1em;font-weight:500;font-family:inherit;background-color:#1a1a1a;cursor:pointer;transition:border-color .25s}button:hover{border-color:#646cff}button:focus,button:focus-visible{outline:4px auto -webkit-focus-ring-color}@media (prefers-color-scheme: light){:root{color:#213547;background-color:#fff}a:hover{color:#747bff}button{background-color:#f9f9f9}}.boards-container.svelte-6ho771{margin:2rem auto;max-width:600px;padding:1rem}h2.svelte-6ho771{text-align:center;margin-bottom:1.5rem;font-family:Offside,sans-serif}.boards-list.svelte-6ho771{display:flex;flex-direction:column;gap:2rem}.board-item.svelte-6ho771{border:1px solid #ddd;border-radius:8px;padding:1rem;background-color:#f9f9f9}h3.svelte-6ho771{margin:0 0 .5rem;font-family:Offside,sans-serif}.timestamp.svelte-6ho771{font-size:.8rem;color:#666;margin-bottom:.5rem}.mini-grid.svelte-6ho771{display:grid;grid-template-columns:repeat(3,1fr);gap:2px;margin:0 auto;width:120px;height:120px}.mini-cell.svelte-6ho771{display:flex;align-items:center;justify-content:center;background-color:#fff;border:1px solid #ccc;height:100%;font-size:1.2rem;font-weight:700}.loading.svelte-6ho771,.error.svelte-6ho771,.no-boards.svelte-6ho771{text-align:center;padding:2rem;border:1px solid #ddd;border-radius:8px;background-color:#f9f9f9}.error.svelte-6ho771{color:#d32f2f;border-color:#ffcdd2;background-color:#ffebee}button.svelte-6ho771{padding:.5rem 1rem;margin:1rem auto;display:block;background-color:linen;border-radius:4px;cursor:pointer;font-family:Offside,sans-serif}button.svelte-6ho771:disabled{opacity:.5;cursor:not-allowed}.refresh-button.svelte-6ho771{margin-top:1.5rem}.pagination-controls.svelte-6ho771{display:flex;justify-content:center;align-items:center;margin-top:1.5rem;gap:1rem}.pagination-button.svelte-6ho771{margin:0}.page-info.svelte-6ho771{font-family:Offside,sans-serif}.button.svelte-bp979g{border-radius:.25rem;background-color:linen;margin:.5rem auto;font-family:Offside,sans-serif}.grid.svelte-cydwkz{display:grid;grid-template-columns:repeat(3,1fr);gap:.25rem;margin:1.25rem auto}.cell.svelte-cydwkz{display:flex;align-items:center;justify-content:center;width:6.25rem;height:6.25rem;border:1px solid black;font-size:1.5rem;cursor:pointer}.winner.svelte-cydwkz{text-align:center;margin-top:1.25rem;font-size:1.25rem}.button.svelte-cydwkz{margin-left:auto;margin-right:auto;margin-top:1.25rem;display:block;border-radius:.25rem;background-color:linen;margin:.5rem auto;font-family:Offside,sans-serif;cursor:pointer;padding:.5rem 1rem}.disconnect.svelte-cydwkz{background-color:#fdd}.controls.svelte-cydwkz{display:flex;flex-direction:column;align-items:center;margin-top:1rem}.connection-controls.svelte-cydwkz{display:flex;gap:.5rem;align-items:center;margin-top:.5rem}.connection-status.svelte-cydwkz{color:green;margin-top:.5rem;font-size:.9rem}.container.svelte-1448p0d{display:flex;justify-content:center;align-items:center;margin-top:2.5rem}.text.svelte-1448p0d{font-family:Offside,sans-serif;font-size:1.875rem;font-weight:600}
--- /dev/null
+(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const n of document.querySelectorAll('link[rel="modulepreload"]'))l(n);new MutationObserver(n=>{for(const a of n)if(a.type==="childList")for(const i of a.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&l(i)}).observe(document,{childList:!0,subtree:!0});function r(n){const a={};return n.integrity&&(a.integrity=n.integrity),n.referrerPolicy&&(a.referrerPolicy=n.referrerPolicy),n.crossOrigin==="use-credentials"?a.credentials="include":n.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function l(n){if(n.ep)return;n.ep=!0;const a=r(n);fetch(n.href,a)}})();const Pt=!1;var pt=Array.isArray,kr=Array.prototype.indexOf,ht=Array.from,xr=Object.defineProperty,xe=Object.getOwnPropertyDescriptor,Tr=Object.getOwnPropertyDescriptors,Nr=Object.prototype,Sr=Array.prototype,Wt=Object.getPrototypeOf;function Or(e){return e()}function ot(e){for(var t=0;t<e.length;t++)e[t]()}const j=2,Vt=4,Ae=8,gt=16,Q=32,Pe=64,He=128,U=256,je=512,I=1024,ee=2048,me=4096,X=8192,Ze=16384,Cr=32768,mt=65536,Ar=1<<19,zt=1<<20,Te=Symbol("$state");function Ht(e){return e===this.v}function Pr(e,t){return e!=e?t==t:e!==t||e!==null&&typeof e=="object"||typeof e=="function"}function jt(e){return!Pr(e,this.v)}function Dr(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function Ir(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function Rr(e){throw new Error("https://svelte.dev/e/effect_orphan")}function Lr(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function Fr(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function Mr(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function qr(){throw new Error("https://svelte.dev/e/state_unsafe_local_read")}function Br(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}let De=!1,Wr=!1;function Vr(){De=!0}const bt=1,yt=2,$t=4,zr=8,Hr=16,jr=1,$r=2,F=Symbol();function Ut(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}let S=null;function Dt(e){S=e}function wt(e,t=!1,r){S={p:S,c:null,e:null,m:!1,s:e,x:null,l:null},De&&!t&&(S.l={s:null,u:null,r1:[],r2:q(!1)})}function Et(e){const t=S;if(t!==null){const i=t.e;if(i!==null){var r=k,l=E;t.e=null;try{for(var n=0;n<i.length;n++){var a=i[n];fe(a.effect),se(a.reaction),tr(a.fn)}}finally{fe(r),se(l)}}S=t.p,t.m=!0}return{}}function Ie(){return!De||S!==null&&S.l===null}function q(e,t){var r={f:0,v:e,reactions:null,equals:Ht,rv:0,wv:0};return r}function Ee(e){return Gt(q(e))}function Yt(e,t=!1){var l;const r=q(e);return t||(r.equals=jt),De&&S!==null&&S.l!==null&&((l=S.l).s??(l.s=[])).push(r),r}function We(e,t=!1){return Gt(Yt(e,t))}function Gt(e){return E!==null&&!Z&&(E.f&j)!==0&&($===null?an([e]):$.push(e)),e}function Ur(e,t){return b(e,Le(()=>f(e))),t}function b(e,t){return E!==null&&!Z&&Ie()&&(E.f&(j|gt))!==0&&($===null||!$.includes(e))&&Br(),it(e,t)}function it(e,t){return e.equals(t)||(e.v,e.v=t,e.wv=fr(),Jt(e,ee),Ie()&&k!==null&&(k.f&I)!==0&&(k.f&(Q|Pe))===0&&(K===null?on([e]):K.push(e))),t}function Jt(e,t){var r=e.reactions;if(r!==null)for(var l=Ie(),n=r.length,a=0;a<n;a++){var i=r[a],s=i.f;(s&ee)===0&&(!l&&i===k||(Y(i,t),(s&(I|U))!==0&&((s&j)!==0?Jt(i,me):tt(i))))}}let Yr=!1;function le(e,t=null,r){if(typeof e!="object"||e===null||Te in e)return e;const l=Wt(e);if(l!==Nr&&l!==Sr)return e;var n=new Map,a=pt(e),i=q(0);a&&n.set("length",q(e.length));var s;return new Proxy(e,{defineProperty(c,u,v){(!("value"in v)||v.configurable===!1||v.enumerable===!1||v.writable===!1)&&Fr();var _=n.get(u);return _===void 0?(_=q(v.value),n.set(u,_)):b(_,le(v.value,s)),!0},deleteProperty(c,u){var v=n.get(u);if(v===void 0)u in c&&n.set(u,q(F));else{if(a&&typeof u=="string"){var _=n.get("length"),o=Number(u);Number.isInteger(o)&&o<_.v&&b(_,o)}b(v,F),It(i)}return!0},get(c,u,v){var p;if(u===Te)return e;var _=n.get(u),o=u in c;if(_===void 0&&(!o||(p=xe(c,u))!=null&&p.writable)&&(_=q(le(o?c[u]:F,s)),n.set(u,_)),_!==void 0){var d=f(_);return d===F?void 0:d}return Reflect.get(c,u,v)},getOwnPropertyDescriptor(c,u){var v=Reflect.getOwnPropertyDescriptor(c,u);if(v&&"value"in v){var _=n.get(u);_&&(v.value=f(_))}else if(v===void 0){var o=n.get(u),d=o==null?void 0:o.v;if(o!==void 0&&d!==F)return{enumerable:!0,configurable:!0,value:d,writable:!0}}return v},has(c,u){var d;if(u===Te)return!0;var v=n.get(u),_=v!==void 0&&v.v!==F||Reflect.has(c,u);if(v!==void 0||k!==null&&(!_||(d=xe(c,u))!=null&&d.writable)){v===void 0&&(v=q(_?le(c[u],s):F),n.set(u,v));var o=f(v);if(o===F)return!1}return _},set(c,u,v,_){var O;var o=n.get(u),d=u in c;if(a&&u==="length")for(var p=v;p<o.v;p+=1){var y=n.get(p+"");y!==void 0?b(y,F):p in c&&(y=q(F),n.set(p+"",y))}o===void 0?(!d||(O=xe(c,u))!=null&&O.writable)&&(o=q(void 0),b(o,le(v,s)),n.set(u,o)):(d=o.v!==F,b(o,le(v,s)));var x=Reflect.getOwnPropertyDescriptor(c,u);if(x!=null&&x.set&&x.set.call(_,v),!d){if(a&&typeof u=="string"){var N=n.get("length"),C=Number(u);Number.isInteger(C)&&C>=N.v&&b(N,C+1)}It(i)}return!0},ownKeys(c){f(i);var u=Reflect.ownKeys(c).filter(o=>{var d=n.get(o);return d===void 0||d.v!==F});for(var[v,_]of n)_.v!==F&&!(v in c)&&u.push(v);return u},setPrototypeOf(){Mr()}})}function It(e,t=1){b(e,e.v+t)}var Rt,Kt,Xt;function Gr(){if(Rt===void 0){Rt=window;var e=Element.prototype,t=Node.prototype;Kt=xe(t,"firstChild").get,Xt=xe(t,"nextSibling").get,e.__click=void 0,e.__className="",e.__attributes=null,e.__styles=null,e.__e=void 0,Text.prototype.__t=void 0}}function kt(e=""){return document.createTextNode(e)}function $e(e){return Kt.call(e)}function Qe(e){return Xt.call(e)}function B(e,t){return $e(e)}function J(e,t){{var r=$e(e);return r instanceof Comment&&r.data===""?Qe(r):r}}function P(e,t=1,r=!1){let l=e;for(;t--;)l=Qe(l);return l}function Jr(e){e.textContent=""}function xt(e){var t=j|ee,r=E!==null&&(E.f&j)!==0?E:null;return k===null||r!==null&&(r.f&U)!==0?t|=U:k.f|=zt,{ctx:S,deps:null,effects:null,equals:Ht,f:t,fn:e,reactions:null,rv:0,v:null,wv:0,parent:r??k}}function Kr(e){const t=xt(e);return t.equals=jt,t}function Zt(e){var t=e.effects;if(t!==null){e.effects=null;for(var r=0;r<t.length;r+=1)ue(t[r])}}function Xr(e){for(var t=e.parent;t!==null;){if((t.f&j)===0)return t;t=t.parent}return null}function Zr(e){var t,r=k;fe(Xr(e));try{Zt(e),t=vr(e)}finally{fe(r)}return t}function Qt(e){var t=Zr(e),r=(ie||(e.f&U)!==0)&&e.deps!==null?me:I;Y(e,r),e.equals(t)||(e.v=t,e.wv=fr())}function er(e){k===null&&E===null&&Rr(),E!==null&&(E.f&U)!==0&&k===null&&Ir(),St&&Dr()}function Qr(e,t){var r=t.last;r===null?t.last=t.first=e:(r.next=e,e.prev=r,t.last=e)}function be(e,t,r,l=!0){var n=(e&Pe)!==0,a=k,i={ctx:S,deps:null,nodes_start:null,nodes_end:null,f:e|ee,first:null,fn:t,last:null,next:null,parent:n?null:a,prev:null,teardown:null,transitions:null,wv:0};if(r){var s=ge;try{Lt(!0),Ot(i),i.f|=Cr}catch(v){throw ue(i),v}finally{Lt(s)}}else t!==null&&tt(i);var c=r&&i.deps===null&&i.first===null&&i.nodes_start===null&&i.teardown===null&&(i.f&(zt|He))===0;if(!c&&!n&&l&&(a!==null&&Qr(i,a),E!==null&&(E.f&j)!==0)){var u=E;(u.effects??(u.effects=[])).push(i)}return i}function en(e){const t=be(Ae,null,!1);return Y(t,I),t.teardown=e,t}function ut(e){er();var t=k!==null&&(k.f&Q)!==0&&S!==null&&!S.m;if(t){var r=S;(r.e??(r.e=[])).push({fn:e,effect:k,reaction:E})}else{var l=tr(e);return l}}function tn(e){return er(),rr(e)}function rn(e){const t=be(Pe,e,!0);return(r={})=>new Promise(l=>{r.outro?Ue(t,()=>{ue(t),l(void 0)}):(ue(t),l(void 0))})}function tr(e){return be(Vt,e,!1)}function rr(e){return be(Ae,e,!0)}function ae(e,t=[],r=xt){const l=t.map(r);return Tt(()=>e(...l.map(f)))}function Tt(e,t=0){return be(Ae|gt|t,e,!0)}function Ce(e,t=!0){return be(Ae|Q,e,!0,t)}function nr(e){var t=e.teardown;if(t!==null){const r=St,l=E;Ft(!0),se(null);try{t.call(null)}finally{Ft(r),se(l)}}}function lr(e,t=!1){var r=e.first;for(e.first=e.last=null;r!==null;){var l=r.next;ue(r,t),r=l}}function nn(e){for(var t=e.first;t!==null;){var r=t.next;(t.f&Q)===0&&ue(t),t=r}}function ue(e,t=!0){var r=!1;if((t||(e.f&Ar)!==0)&&e.nodes_start!==null){for(var l=e.nodes_start,n=e.nodes_end;l!==null;){var a=l===n?null:Qe(l);l.remove(),l=a}r=!0}lr(e,t&&!r),Xe(e,0),Y(e,Ze);var i=e.transitions;if(i!==null)for(const c of i)c.stop();nr(e);var s=e.parent;s!==null&&s.first!==null&&ar(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes_start=e.nodes_end=null}function ar(e){var t=e.parent,r=e.prev,l=e.next;r!==null&&(r.next=l),l!==null&&(l.prev=r),t!==null&&(t.first===e&&(t.first=l),t.last===e&&(t.last=r))}function Ue(e,t){var r=[];Nt(e,r,!0),or(r,()=>{ue(e),t&&t()})}function or(e,t){var r=e.length;if(r>0){var l=()=>--r||t();for(var n of e)n.out(l)}else t()}function Nt(e,t,r){if((e.f&X)===0){if(e.f^=X,e.transitions!==null)for(const i of e.transitions)(i.is_global||r)&&t.push(i);for(var l=e.first;l!==null;){var n=l.next,a=(l.f&mt)!==0||(l.f&Q)!==0;Nt(l,t,a?r:!1),l=n}}}function Ye(e){ir(e,!0)}function ir(e,t){if((e.f&X)!==0){e.f^=X,(e.f&I)===0&&(e.f^=I),Re(e)&&(Y(e,ee),tt(e));for(var r=e.first;r!==null;){var l=r.next,n=(r.f&mt)!==0||(r.f&Q)!==0;ir(r,n?t:!1),r=l}if(e.transitions!==null)for(const a of e.transitions)(a.is_global||t)&&a.in()}}let st=!1,ft=[];function ln(){st=!1;const e=ft.slice();ft=[],ot(e)}function ur(e){st||(st=!0,queueMicrotask(ln)),ft.push(e)}let Ve=!1,Ge=!1,Je=null,ge=!1,St=!1;function Lt(e){ge=e}function Ft(e){St=e}let ct=[],Ne=0;let E=null,Z=!1;function se(e){E=e}let k=null;function fe(e){k=e}let $=null;function an(e){$=e}let D=null,M=0,K=null;function on(e){K=e}let sr=1,Ke=0,ie=!1;function fr(){return++sr}function Re(e){var u;var t=e.f;if((t&ee)!==0)return!0;if((t&me)!==0){var r=e.deps,l=(t&U)!==0;if(r!==null){var n,a,i=(t&je)!==0,s=l&&k!==null&&!ie,c=r.length;if(i||s){for(n=0;n<c;n++)a=r[n],(i||!((u=a==null?void 0:a.reactions)!=null&&u.includes(e)))&&(a.reactions??(a.reactions=[])).push(e);i&&(e.f^=je)}for(n=0;n<c;n++)if(a=r[n],Re(a)&&Qt(a),a.wv>e.wv)return!0}(!l||k!==null&&!ie)&&Y(e,I)}return!1}function un(e,t){for(var r=t;r!==null;){if((r.f&He)!==0)try{r.fn(e);return}catch{r.f^=He}r=r.parent}throw Ve=!1,e}function sn(e){return(e.f&Ze)===0&&(e.parent===null||(e.parent.f&He)===0)}function et(e,t,r,l){if(Ve){if(r===null&&(Ve=!1),sn(t))throw e;return}r!==null&&(Ve=!0);{un(e,t);return}}function cr(e,t,r=0){var l=e.reactions;if(l!==null)for(var n=0;n<l.length;n++){var a=l[n];(a.f&j)!==0?cr(a,t,r+1):t===a&&(r===0?Y(a,ee):(a.f&I)!==0&&Y(a,me),tt(a))}}function vr(e){var d;var t=D,r=M,l=K,n=E,a=ie,i=$,s=S,c=Z,u=e.f;D=null,M=0,K=null,E=(u&(Q|Pe))===0?e:null,ie=(u&U)!==0&&(!ge||n===null||c),$=null,Dt(e.ctx),Z=!1,Ke++;try{var v=(0,e.fn)(),_=e.deps;if(D!==null){var o;if(Xe(e,M),_!==null&&M>0)for(_.length=M+D.length,o=0;o<D.length;o++)_[M+o]=D[o];else e.deps=_=D;if(!ie)for(o=M;o<_.length;o++)((d=_[o]).reactions??(d.reactions=[])).push(e)}else _!==null&&M<_.length&&(Xe(e,M),_.length=M);if(Ie()&&K!==null&&(e.f&(j|me|ee))===0)for(o=0;o<K.length;o++)cr(K[o],e);return n!==null&&Ke++,v}finally{D=t,M=r,K=l,E=n,ie=a,$=i,Dt(s),Z=c}}function fn(e,t){let r=t.reactions;if(r!==null){var l=kr.call(r,e);if(l!==-1){var n=r.length-1;n===0?r=t.reactions=null:(r[l]=r[n],r.pop())}}r===null&&(t.f&j)!==0&&(D===null||!D.includes(t))&&(Y(t,me),(t.f&(U|je))===0&&(t.f^=je),Zt(t),Xe(t,0))}function Xe(e,t){var r=e.deps;if(r!==null)for(var l=t;l<r.length;l++)fn(e,r[l])}function Ot(e){var t=e.f;if((t&Ze)===0){Y(e,I);var r=k,l=S;k=e;try{(t>)!==0?nn(e):lr(e),nr(e);var n=vr(e);e.teardown=typeof n=="function"?n:null,e.wv=sr;var a=e.deps,i;Pt&&Wr&&e.f&ee}catch(s){et(s,e,r,l||e.ctx)}finally{k=r}}}function cn(){if(Ne>1e3){Ne=0;try{Lr()}catch(e){if(Je!==null)et(e,Je,null);else throw e}}Ne++}function vn(e){var t=e.length;if(t!==0){cn();var r=ge;ge=!0;try{for(var l=0;l<t;l++){var n=e[l];(n.f&I)===0&&(n.f^=I);var a=[];_r(n,a),_n(a)}}finally{ge=r}}}function _n(e){var t=e.length;if(t!==0)for(var r=0;r<t;r++){var l=e[r];if((l.f&(Ze|X))===0)try{Re(l)&&(Ot(l),l.deps===null&&l.first===null&&l.nodes_start===null&&(l.teardown===null?ar(l):l.fn=null))}catch(n){et(n,l,null,l.ctx)}}}function dn(){if(Ge=!1,Ne>1001)return;const e=ct;ct=[],vn(e),Ge||(Ne=0,Je=null)}function tt(e){Ge||(Ge=!0,queueMicrotask(dn)),Je=e;for(var t=e;t.parent!==null;){t=t.parent;var r=t.f;if((r&(Pe|Q))!==0){if((r&I)===0)return;t.f^=I}}ct.push(t)}function _r(e,t){var r=e.first,l=[];e:for(;r!==null;){var n=r.f,a=(n&Q)!==0,i=a&&(n&I)!==0,s=r.next;if(!i&&(n&X)===0)if((n&Ae)!==0){if(a)r.f^=I;else{var c=E;try{E=r,Re(r)&&Ot(r)}catch(o){et(o,r,null,r.ctx)}finally{E=c}}var u=r.first;if(u!==null){r=u;continue}}else(n&Vt)!==0&&l.push(r);if(s===null){let o=r.parent;for(;o!==null;){if(e===o)break e;var v=o.next;if(v!==null){r=v;continue e}o=o.parent}}r=s}for(var _=0;_<l.length;_++)u=l[_],t.push(u),_r(u,t)}function f(e){var t=e.f,r=(t&j)!==0;if(E!==null&&!Z){$!==null&&$.includes(e)&&qr();var l=E.deps;e.rv<Ke&&(e.rv=Ke,D===null&&l!==null&&l[M]===e?M++:D===null?D=[e]:(!ie||!D.includes(e))&&D.push(e))}else if(r&&e.deps===null&&e.effects===null){var n=e,a=n.parent;a!==null&&(a.f&U)===0&&(n.f^=U)}return r&&(n=e,Re(n)&&Qt(n)),e.v}function Le(e){var t=Z;try{return Z=!0,e()}finally{Z=t}}const pn=-7169;function Y(e,t){e.f=e.f&pn|t}function hn(e){if(!(typeof e!="object"||!e||e instanceof EventTarget)){if(Te in e)vt(e);else if(!Array.isArray(e))for(let t in e){const r=e[t];typeof r=="object"&&r&&Te in r&&vt(r)}}}function vt(e,t=new Set){if(typeof e=="object"&&e!==null&&!(e instanceof EventTarget)&&!t.has(e)){t.add(e),e instanceof Date&&e.getTime();for(let l in e)try{vt(e[l],t)}catch{}const r=Wt(e);if(r!==Object.prototype&&r!==Array.prototype&&r!==Map.prototype&&r!==Set.prototype&&r!==Date.prototype){const l=Tr(r);for(let n in l){const a=l[n].get;if(a)try{a.call(e)}catch{}}}}}const gn=["touchstart","touchmove"];function mn(e){return gn.includes(e)}let Mt=!1;function bn(){Mt||(Mt=!0,document.addEventListener("reset",e=>{Promise.resolve().then(()=>{var t;if(!e.defaultPrevented)for(const r of e.target.elements)(t=r.__on_r)==null||t.call(r)})},{capture:!0}))}function dr(e){var t=E,r=k;se(null),fe(null);try{return e()}finally{se(t),fe(r)}}function yn(e,t,r,l=r){e.addEventListener(t,()=>dr(r));const n=e.__on_r;n?e.__on_r=()=>{n(),l(!0)}:e.__on_r=()=>l(!0),bn()}const pr=new Set,_t=new Set;function wn(e,t,r,l={}){function n(a){if(l.capture||ke.call(t,a),!a.cancelBubble)return dr(()=>r==null?void 0:r.call(this,a))}return e.startsWith("pointer")||e.startsWith("touch")||e==="wheel"?ur(()=>{t.addEventListener(e,n,l)}):t.addEventListener(e,n,l),n}function pe(e,t,r,l,n){var a={capture:l,passive:n},i=wn(e,t,r,a);(t===document.body||t===window||t===document)&&en(()=>{t.removeEventListener(e,i,a)})}function hr(e){for(var t=0;t<e.length;t++)pr.add(e[t]);for(var r of _t)r(e)}function ke(e){var C;var t=this,r=t.ownerDocument,l=e.type,n=((C=e.composedPath)==null?void 0:C.call(e))||[],a=n[0]||e.target,i=0,s=e.__root;if(s){var c=n.indexOf(s);if(c!==-1&&(t===document||t===window)){e.__root=t;return}var u=n.indexOf(t);if(u===-1)return;c<=u&&(i=c)}if(a=n[i]||e.target,a!==t){xr(e,"currentTarget",{configurable:!0,get(){return a||r}});var v=E,_=k;se(null),fe(null);try{for(var o,d=[];a!==null;){var p=a.assignedSlot||a.parentNode||a.host||null;try{var y=a["__"+l];if(y!==void 0&&!a.disabled)if(pt(y)){var[x,...N]=y;x.apply(a,[e,...N])}else y.call(a,e)}catch(O){o?d.push(O):o=O}if(e.cancelBubble||p===t||p===null)break;a=p}if(o){for(let O of d)queueMicrotask(()=>{throw O});throw o}}finally{e.__root=t,delete e.currentTarget,se(v),fe(_)}}}function En(e){var t=document.createElement("template");return t.innerHTML=e,t.content}function dt(e,t){var r=k;r.nodes_start===null&&(r.nodes_start=e,r.nodes_end=t)}function R(e,t){var r=(t&jr)!==0,l=(t&$r)!==0,n,a=!e.startsWith("<!>");return()=>{n===void 0&&(n=En(a?e:"<!>"+e),r||(n=$e(n)));var i=l?document.importNode(n,!0):n.cloneNode(!0);if(r){var s=$e(i),c=i.lastChild;dt(s,c)}else dt(i,i);return i}}function ze(){var e=document.createDocumentFragment(),t=document.createComment(""),r=kt();return e.append(t,r),dt(t,r),e}function A(e,t){e!==null&&e.before(t)}function oe(e,t){var r=t==null?"":typeof t=="object"?t+"":t;r!==(e.__t??(e.__t=e.nodeValue))&&(e.__t=r,e.nodeValue=r+"")}function kn(e,t){return xn(e,t)}const he=new Map;function xn(e,{target:t,anchor:r,props:l={},events:n,context:a,intro:i=!0}){Gr();var s=new Set,c=_=>{for(var o=0;o<_.length;o++){var d=_[o];if(!s.has(d)){s.add(d);var p=mn(d);t.addEventListener(d,ke,{passive:p});var y=he.get(d);y===void 0?(document.addEventListener(d,ke,{passive:p}),he.set(d,1)):he.set(d,y+1)}}};c(ht(pr)),_t.add(c);var u=void 0,v=rn(()=>{var _=r??t.appendChild(kt());return Ce(()=>{if(a){wt({});var o=S;o.c=a}n&&(l.$$events=n),u=e(_,l)||{},a&&Et()}),()=>{var p;for(var o of s){t.removeEventListener(o,ke);var d=he.get(o);--d===0?(document.removeEventListener(o,ke),he.delete(o)):he.set(o,d)}_t.delete(c),_!==r&&((p=_.parentNode)==null||p.removeChild(_))}});return Tn.set(u,v),u}let Tn=new WeakMap;function de(e,t,r=!1){var l=e,n=null,a=null,i=F,s=r?mt:0,c=!1;const u=(_,o=!0)=>{c=!0,v(o,_)},v=(_,o)=>{i!==(i=_)&&(i?(n?Ye(n):o&&(n=Ce(()=>o(l))),a&&Ue(a,()=>{a=null})):(a?Ye(a):o&&(a=Ce(()=>o(l))),n&&Ue(n,()=>{n=null})))};Tt(()=>{c=!1,t(u),c||v(null,null)},s)}function Se(e,t){return t}function Nn(e,t,r,l){for(var n=[],a=t.length,i=0;i<a;i++)Nt(t[i].e,n,!0);var s=a>0&&n.length===0&&r!==null;if(s){var c=r.parentNode;Jr(c),c.append(r),l.clear(),ne(e,t[0].prev,t[a-1].next)}or(n,()=>{for(var u=0;u<a;u++){var v=t[u];s||(l.delete(v.k),ne(e,v.prev,v.next)),ue(v.e,!s)}})}function Oe(e,t,r,l,n,a=null){var i=e,s={items:new Map,first:null},c=(t&$t)!==0;if(c){var u=e;i=u.appendChild(kt())}var v=null,_=!1,o=Kr(()=>{var d=r();return pt(d)?d:d==null?[]:ht(d)});Tt(()=>{var d=f(o),p=d.length;_&&p===0||(_=p===0,Sn(d,s,i,n,t,l,r),a!==null&&(p===0?v?Ye(v):v=Ce(()=>a(i)):v!==null&&Ue(v,()=>{v=null})),f(o))})}function Sn(e,t,r,l,n,a,i){var h,T,ce,ve;var s=(n&zr)!==0,c=(n&(bt|yt))!==0,u=e.length,v=t.items,_=t.first,o=_,d,p=null,y,x=[],N=[],C,O,g,w;if(s)for(w=0;w<u;w+=1)C=e[w],O=a(C,w),g=v.get(O),g!==void 0&&((h=g.a)==null||h.measure(),(y??(y=new Set)).add(g));for(w=0;w<u;w+=1){if(C=e[w],O=a(C,w),g=v.get(O),g===void 0){var G=o?o.e.nodes_start:r;p=Cn(G,t,p,p===null?t.first:p.next,C,O,w,l,n,i),v.set(O,p),x=[],N=[],o=p.next;continue}if(c&&On(g,C,w,n),(g.e.f&X)!==0&&(Ye(g.e),s&&((T=g.a)==null||T.unfix(),(y??(y=new Set)).delete(g))),g!==o){if(d!==void 0&&d.has(g)){if(x.length<N.length){var V=N[0],L;p=V.prev;var z=x[0],H=x[x.length-1];for(L=0;L<x.length;L+=1)qt(x[L],V,r);for(L=0;L<N.length;L+=1)d.delete(N[L]);ne(t,z.prev,H.next),ne(t,p,z),ne(t,H,V),o=V,p=H,w-=1,x=[],N=[]}else d.delete(g),qt(g,o,r),ne(t,g.prev,g.next),ne(t,g,p===null?t.first:p.next),ne(t,p,g),p=g;continue}for(x=[],N=[];o!==null&&o.k!==O;)(o.e.f&X)===0&&(d??(d=new Set)).add(o),N.push(o),o=o.next;if(o===null)continue;g=o}x.push(g),p=g,o=g.next}if(o!==null||d!==void 0){for(var W=d===void 0?[]:ht(d);o!==null;)(o.e.f&X)===0&&W.push(o),o=o.next;var te=W.length;if(te>0){var m=(n&$t)!==0&&u===0?r:null;if(s){for(w=0;w<te;w+=1)(ce=W[w].a)==null||ce.measure();for(w=0;w<te;w+=1)(ve=W[w].a)==null||ve.fix()}Nn(t,W,m,v)}}s&&ur(()=>{var re;if(y!==void 0)for(g of y)(re=g.a)==null||re.apply()}),k.first=t.first&&t.first.e,k.last=p&&p.e}function On(e,t,r,l){(l&bt)!==0&&it(e.v,t),(l&yt)!==0?it(e.i,r):e.i=r}function Cn(e,t,r,l,n,a,i,s,c,u){var v=(c&bt)!==0,_=(c&Hr)===0,o=v?_?Yt(n):q(n):n,d=(c&yt)===0?i:q(i),p={i:d,v:o,k:a,a:null,e:null,prev:r,next:l};try{return p.e=Ce(()=>s(e,o,d,u),Yr),p.e.prev=r&&r.e,p.e.next=l&&l.e,r===null?t.first=p:(r.next=p,r.e.next=p.e),l!==null&&(l.prev=p,l.e.prev=p.e),p}finally{}}function qt(e,t,r){for(var l=e.next?e.next.e.nodes_start:r,n=t?t.e.nodes_start:r,a=e.e.nodes_start;a!==l;){var i=Qe(a);n.before(a),a=i}}function ne(e,t,r){t===null?e.first=r:(t.next=r,t.e.next=r&&r.e),r!==null&&(r.prev=t,r.e.prev=t&&t.e)}function An(e,t,r=t){var l=Ie();yn(e,"input",n=>{var a=n?e.defaultValue:e.value;if(a=lt(e)?at(a):a,r(a),l&&a!==(a=t())){var i=e.selectionStart,s=e.selectionEnd;e.value=a??"",s!==null&&(e.selectionStart=i,e.selectionEnd=Math.min(s,e.value.length))}}),Le(t)==null&&e.value&&r(lt(e)?at(e.value):e.value),rr(()=>{var n=t();lt(e)&&n===at(e.value)||e.type==="date"&&!n&&!e.value||n!==e.value&&(e.value=n??"")})}function lt(e){var t=e.type;return t==="number"||t==="range"}function at(e){return e===""?null:+e}function Pn(e=!1){const t=S,r=t.l.u;if(!r)return;let l=()=>hn(t.s);if(e){let n=0,a={};const i=xt(()=>{let s=!1;const c=t.s;for(const u in c)c[u]!==a[u]&&(a[u]=c[u],s=!0);return s&&n++,n});l=()=>f(i)}r.b.length&&tn(()=>{Bt(t,l),ot(r.b)}),ut(()=>{const n=Le(()=>r.m.map(Or));return()=>{for(const a of n)typeof a=="function"&&a()}}),r.a.length&&ut(()=>{Bt(t,l),ot(r.a)})}function Bt(e,t){if(e.l.s)for(const r of e.l.s)f(r);t()}function gr(e){S===null&&Ut(),De&&S.l!==null?In(S).m.push(e):ut(()=>{const t=Le(e);if(typeof t=="function")return t})}function Dn(e){S===null&&Ut(),gr(()=>()=>Le(e))}function In(e){var t=e.l;return t.u??(t.u={a:[],b:[],m:[]})}const Rn="5";typeof window<"u"&&(window.__svelte||(window.__svelte={v:new Set})).v.add(Rn);Vr();function Ln(e,t,r,l,n){f(t)*r<f(l)&&(b(t,f(t)+1),n())}function Fn(e,t,r){f(t)>1&&(b(t,f(t)-1),r())}var Mn=R('<div class="loading svelte-6ho771">Loading recent games...</div>'),qn=R('<div class="error svelte-6ho771"> </div> <button class="svelte-6ho771">Try Again</button>',1),Bn=R('<div class="no-boards svelte-6ho771">No games found</div> <button class="refresh-button svelte-6ho771">Refresh</button>',1),Wn=R('<div class="timestamp svelte-6ho771"> </div>'),Vn=R('<div class="mini-cell svelte-6ho771"> </div>'),zn=R('<div class="board-item svelte-6ho771"><h3 class="svelte-6ho771"> </h3> <!> <div class="mini-grid svelte-6ho771"></div></div>'),Hn=R('<button class="refresh-button svelte-6ho771">Refresh</button> <div class="boards-list svelte-6ho771"></div> <div class="pagination-controls svelte-6ho771"><button class="pagination-button svelte-6ho771">Previous</button> <span class="page-info svelte-6ho771"> </span> <button class="pagination-button svelte-6ho771">Next</button></div>',1),jn=R('<div class="boards-container svelte-6ho771"><h2 class="svelte-6ho771">Recent Games</h2> <!></div>');function $n(e,t){wt(t,!0);let r=Ee(le([])),l=Ee(!0),n=Ee(null),a=Ee(0),i=[],s=Ee(1);const c=5;async function u(){try{b(l,!0),b(n,null),i=(await(await fetch("https://api.taranathan.com/boards")).json()).rows.map(N=>({id:N.id.toString(),board:N.board,timestamp:N.date})),i.sort((N,C)=>{const O=N.timestamp?new Date(N.timestamp).getTime():0;return(C.timestamp?new Date(C.timestamp).getTime():0)-O}),b(a,le(i.length)),console.log("totalBoards:",f(a)),v(),b(n,null)}catch(y){console.error("Error fetching boards:",y),b(n,"Failed to fetch boards. Please try again later.")}finally{b(l,!1)}}function v(){b(r,le(i.slice((f(s)-1)*c,f(s)*c)))}gr(u);var _=jn(),o=P(B(_),2);{var d=y=>{var x=Mn();A(y,x)},p=y=>{var x=ze(),N=J(x);{var C=g=>{var w=qn(),G=J(w),V=B(G),L=P(G,2);L.__click=u,ae(()=>oe(V,`Error: ${f(n)??""}`)),A(g,w)},O=g=>{var w=ze(),G=J(w);{var V=z=>{var H=Bn(),W=P(J(H),2);W.__click=u,A(z,H)},L=z=>{var H=Hn(),W=J(H);W.__click=u;var te=P(W,2);Oe(te,21,()=>f(r),Se,(re,ye,Fe)=>{var _e=zn(),Me=B(_e),rt=B(Me),Ct=P(Me,2);{var mr=we=>{var qe=Wn(),Be=B(qe);ae(nt=>oe(Be,nt),[()=>new Date(f(ye).timestamp).toLocaleString()]),A(we,qe)};de(Ct,we=>{f(ye).timestamp&&we(mr)})}var br=P(Ct,2);Oe(br,21,()=>f(ye).board,Se,(we,qe)=>{var Be=ze(),nt=J(Be);Oe(nt,17,()=>f(qe),Se,(yr,wr)=>{var At=Vn(),Er=B(At);ae(()=>oe(Er,f(wr)||" ")),A(yr,At)}),A(we,Be)}),ae(()=>oe(rt,`Game ${(f(s)-1)*c+Fe+1}`)),A(re,_e)});var m=P(te,2),h=B(m);h.__click=[Fn,s,v];var T=P(h,2),ce=B(T),ve=P(T,2);ve.__click=[Ln,s,c,a,v],ae(re=>{h.disabled=f(s)===1,oe(ce,`Page ${f(s)??""} of ${re??""}`),ve.disabled=f(s)*c>=f(a)},[()=>Math.ceil(f(a)/c)]),A(z,H)};de(G,z=>{f(r).length===0?z(V):z(L,!1)},!0)}A(g,w)};de(N,g=>{f(n)?g(C):g(O,!1)},!0)}A(y,x)};de(o,y=>{f(l)?y(d):y(p,!1)})}A(e,_),Et()}hr(["click"]);hr(["click"]);var Un=R('<div class="cell svelte-cydwkz" role="button" tabindex="0"> </div>'),Yn=R('<div class="winner svelte-cydwkz"> </div>'),Gn=R('<button class="button svelte-cydwkz">Connect Live</button>'),Jn=R('<button class="button disconnect svelte-cydwkz">Disconnect</button>'),Kn=R('<div class="connection-status svelte-cydwkz"> </div>'),Xn=R('<div class="grid svelte-cydwkz"></div> <!> <div class="controls svelte-cydwkz"><button class="button svelte-cydwkz">Reset Game</button> <button class="button svelte-cydwkz">Upload</button> <div class="connection-controls svelte-cydwkz"><input type="text" placeholder="Board ID"> <!></div> <!></div>',1);function Zn(e,t){wt(t,!1);let r=We([["","",""],["","",""],["","",""]]),l="X",n=We(null),a=!1,i=We(""),s=null,c=We(!1);function u(){for(let h=0;h<3;h++)if(f(r)[h][0]!==""&&f(r)[h][0]===f(r)[h][1]&&f(r)[h][0]===f(r)[h][2])return b(n,f(r)[h][0]),!0;for(let h=0;h<3;h++)if(f(r)[0][h]!==""&&f(r)[0][h]===f(r)[1][h]&&f(r)[0][h]===f(r)[2][h])return b(n,f(r)[0][h]),!0;if(f(r)[0][0]!==""&&f(r)[0][0]===f(r)[1][1]&&f(r)[0][0]===f(r)[2][2])return b(n,f(r)[0][0]),!0;if(f(r)[0][2]!==""&&f(r)[0][2]===f(r)[1][1]&&f(r)[0][2]===f(r)[2][0])return b(n,f(r)[0][2]),!0;let m=!0;for(let h=0;h<3;h++){for(let T=0;T<3;T++)if(f(r)[h][T]===""){m=!1;break}if(!m)break}return m?(b(n,"Tie"),!0):!1}function v(m,h){if(!(f(r)[m][h]!==""||a)){if(Ur(r,f(r)[m][h]=l),b(r,[...f(r)]),s&&s.readyState===WebSocket.OPEN&&s&&s.send(JSON.stringify({type:"update_board",boardId:parseInt(f(i)),board:f(r)})),u()){a=!0;return}l=l==="X"?"O":"X"}}function _(){b(r,[["","",""],["","",""],["","",""]]),l="X",b(n,null),a=!1,s&&s.readyState===WebSocket.OPEN&&f(i)&&s.send(JSON.stringify({type:"update_board",boardId:parseInt(f(i)),board:f(r)}))}async function o(){await fetch("https://api.taranathan.com/boards",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({board:f(r)})})}function d(){s&&(s.close(),s=null,b(c,!1))}async function p(){s&&d();try{const m=parseInt(f(i));if(isNaN(m)){alert("Please enter a valid board ID");return}s=new WebSocket(`http://api.taranathan.com/ws/board/${m}`),s.onopen=()=>{console.log("Connected to WebSocket"),b(c,!0),s&&s.send(JSON.stringify({type:"get_board",boardId:m}))},s.onmessage=h=>{const T=JSON.parse(h.data);console.log("Received message:",T),T.type==="board_data"&&T.data&&T.data.length>0?b(r,T.data[0].board):T.type==="board_updated"&&T.data&&T.data.length>0&&(b(r,T.data[0].board),u()&&(a=!0))},s.onerror=h=>{console.error("WebSocket error:",h),alert("Error connecting to game"),b(c,!1)},s.onclose=()=>{console.log("WebSocket connection closed"),b(c,!1)}}catch(m){console.error("Connection error:",m),alert("Failed to connect to game")}}Dn(()=>{s&&s.close()}),Pn();var y=Xn(),x=J(y);Oe(x,5,()=>f(r),Se,(m,h,T)=>{var ce=ze(),ve=J(ce);Oe(ve,1,()=>f(h),Se,(re,ye,Fe)=>{var _e=Un(),Me=B(_e);ae(()=>oe(Me,f(ye))),pe("click",_e,()=>v(T,Fe)),pe("keydown",_e,rt=>rt.key==="Enter"&&v(T,Fe)),A(re,_e)}),A(m,ce)});var N=P(x,2);{var C=m=>{var h=Yn(),T=B(h);ae(()=>oe(T,`Winner: ${f(n)??""}`)),A(m,h)};de(N,m=>{f(n)&&m(C)})}var O=P(N,2),g=B(O),w=P(g,2),G=P(w,2),V=B(G),L=P(V,2);{var z=m=>{var h=Gn();pe("click",h,()=>p()),A(m,h)},H=m=>{var h=Jn();pe("click",h,()=>d()),A(m,h)};de(L,m=>{f(c)?m(H,!1):m(z)})}var W=P(G,2);{var te=m=>{var h=Kn(),T=B(h);ae(()=>oe(T,`Connected to game ${f(i)??""}`)),A(m,h)};de(W,m=>{f(c)&&m(te)})}pe("click",g,()=>_()),pe("click",w,()=>o()),An(V,()=>f(i),m=>b(i,m)),A(e,y),Et()}var Qn=R('<div class="container svelte-1448p0d"><p class="text svelte-1448p0d">Have Fun!</p></div> <!> <!>',1);function el(e){var t=Qn(),r=P(J(t),2);Zn(r,{});var l=P(r,2);$n(l,{}),A(e,t)}kn(el,{target:document.getElementById("app")});
--- /dev/null
+<!doctype html>
+<html lang="en">
+ <head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <title>TicTacToe!</title>
+ <script type="module" crossorigin src="/tictactoe/assets/index-CK5hwdVk.js"></script>
+ <link rel="stylesheet" crossorigin href="/tictactoe/assets/index-B3qe7Ptg.css">
+ </head>
+ <body>
+ <div id="app"></div>
+ </body>
+</html>