{"version":3,"sources":["redux/utils/request.js","redux/modules/api.js","redux/utils/actionName.js","redux/modules/challenge.js","redux/modules/scores.js","redux/configureStore.js","routes.js","components/NoticePage.js","components/Reloader/index.js","components/Reloader/Reloader.js","components/ScoreboardRow/ScoreboardRow.js","components/ScoreboardRow/index.js","components/Scoregraph/index.js","components/Scoregraph/Scoregraph.js","components/Scoreboard/index.js","components/Scoreboard/Scoreboard.js","components/ChallengesRow/ChallengesRow.js","components/ChallengesRow/index.js","components/Challenges/index.js","components/Challenges/Challenges.js","components/NavBar/NavBar.js","components/NavBar/index.js","App.js","serviceWorker.js","index.js"],"names":["request","path","options","enhancedOptions","headers","Accept","url","fetch","then","res","json","data","ok","Error","JSON","stringify","challengesSolve","id","flag","method","body","prefixActionName","module","actionName","fulfilled","pending","rejected","FETCH_ALL","SOLVE","initialState","challenges","fetchedAt","loading","scores","middleware","promise","loadingBarMiddleware","createStoreWithMiddleware","applyMiddleware","createStore","reducer","combineReducers","persistReducer","key","blacklist","storage","state","action","type","payload","Date","now","scoreboard","loadingBar","loadingBarReducer","configureStore","store","persistor","persistStore","CHALLENGES","slug","friendlyName","SCOREBOARD","memo","text","className","Reloader","reloadCallback","dateFetched","onClick","disabled","xmlns","fill","viewBox","stroke","strokeLinecap","strokeLinejoin","strokeWidth","d","toLocaleTimeString","AchievementBadge","player","name","badge","time_unlocked","challs","replaceAll","toLowerCase","data-tip","data-for","src","alt","effect","RankBadge","rank","medal","role","aria-label","ScoreboardRow","points","achievements","solvedChallenges","useState","expanded","setExpanded","bg","map","x","idx","length","c","challname","join","Scoregraph","seriesData","series","username","points_over_time","b","showSymbol","symbol","symbolSize","smooth","lineStyle","width","emphasis","focus","xAxisData","t","dayjs","unix","timestamp","format","option","title","textStyle","fontFamily","color","tooltip","trigger","legend","show","fontWeight","ellipsis","overflow","toolbox","feature","dataView","readOnly","saveAsImage","dataZoom","start","end","xAxis","boundaryGap","yAxis","scale","min","splitLine","media","query","maxWidth","max","axisLabel","showMinLabel","showMaxLabel","grid","left","right","top","bottom","style","height","maxHeight","Scoreboard","compose","connect","dispatch","fetchScores","props","error","setError","useEffect","catch","e","message","slice","o","current_score","challenges_solved","CategoryBadge","category","ChallengesRow","_id","author","categories","description","solved","totalSolves","flagFormat","solves","difficulty","onSubmitFlag","setFlag","msg","setMsg","hover","descriptionColor","placeholder","onChange","target","value","console","Challenges","fetchAllChallenges","solveChallenge","API","meta","ChallengeActions","searchTerm","setSearchTerm","fuse","setFuse","Fuse","keys","threshold","useExtendedSearch","filtered","search","item","NavBarItem","navRoute","currentRoute","classes","to","NavBar","withRouter","location","pathname","Routes","App","backgroundColor","isLocalhost","Boolean","window","hostname","match","registerValidSW","swUrl","config","navigator","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","controller","log","onUpdate","onSuccess","ReactDOM","render","StrictMode","document","getElementById","URL","process","href","origin","addEventListener","response","contentType","get","status","indexOf","ready","unregister","reload","checkValidServiceWorker"],"mappings":"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","file":"static/js/main.66733425.chunk.js","sourcesContent":["const BASE_URL =\n 'https://dkosbkcm9k.execute-api.eu-central-1.amazonaws.com/api/';\n\nexport default function request(path, options) {\n let enhancedOptions = {\n ...options,\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n };\n\n const url = `${BASE_URL}${path}`;\n return fetch(url, enhancedOptions).then((res) => {\n return res.json().then((data) => {\n if (!res.ok) {\n throw Error(JSON.stringify(data));\n }\n return data;\n });\n });\n}\n","import { request } from '../utils';\n\nexport const challengesFetchAll = () => request(`/challenges`);\n\nexport const challengesSolve = (id, flag) =>\n request(`/challenges/${id}/solve`, {\n method: 'post',\n body: JSON.stringify({\n flag,\n }),\n });\n\nexport const scoresFetch = () => request(`/scoreboard?include_series_limit=10`);\n","const PREFIX = \"ovis-ctf\";\n\nexport const prefixActionName = (module, actionName) =>\n `${PREFIX}/${module}/${actionName}`;\n\nexport const fulfilled = (actionName) => `${actionName}_FULFILLED`;\nexport const pending = (actionName) => `${actionName}_PENDING`;\nexport const rejected = (actionName) => `${actionName}_REJECTED`;\n","import * as API from './api';\nimport {\n prefixActionName,\n fulfilled,\n pending,\n rejected,\n} from '../utils/actionName';\n\nconst FETCH_ALL = prefixActionName('challenge', 'FETCH_ALL');\nconst SOLVE = prefixActionName('challenge', 'SOLVE');\n\nexport function fetchAll() {\n return {\n type: FETCH_ALL,\n payload: API.challengesFetchAll(),\n };\n}\n\nexport function solve(id, flag) {\n return {\n type: SOLVE,\n payload: API.challengesSolve(id, flag),\n meta: { id },\n };\n}\n\nconst initialState = {\n challenges: [],\n fetchedAt: null,\n loading: false,\n};\n\nexport default function reducer(state = initialState, action) {\n switch (action.type) {\n case fulfilled(FETCH_ALL):\n return {\n ...state,\n challenges: action.payload.challenges,\n fetchedAt: Date.now(),\n loading: false,\n };\n case pending(FETCH_ALL):\n return {\n ...state,\n loading: true,\n };\n case rejected(FETCH_ALL):\n return {\n ...state,\n loading: false,\n };\n default:\n return state;\n }\n}\n","import * as API from './api';\nimport {\n prefixActionName,\n fulfilled,\n pending,\n rejected,\n} from '../utils/actionName';\n\nconst FETCH_ALL = prefixActionName('scores', 'FETCH_ALL');\n\nconst initialState = {\n scores: [],\n fetchedAt: null,\n loading: false,\n};\n\nexport const scoresFetch = () => ({\n type: FETCH_ALL,\n payload: API.scoresFetch(),\n});\n\nexport default function reducer(state = initialState, action) {\n switch (action.type) {\n case fulfilled(FETCH_ALL):\n return {\n ...state,\n scores: action.payload.scores,\n fetchedAt: Date.now(),\n loading: false,\n };\n case pending(FETCH_ALL):\n return {\n ...state,\n loading: true,\n };\n case rejected(FETCH_ALL):\n return {\n ...state,\n loading: false,\n };\n default:\n return state;\n }\n}\n","import { createStore, applyMiddleware, combineReducers } from 'redux';\nimport { createLogger } from 'redux-logger';\nimport promise from 'redux-promise-middleware';\nimport {\n loadingBarReducer,\n loadingBarMiddleware,\n} from 'react-redux-loading-bar';\nimport { persistStore, persistReducer } from 'redux-persist';\nimport storage from 'redux-persist/lib/storage'; // defaults to localStorage for web\n\nimport challengeService from './modules/challenge';\nimport scoreboardService from './modules/scores';\n\n// the order matters\nlet middleware = [promise, loadingBarMiddleware()];\n\n// use logger middleware only in dev mode\nif (process.env.NODE_ENV === 'development') {\n const loggerMiddleware = createLogger();\n // logger middleware must me last to catch all actions in the chain\n middleware = [...middleware, loggerMiddleware];\n}\n\nconst createStoreWithMiddleware = applyMiddleware(...middleware)(createStore); // apply logger to redux\n\nconst reducer = combineReducers({\n challenges: persistReducer(\n { key: 'ovis:challenges', blacklist: ['fetchedAt'], storage },\n challengeService\n ),\n scoreboard: persistReducer(\n { key: 'ovis:scoreboard', blacklist: ['fetchedAt'], storage },\n scoreboardService\n ),\n loadingBar: loadingBarReducer,\n});\n\nconst configureStore = (initialState) => {\n const store = createStoreWithMiddleware(reducer, initialState);\n const persistor = persistStore(store);\n return { store, persistor };\n};\n\nexport default configureStore;\n","export default {\n CHALLENGES: { slug: '/challenges', friendlyName: 'Challenges' },\n SCOREBOARD: { slug: '/scoreboard', friendlyName: 'Scoreboard' },\n};\n","import React, { memo } from 'react';\n\nconst NoticePage = ({ text }) => {\n return (\n
\n
\n

\n {text}\n

\n
\n
\n );\n};\n\nexport default memo(NoticePage);\n","import Reloader from './Reloader';\n\nexport default Reloader;\n","import React from 'react';\n\nconst Reloader = ({ loading, reloadCallback, dateFetched }) => (\n
\n \n \n \n \n \n {`Updated at `}\n {dateFetched ? (\n <>\n {`${new Date(\n dateFetched\n ).toLocaleTimeString()}`}\n \n ) : (\n ...\n )}\n
\n);\n\nexport default Reloader;\n","import React, { memo, useState } from 'react';\nimport ReactTooltip from 'react-tooltip';\n\nconst AchievementBadge = ({ player, name, badge, time_unlocked, challs }) => {\n const id = `${player}-${name}`.replaceAll(/\\s+/g, '-').toLowerCase();\n return (\n <>\n \n \n \n \n {name}\n \n \n );\n};\n\nconst RankBadge = ({ rank }) => {\n if (rank >= 1 && rank <= 3) {\n const medals = ['🥇', '🥈', '🥉'];\n const medal = medals[rank - 1];\n return (\n \n {medal}\n \n );\n }\n\n return {rank};\n};\n\nconst ScoreboardRow = ({\n rank,\n name,\n points = 0,\n achievements,\n solvedChallenges = [],\n}) => {\n const [expanded, setExpanded] = useState(false);\n\n let bg = 'border-gray-900 bg-gray-300';\n if (rank === 1) {\n bg = 'border-yellow-400 bg-yellow-400';\n } else if (rank === 2) {\n bg = 'border-indigo-400 bg-indigo-400';\n } else if (rank === 3) {\n bg = 'border-orange-800 bg-yellow-800';\n }\n\n return (\n setExpanded(!expanded)}\n >\n
\n \n \n \n \n {name}\n \n {achievements.map((x, idx) => (\n \n ))}\n \n \n \n {points}\n \n
\n {expanded && (\n <>\n
{`Solved ${solvedChallenges.length} Challenges`}
\n

{`${solvedChallenges\n .map((c) => c.challname)\n .join(', ')}`}

\n \n )}\n \n );\n};\n\nexport default memo(ScoreboardRow);\n","import ScoreboardRow from \"./ScoreboardRow\";\n\nexport default ScoreboardRow;\n","import Scoregraph from './Scoregraph';\n\nexport default Scoregraph;\n","import React from 'react';\nimport ReactECharts from 'echarts-for-react';\nimport dayjs from 'dayjs';\n\nconst Scoregraph = ({ seriesData = [] }) => {\n const series = seriesData.map((x) => {\n return {\n type: 'line',\n name: x.username,\n data: x.points_over_time.map((b) => b.points),\n showSymbol: false,\n symbol: 'circle',\n symbolSize: 4,\n smooth: true,\n lineStyle: {\n width: 2,\n },\n emphasis: {\n focus: 'series',\n },\n };\n });\n const xAxisData = seriesData[0].points_over_time.map((t) => {\n const d = dayjs.unix(t.timestamp);\n return d.format('MMM DD\\nHH:mm');\n });\n const legend = seriesData.map((x) => x.username);\n\n const option = {\n title: {},\n textStyle: {\n fontFamily: 'Monospace',\n },\n color: [\n '#FDE047',\n '#60A5FA',\n '#F97316',\n '#99F6E4',\n '#EC4899',\n '#FB923C',\n '#059669',\n '#F9A8D4',\n '#8B5CF6',\n '#E5E7EB',\n '#67E8F9',\n ],\n tooltip: {\n trigger: 'axis',\n },\n legend: {\n show: true,\n data: legend,\n textStyle: {\n color: '#fff',\n fontWeight: 'normal',\n ellipsis: '...',\n overflow: 'truncate',\n },\n },\n toolbox: {\n show: false,\n feature: {\n dataView: { readOnly: true },\n saveAsImage: {},\n },\n },\n dataZoom: {\n show: false,\n start: 0,\n end: 100,\n },\n xAxis: {\n boundaryGap: true,\n data: xAxisData,\n },\n yAxis: {\n type: 'value',\n scale: true,\n min: 0,\n boundaryGap: [0.2, 0.2],\n splitLine: {\n lineStyle: {\n color: '#666',\n },\n },\n },\n series: series,\n media: [\n {\n query: {\n maxWidth: 640,\n },\n option: {\n yAxis: {\n show: false,\n max: 'dataMax',\n },\n xAxis: {\n axisLabel: {\n showMinLabel: false,\n showMaxLabel: false,\n },\n },\n legend: {\n show: false,\n },\n grid: {\n left: 8,\n right: 8,\n top: 0,\n bottom: 40,\n },\n },\n },\n {\n option: {\n xAxis: {\n axisLabel: {\n showMinLabel: true,\n },\n },\n yAxis: {\n show: true,\n scale: true,\n max: null,\n },\n legend: {\n show: true,\n },\n grid: {\n left: 60,\n right: 60,\n bottom: 60,\n top: 60,\n },\n },\n },\n ],\n };\n\n return (\n \n );\n};\n\nexport default Scoregraph;\n","import Scoreboard from \"./Scoreboard\";\n\nexport default Scoreboard;\n","import React, { memo, useEffect, useState } from 'react';\nimport { compose } from 'redux';\nimport { connect } from 'react-redux';\nimport NoticePage from '../NoticePage';\nimport Reloader from '../Reloader';\n\nimport * as ScoresActions from '../../redux/modules/scores';\n\nimport ScoreboardRow from '../ScoreboardRow';\nimport Scoregraph from '../Scoregraph';\n\nconst Scoreboard = (props) => {\n const { scores = [], fetchedAt, loading } = props;\n\n const [error, setError] = useState('');\n\n useEffect(() => {\n if (fetchedAt) {\n return;\n }\n props\n .fetchScores()\n .then(() => setError(''))\n .catch((e) => setError(e.message));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if ((!scores || scores.length === 0) && error.length === 0) {\n return ;\n }\n\n return (\n
\n \n \n
    \n {scores.map((o, rank) => (\n \n ))}\n
\n {error && error.length > 0 && (\n

{error}

\n )}\n
\n );\n};\n\nconst mapStateToProps = (store) => ({\n scores: store.scoreboard.scores,\n fetchedAt: store.scoreboard.fetchedAt,\n loading: store.scoreboard.loading,\n});\n\nconst mapDispatchToProps = (dispatch) => ({\n fetchScores: () => dispatch(ScoresActions.scoresFetch()),\n});\n\nexport default compose(\n memo,\n connect(mapStateToProps, mapDispatchToProps)\n)(Scoreboard);\n","import React, { memo, useState } from 'react';\n\nconst CategoryBadge = ({ category }) => {\n let color = '';\n\n const c = category.toLowerCase();\n\n switch (c) {\n case 'web':\n color = 'blue';\n break;\n case 'crypto':\n color = 'purple';\n break;\n case 'pwn':\n color = 'orange';\n break;\n case 'reverse':\n color = 'yellow';\n break;\n case 'forensics':\n color = 'indigo';\n break;\n case 'misc':\n color = 'gray';\n break;\n case 'mobile':\n color = 'red';\n break;\n default:\n color = 'gray';\n }\n\n return (\n \n {c}\n \n );\n};\n\nconst ChallengesRow = ({\n _id,\n author = '',\n categories,\n name,\n description = '',\n points = 0,\n url,\n solved = false,\n totalSolves = 0,\n flagFormat = 'flag{327a6c4304ad5938eaf0efb6cc3e53dc}',\n solves = [],\n difficulty,\n onSubmitFlag = () => {},\n}) => {\n const [expanded, setExpanded] = useState(false);\n const [flag, setFlag] = useState('');\n const [msg, setMsg] = useState('');\n\n const bg = solved\n ? 'border-green-900 bg-green-300'\n : 'border-pink-900 bg-gray-800';\n\n const hover = solved\n ? 'text-green-900 hover:text-green-700'\n : 'hover:text-pink-500';\n\n const descriptionColor = solved ? 'text-green-900' : 'text-gray-400';\n\n const doSubmitFlag = () => {\n if (!flag || !flag.length) {\n setMsg(\"Where's the flag?\");\n return;\n }\n setMsg('');\n onSubmitFlag(_id, flag)\n .catch(console.error)\n .then((res) => {\n const { solved } = res.value;\n if (solved) {\n setMsg('Boom! Well Done! 🎉');\n } else {\n setMsg('Nope. Try harder.');\n }\n });\n };\n\n return (\n {\n setExpanded(!expanded);\n setMsg('');\n }}\n >\n
\n {`${name}`}\n \n {`${points}pts`}\n \n {`[${difficulty}]`}\n \n \n \n \n \n
\n {expanded && (\n <>\n
\n {`${author}`}\n {`${\n solves.length\n } ${solves.length === 1 ? 'solve' : 'solves'}`}\n
\n

{`${solves\n .map((x) => x.username)\n .join(', ')}`}

\n {!solved && onSubmitFlag && (\n
\n setFlag(e.target.value)}\n type=\"text\"\n >\n \n Submit\n \n
\n )}\n {msg && msg.length && (\n

{msg}

\n )}\n \n )}\n \n );\n};\n\nexport default memo(ChallengesRow);\n","import ChallengesRow from './ChallengesRow';\n\nexport default ChallengesRow;\n","import Challenges from './Challenges';\n\nexport default Challenges;\n","import React, { memo, useEffect, useState } from 'react';\nimport { connect } from 'react-redux';\nimport { compose } from 'redux';\nimport Fuse from 'fuse.js';\n\nimport ChallengesRow from '../ChallengesRow';\n\nimport * as ChallengeActions from '../../redux/modules/challenge';\nimport NoticePage from '../NoticePage';\nimport Reloader from '../Reloader';\n\nconst Challenges = (props) => {\n const { challenges = [], fetchedAt, loading } = props;\n\n const [error, setError] = useState('');\n const [searchTerm, setSearchTerm] = useState('');\n const [fuse, setFuse] = useState(null);\n\n useEffect(() => {\n if (fetchedAt) {\n return;\n }\n props\n .fetchAllChallenges()\n .then(() => setError(''))\n .catch((e) => setError(e.message));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n const fuseOpts = {\n keys: ['name', 'author', 'category', 'difficulty', 'solves.username'],\n threshold: 0.2,\n useExtendedSearch: true,\n };\n setFuse(new Fuse(challenges, fuseOpts));\n }, [challenges]);\n\n if ((!challenges || challenges.length === 0) && error.length === 0) {\n return ;\n }\n\n const filtered =\n searchTerm.length > 0\n ? fuse.search(searchTerm).map((x) => x.item)\n : challenges;\n\n return (\n
\n \n
\n 0 ? 'green-300' : 'pink-300'\n } text-sm md:text-base`}\n onChange={(e) => setSearchTerm(e.target.value)}\n placeholder=\"Search...\"\n />\n
\n
    \n {filtered.map((x) => (\n \n ))}\n
\n {error && error.length > 0 && (\n

{error}

\n )}\n {filtered.length === 0 && (\n
\n

\n Nothing to see here\n

\n
\n )}\n
\n );\n};\n\nconst mapStateToProps = (store) => ({\n challenges: store.challenges.challenges,\n fetchedAt: store.challenges.fetchedAt,\n loading: store.challenges.loading,\n});\n\nconst mapDispatchToProps = (dispatch) => ({\n fetchAllChallenges: () => dispatch(ChallengeActions.fetchAll()),\n solveChallenge: (id, flag) => dispatch(ChallengeActions.solve(id, flag)),\n});\n\nexport default compose(\n memo,\n connect(mapStateToProps, mapDispatchToProps)\n)(Challenges);\n","import React, { memo } from 'react';\nimport { compose } from 'redux';\nimport { Link, withRouter } from 'react-router-dom';\n\nimport Routes from '../../routes';\n\nconst NavBarItem = (props) => {\n const { navRoute, currentRoute } = props;\n\n const { friendlyName, slug } = navRoute;\n const selected = slug === currentRoute;\n\n const classes = selected\n ? 'text-center block py-1 bg-black text-pink-500 rounded'\n : 'text-center block text-white hover:text-pink-500 py-1';\n\n return (\n
  • \n \n {friendlyName}\n \n
  • \n );\n};\n\nconst NavBar = (props) => {\n const currentRoute = props.location.pathname;\n return (\n
    \n
      \n \n \n
    \n
    \n );\n};\n\nexport default compose(memo, withRouter)(NavBar);\n","import NavBar from './NavBar';\n\nexport default NavBar;","import React from 'react';\nimport { Provider } from 'react-redux';\nimport {\n BrowserRouter as Router,\n Switch,\n Redirect,\n Route,\n} from 'react-router-dom';\nimport LoadingBar from 'react-redux-loading-bar';\n\nimport configureStore from './redux/configureStore';\nimport Routes from './routes';\n\nimport Scoreboard from './components/Scoreboard';\nimport Challenges from './components/Challenges';\nimport NavBar from './components/NavBar';\n\nfunction App() {\n const { store } = configureStore();\n\n return (\n \n \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n
    \n );\n}\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch((error) => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' },\n })\n .then((response) => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reloader the page.\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then((registration) => {\n registration.unregister();\n })\n .catch((error) => {\n console.error(error.message);\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\n\nimport './styles/tailwind.css';\n\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\n// serviceWorker.unregister();\nserviceWorker.register();\n"],"sourceRoot":""}