@epic-web/workshop-app 6.73.0 → 6.74.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/client/assets/_exerciseNumber-hKeUlr-8.js +2 -0
- package/build/client/assets/{_exerciseNumber-DUwXPNgl.js.map → _exerciseNumber-hKeUlr-8.js.map} +1 -1
- package/build/client/assets/_exerciseNumber_.finished-CAC68Gns.js +2 -0
- package/build/client/assets/{_exerciseNumber_.finished-C_jLQFDa.js.map → _exerciseNumber_.finished-CAC68Gns.js.map} +1 -1
- package/build/client/assets/_extra-DXypL1sc.js +2 -0
- package/build/client/assets/{_extra-DkiDFYVP.js.map → _extra-DXypL1sc.js.map} +1 -1
- package/build/client/assets/{_layout-C9vSX5Ti.js → _layout-BDFC2e7T.js} +2 -2
- package/build/client/assets/{_layout-C9vSX5Ti.js.map → _layout-BDFC2e7T.js.map} +1 -1
- package/build/client/assets/_layout-DsUW5kw4.js +2 -0
- package/build/client/assets/{_layout-DDTXkx2z.js.map → _layout-DsUW5kw4.js.map} +1 -1
- package/build/client/assets/diff-DfWBhj2O.js +2 -0
- package/build/client/assets/{diff-DwJn8fSQ.js.map → diff-DfWBhj2O.js.map} +1 -1
- package/build/client/assets/{diff-HIgoC1PO.js → diff-Dng5ItOr.js} +2 -2
- package/build/client/assets/{diff-HIgoC1PO.js.map → diff-Dng5ItOr.js.map} +1 -1
- package/build/client/assets/epic-video-C1_HSISA.js +2 -0
- package/build/client/assets/{epic-video-DEq93iL_.js.map → epic-video-C1_HSISA.js.map} +1 -1
- package/build/client/assets/{epic-video-DnXXh6qE.js → epic-video-CC0372g5.js} +164 -164
- package/build/client/assets/{epic-video-DnXXh6qE.js.map → epic-video-CC0372g5.js.map} +1 -1
- package/build/client/assets/finished-DSeCssIc.js +2 -0
- package/build/client/assets/{finished-CCILsO6v.js.map → finished-DSeCssIc.js.map} +1 -1
- package/build/client/assets/format-CZ5n8p10.js +2 -0
- package/build/client/assets/format-CZ5n8p10.js.map +1 -0
- package/build/client/assets/index-CCUjtDeL.js +2 -0
- package/build/client/assets/{index-PKjGT1Rp.js.map → index-CCUjtDeL.js.map} +1 -1
- package/build/client/assets/index-CFM_ffAh.js +2 -0
- package/build/client/assets/{index-IgBUhsxX.js.map → index-CFM_ffAh.js.map} +1 -1
- package/build/client/assets/{index-DroM8fzS.js → index-Dpyv8N6m.js} +2 -2
- package/build/client/assets/{index-DroM8fzS.js.map → index-Dpyv8N6m.js.map} +1 -1
- package/build/client/assets/index-Pxi8WjFA.js +2 -0
- package/build/client/assets/{index-BgExztV_.js.map → index-Pxi8WjFA.js.map} +1 -1
- package/build/client/assets/manifest-9940b8ef.js +1 -0
- package/build/client/assets/{mdx-Dun3ONG_.js → mdx-vy-1-0a3.js} +2 -2
- package/build/client/assets/{mdx-Dun3ONG_.js.map → mdx-vy-1-0a3.js.map} +1 -1
- package/build/client/assets/{offline-videos-BP7_xJkO.js → offline-videos-DAsuWMco.js} +2 -2
- package/build/client/assets/offline-videos-DAsuWMco.js.map +1 -0
- package/build/client/assets/preferences-B7ND1VS9.js +2 -0
- package/build/client/assets/preferences-B7ND1VS9.js.map +1 -0
- package/build/client/assets/{progress-BcA4i0iU.js → progress-Bby-ybMA.js} +2 -2
- package/build/client/assets/progress-Bby-ybMA.js.map +1 -0
- package/build/client/assets/{retrieval-practice-CBwxJaFi.js → retrieval-practice-BOku32wW.js} +2 -2
- package/build/client/assets/{retrieval-practice-CBwxJaFi.js.map → retrieval-practice-BOku32wW.js.map} +1 -1
- package/build/client/assets/root-BwYDIUyI.js.map +1 -1
- package/build/client/assets/test-Ciw2aKZE.js +2 -0
- package/build/client/assets/{test-BU7jE-eU.js.map → test-Ciw2aKZE.js.map} +1 -1
- package/build/client/assets/{tests-1-kVRtTc.js → tests-CZ2AhDKA.js} +2 -2
- package/build/client/assets/{tests-1-kVRtTc.js.map → tests-CZ2AhDKA.js.map} +1 -1
- package/build/server/index.js +145 -59
- package/build/server/index.js.map +1 -1
- package/package.json +3 -3
- package/build/client/assets/_exerciseNumber-DUwXPNgl.js +0 -2
- package/build/client/assets/_exerciseNumber_.finished-C_jLQFDa.js +0 -2
- package/build/client/assets/_extra-DkiDFYVP.js +0 -2
- package/build/client/assets/_layout-DDTXkx2z.js +0 -2
- package/build/client/assets/diff-DwJn8fSQ.js +0 -2
- package/build/client/assets/epic-video-DEq93iL_.js +0 -2
- package/build/client/assets/finished-CCILsO6v.js +0 -2
- package/build/client/assets/index-BgExztV_.js +0 -2
- package/build/client/assets/index-IgBUhsxX.js +0 -2
- package/build/client/assets/index-PKjGT1Rp.js +0 -2
- package/build/client/assets/manifest-b4d09d3a.js +0 -1
- package/build/client/assets/offline-videos-BP7_xJkO.js.map +0 -1
- package/build/client/assets/preferences-D6HQ5bK1.js +0 -2
- package/build/client/assets/preferences-D6HQ5bK1.js.map +0 -1
- package/build/client/assets/progress-BcA4i0iU.js.map +0 -1
- package/build/client/assets/test-BU7jE-eU.js +0 -2
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{w as y,b as N,k as V,f as D,F as r,L as P}from"./chunk-EPOLDU6W-BCLmut3y.js";import{j as e}from"./jsx-runtime-C5WNSv3b.js";import{B as m}from"./button-Cd-ekki5.js";import{b as R,I as o}from"./misc-W4055b-0.js";import{S as l}from"./tooltip-Tlsyx2YO.js";import{f as u}from"./format-CZ5n8p10.js";import{u as S}from"./root-loader-BOzEMapJ.js";import"./index-CqIc3cxq.js";import"./index-vDCSPjrM.js";const k=[{value:"best",label:"Best available"},{value:"high",label:"High"},{value:"medium",label:"Medium"},{value:"low",label:"Low"}],A=y(function(){const h=N(),n=S(),c=n.preferences?.player,p=n.preferences?.offlineVideo,f=n.preferences?.fontSize,b=n.preferences?.presence,j=n.preferences?.playground,g=n.preferences?.exerciseWarning,v=V(),i=D(),s=i.data?.offlineVideos??h.offlineVideos,t=s.downloadState.status==="running",x=[s.unavailableVideos>0?`${s.unavailableVideos} unavailable`:null,s.notDownloadableVideos>0?`${s.notDownloadableVideos} not downloadable`:null].filter(Boolean).join(", "),w=s.totalVideos>0&&s.downloadedVideos<s.totalVideos&&s.remainingDownloadBytes>0,a=v.state==="submitting";return R(()=>{i.state==="idle"&&i.load("/resources/offline-videos")},t?2e3:null),e.jsx("div",{className:"h-full w-full overflow-y-auto",children:e.jsxs("main",{className:"container mt-12 flex w-full max-w-3xl grow flex-col gap-4 pb-24",children:[e.jsx("h1",{className:"text-h1 mb-4",children:"Preferences"}),e.jsxs(r,{method:"post",className:"flex w-full max-w-sm flex-col gap-4",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-body-xl mb-2",children:"Video Player Preferences"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("label",{htmlFor:"minResolution",children:"Minimum Resolution:"}),e.jsxs("select",{id:"minResolution",name:"minResolution",defaultValue:c?.minResolution,className:"border-border bg-background text-foreground rounded-md border px-2 py-1",children:[e.jsx("option",{value:"",children:"Auto"}),e.jsx("option",{value:"480",children:"480p"}),e.jsx("option",{value:"720",children:"720p"}),e.jsx("option",{value:"1080",children:"1080p"}),e.jsx("option",{value:"1440",children:"1440p"}),e.jsx("option",{value:"2160",children:"2160p (4K)"})]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("label",{htmlFor:"maxResolution",children:"Maximum Resolution:"}),e.jsxs("select",{id:"maxResolution",name:"maxResolution",defaultValue:c?.maxResolution,className:"border-border bg-background text-foreground rounded-md border px-2 py-1",children:[e.jsx("option",{value:"",children:"Auto"}),e.jsx("option",{value:"720",children:"720p"}),e.jsx("option",{value:"1080",children:"1080p"}),e.jsx("option",{value:"1440",children:"1440p"}),e.jsx("option",{value:"2160",children:"2160p (4K)"})]})]})]}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-body-xl mb-2",children:"Offline Video Downloads"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("label",{htmlFor:"downloadResolution",children:"Download Resolution:"}),e.jsx("select",{id:"downloadResolution",name:"downloadResolution",defaultValue:p?.downloadResolution??"best",className:"border-border bg-background text-foreground rounded-md border px-2 py-1",children:k.map(d=>e.jsx("option",{value:d.value,children:d.label},d.value))})]}),e.jsx("p",{className:"text-muted-foreground text-sm",children:"Defaults to the best available resolution."})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"mb-2 flex items-center gap-2",children:[e.jsx("h2",{className:"text-body-xl",children:"Font Size Preference"}),e.jsx(l,{content:"Defaults to 16px",children:e.jsx(o,{name:"Question",tabIndex:0})})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("label",{htmlFor:"fontSize",children:"Font Size"}),e.jsx("input",{type:"number",id:"fontSize",name:"fontSize",defaultValue:f??16,step:"1",min:"12",max:"26",className:"border-border bg-background text-foreground rounded-md border px-2 py-1"})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"mb-2 flex items-center gap-2",children:[e.jsx("h2",{className:"text-body-xl",children:"Presence Preference"}),e.jsx(l,{content:"This controls whether your name and avatar are displayed in the pile of faces in navigation",children:e.jsx(o,{name:"Question",tabIndex:0})})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"checkbox",id:"optOutPresence",name:"optOutPresence",defaultChecked:b?.optOut}),e.jsx("label",{htmlFor:"optOutPresence",children:"Opt out of presence features"})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"mb-2 flex items-center gap-2",children:[e.jsx("h2",{className:"text-body-xl",children:"Persist Playground"}),e.jsx(l,{content:'When enabled, clicking "Set to Playground" will save the current playground in the "saved-playgrounds" directory.',children:e.jsx(o,{name:"Question",tabIndex:0})})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"checkbox",id:"persistPlayground",name:"persistPlayground",defaultChecked:j?.persist}),e.jsx("label",{htmlFor:"persistPlayground",children:"Enable saving playground"})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"mb-2 flex items-center gap-2",children:[e.jsx("h2",{className:"text-body-xl",children:"Exercise Directory Warning"}),e.jsx(l,{content:"When enabled, you'll see a warning banner when you have changes in the exercises directory. This helps remind you to work in the playground directory instead.",children:e.jsx(o,{name:"Question",tabIndex:0})})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"checkbox",id:"dismissExerciseWarning",name:"dismissExerciseWarning",defaultChecked:g?.dismissed}),e.jsx("label",{htmlFor:"dismissExerciseWarning",children:"Dismiss exercise directory warnings"})]})]}),e.jsx("div",{className:"h-4"}),e.jsx(m,{varient:"primary",type:"submit",name:"intent",value:"update-preferences",disabled:a,children:a?"Updating...":"Update Preferences"})]}),e.jsxs("section",{className:"border-border mt-6 flex w-full max-w-xl flex-col gap-3 border-t pt-6",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h2",{className:"text-body-xl",children:"Offline videos"}),e.jsx(l,{content:"Keep videos ready to watch when you're offline.",children:e.jsx(o,{name:"Question",tabIndex:0})})]}),e.jsx("p",{className:"text-muted-foreground text-sm",children:"Download all workshop videos so you can watch them when offline."}),e.jsxs("p",{className:"text-muted-foreground text-sm",children:["Admins can manage all downloaded videos on the"," ",e.jsx(P,{className:"text-foreground underline",to:"/admin/offline-videos",children:"Offline videos admin page"}),"."]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx(r,{method:"post",children:e.jsx(m,{varient:"primary",type:"submit",name:"intent",value:"download-offline-videos",disabled:t||a||s.totalVideos===0,children:t?"Downloading...":"Download all videos"})}),e.jsx(r,{method:"post",children:e.jsx("button",{type:"submit",name:"intent",value:"delete-offline-videos",disabled:a||s.downloadedVideos===0,className:"border-border text-foreground hover:bg-muted inline-flex items-center gap-2 rounded border px-3 py-2 text-sm disabled:cursor-not-allowed disabled:opacity-50",children:"Delete offline videos"})}),e.jsxs("span",{className:"text-muted-foreground text-sm",children:[s.downloadedVideos," of ",s.totalVideos," ","downloaded",x?` (${x})`:null]})]}),e.jsxs("div",{className:"text-muted-foreground text-sm",children:[s.downloadedVideos>0?e.jsxs("p",{children:["Downloaded size: ",u(s.totalBytes)]}):null,w?e.jsxs("p",{children:["Download all size:"," ",u(s.remainingDownloadBytes)]}):null]}),t?e.jsxs("div",{className:"text-muted-foreground text-sm",children:[e.jsxs("p",{children:["Downloading ",s.downloadState.completed," of"," ",s.downloadState.total," videos"]}),s.downloadState.current?e.jsxs("p",{className:"truncate",children:["Current: ",s.downloadState.current.title]}):null]}):null]})]})})});export{A as default};
|
|
2
|
+
//# sourceMappingURL=preferences-B7ND1VS9.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preferences-B7ND1VS9.js","sources":["../../../app/routes/_app+/preferences.tsx"],"sourcesContent":["import {\n\tgetPreferences,\n\tsetPreferences,\n} from '@epic-web/workshop-utils/db.server'\nimport {\n\tgetOfflineVideoSummary,\n\tstartOfflineVideoDownload,\n\tdeleteOfflineVideosForWorkshop,\n} from '@epic-web/workshop-utils/offline-videos.server'\nimport {\n\tForm,\n\tLink,\n\tuseFetcher,\n\tuseLoaderData,\n\tuseNavigation,\n} from 'react-router'\nimport { Button } from '#app/components/button.tsx'\nimport { Icon } from '#app/components/icons.tsx'\nimport { SimpleTooltip } from '#app/components/ui/tooltip.tsx'\nimport { formatBytes } from '#app/utils/format.ts'\nimport { ensureUndeployed, useInterval } from '#app/utils/misc.tsx'\nimport { useRootLoaderData } from '#app/utils/root-loader.ts'\nimport { redirectWithToast } from '#app/utils/toast.server.ts'\nimport { type Route } from './+types/preferences.tsx'\n\nconst downloadResolutionOptions = [\n\t{ value: 'best', label: 'Best available' },\n\t{ value: 'high', label: 'High' },\n\t{ value: 'medium', label: 'Medium' },\n\t{ value: 'low', label: 'Low' },\n] as const\ntype DownloadResolutionOption =\n\t(typeof downloadResolutionOptions)[number]['value']\n\nfunction isDownloadResolutionOption(\n\tvalue: FormDataEntryValue | null,\n): value is DownloadResolutionOption {\n\treturn (\n\t\ttypeof value === 'string' &&\n\t\tdownloadResolutionOptions.some((option) => option.value === value)\n\t)\n}\n\nexport async function loader({ request }: Route.LoaderArgs) {\n\tensureUndeployed()\n\tconst [preferences, offlineVideos] = await Promise.all([\n\t\tgetPreferences(),\n\t\tgetOfflineVideoSummary({ request }),\n\t])\n\treturn { preferences, offlineVideos }\n}\n\nexport async function action({ request }: Route.ActionArgs) {\n\tensureUndeployed()\n\tconst formData = await request.formData()\n\tconst intent = formData.get('intent')\n\n\tif (intent === 'download-offline-videos') {\n\t\tconst result = await startOfflineVideoDownload({ request })\n\t\tif (result.queued === 0) {\n\t\t\tconst description =\n\t\t\t\tresult.available === 0\n\t\t\t\t\t? 'No downloadable videos were found for this workshop.'\n\t\t\t\t\t: result.unavailable > 0\n\t\t\t\t\t\t? 'All available videos are already downloaded. Some videos require access to download.'\n\t\t\t\t\t\t: 'All available videos are already downloaded.'\n\t\t\treturn redirectWithToast('/preferences', {\n\t\t\t\ttitle: 'Offline videos are ready',\n\t\t\t\tdescription,\n\t\t\t\ttype: 'success',\n\t\t\t})\n\t\t}\n\n\t\treturn redirectWithToast('/preferences', {\n\t\t\ttitle: 'Offline downloads started',\n\t\t\tdescription: `Queued ${result.queued} video${result.queued === 1 ? '' : 's'} for download.`,\n\t\t\ttype: 'success',\n\t\t})\n\t}\n\n\tif (intent === 'delete-offline-videos') {\n\t\tconst result = await deleteOfflineVideosForWorkshop()\n\t\tconst description =\n\t\t\tresult.deletedFiles === 0\n\t\t\t\t? 'No offline videos were removed.'\n\t\t\t\t: `Removed ${result.deletedFiles} offline video${\n\t\t\t\t\t\tresult.deletedFiles === 1 ? '' : 's'\n\t\t\t\t\t}.`\n\t\treturn redirectWithToast('/preferences', {\n\t\t\ttitle: 'Offline videos cleared',\n\t\t\tdescription,\n\t\t\ttype: 'success',\n\t\t})\n\t}\n\n\tconst minResolution = formData.get('minResolution')\n\tconst maxResolution = formData.get('maxResolution')\n\tconst downloadResolution = formData.get('downloadResolution')\n\tconst fontSize = formData.get('fontSize')\n\tconst optOutPresence = formData.get('optOutPresence') === 'on'\n\tconst persistPlayground = formData.get('persistPlayground') === 'on'\n\tconst dismissExerciseWarning = formData.get('dismissExerciseWarning') === 'on'\n\tconst downloadResolutionValue = isDownloadResolutionOption(downloadResolution)\n\t\t? downloadResolution\n\t\t: undefined\n\n\tawait setPreferences({\n\t\tplayer: {\n\t\t\tminResolution: minResolution ? Number(minResolution) : undefined,\n\t\t\tmaxResolution: maxResolution ? Number(maxResolution) : undefined,\n\t\t},\n\t\tofflineVideo: {\n\t\t\tdownloadResolution: downloadResolutionValue,\n\t\t},\n\t\tfontSize: fontSize ? Number(fontSize) : undefined,\n\t\tpresence: { optOut: optOutPresence },\n\t\tplayground: { persist: persistPlayground },\n\t\texerciseWarning: { dismissed: dismissExerciseWarning },\n\t})\n\n\treturn redirectWithToast('/preferences', {\n\t\ttitle: 'Preferences updated',\n\t\tdescription: 'Your preferences have been updated.',\n\t\ttype: 'success',\n\t})\n}\n\nexport default function AccountSettings() {\n\tconst loaderData = useLoaderData<typeof loader>()\n\tconst rootData = useRootLoaderData()\n\tconst playerPreferences = rootData.preferences?.player\n\tconst offlineVideoPreferences = rootData.preferences?.offlineVideo\n\tconst fontSizePreference = rootData.preferences?.fontSize\n\tconst presencePreferences = rootData.preferences?.presence\n\tconst playgroundPreferences = rootData.preferences?.playground\n\tconst exerciseWarningPreferences = rootData.preferences?.exerciseWarning\n\tconst navigation = useNavigation()\n\tconst offlineVideosFetcher = useFetcher<typeof loader>()\n\tconst offlineVideos =\n\t\tofflineVideosFetcher.data?.offlineVideos ?? loaderData.offlineVideos\n\tconst isDownloading = offlineVideos.downloadState.status === 'running'\n\tconst offlineVideoNotes = [\n\t\tofflineVideos.unavailableVideos > 0\n\t\t\t? `${offlineVideos.unavailableVideos} unavailable`\n\t\t\t: null,\n\t\tofflineVideos.notDownloadableVideos > 0\n\t\t\t? `${offlineVideos.notDownloadableVideos} not downloadable`\n\t\t\t: null,\n\t]\n\t\t.filter(Boolean)\n\t\t.join(', ')\n\tconst showRemainingDownloadSize =\n\t\tofflineVideos.totalVideos > 0 &&\n\t\tofflineVideos.downloadedVideos < offlineVideos.totalVideos &&\n\t\tofflineVideos.remainingDownloadBytes > 0\n\n\tconst isSubmitting = navigation.state === 'submitting'\n\n\tuseInterval(\n\t\t() => {\n\t\t\tif (offlineVideosFetcher.state === 'idle') {\n\t\t\t\tvoid offlineVideosFetcher.load('/resources/offline-videos')\n\t\t\t}\n\t\t},\n\t\tisDownloading ? 2000 : null,\n\t)\n\n\treturn (\n\t\t<div className=\"h-full w-full overflow-y-auto\">\n\t\t\t<main className=\"container mt-12 flex w-full max-w-3xl grow flex-col gap-4 pb-24\">\n\t\t\t\t<h1 className=\"text-h1 mb-4\">Preferences</h1>\n\t\t\t\t<Form method=\"post\" className=\"flex w-full max-w-sm flex-col gap-4\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<h2 className=\"text-body-xl mb-2\">Video Player Preferences</h2>\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<label htmlFor=\"minResolution\">Minimum Resolution:</label>\n\t\t\t\t\t\t\t<select\n\t\t\t\t\t\t\t\tid=\"minResolution\"\n\t\t\t\t\t\t\t\tname=\"minResolution\"\n\t\t\t\t\t\t\t\tdefaultValue={playerPreferences?.minResolution}\n\t\t\t\t\t\t\t\tclassName=\"border-border bg-background text-foreground rounded-md border px-2 py-1\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<option value=\"\">Auto</option>\n\t\t\t\t\t\t\t\t<option value=\"480\">480p</option>\n\t\t\t\t\t\t\t\t<option value=\"720\">720p</option>\n\t\t\t\t\t\t\t\t<option value=\"1080\">1080p</option>\n\t\t\t\t\t\t\t\t<option value=\"1440\">1440p</option>\n\t\t\t\t\t\t\t\t<option value=\"2160\">2160p (4K)</option>\n\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<label htmlFor=\"maxResolution\">Maximum Resolution:</label>\n\t\t\t\t\t\t\t<select\n\t\t\t\t\t\t\t\tid=\"maxResolution\"\n\t\t\t\t\t\t\t\tname=\"maxResolution\"\n\t\t\t\t\t\t\t\tdefaultValue={playerPreferences?.maxResolution}\n\t\t\t\t\t\t\t\tclassName=\"border-border bg-background text-foreground rounded-md border px-2 py-1\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<option value=\"\">Auto</option>\n\t\t\t\t\t\t\t\t<option value=\"720\">720p</option>\n\t\t\t\t\t\t\t\t<option value=\"1080\">1080p</option>\n\t\t\t\t\t\t\t\t<option value=\"1440\">1440p</option>\n\t\t\t\t\t\t\t\t<option value=\"2160\">2160p (4K)</option>\n\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<h2 className=\"text-body-xl mb-2\">Offline Video Downloads</h2>\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<label htmlFor=\"downloadResolution\">Download Resolution:</label>\n\t\t\t\t\t\t\t<select\n\t\t\t\t\t\t\t\tid=\"downloadResolution\"\n\t\t\t\t\t\t\t\tname=\"downloadResolution\"\n\t\t\t\t\t\t\t\tdefaultValue={\n\t\t\t\t\t\t\t\t\tofflineVideoPreferences?.downloadResolution ?? 'best'\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tclassName=\"border-border bg-background text-foreground rounded-md border px-2 py-1\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{downloadResolutionOptions.map((option) => (\n\t\t\t\t\t\t\t\t\t<option key={option.value} value={option.value}>\n\t\t\t\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<p className=\"text-muted-foreground text-sm\">\n\t\t\t\t\t\t\tDefaults to the best available resolution.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<div className=\"mb-2 flex items-center gap-2\">\n\t\t\t\t\t\t\t<h2 className=\"text-body-xl\">Font Size Preference</h2>\n\t\t\t\t\t\t\t<SimpleTooltip content=\"Defaults to 16px\">\n\t\t\t\t\t\t\t\t<Icon name=\"Question\" tabIndex={0} />\n\t\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<label htmlFor=\"fontSize\">Font Size</label>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\t\tid=\"fontSize\"\n\t\t\t\t\t\t\t\tname=\"fontSize\"\n\t\t\t\t\t\t\t\tdefaultValue={fontSizePreference ?? 16}\n\t\t\t\t\t\t\t\tstep=\"1\"\n\t\t\t\t\t\t\t\tmin=\"12\"\n\t\t\t\t\t\t\t\tmax=\"26\"\n\t\t\t\t\t\t\t\tclassName=\"border-border bg-background text-foreground rounded-md border px-2 py-1\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<div className=\"mb-2 flex items-center gap-2\">\n\t\t\t\t\t\t\t<h2 className=\"text-body-xl\">Presence Preference</h2>\n\n\t\t\t\t\t\t\t<SimpleTooltip content=\"This controls whether your name and avatar are displayed in the pile of faces in navigation\">\n\t\t\t\t\t\t\t\t<Icon name=\"Question\" tabIndex={0} />\n\t\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\tid=\"optOutPresence\"\n\t\t\t\t\t\t\t\tname=\"optOutPresence\"\n\t\t\t\t\t\t\t\tdefaultChecked={presencePreferences?.optOut}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<label htmlFor=\"optOutPresence\">\n\t\t\t\t\t\t\t\tOpt out of presence features\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<div className=\"mb-2 flex items-center gap-2\">\n\t\t\t\t\t\t\t<h2 className=\"text-body-xl\">Persist Playground</h2>\n\n\t\t\t\t\t\t\t<SimpleTooltip\n\t\t\t\t\t\t\t\tcontent={`When enabled, clicking \"Set to Playground\" will save the current playground in the \"saved-playgrounds\" directory.`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"Question\" tabIndex={0} />\n\t\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\tid=\"persistPlayground\"\n\t\t\t\t\t\t\t\tname=\"persistPlayground\"\n\t\t\t\t\t\t\t\tdefaultChecked={playgroundPreferences?.persist}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<label htmlFor=\"persistPlayground\">\n\t\t\t\t\t\t\t\tEnable saving playground\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<div className=\"mb-2 flex items-center gap-2\">\n\t\t\t\t\t\t\t<h2 className=\"text-body-xl\">Exercise Directory Warning</h2>\n\n\t\t\t\t\t\t\t<SimpleTooltip\n\t\t\t\t\t\t\t\tcontent={`When enabled, you'll see a warning banner when you have changes in the exercises directory. This helps remind you to work in the playground directory instead.`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"Question\" tabIndex={0} />\n\t\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\tid=\"dismissExerciseWarning\"\n\t\t\t\t\t\t\t\tname=\"dismissExerciseWarning\"\n\t\t\t\t\t\t\t\tdefaultChecked={exerciseWarningPreferences?.dismissed}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<label htmlFor=\"dismissExerciseWarning\">\n\t\t\t\t\t\t\t\tDismiss exercise directory warnings\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div className=\"h-4\" />\n\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvarient=\"primary\"\n\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\tname=\"intent\"\n\t\t\t\t\t\tvalue=\"update-preferences\"\n\t\t\t\t\t\tdisabled={isSubmitting}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isSubmitting ? 'Updating...' : 'Update Preferences'}\n\t\t\t\t\t</Button>\n\t\t\t\t</Form>\n\n\t\t\t\t<section className=\"border-border mt-6 flex w-full max-w-xl flex-col gap-3 border-t pt-6\">\n\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t<h2 className=\"text-body-xl\">Offline videos</h2>\n\t\t\t\t\t\t<SimpleTooltip content=\"Keep videos ready to watch when you're offline.\">\n\t\t\t\t\t\t\t<Icon name=\"Question\" tabIndex={0} />\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t</div>\n\t\t\t\t\t<p className=\"text-muted-foreground text-sm\">\n\t\t\t\t\t\tDownload all workshop videos so you can watch them when offline.\n\t\t\t\t\t</p>\n\t\t\t\t\t<p className=\"text-muted-foreground text-sm\">\n\t\t\t\t\t\tAdmins can manage all downloaded videos on the{' '}\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tclassName=\"text-foreground underline\"\n\t\t\t\t\t\t\tto=\"/admin/offline-videos\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tOffline videos admin page\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t.\n\t\t\t\t\t</p>\n\t\t\t\t\t<div className=\"flex flex-wrap items-center gap-3\">\n\t\t\t\t\t\t<Form method=\"post\">\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvarient=\"primary\"\n\t\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\t\tname=\"intent\"\n\t\t\t\t\t\t\t\tvalue=\"download-offline-videos\"\n\t\t\t\t\t\t\t\tdisabled={\n\t\t\t\t\t\t\t\t\tisDownloading ||\n\t\t\t\t\t\t\t\t\tisSubmitting ||\n\t\t\t\t\t\t\t\t\tofflineVideos.totalVideos === 0\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{isDownloading ? 'Downloading...' : 'Download all videos'}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</Form>\n\t\t\t\t\t\t<Form method=\"post\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\t\tname=\"intent\"\n\t\t\t\t\t\t\t\tvalue=\"delete-offline-videos\"\n\t\t\t\t\t\t\t\tdisabled={isSubmitting || offlineVideos.downloadedVideos === 0}\n\t\t\t\t\t\t\t\tclassName=\"border-border text-foreground hover:bg-muted inline-flex items-center gap-2 rounded border px-3 py-2 text-sm disabled:cursor-not-allowed disabled:opacity-50\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tDelete offline videos\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</Form>\n\t\t\t\t\t\t<span className=\"text-muted-foreground text-sm\">\n\t\t\t\t\t\t\t{offlineVideos.downloadedVideos} of {offlineVideos.totalVideos}{' '}\n\t\t\t\t\t\t\tdownloaded\n\t\t\t\t\t\t\t{offlineVideoNotes ? ` (${offlineVideoNotes})` : null}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"text-muted-foreground text-sm\">\n\t\t\t\t\t\t{offlineVideos.downloadedVideos > 0 ? (\n\t\t\t\t\t\t\t<p>Downloaded size: {formatBytes(offlineVideos.totalBytes)}</p>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t{showRemainingDownloadSize ? (\n\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\tDownload all size:{' '}\n\t\t\t\t\t\t\t\t{formatBytes(offlineVideos.remainingDownloadBytes)}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t</div>\n\t\t\t\t\t{isDownloading ? (\n\t\t\t\t\t\t<div className=\"text-muted-foreground text-sm\">\n\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\tDownloading {offlineVideos.downloadState.completed} of{' '}\n\t\t\t\t\t\t\t\t{offlineVideos.downloadState.total} videos\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t{offlineVideos.downloadState.current ? (\n\t\t\t\t\t\t\t\t<p className=\"truncate\">\n\t\t\t\t\t\t\t\t\tCurrent: {offlineVideos.downloadState.current.title}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : null}\n\t\t\t\t</section>\n\t\t\t</main>\n\t\t</div>\n\t)\n}\n"],"names":["downloadResolutionOptions","value","label","preferences","_UNSAFE_withComponentProps","loaderData","useLoaderData","rootData","useRootLoaderData","playerPreferences","player","offlineVideoPreferences","offlineVideo","fontSizePreference","fontSize","presencePreferences","presence","playgroundPreferences","playground","exerciseWarningPreferences","exerciseWarning","navigation","useNavigation","offlineVideosFetcher","useFetcher","offlineVideos","data","isDownloading","downloadState","status","offlineVideoNotes","unavailableVideos","notDownloadableVideos","filter","Boolean","join","showRemainingDownloadSize","totalVideos","downloadedVideos","remainingDownloadBytes","isSubmitting","state","useInterval","load","className","children","jsxs","jsx","Form","method","htmlFor","id","name","defaultValue","minResolution","maxResolution","downloadResolution","map","option","SimpleTooltip","content","Icon","tabIndex","type","step","min","max","defaultChecked","optOut","persist","dismissed","Button","varient","disabled","Link","to","formatBytes","totalBytes","completed","total","current","title"],"mappings":"kZAyBA,MAAMA,EAA4B,CACjC,CAAEC,MAAO,OAAQC,MAAO,gBAAiB,EACzC,CAAED,MAAO,OAAQC,MAAO,MAAO,EAC/B,CAAED,MAAO,SAAUC,MAAO,QAAS,EACnC,CAAED,MAAO,MAAOC,MAAO,KAAM,CAAA,EAkG9BC,EAAAC,EAAA,UAA0C,CACzC,MAAMC,EAAaC,EAAA,EACbC,EAAWC,EAAA,EACXC,EAAoBF,EAASJ,aAAaO,OAC1CC,EAA0BJ,EAASJ,aAAaS,aAChDC,EAAqBN,EAASJ,aAAaW,SAC3CC,EAAsBR,EAASJ,aAAaa,SAC5CC,EAAwBV,EAASJ,aAAae,WAC9CC,EAA6BZ,EAASJ,aAAaiB,gBACnDC,EAAaC,EAAA,EACbC,EAAuBC,EAAA,EACvBC,EACLF,EAAqBG,MAAMD,eAAiBpB,EAAWoB,cAClDE,EAAgBF,EAAcG,cAAcC,SAAW,UACvDC,EAAoB,CACzBL,EAAcM,kBAAoB,EAC/B,GAAGN,EAAcM,iBAAiB,eAClC,KACHN,EAAcO,sBAAwB,EACnC,GAAGP,EAAcO,qBAAqB,oBACtC,IAAA,EAEFC,OAAOC,OAAO,EACdC,KAAK,IAAI,EACLC,EACLX,EAAcY,YAAc,GAC5BZ,EAAca,iBAAmBb,EAAcY,aAC/CZ,EAAcc,uBAAyB,EAElCC,EAAenB,EAAWoB,QAAU,aAE1CC,OAAAA,EACC,IAAM,CACDnB,EAAqBkB,QAAU,QAC7BlB,EAAqBoB,KAAK,2BAA2B,CAE5D,EACAhB,EAAgB,IAAO,IACxB,QAGE,MAAA,CAAIiB,UAAU,gCACdC,SAAAC,EAAAA,KAAC,OAAA,CAAKF,UAAU,kEACfC,SAAA,CAAAE,EAAAA,IAAC,KAAA,CAAGH,UAAU,eAAeC,SAAA,aAAA,CAAW,EACxCC,EAAAA,KAACE,EAAA,CAAKC,OAAO,OAAOL,UAAU,sCAC7BC,SAAA,CAAAC,EAAAA,KAAC,MAAA,CACAD,SAAA,CAAAE,EAAAA,IAAC,KAAA,CAAGH,UAAU,oBAAoBC,SAAA,0BAAA,CAAwB,EAC1DC,EAAAA,KAAC,MAAA,CAAIF,UAAU,0BACdC,SAAA,CAAAE,EAAAA,IAAC,QAAA,CAAMG,QAAQ,gBAAgBL,SAAA,qBAAA,CAAmB,EAClDC,EAAAA,KAAC,SAAA,CACAK,GAAG,gBACHC,KAAK,gBACLC,aAAc5C,GAAmB6C,cACjCV,UAAU,0EAEVC,SAAA,CAAAE,EAAAA,IAAC,SAAA,CAAO9C,MAAM,GAAG4C,SAAA,MAAA,CAAI,EACrBE,EAAAA,IAAC,SAAA,CAAO9C,MAAM,MAAM4C,SAAA,MAAA,CAAI,EACxBE,EAAAA,IAAC,SAAA,CAAO9C,MAAM,MAAM4C,SAAA,MAAA,CAAI,EACxBE,EAAAA,IAAC,SAAA,CAAO9C,MAAM,OAAO4C,SAAA,OAAA,CAAK,EAC1BE,EAAAA,IAAC,SAAA,CAAO9C,MAAM,OAAO4C,SAAA,OAAA,CAAK,EAC1BE,EAAAA,IAAC,SAAA,CAAO9C,MAAM,OAAO4C,SAAA,YAAA,CAAU,CAAA,CAAA,CAChC,CAAA,CAAA,CACD,EACAC,EAAAA,KAAC,MAAA,CAAIF,UAAU,0BACdC,SAAA,CAAAE,EAAAA,IAAC,QAAA,CAAMG,QAAQ,gBAAgBL,SAAA,qBAAA,CAAmB,EAClDC,EAAAA,KAAC,SAAA,CACAK,GAAG,gBACHC,KAAK,gBACLC,aAAc5C,GAAmB8C,cACjCX,UAAU,0EAEVC,SAAA,CAAAE,EAAAA,IAAC,SAAA,CAAO9C,MAAM,GAAG4C,SAAA,MAAA,CAAI,EACrBE,EAAAA,IAAC,SAAA,CAAO9C,MAAM,MAAM4C,SAAA,MAAA,CAAI,EACxBE,EAAAA,IAAC,SAAA,CAAO9C,MAAM,OAAO4C,SAAA,OAAA,CAAK,EAC1BE,EAAAA,IAAC,SAAA,CAAO9C,MAAM,OAAO4C,SAAA,OAAA,CAAK,EAC1BE,EAAAA,IAAC,SAAA,CAAO9C,MAAM,OAAO4C,SAAA,YAAA,CAAU,CAAA,CAAA,CAChC,CAAA,CAAA,CACD,CAAA,CAAA,CACD,SACC,MAAA,CACAA,SAAA,CAAAE,EAAAA,IAAC,KAAA,CAAGH,UAAU,oBAAoBC,SAAA,yBAAA,CAAuB,EACzDC,EAAAA,KAAC,MAAA,CAAIF,UAAU,0BACdC,SAAA,CAAAE,EAAAA,IAAC,QAAA,CAAMG,QAAQ,qBAAqBL,SAAA,sBAAA,CAAoB,EACxDE,EAAAA,IAAC,SAAA,CACAI,GAAG,qBACHC,KAAK,qBACLC,aACC1C,GAAyB6C,oBAAsB,OAEhDZ,UAAU,0EAETC,SAAA7C,EAA0ByD,IAAKC,GAC/BX,EAAAA,IAAC,SAAA,CAA0B9C,MAAOyD,EAAOzD,MACvC4C,SAAAa,EAAOxD,KAAA,EADIwD,EAAOzD,KAEpB,CACA,CAAA,CACF,CAAA,CAAA,CACD,EACA8C,EAAAA,IAAC,IAAA,CAAEH,UAAU,gCAAgCC,SAAA,4CAAA,CAE7C,CAAA,CAAA,CACD,SACC,MAAA,CACAA,SAAA,CAAAC,EAAAA,KAAC,MAAA,CAAIF,UAAU,+BACdC,SAAA,CAAAE,EAAAA,IAAC,KAAA,CAAGH,UAAU,eAAeC,SAAA,sBAAA,CAAoB,EACjDE,EAAAA,IAACY,EAAA,CAAcC,QAAQ,mBACtBf,SAAAE,EAAAA,IAACc,GAAKT,KAAK,WAAWU,SAAU,EAAG,CAAA,CACpC,CAAA,CAAA,CACD,EACAhB,EAAAA,KAAC,MAAA,CAAIF,UAAU,0BACdC,SAAA,CAAAE,EAAAA,IAAC,QAAA,CAAMG,QAAQ,WAAWL,SAAA,WAAA,CAAS,EACnCE,EAAAA,IAAC,QAAA,CACAgB,KAAK,SACLZ,GAAG,WACHC,KAAK,WACLC,aAAcxC,GAAsB,GACpCmD,KAAK,IACLC,IAAI,KACJC,IAAI,KACJtB,UAAU,yEAAA,CACX,CAAA,CAAA,CACD,CAAA,CAAA,CACD,SAEC,MAAA,CACAC,SAAA,CAAAC,EAAAA,KAAC,MAAA,CAAIF,UAAU,+BACdC,SAAA,CAAAE,EAAAA,IAAC,KAAA,CAAGH,UAAU,eAAeC,SAAA,qBAAA,CAAmB,EAEhDE,EAAAA,IAACY,EAAA,CAAcC,QAAQ,8FACtBf,SAAAE,EAAAA,IAACc,GAAKT,KAAK,WAAWU,SAAU,EAAG,CAAA,CACpC,CAAA,CAAA,CACD,EACAhB,EAAAA,KAAC,MAAA,CAAIF,UAAU,0BACdC,SAAA,CAAAE,EAAAA,IAAC,QAAA,CACAgB,KAAK,WACLZ,GAAG,iBACHC,KAAK,iBACLe,eAAgBpD,GAAqBqD,MAAA,CACtC,EACArB,EAAAA,IAAC,QAAA,CAAMG,QAAQ,iBAAiBL,SAAA,8BAAA,CAEhC,CAAA,CAAA,CACD,CAAA,CAAA,CACD,SAEC,MAAA,CACAA,SAAA,CAAAC,EAAAA,KAAC,MAAA,CAAIF,UAAU,+BACdC,SAAA,CAAAE,EAAAA,IAAC,KAAA,CAAGH,UAAU,eAAeC,SAAA,oBAAA,CAAkB,EAE/CE,EAAAA,IAACY,EAAA,CACAC,QAAS,oHAETf,SAAAE,EAAAA,IAACc,EAAA,CAAKT,KAAK,WAAWU,SAAU,EAAG,CAAA,CACpC,CAAA,CAAA,CACD,EACAhB,EAAAA,KAAC,MAAA,CAAIF,UAAU,0BACdC,SAAA,CAAAE,EAAAA,IAAC,QAAA,CACAgB,KAAK,WACLZ,GAAG,oBACHC,KAAK,oBACLe,eAAgBlD,GAAuBoD,OAAA,CACxC,EACAtB,EAAAA,IAAC,QAAA,CAAMG,QAAQ,oBAAoBL,SAAA,0BAAA,CAEnC,CAAA,CAAA,CACD,CAAA,CAAA,CACD,SAEC,MAAA,CACAA,SAAA,CAAAC,EAAAA,KAAC,MAAA,CAAIF,UAAU,+BACdC,SAAA,CAAAE,EAAAA,IAAC,KAAA,CAAGH,UAAU,eAAeC,SAAA,4BAAA,CAA0B,EAEvDE,EAAAA,IAACY,EAAA,CACAC,QAAS,iKAETf,SAAAE,EAAAA,IAACc,EAAA,CAAKT,KAAK,WAAWU,SAAU,EAAG,CAAA,CACpC,CAAA,CAAA,CACD,EACAhB,EAAAA,KAAC,MAAA,CAAIF,UAAU,0BACdC,SAAA,CAAAE,EAAAA,IAAC,QAAA,CACAgB,KAAK,WACLZ,GAAG,yBACHC,KAAK,yBACLe,eAAgBhD,GAA4BmD,SAAA,CAC7C,EACAvB,EAAAA,IAAC,QAAA,CAAMG,QAAQ,yBAAyBL,SAAA,qCAAA,CAExC,CAAA,CAAA,CACD,CAAA,CAAA,CACD,EAEAE,EAAAA,IAAC,MAAA,CAAIH,UAAU,KAAA,CAAM,EAErBG,EAAAA,IAACwB,EAAA,CACAC,QAAQ,UACRT,KAAK,SACLX,KAAK,SACLnD,MAAM,qBACNwE,SAAUjC,EAETK,WAAe,cAAgB,oBAAA,CACjC,CAAA,CAAA,CACD,EAEAC,EAAAA,KAAC,UAAA,CAAQF,UAAU,uEAClBC,SAAA,CAAAC,EAAAA,KAAC,MAAA,CAAIF,UAAU,0BACdC,SAAA,CAAAE,EAAAA,IAAC,KAAA,CAAGH,UAAU,eAAeC,SAAA,gBAAA,CAAc,EAC3CE,EAAAA,IAACY,EAAA,CAAcC,QAAQ,kDACtBf,SAAAE,EAAAA,IAACc,GAAKT,KAAK,WAAWU,SAAU,EAAG,CAAA,CACpC,CAAA,CAAA,CACD,EACAf,EAAAA,IAAC,IAAA,CAAEH,UAAU,gCAAgCC,SAAA,kEAAA,CAE7C,EACAC,EAAAA,KAAC,IAAA,CAAEF,UAAU,gCAAgCC,SAAA,CAAA,iDACG,IAC/CE,EAAAA,IAAC2B,EAAA,CACA9B,UAAU,4BACV+B,GAAG,wBACH9B,SAAA,4BAED,EAAO,GAAA,CAAA,CAER,EACAC,EAAAA,KAAC,MAAA,CAAIF,UAAU,oCACdC,SAAA,CAAAE,EAAAA,IAACC,EAAA,CAAKC,OAAO,OACZJ,SAAAE,EAAAA,IAACwB,EAAA,CACAC,QAAQ,UACRT,KAAK,SACLX,KAAK,SACLnD,MAAM,0BACNwE,SACC9C,GACAa,GACAf,EAAcY,cAAgB,EAG9BQ,WAAgB,iBAAmB,sBACrC,CAAA,CACD,EACAE,EAAAA,IAACC,EAAA,CAAKC,OAAO,OACZJ,SAAAE,EAAAA,IAAC,SAAA,CACAgB,KAAK,SACLX,KAAK,SACLnD,MAAM,wBACNwE,SAAUjC,GAAgBf,EAAca,mBAAqB,EAC7DM,UAAU,+JACVC,SAAA,wBAED,CAAA,CACD,EACAC,EAAAA,KAAC,OAAA,CAAKF,UAAU,gCACdC,SAAA,CAAApB,EAAca,iBAAiB,OAAKb,EAAcY,YAAa,IAAI,aAEnEP,EAAoB,KAAKA,CAAiB,IAAM,IAAA,CAAA,CAClD,CAAA,CAAA,CACD,EACAgB,EAAAA,KAAC,MAAA,CAAIF,UAAU,gCACbC,SAAA,CAAApB,EAAca,iBAAmB,EACjCQ,EAAAA,KAAC,IAAA,CAAED,SAAA,CAAA,oBAAkB+B,EAAYnD,EAAcoD,UAAU,CAAA,EAAE,EACxD,KACHzC,SACC,IAAA,CAAES,SAAA,CAAA,qBACiB,IAClB+B,EAAYnD,EAAcc,sBAAsB,CAAA,EAClD,EACG,IAAA,EACL,EACCZ,EACAmB,EAAAA,KAAC,MAAA,CAAIF,UAAU,gCACdC,SAAA,CAAAC,EAAAA,KAAC,IAAA,CAAED,SAAA,CAAA,eACWpB,EAAcG,cAAckD,UAAU,MAAI,IACtDrD,EAAcG,cAAcmD,MAAM,SAAA,CAAA,CACpC,EACCtD,EAAcG,cAAcoD,QAC5BlC,EAAAA,KAAC,IAAA,CAAEF,UAAU,WAAWC,SAAA,CAAA,YACbpB,EAAcG,cAAcoD,QAAQC,KAAA,EAC/C,EACG,IAAA,EACL,EACG,IAAA,CAAA,CACL,CAAA,EACD,CAAA,CACD,CAEF,CAAA"}
|