diff --git a/.github/workflows/hugo.yaml b/.github/workflows/hugo.yaml
new file mode 100644
index 0000000..d950648
--- /dev/null
+++ b/.github/workflows/hugo.yaml
@@ -0,0 +1,78 @@
+# Sample workflow for building and deploying a Hugo site to GitHub Pages
+name: Deploy Hugo site to Pages
+
+on:
+ # Runs on pushes targeting the default branch
+ push:
+ branches:
+ - main
+
+ # Allows you to run this workflow manually from the Actions tab
+ workflow_dispatch:
+
+# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+
+# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
+# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
+concurrency:
+ group: "pages"
+ cancel-in-progress: false
+
+# Default to bash
+defaults:
+ run:
+ shell: bash
+
+jobs:
+ # Build job
+ build:
+ runs-on: ubuntu-latest
+ env:
+ HUGO_VERSION: 0.124.0
+ steps:
+ - name: Install Hugo CLI
+ run: |
+ wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \
+ && sudo dpkg -i ${{ runner.temp }}/hugo.deb
+ - name: Install Dart Sass
+ run: sudo snap install dart-sass
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ submodules: recursive
+ fetch-depth: 0
+ - name: Setup Pages
+ id: pages
+ uses: actions/configure-pages@v4
+ - name: Install Node.js dependencies
+ run: "[[ -f package-lock.json || -f npm-shrinkwrap.json ]] && npm ci || true"
+ - name: Build with Hugo
+ env:
+ # For maximum backward compatibility with Hugo modules
+ HUGO_ENVIRONMENT: production
+ HUGO_ENV: production
+ run: |
+ hugo \
+ --gc \
+ --minify \
+ --baseURL "${{ steps.pages.outputs.base_url }}/"
+ - name: Upload artifact
+ uses: actions/upload-pages-artifact@v3
+ with:
+ path: ./public
+
+ # Deployment job
+ deploy:
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ runs-on: ubuntu-latest
+ needs: build
+ steps:
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v4
\ No newline at end of file
diff --git a/.hugo_build.lock b/.hugo_build.lock
new file mode 100644
index 0000000..e69de29
diff --git a/README.md b/OLD/README.md
similarity index 100%
rename from README.md
rename to OLD/README.md
diff --git a/community.html b/OLD/community.html
similarity index 100%
rename from community.html
rename to OLD/community.html
diff --git a/index.html b/OLD/index.html
similarity index 100%
rename from index.html
rename to OLD/index.html
diff --git a/servers.html b/OLD/servers.html
similarity index 100%
rename from servers.html
rename to OLD/servers.html
diff --git a/submissions/404-page-art/sketch1613828200299.png b/OLD/submissions/404-page-art/sketch1613828200299.png
similarity index 100%
rename from submissions/404-page-art/sketch1613828200299.png
rename to OLD/submissions/404-page-art/sketch1613828200299.png
diff --git a/archetypes/default.md b/archetypes/default.md
new file mode 100644
index 0000000..c6f3fce
--- /dev/null
+++ b/archetypes/default.md
@@ -0,0 +1,5 @@
++++
+title = '{{ replace .File.ContentBaseName "-" " " | title }}'
+date = {{ .Date }}
+draft = true
++++
diff --git a/content/_index.md b/content/_index.md
new file mode 100644
index 0000000..581a7f0
--- /dev/null
+++ b/content/_index.md
@@ -0,0 +1,8 @@
++++
+date = 2024-04-19T06:32:18+07:00
+draft = true
++++
+
+# Welcome to MediaPlay!
+
+*This website is rebuilt with Hugo. Stay tuned for more updates!*
\ No newline at end of file
diff --git a/content/blog/welcome-to-the-mediaplay-blog.md b/content/blog/welcome-to-the-mediaplay-blog.md
new file mode 100644
index 0000000..2df69fc
--- /dev/null
+++ b/content/blog/welcome-to-the-mediaplay-blog.md
@@ -0,0 +1,8 @@
++++
+title = 'Welcome to the MediaPlay blog!'
+date = 2024-04-19T06:44:53+07:00
+author = 'Linerly'
+discord = '@linerly'
++++
+
+This will be the place where MediaPlay members can write their own article in here! It used to be separated from the main site, but with Hugo, it's all in one place now.
\ No newline at end of file
diff --git a/content/community.md b/content/community.md
new file mode 100644
index 0000000..27d9a7b
--- /dev/null
+++ b/content/community.md
@@ -0,0 +1,12 @@
++++
+title = 'Community'
+date = 2024-04-19T06:36:53+07:00
++++
+
+*If you're new to here, welcome! 👋*
+
+MediaPlay is a gaming and chatting lounge community created by TechNewVideo—also known as Techy—to bring people all around the world in this community and keep us connected in this world as possible.
+
+We create projects to help us and other people who is interested in the community to create things together.
+
+We welcome all people from different kinds of backgrounds no matter how different and unique they are. 🙂
\ No newline at end of file
diff --git a/css/main.css b/css/main.css
deleted file mode 100644
index 311fd1b..0000000
--- a/css/main.css
+++ /dev/null
@@ -1,24 +0,0 @@
-/* montserrat-regular - latin */
-@font-face {
- font-family: "Montserrat", sans-serif;
- font-style: normal;
- font-weight: 400;
- src: local(""),
- url("/assets/fonts/montserrat-v18-latin-regular.woff2") format("woff2"),
- /* Chrome 26+, Opera 23+, Firefox 39+ */
- url("/assets/fonts/montserrat-v18-latin-regular.woff") format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
-}
-
-iframe {
- display: block;
- margin: 0 auto;
- border: 0;
-}
-
-hr {
- border: 4px solid #009ed8;
- border-radius: 8px;
- width: 75%;
- text-align: center;
- margin: auto;
-}
\ No newline at end of file
diff --git a/hugo.toml b/hugo.toml
new file mode 100644
index 0000000..8ac2094
--- /dev/null
+++ b/hugo.toml
@@ -0,0 +1,5 @@
+baseURL = 'https://mediaplay-discord.github.io/'
+languageCode = 'en-us'
+title = 'MediaPlay'
+disableKinds = ["taxonomy", "term"]
+summaryLength = 12
\ No newline at end of file
diff --git a/404.html b/layouts/_default/404.html
similarity index 92%
rename from 404.html
rename to layouts/_default/404.html
index 53d78ea..2c715fd 100755
--- a/404.html
+++ b/layouts/_default/404.html
@@ -15,7 +15,7 @@
-
around 1 minute · published on 2024-04-19 · 33 words
+
+
+
+
This will be the place where MediaPlay members can write their own article in here! It used to be separated from the main site, but with Hugo, it’s all in one place now.
around 1 minute · published on 2024-04-19 · 76 words
+
+
+
+
If you’re new to here, welcome! 👋
+
MediaPlay is a gaming and chatting lounge community created by TechNewVideo—also known as Techy—to bring people all around the world in this community and keep us connected in this world as possible.
+
We create projects to help us and other people who is interested in the community to create things together.
+
We welcome all people from different kinds of backgrounds no matter how different and unique they are. 🙂
+
+
+
+
+
+
+
+
+
+
diff --git a/public/css/main.css b/public/css/main.css
new file mode 100644
index 0000000..887b8f7
--- /dev/null
+++ b/public/css/main.css
@@ -0,0 +1,105 @@
+/* figtree-regular - latin */
+@font-face {
+ font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
+ font-family: 'Figtree';
+ font-style: normal;
+ font-weight: 400;
+ src: url('../fonts/figtree-v5-latin-regular.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
+}
+
+/* figtree-italic - latin */
+@font-face {
+ font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
+ font-family: 'Figtree';
+ font-style: italic;
+ font-weight: 400;
+ src: url('../fonts/figtree-v5-latin-italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
+}
+
+/* figtree-700 - latin */
+@font-face {
+ font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
+ font-family: 'Figtree';
+ font-style: normal;
+ font-weight: 700;
+ src: url('../fonts/figtree-v5-latin-700.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
+}
+
+/* figtree-700italic - latin */
+@font-face {
+ font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
+ font-family: 'Figtree';
+ font-style: italic;
+ font-weight: 700;
+ src: url('../fonts/figtree-v5-latin-700italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
+}
+
+/* jetbrains-mono-regular - latin */
+@font-face {
+ font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
+ font-family: 'JetBrains Mono';
+ font-style: normal;
+ font-weight: 400;
+ src: url('../fonts/jetbrains-mono-v18-latin-regular.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
+}
+
+/* jetbrains-mono-italic - latin */
+@font-face {
+ font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
+ font-family: 'JetBrains Mono';
+ font-style: italic;
+ font-weight: 400;
+ src: url('../fonts/jetbrains-mono-v18-latin-italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
+}
+
+/* jetbrains-mono-700 - latin */
+@font-face {
+ font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
+ font-family: 'JetBrains Mono';
+ font-style: normal;
+ font-weight: 700;
+ src: url('../fonts/jetbrains-mono-v18-latin-700.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
+}
+
+/* jetbrains-mono-700italic - latin */
+@font-face {
+ font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
+ font-family: 'JetBrains Mono';
+ font-style: italic;
+ font-weight: 700;
+ src: url('../fonts/jetbrains-mono-v18-latin-700italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
+}
+
+body {
+ font-family: "Figtree", sans-serif;
+ margin: 0;
+ padding: 0;
+ /* background-color: #00b0f0; */
+ background: #111742;
+}
+
+code {
+ font-family: "JetBrains Mono", monospace;
+}
+
+p, h1, h2, h3, h4, h5, h6 {
+ color: #9fcedf;
+}
+
+p {
+ font-size: 16pt;
+}
+
+iframe {
+ display: block;
+ margin: 0 auto;
+ border: 0;
+}
+
+hr {
+ border: 4px solid #005777;
+ border-radius: 8px;
+ width: 75%;
+ text-align: center;
+ margin: auto;
+}
\ No newline at end of file
diff --git a/css/navbar.css b/public/css/navbar.css
similarity index 93%
rename from css/navbar.css
rename to public/css/navbar.css
index 7876be4..c48c692 100644
--- a/css/navbar.css
+++ b/public/css/navbar.css
@@ -5,16 +5,10 @@
-webkit-box-sizing: border-box;
}
-body {
- font-family: "Montserrat", sans-serif;
- margin: 0;
- padding: 0;
- background-color: #00b0f0;
-}
-
.container {
height: 105px;
- background-color: #0d1347;
+ background: rgb(13,19,71);
+ background: linear-gradient(180deg, rgba(13,19,71,1) 0%, rgba(17,23,66,1) 100%);
display: -webkit-box;
display: -ms-flexbox;
display: flex;
@@ -24,9 +18,9 @@ body {
-ms-flex-align: center;
align-items: center;
overflow: hidden;
- -webkit-box-shadow: 0px 15px 30px 0px rgba(0,0,0,0.5);
+ /* -webkit-box-shadow: 0px 15px 30px 0px rgba(0,0,0,0.5);
-moz-box-shadow: 0px 15px 30px 0px rgba(0,0,0,0.5);
- box-shadow: 0px 15px 30px 0px rgba(0,0,0,0.5);
+ box-shadow: 0px 15px 30px 0px rgba(0,0,0,0.5); */
position: -webkit-sticky;
position: sticky;
top: 0;
diff --git a/css/scrollBar.css b/public/css/scrollBar.css
similarity index 100%
rename from css/scrollBar.css
rename to public/css/scrollBar.css
diff --git a/css/slideshow.css b/public/css/slideshow.css
similarity index 100%
rename from css/slideshow.css
rename to public/css/slideshow.css
diff --git a/public/fonts/figtree-v5-latin-700.woff2 b/public/fonts/figtree-v5-latin-700.woff2
new file mode 100644
index 0000000..6039759
Binary files /dev/null and b/public/fonts/figtree-v5-latin-700.woff2 differ
diff --git a/public/fonts/figtree-v5-latin-700italic.woff2 b/public/fonts/figtree-v5-latin-700italic.woff2
new file mode 100644
index 0000000..8e16837
Binary files /dev/null and b/public/fonts/figtree-v5-latin-700italic.woff2 differ
diff --git a/public/fonts/figtree-v5-latin-italic.woff2 b/public/fonts/figtree-v5-latin-italic.woff2
new file mode 100644
index 0000000..36378a6
Binary files /dev/null and b/public/fonts/figtree-v5-latin-italic.woff2 differ
diff --git a/public/fonts/figtree-v5-latin-regular.woff2 b/public/fonts/figtree-v5-latin-regular.woff2
new file mode 100644
index 0000000..c359928
Binary files /dev/null and b/public/fonts/figtree-v5-latin-regular.woff2 differ
diff --git a/public/fonts/jetbrains-mono-v18-latin-700.woff2 b/public/fonts/jetbrains-mono-v18-latin-700.woff2
new file mode 100644
index 0000000..7080d06
Binary files /dev/null and b/public/fonts/jetbrains-mono-v18-latin-700.woff2 differ
diff --git a/public/fonts/jetbrains-mono-v18-latin-700italic.woff2 b/public/fonts/jetbrains-mono-v18-latin-700italic.woff2
new file mode 100644
index 0000000..edfd8cc
Binary files /dev/null and b/public/fonts/jetbrains-mono-v18-latin-700italic.woff2 differ
diff --git a/public/fonts/jetbrains-mono-v18-latin-italic.woff2 b/public/fonts/jetbrains-mono-v18-latin-italic.woff2
new file mode 100644
index 0000000..ddecc6a
Binary files /dev/null and b/public/fonts/jetbrains-mono-v18-latin-italic.woff2 differ
diff --git a/public/fonts/jetbrains-mono-v18-latin-regular.woff2 b/public/fonts/jetbrains-mono-v18-latin-regular.woff2
new file mode 100644
index 0000000..c3f046f
Binary files /dev/null and b/public/fonts/jetbrains-mono-v18-latin-regular.woff2 differ
diff --git a/assets/fonts/montserrat-v18-latin/montserrat-v18-latin-regular.woff b/public/fonts/montserrat-v18-latin-regular.woff
similarity index 100%
rename from assets/fonts/montserrat-v18-latin/montserrat-v18-latin-regular.woff
rename to public/fonts/montserrat-v18-latin-regular.woff
diff --git a/assets/fonts/montserrat-v18-latin/montserrat-v18-latin-regular.woff2 b/public/fonts/montserrat-v18-latin-regular.woff2
similarity index 100%
rename from assets/fonts/montserrat-v18-latin/montserrat-v18-latin-regular.woff2
rename to public/fonts/montserrat-v18-latin-regular.woff2
diff --git a/assets/icons/apple-icon-180.png b/public/icons/apple-icon-180.png
similarity index 100%
rename from assets/icons/apple-icon-180.png
rename to public/icons/apple-icon-180.png
diff --git a/assets/icons/apple-splash-1125-2436.jpg b/public/icons/apple-splash-1125-2436.jpg
similarity index 100%
rename from assets/icons/apple-splash-1125-2436.jpg
rename to public/icons/apple-splash-1125-2436.jpg
diff --git a/assets/icons/apple-splash-1136-640.jpg b/public/icons/apple-splash-1136-640.jpg
similarity index 100%
rename from assets/icons/apple-splash-1136-640.jpg
rename to public/icons/apple-splash-1136-640.jpg
diff --git a/assets/icons/apple-splash-1170-2532.jpg b/public/icons/apple-splash-1170-2532.jpg
similarity index 100%
rename from assets/icons/apple-splash-1170-2532.jpg
rename to public/icons/apple-splash-1170-2532.jpg
diff --git a/assets/icons/apple-splash-1242-2208.jpg b/public/icons/apple-splash-1242-2208.jpg
similarity index 100%
rename from assets/icons/apple-splash-1242-2208.jpg
rename to public/icons/apple-splash-1242-2208.jpg
diff --git a/assets/icons/apple-splash-1242-2688.jpg b/public/icons/apple-splash-1242-2688.jpg
similarity index 100%
rename from assets/icons/apple-splash-1242-2688.jpg
rename to public/icons/apple-splash-1242-2688.jpg
diff --git a/assets/icons/apple-splash-1284-2778.jpg b/public/icons/apple-splash-1284-2778.jpg
similarity index 100%
rename from assets/icons/apple-splash-1284-2778.jpg
rename to public/icons/apple-splash-1284-2778.jpg
diff --git a/assets/icons/apple-splash-1334-750.jpg b/public/icons/apple-splash-1334-750.jpg
similarity index 100%
rename from assets/icons/apple-splash-1334-750.jpg
rename to public/icons/apple-splash-1334-750.jpg
diff --git a/assets/icons/apple-splash-1536-2048.jpg b/public/icons/apple-splash-1536-2048.jpg
similarity index 100%
rename from assets/icons/apple-splash-1536-2048.jpg
rename to public/icons/apple-splash-1536-2048.jpg
diff --git a/assets/icons/apple-splash-1620-2160.jpg b/public/icons/apple-splash-1620-2160.jpg
similarity index 100%
rename from assets/icons/apple-splash-1620-2160.jpg
rename to public/icons/apple-splash-1620-2160.jpg
diff --git a/assets/icons/apple-splash-1668-2224.jpg b/public/icons/apple-splash-1668-2224.jpg
similarity index 100%
rename from assets/icons/apple-splash-1668-2224.jpg
rename to public/icons/apple-splash-1668-2224.jpg
diff --git a/assets/icons/apple-splash-1668-2388.jpg b/public/icons/apple-splash-1668-2388.jpg
similarity index 100%
rename from assets/icons/apple-splash-1668-2388.jpg
rename to public/icons/apple-splash-1668-2388.jpg
diff --git a/assets/icons/apple-splash-1792-828.jpg b/public/icons/apple-splash-1792-828.jpg
similarity index 100%
rename from assets/icons/apple-splash-1792-828.jpg
rename to public/icons/apple-splash-1792-828.jpg
diff --git a/assets/icons/apple-splash-2048-1536.jpg b/public/icons/apple-splash-2048-1536.jpg
similarity index 100%
rename from assets/icons/apple-splash-2048-1536.jpg
rename to public/icons/apple-splash-2048-1536.jpg
diff --git a/assets/icons/apple-splash-2048-2732.jpg b/public/icons/apple-splash-2048-2732.jpg
similarity index 100%
rename from assets/icons/apple-splash-2048-2732.jpg
rename to public/icons/apple-splash-2048-2732.jpg
diff --git a/assets/icons/apple-splash-2160-1620.jpg b/public/icons/apple-splash-2160-1620.jpg
similarity index 100%
rename from assets/icons/apple-splash-2160-1620.jpg
rename to public/icons/apple-splash-2160-1620.jpg
diff --git a/assets/icons/apple-splash-2208-1242.jpg b/public/icons/apple-splash-2208-1242.jpg
similarity index 100%
rename from assets/icons/apple-splash-2208-1242.jpg
rename to public/icons/apple-splash-2208-1242.jpg
diff --git a/assets/icons/apple-splash-2224-1668.jpg b/public/icons/apple-splash-2224-1668.jpg
similarity index 100%
rename from assets/icons/apple-splash-2224-1668.jpg
rename to public/icons/apple-splash-2224-1668.jpg
diff --git a/assets/icons/apple-splash-2388-1668.jpg b/public/icons/apple-splash-2388-1668.jpg
similarity index 100%
rename from assets/icons/apple-splash-2388-1668.jpg
rename to public/icons/apple-splash-2388-1668.jpg
diff --git a/assets/icons/apple-splash-2436-1125.jpg b/public/icons/apple-splash-2436-1125.jpg
similarity index 100%
rename from assets/icons/apple-splash-2436-1125.jpg
rename to public/icons/apple-splash-2436-1125.jpg
diff --git a/assets/icons/apple-splash-2532-1170.jpg b/public/icons/apple-splash-2532-1170.jpg
similarity index 100%
rename from assets/icons/apple-splash-2532-1170.jpg
rename to public/icons/apple-splash-2532-1170.jpg
diff --git a/assets/icons/apple-splash-2688-1242.jpg b/public/icons/apple-splash-2688-1242.jpg
similarity index 100%
rename from assets/icons/apple-splash-2688-1242.jpg
rename to public/icons/apple-splash-2688-1242.jpg
diff --git a/assets/icons/apple-splash-2732-2048.jpg b/public/icons/apple-splash-2732-2048.jpg
similarity index 100%
rename from assets/icons/apple-splash-2732-2048.jpg
rename to public/icons/apple-splash-2732-2048.jpg
diff --git a/assets/icons/apple-splash-2778-1284.jpg b/public/icons/apple-splash-2778-1284.jpg
similarity index 100%
rename from assets/icons/apple-splash-2778-1284.jpg
rename to public/icons/apple-splash-2778-1284.jpg
diff --git a/assets/icons/apple-splash-640-1136.jpg b/public/icons/apple-splash-640-1136.jpg
similarity index 100%
rename from assets/icons/apple-splash-640-1136.jpg
rename to public/icons/apple-splash-640-1136.jpg
diff --git a/assets/icons/apple-splash-750-1334.jpg b/public/icons/apple-splash-750-1334.jpg
similarity index 100%
rename from assets/icons/apple-splash-750-1334.jpg
rename to public/icons/apple-splash-750-1334.jpg
diff --git a/assets/icons/apple-splash-828-1792.jpg b/public/icons/apple-splash-828-1792.jpg
similarity index 100%
rename from assets/icons/apple-splash-828-1792.jpg
rename to public/icons/apple-splash-828-1792.jpg
diff --git a/assets/icons/manifest-icon-192.png b/public/icons/manifest-icon-192.png
similarity index 100%
rename from assets/icons/manifest-icon-192.png
rename to public/icons/manifest-icon-192.png
diff --git a/assets/icons/manifest-icon-512.png b/public/icons/manifest-icon-512.png
similarity index 100%
rename from assets/icons/manifest-icon-512.png
rename to public/icons/manifest-icon-512.png
diff --git a/public/index.html b/public/index.html
new file mode 100644
index 0000000..ce162b3
--- /dev/null
+++ b/public/index.html
@@ -0,0 +1,374 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ MediaPlay
+
+
+
+
+
+
+
+
+
+
+
+
+
+ MPD NVO-18 Family — TechNewVideo's 18th Birthday!
+
+
+
+
+
+
MPD Family 5 - Exclusive
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Welcome to MediaPlay!
+
This website is rebuilt with Hugo. Stay tuned for more updates!
+
+
+
+
+
+
+
+
+
+
diff --git a/public/index.xml b/public/index.xml
new file mode 100644
index 0000000..769a241
--- /dev/null
+++ b/public/index.xml
@@ -0,0 +1,26 @@
+
+
+
+ MediaPlay
+ http://localhost:1313/
+ Recent content on MediaPlay
+ Hugo -- gohugo.io
+ en-us
+ Fri, 19 Apr 2024 06:44:53 +0700
+
+
+ Welcome to the MediaPlay blog!
+ http://localhost:1313/blog/welcome-to-the-mediaplay-blog/
+ Fri, 19 Apr 2024 06:44:53 +0700
+ http://localhost:1313/blog/welcome-to-the-mediaplay-blog/
+ This will be the place where MediaPlay members can write their own article in here!
+
+
+ Community
+ http://localhost:1313/community/
+ Fri, 19 Apr 2024 06:36:53 +0700
+ http://localhost:1313/community/
+ If you’re new to here, welcome! 👋
MediaPlay is a gaming and chatting lounge community created by TechNewVideo—also known as Techy—to bring people all around the world in this community and keep us connected in this world as possible.
+
+
+
diff --git a/manifest.json b/public/manifest.json
similarity index 100%
rename from manifest.json
rename to public/manifest.json
diff --git a/public/sitemap.xml b/public/sitemap.xml
new file mode 100644
index 0000000..146ae42
--- /dev/null
+++ b/public/sitemap.xml
@@ -0,0 +1,17 @@
+
+
+
+ http://localhost:1313/blog/
+ 2024-04-19T06:44:53+07:00
+
+ http://localhost:1313/blog/welcome-to-the-mediaplay-blog/
+ 2024-04-19T06:44:53+07:00
+
+ http://localhost:1313/community/
+ 2024-04-19T06:36:53+07:00
+
+ http://localhost:1313/
+ 2024-04-19T06:32:18+07:00
+
+
diff --git a/public/submissions/index.html b/public/submissions/index.html
new file mode 100644
index 0000000..9be1885
--- /dev/null
+++ b/public/submissions/index.html
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ - MediaPlay
+
+
+
+
+
+
+
+
+
+
+
+
+
around 1 minute · published on 0001-01-01 · 69 words
+
+
+
This is where all of the submissions for the MPD website. Most of the submissions are related to the website’s art, assets, texts that appears in the website, and more.
+
+
+
+
diff --git a/assets/svg/404-page-art.svg b/public/svg/404-page-art.svg
similarity index 100%
rename from assets/svg/404-page-art.svg
rename to public/svg/404-page-art.svg
diff --git a/assets/svg/doodle.svg b/public/svg/doodle.svg
similarity index 100%
rename from assets/svg/doodle.svg
rename to public/svg/doodle.svg
diff --git a/public/tags/index.xml b/public/tags/index.xml
new file mode 100644
index 0000000..59b4b50
--- /dev/null
+++ b/public/tags/index.xml
@@ -0,0 +1,11 @@
+
+
+
+ Tags on MediaPlay
+ http://localhost:1313/tags/
+ Recent content in Tags on MediaPlay
+ Hugo -- gohugo.io
+ en-us
+
+
+
diff --git a/static/admin/config.yml b/static/admin/config.yml
new file mode 100644
index 0000000..885c5c4
--- /dev/null
+++ b/static/admin/config.yml
@@ -0,0 +1,39 @@
+backend:
+ name: github
+ repo: MediaPlay-Discord/mediaplay-discord.github.io # Path to your GitHub repository
+ # optional, defaults to master
+ # branch: main
+
+media_folder: static/assets
+public_folder: /assets
+collections:
+ - name: 'content'
+ label: 'Content'
+ folder: 'content'
+ create: true
+ slug: '{{slug}}'
+ preview_path: /
+ editor:
+ preview: true
+ fields:
+ - { label: 'Title', name: 'title', widget: 'string' }
+ - { label: 'Publish Date', name: 'date', widget: 'datetime' }
+ - { label: 'Draft', name: 'draft', widget: 'boolean', default: true }
+ - { label: 'Author', name: 'author', widget: 'string' }
+ - { label: 'Discord Profile', name: 'discord', widget: 'string' }
+ - { label: 'Body', name: 'body', widget: 'markdown' }
+ - name: 'content'
+ label: 'Blog'
+ folder: 'content/blog'
+ create: true
+ slug: '{{slug}}'
+ preview_path: blog/{{slug}}
+ editor:
+ preview: true
+ fields:
+ - { label: 'Title', name: 'title', widget: 'string' }
+ - { label: 'Publish Date', name: 'date', widget: 'datetime' }
+ - { label: 'Draft', name: 'draft', widget: 'boolean', default: true }
+ - { label: 'Author', name: 'author', widget: 'string' }
+ - { label: 'Discord Profile', name: 'discord', widget: 'string' }
+ - { label: 'Body', name: 'body', widget: 'markdown' }
diff --git a/static/admin/index.html b/static/admin/index.html
new file mode 100644
index 0000000..b80c486
--- /dev/null
+++ b/static/admin/index.html
@@ -0,0 +1,125 @@
+
+
+
+
+
+
+ Content Manager
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/static/assets/MPD-Button-Left.png b/static/assets/MPD-Button-Left.png
new file mode 100755
index 0000000..fb95978
Binary files /dev/null and b/static/assets/MPD-Button-Left.png differ
diff --git a/static/assets/MPD-Button-Right.png b/static/assets/MPD-Button-Right.png
new file mode 100755
index 0000000..053ca5b
Binary files /dev/null and b/static/assets/MPD-Button-Right.png differ
diff --git a/static/assets/MPD-Family-1-Picture-Compressed.webp b/static/assets/MPD-Family-1-Picture-Compressed.webp
new file mode 100755
index 0000000..060ec44
Binary files /dev/null and b/static/assets/MPD-Family-1-Picture-Compressed.webp differ
diff --git a/static/assets/MPD-Family-1-Picture.png b/static/assets/MPD-Family-1-Picture.png
new file mode 100755
index 0000000..6f1fa91
Binary files /dev/null and b/static/assets/MPD-Family-1-Picture.png differ
diff --git a/static/assets/MPD-Family-2-Picture-Compressed.webp b/static/assets/MPD-Family-2-Picture-Compressed.webp
new file mode 100755
index 0000000..98603dc
Binary files /dev/null and b/static/assets/MPD-Family-2-Picture-Compressed.webp differ
diff --git a/static/assets/MPD-Family-2-Picture.png b/static/assets/MPD-Family-2-Picture.png
new file mode 100755
index 0000000..f3ea164
Binary files /dev/null and b/static/assets/MPD-Family-2-Picture.png differ
diff --git a/static/assets/MPD-Family-3-Picture-Compressed.webp b/static/assets/MPD-Family-3-Picture-Compressed.webp
new file mode 100755
index 0000000..c508da7
Binary files /dev/null and b/static/assets/MPD-Family-3-Picture-Compressed.webp differ
diff --git a/static/assets/MPD-Family-3-Picture.png b/static/assets/MPD-Family-3-Picture.png
new file mode 100755
index 0000000..b2e482e
Binary files /dev/null and b/static/assets/MPD-Family-3-Picture.png differ
diff --git a/static/assets/MPD-Family-4-Picture-Compressed.webp b/static/assets/MPD-Family-4-Picture-Compressed.webp
new file mode 100755
index 0000000..f9dde53
Binary files /dev/null and b/static/assets/MPD-Family-4-Picture-Compressed.webp differ
diff --git a/static/assets/MPD-Family-4-Picture.png b/static/assets/MPD-Family-4-Picture.png
new file mode 100755
index 0000000..df52ab8
Binary files /dev/null and b/static/assets/MPD-Family-4-Picture.png differ
diff --git a/static/assets/MPD-Family-5-Exclusive-Picture-Compressed.webp b/static/assets/MPD-Family-5-Exclusive-Picture-Compressed.webp
new file mode 100644
index 0000000..fb6b0f1
Binary files /dev/null and b/static/assets/MPD-Family-5-Exclusive-Picture-Compressed.webp differ
diff --git a/static/assets/MPD-Family-5-Exclusive-Picture.png b/static/assets/MPD-Family-5-Exclusive-Picture.png
new file mode 100644
index 0000000..b805f0a
Binary files /dev/null and b/static/assets/MPD-Family-5-Exclusive-Picture.png differ
diff --git a/static/assets/MPD-Family-5-Main-Picture-Compressed.webp b/static/assets/MPD-Family-5-Main-Picture-Compressed.webp
new file mode 100644
index 0000000..ba4fbf7
Binary files /dev/null and b/static/assets/MPD-Family-5-Main-Picture-Compressed.webp differ
diff --git a/static/assets/MPD-Family-5-Main-Picture.png b/static/assets/MPD-Family-5-Main-Picture.png
new file mode 100644
index 0000000..3d19f38
Binary files /dev/null and b/static/assets/MPD-Family-5-Main-Picture.png differ
diff --git a/static/assets/MPD-Favicon.ico b/static/assets/MPD-Favicon.ico
new file mode 100755
index 0000000..0ef8efb
Binary files /dev/null and b/static/assets/MPD-Favicon.ico differ
diff --git a/static/assets/MPD-Logo-512px.png b/static/assets/MPD-Logo-512px.png
new file mode 100755
index 0000000..dea4adc
Binary files /dev/null and b/static/assets/MPD-Logo-512px.png differ
diff --git a/static/assets/MPD-Logo-with-Text.png b/static/assets/MPD-Logo-with-Text.png
new file mode 100755
index 0000000..df59b51
Binary files /dev/null and b/static/assets/MPD-Logo-with-Text.png differ
diff --git a/static/assets/MPD-Logo.png b/static/assets/MPD-Logo.png
new file mode 100755
index 0000000..4119205
Binary files /dev/null and b/static/assets/MPD-Logo.png differ
diff --git a/static/assets/MPD-NVO-18-Family-Picture-Compressed.webp b/static/assets/MPD-NVO-18-Family-Picture-Compressed.webp
new file mode 100644
index 0000000..f45c960
Binary files /dev/null and b/static/assets/MPD-NVO-18-Family-Picture-Compressed.webp differ
diff --git a/static/assets/MPD-NVO-18-Family-Picture.png b/static/assets/MPD-NVO-18-Family-Picture.png
new file mode 100644
index 0000000..cf90ca9
Binary files /dev/null and b/static/assets/MPD-NVO-18-Family-Picture.png differ
diff --git a/static/assets/MPD_Website_Main_page_banner.png b/static/assets/MPD_Website_Main_page_banner.png
new file mode 100644
index 0000000..23480b7
Binary files /dev/null and b/static/assets/MPD_Website_Main_page_banner.png differ
diff --git a/static/assets/MediaPlay-Color-Template.png b/static/assets/MediaPlay-Color-Template.png
new file mode 100644
index 0000000..39d3cfa
Binary files /dev/null and b/static/assets/MediaPlay-Color-Template.png differ
diff --git a/static/assets/MediaPlay.png b/static/assets/MediaPlay.png
new file mode 100644
index 0000000..eb1dd91
Binary files /dev/null and b/static/assets/MediaPlay.png differ
diff --git a/static/assets/MediaPlay_Text_Logo.png b/static/assets/MediaPlay_Text_Logo.png
new file mode 100644
index 0000000..dfc0471
Binary files /dev/null and b/static/assets/MediaPlay_Text_Logo.png differ
diff --git a/static/assets/Members.png b/static/assets/Members.png
new file mode 100755
index 0000000..e8da45b
Binary files /dev/null and b/static/assets/Members.png differ
diff --git a/static/assets/News.png b/static/assets/News.png
new file mode 100755
index 0000000..296b48f
Binary files /dev/null and b/static/assets/News.png differ
diff --git a/static/assets/Old-UI.png b/static/assets/Old-UI.png
new file mode 100644
index 0000000..8466104
Binary files /dev/null and b/static/assets/Old-UI.png differ
diff --git a/static/assets/Old-Website-Screenshot.png b/static/assets/Old-Website-Screenshot.png
new file mode 100644
index 0000000..2ef1b93
Binary files /dev/null and b/static/assets/Old-Website-Screenshot.png differ
diff --git a/static/assets/Status.png b/static/assets/Status.png
new file mode 100755
index 0000000..9e3597b
Binary files /dev/null and b/static/assets/Status.png differ
diff --git a/static/css/main.css b/static/css/main.css
new file mode 100644
index 0000000..887b8f7
--- /dev/null
+++ b/static/css/main.css
@@ -0,0 +1,105 @@
+/* figtree-regular - latin */
+@font-face {
+ font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
+ font-family: 'Figtree';
+ font-style: normal;
+ font-weight: 400;
+ src: url('../fonts/figtree-v5-latin-regular.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
+}
+
+/* figtree-italic - latin */
+@font-face {
+ font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
+ font-family: 'Figtree';
+ font-style: italic;
+ font-weight: 400;
+ src: url('../fonts/figtree-v5-latin-italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
+}
+
+/* figtree-700 - latin */
+@font-face {
+ font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
+ font-family: 'Figtree';
+ font-style: normal;
+ font-weight: 700;
+ src: url('../fonts/figtree-v5-latin-700.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
+}
+
+/* figtree-700italic - latin */
+@font-face {
+ font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
+ font-family: 'Figtree';
+ font-style: italic;
+ font-weight: 700;
+ src: url('../fonts/figtree-v5-latin-700italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
+}
+
+/* jetbrains-mono-regular - latin */
+@font-face {
+ font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
+ font-family: 'JetBrains Mono';
+ font-style: normal;
+ font-weight: 400;
+ src: url('../fonts/jetbrains-mono-v18-latin-regular.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
+}
+
+/* jetbrains-mono-italic - latin */
+@font-face {
+ font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
+ font-family: 'JetBrains Mono';
+ font-style: italic;
+ font-weight: 400;
+ src: url('../fonts/jetbrains-mono-v18-latin-italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
+}
+
+/* jetbrains-mono-700 - latin */
+@font-face {
+ font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
+ font-family: 'JetBrains Mono';
+ font-style: normal;
+ font-weight: 700;
+ src: url('../fonts/jetbrains-mono-v18-latin-700.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
+}
+
+/* jetbrains-mono-700italic - latin */
+@font-face {
+ font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
+ font-family: 'JetBrains Mono';
+ font-style: italic;
+ font-weight: 700;
+ src: url('../fonts/jetbrains-mono-v18-latin-700italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
+}
+
+body {
+ font-family: "Figtree", sans-serif;
+ margin: 0;
+ padding: 0;
+ /* background-color: #00b0f0; */
+ background: #111742;
+}
+
+code {
+ font-family: "JetBrains Mono", monospace;
+}
+
+p, h1, h2, h3, h4, h5, h6 {
+ color: #9fcedf;
+}
+
+p {
+ font-size: 16pt;
+}
+
+iframe {
+ display: block;
+ margin: 0 auto;
+ border: 0;
+}
+
+hr {
+ border: 4px solid #005777;
+ border-radius: 8px;
+ width: 75%;
+ text-align: center;
+ margin: auto;
+}
\ No newline at end of file
diff --git a/static/css/navbar.css b/static/css/navbar.css
new file mode 100644
index 0000000..c48c692
--- /dev/null
+++ b/static/css/navbar.css
@@ -0,0 +1,192 @@
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+}
+
+.container {
+ height: 105px;
+ background: rgb(13,19,71);
+ background: linear-gradient(180deg, rgba(13,19,71,1) 0%, rgba(17,23,66,1) 100%);
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ overflow: hidden;
+ /* -webkit-box-shadow: 0px 15px 30px 0px rgba(0,0,0,0.5);
+ -moz-box-shadow: 0px 15px 30px 0px rgba(0,0,0,0.5);
+ box-shadow: 0px 15px 30px 0px rgba(0,0,0,0.5); */
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1;
+}
+
+.container .logo {
+ max-width: 350px;
+ padding: 0 15px;
+}
+
+.container .logo a {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ height: 105px;
+}
+
+.container .logo a img {
+ max-width: 100%;
+ margin: 15px;
+ max-height: 105px;
+}
+
+.container .navbar {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ -webkit-box-flex: 1;
+ -ms-flex: 1;
+ flex: 1;
+ flex-direction: row-reverse;
+ padding: 0 30px;
+}
+
+.container .navbar ul {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+.container .navbar ul li a {
+ text-decoration: none;
+ color: #ffffff;
+ font-size: 14px;
+ text-transform: uppercase;
+ display: block;
+ height: 30px;
+ line-height: 30px;
+ cursor: pointer;
+ padding: 0 10px;
+}
+
+.container .navbar ul li a:hover {
+ color: #ffffff;
+ background-color: #00b0f0;
+}
+
+.container .navbar ul .close {
+ display: none;
+ padding: 10px;
+}
+
+.container .navbar ul .close span {
+ font-size: 40px;
+ display: inline-block;
+ border: 1px solid #cccccc;
+ padding: 0 10px;
+ cursor: pointer;
+}
+
+.container .navbar .icon-bar {
+ padding: 18px 8px;
+ width: 50px;
+ height: 60px;
+ display: none;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -webkit-box-pack: justify;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
+ cursor: pointer;
+}
+
+.container .navbar .icon-bar i {
+ background-color: #ffffff;
+ height: 2px;
+}
+
+@media only screen and (max-width: 900px) {
+ .container {
+ -webkit-box-pack: justify;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
+ }
+
+ .container .logo {
+ -webkit-box-flex: 1;
+ -ms-flex: 1;
+ flex: 1;
+ }
+
+ .container .navbar {
+ -webkit-box-flex: 0;
+ -ms-flex: 0;
+ flex: 0;
+ }
+
+ .container .navbar ul {
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ position: fixed;
+ top: 0;
+ left: 100%;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ background: #0d1347;
+ width: 100%;
+ height: 100%;
+ overflow: auto;
+ -webkit-transition: left 0.3s;
+ -o-transition: left 0.3s;
+ transition: left 0.3s;
+ }
+
+ .container .navbar ul li a {
+ padding: 10px;
+ font-size: 16px;
+ height: auto;
+ line-height: normal;
+ color: #ffffff;
+ }
+
+ .container .navbar ul .close {
+ display: block;
+ }
+
+ .container .navbar .icon-bar {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ }
+
+ .container .navbar ._Menus-show {
+ left: 0;
+ }
+}
+
+.body {
+ max-width: 700px;
+ margin: 0 auto;
+ padding: 10px;
+}
\ No newline at end of file
diff --git a/static/css/scrollBar.css b/static/css/scrollBar.css
new file mode 100644
index 0000000..239f9c1
--- /dev/null
+++ b/static/css/scrollBar.css
@@ -0,0 +1,54 @@
+/* CSS styling for scroll bars. */
+
+/* WebKit-based browsers */
+::-webkit-scrollbar {
+ background: transparent;
+ overflow: visible;
+ width: 17px;
+}
+
+::-webkit-scrollbar-thumb {
+ background-color: rgba(0, 0, 0, 0.2);
+ border: solid #fff;
+ border-radius: 10px;
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background: rgba(0, 0, 0, 0.1);
+}
+
+::-webkit-scrollbar-thumb:horizontal {
+ border-width: 4px 6px;
+ min-width: 40px;
+}
+
+::-webkit-scrollbar-thumb:vertical {
+ border-width: 6px 4px;
+ min-height: 40px;
+}
+
+::-webkit-scrollbar-track-piece {
+ background-color: #fff;
+}
+
+::-webkit-scrollbar-corner {
+ background: transparent;
+}
+
+::-webkit-scrollbar-thumb {
+ background-color: #adadad;
+ box-shadow: inset 1px 1px 0 rgba(0, 0, 0, 0.1),
+ inset 0 -1px 0 rgba(0, 0, 0, 0.07);
+ -webkit-box-shadow: inset 1px 1px 0 rgba(0, 0, 0, 0.1),
+ inset 0 -1px 0 rgba(0, 0, 0, 0.07);
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background-color: #999;
+}
+
+/* ...and for Firefox as well */
+.scroller {
+ overflow-y: scroll;
+ scrollbar-color: #adadad #fff;
+}
\ No newline at end of file
diff --git a/static/css/slideshow.css b/static/css/slideshow.css
new file mode 100644
index 0000000..74ee5c4
--- /dev/null
+++ b/static/css/slideshow.css
@@ -0,0 +1,84 @@
+.slideshow-container {
+ max-width: clamp(250px, 75%, 850px);
+ position: relative;
+ margin: auto;
+}
+
+.mySlides {
+ display: none;
+ max-height: 800px;
+}
+
+.prev,
+.next {
+ cursor: pointer;
+ position: absolute;
+ top: clamp(38.5%, 50%, 45%);
+ width: auto;
+ margin-top: -22px;
+ padding: 16px;
+ color: #ffffff;
+ font-weight: bold;
+ font-size: 30px;
+ transition: 0.6s ease;
+ border-radius: 0 3px 3px 0;
+}
+
+.next {
+ right: 15px;
+ border-radius: 50px 50px 50px 50px;
+}
+
+.prev {
+ left: 15px;
+ border-radius: 50px 50px 50px 50px;
+}
+
+@media only screen and (max-width: 900px) {
+ .next {
+ right: 10px;
+ border-radius: 50px 50px 50px 50px;
+ width: 17%;
+ height: 30%;
+ }
+
+ .prev {
+ left: 10px;
+ border-radius: 50px 50px 50px 50px;
+ width: 17%;
+ height: 30%;
+ }
+}
+
+.prev:hover,
+.next:hover {
+ color: #707070;
+ background-color: rgba(0, 0, 0, 0.8);
+}
+
+.text {
+ color: #ffffff;
+ font-size: 15px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+ position: absolute;
+ bottom: 0;
+ width: 100%;
+ text-align: center;
+}
+
+.dot {
+ cursor: pointer;
+ height: 15px;
+ width: 15px;
+ margin: 0 2px;
+ background-color: #00678d;
+ border-radius: 50%;
+ display: inline-block;
+ transition: background-color 0.6s ease;
+}
+
+.active,
+.dot:hover {
+ background-color: #0d1347;
+}
\ No newline at end of file
diff --git a/static/fonts/figtree-v5-latin-700.woff2 b/static/fonts/figtree-v5-latin-700.woff2
new file mode 100644
index 0000000..6039759
Binary files /dev/null and b/static/fonts/figtree-v5-latin-700.woff2 differ
diff --git a/static/fonts/figtree-v5-latin-700italic.woff2 b/static/fonts/figtree-v5-latin-700italic.woff2
new file mode 100644
index 0000000..8e16837
Binary files /dev/null and b/static/fonts/figtree-v5-latin-700italic.woff2 differ
diff --git a/static/fonts/figtree-v5-latin-italic.woff2 b/static/fonts/figtree-v5-latin-italic.woff2
new file mode 100644
index 0000000..36378a6
Binary files /dev/null and b/static/fonts/figtree-v5-latin-italic.woff2 differ
diff --git a/static/fonts/figtree-v5-latin-regular.woff2 b/static/fonts/figtree-v5-latin-regular.woff2
new file mode 100644
index 0000000..c359928
Binary files /dev/null and b/static/fonts/figtree-v5-latin-regular.woff2 differ
diff --git a/static/fonts/jetbrains-mono-v18-latin-700.woff2 b/static/fonts/jetbrains-mono-v18-latin-700.woff2
new file mode 100644
index 0000000..7080d06
Binary files /dev/null and b/static/fonts/jetbrains-mono-v18-latin-700.woff2 differ
diff --git a/static/fonts/jetbrains-mono-v18-latin-700italic.woff2 b/static/fonts/jetbrains-mono-v18-latin-700italic.woff2
new file mode 100644
index 0000000..edfd8cc
Binary files /dev/null and b/static/fonts/jetbrains-mono-v18-latin-700italic.woff2 differ
diff --git a/static/fonts/jetbrains-mono-v18-latin-italic.woff2 b/static/fonts/jetbrains-mono-v18-latin-italic.woff2
new file mode 100644
index 0000000..ddecc6a
Binary files /dev/null and b/static/fonts/jetbrains-mono-v18-latin-italic.woff2 differ
diff --git a/static/fonts/jetbrains-mono-v18-latin-regular.woff2 b/static/fonts/jetbrains-mono-v18-latin-regular.woff2
new file mode 100644
index 0000000..c3f046f
Binary files /dev/null and b/static/fonts/jetbrains-mono-v18-latin-regular.woff2 differ
diff --git a/static/fonts/montserrat-v18-latin-regular.woff b/static/fonts/montserrat-v18-latin-regular.woff
new file mode 100644
index 0000000..24e4ebc
Binary files /dev/null and b/static/fonts/montserrat-v18-latin-regular.woff differ
diff --git a/static/fonts/montserrat-v18-latin-regular.woff2 b/static/fonts/montserrat-v18-latin-regular.woff2
new file mode 100644
index 0000000..c9f3817
Binary files /dev/null and b/static/fonts/montserrat-v18-latin-regular.woff2 differ
diff --git a/static/icons/apple-icon-180.png b/static/icons/apple-icon-180.png
new file mode 100755
index 0000000..9547a3c
Binary files /dev/null and b/static/icons/apple-icon-180.png differ
diff --git a/static/icons/apple-splash-1125-2436.jpg b/static/icons/apple-splash-1125-2436.jpg
new file mode 100755
index 0000000..0b528ff
Binary files /dev/null and b/static/icons/apple-splash-1125-2436.jpg differ
diff --git a/static/icons/apple-splash-1136-640.jpg b/static/icons/apple-splash-1136-640.jpg
new file mode 100755
index 0000000..8c04f02
Binary files /dev/null and b/static/icons/apple-splash-1136-640.jpg differ
diff --git a/static/icons/apple-splash-1170-2532.jpg b/static/icons/apple-splash-1170-2532.jpg
new file mode 100755
index 0000000..82c3aa8
Binary files /dev/null and b/static/icons/apple-splash-1170-2532.jpg differ
diff --git a/static/icons/apple-splash-1242-2208.jpg b/static/icons/apple-splash-1242-2208.jpg
new file mode 100755
index 0000000..fbd392a
Binary files /dev/null and b/static/icons/apple-splash-1242-2208.jpg differ
diff --git a/static/icons/apple-splash-1242-2688.jpg b/static/icons/apple-splash-1242-2688.jpg
new file mode 100755
index 0000000..7881141
Binary files /dev/null and b/static/icons/apple-splash-1242-2688.jpg differ
diff --git a/static/icons/apple-splash-1284-2778.jpg b/static/icons/apple-splash-1284-2778.jpg
new file mode 100755
index 0000000..7ea9369
Binary files /dev/null and b/static/icons/apple-splash-1284-2778.jpg differ
diff --git a/static/icons/apple-splash-1334-750.jpg b/static/icons/apple-splash-1334-750.jpg
new file mode 100755
index 0000000..0bff1a9
Binary files /dev/null and b/static/icons/apple-splash-1334-750.jpg differ
diff --git a/static/icons/apple-splash-1536-2048.jpg b/static/icons/apple-splash-1536-2048.jpg
new file mode 100755
index 0000000..b836a87
Binary files /dev/null and b/static/icons/apple-splash-1536-2048.jpg differ
diff --git a/static/icons/apple-splash-1620-2160.jpg b/static/icons/apple-splash-1620-2160.jpg
new file mode 100755
index 0000000..3cebbf7
Binary files /dev/null and b/static/icons/apple-splash-1620-2160.jpg differ
diff --git a/static/icons/apple-splash-1668-2224.jpg b/static/icons/apple-splash-1668-2224.jpg
new file mode 100755
index 0000000..0287260
Binary files /dev/null and b/static/icons/apple-splash-1668-2224.jpg differ
diff --git a/static/icons/apple-splash-1668-2388.jpg b/static/icons/apple-splash-1668-2388.jpg
new file mode 100755
index 0000000..bc1ca4d
Binary files /dev/null and b/static/icons/apple-splash-1668-2388.jpg differ
diff --git a/static/icons/apple-splash-1792-828.jpg b/static/icons/apple-splash-1792-828.jpg
new file mode 100755
index 0000000..e186ee0
Binary files /dev/null and b/static/icons/apple-splash-1792-828.jpg differ
diff --git a/static/icons/apple-splash-2048-1536.jpg b/static/icons/apple-splash-2048-1536.jpg
new file mode 100755
index 0000000..b99adf4
Binary files /dev/null and b/static/icons/apple-splash-2048-1536.jpg differ
diff --git a/static/icons/apple-splash-2048-2732.jpg b/static/icons/apple-splash-2048-2732.jpg
new file mode 100755
index 0000000..4a0966a
Binary files /dev/null and b/static/icons/apple-splash-2048-2732.jpg differ
diff --git a/static/icons/apple-splash-2160-1620.jpg b/static/icons/apple-splash-2160-1620.jpg
new file mode 100755
index 0000000..289b23d
Binary files /dev/null and b/static/icons/apple-splash-2160-1620.jpg differ
diff --git a/static/icons/apple-splash-2208-1242.jpg b/static/icons/apple-splash-2208-1242.jpg
new file mode 100755
index 0000000..a533e9e
Binary files /dev/null and b/static/icons/apple-splash-2208-1242.jpg differ
diff --git a/static/icons/apple-splash-2224-1668.jpg b/static/icons/apple-splash-2224-1668.jpg
new file mode 100755
index 0000000..09a06d0
Binary files /dev/null and b/static/icons/apple-splash-2224-1668.jpg differ
diff --git a/static/icons/apple-splash-2388-1668.jpg b/static/icons/apple-splash-2388-1668.jpg
new file mode 100755
index 0000000..1c48740
Binary files /dev/null and b/static/icons/apple-splash-2388-1668.jpg differ
diff --git a/static/icons/apple-splash-2436-1125.jpg b/static/icons/apple-splash-2436-1125.jpg
new file mode 100755
index 0000000..63672d2
Binary files /dev/null and b/static/icons/apple-splash-2436-1125.jpg differ
diff --git a/static/icons/apple-splash-2532-1170.jpg b/static/icons/apple-splash-2532-1170.jpg
new file mode 100755
index 0000000..26ce9fe
Binary files /dev/null and b/static/icons/apple-splash-2532-1170.jpg differ
diff --git a/static/icons/apple-splash-2688-1242.jpg b/static/icons/apple-splash-2688-1242.jpg
new file mode 100755
index 0000000..4858e18
Binary files /dev/null and b/static/icons/apple-splash-2688-1242.jpg differ
diff --git a/static/icons/apple-splash-2732-2048.jpg b/static/icons/apple-splash-2732-2048.jpg
new file mode 100755
index 0000000..ac178ab
Binary files /dev/null and b/static/icons/apple-splash-2732-2048.jpg differ
diff --git a/static/icons/apple-splash-2778-1284.jpg b/static/icons/apple-splash-2778-1284.jpg
new file mode 100755
index 0000000..f561099
Binary files /dev/null and b/static/icons/apple-splash-2778-1284.jpg differ
diff --git a/static/icons/apple-splash-640-1136.jpg b/static/icons/apple-splash-640-1136.jpg
new file mode 100755
index 0000000..d00403f
Binary files /dev/null and b/static/icons/apple-splash-640-1136.jpg differ
diff --git a/static/icons/apple-splash-750-1334.jpg b/static/icons/apple-splash-750-1334.jpg
new file mode 100755
index 0000000..e328ac2
Binary files /dev/null and b/static/icons/apple-splash-750-1334.jpg differ
diff --git a/static/icons/apple-splash-828-1792.jpg b/static/icons/apple-splash-828-1792.jpg
new file mode 100755
index 0000000..b9538f5
Binary files /dev/null and b/static/icons/apple-splash-828-1792.jpg differ
diff --git a/static/icons/manifest-icon-192.png b/static/icons/manifest-icon-192.png
new file mode 100755
index 0000000..3bab1ff
Binary files /dev/null and b/static/icons/manifest-icon-192.png differ
diff --git a/static/icons/manifest-icon-512.png b/static/icons/manifest-icon-512.png
new file mode 100755
index 0000000..f4093c0
Binary files /dev/null and b/static/icons/manifest-icon-512.png differ
diff --git a/static/manifest.json b/static/manifest.json
new file mode 100755
index 0000000..8af9f6b
--- /dev/null
+++ b/static/manifest.json
@@ -0,0 +1,22 @@
+{
+ "name": "MediaPlay Discord",
+ "short_name": "MPD",
+ "start_url": "/",
+ "icons": [{
+ "src": "assets/icons/manifest-icon-192.png",
+ "sizes": "192x192",
+ "type": "image/png",
+ "purpose": "maskable any"
+ },
+ {
+ "src": "assets/icons/manifest-icon-512.png",
+ "sizes": "512x512",
+ "type": "image/png",
+ "purpose": "maskable any"
+ }
+ ],
+ "theme_color": "#00b0f0",
+ "background_color": "#ffffff",
+ "display": "standalone",
+ "orientation": "portrait"
+}
\ No newline at end of file
diff --git a/static/svg/404-page-art.svg b/static/svg/404-page-art.svg
new file mode 100755
index 0000000..60769fe
--- /dev/null
+++ b/static/svg/404-page-art.svg
@@ -0,0 +1,434 @@
+
+
diff --git a/static/svg/doodle.svg b/static/svg/doodle.svg
new file mode 100755
index 0000000..28012d0
--- /dev/null
+++ b/static/svg/doodle.svg
@@ -0,0 +1,1231 @@
+
+
+
+
diff --git a/submissions/Submissions.md b/submissions/Submissions.md
deleted file mode 100755
index 8d5fd93..0000000
--- a/submissions/Submissions.md
+++ /dev/null
@@ -1,3 +0,0 @@
- This is where all of the submissions for the MPD website. Most of the submissions are related to the website's art, assets, texts that appears in the website, and more.
-
- If you want to contribute to the MPD website for the arts and texts, [feel free to join our Discord server](https://discord.gg/5Tdke6dsaP), or [contribute to the MPD website repository on GitHub by making a pull request for improving the code.](https://github.com/MediaPlay-Discord/mediaplay-discord.github.io/pulls)
diff --git a/sw.js b/sw.js
deleted file mode 100644
index bf346c0..0000000
--- a/sw.js
+++ /dev/null
@@ -1,2 +0,0 @@
-if(!self.define){const e=e=>{"require"!==e&&(e+=".js");let s=Promise.resolve();return a[e]||(s=new Promise((async s=>{if("document"in self){const a=document.createElement("script");a.src=e,document.head.appendChild(a),a.onload=s}else importScripts(e),s()}))),s.then((()=>{if(!a[e])throw new Error(`Module ${e} didn’t register its module`);return a[e]}))},s=(s,a)=>{Promise.all(s.map(e)).then((e=>a(1===e.length?e[0]:e)))},a={require:Promise.resolve(s)};self.define=(s,i,c)=>{a[s]||(a[s]=Promise.resolve().then((()=>{let a={};const r={uri:location.origin+s.slice(1)};return Promise.all(i.map((s=>{switch(s){case"exports":return a;case"module":return r;default:return e(s)}}))).then((e=>{const s=c(...e);return a.default||(a.default=s),a}))})))}}define("./sw.js",["./workbox-0788a2bf"],(function(e){"use strict";self.addEventListener("message",(e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()})),e.precacheAndRoute([{url:"404.html",revision:"0e73adf2c9250c40c1e5e12ce10bedbf"},{url:"assets/icons/apple-icon-180.png",revision:"691044100b78259100226a8b04808eba"},{url:"assets/icons/apple-splash-1125-2436.jpg",revision:"8e6903f6a332662666e8248ed5fdeb15"},{url:"assets/icons/apple-splash-1136-640.jpg",revision:"6b22a3808e5e3d71955851c1db3b2623"},{url:"assets/icons/apple-splash-1170-2532.jpg",revision:"7dfe6e5701e4393bb5b65c4ce8f798cc"},{url:"assets/icons/apple-splash-1242-2208.jpg",revision:"e76caf900901394696ab3b1ad9ab98ed"},{url:"assets/icons/apple-splash-1242-2688.jpg",revision:"406464aa8e2c7e93ba7ca649b51638f9"},{url:"assets/icons/apple-splash-1284-2778.jpg",revision:"addde3eed9689014cbfde269d99c40d8"},{url:"assets/icons/apple-splash-1334-750.jpg",revision:"cbdf620a64e3c85f83517bfca8a183b4"},{url:"assets/icons/apple-splash-1536-2048.jpg",revision:"aaedc615b3bb000477ae5eecc93943d3"},{url:"assets/icons/apple-splash-1620-2160.jpg",revision:"444aee6b83f417a2dd784dfbdc522270"},{url:"assets/icons/apple-splash-1668-2224.jpg",revision:"c1c1e44e971f00ac1063f7e2b2f9772e"},{url:"assets/icons/apple-splash-1668-2388.jpg",revision:"0c8e8600dff7440591e99004d5a7bb32"},{url:"assets/icons/apple-splash-1792-828.jpg",revision:"b2d7d564e6f46c02ec178e9a12cb3c5d"},{url:"assets/icons/apple-splash-2048-1536.jpg",revision:"c4279e63aefc511fea7492c6215377c2"},{url:"assets/icons/apple-splash-2048-2732.jpg",revision:"c37c7c2f7e78e2b956f31259c2d9ac85"},{url:"assets/icons/apple-splash-2160-1620.jpg",revision:"8fb8eea1faf3f95208ee662e33e9ff60"},{url:"assets/icons/apple-splash-2208-1242.jpg",revision:"e1171e2e04777003c2447a5fa4cf3b9c"},{url:"assets/icons/apple-splash-2224-1668.jpg",revision:"f26f3a1fa40576eb10d33cb0daf16bb7"},{url:"assets/icons/apple-splash-2388-1668.jpg",revision:"c75ae89bc25784991e6282731520f2fa"},{url:"assets/icons/apple-splash-2436-1125.jpg",revision:"6c3bfe1a6f488076078478a17d92451b"},{url:"assets/icons/apple-splash-2532-1170.jpg",revision:"daf53e91675f08f0d2359fb75cde468b"},{url:"assets/icons/apple-splash-2688-1242.jpg",revision:"3f401ccb61d20f6709fb2dc57887059e"},{url:"assets/icons/apple-splash-2732-2048.jpg",revision:"6e40a7ffa96a027822b887f64824f047"},{url:"assets/icons/apple-splash-2778-1284.jpg",revision:"dab87a83ecfad2860101c80064854c08"},{url:"assets/icons/apple-splash-640-1136.jpg",revision:"b469352323e3f41e6081c5ad4a07b1cd"},{url:"assets/icons/apple-splash-750-1334.jpg",revision:"bdb5ef4c95425f3347f6c20d6ef6b330"},{url:"assets/icons/apple-splash-828-1792.jpg",revision:"409bb7f506285c678f45c9fe883af4b4"},{url:"assets/icons/manifest-icon-192.png",revision:"90d2872b1f15aafb2d2094ed4000c465"},{url:"assets/icons/manifest-icon-512.png",revision:"92bfab3098d7b7e73ca06c6cfce989e3"},{url:"assets/MediaPlay-Color-Template.png",revision:"4ba8216795c5c73f06a2e1726091d9ec"},{url:"assets/Members.png",revision:"f5e6c93f52c344c12e915240b0b24313"},{url:"assets/MPD_Website_Main_page_banner.png",revision:"b13b3e38f14ed01809450eda702eb2bd"},{url:"assets/MPD-Button-Left.png",revision:"a742fcd10a2ef25759ade99bd49d6280"},{url:"assets/MPD-Button-Right.png",revision:"aaf67f933dd33274e53b776c752c6c12"},{url:"assets/MPD-Family-1-Picture-Compressed.webp",revision:"1830b8ad10e0d55e6710ca39f59bf275"},{url:"assets/MPD-Family-1-Picture.png",revision:"76db3abcc3ce8e445df63a17233ae3ad"},{url:"assets/MPD-Family-2-Picture-Compressed.webp",revision:"e0572e90239d815cb8e0e64d395d3319"},{url:"assets/MPD-Family-2-Picture.png",revision:"40ab85c923e51610989eb164332e3ac9"},{url:"assets/MPD-Family-3-Picture-Compressed.webp",revision:"ea92e3f9f4f7c455b16e1fcc5a26911f"},{url:"assets/MPD-Family-3-Picture.png",revision:"094138d9e5c47eeb411d8a7ac64d3a5f"},{url:"assets/MPD-Family-4-Picture-Compressed.webp",revision:"95eaafb2731b9817e2d0b5ab26947d03"},{url:"assets/MPD-Family-5-Exclusive-Picture-Compressed.webp",revision:"495ef45656765f77fa3795203d541cde"},{url:"assets/MPD-Family-5-Exclusive-Picture.png",revision:"393aa48d89f1b7241d13ca0acf436e08"},{url:"assets/MPD-Family-5-Main-Picture-Compressed.webp",revision:"7736b606ce9d87bed8f047f253640a9e"},{url:"assets/MPD-Family-5-Main-Picture.png",revision:"b514e5cd86322bfaf724a52e43e3be83"},{url:"assets/MPD-Favicon.ico",revision:"d8aed79cd341f5dfe56ba85e401377b9"},{url:"assets/MPD-Logo-512px.png",revision:"1b331cfa8f01439d6a467993f72c51b6"},{url:"assets/MPD-Logo-with-Text.png",revision:"eab35af58babab6cebcee313d42d24f0"},{url:"assets/MPD-Logo.png",revision:"e570c93e31e94343d292209428b7bc7d"},{url:"assets/MPD-NVO-18-Family-Picture-Compressed.webp",revision:"6afcb809d739137cbde27d89231c1e15"},{url:"assets/MPD-NVO-18-Family-Picture.png",revision:"ec63f16317a40f2c190742eab85218fb"},{url:"assets/News.png",revision:"e7f7a15d67a79e5e38a4443d1f266c01"},{url:"assets/Old-UI.png",revision:"dafd8020bb0ea668ade21ff04551a331"},{url:"assets/Old-Website-Screenshot.png",revision:"aceb3d8f45fe0b4a67da93c1d1f455c9"},{url:"assets/Status.png",revision:"702b183d23bdea8174756cd0a363b077"},{url:"assets/svg/404-page-art.svg",revision:"c9c637b41712ca9b7734ecf468041eba"},{url:"assets/svg/doodle.svg",revision:"f59340cdfa9c4aba1976f4f0dc4f6bb3"},{url:"community.html",revision:"41070c61685d61c7641da95771caaaa5"},{url:"css/main.css",revision:"d2317848141cef4059659b979611e0da"},{url:"css/navbar.css",revision:"fc649fb138bd642eae954a87a1ed0a82"},{url:"css/scrollBar.css",revision:"7f6bc5325619d3acfec000921b7a439d"},{url:"css/slideshow.css",revision:"e6ba400c0da0ec81a8643e3203d2b85c"},{url:"index.html",revision:"0b1857081f7cdc205f853e960f47f067"},{url:"manifest.json",revision:"b1f269bc00e4475d429fb8de8ddf9331"},{url:"servers.html",revision:"fd1eaa5dff5573ed4b57b4522c2609ca"},{url:"submissions/404-page-art/sketch1613828200299.png",revision:"250851e828769100bb3b307bd210e4ac"}],{ignoreURLParametersMatching:[/^utm_/,/^fbclid$/]})}));
-//# sourceMappingURL=sw.js.map
diff --git a/sw.js.map b/sw.js.map
deleted file mode 100644
index ad9dd7b..0000000
--- a/sw.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"sw.js","sources":["../../../../tmp/08dcb6b1f053271587008c2c176f2252/sw.js"],"sourcesContent":["import {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/usr/lib/node_modules/workbox-cli/node_modules/workbox-precaching/precacheAndRoute.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\n\n\n\n\nself.addEventListener('message', (event) => {\n if (event.data && event.data.type === 'SKIP_WAITING') {\n self.skipWaiting();\n }\n});\n\n\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"404.html\",\n \"revision\": \"0e73adf2c9250c40c1e5e12ce10bedbf\"\n },\n {\n \"url\": \"assets/icons/apple-icon-180.png\",\n \"revision\": \"691044100b78259100226a8b04808eba\"\n },\n {\n \"url\": \"assets/icons/apple-splash-1125-2436.jpg\",\n \"revision\": \"8e6903f6a332662666e8248ed5fdeb15\"\n },\n {\n \"url\": \"assets/icons/apple-splash-1136-640.jpg\",\n \"revision\": \"6b22a3808e5e3d71955851c1db3b2623\"\n },\n {\n \"url\": \"assets/icons/apple-splash-1170-2532.jpg\",\n \"revision\": \"7dfe6e5701e4393bb5b65c4ce8f798cc\"\n },\n {\n \"url\": \"assets/icons/apple-splash-1242-2208.jpg\",\n \"revision\": \"e76caf900901394696ab3b1ad9ab98ed\"\n },\n {\n \"url\": \"assets/icons/apple-splash-1242-2688.jpg\",\n \"revision\": \"406464aa8e2c7e93ba7ca649b51638f9\"\n },\n {\n \"url\": \"assets/icons/apple-splash-1284-2778.jpg\",\n \"revision\": \"addde3eed9689014cbfde269d99c40d8\"\n },\n {\n \"url\": \"assets/icons/apple-splash-1334-750.jpg\",\n \"revision\": \"cbdf620a64e3c85f83517bfca8a183b4\"\n },\n {\n \"url\": \"assets/icons/apple-splash-1536-2048.jpg\",\n \"revision\": \"aaedc615b3bb000477ae5eecc93943d3\"\n },\n {\n \"url\": \"assets/icons/apple-splash-1620-2160.jpg\",\n \"revision\": \"444aee6b83f417a2dd784dfbdc522270\"\n },\n {\n \"url\": \"assets/icons/apple-splash-1668-2224.jpg\",\n \"revision\": \"c1c1e44e971f00ac1063f7e2b2f9772e\"\n },\n {\n \"url\": \"assets/icons/apple-splash-1668-2388.jpg\",\n \"revision\": \"0c8e8600dff7440591e99004d5a7bb32\"\n },\n {\n \"url\": \"assets/icons/apple-splash-1792-828.jpg\",\n \"revision\": \"b2d7d564e6f46c02ec178e9a12cb3c5d\"\n },\n {\n \"url\": \"assets/icons/apple-splash-2048-1536.jpg\",\n \"revision\": \"c4279e63aefc511fea7492c6215377c2\"\n },\n {\n \"url\": \"assets/icons/apple-splash-2048-2732.jpg\",\n \"revision\": \"c37c7c2f7e78e2b956f31259c2d9ac85\"\n },\n {\n \"url\": \"assets/icons/apple-splash-2160-1620.jpg\",\n \"revision\": \"8fb8eea1faf3f95208ee662e33e9ff60\"\n },\n {\n \"url\": \"assets/icons/apple-splash-2208-1242.jpg\",\n \"revision\": \"e1171e2e04777003c2447a5fa4cf3b9c\"\n },\n {\n \"url\": \"assets/icons/apple-splash-2224-1668.jpg\",\n \"revision\": \"f26f3a1fa40576eb10d33cb0daf16bb7\"\n },\n {\n \"url\": \"assets/icons/apple-splash-2388-1668.jpg\",\n \"revision\": \"c75ae89bc25784991e6282731520f2fa\"\n },\n {\n \"url\": \"assets/icons/apple-splash-2436-1125.jpg\",\n \"revision\": \"6c3bfe1a6f488076078478a17d92451b\"\n },\n {\n \"url\": \"assets/icons/apple-splash-2532-1170.jpg\",\n \"revision\": \"daf53e91675f08f0d2359fb75cde468b\"\n },\n {\n \"url\": \"assets/icons/apple-splash-2688-1242.jpg\",\n \"revision\": \"3f401ccb61d20f6709fb2dc57887059e\"\n },\n {\n \"url\": \"assets/icons/apple-splash-2732-2048.jpg\",\n \"revision\": \"6e40a7ffa96a027822b887f64824f047\"\n },\n {\n \"url\": \"assets/icons/apple-splash-2778-1284.jpg\",\n \"revision\": \"dab87a83ecfad2860101c80064854c08\"\n },\n {\n \"url\": \"assets/icons/apple-splash-640-1136.jpg\",\n \"revision\": \"b469352323e3f41e6081c5ad4a07b1cd\"\n },\n {\n \"url\": \"assets/icons/apple-splash-750-1334.jpg\",\n \"revision\": \"bdb5ef4c95425f3347f6c20d6ef6b330\"\n },\n {\n \"url\": \"assets/icons/apple-splash-828-1792.jpg\",\n \"revision\": \"409bb7f506285c678f45c9fe883af4b4\"\n },\n {\n \"url\": \"assets/icons/manifest-icon-192.png\",\n \"revision\": \"90d2872b1f15aafb2d2094ed4000c465\"\n },\n {\n \"url\": \"assets/icons/manifest-icon-512.png\",\n \"revision\": \"92bfab3098d7b7e73ca06c6cfce989e3\"\n },\n {\n \"url\": \"assets/MediaPlay-Color-Template.png\",\n \"revision\": \"4ba8216795c5c73f06a2e1726091d9ec\"\n },\n {\n \"url\": \"assets/Members.png\",\n \"revision\": \"f5e6c93f52c344c12e915240b0b24313\"\n },\n {\n \"url\": \"assets/MPD_Website_Main_page_banner.png\",\n \"revision\": \"b13b3e38f14ed01809450eda702eb2bd\"\n },\n {\n \"url\": \"assets/MPD-Button-Left.png\",\n \"revision\": \"a742fcd10a2ef25759ade99bd49d6280\"\n },\n {\n \"url\": \"assets/MPD-Button-Right.png\",\n \"revision\": \"aaf67f933dd33274e53b776c752c6c12\"\n },\n {\n \"url\": \"assets/MPD-Family-1-Picture-Compressed.webp\",\n \"revision\": \"1830b8ad10e0d55e6710ca39f59bf275\"\n },\n {\n \"url\": \"assets/MPD-Family-1-Picture.png\",\n \"revision\": \"76db3abcc3ce8e445df63a17233ae3ad\"\n },\n {\n \"url\": \"assets/MPD-Family-2-Picture-Compressed.webp\",\n \"revision\": \"e0572e90239d815cb8e0e64d395d3319\"\n },\n {\n \"url\": \"assets/MPD-Family-2-Picture.png\",\n \"revision\": \"40ab85c923e51610989eb164332e3ac9\"\n },\n {\n \"url\": \"assets/MPD-Family-3-Picture-Compressed.webp\",\n \"revision\": \"ea92e3f9f4f7c455b16e1fcc5a26911f\"\n },\n {\n \"url\": \"assets/MPD-Family-3-Picture.png\",\n \"revision\": \"094138d9e5c47eeb411d8a7ac64d3a5f\"\n },\n {\n \"url\": \"assets/MPD-Family-4-Picture-Compressed.webp\",\n \"revision\": \"95eaafb2731b9817e2d0b5ab26947d03\"\n },\n {\n \"url\": \"assets/MPD-Family-5-Exclusive-Picture-Compressed.webp\",\n \"revision\": \"495ef45656765f77fa3795203d541cde\"\n },\n {\n \"url\": \"assets/MPD-Family-5-Exclusive-Picture.png\",\n \"revision\": \"393aa48d89f1b7241d13ca0acf436e08\"\n },\n {\n \"url\": \"assets/MPD-Family-5-Main-Picture-Compressed.webp\",\n \"revision\": \"7736b606ce9d87bed8f047f253640a9e\"\n },\n {\n \"url\": \"assets/MPD-Family-5-Main-Picture.png\",\n \"revision\": \"b514e5cd86322bfaf724a52e43e3be83\"\n },\n {\n \"url\": \"assets/MPD-Favicon.ico\",\n \"revision\": \"d8aed79cd341f5dfe56ba85e401377b9\"\n },\n {\n \"url\": \"assets/MPD-Logo-512px.png\",\n \"revision\": \"1b331cfa8f01439d6a467993f72c51b6\"\n },\n {\n \"url\": \"assets/MPD-Logo-with-Text.png\",\n \"revision\": \"eab35af58babab6cebcee313d42d24f0\"\n },\n {\n \"url\": \"assets/MPD-Logo.png\",\n \"revision\": \"e570c93e31e94343d292209428b7bc7d\"\n },\n {\n \"url\": \"assets/MPD-NVO-18-Family-Picture-Compressed.webp\",\n \"revision\": \"6afcb809d739137cbde27d89231c1e15\"\n },\n {\n \"url\": \"assets/MPD-NVO-18-Family-Picture.png\",\n \"revision\": \"ec63f16317a40f2c190742eab85218fb\"\n },\n {\n \"url\": \"assets/News.png\",\n \"revision\": \"e7f7a15d67a79e5e38a4443d1f266c01\"\n },\n {\n \"url\": \"assets/Old-UI.png\",\n \"revision\": \"dafd8020bb0ea668ade21ff04551a331\"\n },\n {\n \"url\": \"assets/Old-Website-Screenshot.png\",\n \"revision\": \"aceb3d8f45fe0b4a67da93c1d1f455c9\"\n },\n {\n \"url\": \"assets/Status.png\",\n \"revision\": \"702b183d23bdea8174756cd0a363b077\"\n },\n {\n \"url\": \"assets/svg/404-page-art.svg\",\n \"revision\": \"c9c637b41712ca9b7734ecf468041eba\"\n },\n {\n \"url\": \"assets/svg/doodle.svg\",\n \"revision\": \"f59340cdfa9c4aba1976f4f0dc4f6bb3\"\n },\n {\n \"url\": \"community.html\",\n \"revision\": \"41070c61685d61c7641da95771caaaa5\"\n },\n {\n \"url\": \"css/main.css\",\n \"revision\": \"d2317848141cef4059659b979611e0da\"\n },\n {\n \"url\": \"css/navbar.css\",\n \"revision\": \"fc649fb138bd642eae954a87a1ed0a82\"\n },\n {\n \"url\": \"css/scrollBar.css\",\n \"revision\": \"7f6bc5325619d3acfec000921b7a439d\"\n },\n {\n \"url\": \"css/slideshow.css\",\n \"revision\": \"e6ba400c0da0ec81a8643e3203d2b85c\"\n },\n {\n \"url\": \"index.html\",\n \"revision\": \"0b1857081f7cdc205f853e960f47f067\"\n },\n {\n \"url\": \"manifest.json\",\n \"revision\": \"b1f269bc00e4475d429fb8de8ddf9331\"\n },\n {\n \"url\": \"servers.html\",\n \"revision\": \"fd1eaa5dff5573ed4b57b4522c2609ca\"\n },\n {\n \"url\": \"submissions/404-page-art/sketch1613828200299.png\",\n \"revision\": \"250851e828769100bb3b307bd210e4ac\"\n }\n], {\n \"ignoreURLParametersMatching\": [/^utm_/, /^fbclid$/]\n});\n\n\n\n\n\n\n\n\n"],"names":["self","addEventListener","event","data","type","skipWaiting"],"mappings":"0yBAmBAA,KAAKC,iBAAiB,WAAYC,IAC5BA,EAAMC,MAA4B,iBAApBD,EAAMC,KAAKC,MAC3BJ,KAAKK,oCAY2B,CAClC,KACS,oBACK,oCAEd,KACS,2CACK,oCAEd,KACS,mDACK,oCAEd,KACS,kDACK,oCAEd,KACS,mDACK,oCAEd,KACS,mDACK,oCAEd,KACS,mDACK,oCAEd,KACS,mDACK,oCAEd,KACS,kDACK,oCAEd,KACS,mDACK,oCAEd,KACS,mDACK,oCAEd,KACS,mDACK,oCAEd,KACS,mDACK,oCAEd,KACS,kDACK,oCAEd,KACS,mDACK,oCAEd,KACS,mDACK,oCAEd,KACS,mDACK,oCAEd,KACS,mDACK,oCAEd,KACS,mDACK,oCAEd,KACS,mDACK,oCAEd,KACS,mDACK,oCAEd,KACS,mDACK,oCAEd,KACS,mDACK,oCAEd,KACS,mDACK,oCAEd,KACS,mDACK,oCAEd,KACS,kDACK,oCAEd,KACS,kDACK,oCAEd,KACS,kDACK,oCAEd,KACS,8CACK,oCAEd,KACS,8CACK,oCAEd,KACS,+CACK,oCAEd,KACS,8BACK,oCAEd,KACS,mDACK,oCAEd,KACS,sCACK,oCAEd,KACS,uCACK,oCAEd,KACS,uDACK,oCAEd,KACS,2CACK,oCAEd,KACS,uDACK,oCAEd,KACS,2CACK,oCAEd,KACS,uDACK,oCAEd,KACS,2CACK,oCAEd,KACS,uDACK,oCAEd,KACS,iEACK,oCAEd,KACS,qDACK,oCAEd,KACS,4DACK,oCAEd,KACS,gDACK,oCAEd,KACS,kCACK,oCAEd,KACS,qCACK,oCAEd,KACS,yCACK,oCAEd,KACS,+BACK,oCAEd,KACS,4DACK,oCAEd,KACS,gDACK,oCAEd,KACS,2BACK,oCAEd,KACS,6BACK,oCAEd,KACS,6CACK,oCAEd,KACS,6BACK,oCAEd,KACS,uCACK,oCAEd,KACS,iCACK,oCAEd,KACS,0BACK,oCAEd,KACS,wBACK,oCAEd,KACS,0BACK,oCAEd,KACS,6BACK,oCAEd,KACS,6BACK,oCAEd,KACS,sBACK,oCAEd,KACS,yBACK,oCAEd,KACS,wBACK,oCAEd,KACS,4DACK,qCAEb,6BAC8B,CAAC,QAAS"}
\ No newline at end of file
diff --git a/workbox-0788a2bf.js b/workbox-0788a2bf.js
deleted file mode 100644
index f97d699..0000000
--- a/workbox-0788a2bf.js
+++ /dev/null
@@ -1,2 +0,0 @@
-define("./workbox-0788a2bf.js",["exports"],(function(t){"use strict";try{self["workbox:core:6.2.4"]&&_()}catch(t){}const e=(t,...e)=>{let s=t;return e.length>0&&(s+=` :: ${JSON.stringify(e)}`),s};class s extends Error{constructor(t,s){super(e(t,s)),this.name=t,this.details=s}}try{self["workbox:routing:6.2.4"]&&_()}catch(t){}const n=t=>t&&"object"==typeof t?t:{handle:t};class i{constructor(t,e,s="GET"){this.handler=n(e),this.match=t,this.method=s}setCatchHandler(t){this.catchHandler=n(t)}}class r extends i{constructor(t,e,s){super((({url:e})=>{const s=t.exec(e.href);if(s&&(e.origin===location.origin||0===s.index))return s.slice(1)}),e,s)}}class o{constructor(){this.t=new Map,this.i=new Map}get routes(){return this.t}addFetchListener(){self.addEventListener("fetch",(t=>{const{request:e}=t,s=this.handleRequest({request:e,event:t});s&&t.respondWith(s)}))}addCacheListener(){self.addEventListener("message",(t=>{if(t.data&&"CACHE_URLS"===t.data.type){const{payload:e}=t.data,s=Promise.all(e.urlsToCache.map((e=>{"string"==typeof e&&(e=[e]);const s=new Request(...e);return this.handleRequest({request:s,event:t})})));t.waitUntil(s),t.ports&&t.ports[0]&&s.then((()=>t.ports[0].postMessage(!0)))}}))}handleRequest({request:t,event:e}){const s=new URL(t.url,location.href);if(!s.protocol.startsWith("http"))return;const n=s.origin===location.origin,{params:i,route:r}=this.findMatchingRoute({event:e,request:t,sameOrigin:n,url:s});let o=r&&r.handler;const a=t.method;if(!o&&this.i.has(a)&&(o=this.i.get(a)),!o)return;let c;try{c=o.handle({url:s,request:t,event:e,params:i})}catch(t){c=Promise.reject(t)}const h=r&&r.catchHandler;return c instanceof Promise&&(this.o||h)&&(c=c.catch((async n=>{if(h)try{return await h.handle({url:s,request:t,event:e,params:i})}catch(t){t instanceof Error&&(n=t)}if(this.o)return this.o.handle({url:s,request:t,event:e});throw n}))),c}findMatchingRoute({url:t,sameOrigin:e,request:s,event:n}){const i=this.t.get(s.method)||[];for(const r of i){let i;const o=r.match({url:t,sameOrigin:e,request:s,event:n});if(o)return i=o,(Array.isArray(i)&&0===i.length||o.constructor===Object&&0===Object.keys(o).length||"boolean"==typeof o)&&(i=void 0),{route:r,params:i}}return{}}setDefaultHandler(t,e="GET"){this.i.set(e,n(t))}setCatchHandler(t){this.o=n(t)}registerRoute(t){this.t.has(t.method)||this.t.set(t.method,[]),this.t.get(t.method).push(t)}unregisterRoute(t){if(!this.t.has(t.method))throw new s("unregister-route-but-not-found-with-method",{method:t.method});const e=this.t.get(t.method).indexOf(t);if(!(e>-1))throw new s("unregister-route-route-not-registered");this.t.get(t.method).splice(e,1)}}let a;const c={googleAnalytics:"googleAnalytics",precache:"precache-v2",prefix:"workbox",runtime:"runtime",suffix:"undefined"!=typeof registration?registration.scope:""},h=t=>[c.prefix,t,c.suffix].filter((t=>t&&t.length>0)).join("-"),u=t=>t||h(c.precache),l=t=>t||h(c.runtime);function f(t,e){const s=e();return t.waitUntil(s),s}try{self["workbox:precaching:6.2.4"]&&_()}catch(t){}function w(t){if(!t)throw new s("add-to-cache-list-unexpected-type",{entry:t});if("string"==typeof t){const e=new URL(t,location.href);return{cacheKey:e.href,url:e.href}}const{revision:e,url:n}=t;if(!n)throw new s("add-to-cache-list-unexpected-type",{entry:t});if(!e){const t=new URL(n,location.href);return{cacheKey:t.href,url:t.href}}const i=new URL(n,location.href),r=new URL(n,location.href);return i.searchParams.set("__WB_REVISION__",e),{cacheKey:i.href,url:r.href}}class d{constructor(){this.updatedURLs=[],this.notUpdatedURLs=[],this.handlerWillStart=async({request:t,state:e})=>{e&&(e.originalRequest=t)},this.cachedResponseWillBeUsed=async({event:t,state:e,cachedResponse:s})=>{if("install"===t.type&&e&&e.originalRequest&&e.originalRequest instanceof Request){const t=e.originalRequest.url;s?this.notUpdatedURLs.push(t):this.updatedURLs.push(t)}return s}}}class p{constructor({precacheController:t}){this.cacheKeyWillBeUsed=async({request:t,params:e})=>{const s=(null==e?void 0:e.cacheKey)||this.h.getCacheKeyForURL(t.url);return s?new Request(s,{headers:t.headers}):t},this.h=t}}let y;async function g(t,e){let n=null;if(t.url){n=new URL(t.url).origin}if(n!==self.location.origin)throw new s("cross-origin-copy-response",{origin:n});const i=t.clone(),r={headers:new Headers(i.headers),status:i.status,statusText:i.statusText},o=e?e(r):r,a=function(){if(void 0===y){const t=new Response("");if("body"in t)try{new Response(t.body),y=!0}catch(t){y=!1}y=!1}return y}()?i.body:await i.blob();return new Response(a,o)}function R(t,e){const s=new URL(t);for(const t of e)s.searchParams.delete(t);return s.href}class m{constructor(){this.promise=new Promise(((t,e)=>{this.resolve=t,this.reject=e}))}}const v=new Set;try{self["workbox:strategies:6.2.4"]&&_()}catch(t){}function q(t){return"string"==typeof t?new Request(t):t}class U{constructor(t,e){this.u={},Object.assign(this,e),this.event=e.event,this.l=t,this.p=new m,this.g=[],this.R=[...t.plugins],this.m=new Map;for(const t of this.R)this.m.set(t,{});this.event.waitUntil(this.p.promise)}async fetch(t){const{event:e}=this;let n=q(t);if("navigate"===n.mode&&e instanceof FetchEvent&&e.preloadResponse){const t=await e.preloadResponse;if(t)return t}const i=this.hasCallback("fetchDidFail")?n.clone():null;try{for(const t of this.iterateCallbacks("requestWillFetch"))n=await t({request:n.clone(),event:e})}catch(t){if(t instanceof Error)throw new s("plugin-error-request-will-fetch",{thrownErrorMessage:t.message})}const r=n.clone();try{let t;t=await fetch(n,"navigate"===n.mode?void 0:this.l.fetchOptions);for(const s of this.iterateCallbacks("fetchDidSucceed"))t=await s({event:e,request:r,response:t});return t}catch(t){throw i&&await this.runCallbacks("fetchDidFail",{error:t,event:e,originalRequest:i.clone(),request:r.clone()}),t}}async fetchAndCachePut(t){const e=await this.fetch(t),s=e.clone();return this.waitUntil(this.cachePut(t,s)),e}async cacheMatch(t){const e=q(t);let s;const{cacheName:n,matchOptions:i}=this.l,r=await this.getCacheKey(e,"read"),o=Object.assign(Object.assign({},i),{cacheName:n});s=await caches.match(r,o);for(const t of this.iterateCallbacks("cachedResponseWillBeUsed"))s=await t({cacheName:n,matchOptions:i,cachedResponse:s,request:r,event:this.event})||void 0;return s}async cachePut(t,e){const n=q(t);var i;await(i=0,new Promise((t=>setTimeout(t,i))));const r=await this.getCacheKey(n,"write");if(!e)throw new s("cache-put-with-no-response",{url:(o=r.url,new URL(String(o),location.href).href.replace(new RegExp(`^${location.origin}`),""))});var o;const a=await this.v(e);if(!a)return!1;const{cacheName:c,matchOptions:h}=this.l,u=await self.caches.open(c),l=this.hasCallback("cacheDidUpdate"),f=l?await async function(t,e,s,n){const i=R(e.url,s);if(e.url===i)return t.match(e,n);const r=Object.assign(Object.assign({},n),{ignoreSearch:!0}),o=await t.keys(e,r);for(const e of o)if(i===R(e.url,s))return t.match(e,n)}(u,r.clone(),["__WB_REVISION__"],h):null;try{await u.put(r,l?a.clone():a)}catch(t){if(t instanceof Error)throw"QuotaExceededError"===t.name&&await async function(){for(const t of v)await t()}(),t}for(const t of this.iterateCallbacks("cacheDidUpdate"))await t({cacheName:c,oldResponse:f,newResponse:a.clone(),request:r,event:this.event});return!0}async getCacheKey(t,e){if(!this.u[e]){let s=t;for(const t of this.iterateCallbacks("cacheKeyWillBeUsed"))s=q(await t({mode:e,request:s,event:this.event,params:this.params}));this.u[e]=s}return this.u[e]}hasCallback(t){for(const e of this.l.plugins)if(t in e)return!0;return!1}async runCallbacks(t,e){for(const s of this.iterateCallbacks(t))await s(e)}*iterateCallbacks(t){for(const e of this.l.plugins)if("function"==typeof e[t]){const s=this.m.get(e),n=n=>{const i=Object.assign(Object.assign({},n),{state:s});return e[t](i)};yield n}}waitUntil(t){return this.g.push(t),t}async doneWaiting(){let t;for(;t=this.g.shift();)await t}destroy(){this.p.resolve(null)}async v(t){let e=t,s=!1;for(const t of this.iterateCallbacks("cacheWillUpdate"))if(e=await t({request:this.request,response:e,event:this.event})||void 0,s=!0,!e)break;return s||e&&200!==e.status&&(e=void 0),e}}class b extends class{constructor(t={}){this.cacheName=l(t.cacheName),this.plugins=t.plugins||[],this.fetchOptions=t.fetchOptions,this.matchOptions=t.matchOptions}handle(t){const[e]=this.handleAll(t);return e}handleAll(t){t instanceof FetchEvent&&(t={event:t,request:t.request});const e=t.event,s="string"==typeof t.request?new Request(t.request):t.request,n="params"in t?t.params:void 0,i=new U(this,{event:e,request:s,params:n}),r=this.q(i,s,e);return[r,this.U(r,i,s,e)]}async q(t,e,n){let i;await t.runCallbacks("handlerWillStart",{event:n,request:e});try{if(i=await this.L(e,t),!i||"error"===i.type)throw new s("no-response",{url:e.url})}catch(s){if(s instanceof Error)for(const r of t.iterateCallbacks("handlerDidError"))if(i=await r({error:s,event:n,request:e}),i)break;if(!i)throw s}for(const s of t.iterateCallbacks("handlerWillRespond"))i=await s({event:n,request:e,response:i});return i}async U(t,e,s,n){let i,r;try{i=await t}catch(r){}try{await e.runCallbacks("handlerDidRespond",{event:n,request:s,response:i}),await e.doneWaiting()}catch(t){t instanceof Error&&(r=t)}if(await e.runCallbacks("handlerDidComplete",{event:n,request:s,response:i,error:r}),e.destroy(),r)throw r}}{constructor(t={}){t.cacheName=u(t.cacheName),super(t),this._=!1!==t.fallbackToNetwork,this.plugins.push(b.copyRedirectedCacheableResponsesPlugin)}async L(t,e){const s=await e.cacheMatch(t);return s||(e.event&&"install"===e.event.type?await this.C(t,e):await this.O(t,e))}async O(t,e){let n;const i=e.params||{};if(!this._)throw new s("missing-precache-entry",{cacheName:this.cacheName,url:t.url});{const s=i.integrity,r=t.integrity,o=!r||r===s;n=await e.fetch(new Request(t,{integrity:r||s})),s&&o&&(this.N(),await e.cachePut(t,n.clone()))}return n}async C(t,e){this.N();const n=await e.fetch(t);if(!await e.cachePut(t,n.clone()))throw new s("bad-precaching-response",{url:t.url,status:n.status});return n}N(){let t=null,e=0;for(const[s,n]of this.plugins.entries())n!==b.copyRedirectedCacheableResponsesPlugin&&(n===b.defaultPrecacheCacheabilityPlugin&&(t=s),n.cacheWillUpdate&&e++);0===e?this.plugins.push(b.defaultPrecacheCacheabilityPlugin):e>1&&null!==t&&this.plugins.splice(t,1)}}b.defaultPrecacheCacheabilityPlugin={cacheWillUpdate:async({response:t})=>!t||t.status>=400?null:t},b.copyRedirectedCacheableResponsesPlugin={cacheWillUpdate:async({response:t})=>t.redirected?await g(t):t};class L{constructor({cacheName:t,plugins:e=[],fallbackToNetwork:s=!0}={}){this.k=new Map,this.j=new Map,this.K=new Map,this.l=new b({cacheName:u(t),plugins:[...e,new p({precacheController:this})],fallbackToNetwork:s}),this.install=this.install.bind(this),this.activate=this.activate.bind(this)}get strategy(){return this.l}precache(t){this.addToCacheList(t),this.T||(self.addEventListener("install",this.install),self.addEventListener("activate",this.activate),this.T=!0)}addToCacheList(t){const e=[];for(const n of t){"string"==typeof n?e.push(n):n&&void 0===n.revision&&e.push(n.url);const{cacheKey:t,url:i}=w(n),r="string"!=typeof n&&n.revision?"reload":"default";if(this.k.has(i)&&this.k.get(i)!==t)throw new s("add-to-cache-list-conflicting-entries",{firstEntry:this.k.get(i),secondEntry:t});if("string"!=typeof n&&n.integrity){if(this.K.has(t)&&this.K.get(t)!==n.integrity)throw new s("add-to-cache-list-conflicting-integrities",{url:i});this.K.set(t,n.integrity)}if(this.k.set(i,t),this.j.set(i,r),e.length>0){const t=`Workbox is precaching URLs without revision info: ${e.join(", ")}\nThis is generally NOT safe. Learn more at https://bit.ly/wb-precache`;console.warn(t)}}}install(t){return f(t,(async()=>{const e=new d;this.strategy.plugins.push(e);for(const[e,s]of this.k){const n=this.K.get(s),i=this.j.get(e),r=new Request(e,{integrity:n,cache:i,credentials:"same-origin"});await Promise.all(this.strategy.handleAll({params:{cacheKey:s},request:r,event:t}))}const{updatedURLs:s,notUpdatedURLs:n}=e;return{updatedURLs:s,notUpdatedURLs:n}}))}activate(t){return f(t,(async()=>{const t=await self.caches.open(this.strategy.cacheName),e=await t.keys(),s=new Set(this.k.values()),n=[];for(const i of e)s.has(i.url)||(await t.delete(i),n.push(i.url));return{deletedURLs:n}}))}getURLsToCacheKeys(){return this.k}getCachedURLs(){return[...this.k.keys()]}getCacheKeyForURL(t){const e=new URL(t,location.href);return this.k.get(e.href)}getIntegrityForCacheKey(t){return this.K.get(t)}async matchPrecache(t){const e=t instanceof Request?t.url:t,s=this.getCacheKeyForURL(e);if(s){return(await self.caches.open(this.strategy.cacheName)).match(s)}}createHandlerBoundToURL(t){const e=this.getCacheKeyForURL(t);if(!e)throw new s("non-precached-url",{url:t});return s=>(s.request=new Request(t),s.params=Object.assign({cacheKey:e},s.params),this.strategy.handle(s))}}let C;const E=()=>(C||(C=new L),C);class O extends i{constructor(t,e){super((({request:s})=>{const n=t.getURLsToCacheKeys();for(const i of function*(t,{ignoreURLParametersMatching:e=[/^utm_/,/^fbclid$/],directoryIndex:s="index.html",cleanURLs:n=!0,urlManipulation:i}={}){const r=new URL(t,location.href);r.hash="",yield r.href;const o=function(t,e=[]){for(const s of[...t.searchParams.keys()])e.some((t=>t.test(s)))&&t.searchParams.delete(s);return t}(r,e);if(yield o.href,s&&o.pathname.endsWith("/")){const t=new URL(o.href);t.pathname+=s,yield t.href}if(n){const t=new URL(o.href);t.pathname+=".html",yield t.href}if(i){const t=i({url:r});for(const e of t)yield e.href}}(s.url,e)){const e=n.get(i);if(e){return{cacheKey:e,integrity:t.getIntegrityForCacheKey(e)}}}}),t.strategy)}}function x(t){const e=E();!function(t,e,n){let c;if("string"==typeof t){const s=new URL(t,location.href);c=new i((({url:t})=>t.href===s.href),e,n)}else if(t instanceof RegExp)c=new r(t,e,n);else if("function"==typeof t)c=new i(t,e,n);else{if(!(t instanceof i))throw new s("unsupported-route-type",{moduleName:"workbox-routing",funcName:"registerRoute",paramName:"capture"});c=t}(a||(a=new o,a.addFetchListener(),a.addCacheListener()),a).registerRoute(c)}(new O(e,t))}t.precacheAndRoute=function(t,e){!function(t){E().precache(t)}(t),x(e)}}));
-//# sourceMappingURL=workbox-0788a2bf.js.map
diff --git a/workbox-0788a2bf.js.map b/workbox-0788a2bf.js.map
deleted file mode 100644
index 29ef13b..0000000
--- a/workbox-0788a2bf.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"workbox-0788a2bf.js","sources":["../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-core/_version.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-core/_private/logger.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-core/models/messages/messageGenerator.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-core/_private/WorkboxError.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-routing/_version.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-routing/utils/constants.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-routing/utils/normalizeHandler.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-routing/Route.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-routing/RegExpRoute.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-routing/Router.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-routing/utils/getOrCreateDefaultRouter.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-core/_private/cacheNames.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-core/_private/waitUntil.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-precaching/_version.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-precaching/utils/createCacheKey.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-precaching/utils/PrecacheInstallReportPlugin.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-precaching/utils/PrecacheCacheKeyPlugin.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-core/_private/canConstructResponseFromBodyStream.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-core/copyResponse.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-core/_private/cacheMatchIgnoreParams.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-core/_private/Deferred.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-core/models/quotaErrorCallbacks.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-strategies/_version.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-strategies/StrategyHandler.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-core/_private/timeout.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-core/_private/getFriendlyURL.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-core/_private/executeQuotaErrorCallbacks.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-precaching/PrecacheStrategy.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-strategies/Strategy.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-precaching/PrecacheController.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-precaching/utils/getOrCreatePrecacheController.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-precaching/PrecacheRoute.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-precaching/utils/generateURLVariations.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-precaching/utils/removeIgnoredSearchParams.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-precaching/addRoute.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-routing/registerRoute.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-precaching/precacheAndRoute.js","../../../../usr/lib/node_modules/workbox-cli/node_modules/workbox-precaching/precache.js"],"sourcesContent":["\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:core:6.2.4'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2019 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nconst logger = (process.env.NODE_ENV === 'production' ? null : (() => {\n // Don't overwrite this value if it's already set.\n // See https://github.com/GoogleChrome/workbox/pull/2284#issuecomment-560470923\n if (!('__WB_DISABLE_DEV_LOGS' in self)) {\n self.__WB_DISABLE_DEV_LOGS = false;\n }\n let inGroup = false;\n const methodToColorMap = {\n debug: `#7f8c8d`,\n log: `#2ecc71`,\n warn: `#f39c12`,\n error: `#c0392b`,\n groupCollapsed: `#3498db`,\n groupEnd: null,\n };\n const print = function (method, args) {\n if (self.__WB_DISABLE_DEV_LOGS) {\n return;\n }\n if (method === 'groupCollapsed') {\n // Safari doesn't print all console.groupCollapsed() arguments:\n // https://bugs.webkit.org/show_bug.cgi?id=182754\n if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\n console[method](...args);\n return;\n }\n }\n const styles = [\n `background: ${methodToColorMap[method]}`,\n `border-radius: 0.5em`,\n `color: white`,\n `font-weight: bold`,\n `padding: 2px 0.5em`,\n ];\n // When in a group, the workbox prefix is not displayed.\n const logPrefix = inGroup ? [] : ['%cworkbox', styles.join(';')];\n console[method](...logPrefix, ...args);\n if (method === 'groupCollapsed') {\n inGroup = true;\n }\n if (method === 'groupEnd') {\n inGroup = false;\n }\n };\n // eslint-disable-next-line @typescript-eslint/ban-types\n const api = {};\n const loggerMethods = Object.keys(methodToColorMap);\n for (const key of loggerMethods) {\n const method = key;\n api[method] = (...args) => {\n print(method, args);\n };\n }\n return api;\n})());\nexport { logger };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { messages } from './messages.js';\nimport '../../_version.js';\nconst fallback = (code, ...args) => {\n let msg = code;\n if (args.length > 0) {\n msg += ` :: ${JSON.stringify(args)}`;\n }\n return msg;\n};\nconst generatorFunction = (code, details = {}) => {\n const message = messages[code];\n if (!message) {\n throw new Error(`Unable to find message for code '${code}'.`);\n }\n return message(details);\n};\nexport const messageGenerator = (process.env.NODE_ENV === 'production') ?\n fallback : generatorFunction;\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { messageGenerator } from '../models/messages/messageGenerator.js';\nimport '../_version.js';\n/**\n * Workbox errors should be thrown with this class.\n * This allows use to ensure the type easily in tests,\n * helps developers identify errors from workbox\n * easily and allows use to optimise error\n * messages correctly.\n *\n * @private\n */\nclass WorkboxError extends Error {\n /**\n *\n * @param {string} errorCode The error code that\n * identifies this particular error.\n * @param {Object=} details Any relevant arguments\n * that will help developers identify issues should\n * be added as a key on the context object.\n */\n constructor(errorCode, details) {\n const message = messageGenerator(errorCode, details);\n super(message);\n this.name = errorCode;\n this.details = details;\n }\n}\nexport { WorkboxError };\n","\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:routing:6.2.4'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * The default HTTP method, 'GET', used when there's no specific method\n * configured for a route.\n *\n * @type {string}\n *\n * @private\n */\nexport const defaultMethod = 'GET';\n/**\n * The list of valid HTTP methods associated with requests that could be routed.\n *\n * @type {Array}\n *\n * @private\n */\nexport const validMethods = [\n 'DELETE',\n 'GET',\n 'HEAD',\n 'PATCH',\n 'POST',\n 'PUT',\n];\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport '../_version.js';\n/**\n * @param {function()|Object} handler Either a function, or an object with a\n * 'handle' method.\n * @return {Object} An object with a handle method.\n *\n * @private\n */\nexport const normalizeHandler = (handler) => {\n if (handler && typeof handler === 'object') {\n if (process.env.NODE_ENV !== 'production') {\n assert.hasMethod(handler, 'handle', {\n moduleName: 'workbox-routing',\n className: 'Route',\n funcName: 'constructor',\n paramName: 'handler',\n });\n }\n return handler;\n }\n else {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(handler, 'function', {\n moduleName: 'workbox-routing',\n className: 'Route',\n funcName: 'constructor',\n paramName: 'handler',\n });\n }\n return { handle: handler };\n }\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { defaultMethod, validMethods } from './utils/constants.js';\nimport { normalizeHandler } from './utils/normalizeHandler.js';\nimport './_version.js';\n/**\n * A `Route` consists of a pair of callback functions, \"match\" and \"handler\".\n * The \"match\" callback determine if a route should be used to \"handle\" a\n * request by returning a non-falsy value if it can. The \"handler\" callback\n * is called when there is a match and should return a Promise that resolves\n * to a `Response`.\n *\n * @memberof module:workbox-routing\n */\nclass Route {\n /**\n * Constructor for Route class.\n *\n * @param {module:workbox-routing~matchCallback} match\n * A callback function that determines whether the route matches a given\n * `fetch` event by returning a non-falsy value.\n * @param {module:workbox-routing~handlerCallback} handler A callback\n * function that returns a Promise resolving to a Response.\n * @param {string} [method='GET'] The HTTP method to match the Route\n * against.\n */\n constructor(match, handler, method = defaultMethod) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(match, 'function', {\n moduleName: 'workbox-routing',\n className: 'Route',\n funcName: 'constructor',\n paramName: 'match',\n });\n if (method) {\n assert.isOneOf(method, validMethods, { paramName: 'method' });\n }\n }\n // These values are referenced directly by Router so cannot be\n // altered by minificaton.\n this.handler = normalizeHandler(handler);\n this.match = match;\n this.method = method;\n }\n /**\n *\n * @param {module:workbox-routing-handlerCallback} handler A callback\n * function that returns a Promise resolving to a Response\n */\n setCatchHandler(handler) {\n this.catchHandler = normalizeHandler(handler);\n }\n}\nexport { Route };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { Route } from './Route.js';\nimport './_version.js';\n/**\n * RegExpRoute makes it easy to create a regular expression based\n * [Route]{@link module:workbox-routing.Route}.\n *\n * For same-origin requests the RegExp only needs to match part of the URL. For\n * requests against third-party servers, you must define a RegExp that matches\n * the start of the URL.\n *\n * [See the module docs for info.]{@link https://developers.google.com/web/tools/workbox/modules/workbox-routing}\n *\n * @memberof module:workbox-routing\n * @extends module:workbox-routing.Route\n */\nclass RegExpRoute extends Route {\n /**\n * If the regular expression contains\n * [capture groups]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#grouping-back-references},\n * the captured values will be passed to the\n * [handler's]{@link module:workbox-routing~handlerCallback} `params`\n * argument.\n *\n * @param {RegExp} regExp The regular expression to match against URLs.\n * @param {module:workbox-routing~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n * @param {string} [method='GET'] The HTTP method to match the Route\n * against.\n */\n constructor(regExp, handler, method) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(regExp, RegExp, {\n moduleName: 'workbox-routing',\n className: 'RegExpRoute',\n funcName: 'constructor',\n paramName: 'pattern',\n });\n }\n const match = ({ url }) => {\n const result = regExp.exec(url.href);\n // Return immediately if there's no match.\n if (!result) {\n return;\n }\n // Require that the match start at the first character in the URL string\n // if it's a cross-origin request.\n // See https://github.com/GoogleChrome/workbox/issues/281 for the context\n // behind this behavior.\n if ((url.origin !== location.origin) && (result.index !== 0)) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`The regular expression '${regExp.toString()}' only partially matched ` +\n `against the cross-origin URL '${url.toString()}'. RegExpRoute's will only ` +\n `handle cross-origin requests if they match the entire URL.`);\n }\n return;\n }\n // If the route matches, but there aren't any capture groups defined, then\n // this will return [], which is truthy and therefore sufficient to\n // indicate a match.\n // If there are capture groups, then it will return their values.\n return result.slice(1);\n };\n super(match, handler, method);\n }\n}\nexport { RegExpRoute };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { defaultMethod } from './utils/constants.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { normalizeHandler } from './utils/normalizeHandler.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport './_version.js';\n/**\n * The Router can be used to process a FetchEvent through one or more\n * [Routes]{@link module:workbox-routing.Route} responding with a Request if\n * a matching route exists.\n *\n * If no route matches a given a request, the Router will use a \"default\"\n * handler if one is defined.\n *\n * Should the matching Route throw an error, the Router will use a \"catch\"\n * handler if one is defined to gracefully deal with issues and respond with a\n * Request.\n *\n * If a request matches multiple routes, the **earliest** registered route will\n * be used to respond to the request.\n *\n * @memberof module:workbox-routing\n */\nclass Router {\n /**\n * Initializes a new Router.\n */\n constructor() {\n this._routes = new Map();\n this._defaultHandlerMap = new Map();\n }\n /**\n * @return {Map>} routes A `Map` of HTTP\n * method name ('GET', etc.) to an array of all the corresponding `Route`\n * instances that are registered.\n */\n get routes() {\n return this._routes;\n }\n /**\n * Adds a fetch event listener to respond to events when a route matches\n * the event's request.\n */\n addFetchListener() {\n // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705\n self.addEventListener('fetch', ((event) => {\n const { request } = event;\n const responsePromise = this.handleRequest({ request, event });\n if (responsePromise) {\n event.respondWith(responsePromise);\n }\n }));\n }\n /**\n * Adds a message event listener for URLs to cache from the window.\n * This is useful to cache resources loaded on the page prior to when the\n * service worker started controlling it.\n *\n * The format of the message data sent from the window should be as follows.\n * Where the `urlsToCache` array may consist of URL strings or an array of\n * URL string + `requestInit` object (the same as you'd pass to `fetch()`).\n *\n * ```\n * {\n * type: 'CACHE_URLS',\n * payload: {\n * urlsToCache: [\n * './script1.js',\n * './script2.js',\n * ['./script3.js', {mode: 'no-cors'}],\n * ],\n * },\n * }\n * ```\n */\n addCacheListener() {\n // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705\n self.addEventListener('message', ((event) => {\n // event.data is type 'any'\n if (event.data && event.data.type === 'CACHE_URLS') { // eslint-disable-line\n const { payload } = event.data; // eslint-disable-line\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Caching URLs from the window`, payload.urlsToCache);\n }\n const requestPromises = Promise.all(payload.urlsToCache.map((entry) => {\n if (typeof entry === 'string') {\n entry = [entry];\n }\n const request = new Request(...entry);\n return this.handleRequest({ request, event });\n // TODO(philipwalton): TypeScript errors without this typecast for\n // some reason (probably a bug). The real type here should work but\n // doesn't: `Array | undefined>`.\n })); // TypeScript\n event.waitUntil(requestPromises);\n // If a MessageChannel was used, reply to the message on success.\n if (event.ports && event.ports[0]) {\n void requestPromises.then(() => event.ports[0].postMessage(true));\n }\n }\n }));\n }\n /**\n * Apply the routing rules to a FetchEvent object to get a Response from an\n * appropriate Route's handler.\n *\n * @param {Object} options\n * @param {Request} options.request The request to handle.\n * @param {ExtendableEvent} options.event The event that triggered the\n * request.\n * @return {Promise|undefined} A promise is returned if a\n * registered route can handle the request. If there is no matching\n * route and there's no `defaultHandler`, `undefined` is returned.\n */\n handleRequest({ request, event }) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'handleRequest',\n paramName: 'options.request',\n });\n }\n const url = new URL(request.url, location.href);\n if (!url.protocol.startsWith('http')) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Workbox Router only supports URLs that start with 'http'.`);\n }\n return;\n }\n const sameOrigin = url.origin === location.origin;\n const { params, route } = this.findMatchingRoute({\n event,\n request,\n sameOrigin,\n url,\n });\n let handler = route && route.handler;\n const debugMessages = [];\n if (process.env.NODE_ENV !== 'production') {\n if (handler) {\n debugMessages.push([\n `Found a route to handle this request:`, route,\n ]);\n if (params) {\n debugMessages.push([\n `Passing the following params to the route's handler:`, params,\n ]);\n }\n }\n }\n // If we don't have a handler because there was no matching route, then\n // fall back to defaultHandler if that's defined.\n const method = request.method;\n if (!handler && this._defaultHandlerMap.has(method)) {\n if (process.env.NODE_ENV !== 'production') {\n debugMessages.push(`Failed to find a matching route. Falling ` +\n `back to the default handler for ${method}.`);\n }\n handler = this._defaultHandlerMap.get(method);\n }\n if (!handler) {\n if (process.env.NODE_ENV !== 'production') {\n // No handler so Workbox will do nothing. If logs is set of debug\n // i.e. verbose, we should print out this information.\n logger.debug(`No route found for: ${getFriendlyURL(url)}`);\n }\n return;\n }\n if (process.env.NODE_ENV !== 'production') {\n // We have a handler, meaning Workbox is going to handle the route.\n // print the routing details to the console.\n logger.groupCollapsed(`Router is responding to: ${getFriendlyURL(url)}`);\n debugMessages.forEach((msg) => {\n if (Array.isArray(msg)) {\n logger.log(...msg);\n }\n else {\n logger.log(msg);\n }\n });\n logger.groupEnd();\n }\n // Wrap in try and catch in case the handle method throws a synchronous\n // error. It should still callback to the catch handler.\n let responsePromise;\n try {\n responsePromise = handler.handle({ url, request, event, params });\n }\n catch (err) {\n responsePromise = Promise.reject(err);\n }\n // Get route's catch handler, if it exists\n const catchHandler = route && route.catchHandler;\n if (responsePromise instanceof Promise && (this._catchHandler || catchHandler)) {\n responsePromise = responsePromise.catch(async (err) => {\n // If there's a route catch handler, process that first\n if (catchHandler) {\n if (process.env.NODE_ENV !== 'production') {\n // Still include URL here as it will be async from the console group\n // and may not make sense without the URL\n logger.groupCollapsed(`Error thrown when responding to: ` +\n ` ${getFriendlyURL(url)}. Falling back to route's Catch Handler.`);\n logger.error(`Error thrown by:`, route);\n logger.error(err);\n logger.groupEnd();\n }\n try {\n return await catchHandler.handle({ url, request, event, params });\n }\n catch (catchErr) {\n if (catchErr instanceof Error) {\n err = catchErr;\n }\n }\n }\n if (this._catchHandler) {\n if (process.env.NODE_ENV !== 'production') {\n // Still include URL here as it will be async from the console group\n // and may not make sense without the URL\n logger.groupCollapsed(`Error thrown when responding to: ` +\n ` ${getFriendlyURL(url)}. Falling back to global Catch Handler.`);\n logger.error(`Error thrown by:`, route);\n logger.error(err);\n logger.groupEnd();\n }\n return this._catchHandler.handle({ url, request, event });\n }\n throw err;\n });\n }\n return responsePromise;\n }\n /**\n * Checks a request and URL (and optionally an event) against the list of\n * registered routes, and if there's a match, returns the corresponding\n * route along with any params generated by the match.\n *\n * @param {Object} options\n * @param {URL} options.url\n * @param {boolean} options.sameOrigin The result of comparing `url.origin`\n * against the current origin.\n * @param {Request} options.request The request to match.\n * @param {Event} options.event The corresponding event.\n * @return {Object} An object with `route` and `params` properties.\n * They are populated if a matching route was found or `undefined`\n * otherwise.\n */\n findMatchingRoute({ url, sameOrigin, request, event }) {\n const routes = this._routes.get(request.method) || [];\n for (const route of routes) {\n let params;\n // route.match returns type any, not possible to change right now.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const matchResult = route.match({ url, sameOrigin, request, event });\n if (matchResult) {\n if (process.env.NODE_ENV !== 'production') {\n // Warn developers that using an async matchCallback is almost always\n // not the right thing to do.\n if (matchResult instanceof Promise) {\n logger.warn(`While routing ${getFriendlyURL(url)}, an async ` +\n `matchCallback function was used. Please convert the ` +\n `following route to use a synchronous matchCallback function:`, route);\n }\n }\n // See https://github.com/GoogleChrome/workbox/issues/2079\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n params = matchResult;\n if (Array.isArray(params) && params.length === 0) {\n // Instead of passing an empty array in as params, use undefined.\n params = undefined;\n }\n else if ((matchResult.constructor === Object && // eslint-disable-line\n Object.keys(matchResult).length === 0)) {\n // Instead of passing an empty object in as params, use undefined.\n params = undefined;\n }\n else if (typeof matchResult === 'boolean') {\n // For the boolean value true (rather than just something truth-y),\n // don't set params.\n // See https://github.com/GoogleChrome/workbox/pull/2134#issuecomment-513924353\n params = undefined;\n }\n // Return early if have a match.\n return { route, params };\n }\n }\n // If no match was found above, return and empty object.\n return {};\n }\n /**\n * Define a default `handler` that's called when no routes explicitly\n * match the incoming request.\n *\n * Each HTTP method ('GET', 'POST', etc.) gets its own default handler.\n *\n * Without a default handler, unmatched requests will go against the\n * network as if there were no service worker present.\n *\n * @param {module:workbox-routing~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n * @param {string} [method='GET'] The HTTP method to associate with this\n * default handler. Each method has its own default.\n */\n setDefaultHandler(handler, method = defaultMethod) {\n this._defaultHandlerMap.set(method, normalizeHandler(handler));\n }\n /**\n * If a Route throws an error while handling a request, this `handler`\n * will be called and given a chance to provide a response.\n *\n * @param {module:workbox-routing~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n */\n setCatchHandler(handler) {\n this._catchHandler = normalizeHandler(handler);\n }\n /**\n * Registers a route with the router.\n *\n * @param {module:workbox-routing.Route} route The route to register.\n */\n registerRoute(route) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(route, 'object', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route',\n });\n assert.hasMethod(route, 'match', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route',\n });\n assert.isType(route.handler, 'object', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route',\n });\n assert.hasMethod(route.handler, 'handle', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route.handler',\n });\n assert.isType(route.method, 'string', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route.method',\n });\n }\n if (!this._routes.has(route.method)) {\n this._routes.set(route.method, []);\n }\n // Give precedence to all of the earlier routes by adding this additional\n // route to the end of the array.\n this._routes.get(route.method).push(route);\n }\n /**\n * Unregisters a route with the router.\n *\n * @param {module:workbox-routing.Route} route The route to unregister.\n */\n unregisterRoute(route) {\n if (!this._routes.has(route.method)) {\n throw new WorkboxError('unregister-route-but-not-found-with-method', {\n method: route.method,\n });\n }\n const routeIndex = this._routes.get(route.method).indexOf(route);\n if (routeIndex > -1) {\n this._routes.get(route.method).splice(routeIndex, 1);\n }\n else {\n throw new WorkboxError('unregister-route-route-not-registered');\n }\n }\n}\nexport { Router };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { Router } from '../Router.js';\nimport '../_version.js';\nlet defaultRouter;\n/**\n * Creates a new, singleton Router instance if one does not exist. If one\n * does already exist, that instance is returned.\n *\n * @private\n * @return {Router}\n */\nexport const getOrCreateDefaultRouter = () => {\n if (!defaultRouter) {\n defaultRouter = new Router();\n // The helpers that use the default Router assume these listeners exist.\n defaultRouter.addFetchListener();\n defaultRouter.addCacheListener();\n }\n return defaultRouter;\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nconst _cacheNameDetails = {\n googleAnalytics: 'googleAnalytics',\n precache: 'precache-v2',\n prefix: 'workbox',\n runtime: 'runtime',\n suffix: typeof registration !== 'undefined' ? registration.scope : '',\n};\nconst _createCacheName = (cacheName) => {\n return [_cacheNameDetails.prefix, cacheName, _cacheNameDetails.suffix]\n .filter((value) => value && value.length > 0)\n .join('-');\n};\nconst eachCacheNameDetail = (fn) => {\n for (const key of Object.keys(_cacheNameDetails)) {\n fn(key);\n }\n};\nexport const cacheNames = {\n updateDetails: (details) => {\n eachCacheNameDetail((key) => {\n if (typeof details[key] === 'string') {\n _cacheNameDetails[key] = details[key];\n }\n });\n },\n getGoogleAnalyticsName: (userCacheName) => {\n return userCacheName || _createCacheName(_cacheNameDetails.googleAnalytics);\n },\n getPrecacheName: (userCacheName) => {\n return userCacheName || _createCacheName(_cacheNameDetails.precache);\n },\n getPrefix: () => {\n return _cacheNameDetails.prefix;\n },\n getRuntimeName: (userCacheName) => {\n return userCacheName || _createCacheName(_cacheNameDetails.runtime);\n },\n getSuffix: () => {\n return _cacheNameDetails.suffix;\n },\n};\n","/*\n Copyright 2020 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * A utility method that makes it easier to use `event.waitUntil` with\n * async functions and return the result.\n *\n * @param {ExtendableEvent} event\n * @param {Function} asyncFn\n * @return {Function}\n * @private\n */\nfunction waitUntil(event, asyncFn) {\n const returnPromise = asyncFn();\n event.waitUntil(returnPromise);\n return returnPromise;\n}\nexport { waitUntil };\n","\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:precaching:6.2.4'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport '../_version.js';\n// Name of the search parameter used to store revision info.\nconst REVISION_SEARCH_PARAM = '__WB_REVISION__';\n/**\n * Converts a manifest entry into a versioned URL suitable for precaching.\n *\n * @param {Object|string} entry\n * @return {string} A URL with versioning info.\n *\n * @private\n * @memberof module:workbox-precaching\n */\nexport function createCacheKey(entry) {\n if (!entry) {\n throw new WorkboxError('add-to-cache-list-unexpected-type', { entry });\n }\n // If a precache manifest entry is a string, it's assumed to be a versioned\n // URL, like '/app.abcd1234.js'. Return as-is.\n if (typeof entry === 'string') {\n const urlObject = new URL(entry, location.href);\n return {\n cacheKey: urlObject.href,\n url: urlObject.href,\n };\n }\n const { revision, url } = entry;\n if (!url) {\n throw new WorkboxError('add-to-cache-list-unexpected-type', { entry });\n }\n // If there's just a URL and no revision, then it's also assumed to be a\n // versioned URL.\n if (!revision) {\n const urlObject = new URL(url, location.href);\n return {\n cacheKey: urlObject.href,\n url: urlObject.href,\n };\n }\n // Otherwise, construct a properly versioned URL using the custom Workbox\n // search parameter along with the revision info.\n const cacheKeyURL = new URL(url, location.href);\n const originalURL = new URL(url, location.href);\n cacheKeyURL.searchParams.set(REVISION_SEARCH_PARAM, revision);\n return {\n cacheKey: cacheKeyURL.href,\n url: originalURL.href,\n };\n}\n","/*\n Copyright 2020 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * A plugin, designed to be used with PrecacheController, to determine the\n * of assets that were updated (or not updated) during the install event.\n *\n * @private\n */\nclass PrecacheInstallReportPlugin {\n constructor() {\n this.updatedURLs = [];\n this.notUpdatedURLs = [];\n this.handlerWillStart = async ({ request, state, }) => {\n // TODO: `state` should never be undefined...\n if (state) {\n state.originalRequest = request;\n }\n };\n this.cachedResponseWillBeUsed = async ({ event, state, cachedResponse, }) => {\n if (event.type === 'install') {\n if (state && state.originalRequest\n && state.originalRequest instanceof Request) {\n // TODO: `state` should never be undefined...\n const url = state.originalRequest.url;\n if (cachedResponse) {\n this.notUpdatedURLs.push(url);\n }\n else {\n this.updatedURLs.push(url);\n }\n }\n }\n return cachedResponse;\n };\n }\n}\nexport { PrecacheInstallReportPlugin };\n","/*\n Copyright 2020 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * A plugin, designed to be used with PrecacheController, to translate URLs into\n * the corresponding cache key, based on the current revision info.\n *\n * @private\n */\nclass PrecacheCacheKeyPlugin {\n constructor({ precacheController }) {\n this.cacheKeyWillBeUsed = async ({ request, params, }) => {\n // Params is type any, can't change right now.\n /* eslint-disable */\n const cacheKey = (params === null || params === void 0 ? void 0 : params.cacheKey) ||\n this._precacheController.getCacheKeyForURL(request.url);\n /* eslint-enable */\n return cacheKey\n ? new Request(cacheKey, { headers: request.headers })\n : request;\n };\n this._precacheController = precacheController;\n }\n}\nexport { PrecacheCacheKeyPlugin };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nlet supportStatus;\n/**\n * A utility function that determines whether the current browser supports\n * constructing a new `Response` from a `response.body` stream.\n *\n * @return {boolean} `true`, if the current browser can successfully\n * construct a `Response` from a `response.body` stream, `false` otherwise.\n *\n * @private\n */\nfunction canConstructResponseFromBodyStream() {\n if (supportStatus === undefined) {\n const testResponse = new Response('');\n if ('body' in testResponse) {\n try {\n new Response(testResponse.body);\n supportStatus = true;\n }\n catch (error) {\n supportStatus = false;\n }\n }\n supportStatus = false;\n }\n return supportStatus;\n}\nexport { canConstructResponseFromBodyStream };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { canConstructResponseFromBodyStream } from './_private/canConstructResponseFromBodyStream.js';\nimport { WorkboxError } from './_private/WorkboxError.js';\nimport './_version.js';\n/**\n * Allows developers to copy a response and modify its `headers`, `status`,\n * or `statusText` values (the values settable via a\n * [`ResponseInit`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Response/Response#Syntax}\n * object in the constructor).\n * To modify these values, pass a function as the second argument. That\n * function will be invoked with a single object with the response properties\n * `{headers, status, statusText}`. The return value of this function will\n * be used as the `ResponseInit` for the new `Response`. To change the values\n * either modify the passed parameter(s) and return it, or return a totally\n * new object.\n *\n * This method is intentionally limited to same-origin responses, regardless of\n * whether CORS was used or not.\n *\n * @param {Response} response\n * @param {Function} modifier\n * @memberof module:workbox-core\n */\nasync function copyResponse(response, modifier) {\n let origin = null;\n // If response.url isn't set, assume it's cross-origin and keep origin null.\n if (response.url) {\n const responseURL = new URL(response.url);\n origin = responseURL.origin;\n }\n if (origin !== self.location.origin) {\n throw new WorkboxError('cross-origin-copy-response', { origin });\n }\n const clonedResponse = response.clone();\n // Create a fresh `ResponseInit` object by cloning the headers.\n const responseInit = {\n headers: new Headers(clonedResponse.headers),\n status: clonedResponse.status,\n statusText: clonedResponse.statusText,\n };\n // Apply any user modifications.\n const modifiedResponseInit = modifier ? modifier(responseInit) : responseInit;\n // Create the new response from the body stream and `ResponseInit`\n // modifications. Note: not all browsers support the Response.body stream,\n // so fall back to reading the entire body into memory as a blob.\n const body = canConstructResponseFromBodyStream() ?\n clonedResponse.body : await clonedResponse.blob();\n return new Response(body, modifiedResponseInit);\n}\nexport { copyResponse };\n","/*\n Copyright 2020 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nfunction stripParams(fullURL, ignoreParams) {\n const strippedURL = new URL(fullURL);\n for (const param of ignoreParams) {\n strippedURL.searchParams.delete(param);\n }\n return strippedURL.href;\n}\n/**\n * Matches an item in the cache, ignoring specific URL params. This is similar\n * to the `ignoreSearch` option, but it allows you to ignore just specific\n * params (while continuing to match on the others).\n *\n * @private\n * @param {Cache} cache\n * @param {Request} request\n * @param {Object} matchOptions\n * @param {Array} ignoreParams\n * @return {Promise}\n */\nasync function cacheMatchIgnoreParams(cache, request, ignoreParams, matchOptions) {\n const strippedRequestURL = stripParams(request.url, ignoreParams);\n // If the request doesn't include any ignored params, match as normal.\n if (request.url === strippedRequestURL) {\n return cache.match(request, matchOptions);\n }\n // Otherwise, match by comparing keys\n const keysOptions = Object.assign(Object.assign({}, matchOptions), { ignoreSearch: true });\n const cacheKeys = await cache.keys(request, keysOptions);\n for (const cacheKey of cacheKeys) {\n const strippedCacheKeyURL = stripParams(cacheKey.url, ignoreParams);\n if (strippedRequestURL === strippedCacheKeyURL) {\n return cache.match(cacheKey, matchOptions);\n }\n }\n return;\n}\nexport { cacheMatchIgnoreParams };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * The Deferred class composes Promises in a way that allows for them to be\n * resolved or rejected from outside the constructor. In most cases promises\n * should be used directly, but Deferreds can be necessary when the logic to\n * resolve a promise must be separate.\n *\n * @private\n */\nclass Deferred {\n /**\n * Creates a promise and exposes its resolve and reject functions as methods.\n */\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n}\nexport { Deferred };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n// Callbacks to be executed whenever there's a quota error.\n// Can't change Function type right now.\n// eslint-disable-next-line @typescript-eslint/ban-types\nconst quotaErrorCallbacks = new Set();\nexport { quotaErrorCallbacks };\n","\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:strategies:6.2.4'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2020 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { cacheMatchIgnoreParams } from 'workbox-core/_private/cacheMatchIgnoreParams.js';\nimport { Deferred } from 'workbox-core/_private/Deferred.js';\nimport { executeQuotaErrorCallbacks } from 'workbox-core/_private/executeQuotaErrorCallbacks.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { timeout } from 'workbox-core/_private/timeout.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport './_version.js';\nfunction toRequest(input) {\n return (typeof input === 'string') ? new Request(input) : input;\n}\n/**\n * A class created every time a Strategy instance instance calls\n * [handle()]{@link module:workbox-strategies.Strategy~handle} or\n * [handleAll()]{@link module:workbox-strategies.Strategy~handleAll} that wraps all fetch and\n * cache actions around plugin callbacks and keeps track of when the strategy\n * is \"done\" (i.e. all added `event.waitUntil()` promises have resolved).\n *\n * @memberof module:workbox-strategies\n */\nclass StrategyHandler {\n /**\n * Creates a new instance associated with the passed strategy and event\n * that's handling the request.\n *\n * The constructor also initializes the state that will be passed to each of\n * the plugins handling this request.\n *\n * @param {module:workbox-strategies.Strategy} strategy\n * @param {Object} options\n * @param {Request|string} options.request A request to run this strategy for.\n * @param {ExtendableEvent} options.event The event associated with the\n * request.\n * @param {URL} [options.url]\n * @param {*} [options.params]\n * [match callback]{@link module:workbox-routing~matchCallback},\n * (if applicable).\n */\n constructor(strategy, options) {\n this._cacheKeys = {};\n /**\n * The request the strategy is performing (passed to the strategy's\n * `handle()` or `handleAll()` method).\n * @name request\n * @instance\n * @type {Request}\n * @memberof module:workbox-strategies.StrategyHandler\n */\n /**\n * The event associated with this request.\n * @name event\n * @instance\n * @type {ExtendableEvent}\n * @memberof module:workbox-strategies.StrategyHandler\n */\n /**\n * A `URL` instance of `request.url` (if passed to the strategy's\n * `handle()` or `handleAll()` method).\n * Note: the `url` param will be present if the strategy was invoked\n * from a workbox `Route` object.\n * @name url\n * @instance\n * @type {URL|undefined}\n * @memberof module:workbox-strategies.StrategyHandler\n */\n /**\n * A `param` value (if passed to the strategy's\n * `handle()` or `handleAll()` method).\n * Note: the `param` param will be present if the strategy was invoked\n * from a workbox `Route` object and the\n * [match callback]{@link module:workbox-routing~matchCallback} returned\n * a truthy value (it will be that value).\n * @name params\n * @instance\n * @type {*|undefined}\n * @memberof module:workbox-strategies.StrategyHandler\n */\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(options.event, ExtendableEvent, {\n moduleName: 'workbox-strategies',\n className: 'StrategyHandler',\n funcName: 'constructor',\n paramName: 'options.event',\n });\n }\n Object.assign(this, options);\n this.event = options.event;\n this._strategy = strategy;\n this._handlerDeferred = new Deferred();\n this._extendLifetimePromises = [];\n // Copy the plugins list (since it's mutable on the strategy),\n // so any mutations don't affect this handler instance.\n this._plugins = [...strategy.plugins];\n this._pluginStateMap = new Map();\n for (const plugin of this._plugins) {\n this._pluginStateMap.set(plugin, {});\n }\n this.event.waitUntil(this._handlerDeferred.promise);\n }\n /**\n * Fetches a given request (and invokes any applicable plugin callback\n * methods) using the `fetchOptions` (for non-navigation requests) and\n * `plugins` defined on the `Strategy` object.\n *\n * The following plugin lifecycle methods are invoked when using this method:\n * - `requestWillFetch()`\n * - `fetchDidSucceed()`\n * - `fetchDidFail()`\n *\n * @param {Request|string} input The URL or request to fetch.\n * @return {Promise}\n */\n async fetch(input) {\n const { event } = this;\n let request = toRequest(input);\n if (request.mode === 'navigate' &&\n event instanceof FetchEvent &&\n event.preloadResponse) {\n const possiblePreloadResponse = await event.preloadResponse;\n if (possiblePreloadResponse) {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Using a preloaded navigation response for ` +\n `'${getFriendlyURL(request.url)}'`);\n }\n return possiblePreloadResponse;\n }\n }\n // If there is a fetchDidFail plugin, we need to save a clone of the\n // original request before it's either modified by a requestWillFetch\n // plugin or before the original request's body is consumed via fetch().\n const originalRequest = this.hasCallback('fetchDidFail') ?\n request.clone() : null;\n try {\n for (const cb of this.iterateCallbacks('requestWillFetch')) {\n request = await cb({ request: request.clone(), event });\n }\n }\n catch (err) {\n if (err instanceof Error) {\n throw new WorkboxError('plugin-error-request-will-fetch', { thrownErrorMessage: err.message });\n }\n }\n // The request can be altered by plugins with `requestWillFetch` making\n // the original request (most likely from a `fetch` event) different\n // from the Request we make. Pass both to `fetchDidFail` to aid debugging.\n const pluginFilteredRequest = request.clone();\n try {\n let fetchResponse;\n // See https://github.com/GoogleChrome/workbox/issues/1796\n fetchResponse = await fetch(request, request.mode === 'navigate' ?\n undefined : this._strategy.fetchOptions);\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Network request for ` +\n `'${getFriendlyURL(request.url)}' returned a response with ` +\n `status '${fetchResponse.status}'.`);\n }\n for (const callback of this.iterateCallbacks('fetchDidSucceed')) {\n fetchResponse = await callback({\n event,\n request: pluginFilteredRequest,\n response: fetchResponse,\n });\n }\n return fetchResponse;\n }\n catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Network request for ` +\n `'${getFriendlyURL(request.url)}' threw an error.`, error);\n }\n // `originalRequest` will only exist if a `fetchDidFail` callback\n // is being used (see above).\n if (originalRequest) {\n await this.runCallbacks('fetchDidFail', {\n error: error,\n event,\n originalRequest: originalRequest.clone(),\n request: pluginFilteredRequest.clone(),\n });\n }\n throw error;\n }\n }\n /**\n * Calls `this.fetch()` and (in the background) runs `this.cachePut()` on\n * the response generated by `this.fetch()`.\n *\n * The call to `this.cachePut()` automatically invokes `this.waitUntil()`,\n * so you do not have to manually call `waitUntil()` on the event.\n *\n * @param {Request|string} input The request or URL to fetch and cache.\n * @return {Promise}\n */\n async fetchAndCachePut(input) {\n const response = await this.fetch(input);\n const responseClone = response.clone();\n void this.waitUntil(this.cachePut(input, responseClone));\n return response;\n }\n /**\n * Matches a request from the cache (and invokes any applicable plugin\n * callback methods) using the `cacheName`, `matchOptions`, and `plugins`\n * defined on the strategy object.\n *\n * The following plugin lifecycle methods are invoked when using this method:\n * - cacheKeyWillByUsed()\n * - cachedResponseWillByUsed()\n *\n * @param {Request|string} key The Request or URL to use as the cache key.\n * @return {Promise} A matching response, if found.\n */\n async cacheMatch(key) {\n const request = toRequest(key);\n let cachedResponse;\n const { cacheName, matchOptions } = this._strategy;\n const effectiveRequest = await this.getCacheKey(request, 'read');\n const multiMatchOptions = Object.assign(Object.assign({}, matchOptions), { cacheName });\n cachedResponse = await caches.match(effectiveRequest, multiMatchOptions);\n if (process.env.NODE_ENV !== 'production') {\n if (cachedResponse) {\n logger.debug(`Found a cached response in '${cacheName}'.`);\n }\n else {\n logger.debug(`No cached response found in '${cacheName}'.`);\n }\n }\n for (const callback of this.iterateCallbacks('cachedResponseWillBeUsed')) {\n cachedResponse = (await callback({\n cacheName,\n matchOptions,\n cachedResponse,\n request: effectiveRequest,\n event: this.event,\n })) || undefined;\n }\n return cachedResponse;\n }\n /**\n * Puts a request/response pair in the cache (and invokes any applicable\n * plugin callback methods) using the `cacheName` and `plugins` defined on\n * the strategy object.\n *\n * The following plugin lifecycle methods are invoked when using this method:\n * - cacheKeyWillByUsed()\n * - cacheWillUpdate()\n * - cacheDidUpdate()\n *\n * @param {Request|string} key The request or URL to use as the cache key.\n * @param {Response} response The response to cache.\n * @return {Promise} `false` if a cacheWillUpdate caused the response\n * not be cached, and `true` otherwise.\n */\n async cachePut(key, response) {\n const request = toRequest(key);\n // Run in the next task to avoid blocking other cache reads.\n // https://github.com/w3c/ServiceWorker/issues/1397\n await timeout(0);\n const effectiveRequest = await this.getCacheKey(request, 'write');\n if (process.env.NODE_ENV !== 'production') {\n if (effectiveRequest.method && effectiveRequest.method !== 'GET') {\n throw new WorkboxError('attempt-to-cache-non-get-request', {\n url: getFriendlyURL(effectiveRequest.url),\n method: effectiveRequest.method,\n });\n }\n // See https://github.com/GoogleChrome/workbox/issues/2818\n const vary = response.headers.get('Vary');\n if (vary) {\n logger.debug(`The response for ${getFriendlyURL(effectiveRequest.url)} ` +\n `has a 'Vary: ${vary}' header. ` +\n `Consider setting the {ignoreVary: true} option on your strategy ` +\n `to ensure cache matching and deletion works as expected.`);\n }\n }\n if (!response) {\n if (process.env.NODE_ENV !== 'production') {\n logger.error(`Cannot cache non-existent response for ` +\n `'${getFriendlyURL(effectiveRequest.url)}'.`);\n }\n throw new WorkboxError('cache-put-with-no-response', {\n url: getFriendlyURL(effectiveRequest.url),\n });\n }\n const responseToCache = await this._ensureResponseSafeToCache(response);\n if (!responseToCache) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Response '${getFriendlyURL(effectiveRequest.url)}' ` +\n `will not be cached.`, responseToCache);\n }\n return false;\n }\n const { cacheName, matchOptions } = this._strategy;\n const cache = await self.caches.open(cacheName);\n const hasCacheUpdateCallback = this.hasCallback('cacheDidUpdate');\n const oldResponse = hasCacheUpdateCallback ? await cacheMatchIgnoreParams(\n // TODO(philipwalton): the `__WB_REVISION__` param is a precaching\n // feature. Consider into ways to only add this behavior if using\n // precaching.\n cache, effectiveRequest.clone(), ['__WB_REVISION__'], matchOptions) :\n null;\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Updating the '${cacheName}' cache with a new Response ` +\n `for ${getFriendlyURL(effectiveRequest.url)}.`);\n }\n try {\n await cache.put(effectiveRequest, hasCacheUpdateCallback ?\n responseToCache.clone() : responseToCache);\n }\n catch (error) {\n if (error instanceof Error) {\n // See https://developer.mozilla.org/en-US/docs/Web/API/DOMException#exception-QuotaExceededError\n if (error.name === 'QuotaExceededError') {\n await executeQuotaErrorCallbacks();\n }\n throw error;\n }\n }\n for (const callback of this.iterateCallbacks('cacheDidUpdate')) {\n await callback({\n cacheName,\n oldResponse,\n newResponse: responseToCache.clone(),\n request: effectiveRequest,\n event: this.event,\n });\n }\n return true;\n }\n /**\n * Checks the list of plugins for the `cacheKeyWillBeUsed` callback, and\n * executes any of those callbacks found in sequence. The final `Request`\n * object returned by the last plugin is treated as the cache key for cache\n * reads and/or writes. If no `cacheKeyWillBeUsed` plugin callbacks have\n * been registered, the passed request is returned unmodified\n *\n * @param {Request} request\n * @param {string} mode\n * @return {Promise}\n */\n async getCacheKey(request, mode) {\n if (!this._cacheKeys[mode]) {\n let effectiveRequest = request;\n for (const callback of this.iterateCallbacks('cacheKeyWillBeUsed')) {\n effectiveRequest = toRequest(await callback({\n mode,\n request: effectiveRequest,\n event: this.event,\n // params has a type any can't change right now.\n params: this.params,\n }));\n }\n this._cacheKeys[mode] = effectiveRequest;\n }\n return this._cacheKeys[mode];\n }\n /**\n * Returns true if the strategy has at least one plugin with the given\n * callback.\n *\n * @param {string} name The name of the callback to check for.\n * @return {boolean}\n */\n hasCallback(name) {\n for (const plugin of this._strategy.plugins) {\n if (name in plugin) {\n return true;\n }\n }\n return false;\n }\n /**\n * Runs all plugin callbacks matching the given name, in order, passing the\n * given param object (merged ith the current plugin state) as the only\n * argument.\n *\n * Note: since this method runs all plugins, it's not suitable for cases\n * where the return value of a callback needs to be applied prior to calling\n * the next callback. See\n * [`iterateCallbacks()`]{@link module:workbox-strategies.StrategyHandler#iterateCallbacks}\n * below for how to handle that case.\n *\n * @param {string} name The name of the callback to run within each plugin.\n * @param {Object} param The object to pass as the first (and only) param\n * when executing each callback. This object will be merged with the\n * current plugin state prior to callback execution.\n */\n async runCallbacks(name, param) {\n for (const callback of this.iterateCallbacks(name)) {\n // TODO(philipwalton): not sure why `any` is needed. It seems like\n // this should work with `as WorkboxPluginCallbackParam[C]`.\n await callback(param);\n }\n }\n /**\n * Accepts a callback and returns an iterable of matching plugin callbacks,\n * where each callback is wrapped with the current handler state (i.e. when\n * you call each callback, whatever object parameter you pass it will\n * be merged with the plugin's current state).\n *\n * @param {string} name The name fo the callback to run\n * @return {Array}\n */\n *iterateCallbacks(name) {\n for (const plugin of this._strategy.plugins) {\n if (typeof plugin[name] === 'function') {\n const state = this._pluginStateMap.get(plugin);\n const statefulCallback = (param) => {\n const statefulParam = Object.assign(Object.assign({}, param), { state });\n // TODO(philipwalton): not sure why `any` is needed. It seems like\n // this should work with `as WorkboxPluginCallbackParam[C]`.\n return plugin[name](statefulParam);\n };\n yield statefulCallback;\n }\n }\n }\n /**\n * Adds a promise to the\n * [extend lifetime promises]{@link https://w3c.github.io/ServiceWorker/#extendableevent-extend-lifetime-promises}\n * of the event event associated with the request being handled (usually a\n * `FetchEvent`).\n *\n * Note: you can await\n * [`doneWaiting()`]{@link module:workbox-strategies.StrategyHandler~doneWaiting}\n * to know when all added promises have settled.\n *\n * @param {Promise} promise A promise to add to the extend lifetime promises\n * of the event that triggered the request.\n */\n waitUntil(promise) {\n this._extendLifetimePromises.push(promise);\n return promise;\n }\n /**\n * Returns a promise that resolves once all promises passed to\n * [`waitUntil()`]{@link module:workbox-strategies.StrategyHandler~waitUntil}\n * have settled.\n *\n * Note: any work done after `doneWaiting()` settles should be manually\n * passed to an event's `waitUntil()` method (not this handler's\n * `waitUntil()` method), otherwise the service worker thread my be killed\n * prior to your work completing.\n */\n async doneWaiting() {\n let promise;\n while (promise = this._extendLifetimePromises.shift()) {\n await promise;\n }\n }\n /**\n * Stops running the strategy and immediately resolves any pending\n * `waitUntil()` promises.\n */\n destroy() {\n this._handlerDeferred.resolve(null);\n }\n /**\n * This method will call cacheWillUpdate on the available plugins (or use\n * status === 200) to determine if the Response is safe and valid to cache.\n *\n * @param {Request} options.request\n * @param {Response} options.response\n * @return {Promise}\n *\n * @private\n */\n async _ensureResponseSafeToCache(response) {\n let responseToCache = response;\n let pluginsUsed = false;\n for (const callback of this.iterateCallbacks('cacheWillUpdate')) {\n responseToCache = (await callback({\n request: this.request,\n response: responseToCache,\n event: this.event,\n })) || undefined;\n pluginsUsed = true;\n if (!responseToCache) {\n break;\n }\n }\n if (!pluginsUsed) {\n if (responseToCache && responseToCache.status !== 200) {\n responseToCache = undefined;\n }\n if (process.env.NODE_ENV !== 'production') {\n if (responseToCache) {\n if (responseToCache.status !== 200) {\n if (responseToCache.status === 0) {\n logger.warn(`The response for '${this.request.url}' ` +\n `is an opaque response. The caching strategy that you're ` +\n `using will not cache opaque responses by default.`);\n }\n else {\n logger.debug(`The response for '${this.request.url}' ` +\n `returned a status code of '${response.status}' and won't ` +\n `be cached as a result.`);\n }\n }\n }\n }\n }\n return responseToCache;\n }\n}\nexport { StrategyHandler };\n","/*\n Copyright 2019 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * Returns a promise that resolves and the passed number of milliseconds.\n * This utility is an async/await-friendly version of `setTimeout`.\n *\n * @param {number} ms\n * @return {Promise}\n * @private\n */\nexport function timeout(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nconst getFriendlyURL = (url) => {\n const urlObj = new URL(String(url), location.href);\n // See https://github.com/GoogleChrome/workbox/issues/2323\n // We want to include everything, except for the origin if it's same-origin.\n return urlObj.href.replace(new RegExp(`^${location.origin}`), '');\n};\nexport { getFriendlyURL };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { logger } from '../_private/logger.js';\nimport { quotaErrorCallbacks } from '../models/quotaErrorCallbacks.js';\nimport '../_version.js';\n/**\n * Runs all of the callback functions, one at a time sequentially, in the order\n * in which they were registered.\n *\n * @memberof module:workbox-core\n * @private\n */\nasync function executeQuotaErrorCallbacks() {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`About to run ${quotaErrorCallbacks.size} ` +\n `callbacks to clean up caches.`);\n }\n for (const callback of quotaErrorCallbacks) {\n await callback();\n if (process.env.NODE_ENV !== 'production') {\n logger.log(callback, 'is complete.');\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n logger.log('Finished running callbacks.');\n }\n}\nexport { executeQuotaErrorCallbacks };\n","/*\n Copyright 2020 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { copyResponse } from 'workbox-core/copyResponse.js';\nimport { cacheNames } from 'workbox-core/_private/cacheNames.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { Strategy } from 'workbox-strategies/Strategy.js';\nimport './_version.js';\n/**\n * A [Strategy]{@link module:workbox-strategies.Strategy} implementation\n * specifically designed to work with\n * [PrecacheController]{@link module:workbox-precaching.PrecacheController}\n * to both cache and fetch precached assets.\n *\n * Note: an instance of this class is created automatically when creating a\n * `PrecacheController`; it's generally not necessary to create this yourself.\n *\n * @extends module:workbox-strategies.Strategy\n * @memberof module:workbox-precaching\n */\nclass PrecacheStrategy extends Strategy {\n /**\n *\n * @param {Object} [options]\n * @param {string} [options.cacheName] Cache name to store and retrieve\n * requests. Defaults to the cache names provided by\n * [workbox-core]{@link module:workbox-core.cacheNames}.\n * @param {Array