diff --git a/server/index.js b/server/index.js index fa95148..467a866 100644 --- a/server/index.js +++ b/server/index.js @@ -23,6 +23,26 @@ const swPaths = [ '/assets/js/offline.js' ]; +app.get('/cdn/3kh0/*', cors({ + origin: false +}), async (req, res, next) => { + let reqTarget = `https://codeberg.org/3kh0/3kh0-assets/raw/branch/main/${req.path.replace('/cdn/3kh0/', '')}`; + + const asset = await fetch(reqTarget); + if (asset.status == 200) { + var data = Buffer.from(await asset.arrayBuffer()); + + const noRewrite = ['.unityweb']; + if (!noRewrite.includes(mime.getExtension(reqTarget))) res.writeHead(200, { + 'content-type': mime.getType(reqTarget) + }); + + if (mime.getType(reqTarget) === 'text/html') data = data + ''; + + res.end(data); + } else next(); +}); + app.get('/cdn/*', cors({ origin: false }), async (req, res, next) => { @@ -37,7 +57,7 @@ app.get('/cdn/*', cors({ 'content-type': mime.getType(reqTarget) }); - if (mime.getType(reqTarget) === 'text/html') data = data + ''; + if (mime.getType(reqTarget) === 'text/html') data = data + ''; res.end(data); } else next(); diff --git a/static/assets/JSON/apps.json b/static/assets/JSON/apps.json index d691638..509ba24 100644 --- a/static/assets/JSON/apps.json +++ b/static/assets/JSON/apps.json @@ -2,31 +2,26 @@ { "name": "Discord", "image": "/assets/img/discord.png", - "target": "https://discord.com/app", - "proxy": true + "target": "https://discord.com/app" }, { "name": "Emulator", "image": "https://emulatorjs.org/media/logo-light.png", - "target": "https://demo.emulatorjs.org/", - "proxy": true + "target": "https://demo.emulatorjs.org/" }, { "name": "Tiktok", "image": "/assets/img/tiktok.png", - "target": "https://www.tiktok.com/en/", - "proxy": true + "target": "https://www.tiktok.com/en/" }, { "name": "Twitch", "image": "/assets/img/twitch.png", - "target": "https://www.twitch.tv/", - "proxy": true + "target": "https://www.twitch.tv/" }, { "name": "Youtube", "image": "/assets/img/youtube.png", - "target": "https://youtube.com", - "proxy": true + "target": "https://youtube.com" } -] +] \ No newline at end of file diff --git a/static/assets/JSON/cheats.json b/static/assets/JSON/cheats.json index 24c4a8b..abba7f0 100644 --- a/static/assets/JSON/cheats.json +++ b/static/assets/JSON/cheats.json @@ -1,42 +1,42 @@ [ { "name": "Blooket", - "source": "/assets/misc/cheats/blooket.html", + "target": "/assets/misc/cheats/blooket.html", "image": "https://media.discordapp.net/attachments/1118495479802630174/1158062820097802331/latest.png?ex=651ae18c&is=6519900c&hm=544b7a8eb56236327b7bcabfce4b688428d59a63c8e07bcb2aab3ff81c916286&=" }, { "name": "EdPuzzle", - "source": "/service/hvtrs8%2F-efpwzxlg.js%2Cva%2F", + "target": "https://edpuzzle.hs.vc/", "image": "https://edpuzzle.imgix.net/edpuzzle-logos/vertical-logo.png" }, { "name": "Wordle", - "source": "/assets/misc/cheats/wordle.html", + "target": "/assets/misc/cheats/wordle.html", "image": "/assets/img/wordle.png" }, { "name": "Prodigy", - "source": "/assets/misc/cheats/prodigy.html", + "target": "/assets/misc/cheats/prodigy.html", "image": "https://webcdn.prodigygame.com/common/images/socialshare.png" }, { "name": "Quizizz", - "source": "/service/hvtrs8%2F-qwixiv.mnnile-sgrtiaeq%2Fsukzkzx%2F", + "target": "https://quizit.online/services/quizizz/", "image": "https://media.discordapp.net/attachments/1118495479802630174/1158062649792286720/Screen_Shot_2023-10-01_at_11.27.24_AM.png?ex=651ae163&is=65198fe3&hm=d9b86e146ddc9e98690822155ccdc2c239d776f1a42fa16447d820e8e34a826b&=" }, { "name": "Quizlet", - "source": "/assets/misc/cheats/quizlet.html", + "target": "/assets/misc/cheats/quizlet.html", "image": "https://assets.quizlet.com/a/j/dist/app/i/brandmark/1024.38e7be0a829de8f.png" }, { "name": "Gimkit", - "source": "/service/hvtrs8%2F-gktju%60.aoo%2FVhgLcz%7BSsukd-GkmiivCject", + "target": "https://github.com/TheLazySquid/GimkitCheat", "image": "https://images.crunchbase.com/image/upload/c_lpad,f_auto,q_auto:eco,dpr_1/iin53jlbkmdjjdpjbcde" }, { "name": "Skoolvox Helper", - "source": "/service/hvtrs8%2F-gktju%60.aoo%2Fdounvakn-siimvmx%2Fsiomlgdktkol%2Fpenecsgs", + "target": "https://github.com/fowntain/skiovox-skooledition/releases", "image": "https://raw.githubusercontent.com/fowntain/skiovox-skooledition/main/icon.png" } ] diff --git a/static/assets/JSON/games.json b/static/assets/JSON/games.json index eb511e9..d8139db 100644 --- a/static/assets/JSON/games.json +++ b/static/assets/JSON/games.json @@ -6,7 +6,7 @@ }, { "name": "1v1.LoL", - "target": "https://codeberg.org/3kh0/3kh0-assets/raw/branch/main/1v1lol/index.html", + "target": "/cdn/3kh0/1v1lol/index.html", "image": "/assets/img/1v1lol.png", "popular": true }, @@ -22,12 +22,12 @@ }, { "name": "Achievement Unlocked", - "target": "https://codeberg.org/3kh0/3kh0-assets/raw/branch/main/achievementunlocked/index.html", - "image": "https://codeberg.org/3kh0/3kh0-assets/raw/branch/main/achievementunlocked/achievementunlocked.png" + "target": "/cdn/3kh0/achievementunlocked/index.html", + "image": "/cdn/3kh0/achievementunlocked/achievementunlocked.png" }, { "name": "Adventure Capitalist", - "target": "/service/hvtrs8%2F-tjal128%3B.eivhwb%2Cim%2Fcdteltwrg-aarivaniqt-", + "target": "https://than1089.github.io/adventure-capitalist/", "image": "/assets/img/adventurecapitalist.png" }, { @@ -52,7 +52,7 @@ }, { "name": "Ashbelt", - "target": "/service/hvtrs8%2F-untkmctgmgn%2Cgktju%60.ko-gcmgs-aqh%60ent-ildgx%2Chvmn", + "target": "https://ultimatemen.github.io/games/ashbelt/index.html", "image": "https://f4.bcbits.com/img/a4238131019_10.jpg" }, { @@ -72,12 +72,12 @@ }, { "name": "Backrooms", - "target": "https://codeberg.org/3kh0/3kh0-assets/raw/branch/main/backrooms/index.html", + "target": "/cdn/3kh0/backrooms/index.html", "image": "/assets/img/backrooms.jpg" }, { "name": "Basket Bros", - "target": "https:https://codeberg.org/3kh0/3kh0-assets/raw/branch/main/basketbros-io/index.html", + "target": "https:/cdn/3kh0/basketbros-io/index.html", "image": "/assets/img/basketbros.jpg" }, { @@ -112,7 +112,7 @@ }, { "name": "Bloons TD 2", - "target": "https://codeberg.org/3kh0/3kh0-assets/raw/branch/main/bloonstd2/index.html", + "target": "/cdn/3kh0/bloonstd2/index.html", "image": "/assets/img/btd2.png" }, { @@ -122,7 +122,7 @@ }, { "name": "Bob The Robber 2", - "target": "https://codeberg.org/3kh0/3kh0-assets/raw/branch/main/bobtherobber2/index.html", + "target": "/cdn/3kh0/bobtherobber2/index.html", "image": "/assets/img/btr2.jpeg" }, { @@ -132,17 +132,17 @@ }, { "name": "BuildNow.GG", - "target": "/service/hvtrs8%2F-gcmgs%2Ccpaxyeaoeq.aoo%2Fgn%5DUQ%2F%60uklfnmw%2Fge%2Fknfez.jtol", + "target": "https://games.crazygames.com/en_US/buildnow-gg/index.html", "image": "https://play-lh.googleusercontent.com/MdtXwEOt43tY6GV3-IHAwhdmoW-jY4B1rqvA0m1Yj89Bj4et8FfWGL3cCt_lkDvWbWk=w240-h480-rw" }, { "name": "Candy Jump", - "target": "/service/hvtrs8%2F-ccnfyhuop%2Cgcmgs037.aoo%2F", + "target": "https://candyjump.games235.com/", "image": "https://www.coolmathgames.com/sites/default/files/styles/pwa_512x512/public/game_m_thumbnail/candy-jump-game-icon.png" }, { "name": "Chrome Dino", - "target": "https://codeberg.org/3kh0/3kh0-assets/raw/branch/main/chrome-dino/index.html", + "target": "/cdn/3kh0/chrome-dino/index.html", "image": "https://img.poki.com/cdn-cgi/image/quality=78,width=600,height=600,fit=cover,f=auto/9afd3b92ab41ffca7f368a8fcbd6d39a75894efe0edbc14cf1f067cf625e6678.png" }, { @@ -152,7 +152,7 @@ }, { "name": "Cluster Truck", - "target": "/service/hvtrs8%2F-wuw%2Cslaie%2Fgcmgs%2Cim%2Fnoaangcmgs-cnuqtgr%2Frwsj%2F", + "target": "https://www.snake-games.io/localgames/cluster-rush/", "image": "https://image.api.playstation.com/cdn/UP0097/CUSA06481_00/36sNa79pxV859fFg3CU7zFhQ34ThNx8z.png" }, { @@ -162,12 +162,12 @@ }, { "name": "Cubeform", - "target": "/service/hvtrs8%2F-wuw%2Cmctjpna%7Bgpownf.aoo%2Fau%60edopm-ildgx%2Chvmn", + "target": "https://www.mathplayground.com/cubeform/index.html", "image": "https://www.coolmathgames.com/sites/default/files/styles/pwa_512x512/public/game_m_thumbnail/cubeform-game-icon.png?itok=RHIZMSy5" }, { "name": "Cut the Rope", - "target": "https://codeberg.org/3kh0/3kh0-assets/raw/branch/main/ctr/index.html'", + "target": "/cdn/3kh0/ctr/index.html'", "image": "/assets/img/ctr.png" }, { @@ -177,12 +177,12 @@ }, { "name": "Defly.io", - "target": "/service/hvtrs8%2F-dgfny%2Cim%2F", + "target": "https://defly.io/", "image": "https://cdn.glitch.global/82c5292a-89b3-4a53-84e2-abbc0fa27724/defly_io.webp?v=1679319580067" }, { "name": "DogeMiner", - "target": "https://codeberg.org/3kh0/3kh0-assets/raw/branch/main/DogeMiner/index.html", + "target": "/cdn/3kh0/DogeMiner/index.html", "image": "/assets/img/dogeminer.png" }, { @@ -197,17 +197,17 @@ }, { "name": "Drift Boss", - "target": "/service/hvtrs8%2F-wuw%2Cmctjpna%7Bgpownf.aoo%2Ffrkfv-%60oqs%2Fv1%2Fknfez.jtol", + "target": "https://www.mathplayground.com/drift-boss-v3/index.html", "image": "/assets/img/driftboss.png" }, { "name": "Drift Hunters (have patience)", - "target": "/service/hvtrs8%2F-wgbeloavh%2Cgktju%60.ko-dpidt%2Fhwnveps-", + "target": "https://webglmath.github.io/drift-hunters/", "image": "https://play-lh.googleusercontent.com/smo8Ln-PRREDGq_QjA-Nws7ZNJQhvQfUB2oA8XV0GW12uq6hqdhvwXCB2rdl6zjekcow=w240-h480-rw" }, { "name": "Drive Mad", - "target": "https://codeberg.org/3kh0/3kh0-assets/raw/branch/main/drive-mad/index.html", + "target": "/cdn/3kh0/drive-mad/index.html", "image": "/assets/img/dmd.jpg" }, { @@ -222,7 +222,7 @@ }, { "name": "Flappy Bird", - "target": "https://codeberg.org/3kh0/3kh0-assets/raw/branch/main/flappybird/index.html", + "target": "/cdn/3kh0/flappybird/index.html", "image": "/assets/img/fp.png" }, { @@ -247,12 +247,12 @@ }, { "name": "GunSpin", - "target": "/service/hvtrs8%2F-u%60g167.eivhwb%2Cim%2Feulsril%2Frlcy%2Chvmn", + "target": "https://ubg365.github.io/gunspin/play.html", "image": "https://play-lh.googleusercontent.com/fLqvWSVq5rENEvu32xl0hf96wwSHVwQm-_9xc6KZg9Vgv9PbAtf1CyBYW7i1mlAXoSA" }, { "name": "Hacker Tetris", - "target": "https://codeberg.org/3kh0/3kh0-assets/raw/branch/main/twitch-tetris/index.html", + "target": "/cdn/3kh0/twitch-tetris/index.html", "image": "/assets/img/hackertetris.png" }, { @@ -262,8 +262,8 @@ }, { "name": "Idle Breakout", - "target": "https://codeberg.org/3kh0/3kh0-assets/raw/branch/main/idle-breakout/index.html", - "image": "https://codeberg.org/3kh0/3kh0-assets/raw/branch/main/idle-breakout/img/thumbnail.png" + "target": "/cdn/3kh0/idle-breakout/index.html", + "image": "/cdn/3kh0/idle-breakout/img/thumbnail.png" }, { "name": "Janissary Battles", @@ -276,23 +276,23 @@ "image": "/cdn/jetpack-joyride/splash.jpg" }, { - "name": "Kirka", - "target": "/service/hvtrs8%2F-kkria%2Cim%2F", + "name": "Kirka.io", + "target": "https://kirka.io/", "image": "https://cdn.glitch.global/40d8a6f7-c124-43fe-8544-1617c1dcc948/download%20(1).jpeg?v=1680006191209" }, { "name": "Learn To Fly", - "target": "https://codeberg.org/3kh0/3kh0-assets/raw/branch/main/learntofly/index.html", + "target": "/cdn/3kh0/learntofly/index.html", "image": "/assets/img/learntofly.png" }, { "name": "Learn To Fly 2", - "target": "https://codeberg.org/3kh0/3kh0-assets/raw/branch/main/learntofly2/index.html", + "target": "/cdn/3kh0/learntofly2/index.html", "image": "/assets/img/ltf2.jpg" }, { "name": "Let's Surf", - "target": "https://codeberg.org/3kh0/3kh0-assets/raw/branch/main/edge-surf/index.html", + "target": "/cdn/3kh0/edge-surf/index.html", "image": "/assets/img/ltsf.png" }, { @@ -329,7 +329,7 @@ }, { "name": "Monster Truck Stunts", - "target": "/service/hvtrs8%2F-fklgs%2Ctuorlcygreaoeq.mre%2Fdineq%2Feaoeq%2Fmtjep%2FOolsvep_Vrwci_Ropt%5DSvult-ildgx%2Chvmn", + "target": "https://files.twoplayergames.org/files/games/other/Monster_Truck_Port_Stunt/index.html", "image": "https://images.twoplayergames.org/files/games/other/Monster_Truck_Port_Stunt/MonsterTruckPortStunt_180x135.jpg?auto=format&w=100" }, { @@ -369,12 +369,12 @@ }, { "name": "Papas Pizzeria", - "target": "https://codeberg.org/3kh0/3kh0-assets/raw/branch/main/papaspizzaria/index.html", + "target": "/cdn/3kh0/papaspizzaria/index.html", "image": "/assets/img/pizzeria.jpeg" }, { "name": "Penalty Kicks", - "target": "/service/hvtrs8%2F-wuw%2Cmctjpna%7Bgpownf.aoo%2Frelant%7B-iiakq%2Fknfez.jtol", + "target": "https://www.mathplayground.com/penalty-kicks/index.html", "image": "/assets/img/penaltykicks.png" }, { @@ -389,19 +389,18 @@ }, { "name": "Retro Bowl", - "target": "https://codeberg.org/3kh0/3kh0-assets/raw/branch/main/retro-bowl/index.html", + "target": "/cdn/3kh0/retro-bowl/index.html", "image": "/assets/img/retrobowl.jpeg", "popular": true }, { "name": "Rise Higher", - "target": "/service/hvtrs8%2F-wuw%2Cmctjpna%7Bgpownf.aoo%2Fpiqe%2Fhkgjep%2Fknfez.jtol", + "target": "https://www.mathplayground.com/rise-higher/index.html", "image": "/assets/img/risehigher.jpg" }, { "name": "Roblox", - "target": "/service/hvtrs8%2F-nmw%2Cge%2Frlcy-rmbnoz-aoppmrctkol%2F7369-rmbnoz", - "comment": "/service/hvtrs8%2F-aab%2Cswpgrvulnglpuqh%2Ccmm-dgmm", + "target": "https://now.gg/play/roblox-corporation/5349/roblox", "image": "/assets/img/roblox.png", "popular": true }, @@ -412,7 +411,7 @@ }, { "name": "Rocket League 2D", - "target": "/service/hvtrs8%2F-v4p%3Bd%3Bt6.qsn.jwadl.lev%2Fjtol-3127314-ildgx%2Chvmn", + "target": "https://v6p9d9t4.ssl.hwcdn.net/html/3325334/index.html", "image": "https://img.itch.zone/aW1hZ2UvMTcwNjIyLzgyMDkwMS5wbmc=/original/j3UIZb.png" }, { @@ -447,7 +446,7 @@ }, { "name": "Stumble Guys", - "target": "/service/hvtrs8%2F-nmweg%2Cnn%2Frlcy-kktia%2Fgcmgs-7%3B9%3B%2Fqtwm%60lg-eu%7Bs", + "target": "https://nowgg.nl/play/kitka-games/7999/stumble-guys", "image": "https://play-lh.googleusercontent.com/Oci7f4WR0JShbn-n5hnwubbXaMssleb2b1Dv7AMOzFFcgstIdC9kg-E3LHx3em8RCaLf", "popular":true }, @@ -458,7 +457,7 @@ }, { "name": "Super Mario 64", - "target": "/service/hvtrs8%2F-untkmctgmgn%2Cgktju%60.ko-gcmgs-swpgro66%2Fknfez.jtol", + "target": "https://ultimatemen.github.io/games/superm64/index.html", "image": "https://nintendocore.org/cdn/shop/products/Super-Mario-64-1.png" }, { diff --git a/static/assets/css/main.css b/static/assets/css/main.css index 4edc7d6..003e8f4 100644 --- a/static/assets/css/main.css +++ b/static/assets/css/main.css @@ -308,6 +308,10 @@ input:checked+.slider:before { border-radius: 1.5vh; } +.game.hidden { + display: none; +} + .game:hover { filter: brightness(95%); transform: translateY(-0.2vh); @@ -343,6 +347,10 @@ input:checked+.slider:before { z-index: 10; } +.searchErr { + margin-bottom: 100px; +} + .cheats { width: 100%; display: flex; diff --git a/static/assets/js/apps.js b/static/assets/js/apps.js index e1ecfae..87a4cdc 100644 --- a/static/assets/js/apps.js +++ b/static/assets/js/apps.js @@ -1,35 +1,35 @@ -import { loadProxyWorker } from './utils.js'; +import { createViewPage } from './utils.js'; import PolarisError from './error.js'; import effects from './effects.js'; -const load = () => { - fetch('/assets/JSON/apps.json').then(res => res.json()).then(apps => { - apps.forEach(app => { - const el = document.createElement('div'); - el.classList = 'app'; - el.innerHTML = `

${app.name}

`; - document.querySelector('.apps').appendChild(el); +const load = () => fetch('/assets/JSON/apps.json').then(res => res.json()).then(apps => { + apps.forEach(app => { + const el = document.createElement('div'); + el.classList = 'app'; + el.innerHTML = `

${app.name}

`; + document.querySelector('.apps').appendChild(el); - effects.hoverTilt({ - max: 8, - perspective: 1000, - scale: 1.05, - speed: 800, - easing: 'cubic-bezier(.03,.98,.52,.99)' - }, el); + effects.hoverTilt({ + max: 8, + perspective: 1000, + scale: 1.05, + speed: 800, + easing: 'cubic-bezier(.03,.98,.52,.99)' + }, el); - el.addEventListener('click', async () => { - await loadProxyWorker('uv'); - - localStorage.setItem('frameData', JSON.stringify({ - type: 'app', - app - })); - location.href = '/view'; + el.addEventListener('click', async () => { + if (URL.canParse(app.target)) createViewPage({ + target: app.target, + title: app.name, + proxied: true + }); + else createViewPage({ + target: app.target, + title: app.name }); }); - }).catch(e => new PolarisError('Failed to load Apps')); -}; + }); +}).catch(e => new PolarisError('Failed to load Apps')); export default { load diff --git a/static/assets/js/cdn.inject.js b/static/assets/js/cdn.inject.js new file mode 100644 index 0000000..a5454fa --- /dev/null +++ b/static/assets/js/cdn.inject.js @@ -0,0 +1,20 @@ +if (window.self === window.top) { + document.body.style.display = 'none'; + + fetch('/404') + .then(res => res.text()) + .then(data => { + document.documentElement.innerHTML = data; + document.body.style.display = 'none'; + + try { document.body.dataset.theme = JSON.parse(localStorage.getItem('settings')).theme || 'system-default'; } + catch { + document.body.dataset.theme = 'system-default'; + sessionStorage.setItem('settings', JSON.stringify({ + theme: 'system-default' + })); + } + + setTimeout(() => document.body.style.display = 'block', 400); + }); +} \ No newline at end of file diff --git a/static/assets/js/cdn_inject.js b/static/assets/js/cdn_inject.js deleted file mode 100644 index e69de29..0000000 diff --git a/static/assets/js/cheats.js b/static/assets/js/cheats.js index f1c77fe..c5deea6 100644 --- a/static/assets/js/cheats.js +++ b/static/assets/js/cheats.js @@ -1,3 +1,4 @@ +import { createViewPage } from './utils.js'; import PolarisError from './error.js'; import effects from './effects.js'; @@ -18,11 +19,15 @@ const load = () => fetch('/assets/JSON/cheats.json') }, el); el.addEventListener('click', () => { - localStorage.setItem('frameData', JSON.stringify({ - type: 'cheat', - cheat - })); - location.href = '/view'; + if (URL.canParse(cheat.target)) createViewPage({ + target: cheat.target, + title: cheat.name, + proxied: true + }); + else createViewPage({ + target: cheat.target, + title: cheat.name + }); }); })).catch(e => new PolarisError('Failed to load cheats.')); diff --git a/static/assets/js/error.js b/static/assets/js/error.js index 314553b..c5397c2 100644 --- a/static/assets/js/error.js +++ b/static/assets/js/error.js @@ -38,24 +38,13 @@ class PolarisError { }, 500); }, 8000); - if (e.stack) { - console.log('An error occurred:\n\n' + e.stack); - } else { - console.log('An error occurred:\n\n' + e); - } + if (e.stack) console.log('An error occurred:\n\n' + e.stack); + else console.log('An error occurred:\n\n' + e); } } -window.onerror = (a, b, c, d, e) => { - new PolarisError(e); -} - -window.console.error = (e) => { - new PolarisError(e); -} - -window.onmessageerror = (e) => { - new PolarisError(e); -} +window.onerror = (...e) => new PolarisError(e); +window.console.error = (...e) => new PolarisError(e); +window.onmessageerror = (...e) => new PolarisError(e); export default PolarisError; diff --git a/static/assets/js/games.js b/static/assets/js/games.js index 1efce3a..6c84226 100644 --- a/static/assets/js/games.js +++ b/static/assets/js/games.js @@ -6,14 +6,16 @@ const load = () => { fetch('/assets/JSON/games.json') .then(res => res.json()) .then(games => { - const searchBar = document.getElementById('searchInput'); + const searchBar = document.querySelector('#searchInput'); searchBar.addEventListener('input', () => { + console.log(searchBar.value); + if (searchBar.value) { var result = false; document.querySelectorAll('.games>.game').forEach(game => { - if (game.title.toLowerCase().includes(searchBar.value.toLowerCase())) { + if (game.querySelector('h3').textContent.toLowerCase().includes(searchBar.value.toLowerCase())) { result = true; game.classList.remove('hidden'); diff --git a/static/games.html b/static/games.html index 1d00274..678e9bb 100644 --- a/static/games.html +++ b/static/games.html @@ -28,7 +28,7 @@ - +

@@ -36,10 +36,10 @@ + diff --git a/templates/sidebar.html b/templates/sidebar.html index 2c73e61..9563c31 100644 --- a/templates/sidebar.html +++ b/templates/sidebar.html @@ -7,7 +7,7 @@

Panic Key

- +
@@ -45,4 +45,8 @@ + +

Export Data

+ +

Coming soon!

\ No newline at end of file