From f5b42f946c80d68d5e1259cd79572efaffc79f54 Mon Sep 17 00:00:00 2001 From: Jens van de Wiel Date: Sat, 23 Dec 2023 12:01:40 +0100 Subject: [PATCH 01/11] clean up ini and added gus helpers --- frontend/src/pages/Server.tsx | 8 +- frontend/src/pages/server/Administration.tsx | 24 +- frontend/src/pages/server/General.tsx | 10 +- frontend/src/pages/server/Ini.tsx | 24 + frontend/src/pages/server/Multipliers.tsx | 1772 ------------------ go.mod | 5 +- go.sum | 4 + server/game.go | 317 ---- server/gus.go | 500 +---- server/helpers.go | 3 - server/server.go | 36 +- server/server_controller.go | 61 +- 12 files changed, 122 insertions(+), 2642 deletions(-) create mode 100644 frontend/src/pages/server/Ini.tsx delete mode 100644 frontend/src/pages/server/Multipliers.tsx delete mode 100644 server/game.go diff --git a/frontend/src/pages/Server.tsx b/frontend/src/pages/Server.tsx index d821ffc..371a78d 100644 --- a/frontend/src/pages/Server.tsx +++ b/frontend/src/pages/Server.tsx @@ -32,7 +32,7 @@ import {UpdaterModal} from "./UpdaterModal"; import {InstallUpdateVerify} from "../../wailsjs/go/installer/InstallerController"; import {SendRconCommand} from "../../wailsjs/go/helpers/HelpersController"; import {Mods} from "./server/Mods"; -import {Multipliers} from "./server/Multipliers"; +import {Ini} from "./server/Ini"; type Props = { @@ -180,7 +180,7 @@ export const Server = ({id, className}: Props) => { {isInstalled? (
- setServ((p) => ({ ...p, serverAlias: e.target.value, convertValues: p.convertValues }))}/> + setServ((p) => ({ ...p, serverAlias: e.target.value /*, convertValues: p.convertValues*/ }))}/> BrowserOpenURL("file:///" + serv.serverPath)}> @@ -246,13 +246,13 @@ export const Server = ({id, className}: Props) => { Console General Settings Mods - Multipliers + Ini configuration Administration - + CheckServerInstalled(serv.id).then((val) => setIsInstalled(val)).catch((reason) => console.error(reason))}/> ) : ( setIsInstalled(true)}/>)} diff --git a/frontend/src/pages/server/Administration.tsx b/frontend/src/pages/server/Administration.tsx index 2ced0c7..c9ae367 100644 --- a/frontend/src/pages/server/Administration.tsx +++ b/frontend/src/pages/server/Administration.tsx @@ -191,36 +191,31 @@ function ServerStartupCard({setServ, serv}: {setServ: React.Dispatch setServ((p) => ({ ...p, - disableUpdateOnStart: e.target.checked, - convertValues: p.convertValues + disableUpdateOnStart: e.target.checked }))}/>
setServ((p) => ({ ...p, - useAsaAPI: e.target.checked, - convertValues: p.convertValues + useAsaAPI: e.target.checked }))}/>
{/* setServ((p) => ({ ...p, restartOnServerQuit: e.target.checked }))} />*/} setServ((p) => ({ ...p, - startWithApplication: e.target.checked, - convertValues: p.convertValues + startWithApplication: e.target.checked }))}/>
Custom server "dash" arguments (only use args like: -EnableIdlePlayerKick -ForceAllowCaveFlyers) setServ((p) => ({ ...p, - extraDashArgs: e.target.value, - convertValues: p.convertValues + extraDashArgs: e.target.value }))}> Custom server "questionmark" arguments (only use args like: ?PreventSpawnAnimations=true?PreventTribeAlliances=true) setServ((p) => ({ ...p, - extraQuestionmarkArguments: e.target.value, - convertValues: p.convertValues + extraQuestionmarkArguments: e.target.value }))}>
@@ -242,8 +237,7 @@ function ExtraSettingsCard({setServ, serv}: {setServ: React.Dispatch setServ((p) => ({ ...p, - useIniConfig: e.target.checked, - convertValues: p.convertValues + useIniConfig: e.target.checked }))}/>
@@ -251,8 +245,7 @@ function ExtraSettingsCard({setServ, serv}: {setServ: React.Dispatch setServ((p) => ({ ...p, - discordWebHookEnabled: e.target.checked, - convertValues: p.convertValues + discordWebHookEnabled: e.target.checked }))}/> @@ -260,8 +253,7 @@ function ExtraSettingsCard({setServ, serv}: {setServ: React.DispatchDiscord webhook url setServ((p) => ({ ...p, - discordWebHook: e.target.value, - convertValues: p.convertValues + discordWebHook: e.target.value }))}> diff --git a/frontend/src/pages/server/General.tsx b/frontend/src/pages/server/General.tsx index 3e6aadc..2f7f7b2 100644 --- a/frontend/src/pages/server/General.tsx +++ b/frontend/src/pages/server/General.tsx @@ -31,19 +31,19 @@ function GeneralSettings({ setServ, serv }: {setServ: React.Dispatch
Server Name: - setServ((p) => ({ ...p, serverName: e.target.value, convertValues: p.convertValues }))} > + setServ((p) => ({ ...p, serverName: e.target.value }))} >
Server Password: - setServ((p) => ({ ...p, serverPassword: e.target.value, convertValues: p.convertValues }))} > + setServ((p) => ({ ...p, serverPassword: e.target.value }))} >
Admin Password: - setServ((p) => ({ ...p, adminPassword: e.target.value, convertValues: p.convertValues }))} > + setServ((p) => ({ ...p, adminPassword: e.target.value }))} >
Spectator Password: - setServ((p) => ({ ...p, spectatorPassword: e.target.value, convertValues: p.convertValues }))} > + setServ((p) => ({ ...p, spectatorPassword: e.target.value }))} >
@@ -53,7 +53,7 @@ function GeneralSettings({ setServ, serv }: {setServ: React.Dispatch
Map Name of Mod Map path: - setServ((p) => ({ ...p, serverMap: v, convertValues: p.convertValues }))} > + setServ((p) => ({ ...p, serverMap: v }))} >
diff --git a/frontend/src/pages/server/Ini.tsx b/frontend/src/pages/server/Ini.tsx new file mode 100644 index 0000000..fb31337 --- /dev/null +++ b/frontend/src/pages/server/Ini.tsx @@ -0,0 +1,24 @@ +import { Button, Card, Textarea, FormLabel, TabPanel, Tooltip, Input, Typography, Accordion, AccordionDetails, AccordionGroup, AccordionSummary } from '@mui/joy'; +import { server } from '../../../wailsjs/go/models'; +import { Slider } from '../../components/Slider'; +import React from 'react'; + +import {useAlert} from "../../components/AlertProvider"; +import {OpenFileDialog} from "../../../wailsjs/go/helpers/HelpersController"; +type Props = { + setServ: React.Dispatch>; + serv: server.Server; +}; + + + + +export function Ini({ setServ, serv }: Props) { + return ( + + bob + + ); +} diff --git a/frontend/src/pages/server/Multipliers.tsx b/frontend/src/pages/server/Multipliers.tsx deleted file mode 100644 index 16964d6..0000000 --- a/frontend/src/pages/server/Multipliers.tsx +++ /dev/null @@ -1,1772 +0,0 @@ -import { Button, Card, Textarea, FormLabel, TabPanel, Tooltip, Input, Typography, Accordion, AccordionDetails, AccordionGroup, AccordionSummary } from '@mui/joy'; -import { server } from '../../../wailsjs/go/models'; -import { Slider } from '../../components/Slider'; -import React from 'react'; -import { - ImportSettingsFromFile, - SaveGUSAndGame -} from "../../../wailsjs/go/server/ServerController"; -import {useAlert} from "../../components/AlertProvider"; -import {OpenFileDialog} from "../../../wailsjs/go/helpers/HelpersController"; -type Props = { - setServ: React.Dispatch>; - serv: server.Server; -}; - -function ImportSettings({ setServ, serv }: {setServ: React.Dispatch>, serv: server.Server}) { - - const {addAlert} = useAlert() - - function handleGUSImport() { - OpenFileDialog().then((val) => setServ((p) => ({ ...p, refGUSPath: val, convertValues: p.convertValues }))) - }; - - function handleGameImport() { - OpenFileDialog().then((val) => setServ((p) => ({ ...p, refGamePath: val, convertValues: p.convertValues }))) - }; - - function onSettingsImported() { - ImportSettingsFromFile(serv.id, serv.refGUSPath || '', serv.refGamePath || '').then(() => addAlert("Setting imported!", "success")).catch((err) => addAlert("Error: " + err, "warning")) - } - - return ( -
-
-
- GameUserSettings.ini Path - - - Game.ini Path - - -
- -
-
-
-
- ) -} - -function GeneralMultipliers({ setServ, serv }: { setServ: React.Dispatch>; serv: server.Server }) { - return ( -
-
-
- - Item Stack Size Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.gameUserSettings.serverSettings.itemStackSizeMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - XP Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.gameUserSettings.serverSettings.xPMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Base Temperature Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.baseTemperatureMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Crop Decay Speed Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.cropDecaySpeedMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Crop Growth Speed Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.cropGrowthSpeedMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Custom Recipe Effectiveness Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.customRecipeEffectivenessMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Custom Recipe Effectiveness Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.customRecipeEffectivenessMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Custom Recipe Skill Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.customRecipeSkillMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Fishing Loot Quality Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.fishingLootQualityMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Fuel Consumption Interval Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.fuelConsumptionIntervalMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Generic XP Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.genericXPMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Global Corpse Decomposition Time Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.globalCorpseDecompositionTimeMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Global Item Decomposition Time Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.globalItemDecompositionTimeMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Global Spoiling Time Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.globalSpoilingTimeMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Increase PvP Respawn Interval Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.increasePvPRespawnIntervalMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Kill XP Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.killXPMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Max Fall Speed Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.maxFallSpeedMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Special XP Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.specialXPMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Supply Crate Loot Quality Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.supplyCrateLootQualityMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Use Corpse Life Span Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.useCorpseLifeSpanMultiplier = v; - return newState; - }); - } - }} - /> -
- {/*
- - Per Platform Max Structures Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = {...p, convertValues: p.convertValues}; - newState.gameUserSettings.serverSettings.perPlatformMaxStructuresMultiplier = v; - return newState; - }) - } - }} - /> -
*/} -
- - PvE Structure Decay Period Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.gameUserSettings.serverSettings.pveStructureDecayPeriodMultiplier = v; - return newState; - }); - } - }} - /> -
-
-
- ); -} - -function DinoMultipliers({ setServ, serv }: { setServ: React.Dispatch>; serv: server.Server }) { - return ( -
-
-
- - Dino Character Food Drain Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.gameUserSettings.serverSettings.dinoCharacterFoodDrainMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Dino Character Health Recovery Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.gameUserSettings.serverSettings.dinoCharacterFoodDrainMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Dino Character Health Recovery Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.gameUserSettings.serverSettings.dinoCharacterHealthRecoveryMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Dino Character Stamina Drain Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.gameUserSettings.serverSettings.dinoCharacterStaminaDrainMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Dino Count Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.gameUserSettings.serverSettings.dinoCountMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Dino Damage Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.gameUserSettings.serverSettings.dinoDamageMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Raid Dino Character Food Drain Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.gameUserSettings.serverSettings.raidDinoCharacterFoodDrainMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Tamed Dino Damage Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.gameUserSettings.serverSettings.tamedDinoDamageMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Tamed Dino Resistance Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.gameUserSettings.serverSettings.tamedDinoResistanceMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Taming Speed Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.gameUserSettings.serverSettings.tamingSpeedMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Baby Cuddle Grace Period Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.babyCuddleGracePeriodMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Baby Cuddle Interval Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.babyCuddleIntervalMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Baby Cuddle Lose Imprint Quality Speed Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.babyCuddleLoseImprintQualitySpeedMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Baby Food Consumption Speed Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.babyFoodConsumptionSpeedMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Baby Imprint Amount Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.babyImprintAmountMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Baby Imprinting Stat Scale Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.babyImprintingStatScaleMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Baby Mature Speed Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.babyMatureSpeedMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Dino Harvesting Damage Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.dinoHarvestingDamageMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Dino Turret Damage Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.dinoTurretDamageMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Egg Hatch Speed Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.eggHatchSpeedMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Lay Egg Interval Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.layEggIntervalMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Mating Interval Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.matingIntervalMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Mating Speed Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.matingSpeedMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Passive Tame Interval Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.passiveTameIntervalMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Tamed Dino Character Food Drain Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.tamedDinoCharacterFoodDrainMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Tamed Dino Torpor Drain Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.tamedDinoTorporDrainMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Wild Dino Character Food Drain Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.wildDinoCharacterFoodDrainMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Wild Dino Torpor Drain Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.wildDinoTorporDrainMultiplier = v; - return newState; - }); - } - }} - /> -
-
-
- ); -} - -function HarvestingMultipliers({ setServ, serv }: { setServ: React.Dispatch>; serv: server.Server }) { - return ( -
-
-
- - Harvest Amount Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.gameUserSettings.serverSettings.harvestAmountMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Harvest Health Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.gameUserSettings.serverSettings.harvestHealthMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Resources Respawn Period Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.gameUserSettings.serverSettings.resourcesRespawnPeriodMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Harvest XP Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.harvestXPMultiplier = v; - return newState; - }); - } - }} - /> -
-
-
- ); -} - -function PlayerMultipliers({ setServ, serv }: { setServ: React.Dispatch>; serv: server.Server }) { - return ( -
-
-
- - Oxygen Swim Speed Stat Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.gameUserSettings.serverSettings.oxygenSwimSpeedStatMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Player Character Food Drain Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.gameUserSettings.serverSettings.playerCharacterFoodDrainMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Player Character Health Recovery Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.gameUserSettings.serverSettings.playerCharacterHealthRecoveryMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Player Character Stamina Drain Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.gameUserSettings.serverSettings.playerCharacterStaminaDrainMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Player Character Water Drain Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.gameUserSettings.serverSettings.playerCharacterWaterDrainMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Player Damage Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.gameUserSettings.serverSettings.playerDamageMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Player Resistance Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.gameUserSettings.serverSettings.playerResistanceMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Crafting Skill Bonus Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.craftingSkillBonusMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Craft XP Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.craftXPMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Hair Growth Speed Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.hairGrowthSpeedMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Player Harvesting Damage Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.playerHarvestingDamageMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Poop Interval Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.poopIntervalMultiplier = v; - return newState; - }); - } - }} - /> -
-
-
- ); -} - -function StructureBuildingMultipliers({ setServ, serv }: { setServ: React.Dispatch>; serv: server.Server }) { - return ( -
-
-
- - Per Platform Max Structures Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.gameUserSettings.serverSettings.perPlatformMaxStructuresMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Platform Saddle Build Area Bounds Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.gameUserSettings.serverSettings.platformSaddleBuildAreaBoundsMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Structure Damage Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.gameUserSettings.serverSettings.structureDamageMultiplier = v; - return newState; - }); - } - }} - /> -
-
- - Structure Prevent Resource Radius Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.gameUserSettings.serverSettings.structurePreventResourceRadiusMultiplier = v; - return newState; - }); - } - }} - /> -
- - Structure Resistance Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.gameUserSettings.serverSettings.structureResistanceMultiplier = v; - return newState; - }); - } - }} - /> -
-
-
- - PvP Zone Structure Damage Multiplier - - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p, convertValues: p.convertValues }; - newState.game.ScriptShootergameShootergamemode.pvPZoneStructureDamageMultiplier = v; - return newState; - }); - } - }} - /> -
-
-
- ); -} - -function AdditionalSettings({ setServ, serv }: {setServ: React.Dispatch>, serv: server.Server}) { - - const {addAlert} = useAlert() - - function onSave() { - try { - SaveGUSAndGame(serv.id) - addAlert("Additional Sections Added!", "success") - } catch (error) { - addAlert("Error: " + error, "warning") - } - } - - return ( -
-
-
- Extra GameUserSettings.ini Sections - - - Extra Game.ini Sections - - -
- -
-
-
-
- ); -} - -function AllMultipliersCard({ setServ, serv }: { setServ: React.Dispatch>; serv: server.Server }) { - return ( - <> - - - - - Import Settings - - -
{' '} - -
-
- - - General Multipliers - - -
{' '} - -
-
- - - Dino Multipliers - - -
{' '} - -
-
- - - Harvesting Multipliers - - -
{' '} - -
-
- - - Player Multipliers - - -
{' '} - -
-
- - - Structure/building Multipliers - - -
{' '} - -
-
- - - Additional Settings - - -
{' '} - -
-
-
-
- - ); -} - -export function Multipliers({ setServ, serv }: Props) { - return ( - - - - ); -} diff --git a/go.mod b/go.mod index 199299a..1f973ad 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,11 @@ module github.com/JensvandeWiel/ArkAscendedServerManager -go 1.18 +go 1.21 + +toolchain go1.21.5 require ( + github.com/JensvandeWiel/ark-ini v1.0.0 github.com/StackExchange/wmi v1.2.1 github.com/adrg/xdg v0.4.0 github.com/go-ini/ini v1.67.0 diff --git a/go.sum b/go.sum index 13e0ec5..893806a 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +github.com/JensvandeWiel/ark-ini v1.0.0 h1:i6R3v03uAYOmbD03aAq7Jbe7JAKjT9XsGyJS9HfL4fk= +github.com/JensvandeWiel/ark-ini v1.0.0/go.mod h1:mM7be1osQGncsZFWSJvucs36J1kmxp6E4vYyW0vTkuk= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/TheTitanrain/w32 v0.0.0-20180517000239-4f5cfb03fabf h1:FPsprx82rdrX2jiKyS17BH6IrTmUBYqZa/CXT4uvb+I= @@ -68,6 +70,7 @@ github.com/sqweek/dialog v0.0.0-20220809060634-e981b270ebbf/go.mod h1:/qNPSY91qT github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/tkrajina/go-reflector v0.5.6 h1:hKQ0gyocG7vgMD2M3dRlYN6WBBOmdoOzJ6njQSepKdE= github.com/tkrajina/go-reflector v0.5.6/go.mod h1:ECbqLgccecY5kPmPmXg1MrHW585yMcDkVl6IvJe64T4= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= @@ -112,3 +115,4 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/server/game.go b/server/game.go deleted file mode 100644 index 720a02e..0000000 --- a/server/game.go +++ /dev/null @@ -1,317 +0,0 @@ -package server - -import ( - "path/filepath" - - "github.com/go-ini/ini" - "github.com/wailsapp/wails/v2/pkg/runtime" -) - -type ScriptShootergameShootergamemode struct { - AutoPvEStartTimeSeconds float32 `json:"autoPvEStartTimeSeconds" ini:"AutoPvEStartTimeSeconds"` - AutoPvEStopTimeSeconds float32 `json:"autoPvEStopTimeSeconds" ini:"AutoPvEStopTimeSeconds"` - BabyCuddleGracePeriodMultiplier float32 `json:"babyCuddleGracePeriodMultiplier" ini:"BabyCuddleGracePeriodMultiplier"` - BabyCuddleIntervalMultiplier float32 `json:"babyCuddleIntervalMultiplier" ini:"BabyCuddleIntervalMultiplier"` - BabyCuddleLoseImprintQualitySpeedMultiplier float32 `json:"babyCuddleLoseImprintQualitySpeedMultiplier" ini:"BabyCuddleLoseImprintQualitySpeedMultiplier"` - BabyFoodConsumptionSpeedMultiplier float32 `json:"babyFoodConsumptionSpeedMultiplier" ini:"BabyFoodConsumptionSpeedMultiplier"` - BabyImprintAmountMultiplier float32 `json:"babyImprintAmountMultiplier" ini:"BabyImprintAmountMultiplier"` - BabyImprintingStatScaleMultiplier float32 `json:"babyImprintingStatScaleMultiplier" ini:"BabyImplrintingStatScaleMultiplier"` - BabyMatureSpeedMultiplier float32 `json:"babyMatureSpeedMultiplier" ini:"BabyMatureSpeedMultiplier"` - BAllowUnclaimDinos bool `json:"bAllowUnclaimDinos" ini:"bAllowUnclaimDinos"` - BAllowCustomRecipes bool `json:"bAllowCustomRecipes" ini:"bAllowCustomRecipes"` - BAllowFlyerSpeedLeveling bool `json:"bAllowFlyerSpeedLeveling" ini:"bAllowFlyerSpeedLeveling"` - BAllowPlatformSaddleMultiFloors bool `json:"bAllowPlatformSaddleMultiFloors" ini:"bAllowPlatformSaddleMultiFloors"` - BAllowUnlimitedRespecs bool `json:"bAllowUnlimitedRespecs" ini:"bAllowUnlimitedRespecs"` - BaseTemperatureMultiplier float32 `json:"baseTemperatureMultiplier" ini:"BaseTemperatureMultiplier"` - BAutoPvETimer bool `json:"bAutoPvETimer" ini:"bAutoPvETimer"` - BAutoPvEUseSystemTime bool `json:"bAutoPvEUseSystemTime" ini:"bAutoPvEUseSystemTime"` - BAutoUnlockAllEngrams bool `json:"bAutoUnlockAllEngrams" ini:"bAutoUnlockAllEngrams"` - BDisableDinoBreeding bool `json:"bDisableDinoBreeding" ini:"bDisableDinoBreeding"` - BDisableDinoRiding bool `json:"bDisableDinoRiding" ini:"BDisableDinoRiding"` - BDisableDinoTaming bool `json:"bDisableDinoTaming" ini:"BDisableDinoTaming"` - BDisableFriendlyFire bool `json:"bDisableFriendlyFire" ini:"bDisableFriendlyFire"` - BDisableLootCrates bool `json:"bDisableLootCrates" ini:"bDisableLootCrates"` - BDisableStructurePlacementCollision bool `json:"bDisableStructurePlacementCollision" ini:"bDisableStructurePlacementCollision"` - BFlyerPlatformAllowUnalignedDinoBasing bool `json:"bFlyerPlatformAllowUnalignedDinoBasing" ini:"BFlyerPlatformAllowUnalignedDinoBasing"` - BIgnoreStructuresPreventionVolumes bool `json:"bIgnoreStructuresPreventionVolumes" ini:"BIgnoreStructuresPreventionVolumes"` - BIncreasePvPRespawnInterval bool `json:"bIncreasePvPRespawnInterval" ini:"BIncreasePvPRespawnInterval"` - BOnlyAllowSpecifiedEngrams bool `json:"bOnlyAllowSpecifiedEngrams" ini:"BOnlyAllowSpecifiedEngrams"` - BPassiveDefensesDamageRiderlessDinos bool `json:"bPassiveDefensesDamageRiderlessDinos" ini:"BPassiveDefensesDamageRiderlessDinos"` - BPvEAllowTribeWar bool `json:"bPvEAllowTribeWar" ini:"BPvEAllowTribeWar"` - BPvEAllowTribeWarCancel bool `json:"bPvEAllowTribeWarCancel" ini:"BPvEAllowTribeWarCancel"` - BPvEDisableFriendlyFire bool `json:"bPvEDisableFriendlyFire" ini:"BPvEDisableFriendlyFire"` - BShowCreativeMode bool `json:"bShowCreativeMode" ini:"BShowCreativeMode"` - BUseCorpseLocator bool `json:"bUseCorpseLocator" ini:"BUseCorpseLocator"` - BUseDinoLevelUpAnimations bool `json:"bUseDinoLevelUpAnimations" ini:"BUseDinoLevelUpAnimations"` - BUseSingleplayerSettings bool `json:"bUseSingleplayerSettings" ini:"BUseSingleplayerSettings"` - BUseTameLimitForStructuresOnly bool `json:"bUseTameLimitForStructuresOnly" ini:"BUseTameLimitForStructuresOnly"` - //ConfigAddNPCSpawnEntriesContainer https://ark.wiki.gg/wiki/Server_configuration#ConfigAddNPCSpawnEntriesContainer - //ConfigOverrideItemCraftingCosts https://ark.wiki.gg/wiki/Server_configuration#ConfigOverrideItemCraftingCosts - //ConfigOverrideItemMaxQuantity https://ark.wiki.gg/wiki/Server_configuration#ConfigOverrideItemMaxQuantity - //ConfigOverrideNPCSpawnEntriesContainer https://ark.wiki.gg/wiki/Server_configuration#ConfigOverrideNPCSpawnEntriesContainer - //ConfigOverrideSupplyCrateItems https://ark.wiki.gg/wiki/Server_configuration#ConfigOverrideSupplyCrateItems - //ConfigSubtractNPCSpawnEntriesContainer https://ark.wiki.gg/wiki/Server_configuration#ConfigSubtractNPCSpawnEntriesContainer - CraftingSkillBonusMultiplier float32 `json:"craftingSkillBonusMultiplier" ini:"CraftingSkillBonusMultiplier"` - CraftXPMultiplier float32 `json:"craftXPMultiplier" ini:"CraftXPMultiplier"` - CropDecaySpeedMultiplier float32 `json:"cropDecaySpeedMultiplier" ini:"CropDecaySpeedMultiplier"` - CropGrowthSpeedMultiplier float32 `json:"cropGrowthSpeedMultiplier" ini:"CropGrowthSpeedMultiplier"` - CustomRecipeEffectivenessMultiplier float32 `json:"customRecipeEffectivenessMultiplier" ini:"CustomRecipeEffectivenessMultiplier"` - CustomRecipeSkillMultiplier float32 `json:"customRecipeSkillMultiplier" ini:"CustomRecipeSkillMultiplier"` - DestroyTamesOverLevelClamp int `json:"destroyTamesOverLevelClamp" ini:"DestroyTamesOverLevelClamp"` - //DinoClassDamageMultipliers https://ark.wiki.gg/wiki/Server_configuration#DinoClassDamageMultipliers - //DinoClassResistanceMultipliers https://ark.wiki.gg/wiki/Server_configuration#DinoClassResistanceMultipliers - DinoHarvestingDamageMultiplier float64 `json:"dinoHarvestingDamageMultiplier" ini:"DinoHarvestingDamageMultiplier"` - //DinoSpawnWeightMultipliers https://ark.wiki.gg/wiki/Server_configuration#DinoSpawnWeightMultipliers - DinoTurretDamageMultiplier float32 `json:"dinoTurretDamageMultiplier" ini:"DinoTurretDamageMultiplier"` - EggHatchSpeedMultiplier float32 `json:"eggHatchSpeedMultiplier" ini:"EggHatchSpeedMultiplier"` - //EngramEntryAutoUnlocks https://ark.wiki.gg/wiki/Server_configuration#EngramEntryAutoUnlocks - //ExcludeItemIndices https://ark.wiki.gg/wiki/Item_IDs - FastDecayInterval int `json:"fastDecayInterval" ini:"FastDecayInterval"` - FishingLootQualityMultiplier float32 `json:"fishingLootQualityMultiplier" ini:"FishingLootQualityMultiplier"` - FuelConsumptionIntervalMultiplier float32 `json:"fuelConsumptionIntervalMultiplier" ini:"FuelConsumptionIntervalMultiplier"` - GenericXPMultiplier float32 `json:"genericXPMultiplier" ini:"GenericXPMultiplier"` - GlobalCorpseDecompositionTimeMultiplier float32 `json:"globalCorpseDecompositionTimeMultiplier" ini:"GlobalCorpseDecompositionTimeMultiplier"` - GlobalItemDecompositionTimeMultiplier float32 `json:"globalItemDecompositionTimeMultiplier" ini:"GlobalItemDecompositionTimeMultiplier"` - GlobalPoweredBatteryDurabilityDecreasePerSecond float32 `json:"globalPoweredBatteryDurabilityDecreasePerSecond" ini:"GlobalPoweredBatteryDurabilityDecreasePerSecond"` - GlobalSpoilingTimeMultiplier float32 `json:"globalSpoilingTimeMultiplier" ini:"GlobalSpoilingTimeMultiplier"` - HairGrowthSpeedMultiplier float32 `json:"hairGrowthSpeedMultiplier" ini:"HairGrowthSpeedMultiplier"` - //HarvestResourceItemAmountClassMultipliers https://ark.wiki.gg/wiki/Server_configuration#HarvestResourceItemAmountClassMultipliers - HarvestXPMultiplier float32 `json:"harvestXPMultiplier" ini:"HarvestXPMultiplier"` - IncreasePvPRespawnIntervalBaseAmount float32 `json:"increasePvPRespawnIntervalBaseAmount" ini:"IncreasePvPRespawnIntervalBaseAmount"` - IncreasePvPRespawnIntervalCheckPeriod float32 `json:"increasePvPRespawnIntervalCheckPeriod" ini:"IncreasePvPRespawnIntervalCheckPeriod"` - IncreasePvPRespawnIntervalMultiplier float32 `json:"increasePvPRespawnIntervalMultiplier" ini:"IncreasePvPRespawnIntervalMultiplier"` - //ItemStatClamps[] https://ark.wiki.gg/wiki/Server_configuration#ItemStatClamps - KillXPMultiplier float32 `json:"killXPMultiplier" ini:"KillXPMultiplier"` - LayEggIntervalMultiplier float32 `json:"layEggIntervalMultiplier" ini:"LayEggIntervalMultiplier"` - // LevelExperienceRampOverrides https://ark.wiki.gg/wiki/Server_configuration#Players_and_dinos_levels_override - LimitNonPlayerDroppedItemsCount int `json:"limitNonPlayerDroppedItemsCount" ini:"LimitNonPlayerDroppedItemsCount"` - LimitNonPlayerDroppedItemsRange int `json:"limitNonPlayerDroppedItemsRange" ini:"LimitNonPlayerDroppedItemsRange"` - MatingIntervalMultiplier float32 `json:"matingIntervalMultiplier" ini:"MatingIntervalMultiplier"` - MatingSpeedMultiplier float32 `json:"matingSpeedMultiplier" ini:"MatingSpeedMultiplier"` - MaxAlliancesPerTribe int - MaxFallSpeedMultiplier float32 `json:"maxFallSpeedMultiplier" ini:"MaxFallSpeedMultiplier"` - MaxNumberOfPlayersInTribe int `json:"maxNumberOfPlayersInTribe" ini:"MaxNumberOfPlayersInTribe"` - MaxTribeLogs int `json:"maxTribeLogs" ini:"MaxTribeLogs"` - //MaxTribesPerAlliance int `json:"maxTribesPerAlliance" ini:"MaxTribesPerAlliance"` // TODO: Add this in save function - //NPCReplacements https://ark.wiki.gg/wiki/Server_configuration#NPCReplacements // TODO: Add this in save function - //OverrideMaxExperiencePointsDino int `json:"overrideMaxExperiencePointsDino" ini:"OverrideMaxExperiencePointsDino"`// TODO: Add this in save function - //OverrideMaxExperiencePointsPlayer int `json:"overrideMaxExperiencePointsPlayer" ini:"OverrideMaxExperiencePointsPlayer"`// TODO: Add this in save function - //OverrideEngramEntries https://ark.wiki.gg/wiki/Server_configuration#OverrideEngramEntries_and_OverrideNamedEngramEntries // TODO: Add this in save function - //OverrideNamedEngramEntries https://ark.wiki.gg/wiki/Server_configuration#OverrideEngramEntries_and_OverrideNamedEngramEntries // TODO: Add this in save function - //OverridePlayerLevelEngramPoints - PassiveTameIntervalMultiplier float32 `json:"passiveTameIntervalMultiplier" ini:"PassiveTameIntervalMultiplier"` - //PerLevelStatsMultiplier_Player[] https://ark.wiki.gg/wiki/Server_configuration#PerLevelStatsMultiplier - //PerLevelStatsMultiplier_DinoTamed<_type>[] https://ark.wiki.gg/wiki/Server_configuration#PerLevelStatsMultiplier - //PerLevelStatsMultiplier_DinoWild[] https://ark.wiki.gg/wiki/Server_configuration#PerLevelStatsMultiplier - //PlayerBaseStatMultipliers[] https://ark.wiki.gg/wiki/Server_configuration#PlayerBaseStatMultipliers - PlayerHarvestingDamageMultiplier float32 `json:"playerHarvestingDamageMultiplier" ini:"PlayerHarvestingDamageMultiplier"` - PoopIntervalMultiplier float32 `json:"poopIntervalMultiplier" ini:"PoopIntervalMultiplier"` - //PreventBreedingForClassNames https://ark.wiki.gg/wiki/Creature_IDs - //PreventDinoTameClassNames https://ark.wiki.gg/wiki/Creature_IDs - PreventOfflinePvPConnectionInvincibleInterval float32 `json:"preventOfflinePvPConnectionInvincibleInterval" ini:"PreventOfflinePvPConnectionInvincibleInterval"` - //PreventTransferForClassNames - PvPZoneStructureDamageMultiplier float32 `json:"pvPZoneStructureDamageMultiplier" ini:"PvPZoneStructureDamageMultiplier"` - ResourceNoReplenishRadiusPlayers float32 `json:"resourceNoReplenishRadiusPlayers" ini:"ResourceNoReplenishRadiusPlayers"` - ResourceNoReplenishRadiusStructures float32 `json:"resourceNoReplenishRadiusStructures" ini:"ResourceNoReplenishRadiusStructures"` - SpecialXPMultiplier float32 `json:"specialXPMultiplier" ini:"SpecialXPMultiplier"` - StructureDamageRepairCooldown int `json:"structureDamageRepairCooldown" ini:"StructureDamageRepairCooldown"` - SupplyCrateLootQualityMultiplier float32 `json:"supplyCrateLootQualityMultiplier" ini:"SupplyCrate"` - TamedDinoCharacterFoodDrainMultiplier float32 `json:"tamedDinoCharacterFoodDrainMultiplier" ini:"TamedDinoCharacterFoodDrainMultiplier"` - //TamedDinoClassDamageMultipliers https://ark.wiki.gg/wiki/Server_configuration#DinoClassDamageMultipliers - //TamedDinoClassResistanceMultipliers https://ark.wiki.gg/wiki/Server_configuration#DinoClassResistanceMultipliers - TamedDinoTorporDrainMultiplier float32 `json:"tamedDinoTorporDrainMultiplier" ini:"TamedDinoTorporDrainMultiplier"` - TribeSlotReuseCooldown float32 `json:"tribeSlotReuseCooldown" ini:"TribeSlotReuseCooldown"` - UseCorpseLifeSpanMultiplier float32 `json:"useCorpseLifeSpanMultiplier" ini:"UseCorpseLifeSpanMultiplier"` - WildDinoCharacterFoodDrainMultiplier float32 `json:"wildDinoCharacterFoodDrainMultiplier" ini:"WildDinoCharacterFoodDrainMultiplier"` - WildDinoTorporDrainMultiplier float32 `json:"wildDinoTorporDrainMultiplier" ini:"WildDinoTorporDrainMultiplier"` - BHardLimitTurretsInRange bool `json:"bHardLimitTurretsInRange" ini:"bHardLimitTurretsInRange"` - BLimitTurretsInRange bool `json:"bLimitTurretsInRange" ini:"bLimitTurretsInRange"` - LimitTurretsNum int `json:"limitTurretsNum" ini:"LimitTurretsNum"` - LimitTurretsRange float32 `json:"limitTurretsRange" ini:"LimitTurretsRange"` - - AdjustableMutagenSpawnDelayMultiplier float32 `json:"adjustableMutagenSpawnDelayMultiplier" ini:"AdjustableMutagenSpawnDelayMultiplier"` - BaseHexagonRewardMultiplier float32 `json:"baseHexagonRewardMultiplier" ini:"BaseHexagonRewardMultiplier"` - BDisableHexagonStore bool `json:"bDisableHexagonStore" ini:"bDisableHexagonStore"` - BDisableDefaultMapItemSets bool `json:"bDisableDefaultMapItemSets" ini:"bDisableDefaultMapItemSets"` - BDisableGenesisMissions bool `json:"bDisableGenesisMissions" ini:"bDisableGenesisMissions"` - BDisableWorldBuffs bool `json:"bDisableWorldBuffs" ini:"bDisableWorldBuffs"` - BEnableWorldBuffScaling bool `json:"bEnableWorldBuffScaling" ini:"bEnableWorldBuffScaling"` - BGenesisUseStructuresPreventionVolumes bool `json:"bGenesisUseStructuresPreventionVolumes" ini:"bGenesisUseStructuresPreventionVolumes"` - BHexStoreAllowOnlyEngramTradeOption bool `json:"bHexStoreAllowOnlyEngramTradeOption" ini:"bHexStoreAllowOnlyEngramTradeOption"` - HexagonCostMultiplier float32 `json:"hexagonCostMultiplier" ini:"HexagonCostMultiplier"` - //MutagenLevelBoost[] - //MutagenLevelBoost_Bred[] - WorldBuffScalingEfficacy float32 `json:"worldBuffScalingEfficacy" ini:"WorldBuffScalingEfficacy"` -} - -type Game struct { - ScriptShootergameShootergamemode ScriptShootergameShootergamemode `json:"ScriptShootergameShootergamemode" ini:"/script/shootergame.shootergamemode"` -} - -func generateNewDefaultGame() Game { - return Game{ - ScriptShootergameShootergamemode: ScriptShootergameShootergamemode{ - AutoPvEStartTimeSeconds: 0.0, - AutoPvEStopTimeSeconds: 0.0, - BabyCuddleGracePeriodMultiplier: 1.0, - BabyCuddleIntervalMultiplier: 1.0, - BabyCuddleLoseImprintQualitySpeedMultiplier: 1.0, - BabyFoodConsumptionSpeedMultiplier: 1.0, - BabyImprintAmountMultiplier: 1.0, - BabyImprintingStatScaleMultiplier: 1.0, - BabyMatureSpeedMultiplier: 1.0, - BAllowUnclaimDinos: true, - BAllowCustomRecipes: true, - BAllowFlyerSpeedLeveling: false, - BAllowPlatformSaddleMultiFloors: false, - BAllowUnlimitedRespecs: false, - BaseTemperatureMultiplier: 1.0, - BAutoPvETimer: false, - BAutoPvEUseSystemTime: false, - BAutoUnlockAllEngrams: false, - BDisableDinoBreeding: false, - BDisableDinoRiding: false, - BDisableDinoTaming: false, - BDisableFriendlyFire: false, - BDisableLootCrates: false, - BDisableStructurePlacementCollision: false, - BFlyerPlatformAllowUnalignedDinoBasing: false, - BIgnoreStructuresPreventionVolumes: false, - BIncreasePvPRespawnInterval: true, - BOnlyAllowSpecifiedEngrams: false, - BPassiveDefensesDamageRiderlessDinos: false, - BPvEAllowTribeWar: true, - BPvEAllowTribeWarCancel: false, - BPvEDisableFriendlyFire: false, - BShowCreativeMode: false, - BUseCorpseLocator: true, - BUseDinoLevelUpAnimations: true, - BUseSingleplayerSettings: false, - BUseTameLimitForStructuresOnly: false, - CraftingSkillBonusMultiplier: 1.0, - CraftXPMultiplier: 1.0, - CropDecaySpeedMultiplier: 1.0, - CropGrowthSpeedMultiplier: 1.0, - CustomRecipeEffectivenessMultiplier: 1.0, - CustomRecipeSkillMultiplier: 1.0, - DestroyTamesOverLevelClamp: 450, - DinoHarvestingDamageMultiplier: 3.2, - DinoTurretDamageMultiplier: 1.0, - EggHatchSpeedMultiplier: 1.0, - FastDecayInterval: 43200, - FishingLootQualityMultiplier: 1.0, - FuelConsumptionIntervalMultiplier: 1.0, - GenericXPMultiplier: 1.0, - GlobalCorpseDecompositionTimeMultiplier: 1.0, - GlobalItemDecompositionTimeMultiplier: 1.0, - GlobalPoweredBatteryDurabilityDecreasePerSecond: 3.0, - GlobalSpoilingTimeMultiplier: 1.0, - HairGrowthSpeedMultiplier: 1.0, - HarvestXPMultiplier: 1.0, - IncreasePvPRespawnIntervalBaseAmount: 60.0, - IncreasePvPRespawnIntervalCheckPeriod: 300.0, - IncreasePvPRespawnIntervalMultiplier: 2.0, - KillXPMultiplier: 1.0, - LayEggIntervalMultiplier: 1.0, - LimitNonPlayerDroppedItemsCount: 0, - LimitNonPlayerDroppedItemsRange: 0, - MatingIntervalMultiplier: 1.0, - MatingSpeedMultiplier: 1.0, - MaxFallSpeedMultiplier: 1.0, - MaxNumberOfPlayersInTribe: 0, - MaxTribeLogs: 400, - PassiveTameIntervalMultiplier: 1.0, - PlayerHarvestingDamageMultiplier: 1.0, - PoopIntervalMultiplier: 1.0, - PreventOfflinePvPConnectionInvincibleInterval: 5.0, - PvPZoneStructureDamageMultiplier: 6.0, - ResourceNoReplenishRadiusPlayers: 1.0, - ResourceNoReplenishRadiusStructures: 1.0, - SpecialXPMultiplier: 1.0, - StructureDamageRepairCooldown: 180, - SupplyCrateLootQualityMultiplier: 1.0, - TamedDinoCharacterFoodDrainMultiplier: 1.0, - TamedDinoTorporDrainMultiplier: 1.0, - TribeSlotReuseCooldown: 0.0, - UseCorpseLifeSpanMultiplier: 1.0, - WildDinoCharacterFoodDrainMultiplier: 1.0, - WildDinoTorporDrainMultiplier: 1.0, - BHardLimitTurretsInRange: false, - BLimitTurretsInRange: true, - LimitTurretsNum: 100, - LimitTurretsRange: 10000, - AdjustableMutagenSpawnDelayMultiplier: 1.0, - BaseHexagonRewardMultiplier: 1.0, - BDisableHexagonStore: false, - BDisableDefaultMapItemSets: false, - BDisableGenesisMissions: false, - BDisableWorldBuffs: false, - BEnableWorldBuffScaling: false, - BGenesisUseStructuresPreventionVolumes: false, - BHexStoreAllowOnlyEngramTradeOption: false, - HexagonCostMultiplier: 1.0, - WorldBuffScalingEfficacy: 1.0, - }, - } - -} - -// SaveGameIni saves the game to the ini file in the server directory -func (s *Server) SaveGameIni(filePathToLoadFrom string, overrideUseIniConfig bool) error { - - ini.PrettyFormat = false - - filePath := filepath.Join(s.ServerPath, "ShooterGame", "Saved", "Config", "WindowsServer", "Game.ini") - - err := ensureFilePath(filePath) - if err != nil { - return err - } - - gIni, err := ini.LoadSources(iniOpts, filePathToLoadFrom) - if err != nil { - return err - } - - if s.UseIniConfig || overrideUseIniConfig { - err = gIni.MapTo(&s.Game) - if err != nil { - return err - } - } - - //modify ini file here - - //Same as GUS change. changes from app should now reflect in actual INI file - // gIni.Append([]byte(s.AdditionalGameSections)) - - err = gIni.ReflectFrom(&s.Game) - if err != nil { - return err - } - - err = gIni.SaveTo(filepath.Join(s.ServerPath, "ShooterGame\\Saved\\Config\\WindowsServer\\Game.ini")) - if err != nil { - return err - } - - if s.AdditionalGameSections != "" { - addGIni, err := ini.LoadSources(ini.LoadOptions{ - // This setting allowed duplicate values in the INI files. With the Changes values should now be replaced - AllowShadows: true, - AllowDuplicateShadowValues: true, - PreserveSurroundedQuote: true, - }, filePath, []byte(s.AdditionalGameSections)) - if err != nil { - return err - } - err = addGIni.SaveTo(filePath) - if err != nil { - return err - } - } - - runtime.EventsEmit(s.ctx, "reloadServers") - - return nil -} diff --git a/server/gus.go b/server/gus.go index b522d53..f05ce9f 100644 --- a/server/gus.go +++ b/server/gus.go @@ -1,488 +1,90 @@ package server import ( + "errors" + ini "github.com/JensvandeWiel/ark-ini" + "os" "path/filepath" - - "github.com/go-ini/ini" - "github.com/wailsapp/wails/v2/pkg/runtime" ) -type ServerSettings struct { - ActiveMods string `json:"activeMods" ini:"ActiveMods"` - //ActiveMapMod string `json:"activeMapMod" ini:"ActiveMapMod"` TODO IMPLEMENT IN GENERATION FUNC - AdminLogging bool `json:"adminLogging" ini:"AdminLogging"` - AllowAnyoneBabyImprintCuddle bool `json:"allowAnyoneBabyImprintCuddle" ini:"AllowAnyoneBabyImprintCuddle"` - AllowCaveBuildingPvE bool `json:"allowCaveBuildingPvE" ini:"AllowCaveBuildingPvE"` - AllowCaveBuildingPvP bool `json:"allowCaveBuildingPvP" ini:"AllowCaveBuildingPvP"` //TODO: Usage unknown in asa - AllowCrateSpawnsOnTopOfStructures bool `json:"allowCrateSpawnsOnTopOfStructures" ini:"AllowCrateSpawnsOnTopOfStructures"` //TODO: Usage unknown in asa - AllowFlyerCarryPvE bool `json:"allowFlyerCarryPvE" ini:"AllowFlyerCarryPvE"` - AllowFlyingStaminaRecovery bool `json:"allowFlyingStaminaRecovery" ini:"AllowFlyingStaminaRecovery"` //TODO: Usage unknown in asa - AllowHideDamageSourceFromLogs bool `json:"allowHideDamageSourceFromLogs" ini:"AllowHideDamageSourceFromLogs"` - AllowHitMarkers bool `json:"allowHitMarkers" ini:"AllowHitMarkers"` - AllowIntegratedSPlusStructures bool `json:"allowIntegratedSPlusStructures" ini:"AllowIntegratedSPlusStructures"` //TODO: Usage unknown in asa - AllowMultipleAttachedC4 bool `json:"allowMultipleAttachedC4" ini:"AllowMultipleAttachedC4"` - AllowRaidDinoFeeding bool `json:"allowRaidDinoFeeding" ini:"AllowRaidDinoFeeding"` - AllowSharedConnections bool `json:"allowSharedConnections" ini:"AllowSharedConnections"` //TODO: Usage unknown in asa - AllowTekSuitPowersInGenesis bool `json:"allowTekSuitPowersInGenesis" ini:"AllowTekSuitPowersInGenesis"` //TODO: Usage unknown in asa - AllowThirdPersonPlayer bool `json:"allowThirdPersonPlayer" ini:"AllowThirdPersonPlayer"` - AlwaysAllowStructurePickup bool `json:"alwaysAllowStructurePickup" ini:"AlwaysAllowStructurePickup"` - AlwaysNotifyPlayerLeft bool `json:"alwaysNotifyPlayerLeft" ini:"AlwaysNotifyPlayerLeft"` //TODO: Usage unknown in asa - AutoDestroyDecayedDinos bool `json:"autoDestroyDecayedDinos" ini:"AutoDestroyDecayedDinos"` //TODO: Usage unknown in asa - AutoDestroyOldStructuresMultiplier float32 `json:"autoDestroyOldStructuresMultiplier" ini:"AutoDestroyOldStructuresMultiplier"` //TODO: Usage unknown in asa - AutoSavePeriodMinutes float32 `json:"autoSavePeriodMinutes" ini:"AutoSavePeriodMinutes"` - BanListURL string `json:"banListUrl" ini:"BanListURL"` //TODO: Usage unknown in asa - //BForceCanRideFliers bool `json:"bForceCanRideFliers" ini:"bForceCanRideFliers"` //TODO: Usage unknown in asa - ClampItemSpoilingTimes bool `json:"clampItemSpoilingTimes" ini:"ClampItemSpoilingTimes"` //TODO: Usage unknown in asa - ClampItemStats bool `json:"clampItemStats" ini:"ClampItemStats"` //TODO: Usage unknown in asa - ClampResourceHarvestDamage bool `json:"clampResourceHarvestDamage" ini:"ClampResourceHarvestDamage"` - //CustomDynamicConfigUrl bool `json:"customDynamicConfigUrl" ini:"CustomDynamicConfigUrl"` - //CustomLiveTuningUrl bool `json:"customLiveTuningUrl" ini:"CustomLiveTuningUrl"` //TODO Usage unknown in asa - DayCycleSpeedScale float32 `json:"dayCycleSpeedScale" ini:"DayCycleSpeedScale"` - DayTimeSpeedScale float32 `json:"dayTimeSpeedScale" ini:"DayTimeSpeedScale"` - DifficultyOffset float32 `json:"difficultyOffset" ini:"DifficultyOffset"` - DinoCharacterFoodDrainMultiplier float32 `json:"dinoCharacterFoodDrainMultiplier" ini:"DinoCharacterFoodDrainMultiplier"` - DinoCharacterHealthRecoveryMultiplier float32 `json:"dinoCharacterHealthRecoveryMultiplier" ini:"DinoCharacterHealthRecoveryMultiplier"` - DinoCharacterStaminaDrainMultiplier float32 `json:"dinoCharacterStaminaDrainMultiplier" ini:"DinoCharacterStaminaDrainMultiplier"` - DinoCountMultiplier float32 `json:"dinoCountMultiplier" ini:"DinoCountMultiplier"` //TODO: Usage unknown in asa - DinoDamageMultiplier float32 `json:"dinoDamageMultiplier" ini:"DinoDamageMultiplier"` - DinoResistanceMultiplier float32 `json:"dinoResistanceMultiplier" ini:"DinoResistanceMultiplier"` - DisableDinoDecayPvE bool `json:"disableDinoDecayPvE" ini:"DisableDinoDecayPvE"` - DisableImprintDinoBuff bool `json:"disableImprintDinoBuff" ini:"DisableImprintDinoBuff"` - DisablePvEGamma bool `json:"disablePvEGamma" ini:"DisablePvEGamma"` - DisableStructureDecayPvE bool `json:"disableStructureDecayPvE" ini:"DisableStructureDecayPvE"` - DisableWeatherFog bool `json:"disableWeatherFog" ini:"DisableWeatherFog"` - DontAlwaysNotifyPlayerJoined bool `json:"dontAlwaysNotifyPlayerJoined" ini:"DontAlwaysNotifyPlayerJoined"` - EnableExtraStructurePreventionVolumes bool `json:"enableExtraStructurePreventionVolumes" ini:"EnableExtraStructurePreventionVolumes"` - EnablePvPGamma bool `json:"enablePvPGamma" ini:"EnablePvPGamma"` - //ExtinctionEventTimeInterval int `json:"extinctionEventTimeInterval" ini:"ExtinctionEventTimeInterval"` //TODO: Usage unknown in asa - FastDecayUnsnappedCoreStructures bool `json:"fastDecayUnsnappedCoreStructures" ini:"FastDecayUnsnappedCoreStructures"` //TODO: Usage unknown in asa - ForceAllStructureLocking bool `json:"forceAllStructureLocking" ini:"ForceAllStructureLocking"` - GlobalVoiceChat bool `json:"globalVoiceChat" ini:"GlobalVoiceChat"` //TODO if it actually starts with a non capital letter - HarvestAmountMultiplier float32 `json:"harvestAmountMultiplier" ini:"HarvestAmountMultiplier"` - HarvestHealthMultiplier float32 `json:"harvestHealthMultiplier" ini:"HarvestHealthMultiplier"` - IgnoreLimitMaxStructuresInRangeTypeFlag bool `json:"ignoreLimitMaxStructuresInRangeTypeFlag" ini:"IgnoreLimitMaxStructuresInRangeTypeFlag"` //TODO: Usage unknown in asa - ItemStackSizeMultiplier float32 `json:"itemStackSizeMultiplier" ini:"ItemStackSizeMultiplier"` - KickIdlePlayersPeriod float32 `json:"kickIdlePlayersPeriod" ini:"KickIdlePlayersPeriod"` - MaxGateFrameOnSaddles int `json:"maxGateFrameOnSaddles" ini:"MaxGateFrameOnSaddles"` //TODO: Usage unknown in asa - MaxHexagonsPerCharacter int `json:"maxHexagonsPerCharacter" ini:"MaxHexagonsPerCharacter"` //TODO: Usage unknown in asa - MaxPersonalTamedDinos int `json:"maxPersonalTamedDinos" ini:"MaxPersonalTamedDinos"` - MaxPlatformSaddleStructureLimit int `json:"maxPlatformSaddleStructureLimit" ini:"MaxPlatformSaddleStructureLimit"` - MaxTamedDinos float32 `json:"maxTamedDinos" ini:"MaxTamedDinos"` - MaxTributeCharacters int `json:"maxTributeCharacters" ini:"MaxTributeCharacters"` //TODO: Usage unknown in asa - MaxTributeDinos int `json:"maxTributeDinos" ini:"MaxTributeDinos"` - MaxTributeItems int `json:"maxTributeItems" ini:"MaxTributeItems"` - NightTimeSpeedScale float32 `json:"nightTimeSpeedScale" ini:"NightTimeSpeedScale"` - NonPermanentDiseases bool `json:"nonPermanentDiseases" ini:"NonPermanentDiseases"` - NPCNetworkStasisRangeScalePlayerCountStart int `json:"npcNetworkStasisRangeScalePlayerCountStart" ini:"NPCNetworkStasisRangeScalePlayerCountStart"` //TODO: Usage unknown in asa - NPCNetworkStasisRangeScalePlayerCountEnd int `json:"npcNetworkStasisRangeScalePlayerCountEnd" ini:"NPCNetworkStasisRangeScalePlayerCountEnd"` //TODO: Usage unknown in asa - NPCNetworkStasisRangeScalePercentEnd float32 `json:"npcNetworkStasisRangeScalePercentEnd" ini:"NPCNetworkStasisRangeScalePercentEnd"` //TODO: Usage unknown in asa - OnlyAutoDestroyCoreStructures bool `json:"onlyAutoDestroyCoreStructures" ini:"OnlyAutoDestroyCoreStructures"` //TODO: Usage unknown in asa - OnlyDecayUnsnappedCoreStructures bool `json:"onlyDecayUnsnappedCoreStructures" ini:"OnlyDecayUnsnappedCoreStructures"` //TODO: Usage unknown in asa - OverrideOfficialDifficulty float32 `json:"overrideOfficialDifficulty" ini:"OverrideOfficialDifficulty"` //TODO: Usage unknown in asa - OverrideStructurePlatformPrevention bool `json:"overrideStructurePlatformPrevention" ini:"OverrideStructurePlatformPrevention"` - OxygenSwimSpeedStatMultiplier float32 `json:"oxygenSwimSpeedStatMultiplier" ini:"OxygenSwimSpeedStatMultiplier"` - PerPlatformMaxStructuresMultiplier float32 `json:"perPlatformMaxStructuresMultiplier" ini:"PerPlatformMaxStructuresMultiplier"` - PersonalTamedDinosSaddleStructureCost int `json:"personalTamedDinosSaddleStructureCost" ini:"PersonalTamedDinosSaddleStructureCost"` //TODO: Usage unknown in asa - PlatformSaddleBuildAreaBoundsMultiplier float32 `json:"platformSaddleBuildAreaBoundsMultiplier" ini:"PlatformSaddleBuildAreaBoundsMultiplier"` - PlayerCharacterFoodDrainMultiplier float32 `json:"playerCharacterFoodDrainMultiplier" ini:"PlayerCharacterFoodDrainMultiplier"` - PlayerCharacterHealthRecoveryMultiplier float32 `json:"playerCharacterHealthRecoveryMultiplier" ini:"PlayerCharacterHealthRecoveryMultiplier"` - PlayerCharacterStaminaDrainMultiplier float32 `json:"playerCharacterStaminaDrainMultiplier" ini:"PlayerCharacterStaminaDrainMultiplier"` - PlayerCharacterWaterDrainMultiplier float32 `json:"playerCharacterWaterDrainMultiplier" ini:"PlayerCharacterWaterDrainMultiplier"` - PlayerDamageMultiplier float32 `json:"playerDamageMultiplier" ini:"PlayerDamageMultiplier"` - PlayerResistanceMultiplier float32 `json:"playerResistanceMultiplier" ini:"PlayerResistanceMultiplier"` - PreventDiseases bool `json:"preventDiseases" ini:"PreventDiseases"` - PreventMateBoost bool `json:"preventMateBoost" ini:"PreventMateBoost"` - PreventOfflinePvP bool `json:"preventOfflinePvP" ini:"PreventOfflinePvP"` - PreventOfflinePvPInterval float32 `json:"preventOfflinePvPInterval" ini:"PreventOfflinePvPInterval"` - PreventSpawnAnimations bool `json:"preventSpawnAnimations" ini:"PreventSpawnAnimations"` - PreventTribeAlliances bool `json:"preventTribeAlliances" ini:"PreventTribeAlliances"` - ProximityChat bool `json:"proximityChat" ini:"ProximityChat"` - PvEAllowStructuresAtSupplyDrops bool `json:"pveAllowStructuresAtSupplyDrops" ini:"PvEAllowStructuresAtSupplyDrops"` - PvEDinoDecayPeriodMultiplier float32 `json:"pveDinoDecayPeriodMultiplier" ini:"PvEDinoDecayPeriodMultiplier"` - PvEStructureDecayPeriodMultiplier float32 `json:"pveStructureDecayPeriodMultiplier" ini:"PvEStructureDecayPeriodMultiplier"` - PvPDinoDecay bool `json:"pvpDinoDecay" ini:"PvPDinoDecay"` - PvPStructureDecay bool `json:"pvpStructureDecay" ini:"PvPStructureDecay"` //TODO: Usage unknown in asa - RaidDinoCharacterFoodDrainMultiplier float32 `json:"raidDinoCharacterFoodDrainMultiplier" ini:"RaidDinoCharacterFoodDrainMultiplier"` - RandomSupplyCratePoints bool `json:"randomSupplyCratePoints" ini:"RandomSupplyCratePoints"` - RCONEnabled bool `json:"rconEnabled" ini:"RCONEnabled"` - RCONPort int `json:"rconPort" ini:"RCONPort"` - RCONServerGameLogBuffer float32 `json:"rconServerGameLogBuffer" ini:"RCONServerGameLogBuffer"` - ResourcesRespawnPeriodMultiplier float32 `json:"resourcesRespawnPeriodMultiplier" ini:"ResourcesRespawnPeriodMultiplier"` - ServerAdminPassword string `json:"serverAdminPassword" ini:"ServerAdminPassword"` - ServerAutoForceRespawnWildDinosInterval float32 `json:"serverAutoForceRespawnWildDinosInterval" ini:"ServerAutoForceRespawnWildDinosInterval"` //TODO: Usage unknown in asa - ServerCrosshair bool `json:"serverCrosshair" ini:"ServerCrosshair"` - ServerForceNoHUD bool `json:"serverForceNoHUD" ini:"ServerForceNoHUD"` - ServerHardcore bool `json:"serverHardcore" ini:"ServerHardcore"` - ServerPVE bool `json:"serverPVE" ini:"ServerPVE"` - ShowFloatingDamageText bool `json:"showFloatingDamageText" ini:"ShowFloatingDamageText"` - ShowMapPlayerLocation bool `json:"showMapPlayerLocation" ini:"ShowMapPlayerLocation"` - StructureDamageMultiplier float32 `json:"structureDamageMultiplier" ini:"StructureDamageMultiplier"` - StructurePickupHoldDuration float32 `json:"structurePickupHoldDuration" ini:"StructurePickupHoldDuration"` - StructurePickupTimeAfterPlacement float32 `json:"structurePickupTimeAfterPlacement" ini:"StructurePickupTimeAfterPlacement"` - StructurePreventResourceRadiusMultiplier float32 `json:"structurePreventResourceRadiusMultiplier" ini:"StructurePreventResourceRadiusMultiplier"` - StructureResistanceMultiplier float32 `json:"structureResistanceMultiplier" ini:"StructureResistanceMultiplier"` - TamedDinoDamageMultiplier float32 `json:"tamedDinoDamageMultiplier" ini:"TamedDinoDamageMultiplier"` //TODO: Usage unknown in asa - TamedDinoResistanceMultiplier float32 `json:"tamedDinoResistanceMultiplier" ini:"TamedDinoResistanceMultiplier"` - TamingSpeedMultiplier float32 `json:"tamingSpeedMultiplier" ini:"TamingSpeedMultiplier"` - TheMaxStructuresInRange int `json:"theMaxStructuresInRange" ini:"TheMaxStructuresInRange"` - TribeLogDestroyedEnemyStructures bool `json:"tribeLogDestroyedEnemyStructures" ini:"TribeLogDestroyedEnemyStructures"` - TribeNameChangeCooldown float32 `json:"tribeNameChangeCooldown" ini:"TribeNameChangeCooldown"` - UseFjordurTraversalBuff bool `json:"useFjordurTraversalBuff" ini:"UseFjordurTraversalBuff"` //TODO: Usage unknown in asa - UseOptimizedHarvestingHealth bool `json:"useOptimizedHarvestingHealth" ini:"UseOptimizedHarvestingHealth"` - XPMultiplier float32 `json:"xPMultiplier" ini:"XPMultiplier"` - //CrossARK Transfers - CrossARKAllowForeignDinoDownloads bool `json:"crossARKAllowForeignDinoDownloads" ini:"CrossARKAllowForeignDinoDownloads"` //TODO: Usage unknown in asa - MinimumDinoReuploadInterval float32 `json:"minimumDinoReuploadInterval" ini:"MinimumDinoReuploadInterval"` //TODO: Usage unknown in asa - NoTributeDownloads bool `json:"noTributeDownloads" ini:"NoTributeDownloads"` - PreventDownloadDinos bool `json:"preventDownloadDinos" ini:"PreventDownloadDinos"` - PreventDownloadItems bool `json:"preventDownloadItems" ini:"PreventDownloadItems"` - PreventDownloadSurvivors bool `json:"preventDownloadSurvivors" ini:"PreventDownloadSurvivors"` - PreventUploadDinos bool `json:"preventUploadDinos" ini:"PreventUploadDinos"` //TODO: Usage unknown in asa - PreventUploadItems bool `json:"preventUploadItems" ini:"PreventUploadItems"` - PreventUploadSurvivors bool `json:"preventUploadSurvivors" ini:"PreventUploadSurvivors"` - TributeCharacterExpirationSeconds int `json:"tributeCharacterExpirationSeconds" ini:"TributeCharacterExpirationSeconds"` //TODO: Usage unknown in asa - TributeDinoExpirationSeconds int `json:"tributeDinoExpirationSeconds" ini:"TributeDinoExpirationSeconds"` - TributeItemExpirationSeconds int `json:"tributeItemExpirationSeconds" ini:"TributeItemExpirationSeconds"` - // Cryo sickness and cryopod nerf - //CryopodNerfDamageMult float32 `json:"cryopodNerfDamageMult" ini:"CryopodNerfDamageMult"` //TODO: Usage unknown in asa - //CryopodNerfDuration int `json:"cryopodNerfDuration" ini:"CryopodNerfDuration"` //TODO: Usage unknown in asa - //CryopodNerfIncomingDamageMultPercent float32 `json:"cryopodNerfIncomingDamageMultPercent" ini:"CryopodNerfIncomingDamageMultPercent"` //TODO: Usage unknown in asa - //EnableCryopodNerf bool `json:"enableCryopodNerf" ini:"EnableCryopodNerf"` - EnableCryoSicknessPVE bool `json:"enableCryoSicknessPVE" ini:"EnableCryoSicknessPVE"` - //Text filtering - BadWordListURL string `json:"badWordListURL" ini:"BadWordListURL"` - BadWordWhiteListURL string `json:"badWordWhiteListURL" ini:"BadWordWhiteListURL"` - BFilterCharacterNames bool `json:"bFilterCharacterNames" ini:"bFilterCharacterNames"` - BFilterChat bool `json:"bFilterChat" ini:"bFilterChat"` - BFilterTribeNames bool `json:"bFilterTribeNames" ini:"bFilterTribeNames"` - //Undocumented - //AllowedCheatersURL string `json:"allowedCheatersURL" ini:"AllowedCheatersURL"` - ChatLogFileSplitIntervalSeconds int `json:"chatLogFileSplitIntervalSeconds" ini:"ChatLogFileSplitIntervalSeconds"` - ChatLogFlushIntervalSeconds int `json:"chatLogFlushIntervalSeconds" ini:"ChatLogFlushIntervalSeconds"` - ChatLogMaxAgeInDays int `json:"chatLogMaxAgeInDays" ini:"ChatLogMaxAgeInDays"` - DontRestoreBackup bool `json:"dontRestoreBackup" ini:"DontRestoreBackup"` - EnableAFKKickPlayerCountPercent float32 `json:"enableAFKKickPlayerCountPercent" ini:"EnableAFKKickPlayerCountPercent"` - EnableMeshBitingProtection bool `json:"enableMeshBitingProtection" ini:"EnableMeshBitingProtection"` - FreezeReaperPregnancy bool `json:"freezeReaperPregnancy" ini:"FreezeReaperPregnancy"` - LogChatMessages bool `json:"logChatMessages" ini:"LogChatMessages"` - MaxStructuresInSmallRadius int `json:"maxStructuresInSmallRadius" ini:"MaxStructuresInSmallRadius"` - MaxStructuresToProcess int `json:"maxStructuresToProcess" ini:"MaxStructuresToProcess"` - PreventOutOfTribePinCodeUse bool `json:"preventOutOfTribePinCodeUse" ini:"PreventOutOfTribePinCodeUse"` - RadiusStructuresInSmallRadius float32 `json:"radiusStructuresInSmallRadius" ini:"RadiusStructuresInSmallRadius"` - ServerEnableMeshChecking bool `json:"serverEnableMeshChecking" ini:"ServerEnableMeshChecking"` - TribeMergeAllowed bool `json:"tribeMergeAllowed" ini:"TribeMergeAllowed"` - TribeMergeCooldown float32 `json:"tribeMergeCooldown" ini:"TribeMergeCooldown"` - UpdateAllowedCheatersInterval float32 `json:"updateAllowedCheatersInterval" ini:"UpdateAllowedCheatersInterval"` - UseExclusiveList bool `json:"useExclusiveList" ini:"UseExclusiveList"` -} - -type SessionSettings struct { - MultiHome string `json:"multiHome" ini:"MultiHome"` - Port int `json:"port" ini:"Port"` - QueryPort int `json:"queryPort" ini:"QueryPort"` - SessionName string `json:"sessionName" ini:"SessionName"` -} - -type MultiHome struct { - MultiHome bool `json:"multiHome" ini:"MultiHome"` -} - -type Ragnarok struct { - AllowMultipleTamedUnicorns bool `json:"allowMultipleTamedUnicorns" ini:"AllowMultipleTamedUnicorns"` - EnableVolcano bool `json:"enableVolcano" ini:"EnableVolcano"` - UnicornSpawnInterval int `json:"unicornSpawnInterval" ini:"UnicornSpawnInterval"` - VolcanoIntensity float32 `json:"volcanoIntensity" ini:"VolcanoIntensity"` - VolcanoInterval int `json:"volcanoInterval" ini:"VolcanoInterval"` -} - -type MessageOfTheDay struct { - Duration int `json:"duration" ini:"Duration"` - Message string `json:"message" ini:"Message"` -} - -type ScriptEngineGameSession struct { - MaxPlayers int `json:"maxPlayers" ini:"MaxPlayers"` -} - -type GameUserSettings struct { - //https://ark.wiki.gg/wiki/Server_configuration#GameUserSettings.ini - ServerSettings ServerSettings `json:"serverSettings" ini:"ServerSettings"` +// getGus returns the GameUserSettings.ini file as an ini.IniFile struct +func (s *Server) getGus() (*ini.IniFile, error) { + gusPath := filepath.Join(s.ServerPath, "ShooterGame", "Saved", "Config", "WindowsServer", "GameUserSettings.ini") - SessionSettings SessionSettings `json:"sessionSettings" ini:"SessionSettings"` + gusContent, err := os.ReadFile(gusPath) + if err != nil { + return nil, errors.New("error reading GameUserSettings.ini: " + err.Error()) + } - MultiHome MultiHome `json:"multiHome" ini:"MultiHome" ini:"/MultiHome"` //TODO: Check if its "MultiHome" or "/MultiHome" https://ark.wiki.gg/wiki/Server_configuration#[MultiHome] - ScriptEngineGameSession ScriptEngineGameSession `json:"scriptEngineGameSession" ini:"/Script/Engine.GameSession"` + gus, err := ini.DeserializeIniFile(string(gusContent) /*insert allowed duplicate keys here*/) + if err != nil { + return nil, err + } - Ragnarok Ragnarok `json:"ragnarok" ini:"Ragnarok"` + s.updateGus(gus) - MessageOfTheDay MessageOfTheDay `json:"messageOfTheDay" ini:"MessageOfTheDay"` + return gus, nil } -func generateNewDefaultGameUserSettings() GameUserSettings { - return GameUserSettings{ - ServerSettings: ServerSettings{ - ActiveMods: "", - AdminLogging: false, - AllowAnyoneBabyImprintCuddle: false, - AllowCaveBuildingPvE: false, - AllowCaveBuildingPvP: false, - AllowCrateSpawnsOnTopOfStructures: false, - AllowFlyerCarryPvE: false, - AllowFlyingStaminaRecovery: false, - AllowHideDamageSourceFromLogs: true, - AllowHitMarkers: true, - AllowIntegratedSPlusStructures: true, - AllowMultipleAttachedC4: false, - AllowRaidDinoFeeding: false, - AllowSharedConnections: false, - AllowTekSuitPowersInGenesis: false, - AllowThirdPersonPlayer: true, - AlwaysAllowStructurePickup: false, - AlwaysNotifyPlayerLeft: false, - AutoDestroyDecayedDinos: false, - AutoDestroyOldStructuresMultiplier: 0.0, - AutoSavePeriodMinutes: 15.0, - BanListURL: "http://arkdedicated.com/banlist.txt", - ClampItemSpoilingTimes: false, - ClampItemStats: false, - ClampResourceHarvestDamage: false, - DayCycleSpeedScale: 1.0, - DayTimeSpeedScale: 1.0, - DifficultyOffset: 1.0, - DinoCharacterFoodDrainMultiplier: 1.0, - DinoCharacterHealthRecoveryMultiplier: 1.0, - DinoCharacterStaminaDrainMultiplier: 1.0, - DinoCountMultiplier: 1.0, - DinoDamageMultiplier: 1.0, - DinoResistanceMultiplier: 1.0, - DisableDinoDecayPvE: false, - DisableImprintDinoBuff: false, - DisablePvEGamma: false, - DisableStructureDecayPvE: false, - DisableWeatherFog: false, - DontAlwaysNotifyPlayerJoined: false, - EnableExtraStructurePreventionVolumes: false, - EnablePvPGamma: false, - FastDecayUnsnappedCoreStructures: false, - ForceAllStructureLocking: false, - GlobalVoiceChat: false, - HarvestAmountMultiplier: 1.0, - HarvestHealthMultiplier: 1.0, - IgnoreLimitMaxStructuresInRangeTypeFlag: false, - ItemStackSizeMultiplier: 1.0, - KickIdlePlayersPeriod: 3600.0, - MaxGateFrameOnSaddles: 0, - MaxHexagonsPerCharacter: 2000000000, - MaxPersonalTamedDinos: 0, - MaxPlatformSaddleStructureLimit: 75, - MaxTamedDinos: 5000.0, - MaxTributeCharacters: 10, - MaxTributeDinos: 20, - MaxTributeItems: 50, - NightTimeSpeedScale: 1.0, - NonPermanentDiseases: false, - NPCNetworkStasisRangeScalePlayerCountStart: 0, - NPCNetworkStasisRangeScalePlayerCountEnd: 0, - NPCNetworkStasisRangeScalePercentEnd: 0.55000001, - OnlyAutoDestroyCoreStructures: false, - OnlyDecayUnsnappedCoreStructures: false, - OverrideOfficialDifficulty: 0.0, - OverrideStructurePlatformPrevention: false, - OxygenSwimSpeedStatMultiplier: 1.0, - PerPlatformMaxStructuresMultiplier: 1.0, - PersonalTamedDinosSaddleStructureCost: 0, - PlatformSaddleBuildAreaBoundsMultiplier: 1.0, - PlayerCharacterFoodDrainMultiplier: 1.0, - PlayerCharacterHealthRecoveryMultiplier: 1.0, - PlayerCharacterStaminaDrainMultiplier: 1.0, - PlayerCharacterWaterDrainMultiplier: 1.0, - PlayerDamageMultiplier: 1.0, - PlayerResistanceMultiplier: 1.0, - PreventDiseases: false, - PreventMateBoost: false, - PreventOfflinePvP: false, - PreventOfflinePvPInterval: 0.0, - PreventSpawnAnimations: false, - PreventTribeAlliances: false, - ProximityChat: false, - PvEAllowStructuresAtSupplyDrops: false, - PvEDinoDecayPeriodMultiplier: 1.0, - PvEStructureDecayPeriodMultiplier: 1.0, - PvPDinoDecay: false, - PvPStructureDecay: false, - RaidDinoCharacterFoodDrainMultiplier: 1.0, - RandomSupplyCratePoints: false, - RCONEnabled: true, - RCONPort: 27015, //TODO set value correct on server save - RCONServerGameLogBuffer: 600.0, - ResourcesRespawnPeriodMultiplier: 1.0, - ServerAdminPassword: "bob", //TODO set value correct on server save - ServerAutoForceRespawnWildDinosInterval: 0.0, - ServerCrosshair: true, - ServerForceNoHUD: false, - ServerHardcore: false, - //ServerPassword: "", //Make sure this is set correctly - ServerPVE: false, - ShowFloatingDamageText: false, - ShowMapPlayerLocation: true, - StructureDamageMultiplier: 1.0, - StructurePickupHoldDuration: 0.5, - StructurePickupTimeAfterPlacement: 30.0, - StructurePreventResourceRadiusMultiplier: 1.0, - StructureResistanceMultiplier: 1.0, - TamedDinoDamageMultiplier: 1.0, - TamedDinoResistanceMultiplier: 1.0, - TamingSpeedMultiplier: 1.0, - TheMaxStructuresInRange: 10500, - TribeLogDestroyedEnemyStructures: false, - TribeNameChangeCooldown: 15.0, - UseFjordurTraversalBuff: false, - UseOptimizedHarvestingHealth: false, - XPMultiplier: 1.0, - - CrossARKAllowForeignDinoDownloads: false, - MinimumDinoReuploadInterval: 0.0, - NoTributeDownloads: false, - PreventDownloadDinos: false, - PreventDownloadItems: false, - PreventDownloadSurvivors: false, - PreventUploadDinos: false, - PreventUploadItems: false, - PreventUploadSurvivors: false, - TributeCharacterExpirationSeconds: 0, - TributeDinoExpirationSeconds: 86400, - TributeItemExpirationSeconds: 86400, - BadWordListURL: "http://arkdedicated.com/badwords.txt", - BadWordWhiteListURL: "http://arkdedicated.com/goodwords.txt", - BFilterCharacterNames: false, - BFilterChat: false, - BFilterTribeNames: false, - ChatLogFileSplitIntervalSeconds: 86400, - ChatLogFlushIntervalSeconds: 86400, - ChatLogMaxAgeInDays: 5, - DontRestoreBackup: false, - EnableAFKKickPlayerCountPercent: 0.0, - EnableMeshBitingProtection: true, - FreezeReaperPregnancy: false, - LogChatMessages: false, - MaxStructuresInSmallRadius: 0, - MaxStructuresToProcess: 0, - PreventOutOfTribePinCodeUse: false, - RadiusStructuresInSmallRadius: 0.0, - ServerEnableMeshChecking: true, - TribeMergeAllowed: true, - TribeMergeCooldown: 0.0, - UpdateAllowedCheatersInterval: 600.0, - UseExclusiveList: false, - }, - - SessionSettings: SessionSettings{ - MultiHome: "0.0.0.0", //TODO set value correct on server save - Port: 7777, //TODO set value correct on server save - QueryPort: 28015, //TODO set value correct on server save - SessionName: "Ark Ascended server managed by AASM", - }, - - MultiHome: MultiHome{ - MultiHome: true, //TODO set value correct on server save - }, +// saveGus saves the GameUserSettings.ini file to disk +func (s *Server) saveGus(gus *ini.IniFile) error { + gusPath := filepath.Join(s.ServerPath, "ShooterGame", "Saved", "Config", "WindowsServer", "GameUserSettings.ini") - ScriptEngineGameSession: ScriptEngineGameSession{ - MaxPlayers: 70, //TODO set value correct on server save - }, + s.updateGus(gus) - Ragnarok: Ragnarok{ - AllowMultipleTamedUnicorns: false, - EnableVolcano: true, - UnicornSpawnInterval: 24, - VolcanoIntensity: 1, - VolcanoInterval: 0, - }, - - MessageOfTheDay: MessageOfTheDay{ - Duration: 20, - Message: "", - }, + err := os.WriteFile(gusPath, []byte(gus.ToString()), 0644) + if err != nil { + return err } + return nil } -// SaveGameUserSettingsIni saves the game user settings to the ini file in the server directory -func (s *Server) SaveGameUserSettingsIni(filePathToLoadFrom string, overrideUseIniConfig bool) error { - - ini.PrettyFormat = false +// updateGus updates the GameUserSettings.ini file with the settings from the server struct (settings that should be manually set) +func (s *Server) updateGus(gus *ini.IniFile) { + { + serverSettings := gus.GetOrCreateSection("ServerSettings") - filePath := filepath.Join(s.ServerPath, "ShooterGame", "Saved", "Config", "WindowsServer", "GameUserSettings.ini") - - err := ensureFilePath(filePath) - if err != nil { - return err + serverSettings.AddOrReplaceKey("RCONEnabled", true) + serverSettings.AddOrReplaceKey("RCONPort", s.RCONPort) + serverSettings.AddOrReplaceKey("ServerAdminPassword", s.AdminPassword) + serverSettings.AddOrReplaceKey("ActiveMods", s.Mods) } - gusIni, err := ini.LoadSources(iniOpts, filePathToLoadFrom) - if err != nil { - return err - } + { + sessionSettings := gus.GetOrCreateSection("SessionSettings") - if s.UseIniConfig || overrideUseIniConfig { - err = gusIni.MapTo(&s.GameUserSettings) - if err != nil { - return err - } + sessionSettings.AddOrReplaceKey("MultiHome", true) + sessionSettings.AddOrReplaceKey("Port", s.ServerPort) + sessionSettings.AddOrReplaceKey("QueryPort", s.QueryPort) + sessionSettings.AddOrReplaceKey("SessionName", s.ServerName) } - s.GameUserSettings.ServerSettings.RCONEnabled = true - s.GameUserSettings.ServerSettings.RCONPort = s.RCONPort - s.GameUserSettings.ServerSettings.ServerAdminPassword = s.AdminPassword - - s.GameUserSettings.SessionSettings.MultiHome = s.IpAddress - s.GameUserSettings.SessionSettings.Port = s.ServerPort - s.GameUserSettings.SessionSettings.QueryPort = s.QueryPort - s.GameUserSettings.SessionSettings.SessionName = s.ServerName - s.GameUserSettings.MultiHome.MultiHome = true - s.GameUserSettings.ScriptEngineGameSession.MaxPlayers = s.MaxPlayers - - s.GameUserSettings.ServerSettings.ActiveMods = s.Mods + { + multiHome := gus.GetOrCreateSection("MultiHome") + multiHome.AddOrReplaceKey("MultiHome", true) + } - // Append Additional Settings before reflect because gusIni.Append() reloads the original file without the changes - // gusIni.Append([]byte(s.AdditionalGUSSections)) + { + scriptEngineGameSession := gus.GetOrCreateSection("/Script/Engine.GameSession") - err = gusIni.ReflectFrom(&s.GameUserSettings) - if err != nil { - return err + scriptEngineGameSession.AddOrReplaceKey("MaxPlayers", s.MaxPlayers) } - // INI values for these wouldn't change - gusIni.Section("ServerSettings").Key("ServerPassword").SetValue(s.ServerPassword) - gusIni.Section("ServerSettings").Key("SpectatorPassword").SetValue(s.SpectatorPassword) +} - err = gusIni.SaveTo(filePath) +func (s *Server) updateValueInGus(sectionName string, keyName string, value interface{}) error { + gus, err := s.getGus() if err != nil { return err } - if s.AdditionalGUSSections != "" { - addGUSIni, err := ini.LoadSources(ini.LoadOptions{ - // This setting allowed duplicate values in the INI files. With the Changes values should now be replaced - AllowShadows: true, - AllowDuplicateShadowValues: true, - PreserveSurroundedQuote: true, - }, filePath, []byte(s.AdditionalGUSSections)) - if err != nil { - return err - } - err = addGUSIni.SaveTo(filePath) - if err != nil { - return err - } - } + gus.SafelyAddKeyToSection(sectionName, keyName, value) - /*err = replaceForwardSlashInFile(filepath.Join(s.ServerPath, "ShooterGame\\Saved\\Config\\WindowsServer\\GameUserSettings.ini")) + err = s.saveGus(gus) if err != nil { return err - }*/ - - runtime.EventsEmit(s.ctx, "reloadServers") + } return nil } diff --git a/server/helpers.go b/server/helpers.go index 04ef4f9..32d8458 100644 --- a/server/helpers.go +++ b/server/helpers.go @@ -103,9 +103,6 @@ func generateNewDefaultServer(id int) Server { QueryPort: 27015, RCONPort: 28015, - GameUserSettings: generateNewDefaultGameUserSettings(), - Game: generateNewDefaultGame(), - ServerMap: "TheIsland_WP", MaxPlayers: 70, diff --git a/server/server.go b/server/server.go index ba1f8ce..cc6faaa 100644 --- a/server/server.go +++ b/server/server.go @@ -2,7 +2,12 @@ package server import ( "context" + "errors" "fmt" + "github.com/JensvandeWiel/ArkAscendedServerManager/helpers" + "github.com/JensvandeWiel/ark-ini" + "github.com/wailsapp/wails/v2/pkg/runtime" + "os" "os/exec" "path" "path/filepath" @@ -10,9 +15,6 @@ import ( "strings" "syscall" "time" - - "github.com/JensvandeWiel/ArkAscendedServerManager/helpers" - "github.com/wailsapp/wails/v2/pkg/runtime" ) // Server contains the server "stuff" @@ -64,14 +66,8 @@ type Server struct { RCONPort int `json:"rconPort"` //Server configuration - - //INI - GameUserSettings GameUserSettings `json:"gameUserSettings"` - Game Game `json:"game"` - AdditionalGUSSections string `json:"additionalGUSSections"` - AdditionalGameSections string `json:"additionalGameSections"` - RefGUSPath string `json:"refGUSPath"` - RefGamePath string `json:"refGamePath"` + /*gus *ini.IniFile `json:"-"` + game *ini.IniFile `json:"-"`*/ ServerMap string `json:"serverMap"` MaxPlayers int `json:"maxPlayers"` @@ -82,25 +78,33 @@ type Server struct { // UpdateConfig updates the configuration files for the server e.g.: GameUserSettings.ini func (s *Server) UpdateConfig() error { - err := CopyAndMakeOld(filepath.Join(s.ServerPath, "ShooterGame", "Saved", "Config", "WindowsServer", "Game.ini")) + gamePath := filepath.Join(s.ServerPath, "ShooterGame", "Saved", "Config", "WindowsServer", "Game.ini") + gusPath := filepath.Join(s.ServerPath, "ShooterGame", "Saved", "Config", "WindowsServer", "GameUserSettings.ini") + + err := CopyAndMakeOld(gusPath) if err != nil { return err } - err = CopyAndMakeOld(filepath.Join(s.ServerPath, "ShooterGame", "Saved", "Config", "WindowsServer", "GameUserSettings.ini")) + err = CopyAndMakeOld(gamePath) if err != nil { return err } - err = s.SaveGameIni(filepath.Join(s.ServerPath, "ShooterGame\\Saved\\Config\\WindowsServer\\Game.ini"), false) + //load gus and game ini + + gameContent, err := os.ReadFile(gamePath) if err != nil { - return err + return errors.New("error reading Game.ini: " + err.Error()) } - err = s.SaveGameUserSettingsIni(filepath.Join(s.ServerPath, "ShooterGame\\Saved\\Config\\WindowsServer\\GameUserSettings.ini"), false) + game, err := ini.DeserializeIniFile(string(gameContent)) if err != nil { return err } + println("GameUserSettings.ini: ", gus.ToString()) + println("Game.ini: ", game.ToString()) + return nil } diff --git a/server/server_controller.go b/server/server_controller.go index ce7b389..fe610b4 100644 --- a/server/server_controller.go +++ b/server/server_controller.go @@ -17,7 +17,6 @@ import ( "fmt" "os" "path" - "path/filepath" "strconv" "github.com/JensvandeWiel/ArkAscendedServerManager/helpers" @@ -85,62 +84,6 @@ func (c *ServerController) StartServersWithApplication() { //region Frontend functions -// TODO: Really need to add every single setting with accurate naming -// Could also do with importing Game.ini, this is something I can do in a future PR -func (c *ServerController) ImportSettingsFromFile(serverId int, gusFilePath string, gameFilePath string) error { - server, err := c.GetServer(serverId) - if err != nil { - return err - } - - err = ensureFilePath(gusFilePath) - if err != nil { - newErr := fmt.Errorf("Failed to parse GameUserSettings.ini: " + err.Error()) - return newErr - } - - err = ensureFilePath(gameFilePath) - if err != nil { - newErr := fmt.Errorf("Failed to parse Game.ini: " + err.Error()) - return newErr - } - - err = server.SaveGameUserSettingsIni(gusFilePath, true) - if err != nil { - return err - } - - err = server.SaveGameIni(gameFilePath, true) - if err != nil { - return err - } - - server.UseIniConfig = false // once imported, don't have to use the ini config anymore - - c.SaveServer(server) - - return nil -} - -func (c *ServerController) SaveGUSAndGame(serverId int) error { - server, err := c.GetServer(serverId) - if err != nil { - return err - } - - err = server.SaveGameUserSettingsIni(filepath.Join(server.ServerPath, "ShooterGame\\Saved\\Config\\WindowsServer\\GameUserSettings.ini"), false) - if err != nil { - return err - } - - err = server.SaveGameIni(filepath.Join(server.ServerPath, "ShooterGame\\Saved\\Config\\WindowsServer\\Game.ini"), false) - if err != nil { - return err - } - - return nil -} - // GetAllServers gets all servers and saves them to ServerController.Servers and also returns them, if it fails it returns nil and error. If they already exist in the map it will just get that. func (c *ServerController) GetAllServers() (map[int]Server, error) { @@ -337,7 +280,7 @@ func (c *ServerController) getServerFromDir(id int, shouldReturnNew bool) (Serve //endregion -// SaveServer saves the server with the given id, and returns bool if successful +/*// SaveServer saves the server with the given id, and returns bool if successful func (c *ServerController) SaveServerGus(id int, gus GameUserSettings) error { //TODO Make sure oldserv members get passed over to new instance since frontend will change all members even Command (which should not be updated by the frontend) @@ -359,7 +302,7 @@ func (c *ServerController) SaveServerGus(id int, gus GameUserSettings) error { return newErr } return nil -} +}*/ //endregion From c575182ac788a6678483933c994747e5767c473c Mon Sep 17 00:00:00 2001 From: Jens van de Wiel Date: Sat, 23 Dec 2023 18:57:23 +0100 Subject: [PATCH 02/11] update --- go.mod | 5 +- go.sum | 10 ++-- main.go | 3 + server/game.go | 110 ++++++++++++++++++++++++++++++++++++ server/gus.go | 20 +++++++ server/helpers.go | 4 +- server/server.go | 21 +++---- server/server_controller.go | 53 ++++++++++++++++- 8 files changed, 206 insertions(+), 20 deletions(-) create mode 100644 server/game.go diff --git a/go.mod b/go.mod index 1f973ad..0f63dcf 100644 --- a/go.mod +++ b/go.mod @@ -5,9 +5,10 @@ go 1.21 toolchain go1.21.5 require ( - github.com/JensvandeWiel/ark-ini v1.0.0 + github.com/JensvandeWiel/ark-ini v1.1.0 github.com/StackExchange/wmi v1.2.1 github.com/adrg/xdg v0.4.0 + github.com/fsnotify/fsnotify v1.7.0 github.com/go-ini/ini v1.67.0 github.com/gorcon/rcon v1.3.4 github.com/hashicorp/go-version v1.6.0 @@ -16,7 +17,7 @@ require ( github.com/sethvargo/go-password v0.2.0 github.com/sqweek/dialog v0.0.0-20220809060634-e981b270ebbf github.com/wailsapp/wails/v2 v2.6.0 - golang.org/x/sys v0.14.0 + golang.org/x/sys v0.15.0 ) require ( diff --git a/go.sum b/go.sum index 893806a..797525c 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/JensvandeWiel/ark-ini v1.0.0 h1:i6R3v03uAYOmbD03aAq7Jbe7JAKjT9XsGyJS9HfL4fk= -github.com/JensvandeWiel/ark-ini v1.0.0/go.mod h1:mM7be1osQGncsZFWSJvucs36J1kmxp6E4vYyW0vTkuk= +github.com/JensvandeWiel/ark-ini v1.1.0 h1:GA70qiWndeibx/JAgSK7bvrBK4ahk1hM/2QLKq36Kgo= +github.com/JensvandeWiel/ark-ini v1.1.0/go.mod h1:mM7be1osQGncsZFWSJvucs36J1kmxp6E4vYyW0vTkuk= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/TheTitanrain/w32 v0.0.0-20180517000239-4f5cfb03fabf h1:FPsprx82rdrX2jiKyS17BH6IrTmUBYqZa/CXT4uvb+I= @@ -13,6 +13,8 @@ github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3IS github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= @@ -104,8 +106,8 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= diff --git a/main.go b/main.go index 74b2bbe..447bfb6 100644 --- a/main.go +++ b/main.go @@ -64,6 +64,9 @@ func main() { s.Startup(ctx) i.Startup(ctx) }, + OnShutdown: func(ctx context.Context) { + s.Shutdown() + }, Logger: l, LogLevel: wailsLogger.TRACE, Bind: []interface{}{ diff --git a/server/game.go b/server/game.go new file mode 100644 index 0000000..11da22a --- /dev/null +++ b/server/game.go @@ -0,0 +1,110 @@ +package server + +import ( + "errors" + ini "github.com/JensvandeWiel/ark-ini" + "os" + "path/filepath" +) + +// getGame returns the Game.ini file as an ini.IniFile struct +func (s *Server) getGame() (*ini.IniFile, error) { + gamePath := filepath.Join(s.ServerPath, "ShooterGame", "Saved", "Config", "WindowsServer", "Game.ini") + + gameContent, err := os.ReadFile(gamePath) + if err != nil { + return nil, errors.New("error reading Game.ini: " + err.Error()) + } + + game, err := ini.DeserializeIniFile(string(gameContent) /*insert allowed duplicate keys here*/) + if err != nil { + return nil, err + } + + //s.updateGame(game) + + return game, nil +} + +// saveGame saves the GameUserSettings.ini file to disk +func (s *Server) saveGame(game *ini.IniFile) error { + gamePath := filepath.Join(s.ServerPath, "ShooterGame", "Saved", "Config", "WindowsServer", "Game.ini") + + //s.updateGame(game) + + err := os.WriteFile(gamePath, []byte(game.ToString()), 0644) + if err != nil { + return err + } + + return nil +} + +/*// updateGame updates the GameUserSettings.ini file with the settings from the server struct (settings that should be manually set) +func (s *Server) updateGame(game *ini.IniFile) { + { + serverSettings := game.GetOrCreateSection("ServerSettings") + + serverSettings.AddOrReplaceKey("RCONEnabled", true) + serverSettings.AddOrReplaceKey("RCONPort", s.RCONPort) + serverSettings.AddOrReplaceKey("ServerAdminPassword", s.AdminPassword) + serverSettings.AddOrReplaceKey("ActiveMods", s.Mods) + } + + { + sessionSettings := game.GetOrCreateSection("SessionSettings") + + sessionSettings.AddOrReplaceKey("MultiHome", true) + sessionSettings.AddOrReplaceKey("Port", s.ServerPort) + sessionSettings.AddOrReplaceKey("QueryPort", s.QueryPort) + sessionSettings.AddOrReplaceKey("SessionName", s.ServerName) + } + + { + multiHome := game.GetOrCreateSection("MultiHome") + multiHome.AddOrReplaceKey("MultiHome", true) + } + + { + scriptEngineGameSession := game.GetOrCreateSection("/Script/Engine.GameSession") + + scriptEngineGameSession.AddOrReplaceKey("MaxPlayers", s.MaxPlayers) + } + +}*/ + +func (s *Server) updateValueInGame(sectionName string, keyName string, value interface{}) error { + game, err := s.getGame() + if err != nil { + return err + } + + game.SafelyAddKeyToSection(sectionName, keyName, value) + + err = s.saveGame(game) + if err != nil { + return err + } + + return nil +} + +func (s *Server) getGameAsMap() (map[string]map[string]string, error) { + game, err := s.getGame() + if err != nil { + return nil, err + } + + return ini.ToMap(game), nil +} + +func (s *Server) saveGameFromMap(gameMap map[string]map[string]string) error { + game := ini.DeserializeFromMap(gameMap) + + err := s.saveGame(game) + if err != nil { + return err + } + + return nil +} diff --git a/server/gus.go b/server/gus.go index f05ce9f..a5358e1 100644 --- a/server/gus.go +++ b/server/gus.go @@ -88,3 +88,23 @@ func (s *Server) updateValueInGus(sectionName string, keyName string, value inte return nil } + +func (s *Server) getGusAsMap() (map[string]map[string]string, error) { + gus, err := s.getGus() + if err != nil { + return nil, err + } + + return ini.ToMap(gus), nil +} + +func (s *Server) saveGusFromMap(gusMap map[string]map[string]string) error { + gus := ini.DeserializeFromMap(gusMap) + + err := s.saveGus(gus) + if err != nil { + return err + } + + return nil +} diff --git a/server/helpers.go b/server/helpers.go index 32d8458..3b033ae 100644 --- a/server/helpers.go +++ b/server/helpers.go @@ -78,7 +78,7 @@ func generateNewDefaultServer(id int) Server { spectatorPassword = "default" }*/ - return Server{ + serv := Server{ Id: id, DisableUpdateOnStart: false, @@ -108,6 +108,8 @@ func generateNewDefaultServer(id int) Server { StartWithApplication: false, } + + return serv } func CheckIfServerCorrect(server *Server) error { diff --git a/server/server.go b/server/server.go index cc6faaa..639fc7c 100644 --- a/server/server.go +++ b/server/server.go @@ -2,12 +2,9 @@ package server import ( "context" - "errors" "fmt" "github.com/JensvandeWiel/ArkAscendedServerManager/helpers" - "github.com/JensvandeWiel/ark-ini" "github.com/wailsapp/wails/v2/pkg/runtime" - "os" "os/exec" "path" "path/filepath" @@ -75,6 +72,12 @@ type Server struct { StartWithApplication bool `json:"startWithApplication"` } +// Init runs the code that needs to be run when the server is created/loaded like watching the config files +func (s *Server) Init() { + //watch the config files for changes if they change emit an event + +} + // UpdateConfig updates the configuration files for the server e.g.: GameUserSettings.ini func (s *Server) UpdateConfig() error { @@ -92,18 +95,12 @@ func (s *Server) UpdateConfig() error { //load gus and game ini - gameContent, err := os.ReadFile(gamePath) - if err != nil { - return errors.New("error reading Game.ini: " + err.Error()) - } - - game, err := ini.DeserializeIniFile(string(gameContent)) + //get and update gus before starting server + gus, err := s.getGus() if err != nil { return err } - - println("GameUserSettings.ini: ", gus.ToString()) - println("Game.ini: ", game.ToString()) + s.updateGus(gus) return nil } diff --git a/server/server_controller.go b/server/server_controller.go index fe610b4..48e08e6 100644 --- a/server/server_controller.go +++ b/server/server_controller.go @@ -15,8 +15,10 @@ import ( "context" "encoding/json" "fmt" + "github.com/fsnotify/fsnotify" "os" "path" + "path/filepath" "strconv" "github.com/JensvandeWiel/ArkAscendedServerManager/helpers" @@ -33,6 +35,7 @@ type ServerController struct { ctx context.Context Servers map[int]*Server helpers *helpers.HelpersController + watcher *fsnotify.Watcher serverDir string } @@ -56,8 +59,17 @@ func (c *ServerController) Startup(ctx context.Context) { } c.serverDir = serverDir + c.watcher, err = fsnotify.NewWatcher() + if err != nil { + runtime.LogFatalf(c.ctx, "Error creating fsnotify watcher: %s, app will be in an unuseable state", err.Error()) + } c.StartServersWithApplication() + c.InitAllServers() +} + +func (c *ServerController) Shutdown() { + c.watcher.Close() } // endregion @@ -75,7 +87,43 @@ func (c *ServerController) StartServersWithApplication() { server := c.Servers[id] runtime.LogInfof(c.ctx, "Starting server %s automatically", server.ServerName) if server.StartWithApplication { - c.StartServer(server.Id) + err := c.StartServer(server.Id) + if err != nil { + runtime.LogError(c.ctx, "Error starting server "+strconv.Itoa(server.Id)+" automatically: "+err.Error()) + } + } + } +} + +func (c *ServerController) InitAllServers() { + + //setup watcher + go func() { + for { + select { + case event, ok := <-c.watcher.Events: + if !ok { + return + } + runtime.LogDebug(c.ctx, "watcher event: "+event.String()) + if event.Has(fsnotify.Write) { + runtime.EventsEmit(c.ctx, "fileChanged", event.Name) + } + case err, ok := <-c.watcher.Errors: + if !ok { + return + } + runtime.LogError(c.ctx, "error:"+err.Error()) + } + } + }() + + //for each server in the map add a watcher for the config file + for id := range c.Servers { + server := c.Servers[id] + err := c.watcher.Add(filepath.Join(server.ServerPath, "ShooterGame", "Saved", "Config", "WindowsServer")) + if err != nil { + runtime.LogErrorf(c.ctx, "Error adding watcher for server %s: %s", server.ServerName, err.Error()) } } } @@ -148,6 +196,7 @@ func (c *ServerController) GetConnectedPlayerCount(id int) (int, error) { // CreateServer Creates a new server, returns it and adds it to the map. If it fails it returns an error which is catch-able in the Frontend. func (c *ServerController) CreateServer(saveToConfig bool) (Server, error) { + _, server, err := c.createServer(saveToConfig) if err != nil { newErr := fmt.Errorf("Failed saving new server: " + err.Error()) @@ -334,6 +383,7 @@ func (c *ServerController) getServer(id int, addToMap bool) (*Server, error) { // createServer Creates a new server, returns it and adds it to the map, it also returns the key. If it fails it returns an error and an empty server and int -1 func (c *ServerController) createServer(saveToConfig bool) (int, *Server, error) { + //TODO only spot where we load from the config file, we need to implement the ini file watching here // get the highest in to generate new id maxKey := findHighestKey(c.Servers) id := maxKey + 1 @@ -359,6 +409,7 @@ func (c *ServerController) createServer(saveToConfig bool) (int, *Server, error) runtime.EventsEmit(c.ctx, "serverCreated", NewServer.Id) NewServer.ctx = c.ctx + NewServer.Init() return id, &NewServer, nil } From fc9e9fd904a0cfbeaef938c07e0fc5606875334d Mon Sep 17 00:00:00 2001 From: Jens van de Wiel Date: Mon, 25 Dec 2023 16:30:38 +0100 Subject: [PATCH 03/11] added stuff --- frontend/src/pages/InstallUpdater.tsx | 2 +- frontend/src/pages/server/General.tsx | 67 ++++++++-------- frontend/src/pages/server/Mods.tsx | 2 +- server/game.go | 14 ++++ server/gus.go | 14 ++++ server/server_controller.go | 110 ++++++++++++++++++++++++++ 6 files changed, 174 insertions(+), 35 deletions(-) diff --git a/frontend/src/pages/InstallUpdater.tsx b/frontend/src/pages/InstallUpdater.tsx index 32edd25..79cb421 100644 --- a/frontend/src/pages/InstallUpdater.tsx +++ b/frontend/src/pages/InstallUpdater.tsx @@ -32,7 +32,7 @@ export function InstallUpdater({setServ, serv, onInstalled}: Props) { const [installerModalOpen, setInstallerModalOpen] = useState(false) const {addAlert} = useAlert() function onServerPathClicked() { - OpenDirectoryDialog().then((val) => setServ((p) => ({ ...p, serverPath: val, convertValues: p.convertValues }))) + OpenDirectoryDialog().then((val) => setServ((p) => ({ ...p, serverPath: val}))) } function onStartInstallButtonClicked() { diff --git a/frontend/src/pages/server/General.tsx b/frontend/src/pages/server/General.tsx index 2f7f7b2..3755c20 100644 --- a/frontend/src/pages/server/General.tsx +++ b/frontend/src/pages/server/General.tsx @@ -11,9 +11,10 @@ import { import {server} from "../../../wailsjs/go/models"; import React, {useEffect, useState} from "react"; -import {GetNetworkInterfacesIp} from "../../../wailsjs/go/server/ServerController"; +import {GetNetworkInterfacesIp, GetValueFromGus, UpdateValueInGus} from "../../../wailsjs/go/server/ServerController"; import {PasswordInput} from "../../components/PasswordInput"; import {Slider} from "../../components/Slider"; +import {useAlert} from "../../components/AlertProvider"; type Props = { setServ: React.Dispatch> @@ -22,6 +23,21 @@ type Props = { } function GeneralSettings({ setServ, serv }: {setServ: React.Dispatch>, serv: server.Server}) { + + + const {addAlert} = useAlert() + + const [autoSavePeriodMinutes, setAutoSavePeriodMinutes] = useState() + const [message, setMessage] = useState() + const [duration, setDuration] = useState() + const [kickIdlePlayersPeriod, setKickIdlePlayersPeriod] = useState() + useEffect(() => { + GetValueFromGus(serv.id, "ServerSettings", "AutoSavePeriodMinutes").then((val) => setAutoSavePeriodMinutes(parseInt(val))).catch((reason) => {console.error(reason); addAlert(reason, "danger")}) + GetValueFromGus(serv.id, "MessageOfTheDay", "Message").then((val) => setMessage(val)).catch((reason) => {console.error(reason); addAlert(reason, "danger")}) + GetValueFromGus(serv.id, "MessageOfTheDay", "Duration").then((val) => setDuration(parseInt(val))).catch((reason) => {console.error(reason); addAlert(reason, "danger")}) + GetValueFromGus(serv.id, "ServerSettings", "KickIdlePlayersPeriod").then((val) => setKickIdlePlayersPeriod(parseInt(val))).catch((reason) => {console.error(reason); addAlert(reason, "danger")}) + }, []); + return ( @@ -65,15 +81,10 @@ function GeneralSettings({ setServ, serv }: {setServ: React.DispatchAuto Save interval: { - if (v >= 0) { - setServ((p) => { - const newState = {...p, convertValues: p.convertValues}; - newState.gameUserSettings.serverSettings.autoSavePeriodMinutes = v; - return newState; - }) - } + setAutoSavePeriodMinutes(v) + UpdateValueInGus(serv.id, "ServerSettings", "AutoSavePeriodMinutes", v.toString()).catch((reason) => {console.error(reason); addAlert(reason, "danger")}) }} /> @@ -87,12 +98,9 @@ function GeneralSettings({ setServ, serv }: {setServ: React.Dispatch
Message -
@@ -101,14 +109,11 @@ function GeneralSettings({ setServ, serv }: {setServ: React.Dispatch { if (v >= 0) { - setServ((p) => { - const newState = {...p, convertValues: p.convertValues}; - newState.gameUserSettings.messageOfTheDay.duration = v; - return newState; - }) + setDuration(v) + UpdateValueInGus(serv.id, "MessageOfTheDay", "Duration", v.toString()).catch((reason) => {console.error(reason); addAlert(reason, "danger")}) } }} /> @@ -132,7 +137,7 @@ function GeneralSettings({ setServ, serv }: {setServ: React.Dispatch { if (v >= 0) { setServ((p) => { - const newState = {...p, convertValues: p.convertValues}; + const newState = {...p}; newState.maxPlayers = v; return newState; }) @@ -142,21 +147,18 @@ function GeneralSettings({ setServ, serv }: {setServ: React.Dispatch
- setServ((p) => ({ ...p, kickIdlePlayers: e.target.checked, convertValues: p.convertValues }))}/> Kick Idle Players Period: + setServ((p) => ({ ...p, kickIdlePlayers: e.target.checked }))}/> Kick Idle Players Period: { if (v >= 0) { - setServ((p) => { - const newState = {...p, convertValues: p.convertValues}; - newState.gameUserSettings.serverSettings.kickIdlePlayersPeriod = v; - return newState; - }) + setKickIdlePlayersPeriod(v) + UpdateValueInGus(serv.id, "ServerSettings", "KickIdlePlayersPeriod", v.toString()).catch((reason) => {console.error(reason); addAlert(reason, "danger")}) } }} /> @@ -204,7 +206,6 @@ function NetworkingCard({ setServ, serv }: {setServ: React.Dispatch
Server Port: - (parseInt(e.target.value) >= 1 && parseInt(e.target.value) <= 65535) ? setServ((p) => ({ ...p, serverPort: parseInt(e.target.value), peerPort: parseInt(e.target.value) + 1, convertValues: p.convertValues })) : null} > + (parseInt(e.target.value) >= 1 && parseInt(e.target.value) <= 65535) ? setServ((p) => ({ ...p, serverPort: parseInt(e.target.value), peerPort: parseInt(e.target.value) + 1})) : null} >
Peer Port: @@ -225,11 +226,11 @@ function NetworkingCard({ setServ, serv }: {setServ: React.Dispatch
Query Port: - (parseInt(e.target.value) >= 1 && parseInt(e.target.value) <= 65535) ? setServ((p) => ({ ...p, queryPort: parseInt(e.target.value), convertValues: p.convertValues})) : null}> + (parseInt(e.target.value) >= 1 && parseInt(e.target.value) <= 65535) ? setServ((p) => ({ ...p, queryPort: parseInt(e.target.value)})) : null}>
RCON Port: - (parseInt(e.target.value) >= 1 && parseInt(e.target.value) <= 65535) ? setServ((p) => ({ ...p, rconPort: parseInt(e.target.value), convertValues: p.convertValues})) : null} type={'number'}> + (parseInt(e.target.value) >= 1 && parseInt(e.target.value) <= 65535) ? setServ((p) => ({ ...p, rconPort: parseInt(e.target.value)})) : null} type={'number'}>
diff --git a/frontend/src/pages/server/Mods.tsx b/frontend/src/pages/server/Mods.tsx index f50a491..2c5cef5 100644 --- a/frontend/src/pages/server/Mods.tsx +++ b/frontend/src/pages/server/Mods.tsx @@ -18,7 +18,7 @@ function GeneralServerSettingsCard({ setServ, serv }: {setServ: React.Dispatch
Mods (e.g.: modid1,modid2,modid3) - setServ((p) => ({ ...p, mods: e.target.value, convertValues: p.convertValues }))}> + setServ((p) => ({ ...p, mods: e.target.value }))}>
diff --git a/server/game.go b/server/game.go index 11da22a..285cbb9 100644 --- a/server/game.go +++ b/server/game.go @@ -108,3 +108,17 @@ func (s *Server) saveGameFromMap(gameMap map[string]map[string]string) error { return nil } + +func (s *Server) getValueFromGame(sectionName string, keyName string) (string, error) { + game, err := s.getGame() + if err != nil { + return "", err + } + + key, err := game.GetKeyFromSection(sectionName, keyName) + if err != nil { + return "", err + } + + return key.ToValueString(), nil +} diff --git a/server/gus.go b/server/gus.go index a5358e1..d5e862e 100644 --- a/server/gus.go +++ b/server/gus.go @@ -108,3 +108,17 @@ func (s *Server) saveGusFromMap(gusMap map[string]map[string]string) error { return nil } + +func (s *Server) getValueFromGus(sectionName string, keyName string) (string, error) { + gus, err := s.getGus() + if err != nil { + return "", err + } + + key, err := gus.GetKeyFromSection(sectionName, keyName) + if err != nil { + return "", err + } + + return key.ToValueString(), nil +} diff --git a/server/server_controller.go b/server/server_controller.go index 48e08e6..3327473 100644 --- a/server/server_controller.go +++ b/server/server_controller.go @@ -273,6 +273,116 @@ func (c *ServerController) SaveServerConfigFile(content string, id int) error { } +func (c *ServerController) UpdateValueInGus(id int, sectionName string, keyName string, value string) error { + server, err := c.getServer(id, false) + if err != nil { + newErr := fmt.Errorf("error updating value in gus " + strconv.Itoa(id) + ": server does not exist in map") + runtime.LogError(c.ctx, newErr.Error()) + return newErr + } + + err = server.updateValueInGus(sectionName, keyName, value) + if err != nil { + newErr := fmt.Errorf("error updating value in gus " + strconv.Itoa(id) + ": " + err.Error()) + runtime.LogError(c.ctx, newErr.Error()) + return newErr + } + + return nil +} + +func (c *ServerController) UpdateValueInGame(id int, sectionName string, keyName string, value string) error { + server, err := c.getServer(id, false) + if err != nil { + newErr := fmt.Errorf("error updating value in game " + strconv.Itoa(id) + ": server does not exist in map") + runtime.LogError(c.ctx, newErr.Error()) + return newErr + } + + err = server.updateValueInGame(sectionName, keyName, value) + if err != nil { + newErr := fmt.Errorf("error updating value in game " + strconv.Itoa(id) + ": " + err.Error()) + runtime.LogError(c.ctx, newErr.Error()) + return newErr + } + + return nil +} + +func (c *ServerController) GetGusAsMap(id int) (map[string]map[string]string, error) { + server, err := c.getServer(id, false) + if err != nil { + newErr := fmt.Errorf("error getting gus as map " + strconv.Itoa(id) + ": server does not exist in map") + runtime.LogError(c.ctx, newErr.Error()) + return nil, newErr + } + + gus, err := server.getGusAsMap() + if err != nil { + newErr := fmt.Errorf("error getting gus as map " + strconv.Itoa(id) + ": " + err.Error()) + runtime.LogError(c.ctx, newErr.Error()) + return nil, newErr + } + + return gus, nil +} + +func (c *ServerController) SaveGusFromMap(id int, gusMap map[string]map[string]string) error { + server, err := c.getServer(id, false) + if err != nil { + newErr := fmt.Errorf("error saving gus from map " + strconv.Itoa(id) + ": server does not exist in map") + runtime.LogError(c.ctx, newErr.Error()) + return newErr + } + + err = server.saveGusFromMap(gusMap) + if err != nil { + newErr := fmt.Errorf("error saving gus from map " + strconv.Itoa(id) + ": " + err.Error()) + runtime.LogError(c.ctx, newErr.Error()) + return newErr + } + + return nil +} + +// GetValueFromGus returns the value from the gus with the given section and key name. If it fails it returns an error which is catch-able +func (c *ServerController) GetValueFromGus(id int, sectionName string, keyName string) (string, error) { + server, err := c.getServer(id, false) + if err != nil { + newErr := fmt.Errorf("error getting value from gus " + strconv.Itoa(id) + ": server does not exist in map") + runtime.LogError(c.ctx, newErr.Error()) + return "", newErr + } + + value, err := server.getValueFromGus(sectionName, keyName) + if err != nil { + newErr := fmt.Errorf("error getting value from gus " + strconv.Itoa(id) + ": " + err.Error()) + runtime.LogError(c.ctx, newErr.Error()) + return "", newErr + } + + return value, nil +} + +// GetValueFromGame returns the value from the game with the given section and key name. If it fails it returns an error which is catch-able +func (c *ServerController) GetValueFromGame(id int, sectionName string, keyName string) (string, error) { + server, err := c.getServer(id, false) + if err != nil { + newErr := fmt.Errorf("error getting value from game " + strconv.Itoa(id) + ": server does not exist in map") + runtime.LogError(c.ctx, newErr.Error()) + return "", newErr + } + + value, err := server.getValueFromGame(sectionName, keyName) + if err != nil { + newErr := fmt.Errorf("error getting value from game " + strconv.Itoa(id) + ": " + err.Error()) + runtime.LogError(c.ctx, newErr.Error()) + return "", newErr + } + + return value, nil +} + //region Private // getServerFromDir gets the server from the server dir if it does not exist and shouldReturnNew is true it returns a new server. From 9a7043a71e6aa073c345834053c7471aa4884623 Mon Sep 17 00:00:00 2001 From: Jens van de Wiel Date: Mon, 25 Dec 2023 17:47:32 +0100 Subject: [PATCH 04/11] finished basic ini reimplementation --- frontend/src/pages/Server.tsx | 44 +++- frontend/src/pages/server/General.tsx | 294 ++++++++++++++------------ 2 files changed, 196 insertions(+), 142 deletions(-) diff --git a/frontend/src/pages/Server.tsx b/frontend/src/pages/Server.tsx index 371a78d..0fa3f04 100644 --- a/frontend/src/pages/Server.tsx +++ b/frontend/src/pages/Server.tsx @@ -18,15 +18,15 @@ import {useEffect, useState} from "react"; import {server} from "../../wailsjs/go/models"; import { CheckServerInstalled, - ForceStopServer, - GetServer, GetServerStatus, + ForceStopServer, GetGusAsMap, + GetServer, GetServerStatus, SaveGusFromMap, SaveServer, StartServer, StopServer } from "../../wailsjs/go/server/ServerController"; import {InstallUpdater} from "./InstallUpdater"; import {useAlert} from "../components/AlertProvider"; import {BrowserOpenURL, EventsOff, EventsOn} from "../../wailsjs/runtime"; -import {IconAlertCircleFilled, IconExternalLink} from "@tabler/icons-react"; +import {IconAlertCircleFilled, IconExternalLink, IconReload} from "@tabler/icons-react"; import {Console} from "./server/Console"; import {UpdaterModal} from "./UpdaterModal"; import {InstallUpdateVerify} from "../../wailsjs/go/installer/InstallerController"; @@ -47,6 +47,12 @@ export const Server = ({id, className}: Props) => { defaultServer.serverAlias = "" defaultServer.ipAddress = "0.0.0.0" + const placeholderGus = { + "unknown": { + unknown: "", // Default value for MaxPlayers + }, + } + const [serv, setServ] = useState(defaultServer) @@ -54,12 +60,35 @@ export const Server = ({id, className}: Props) => { const [serverStatus, setServerStatus] = useState(false) const [forceStopModalOpen, setForceStopModalOpen] = useState(false) const [startModalOpen, setStartModalOpen] = useState(false) + const [gus, setGus] = useState<{ [key: string]: { [key: string]: string; }; }>(placeholderGus) const [updaterModalOpen, setUpdaterModalOpen] = useState(false) const {addAlert} = useAlert() //region useEffect land :) + useEffect(() => { + if (serv.id >= 0) { + GetGusAsMap(serv.id).then((val) => setGus(val)).catch((reason) => console.error(reason)) + } + }, [serv]); + + /*useEffect(() => { + EventsOn("fileChanged", (data) => { + GetGusAsMap(serv.id).then((val) => {setGus(val); console.log(val)}).catch((reason) => console.error(reason)) + }) + }, []);*/ + + useEffect(() => { + //check if gus is placeholder + if (Object.keys(gus).length === 1 && Object.keys(gus)[0] === "unknown") { + return + } + + //update gus with new values + SaveGusFromMap(serv.id, gus).catch((reason) => console.error(reason)) + }, [gus]); + useEffect(() => { if (serv.id >= 0) { CheckServerInstalled(serv.id).then((val) => setIsInstalled(val)).catch((reason) => console.error(reason)) @@ -184,6 +213,9 @@ export const Server = ({id, className}: Props) => { BrowserOpenURL("file:///" + serv.serverPath)}> + + {GetGusAsMap(serv.id).then((val) => setGus(val)).catch((reason) => console.error(reason))}}> +
@@ -246,13 +278,13 @@ export const Server = ({id, className}: Props) => { Console General Settings Mods - Ini configuration + {/*Ini configuration*/} Administration - + - + {/**/} CheckServerInstalled(serv.id).then((val) => setIsInstalled(val)).catch((reason) => console.error(reason))}/>
) : ( setIsInstalled(true)}/>)} diff --git a/frontend/src/pages/server/General.tsx b/frontend/src/pages/server/General.tsx index 3755c20..0cbe4ef 100644 --- a/frontend/src/pages/server/General.tsx +++ b/frontend/src/pages/server/General.tsx @@ -11,163 +11,185 @@ import { import {server} from "../../../wailsjs/go/models"; import React, {useEffect, useState} from "react"; -import {GetNetworkInterfacesIp, GetValueFromGus, UpdateValueInGus} from "../../../wailsjs/go/server/ServerController"; +import { + GetGusAsMap, + GetNetworkInterfacesIp, + GetValueFromGus, SaveGusFromMap, + UpdateValueInGus +} from "../../../wailsjs/go/server/ServerController"; import {PasswordInput} from "../../components/PasswordInput"; import {Slider} from "../../components/Slider"; import {useAlert} from "../../components/AlertProvider"; +import {EventsOn} from "../../../wailsjs/runtime"; type Props = { setServ: React.Dispatch> serv: server.Server; + setGus: React.Dispatch> + gus: {[p: string]: {[p: string]: string}} } -function GeneralSettings({ setServ, serv }: {setServ: React.Dispatch>, serv: server.Server}) { +function GeneralSettings({ setServ, serv, setGus, gus }: Props) { const {addAlert} = useAlert() - const [autoSavePeriodMinutes, setAutoSavePeriodMinutes] = useState() - const [message, setMessage] = useState() - const [duration, setDuration] = useState() - const [kickIdlePlayersPeriod, setKickIdlePlayersPeriod] = useState() - useEffect(() => { - GetValueFromGus(serv.id, "ServerSettings", "AutoSavePeriodMinutes").then((val) => setAutoSavePeriodMinutes(parseInt(val))).catch((reason) => {console.error(reason); addAlert(reason, "danger")}) - GetValueFromGus(serv.id, "MessageOfTheDay", "Message").then((val) => setMessage(val)).catch((reason) => {console.error(reason); addAlert(reason, "danger")}) - GetValueFromGus(serv.id, "MessageOfTheDay", "Duration").then((val) => setDuration(parseInt(val))).catch((reason) => {console.error(reason); addAlert(reason, "danger")}) - GetValueFromGus(serv.id, "ServerSettings", "KickIdlePlayersPeriod").then((val) => setKickIdlePlayersPeriod(parseInt(val))).catch((reason) => {console.error(reason); addAlert(reason, "danger")}) - }, []); - - return ( - - - Server Name and Passwords - - -
-
- Server Name: - setServ((p) => ({ ...p, serverName: e.target.value }))} > -
-
- Server Password: - setServ((p) => ({ ...p, serverPassword: e.target.value }))} > -
-
- Admin Password: - setServ((p) => ({ ...p, adminPassword: e.target.value }))} > -
-
- Spectator Password: - setServ((p) => ({ ...p, spectatorPassword: e.target.value }))} > -
-
- - Server Map - - -
-
- Map Name of Mod Map path: - setServ((p) => ({ ...p, serverMap: v }))} > -
-
- - Auto Save - - -
-
- Auto Save interval: - - { - setAutoSavePeriodMinutes(v) - UpdateValueInGus(serv.id, "ServerSettings", "AutoSavePeriodMinutes", v.toString()).catch((reason) => {console.error(reason); addAlert(reason, "danger")}) - }} - /> - - -
-
- - Message of the Day - - -
-
- Message - + if (gus === undefined || Object.keys(gus).length === 1 && Object.keys(gus)[0] === "unknown") { + return ( + + + Loading... + + + + ) + } else { + return ( + + + Server Name and Passwords + + +
+
+ Server Name: + setServ((p) => ({ ...p, serverName: e.target.value }))} > +
+
+ Server Password: + setServ((p) => ({ ...p, serverPassword: e.target.value }))} > +
+
+ Admin Password: + setServ((p) => ({ ...p, adminPassword: e.target.value }))} > +
+
+ Spectator Password: + setServ((p) => ({ ...p, spectatorPassword: e.target.value }))} > +
-
- Duration: - - { - if (v >= 0) { - setDuration(v) - UpdateValueInGus(serv.id, "MessageOfTheDay", "Duration", v.toString()).catch((reason) => {console.error(reason); addAlert(reason, "danger")}) - } - }} - /> - - + + Server Map + + +
+
+ Map Name of Mod Map path: + setServ((p) => ({ ...p, serverMap: v }))} > +
-
- - Server Settings - - -
-
-
- Max Players: - { - if (v >= 0) { - setServ((p) => { + + Auto Save + + +
+
+ Auto Save interval: + + { + setGus((p) => { const newState = {...p}; - newState.maxPlayers = v; + newState["ServerSettings"].AutoSavePeriodMinutes = v.toString(); return newState; }) - } - }} - /> + }} + /> + + +
+
+ + Message of the Day + + +
+
+ Message +
-
- - setServ((p) => ({ ...p, kickIdlePlayers: e.target.checked }))}/> Kick Idle Players Period: +
+ Duration: + + { + if (v >= 0) { + setGus((p) => { + const newState = {...p}; + newState["MessageOfTheDay"].Duration = v.toString(); + return newState; + }) + } + }} + /> - { - if (v >= 0) { - setKickIdlePlayersPeriod(v) - UpdateValueInGus(serv.id, "ServerSettings", "KickIdlePlayersPeriod", v.toString()).catch((reason) => {console.error(reason); addAlert(reason, "danger")}) - } - }} - />
-
- - ) + + Server Settings + + +
+
+
+ Max Players: + { + if (v >= 0) { + setServ((p) => { + const newState = {...p}; + newState.maxPlayers = v; + return newState; + }) + } + }} + /> +
+
+ + setServ((p) => ({ ...p, kickIdlePlayers: e.target.checked }))}/> Kick Idle Players Period: + + { + if (v >= 0) { + setGus((p) => { + const newState = {...p}; + newState["ServerSettings"].KickIdlePlayersPeriod = v.toString(); + return newState; + }); + } + }} + /> + +
+
+
+ + ) + } + + } function NetworkingCard({ setServ, serv }: {setServ: React.Dispatch>, serv: server.Server}) { @@ -238,11 +260,11 @@ function NetworkingCard({ setServ, serv }: {setServ: React.Dispatch - - + + ); } \ No newline at end of file From 8105ac705b0136409ae873e2343ee42f9a74b6e3 Mon Sep 17 00:00:00 2001 From: Jens van de Wiel Date: Mon, 25 Dec 2023 17:49:24 +0100 Subject: [PATCH 05/11] cleaned up --- frontend/src/pages/Server.tsx | 4 ++-- frontend/src/pages/server/Administration.tsx | 4 ++-- frontend/src/pages/server/Ini.tsx | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/src/pages/Server.tsx b/frontend/src/pages/Server.tsx index 0fa3f04..02fe58d 100644 --- a/frontend/src/pages/Server.tsx +++ b/frontend/src/pages/Server.tsx @@ -278,13 +278,13 @@ export const Server = ({id, className}: Props) => { Console General Settings Mods - {/*Ini configuration*/} + Ini configuration Administration - {/**/} + CheckServerInstalled(serv.id).then((val) => setIsInstalled(val)).catch((reason) => console.error(reason))}/> ) : ( setIsInstalled(true)}/>)} diff --git a/frontend/src/pages/server/Administration.tsx b/frontend/src/pages/server/Administration.tsx index c9ae367..431f871 100644 --- a/frontend/src/pages/server/Administration.tsx +++ b/frontend/src/pages/server/Administration.tsx @@ -233,14 +233,14 @@ function ExtraSettingsCard({setServ, serv}: {setServ: React.Dispatch
- + {/* setServ((p) => ({ ...p, useIniConfig: e.target.checked }))}/> -
+
*/} setServ((p) => ({ diff --git a/frontend/src/pages/server/Ini.tsx b/frontend/src/pages/server/Ini.tsx index fb31337..5899329 100644 --- a/frontend/src/pages/server/Ini.tsx +++ b/frontend/src/pages/server/Ini.tsx @@ -18,7 +18,7 @@ export function Ini({ setServ, serv }: Props) { - bob + Not implemented yet, use manual configuration trough ini files for now. ); } From d1d55a6396e427384233bfc3f065e85e7118014a Mon Sep 17 00:00:00 2001 From: Jens van de Wiel Date: Mon, 25 Dec 2023 18:01:14 +0100 Subject: [PATCH 06/11] cleaned up --- go.mod | 2 ++ go.sum | 5 +++-- server/server_controller.go | 5 ++--- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 057b3c6..c8bda2c 100644 --- a/go.mod +++ b/go.mod @@ -5,8 +5,10 @@ go 1.21 toolchain go1.21.5 require ( + github.com/JensvandeWiel/ark-ini v1.1.0 github.com/StackExchange/wmi v1.2.1 github.com/adrg/xdg v0.4.0 + github.com/fsnotify/fsnotify v1.4.9 github.com/go-ini/ini v1.67.0 github.com/gorcon/rcon v1.3.4 github.com/hashicorp/go-version v1.6.0 diff --git a/go.sum b/go.sum index 9f11b0a..a4f4933 100644 --- a/go.sum +++ b/go.sum @@ -13,8 +13,8 @@ github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3IS github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= @@ -98,6 +98,7 @@ golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/server/server_controller.go b/server/server_controller.go index 3327473..eaf4dc6 100644 --- a/server/server_controller.go +++ b/server/server_controller.go @@ -18,7 +18,6 @@ import ( "github.com/fsnotify/fsnotify" "os" "path" - "path/filepath" "strconv" "github.com/JensvandeWiel/ArkAscendedServerManager/helpers" @@ -97,7 +96,7 @@ func (c *ServerController) StartServersWithApplication() { func (c *ServerController) InitAllServers() { - //setup watcher + /*//setup watcher go func() { for { select { @@ -125,7 +124,7 @@ func (c *ServerController) InitAllServers() { if err != nil { runtime.LogErrorf(c.ctx, "Error adding watcher for server %s: %s", server.ServerName, err.Error()) } - } + }*/ } //endregion From ac4407e9bb5a35a3360a1cb853d31f8d904ddcd7 Mon Sep 17 00:00:00 2001 From: Jens van de Wiel Date: Tue, 26 Dec 2023 19:10:40 +0100 Subject: [PATCH 07/11] bugfix --- frontend/src/pages/Server.tsx | 9 +++++---- frontend/src/pages/server/General.tsx | 20 ++++++++++---------- go.mod | 2 +- go.sum | 4 ++-- server/game.go | 4 ++-- server/gus.go | 15 +++++++++------ server/server_controller.go | 4 ++-- 7 files changed, 31 insertions(+), 27 deletions(-) diff --git a/frontend/src/pages/Server.tsx b/frontend/src/pages/Server.tsx index 02fe58d..63450f8 100644 --- a/frontend/src/pages/Server.tsx +++ b/frontend/src/pages/Server.tsx @@ -47,11 +47,12 @@ export const Server = ({id, className}: Props) => { defaultServer.serverAlias = "" defaultServer.ipAddress = "0.0.0.0" - const placeholderGus = { + const placeholderGus: {[key: string]: {[key: string]: Array}} = { "unknown": { - unknown: "", // Default value for MaxPlayers + unknown: [""], // Default value for MaxPlayers }, - } + }; + @@ -60,7 +61,7 @@ export const Server = ({id, className}: Props) => { const [serverStatus, setServerStatus] = useState(false) const [forceStopModalOpen, setForceStopModalOpen] = useState(false) const [startModalOpen, setStartModalOpen] = useState(false) - const [gus, setGus] = useState<{ [key: string]: { [key: string]: string; }; }>(placeholderGus) + const [gus, setGus] = useState<{[key: string]: {[key: string]: Array}}>(placeholderGus) const [updaterModalOpen, setUpdaterModalOpen] = useState(false) const {addAlert} = useAlert() diff --git a/frontend/src/pages/server/General.tsx b/frontend/src/pages/server/General.tsx index 0cbe4ef..08b7164 100644 --- a/frontend/src/pages/server/General.tsx +++ b/frontend/src/pages/server/General.tsx @@ -25,8 +25,8 @@ import {EventsOn} from "../../../wailsjs/runtime"; type Props = { setServ: React.Dispatch> serv: server.Server; - setGus: React.Dispatch> - gus: {[p: string]: {[p: string]: string}} + setGus: React.Dispatch}}>> + gus: {[key: string]: {[key: string]: Array}} } @@ -88,11 +88,11 @@ function GeneralSettings({ setServ, serv, setGus, gus }: Props) { Auto Save interval: { setGus((p) => { const newState = {...p}; - newState["ServerSettings"].AutoSavePeriodMinutes = v.toString(); + newState["ServerSettings"].AutoSavePeriodMinutes[0] = v.toString(); return newState; }) }} @@ -108,10 +108,10 @@ function GeneralSettings({ setServ, serv, setGus, gus }: Props) {
Message - @@ -122,12 +122,12 @@ function GeneralSettings({ setServ, serv, setGus, gus }: Props) { { if (v >= 0) { setGus((p) => { const newState = {...p}; - newState["MessageOfTheDay"].Duration = v.toString(); + newState["MessageOfTheDay"].Duration[0] = v.toString(); return newState; }) } @@ -170,12 +170,12 @@ function GeneralSettings({ setServ, serv, setGus, gus }: Props) { disabled={!(serv?.kickIdlePlayers)} sliderStep={1} sliderMax={3600} - value={parseFloat(gus["ServerSettings"].KickIdlePlayersPeriod)?? 0} + value={parseFloat(gus["ServerSettings"].KickIdlePlayersPeriod[0])?? 0} onChange={(v) => { if (v >= 0) { setGus((p) => { const newState = {...p}; - newState["ServerSettings"].KickIdlePlayersPeriod = v.toString(); + newState["ServerSettings"].KickIdlePlayersPeriod[0] = v.toString(); return newState; }); } diff --git a/go.mod b/go.mod index c8bda2c..85dede2 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.21 toolchain go1.21.5 require ( - github.com/JensvandeWiel/ark-ini v1.1.0 + github.com/JensvandeWiel/ark-ini v1.2.0 github.com/StackExchange/wmi v1.2.1 github.com/adrg/xdg v0.4.0 github.com/fsnotify/fsnotify v1.4.9 diff --git a/go.sum b/go.sum index a4f4933..3fe50b9 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/JensvandeWiel/ark-ini v1.1.0 h1:GA70qiWndeibx/JAgSK7bvrBK4ahk1hM/2QLKq36Kgo= -github.com/JensvandeWiel/ark-ini v1.1.0/go.mod h1:mM7be1osQGncsZFWSJvucs36J1kmxp6E4vYyW0vTkuk= +github.com/JensvandeWiel/ark-ini v1.2.0 h1:z3tA4XM00SZ5KJjNe2oE2fWrJ1qHqL5ac0Er2k5+l5A= +github.com/JensvandeWiel/ark-ini v1.2.0/go.mod h1:mM7be1osQGncsZFWSJvucs36J1kmxp6E4vYyW0vTkuk= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/TheTitanrain/w32 v0.0.0-20180517000239-4f5cfb03fabf h1:FPsprx82rdrX2jiKyS17BH6IrTmUBYqZa/CXT4uvb+I= diff --git a/server/game.go b/server/game.go index 285cbb9..f105909 100644 --- a/server/game.go +++ b/server/game.go @@ -89,7 +89,7 @@ func (s *Server) updateValueInGame(sectionName string, keyName string, value int return nil } -func (s *Server) getGameAsMap() (map[string]map[string]string, error) { +func (s *Server) getGameAsMap() (map[string]map[string][]string, error) { game, err := s.getGame() if err != nil { return nil, err @@ -98,7 +98,7 @@ func (s *Server) getGameAsMap() (map[string]map[string]string, error) { return ini.ToMap(game), nil } -func (s *Server) saveGameFromMap(gameMap map[string]map[string]string) error { +func (s *Server) saveGameFromMap(gameMap map[string]map[string][]string) error { game := ini.DeserializeFromMap(gameMap) err := s.saveGame(game) diff --git a/server/gus.go b/server/gus.go index d5e862e..ed9600c 100644 --- a/server/gus.go +++ b/server/gus.go @@ -3,10 +3,13 @@ package server import ( "errors" ini "github.com/JensvandeWiel/ark-ini" + "github.com/wailsapp/wails/v2/pkg/runtime" "os" "path/filepath" ) +var duplicateKeys = []string{} + // getGus returns the GameUserSettings.ini file as an ini.IniFile struct func (s *Server) getGus() (*ini.IniFile, error) { gusPath := filepath.Join(s.ServerPath, "ShooterGame", "Saved", "Config", "WindowsServer", "GameUserSettings.ini") @@ -16,7 +19,7 @@ func (s *Server) getGus() (*ini.IniFile, error) { return nil, errors.New("error reading GameUserSettings.ini: " + err.Error()) } - gus, err := ini.DeserializeIniFile(string(gusContent) /*insert allowed duplicate keys here*/) + gus, err := ini.DeserializeIniFile(string(gusContent), duplicateKeys... /*insert allowed duplicate keys here*/) if err != nil { return nil, err } @@ -29,9 +32,9 @@ func (s *Server) getGus() (*ini.IniFile, error) { // saveGus saves the GameUserSettings.ini file to disk func (s *Server) saveGus(gus *ini.IniFile) error { gusPath := filepath.Join(s.ServerPath, "ShooterGame", "Saved", "Config", "WindowsServer", "GameUserSettings.ini") - + runtime.LogDebug(s.ctx, "GUS before: "+gus.GetOrCreateSection("MessageOfTheDay").ToString()) s.updateGus(gus) - + runtime.LogDebug(s.ctx, "GUS after: "+gus.GetOrCreateSection("MessageOfTheDay").ToString()) err := os.WriteFile(gusPath, []byte(gus.ToString()), 0644) if err != nil { return err @@ -89,7 +92,7 @@ func (s *Server) updateValueInGus(sectionName string, keyName string, value inte return nil } -func (s *Server) getGusAsMap() (map[string]map[string]string, error) { +func (s *Server) getGusAsMap() (map[string]map[string][]string, error) { gus, err := s.getGus() if err != nil { return nil, err @@ -98,8 +101,8 @@ func (s *Server) getGusAsMap() (map[string]map[string]string, error) { return ini.ToMap(gus), nil } -func (s *Server) saveGusFromMap(gusMap map[string]map[string]string) error { - gus := ini.DeserializeFromMap(gusMap) +func (s *Server) saveGusFromMap(gusMap map[string]map[string][]string) error { + gus := ini.DeserializeFromMap(gusMap, duplicateKeys...) err := s.saveGus(gus) if err != nil { diff --git a/server/server_controller.go b/server/server_controller.go index eaf4dc6..fabb768 100644 --- a/server/server_controller.go +++ b/server/server_controller.go @@ -308,7 +308,7 @@ func (c *ServerController) UpdateValueInGame(id int, sectionName string, keyName return nil } -func (c *ServerController) GetGusAsMap(id int) (map[string]map[string]string, error) { +func (c *ServerController) GetGusAsMap(id int) (map[string]map[string][]string, error) { server, err := c.getServer(id, false) if err != nil { newErr := fmt.Errorf("error getting gus as map " + strconv.Itoa(id) + ": server does not exist in map") @@ -326,7 +326,7 @@ func (c *ServerController) GetGusAsMap(id int) (map[string]map[string]string, er return gus, nil } -func (c *ServerController) SaveGusFromMap(id int, gusMap map[string]map[string]string) error { +func (c *ServerController) SaveGusFromMap(id int, gusMap map[string]map[string][]string) error { server, err := c.getServer(id, false) if err != nil { newErr := fmt.Errorf("error saving gus from map " + strconv.Itoa(id) + ": server does not exist in map") From 31cfbd3d5d5b5b6def691683a43fa409bbdcb47d Mon Sep 17 00:00:00 2001 From: Jens van de Wiel Date: Tue, 26 Dec 2023 19:15:46 +0100 Subject: [PATCH 08/11] actually added server password and spectatoer password functionality --- server/gus.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/server/gus.go b/server/gus.go index ed9600c..1132e06 100644 --- a/server/gus.go +++ b/server/gus.go @@ -3,7 +3,6 @@ package server import ( "errors" ini "github.com/JensvandeWiel/ark-ini" - "github.com/wailsapp/wails/v2/pkg/runtime" "os" "path/filepath" ) @@ -32,9 +31,7 @@ func (s *Server) getGus() (*ini.IniFile, error) { // saveGus saves the GameUserSettings.ini file to disk func (s *Server) saveGus(gus *ini.IniFile) error { gusPath := filepath.Join(s.ServerPath, "ShooterGame", "Saved", "Config", "WindowsServer", "GameUserSettings.ini") - runtime.LogDebug(s.ctx, "GUS before: "+gus.GetOrCreateSection("MessageOfTheDay").ToString()) s.updateGus(gus) - runtime.LogDebug(s.ctx, "GUS after: "+gus.GetOrCreateSection("MessageOfTheDay").ToString()) err := os.WriteFile(gusPath, []byte(gus.ToString()), 0644) if err != nil { return err @@ -51,6 +48,16 @@ func (s *Server) updateGus(gus *ini.IniFile) { serverSettings.AddOrReplaceKey("RCONEnabled", true) serverSettings.AddOrReplaceKey("RCONPort", s.RCONPort) serverSettings.AddOrReplaceKey("ServerAdminPassword", s.AdminPassword) + if s.ServerPassword != "" { + serverSettings.AddOrReplaceKey("ServerPassword", s.ServerPassword) + } else { + serverSettings.RemoveMultipleKey("ServerPassword") + } + if s.SpectatorPassword != "" { + serverSettings.AddOrReplaceKey("SpectatorPassword", s.SpectatorPassword) + } else { + serverSettings.RemoveMultipleKey("SpectatorPassword") + } serverSettings.AddOrReplaceKey("ActiveMods", s.Mods) } From 8f7d3c2133a89b995a35f8621d0f4a0472434517 Mon Sep 17 00:00:00 2001 From: Jens van de Wiel Date: Tue, 26 Dec 2023 19:19:49 +0100 Subject: [PATCH 09/11] added prettier to the frontend --- frontend/.prettierignore | 4 + frontend/.prettierrc | 1 + frontend/index.html | 3 +- frontend/package-lock.json | 22 + frontend/package.json | 1 + frontend/postcss.config.cjs | 2 +- frontend/src/App.tsx | 466 ++++++----- frontend/src/components/AlertProvider.tsx | 110 ++- frontend/src/components/HomeButton.tsx | 31 +- frontend/src/components/PasswordInput.tsx | 55 +- frontend/src/components/ServerList.tsx | 123 ++- frontend/src/components/Slider.tsx | 75 +- frontend/src/components/ThemeSwitcher.tsx | 40 +- frontend/src/index.css | 2 +- frontend/src/main.tsx | 44 +- frontend/src/pages/InstallUpdater.tsx | 216 +++--- frontend/src/pages/Server.tsx | 729 +++++++++++------- frontend/src/pages/UpdaterModal.tsx | 109 +-- frontend/src/pages/server/Administration.tsx | 768 +++++++++++-------- frontend/src/pages/server/Console.tsx | 332 ++++---- frontend/src/pages/server/General.tsx | 589 ++++++++------ frontend/src/pages/server/Ini.tsx | 44 +- frontend/src/pages/server/Mods.tsx | 64 +- frontend/tailwind.config.cjs | 12 +- frontend/vite.config.ts | 8 +- 25 files changed, 2308 insertions(+), 1542 deletions(-) create mode 100644 frontend/.prettierignore create mode 100644 frontend/.prettierrc diff --git a/frontend/.prettierignore b/frontend/.prettierignore new file mode 100644 index 0000000..45b8c95 --- /dev/null +++ b/frontend/.prettierignore @@ -0,0 +1,4 @@ +build +covarage +dist +wailsjs \ No newline at end of file diff --git a/frontend/.prettierrc b/frontend/.prettierrc new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/frontend/.prettierrc @@ -0,0 +1 @@ +{} diff --git a/frontend/index.html b/frontend/index.html index 711818f..4b6f6c9 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -1,4 +1,4 @@ - + @@ -6,7 +6,6 @@ Vite + React + TS + Tailwind -
diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 37cbd12..ccece17 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -24,6 +24,7 @@ "@vitejs/plugin-react": "^2.1.0", "autoprefixer": "^10.4.12", "postcss": "^8.4.17", + "prettier": "3.1.1", "tailwindcss": "^3.1.8", "typescript": "^4.6.4", "vite": "^3.1.0" @@ -2418,6 +2419,21 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "node_modules/prettier": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -4407,6 +4423,12 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "prettier": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", + "dev": true + }, "prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", diff --git a/frontend/package.json b/frontend/package.json index 1949c11..061f833 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -25,6 +25,7 @@ "@vitejs/plugin-react": "^2.1.0", "autoprefixer": "^10.4.12", "postcss": "^8.4.17", + "prettier": "3.1.1", "tailwindcss": "^3.1.8", "typescript": "^4.6.4", "vite": "^3.1.0" diff --git a/frontend/postcss.config.cjs b/frontend/postcss.config.cjs index 33ad091..12a703d 100644 --- a/frontend/postcss.config.cjs +++ b/frontend/postcss.config.cjs @@ -3,4 +3,4 @@ module.exports = { tailwindcss: {}, autoprefixer: {}, }, -} +}; diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 2faf772..a548194 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1,209 +1,305 @@ import { - Alert, AspectRatio, - Button, - Card, - DialogActions, - DialogTitle, Divider, - Drawer, IconButton, List, ListItem, - ListItemButton, Modal, - ModalClose, ModalDialog, Tooltip, Typography, + Alert, + AspectRatio, + Button, + Card, + DialogActions, + DialogTitle, + Divider, + Drawer, + IconButton, + List, + ListItem, + ListItemButton, + Modal, + ModalClose, + ModalDialog, + Tooltip, + Typography, } from "@mui/joy"; -import {ThemeSwitcher} from "./components/ThemeSwitcher"; -import {HomeButton} from "./components/HomeButton"; +import { ThemeSwitcher } from "./components/ThemeSwitcher"; +import { HomeButton } from "./components/HomeButton"; import { ServerList } from "./components/ServerList"; -import React, {useEffect, useState} from "react"; -import {Server} from "./pages/Server"; -import {IconArrowLeft, IconExternalLink, IconHome, IconInfoCircle, IconPlus, IconRefresh} from "@tabler/icons-react"; -import {CreateServer, GetAllServers, GetAllServersFromDir, GetServerDir} from "../wailsjs/go/server/ServerController"; -import {server} from "../wailsjs/go/models"; -import {BrowserOpenURL, EventsOff, EventsOn, LogDebug} from "../wailsjs/runtime"; -import {AlertProvider, useAlert} from "./components/AlertProvider"; -import banner from "./assets/AASM_V3_banner2.png" -import {GetVersion} from "../wailsjs/go/helpers/HelpersController"; +import React, { useEffect, useState } from "react"; +import { Server } from "./pages/Server"; +import { + IconArrowLeft, + IconExternalLink, + IconHome, + IconInfoCircle, + IconPlus, + IconRefresh, +} from "@tabler/icons-react"; +import { + CreateServer, + GetAllServers, + GetAllServersFromDir, + GetServerDir, +} from "../wailsjs/go/server/ServerController"; +import { server } from "../wailsjs/go/models"; +import { + BrowserOpenURL, + EventsOff, + EventsOn, + LogDebug, +} from "../wailsjs/runtime"; +import { AlertProvider, useAlert } from "./components/AlertProvider"; +import banner from "./assets/AASM_V3_banner2.png"; +import { GetVersion } from "../wailsjs/go/helpers/HelpersController"; enum ServerListType { - CARD, - LIST, + CARD, + LIST, } function App() { - const [activeServer, setActiveServer] = useState(undefined) - const [drawerOpen, setDrawerOpen] = useState(false); - const [servers, setServers] = useState<{[key: number]: server.Server}|null>(null); - const [infoModalOpen, setInfoModalOpen] = useState(false); - const [appVersion, setAppVersion] = useState(""); - const [earlyError, setEarlyError] = useState("") - + const [activeServer, setActiveServer] = useState( + undefined, + ); + const [drawerOpen, setDrawerOpen] = useState(false); + const [servers, setServers] = useState<{ + [key: number]: server.Server; + } | null>(null); + const [infoModalOpen, setInfoModalOpen] = useState(false); + const [appVersion, setAppVersion] = useState(""); + const [earlyError, setEarlyError] = useState(""); - //This gets all the servers but if one server is changed manually it does not update it! - function getServers() { - GetAllServers() - .then(result => { - if (typeof result === 'object') { - setServers(result); - } else { - // Handle the case where the function returns a boolean. - LogDebug('GetAllServers status: ' + result) - } - }) - .catch(error => { - setEarlyError(error) - console.error(error); - }); - } - - function getServersFromDir() { - GetAllServersFromDir() - .then(result => { - if (typeof result === 'object') { - setServers(result); - console.log(result) - } else { - // Handle the case where the function returns a boolean. - LogDebug('GetAllServers status: ' + result) - } - }) - .catch(error => { - setEarlyError(error) - console.error(error); - }); - } - - useEffect(() => { - getServers() - GetVersion().then(version => setAppVersion(version)) + //This gets all the servers but if one server is changed manually it does not update it! + function getServers() { + GetAllServers() + .then((result) => { + if (typeof result === "object") { + setServers(result); + } else { + // Handle the case where the function returns a boolean. + LogDebug("GetAllServers status: " + result); + } + }) + .catch((error) => { + setEarlyError(error); + console.error(error); + }); + } - }, []); + function getServersFromDir() { + GetAllServersFromDir() + .then((result) => { + if (typeof result === "object") { + setServers(result); + console.log(result); + } else { + // Handle the case where the function returns a boolean. + LogDebug("GetAllServers status: " + result); + } + }) + .catch((error) => { + setEarlyError(error); + console.error(error); + }); + } - useEffect(() => { - EventsOn("reloadServers", getServers) - return () => EventsOff("reloadServers") - }, []); + useEffect(() => { + getServers(); + GetVersion().then((version) => setAppVersion(version)); + }, []); - //events - useEffect(() => { - EventsOn("serverSaved", getServers) - return () => { - EventsOff("serverSaved") - } - }, []); + useEffect(() => { + EventsOn("reloadServers", getServers); + return () => EventsOff("reloadServers"); + }, []); - const handleCreateNewServerClicked = () => { - CreateServer(true).then((server) => { - getServers() - setActiveServer(server.id) - setDrawerOpen(false) - }).catch((r) => console.error(r)) - } + //events + useEffect(() => { + EventsOn("serverSaved", getServers); + return () => { + EventsOff("serverSaved"); + }; + }, []); - const ServerDrawer = ( - setDrawerOpen(false)} size="md"> - + const handleCreateNewServerClicked = () => { + CreateServer(true) + .then((server) => { + getServers(); + setActiveServer(server.id); + setDrawerOpen(false); + }) + .catch((r) => console.error(r)); + }; - Servers: - - - - - + const ServerDrawer = ( + setDrawerOpen(false)} size="md"> + - {getServersFromDir(); setActiveServer(undefined)}}> - {getServers(); setActiveServer(undefined)}}> - {GetServerDir().then((dir: string) => BrowserOpenURL("file:///" + dir))}}> - - - - Create new server - - - - - - ); + Servers: + + + + + + + { + getServersFromDir(); + setActiveServer(undefined); + }} + > + + + + + { + getServers(); + setActiveServer(undefined); + }} + > + + + + + { + GetServerDir().then((dir: string) => + BrowserOpenURL("file:///" + dir), + ); + }} + > + + + + + + + Create new server + + + + + + ); - let mainUi = null; - if (activeServer !== undefined) { - mainUi = + let mainUi = null; + if (activeServer !== undefined) { + mainUi = ; + } else { + if (servers !== null && Object.keys(servers).length > 0) { + mainUi = ( +
+

Select a server:

+ +
+ ); } else { - if(servers !== null && Object.keys(servers).length > 0) { - mainUi = ( -
-

Select a server:

- -
- ) - } - else { - mainUi = ( -
-

You have no servers yet!

- - - {earlyError} - -
- ) - } + mainUi = ( +
+

You have no servers yet!

+ + + {earlyError} + +
+ ); } + } - - - - return ( -
- -
-
- -
-
- - - setInfoModalOpen(true)} - > - - - setInfoModalOpen(false)}> - - - - - - -
- - Info: - - - Version: {appVersion} - -
- - - - - -
-
-
-
+ return ( +
+ +
+
+ +
+
+ + + setInfoModalOpen(true)} + > + + + setInfoModalOpen(false)}> + + + + + + +
+ Info: + + Version: {appVersion} + +
+ + +
- {mainUi} - - {ServerDrawer} - +
+
+
- ) + {mainUi} + + {ServerDrawer} +
+
+ ); } -export default App +export default App; diff --git a/frontend/src/components/AlertProvider.tsx b/frontend/src/components/AlertProvider.tsx index fa4fcef..007ce95 100644 --- a/frontend/src/components/AlertProvider.tsx +++ b/frontend/src/components/AlertProvider.tsx @@ -1,59 +1,87 @@ -import React, { createContext, useContext, useState, ReactNode } from 'react'; -import { Alert } from '@mui/joy'; -import {IconX} from "@tabler/icons-react"; +import React, { createContext, useContext, useState, ReactNode } from "react"; +import { Alert } from "@mui/joy"; +import { IconX } from "@tabler/icons-react"; type AlertContextType = { - addAlert: (message: string, severity: "success" | "warning" | "primary" | "neutral" | "danger" | undefined) => void; - alerts: Alert[]; + addAlert: ( + message: string, + severity: + | "success" + | "warning" + | "primary" + | "neutral" + | "danger" + | undefined, + ) => void; + alerts: Alert[]; }; const AlertContext = createContext(undefined); type AlertProviderProps = { - children: ReactNode; + children: ReactNode; }; type Alert = { - message: string; - severity: "success" | "warning" | "primary" | "neutral" | "danger" | undefined + message: string; + severity: + | "success" + | "warning" + | "primary" + | "neutral" + | "danger" + | undefined; }; export function AlertProvider({ children }: AlertProviderProps) { + const [alerts, setAlerts] = useState([]); - const [alerts, setAlerts] = useState([]) - - const addAlert = (message: string, severity: "success" | "warning" | "primary" | "neutral" | "danger" | undefined) => { - const newAlert = { message, severity }; - setAlerts([...alerts, newAlert]); - - console.log(alerts) - }; - - const removeAlert = (index: number) => { - const updatedAlerts = [...alerts]; - updatedAlerts.splice(index, 1); - setAlerts(updatedAlerts); - }; - - return ( - - {children} - -
- {alerts.map((alert, index) => ( - removeAlert(index)}/>}> - {alert.message} - - ))} -
-
- ); + const addAlert = ( + message: string, + severity: + | "success" + | "warning" + | "primary" + | "neutral" + | "danger" + | undefined, + ) => { + const newAlert = { message, severity }; + setAlerts([...alerts, newAlert]); + + console.log(alerts); + }; + + const removeAlert = (index: number) => { + const updatedAlerts = [...alerts]; + updatedAlerts.splice(index, 1); + setAlerts(updatedAlerts); + }; + + return ( + + {children} + +
+ {alerts.map((alert, index) => ( + removeAlert(index)} />} + > + {alert.message} + + ))} +
+
+ ); } export function useAlert() { - const context = useContext(AlertContext); - if (!context) { - throw new Error('useAlert must be used within an AlertProvider'); - } - return context; + const context = useContext(AlertContext); + if (!context) { + throw new Error("useAlert must be used within an AlertProvider"); + } + return context; } diff --git a/frontend/src/components/HomeButton.tsx b/frontend/src/components/HomeButton.tsx index 6c62684..90d8af9 100644 --- a/frontend/src/components/HomeButton.tsx +++ b/frontend/src/components/HomeButton.tsx @@ -1,21 +1,20 @@ -import React, {useState} from "react"; -import {IconButton} from "@mui/joy"; -import {IconHome} from "@tabler/icons-react"; +import React, { useState } from "react"; +import { IconButton } from "@mui/joy"; +import { IconHome } from "@tabler/icons-react"; import { server } from "../../wailsjs/go/models"; type Props = { setServ: React.Dispatch>; -} +}; - -export const HomeButton = ({setServ}:Props) => { - return ( - setServ(undefined)} - > - - - ); -}; \ No newline at end of file +export const HomeButton = ({ setServ }: Props) => { + return ( + setServ(undefined)} + > + + + ); +}; diff --git a/frontend/src/components/PasswordInput.tsx b/frontend/src/components/PasswordInput.tsx index 0a8ba80..16c6ba0 100644 --- a/frontend/src/components/PasswordInput.tsx +++ b/frontend/src/components/PasswordInput.tsx @@ -1,24 +1,37 @@ -import {IconButton, Input} from "@mui/joy"; -import React, {useState} from "react"; -import {IconEye, IconEyeClosed} from "@tabler/icons-react"; +import { IconButton, Input } from "@mui/joy"; +import React, { useState } from "react"; +import { IconEye, IconEyeClosed } from "@tabler/icons-react"; type Props = { - onChange: React.ChangeEventHandler | undefined - value: string | ReadonlyArray | number | undefined; - children?: any - className?: string | undefined - disabled?: boolean -} + onChange: React.ChangeEventHandler | undefined; + value: string | ReadonlyArray | number | undefined; + children?: any; + className?: string | undefined; + disabled?: boolean; +}; -export function PasswordInput({onChange, value, children, className, disabled}: Props) { - const [textVisible, setTextVisible] = useState(false) - return ( - setTextVisible(!textVisible)}>{textVisible? : }} - value={value} - onChange={onChange} - className={className} - disabled={disabled} - >{children} - ); -} \ No newline at end of file +export function PasswordInput({ + onChange, + value, + children, + className, + disabled, +}: Props) { + const [textVisible, setTextVisible] = useState(false); + return ( + setTextVisible(!textVisible)}> + {textVisible ? : } + + } + value={value} + onChange={onChange} + className={className} + disabled={disabled} + > + {children} + + ); +} diff --git a/frontend/src/components/ServerList.tsx b/frontend/src/components/ServerList.tsx index ce14bb7..0c2a15c 100644 --- a/frontend/src/components/ServerList.tsx +++ b/frontend/src/components/ServerList.tsx @@ -21,9 +21,19 @@ type Props = { handleCreateNewServerClicked: () => void; }; -export const ServerList = ({serverListType, servers, setActiveServer, setDrawerOpen, handleCreateNewServerClicked}: Props) => { - const [playerCounts, setPlayerCounts] = useState>({}); - const [serverStatuses, setServerStatuses] = useState>({}); +export const ServerList = ({ + serverListType, + servers, + setActiveServer, + setDrawerOpen, + handleCreateNewServerClicked, +}: Props) => { + const [playerCounts, setPlayerCounts] = useState< + Record + >({}); + const [serverStatuses, setServerStatuses] = useState< + Record + >({}); const { addAlert } = useAlert(); @@ -33,7 +43,7 @@ export const ServerList = ({serverListType, servers, setActiveServer, setDrawerO useEffect(() => { const refreshPlayerCounts = async () => { if (!servers) { - return + return; } await Promise.all( @@ -44,22 +54,24 @@ export const ServerList = ({serverListType, servers, setActiveServer, setDrawerO return; } - GetConnectedPlayerCount(serverId).then((count) => { - setPlayerCounts((prevPlayerCounts) => { - return { - ...prevPlayerCounts, - [serverId]: count as number, - }; + GetConnectedPlayerCount(serverId) + .then((count) => { + setPlayerCounts((prevPlayerCounts) => { + return { + ...prevPlayerCounts, + [serverId]: count as number, + }; + }); + }) + .catch(() => { + setPlayerCounts((prevPlayerCounts) => { + return { + ...prevPlayerCounts, + [serverId]: 0, + }; + }); }); - }).catch(() => { - setPlayerCounts((prevPlayerCounts) => { - return { - ...prevPlayerCounts, - [serverId]: 0, - }; - }); - }); - }) + }), ); }; @@ -69,7 +81,7 @@ export const ServerList = ({serverListType, servers, setActiveServer, setDrawerO useEffect(() => { const refreshServerStatuses = async () => { if (!servers) { - return + return; } await Promise.all( @@ -80,18 +92,20 @@ export const ServerList = ({serverListType, servers, setActiveServer, setDrawerO return; } - GetServerStatus(serverId).catch((reason) => { - console.error("serverstatus: " + reason); - addAlert(reason, "danger"); - }).then((count) => { - setServerStatuses((prevServerStatuses) => { - return { - ...prevServerStatuses, - [serverId]: count as boolean | undefined, - }; + GetServerStatus(serverId) + .catch((reason) => { + console.error("serverstatus: " + reason); + addAlert(reason, "danger"); + }) + .then((count) => { + setServerStatuses((prevServerStatuses) => { + return { + ...prevServerStatuses, + [serverId]: count as boolean | undefined, + }; + }); }); - }); - }) + }), ); }; @@ -118,7 +132,8 @@ export const ServerList = ({serverListType, servers, setActiveServer, setDrawerO if (serverListType === ServerListType.LIST) { return ( - { + { setActiveServer(index); setDrawerOpen(false); }} @@ -130,14 +145,39 @@ export const ServerList = ({serverListType, servers, setActiveServer, setDrawerO ); } else if (serverListType === ServerListType.CARD) { return ( - - {setActiveServer(index);}}> + + { + setActiveServer(index); + }} + >
-
{server.serverAlias ? server.serverAlias : "Unnamed Server"}
-
{server.ipAddress}:{server.queryPort}
+
+ {server.serverAlias + ? server.serverAlias + : "Unnamed Server"} +
+
+ {server.ipAddress}:{server.queryPort} +
-
Players: {playerCount !== undefined ? `${playerCount}/${server.maxPlayers}` : "Loading..."}
-
Status: {serverStatus !== undefined ? (serverStatus ? "Running" : "Stopped") : "Loading..."} +
+ Players:{" "} + {playerCount !== undefined + ? `${playerCount}/${server.maxPlayers}` + : "Loading..."} +
+
+ Status:{" "} + {serverStatus !== undefined + ? serverStatus + ? "Running" + : "Stopped" + : "Loading..."}
@@ -148,7 +188,10 @@ export const ServerList = ({serverListType, servers, setActiveServer, setDrawerO )} {serverListType === ServerListType.CARD ? ( - ) : ( @@ -156,4 +199,4 @@ export const ServerList = ({serverListType, servers, setActiveServer, setDrawerO )} ); -}; \ No newline at end of file +}; diff --git a/frontend/src/components/Slider.tsx b/frontend/src/components/Slider.tsx index af0b05d..954af08 100644 --- a/frontend/src/components/Slider.tsx +++ b/frontend/src/components/Slider.tsx @@ -1,30 +1,53 @@ import React from "react"; -import {server} from "../../wailsjs/go/models"; -import {Input, Slider as Sl} from "@mui/joy"; +import { server } from "../../wailsjs/go/models"; +import { Input, Slider as Sl } from "@mui/joy"; type Props = { - value: number; - onChange: (value: number) => void; - className?: string; - sliderMax?: number; - sliderStep?: number; - sliderMin?: number; - disabled?: boolean; + value: number; + onChange: (value: number) => void; + className?: string; + sliderMax?: number; + sliderStep?: number; + sliderMin?: number; + disabled?: boolean; +}; +export function Slider({ + value, + onChange, + className, + sliderMax, + sliderStep, + sliderMin, + disabled, +}: Props) { + return ( +
+
+ { + let val = v as number; + onChange(val); + }} + > + { + let val = parseInt(e.target.value); + onChange(val); + }} + > +
+
+ ); } - -export function Slider({value, onChange, className, sliderMax, sliderStep, sliderMin, disabled}:Props) { - return ( -
-
- { - let val = v as number - onChange(val); - }} > - { - let val = parseInt(e.target.value); - onChange(val); - }}> -
-
- ); -} \ No newline at end of file diff --git a/frontend/src/components/ThemeSwitcher.tsx b/frontend/src/components/ThemeSwitcher.tsx index a3e9b68..1138fdb 100644 --- a/frontend/src/components/ThemeSwitcher.tsx +++ b/frontend/src/components/ThemeSwitcher.tsx @@ -1,25 +1,25 @@ -import {Button, IconButton, useColorScheme} from "@mui/joy"; +import { Button, IconButton, useColorScheme } from "@mui/joy"; import React from "react"; -import {IconMoon, IconSun} from "@tabler/icons-react"; +import { IconMoon, IconSun } from "@tabler/icons-react"; export const ThemeSwitcher = () => { - const { mode, setMode } = useColorScheme(); - const [mounted, setMounted] = React.useState(false); + const { mode, setMode } = useColorScheme(); + const [mounted, setMounted] = React.useState(false); - React.useEffect(() => { - setMounted(true); - }, []); + React.useEffect(() => { + setMounted(true); + }, []); - if (!mounted) { - return null; - } - return ( - setMode(mode === 'dark' ? 'light' : 'dark')} - > - {mode === 'dark' ? : } - - ); -}; \ No newline at end of file + if (!mounted) { + return null; + } + return ( + setMode(mode === "dark" ? "light" : "dark")} + > + {mode === "dark" ? : } + + ); +}; diff --git a/frontend/src/index.css b/frontend/src/index.css index bd6213e..b5c61c9 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -1,3 +1,3 @@ @tailwind base; @tailwind components; -@tailwind utilities; \ No newline at end of file +@tailwind utilities; diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index cd3f672..3611d49 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -1,30 +1,22 @@ -import React from 'react' -import {createRoot} from 'react-dom/client' -import App from './App' -import './index.css' -import '@fontsource-variable/inter'; -import { - CssBaseline, - CssVarsProvider, - StyledEngineProvider, -} from "@mui/joy"; +import React from "react"; +import { createRoot } from "react-dom/client"; +import App from "./App"; +import "./index.css"; +import "@fontsource-variable/inter"; +import { CssBaseline, CssVarsProvider, StyledEngineProvider } from "@mui/joy"; +const container = document.getElementById("root"); - -const container = document.getElementById('root') - -const root = createRoot(container!) +const root = createRoot(container!); root.render( - - - - - - - - - -) - - + + + + + + + + + , +); diff --git a/frontend/src/pages/InstallUpdater.tsx b/frontend/src/pages/InstallUpdater.tsx index 79cb421..2157d4e 100644 --- a/frontend/src/pages/InstallUpdater.tsx +++ b/frontend/src/pages/InstallUpdater.tsx @@ -1,99 +1,139 @@ -import React, {useEffect, useState} from "react"; -import {server} from "../../wailsjs/go/models"; +import React, { useEffect, useState } from "react"; +import { server } from "../../wailsjs/go/models"; import { - Button, - Card, - Divider, - FormLabel, - Input, - LinearProgress, - Modal, - ModalDialog, - Typography + Button, + Card, + Divider, + FormLabel, + Input, + LinearProgress, + Modal, + ModalDialog, + Typography, } from "@mui/joy"; -import {OpenDirectoryDialog} from "../../wailsjs/go/helpers/HelpersController"; -import {IconDownload, IconTrash} from "@tabler/icons-react"; -import {InstallUpdateVerify} from "../../wailsjs/go/installer/InstallerController"; -import {EventsOn} from "../../wailsjs/runtime"; -import {useAlert} from "../components/AlertProvider"; -import {DeleteProfile} from "../../wailsjs/go/server/ServerController"; +import { OpenDirectoryDialog } from "../../wailsjs/go/helpers/HelpersController"; +import { IconDownload, IconTrash } from "@tabler/icons-react"; +import { InstallUpdateVerify } from "../../wailsjs/go/installer/InstallerController"; +import { EventsOn } from "../../wailsjs/runtime"; +import { useAlert } from "../components/AlertProvider"; +import { DeleteProfile } from "../../wailsjs/go/server/ServerController"; type Props = { - setServ: React.Dispatch> - serv: server.Server; - onInstalled: () => void; -} - -export function InstallUpdater({setServ, serv, onInstalled}: Props) { - - const [action, setAction] = useState("Preparing") - const [progress, setProgress] = useState(0.00) - const [isCompleted, setIsCompleted] = useState(false) - const [installerModalOpen, setInstallerModalOpen] = useState(false) - const {addAlert} = useAlert() - function onServerPathClicked() { - OpenDirectoryDialog().then((val) => setServ((p) => ({ ...p, serverPath: val}))) - } + setServ: React.Dispatch>; + serv: server.Server; + onInstalled: () => void; +}; - function onStartInstallButtonClicked() { - if (serv.serverPath == "") { - addAlert("Server Path must be set to a path", "warning") - return - } - setInstallerModalOpen(true) - InstallUpdateVerify(serv.serverPath).catch((err) => { - setAction("failed installing: " + err.message); - setInstallerModalOpen(false); - console.error(err); - addAlert("Installer failed: " + err, "danger") - }) - } +export function InstallUpdater({ setServ, serv, onInstalled }: Props) { + const [action, setAction] = useState("Preparing"); + const [progress, setProgress] = useState(0.0); + const [isCompleted, setIsCompleted] = useState(false); + const [installerModalOpen, setInstallerModalOpen] = useState(false); + const { addAlert } = useAlert(); + function onServerPathClicked() { + OpenDirectoryDialog().then((val) => + setServ((p) => ({ ...p, serverPath: val })), + ); + } - function onCancelButtonClicked() { - DeleteProfile(serv.id).then(() => {addAlert("Deleted profile", "success"); setTimeout(() => {location.reload()}, 500) }).catch((err) => {console.error(err); addAlert(err, "danger")}) + function onStartInstallButtonClicked() { + if (serv.serverPath == "") { + addAlert("Server Path must be set to a path", "warning"); + return; } + setInstallerModalOpen(true); + InstallUpdateVerify(serv.serverPath).catch((err) => { + setAction("failed installing: " + err.message); + setInstallerModalOpen(false); + console.error(err); + addAlert("Installer failed: " + err, "danger"); + }); + } - useEffect(() => { - EventsOn("installingUpdateAction", (data) => {setAction(data);}) - EventsOn("installingUpdateProgress", (data) => {setProgress(data);}) - EventsOn("appInstalled", () => {setIsCompleted(true); setAction("Done"); setProgress(100)}) - }, []); + function onCancelButtonClicked() { + DeleteProfile(serv.id) + .then(() => { + addAlert("Deleted profile", "success"); + setTimeout(() => { + location.reload(); + }, 500); + }) + .catch((err) => { + console.error(err); + addAlert(err, "danger"); + }); + } + useEffect(() => { + EventsOn("installingUpdateAction", (data) => { + setAction(data); + }); + EventsOn("installingUpdateProgress", (data) => { + setProgress(data); + }); + EventsOn("appInstalled", () => { + setIsCompleted(true); + setAction("Done"); + setProgress(100); + }); + }, []); - return ( -
- - - - Install/Update server - - - - Status: {action} - - - Progress: - -
- -
- -
-
- - - Install server - - - Server Path - -
- - -
-
+ return ( +
+ + + Install/Update server + + + Status: {action} + + + Progress: + +
+ +
+ +
+
+ + Install server + + Server Path + +
+ +
- ); -} \ No newline at end of file +
+
+ ); +} diff --git a/frontend/src/pages/Server.tsx b/frontend/src/pages/Server.tsx index 63450f8..f43c87b 100644 --- a/frontend/src/pages/Server.tsx +++ b/frontend/src/pages/Server.tsx @@ -1,304 +1,477 @@ import { - Button, - ButtonGroup, - Card, DialogActions, - DialogContent, - DialogTitle, - Divider, IconButton, - Input, - Modal, - ModalDialog, - Tab, - TabList, - Tabs, Tooltip + Button, + ButtonGroup, + Card, + DialogActions, + DialogContent, + DialogTitle, + Divider, + IconButton, + Input, + Modal, + ModalDialog, + Tab, + TabList, + Tabs, + Tooltip, } from "@mui/joy"; -import {Administration} from "./server/Administration"; -import {General} from "./server/General"; -import {useEffect, useState} from "react"; -import {server} from "../../wailsjs/go/models"; +import { Administration } from "./server/Administration"; +import { General } from "./server/General"; +import { useEffect, useState } from "react"; +import { server } from "../../wailsjs/go/models"; import { - CheckServerInstalled, - ForceStopServer, GetGusAsMap, - GetServer, GetServerStatus, SaveGusFromMap, - SaveServer, - StartServer, StopServer + CheckServerInstalled, + ForceStopServer, + GetGusAsMap, + GetServer, + GetServerStatus, + SaveGusFromMap, + SaveServer, + StartServer, + StopServer, } from "../../wailsjs/go/server/ServerController"; -import {InstallUpdater} from "./InstallUpdater"; -import {useAlert} from "../components/AlertProvider"; -import {BrowserOpenURL, EventsOff, EventsOn} from "../../wailsjs/runtime"; -import {IconAlertCircleFilled, IconExternalLink, IconReload} from "@tabler/icons-react"; -import {Console} from "./server/Console"; -import {UpdaterModal} from "./UpdaterModal"; -import {InstallUpdateVerify} from "../../wailsjs/go/installer/InstallerController"; -import {SendRconCommand} from "../../wailsjs/go/helpers/HelpersController"; -import {Mods} from "./server/Mods"; -import {Ini} from "./server/Ini"; - +import { InstallUpdater } from "./InstallUpdater"; +import { useAlert } from "../components/AlertProvider"; +import { BrowserOpenURL, EventsOff, EventsOn } from "../../wailsjs/runtime"; +import { + IconAlertCircleFilled, + IconExternalLink, + IconReload, +} from "@tabler/icons-react"; +import { Console } from "./server/Console"; +import { UpdaterModal } from "./UpdaterModal"; +import { InstallUpdateVerify } from "../../wailsjs/go/installer/InstallerController"; +import { SendRconCommand } from "../../wailsjs/go/helpers/HelpersController"; +import { Mods } from "./server/Mods"; +import { Ini } from "./server/Ini"; type Props = { - id: number | undefined - className?: string -} - - -export const Server = ({id, className}: Props) => { - const defaultServer = new server.Server - defaultServer.id = -1 - defaultServer.serverAlias = "" - defaultServer.ipAddress = "0.0.0.0" - - const placeholderGus: {[key: string]: {[key: string]: Array}} = { - "unknown": { - unknown: [""], // Default value for MaxPlayers - }, - }; - - - - - const [serv, setServ] = useState(defaultServer) - const [isInstalled, setIsInstalled] = useState(false) - const [serverStatus, setServerStatus] = useState(false) - const [forceStopModalOpen, setForceStopModalOpen] = useState(false) - const [startModalOpen, setStartModalOpen] = useState(false) - const [gus, setGus] = useState<{[key: string]: {[key: string]: Array}}>(placeholderGus) - - const [updaterModalOpen, setUpdaterModalOpen] = useState(false) - const {addAlert} = useAlert() - - //region useEffect land :) + id: number | undefined; + className?: string; +}; - useEffect(() => { - if (serv.id >= 0) { - GetGusAsMap(serv.id).then((val) => setGus(val)).catch((reason) => console.error(reason)) - } - }, [serv]); +export const Server = ({ id, className }: Props) => { + const defaultServer = new server.Server(); + defaultServer.id = -1; + defaultServer.serverAlias = ""; + defaultServer.ipAddress = "0.0.0.0"; + + const placeholderGus: { [key: string]: { [key: string]: Array } } = { + unknown: { + unknown: [""], // Default value for MaxPlayers + }, + }; + + const [serv, setServ] = useState(defaultServer); + const [isInstalled, setIsInstalled] = useState(false); + const [serverStatus, setServerStatus] = useState(false); + const [forceStopModalOpen, setForceStopModalOpen] = useState(false); + const [startModalOpen, setStartModalOpen] = useState(false); + const [gus, setGus] = useState<{ + [key: string]: { [key: string]: Array }; + }>(placeholderGus); + + const [updaterModalOpen, setUpdaterModalOpen] = useState(false); + const { addAlert } = useAlert(); + + //region useEffect land :) + + useEffect(() => { + if (serv.id >= 0) { + GetGusAsMap(serv.id) + .then((val) => setGus(val)) + .catch((reason) => console.error(reason)); + } + }, [serv]); - /*useEffect(() => { + /*useEffect(() => { EventsOn("fileChanged", (data) => { GetGusAsMap(serv.id).then((val) => {setGus(val); console.log(val)}).catch((reason) => console.error(reason)) }) }, []);*/ - useEffect(() => { - //check if gus is placeholder - if (Object.keys(gus).length === 1 && Object.keys(gus)[0] === "unknown") { - return - } - - //update gus with new values - SaveGusFromMap(serv.id, gus).catch((reason) => console.error(reason)) - }, [gus]); - - useEffect(() => { - if (serv.id >= 0) { - CheckServerInstalled(serv.id).then((val) => setIsInstalled(val)).catch((reason) => console.error(reason)) - } - }, [serv]); - - useEffect(() => { - if (id !== undefined) { - GetServer(id).then((s) => {setServ(s)}).catch((reason) => console.error(reason)) - } - }, [id]); - - useEffect(() => { - if (serv.id >= 0) { - SaveServer(serv).catch((reason) => {console.error(reason); addAlert(reason, "danger")}) - } - }, [serv]); - - useEffect(() => { - EventsOn("onServerExit", (id) => { - if (id === serv.id) { - console.log("server stopped") - setServerStatus(false) - } - }) - return () => EventsOff("onServerExit") - }, []); - useEffect(() => { - EventsOn("onServerStart", (id) => { - if (id === serv.id) { - console.log("server started") - setServerStatus(true) - } - }) - return () => EventsOff("onServerStart") - }, []); - useEffect(() => { - EventsOn("RestartServer", (id) => { - StartServer(id).catch((err) => {addAlert(err, "danger"); console.error(err)}).then(() => setTimeout(function () { - GetServerStatus(id).catch((reason) => {console.error("serverstatus: " + reason); addAlert(reason, "danger")}).then((s) => { - if (typeof s === "boolean") { - setServerStatus(s) - } - }) - }, 200)) - }) - return () => EventsOff("RestartServer") - }, []); - - useEffect(() => { - if (serv.id >= 0) { - refreshServerStatus() - } - }, [serv]); - - useEffect(() => { - EventsOn("reloadServers", () => { - if (id !== undefined) { - GetServer(id).then((s) => {setServ(s)}).catch((reason) => console.error(reason)) - } - }) - return () => EventsOff("reloadServers") - }, []); - - //endregion - - function onServerStartButtonClicked() { - - if (serv.serverPath == "") { - addAlert("Server Path must be set to a path", "warning") - return - } - - if (serv.disableUpdateOnStart) { - startServer() - } else { - setUpdaterModalOpen(true) - InstallUpdateVerify(serv.serverPath).catch((err) => { - addAlert("failed installing: " + err.message, "danger"); - setUpdaterModalOpen(false); - console.error(err); - }).then(() => { - setUpdaterModalOpen(false); - startServer() - }) - } - + useEffect(() => { + //check if gus is placeholder + if (Object.keys(gus).length === 1 && Object.keys(gus)[0] === "unknown") { + return; } - function startServer() { - StartServer(serv.id).catch((err) => {addAlert(err, "danger"); console.error(err)}).then(() => setTimeout(function () { - setServerStatus(true) - //refreshServerStatus() - }, 200)) - } + //update gus with new values + SaveGusFromMap(serv.id, gus).catch((reason) => console.error(reason)); + }, [gus]); - function onServerStopButtonClicked() { - addAlert("Stopping server...", "neutral") - StopServer(serv.id).then(() => {addAlert("Stopped server", "success"); setServerStatus(false)}).catch((err) => addAlert("error stopping server: " + err, "danger")); + useEffect(() => { + if (serv.id >= 0) { + CheckServerInstalled(serv.id) + .then((val) => setIsInstalled(val)) + .catch((reason) => console.error(reason)); } + }, [serv]); - function onServerForceStopButtonClicked() { - ForceStopServer(serv.id).catch((err) => {addAlert(err, "danger"); console.error(err)}).then(() => setServerStatus(false)) + useEffect(() => { + if (id !== undefined) { + GetServer(id) + .then((s) => { + setServ(s); + }) + .catch((reason) => console.error(reason)); } - - function refreshServerStatus() { - GetServerStatus(serv.id).catch((reason) => {console.error("serverstatus: " + reason); addAlert(reason, "danger")}).then((s) => { - if (typeof s === "boolean") { - setServerStatus(s) - } + }, [id]); + + useEffect(() => { + if (serv.id >= 0) { + SaveServer(serv).catch((reason) => { + console.error(reason); + addAlert(reason, "danger"); + }); + } + }, [serv]); + + useEffect(() => { + EventsOn("onServerExit", (id) => { + if (id === serv.id) { + console.log("server stopped"); + setServerStatus(false); + } + }); + return () => EventsOff("onServerExit"); + }, []); + useEffect(() => { + EventsOn("onServerStart", (id) => { + if (id === serv.id) { + console.log("server started"); + setServerStatus(true); + } + }); + return () => EventsOff("onServerStart"); + }, []); + useEffect(() => { + EventsOn("RestartServer", (id) => { + StartServer(id) + .catch((err) => { + addAlert(err, "danger"); + console.error(err); }) + .then(() => + setTimeout(function () { + GetServerStatus(id) + .catch((reason) => { + console.error("serverstatus: " + reason); + addAlert(reason, "danger"); + }) + .then((s) => { + if (typeof s === "boolean") { + setServerStatus(s); + } + }); + }, 200), + ); + }); + return () => EventsOff("RestartServer"); + }, []); + useEffect(() => { + if (serv.id >= 0) { + refreshServerStatus(); + } + }, [serv]); + + useEffect(() => { + EventsOn("reloadServers", () => { + if (id !== undefined) { + GetServer(id) + .then((s) => { + setServ(s); + }) + .catch((reason) => console.error(reason)); + } + }); + return () => EventsOff("reloadServers"); + }, []); + + //endregion + + function onServerStartButtonClicked() { + if (serv.serverPath == "") { + addAlert("Server Path must be set to a path", "warning"); + return; } - if (id !== undefined) { - return ( - - {isInstalled? ( -
-
- setServ((p) => ({ ...p, serverAlias: e.target.value /*, convertValues: p.convertValues*/ }))}/> - - BrowserOpenURL("file:///" + serv.serverPath)}> - - - {GetGusAsMap(serv.id).then((val) => setGus(val)).catch((reason) => console.error(reason))}}> - -
- - -
- - - - - - - setUpdaterModalOpen(false)}> - setForceStopModalOpen(false)}> - - - - Confirmation - - - - Are you sure you want to forcefully stop the server? No save action will be performed! - - - - - - - - setStartModalOpen(false)}> - - - - Confirmation - - - - Are you sure you want to start the server? This action will overwrite ini files in the server directory!
-
- - - - - - - -
-
-
-
- - Console - General Settings - Mods - Ini configuration - Administration - - - - - - CheckServerInstalled(serv.id).then((val) => setIsInstalled(val)).catch((reason) => console.error(reason))}/> -
) : ( setIsInstalled(true)}/>)} -
- ); + if (serv.disableUpdateOnStart) { + startServer(); } else { - return ( - - -
-

No server found/selected

-
-
-
- ); + setUpdaterModalOpen(true); + InstallUpdateVerify(serv.serverPath) + .catch((err) => { + addAlert("failed installing: " + err.message, "danger"); + setUpdaterModalOpen(false); + console.error(err); + }) + .then(() => { + setUpdaterModalOpen(false); + startServer(); + }); } + } + + function startServer() { + StartServer(serv.id) + .catch((err) => { + addAlert(err, "danger"); + console.error(err); + }) + .then(() => + setTimeout(function () { + setServerStatus(true); + //refreshServerStatus() + }, 200), + ); + } + + function onServerStopButtonClicked() { + addAlert("Stopping server...", "neutral"); + StopServer(serv.id) + .then(() => { + addAlert("Stopped server", "success"); + setServerStatus(false); + }) + .catch((err) => addAlert("error stopping server: " + err, "danger")); + } + + function onServerForceStopButtonClicked() { + ForceStopServer(serv.id) + .catch((err) => { + addAlert(err, "danger"); + console.error(err); + }) + .then(() => setServerStatus(false)); + } + + function refreshServerStatus() { + GetServerStatus(serv.id) + .catch((reason) => { + console.error("serverstatus: " + reason); + addAlert(reason, "danger"); + }) + .then((s) => { + if (typeof s === "boolean") { + setServerStatus(s); + } + }); + } + + if (id !== undefined) { + return ( + + {isInstalled ? ( + +
+
+ + setServ((p) => ({ + ...p, + serverAlias: + e.target.value /*, convertValues: p.convertValues*/, + })) + } + /> + + BrowserOpenURL("file:///" + serv.serverPath)} + > + + + + + { + GetGusAsMap(serv.id) + .then((val) => setGus(val)) + .catch((reason) => console.error(reason)); + }} + > + + + +
+ +
+ + + + + + + setUpdaterModalOpen(false)} + > + setForceStopModalOpen(false)} + > + + + + Confirmation + + + + Are you sure you want to forcefully stop the server? No + save action will be performed! + + + + + + + + setStartModalOpen(false)} + > + + + + Confirmation + + + + Are you sure you want to start the server? This action + will overwrite ini files in the server directory! +
+
+ + + + + + +
+
+
+
+ + + Console + + + General Settings + + + Mods + + + Ini configuration + + + Administration + + + + + + + + CheckServerInstalled(serv.id) + .then((val) => setIsInstalled(val)) + .catch((reason) => console.error(reason)) + } + /> +
+ ) : ( + setIsInstalled(true)} + /> + )} +
+ ); + } else { + return ( + + +
+

No server found/selected

+
+
+
+ ); + } }; diff --git a/frontend/src/pages/UpdaterModal.tsx b/frontend/src/pages/UpdaterModal.tsx index 0bb8f56..1683de5 100644 --- a/frontend/src/pages/UpdaterModal.tsx +++ b/frontend/src/pages/UpdaterModal.tsx @@ -1,55 +1,66 @@ -import {Button, Divider, LinearProgress, Modal, ModalClose, ModalDialog, Typography} from "@mui/joy"; -import React, {useEffect, useState} from "react"; -import {server} from "../../wailsjs/go/models"; -import {useAlert} from "../components/AlertProvider"; -import {EventsOn} from "../../wailsjs/runtime"; - +import { + Button, + Divider, + LinearProgress, + Modal, + ModalClose, + ModalDialog, + Typography, +} from "@mui/joy"; +import React, { useEffect, useState } from "react"; +import { server } from "../../wailsjs/go/models"; +import { useAlert } from "../components/AlertProvider"; +import { EventsOn } from "../../wailsjs/runtime"; type Props = { - onCompleted?: () => void; - open: boolean; - onClose?: () => void; -} - -export function UpdaterModal({onCompleted, open, onClose}: Props) { + onCompleted?: () => void; + open: boolean; + onClose?: () => void; +}; - const [action, setAction] = useState("Preparing") - const [progress, setProgress] = useState(0.00) - const [isCompleted, setIsCompleted] = useState(false) +export function UpdaterModal({ onCompleted, open, onClose }: Props) { + const [action, setAction] = useState("Preparing"); + const [progress, setProgress] = useState(0.0); + const [isCompleted, setIsCompleted] = useState(false); - useEffect(() => { - EventsOn("installingUpdateAction", (data) => {setAction(data);}) - EventsOn("installingUpdateProgress", (data) => {setProgress(data);}) - EventsOn("appInstalled", (i) => {setIsCompleted(true); setAction("Preparing"); setProgress(0.00)}) - }, []); + useEffect(() => { + EventsOn("installingUpdateAction", (data) => { + setAction(data); + }); + EventsOn("installingUpdateProgress", (data) => { + setProgress(data); + }); + EventsOn("appInstalled", (i) => { + setIsCompleted(true); + setAction("Preparing"); + setProgress(0.0); + }); + }, []); - useEffect(() => { - if (isCompleted && onCompleted) { - onCompleted() + useEffect(() => { + if (isCompleted && onCompleted) { + onCompleted(); + } + }, [isCompleted]); - } - }, [isCompleted]); - - return ( - - - - Updating server... - - - The server will start automatically after the update - - - - Status: {action} - - - Progress: - -
- -
-
-
- ); -} \ No newline at end of file + return ( + + + Updating server... + + The server will start automatically after the update + + + + Status: {action} + + + Progress: + +
+ +
+
+
+ ); +} diff --git a/frontend/src/pages/server/Administration.tsx b/frontend/src/pages/server/Administration.tsx index 431f871..529b090 100644 --- a/frontend/src/pages/server/Administration.tsx +++ b/frontend/src/pages/server/Administration.tsx @@ -1,239 +1,376 @@ import { - Button, - Card, Checkbox, DialogActions, - DialogContent, - DialogTitle, - Divider, - FormLabel, - Input, Modal, - ModalDialog, - TabPanel, Tooltip, - Typography + Button, + Card, + Checkbox, + DialogActions, + DialogContent, + DialogTitle, + Divider, + FormLabel, + Input, + Modal, + ModalDialog, + TabPanel, + Tooltip, + Typography, } from "@mui/joy"; -import React, {useEffect, useState} from "react"; +import React, { useEffect, useState } from "react"; import { - DeleteProfile, - DeleteServerFiles, GetAllServersFromDir, - GetServerConfigFile, - GetServerStartupCommand, SaveServerConfigFile + DeleteProfile, + DeleteServerFiles, + GetAllServersFromDir, + GetServerConfigFile, + GetServerStartupCommand, + SaveServerConfigFile, } from "../../../wailsjs/go/server/ServerController"; -import {server} from "../../../wailsjs/go/models"; -import {useAlert} from "../../components/AlertProvider"; -import {IconAlertCircleFilled, IconInfoCircle} from "@tabler/icons-react"; -import MonacoEditor from 'react-monaco-editor'; +import { server } from "../../../wailsjs/go/models"; +import { useAlert } from "../../components/AlertProvider"; +import { IconAlertCircleFilled, IconInfoCircle } from "@tabler/icons-react"; +import MonacoEditor from "react-monaco-editor"; import config from "tailwindcss/defaultConfig"; -import {LogDebug} from "../../../wailsjs/runtime"; - +import { LogDebug } from "../../../wailsjs/runtime"; type Props = { - setServ: React.Dispatch> - serv: server.Server; - onServerFilesDeleted: () => void; - + setServ: React.Dispatch>; + serv: server.Server; + onServerFilesDeleted: () => void; +}; + +function ServerAdministrationCard({ + setServ, + serv, + onServerFilesDeleted, +}: { + setServ: React.Dispatch>; + serv: server.Server; + onServerFilesDeleted: () => void; +}) { + const [deleteServerFilesModalOpen, setDeleteServerFilesModalOpen] = + useState(false); + const [deleteProfileModalOpen, setDeleteProfileModalOpen] = useState(false); + const [deleteEverythingModalOpen, setDeleteEverythingModalOpen] = + useState(false); + + const { addAlert } = useAlert(); + + function onDeleteServerFilesButtonClicked() { + DeleteServerFiles(serv.id) + .then(() => { + addAlert("Deleted server files", "success"); + setServ(serv); + onServerFilesDeleted(); + }) + .catch((err) => { + console.error(err); + addAlert(err, "danger"); + }); + } + + function onDeleteProfileButtonClicked() { + DeleteProfile(serv.id) + .then(() => { + addAlert("Deleted profile", "success"); + location.reload(); + }) + .catch((err) => { + console.error(err); + addAlert(err, "danger"); + }); + } + + function onDeleteEverythingButtonClicked() { + DeleteServerFiles(serv.id) + .then(() => DeleteProfile(serv.id)) + .then(() => { + addAlert("Deleted everything", "success"); + location.reload(); + }) + .catch((err) => { + console.error(err); + addAlert(err, "danger"); + }); + } + + return ( + + Server Administration + + +
+
+ setDeleteServerFilesModalOpen(false)} + > + + + + Confirmation + + + + Are you sure you want to delete the server files? You cannot + reverse this action! + + + + + + + + +
+
+ setDeleteProfileModalOpen(false)} + > + + + + Confirmation + + + + Are you sure you want to delete the profile? You cannot reverse + this action! + + + + + + + + +
+
+ setDeleteEverythingModalOpen(false)} + > + + + + Confirmation + + + + Are you sure you want to delete everything? You cannot reverse + this action! + + + + + + + + +
+
+
+ ); } -function ServerAdministrationCard({setServ, serv, onServerFilesDeleted}: {setServ: React.Dispatch>, serv: server.Server, onServerFilesDeleted: () => void}) { - - const [deleteServerFilesModalOpen, setDeleteServerFilesModalOpen] = useState(false) - const [deleteProfileModalOpen, setDeleteProfileModalOpen] = useState(false) - const [deleteEverythingModalOpen, setDeleteEverythingModalOpen] = useState(false) - - const {addAlert} = useAlert(); - - function onDeleteServerFilesButtonClicked() { - DeleteServerFiles(serv.id).then(() => {addAlert("Deleted server files", "success"); setServ(serv); onServerFilesDeleted()}).catch((err) => {console.error(err); addAlert(err, "danger")}) - } - - function onDeleteProfileButtonClicked() { - DeleteProfile(serv.id).then(() => {addAlert("Deleted profile", "success"); location.reload()}).catch((err) => {console.error(err); addAlert(err, "danger")}) - } - - function onDeleteEverythingButtonClicked() { - DeleteServerFiles(serv.id).then(() => DeleteProfile(serv.id)).then(() => {addAlert("Deleted everything", "success"); location.reload()}).catch((err) => {console.error(err); addAlert(err, "danger")}) - } - - - - return +function ServerStartupCard({ + setServ, + serv, +}: { + setServ: React.Dispatch>; + serv: server.Server; +}) { + const [showServerCommandModalOpen, setShowServerCommandModalOpen] = + useState(false); + const [serverCommand, setServerCommand] = useState(""); + + const { addAlert } = useAlert(); + + return ( + +
+ Server startup - Server Administration - - - -
-
- setDeleteServerFilesModalOpen(false)}> - - - - Confirmation - - - - Are you sure you want to delete the server files? You cannot reverse this action! - - - - - - - - -
+
- setDeleteProfileModalOpen(false)}> - - - - Confirmation - - - - Are you sure you want to delete the profile? You cannot reverse this action! - - - - - - - - -
-
- setDeleteEverythingModalOpen(false)}> - - - - Confirmation - - - - Are you sure you want to delete everything? You cannot reverse this action! - - - - - - - - + setShowServerCommandModalOpen(false)} + > + + + + Server startup command + + + {serverCommand} + + + + + + +
+
+ +
+ + +
+
+ + setServ((p) => ({ + ...p, + disableUpdateOnStart: e.target.checked, + })) + } + /> +
+ + setServ((p) => ({ + ...p, + useAsaAPI: e.target.checked, + })) + } + /> +
+ {/* setServ((p) => ({ ...p, restartOnServerQuit: e.target.checked }))} />*/} + + setServ((p) => ({ + ...p, + startWithApplication: e.target.checked, + })) + } + /> +
+ + + Custom server "dash" arguments (only use args like: + -EnableIdlePlayerKick -ForceAllowCaveFlyers) + + + setServ((p) => ({ + ...p, + extraDashArgs: e.target.value, + })) + } + > + + Custom server "questionmark" arguments (only use args like: + ?PreventSpawnAnimations=true?PreventTribeAlliances=true) + + + setServ((p) => ({ + ...p, + extraQuestionmarkArguments: e.target.value, + })) + } + >
- ; -} - -function ServerStartupCard({setServ, serv}: {setServ: React.Dispatch>, serv: server.Server}) { - - const [showServerCommandModalOpen, setShowServerCommandModalOpen] = useState(false) - const [serverCommand, setServerCommand] = useState(""); - - const {addAlert} = useAlert(); - - return ( - -
- - Server startup - - -
-
- setShowServerCommandModalOpen(false)}> - - - - Server startup command - - - - {serverCommand} - - - - - - - - -
-
-
-
- - -
-
- setServ((p) => ({ - ...p, - disableUpdateOnStart: e.target.checked - }))}/>
- setServ((p) => ({ - ...p, - useAsaAPI: e.target.checked - }))}/>
- {/* setServ((p) => ({ ...p, restartOnServerQuit: e.target.checked }))} />*/} - setServ((p) => ({ - ...p, - startWithApplication: e.target.checked - }))}/>
- - Custom server "dash" arguments (only use args like: -EnableIdlePlayerKick - -ForceAllowCaveFlyers) - setServ((p) => ({ - ...p, - extraDashArgs: e.target.value - }))}> - Custom server "questionmark" arguments (only use args like: - ?PreventSpawnAnimations=true?PreventTribeAlliances=true) - setServ((p) => ({ - ...p, - extraQuestionmarkArguments: e.target.value - }))}> -
-
-
- ) +
+ + ); } -function ExtraSettingsCard({setServ, serv}: {setServ: React.Dispatch>, serv: server.Server}) { - return ( - - - Extra Settings - - - -
-
- {/* +function ExtraSettingsCard({ + setServ, + serv, +}: { + setServ: React.Dispatch>; + serv: server.Server; +}) { + return ( + + Extra Settings + + +
+
+ {/* setServ((p) => ({ ...p, @@ -241,89 +378,116 @@ function ExtraSettingsCard({setServ, serv}: {setServ: React.Dispatch
*/} - - setServ((p) => ({ - ...p, - discordWebHookEnabled: e.target.checked - }))}/> - - - - Discord webhook url - setServ((p) => ({ - ...p, - discordWebHook: e.target.value - }))}> - - - - -
-
-
- ) + + + setServ((p) => ({ + ...p, + discordWebHookEnabled: e.target.checked, + })) + } + /> + + + + Discord webhook url + + setServ((p) => ({ + ...p, + discordWebHook: e.target.value, + })) + } + > + + +
+
+
+ ); } -function ManualConfigEditorCard({setServ, serv}: {setServ: React.Dispatch>, serv: server.Server}) { - const [content, setContent] = useState("") - - const {addAlert} = useAlert(); - - const getServerConfigFile = () => { - GetServerConfigFile(serv.id).then((config) => { - setContent(config); - }).catch((err) => {console.error(err); addAlert(err, "danger")}) - } - - useEffect(() => { - getServerConfigFile() - }, []); - - useEffect(() => { - return () => { - setTimeout(getServerConfigFile, 50); - } - }, [serv]); - - - const handleEditorChange = (value: string) => { - setContent(value); +function ManualConfigEditorCard({ + setServ, + serv, +}: { + setServ: React.Dispatch>; + serv: server.Server; +}) { + const [content, setContent] = useState(""); + + const { addAlert } = useAlert(); + + const getServerConfigFile = () => { + GetServerConfigFile(serv.id) + .then((config) => { + setContent(config); + }) + .catch((err) => { + console.error(err); + addAlert(err, "danger"); + }); + }; + + useEffect(() => { + getServerConfigFile(); + }, []); + + useEffect(() => { + return () => { + setTimeout(getServerConfigFile, 50); }; - - const onSaveConfigButtonClicked = () => { - SaveServerConfigFile(content, serv.id).then(() => {}).catch((err) => {console.error(err); addAlert(err, "danger")}) - location.reload(); - } - - return ( - - - Edit Config manually - - -
- - -
-
- ) + }, [serv]); + + const handleEditorChange = (value: string) => { + setContent(value); + }; + + const onSaveConfigButtonClicked = () => { + SaveServerConfigFile(content, serv.id) + .then(() => {}) + .catch((err) => { + console.error(err); + addAlert(err, "danger"); + }); + location.reload(); + }; + + return ( + + Edit Config manually + +
+ + +
+
+ ); } -export function Administration({setServ, serv, onServerFilesDeleted}: Props) { - return ( - - - - - - - ); -} \ No newline at end of file +export function Administration({ setServ, serv, onServerFilesDeleted }: Props) { + return ( + + + + + + + ); +} diff --git a/frontend/src/pages/server/Console.tsx b/frontend/src/pages/server/Console.tsx index a7122a4..a956b39 100644 --- a/frontend/src/pages/server/Console.tsx +++ b/frontend/src/pages/server/Console.tsx @@ -1,163 +1,215 @@ -import {Button, IconButton, Input, TabPanel, Tooltip, Card} from "@mui/joy"; +import { Button, IconButton, Input, TabPanel, Tooltip, Card } from "@mui/joy"; import React, { useEffect, useRef, useState } from "react"; import { server } from "../../../wailsjs/go/models"; import { SendRconCommand } from "../../../wailsjs/go/helpers/HelpersController"; -import {IconEraser, IconSend} from "@tabler/icons-react"; +import { IconEraser, IconSend } from "@tabler/icons-react"; type Message = { - text: string; - sender: string; + text: string; + sender: string; }; type Props = { - setServ: React.Dispatch>; - serv: server.Server; - serverStatus: boolean; + setServ: React.Dispatch>; + serv: server.Server; + serverStatus: boolean; }; -function ConsoleCard({setServ, serv, serverStatus, input, messages, terminalRef, setInput, setMessages, writeAndDoRconCommand}: Props & { - input: string; - messages: Message[]; - terminalRef: React.RefObject; - setInput: React.Dispatch>; - setMessages: React.Dispatch>; - writeAndDoRconCommand: (text: string) => void; +function ConsoleCard({ + setServ, + serv, + serverStatus, + input, + messages, + terminalRef, + setInput, + setMessages, + writeAndDoRconCommand, +}: Props & { + input: string; + messages: Message[]; + terminalRef: React.RefObject; + setInput: React.Dispatch>; + setMessages: React.Dispatch>; + writeAndDoRconCommand: (text: string) => void; }) { - - return ( - -
- {messages.map((message, index) => ( -
- {message.sender === "server" ? ( - {message.text}
- ) : ( - - [{message.sender}]{" "} - $ {message.text}
-
- )} -
- ))} -
- setInput(e.target.value)} - startDecorator={$} - endDecorator={ - - - { - writeAndDoRconCommand(input); - }} - className={"m-1"} - > - - - - - { - setMessages([]) - }} - className={"m-1"}> - - - - - } - onKeyPress={(e) => { - if (e.key === "Enter") { - writeAndDoRconCommand(input); - } + return ( + +
+ {messages.map((message, index) => ( +
+ {message.sender === "server" ? ( + + {message.text} +
+
+ ) : ( + + [{message.sender}]{" "} + $ {message.text} +
+
+ )} +
+ ))} +
+ setInput(e.target.value)} + startDecorator={$} + endDecorator={ + + + { + writeAndDoRconCommand(input); }} - > -
- ); + className={"m-1"} + > + + + + + { + setMessages([]); + }} + className={"m-1"} + > + + + + + } + onKeyPress={(e) => { + if (e.key === "Enter") { + writeAndDoRconCommand(input); + } + }} + > +
+ ); } -function CommandCard({setServ, serv, serverStatus, writeAndDoRconCommand}: Props & {writeAndDoRconCommand: (text: string) => void;}) { - return ( - -
-
- -
-
- -
-
-
- ); +function CommandCard({ + setServ, + serv, + serverStatus, + writeAndDoRconCommand, +}: Props & { writeAndDoRconCommand: (text: string) => void }) { + return ( + +
+
+ +
+
+ +
+
+
+ ); } -export function Console({setServ, serv, serverStatus}: Props) { - const [input, setInput] = useState(""); - const [messages, setMessages] = useState(() => { - const storedMessages = localStorage.getItem('consoleMessages'); - return storedMessages ? JSON.parse(storedMessages) : []; - }); +export function Console({ setServ, serv, serverStatus }: Props) { + const [input, setInput] = useState(""); + const [messages, setMessages] = useState(() => { + const storedMessages = localStorage.getItem("consoleMessages"); + return storedMessages ? JSON.parse(storedMessages) : []; + }); - const terminalRef = useRef(null); - - const writeToConsole = (text: string, sender: string = "user") => { - const newMessage: Message = { text, sender }; - setMessages((prevMessages) => [...prevMessages, newMessage]); - }; - const doRconCommand = (text: string) => { - SendRconCommand(text, serv.ipAddress, serv.rconPort, serv.adminPassword) - .then((resp) => writeToConsole(resp, "server")) - .catch((err) => writeToConsole("error sending command: " + err, "server")); - }; - - const writeAndDoRconCommand = (text: string) => { - writeToConsole(text); - doRconCommand(text); - setInput(""); - } + const terminalRef = useRef(null); - useEffect(() => { - localStorage.setItem('consoleMessages', JSON.stringify(messages)); - }, [messages]); + const writeToConsole = (text: string, sender: string = "user") => { + const newMessage: Message = { text, sender }; + setMessages((prevMessages) => [...prevMessages, newMessage]); + }; + const doRconCommand = (text: string) => { + SendRconCommand(text, serv.ipAddress, serv.rconPort, serv.adminPassword) + .then((resp) => writeToConsole(resp, "server")) + .catch((err) => + writeToConsole("error sending command: " + err, "server"), + ); + }; - useEffect(() => { - if (terminalRef.current) { - terminalRef.current.scrollTop = terminalRef.current.scrollHeight; - } - }, [messages]); + const writeAndDoRconCommand = (text: string) => { + writeToConsole(text); + doRconCommand(text); + setInput(""); + }; - useEffect(() => { - if (!serverStatus) { - setMessages([]) - } - }, [serverStatus]); + useEffect(() => { + localStorage.setItem("consoleMessages", JSON.stringify(messages)); + }, [messages]); - useEffect(() => { - setMessages([]) - }, [serv.id]); + useEffect(() => { + if (terminalRef.current) { + terminalRef.current.scrollTop = terminalRef.current.scrollHeight; + } + }, [messages]); - if (serverStatus) { - return ( - - - - - ); - } else { - return ( - -
-

Server is not running

-
-
- ); + useEffect(() => { + if (!serverStatus) { + setMessages([]); } -} \ No newline at end of file + }, [serverStatus]); + + useEffect(() => { + setMessages([]); + }, [serv.id]); + + if (serverStatus) { + return ( + + + + + ); + } else { + return ( + +
+

Server is not running

+
+
+ ); + } +} diff --git a/frontend/src/pages/server/General.tsx b/frontend/src/pages/server/General.tsx index 08b7164..0832b18 100644 --- a/frontend/src/pages/server/General.tsx +++ b/frontend/src/pages/server/General.tsx @@ -1,270 +1,357 @@ import { - Card, - Divider, - FormLabel, - Input, - Select, - TabPanel, - Typography, - Option, Autocomplete, Textarea, Tooltip, Checkbox, + Card, + Divider, + FormLabel, + Input, + Select, + TabPanel, + Typography, + Option, + Autocomplete, + Textarea, + Tooltip, + Checkbox, } from "@mui/joy"; -import {server} from "../../../wailsjs/go/models"; -import React, {useEffect, useState} from "react"; +import { server } from "../../../wailsjs/go/models"; +import React, { useEffect, useState } from "react"; import { - GetGusAsMap, - GetNetworkInterfacesIp, - GetValueFromGus, SaveGusFromMap, - UpdateValueInGus + GetGusAsMap, + GetNetworkInterfacesIp, + GetValueFromGus, + SaveGusFromMap, + UpdateValueInGus, } from "../../../wailsjs/go/server/ServerController"; -import {PasswordInput} from "../../components/PasswordInput"; -import {Slider} from "../../components/Slider"; -import {useAlert} from "../../components/AlertProvider"; -import {EventsOn} from "../../../wailsjs/runtime"; +import { PasswordInput } from "../../components/PasswordInput"; +import { Slider } from "../../components/Slider"; +import { useAlert } from "../../components/AlertProvider"; +import { EventsOn } from "../../../wailsjs/runtime"; type Props = { - setServ: React.Dispatch> - serv: server.Server; - setGus: React.Dispatch}}>> - gus: {[key: string]: {[key: string]: Array}} - -} + setServ: React.Dispatch>; + serv: server.Server; + setGus: React.Dispatch< + React.SetStateAction<{ [key: string]: { [key: string]: Array } }> + >; + gus: { [key: string]: { [key: string]: Array } }; +}; function GeneralSettings({ setServ, serv, setGus, gus }: Props) { + const { addAlert } = useAlert(); - - const {addAlert} = useAlert() - - if (gus === undefined || Object.keys(gus).length === 1 && Object.keys(gus)[0] === "unknown") { - return ( - - - Loading... - - - - ) - } else { - return ( - - - Server Name and Passwords - - -
-
- Server Name: - setServ((p) => ({ ...p, serverName: e.target.value }))} > -
-
- Server Password: - setServ((p) => ({ ...p, serverPassword: e.target.value }))} > -
-
- Admin Password: - setServ((p) => ({ ...p, adminPassword: e.target.value }))} > -
-
- Spectator Password: - setServ((p) => ({ ...p, spectatorPassword: e.target.value }))} > -
-
- - Server Map - - -
-
- Map Name of Mod Map path: - setServ((p) => ({ ...p, serverMap: v }))} > -
-
- - Auto Save - - -
-
- Auto Save interval: - - { - setGus((p) => { - const newState = {...p}; - newState["ServerSettings"].AutoSavePeriodMinutes[0] = v.toString(); - return newState; - }) - }} - /> - - -
-
- - Message of the Day - - -
-
- Message - -
-
- Duration: - - { - if (v >= 0) { - setGus((p) => { - const newState = {...p}; - newState["MessageOfTheDay"].Duration[0] = v.toString(); - return newState; - }) - } - }} - /> - - -
-
- - Server Settings - - -
-
-
- Max Players: - { - if (v >= 0) { - setServ((p) => { - const newState = {...p}; - newState.maxPlayers = v; - return newState; - }) - } - }} - /> -
-
- - setServ((p) => ({ ...p, kickIdlePlayers: e.target.checked }))}/> Kick Idle Players Period: - - { - if (v >= 0) { - setGus((p) => { - const newState = {...p}; - newState["ServerSettings"].KickIdlePlayersPeriod[0] = v.toString(); - return newState; - }); - } - }} - /> - -
-
-
-
- ) - } - - + if ( + gus === undefined || + (Object.keys(gus).length === 1 && Object.keys(gus)[0] === "unknown") + ) { + return ( + + Loading... + + + ); + } else { + return ( + + Server Name and Passwords + +
+
+ Server Name: + + setServ((p) => ({ ...p, serverName: e.target.value })) + } + > +
+
+ Server Password: + + setServ((p) => ({ ...p, serverPassword: e.target.value })) + } + > +
+
+ Admin Password: + + setServ((p) => ({ ...p, adminPassword: e.target.value })) + } + > +
+
+ Spectator Password: + + setServ((p) => ({ ...p, spectatorPassword: e.target.value })) + } + > +
+
+ Server Map + +
+
+ Map Name of Mod Map path: + setServ((p) => ({ ...p, serverMap: v }))} + > +
+
+ Auto Save + +
+
+ Auto Save interval: + + { + setGus((p) => { + const newState = { ...p }; + newState["ServerSettings"].AutoSavePeriodMinutes[0] = + v.toString(); + return newState; + }); + }} + /> + +
+
+ Message of the Day + +
+
+ Message + +
+
+ Duration: + + { + if (v >= 0) { + setGus((p) => { + const newState = { ...p }; + newState["MessageOfTheDay"].Duration[0] = v.toString(); + return newState; + }); + } + }} + /> + +
+
+ Server Settings + +
+
+
+ Max Players: + { + if (v >= 0) { + setServ((p) => { + const newState = { ...p }; + newState.maxPlayers = v; + return newState; + }); + } + }} + /> +
+
+ + + {" "} + + setServ((p) => ({ + ...p, + kickIdlePlayers: e.target.checked, + })) + } + />{" "} + Kick Idle Players Period: + + + { + if (v >= 0) { + setGus((p) => { + const newState = { ...p }; + newState["ServerSettings"].KickIdlePlayersPeriod[0] = + v.toString(); + return newState; + }); + } + }} + /> +
+
+
+
+ ); + } } -function NetworkingCard({ setServ, serv }: {setServ: React.Dispatch>, serv: server.Server}) { - - const defInter: {[p: string]: string} = { - "none": "" - } - - - const [interfaces, setInterfaces] = useState<{[p: string]: string}>(defInter) - - const interfaceEntries = Object.entries(interfaces); +function NetworkingCard({ + setServ, + serv, +}: { + setServ: React.Dispatch>; + serv: server.Server; +}) { + const defInter: { [p: string]: string } = { + none: "", + }; + const [interfaces, setInterfaces] = useState<{ [p: string]: string }>( + defInter, + ); - const interfaceElements = interfaceEntries.map(([key, value], index) => ( - - )); + const interfaceEntries = Object.entries(interfaces); - useEffect(() => { - GetNetworkInterfacesIp().then((val) => setInterfaces(val)).catch((reason) => console.error(reason)) + const interfaceElements = interfaceEntries.map(([key, value], index) => ( + + )); - }, []); + useEffect(() => { + GetNetworkInterfacesIp() + .then((val) => setInterfaces(val)) + .catch((reason) => console.error(reason)); + }, []); - return ( - - - Networking - - - IP Address: - - Ports: -
-
- Server Port: - (parseInt(e.target.value) >= 1 && parseInt(e.target.value) <= 65535) ? setServ((p) => ({ ...p, serverPort: parseInt(e.target.value), peerPort: parseInt(e.target.value) + 1})) : null} > -
-
- Peer Port: - -
-
- Query Port: - (parseInt(e.target.value) >= 1 && parseInt(e.target.value) <= 65535) ? setServ((p) => ({ ...p, queryPort: parseInt(e.target.value)})) : null}> -
-
- RCON Port: - (parseInt(e.target.value) >= 1 && parseInt(e.target.value) <= 65535) ? setServ((p) => ({ ...p, rconPort: parseInt(e.target.value)})) : null} type={'number'}> -
-
-
- ) + return ( + + Networking + + IP Address: + + Ports: +
+
+ Server Port: + + parseInt(e.target.value) >= 1 && parseInt(e.target.value) <= 65535 + ? setServ((p) => ({ + ...p, + serverPort: parseInt(e.target.value), + peerPort: parseInt(e.target.value) + 1, + })) + : null + } + > +
+
+ Peer Port: + +
+
+ Query Port: + + parseInt(e.target.value) >= 1 && parseInt(e.target.value) <= 65535 + ? setServ((p) => ({ + ...p, + queryPort: parseInt(e.target.value), + })) + : null + } + > +
+
+ RCON Port: + + parseInt(e.target.value) >= 1 && parseInt(e.target.value) <= 65535 + ? setServ((p) => ({ ...p, rconPort: parseInt(e.target.value) })) + : null + } + type={"number"} + > +
+
+
+ ); } - export function General(props: Props) { - return ( - - - - - ); -} \ No newline at end of file + return ( + + + + + ); +} diff --git a/frontend/src/pages/server/Ini.tsx b/frontend/src/pages/server/Ini.tsx index 5899329..a35fa86 100644 --- a/frontend/src/pages/server/Ini.tsx +++ b/frontend/src/pages/server/Ini.tsx @@ -1,24 +1,32 @@ -import { Button, Card, Textarea, FormLabel, TabPanel, Tooltip, Input, Typography, Accordion, AccordionDetails, AccordionGroup, AccordionSummary } from '@mui/joy'; -import { server } from '../../../wailsjs/go/models'; -import { Slider } from '../../components/Slider'; -import React from 'react'; +import { + Button, + Card, + Textarea, + FormLabel, + TabPanel, + Tooltip, + Input, + Typography, + Accordion, + AccordionDetails, + AccordionGroup, + AccordionSummary, +} from "@mui/joy"; +import { server } from "../../../wailsjs/go/models"; +import { Slider } from "../../components/Slider"; +import React from "react"; -import {useAlert} from "../../components/AlertProvider"; -import {OpenFileDialog} from "../../../wailsjs/go/helpers/HelpersController"; +import { useAlert } from "../../components/AlertProvider"; +import { OpenFileDialog } from "../../../wailsjs/go/helpers/HelpersController"; type Props = { - setServ: React.Dispatch>; - serv: server.Server; + setServ: React.Dispatch>; + serv: server.Server; }; - - - export function Ini({ setServ, serv }: Props) { - return ( - - Not implemented yet, use manual configuration trough ini files for now. - - ); + return ( + + Not implemented yet, use manual configuration trough ini files for now. + + ); } diff --git a/frontend/src/pages/server/Mods.tsx b/frontend/src/pages/server/Mods.tsx index 2c5cef5..08f056a 100644 --- a/frontend/src/pages/server/Mods.tsx +++ b/frontend/src/pages/server/Mods.tsx @@ -1,34 +1,46 @@ import React from "react"; -import {server} from "../../../wailsjs/go/models"; +import { server } from "../../../wailsjs/go/models"; import { - Card, - Divider, FormLabel, Input, - TabPanel, - Typography + Card, + Divider, + FormLabel, + Input, + TabPanel, + Typography, } from "@mui/joy"; type Props = { - setServ: React.Dispatch> - serv: server.Server; -} + setServ: React.Dispatch>; + serv: server.Server; +}; -function GeneralServerSettingsCard({ setServ, serv }: {setServ: React.Dispatch>, serv: server.Server}) { - return ( - -
-
- Mods (e.g.: modid1,modid2,modid3) - setServ((p) => ({ ...p, mods: e.target.value }))}> -
-
-
- ) +function GeneralServerSettingsCard({ + setServ, + serv, +}: { + setServ: React.Dispatch>; + serv: server.Server; +}) { + return ( + +
+
+ Mods (e.g.: modid1,modid2,modid3) + setServ((p) => ({ ...p, mods: e.target.value }))} + > +
+
+
+ ); } -export function Mods({setServ, serv}: Props) { - return ( - - - - ); -} \ No newline at end of file +export function Mods({ setServ, serv }: Props) { + return ( + + + + ); +} diff --git a/frontend/tailwind.config.cjs b/frontend/tailwind.config.cjs index d1b9227..49913a3 100644 --- a/frontend/tailwind.config.cjs +++ b/frontend/tailwind.config.cjs @@ -1,19 +1,17 @@ /** @type {import('tailwindcss').Config} */ module.exports = { - content: [ - "./src/**/*.{js,jsx,ts,tsx}", - ], + content: ["./src/**/*.{js,jsx,ts,tsx}"], theme: { extend: { fontFamily: { - 'jetbrains': ['JetBrains Mono', 'monospace'], + jetbrains: ["JetBrains Mono", "monospace"], }, }, }, plugins: [], corePlugins: { - preflight: false, + preflight: false, }, - important: '#root', -} + important: "#root", +}; diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index b1b5f91..9cc50ea 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -1,7 +1,7 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; // https://vitejs.dev/config/ export default defineConfig({ - plugins: [react()] -}) + plugins: [react()], +}); From 7e3068a9840b6bdca0a793cbf2ebba3a9745ae7f Mon Sep 17 00:00:00 2001 From: Jens van de Wiel Date: Tue, 26 Dec 2023 19:24:23 +0100 Subject: [PATCH 10/11] updated tabs --- frontend/.prettierrc | 5 +- frontend/index.html | 18 +- frontend/package-lock.json | 9420 +++++++++--------- frontend/package.json | 64 +- frontend/postcss.config.cjs | 8 +- frontend/src/App.tsx | 558 +- frontend/src/components/AlertProvider.tsx | 128 +- frontend/src/components/HomeButton.tsx | 20 +- frontend/src/components/PasswordInput.tsx | 54 +- frontend/src/components/ServerList.tsx | 381 +- frontend/src/components/Slider.tsx | 88 +- frontend/src/components/ThemeSwitcher.tsx | 34 +- frontend/src/main.tsx | 18 +- frontend/src/pages/InstallUpdater.tsx | 240 +- frontend/src/pages/Server.tsx | 892 +- frontend/src/pages/UpdaterModal.tsx | 102 +- frontend/src/pages/server/Administration.tsx | 888 +- frontend/src/pages/server/Console.tsx | 375 +- frontend/src/pages/server/General.tsx | 702 +- frontend/src/pages/server/Ini.tsx | 39 +- frontend/src/pages/server/Mods.tsx | 64 +- frontend/tailwind.config.cjs | 26 +- frontend/tsconfig.json | 38 +- frontend/tsconfig.node.json | 14 +- frontend/vite.config.ts | 2 +- 25 files changed, 7175 insertions(+), 7003 deletions(-) diff --git a/frontend/.prettierrc b/frontend/.prettierrc index 0967ef4..8dc2e72 100644 --- a/frontend/.prettierrc +++ b/frontend/.prettierrc @@ -1 +1,4 @@ -{} +{ + "tabWidth": 4, + "useTabs": true +} diff --git a/frontend/index.html b/frontend/index.html index 4b6f6c9..a05bbd9 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -1,12 +1,12 @@ - - - - Vite + React + TS + Tailwind - - -
- - + + + + Vite + React + TS + Tailwind + + +
+ + diff --git a/frontend/package-lock.json b/frontend/package-lock.json index ccece17..f8ec9d9 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,4712 +1,4712 @@ { - "name": "{{.ProjectName}}", - "version": "0.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "{{.ProjectName}}", - "version": "0.0.0", - "dependencies": { - "@emotion/react": "^11.11.1", - "@emotion/styled": "^11.11.0", - "@fontsource-variable/inter": "^5.0.13", - "@mui/base": "^5.0.0-beta.21", - "@mui/joy": "^5.0.0-beta.11", - "@tabler/icons-react": "^2.39.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-monaco-editor": "^0.54.0" - }, - "devDependencies": { - "@types/react": "^18.0.17", - "@types/react-dom": "^18.0.6", - "@vitejs/plugin-react": "^2.1.0", - "autoprefixer": "^10.4.12", - "postcss": "^8.4.17", - "prettier": "3.1.1", - "tailwindcss": "^3.1.8", - "typescript": "^4.6.4", - "vite": "^3.1.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.3.tgz", - "integrity": "sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz", - "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.3", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-module-transforms": "^7.19.0", - "@babel/helpers": "^7.19.0", - "@babel/parser": "^7.19.3", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.3", - "@babel/types": "^7.19.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz", - "integrity": "sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.19.3", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", - "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", - "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz", - "integrity": "sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz", - "integrity": "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", - "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", - "dev": true, - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz", - "integrity": "sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.18.6.tgz", - "integrity": "sha512-utZmlASneDfdaMh0m/WausbjUjEdGrQJz0vFK93d7wD3xf5wBtX219+q6IlCNZeguIcxS2f/CvLZrlLSvSHQXw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@emotion/babel-plugin": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", - "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", - "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/serialize": "^1.1.2", - "babel-plugin-macros": "^3.1.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@emotion/cache": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", - "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", - "dependencies": { - "@emotion/memoize": "^0.8.1", - "@emotion/sheet": "^1.2.2", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/hash": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", - "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" - }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", - "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", - "dependencies": { - "@emotion/memoize": "^0.8.1" - } - }, - "node_modules/@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" - }, - "node_modules/@emotion/react": { - "version": "11.11.1", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz", - "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==", - "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.11.0", - "@emotion/cache": "^11.11.0", - "@emotion/serialize": "^1.1.2", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "hoist-non-react-statics": "^3.3.1" - }, - "peerDependencies": { - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@emotion/serialize": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", - "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", - "dependencies": { - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/unitless": "^0.8.1", - "@emotion/utils": "^1.2.1", - "csstype": "^3.0.2" - } - }, - "node_modules/@emotion/sheet": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", - "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" - }, - "node_modules/@emotion/styled": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", - "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", - "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.11.0", - "@emotion/is-prop-valid": "^1.2.1", - "@emotion/serialize": "^1.1.2", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@emotion/utils": "^1.2.1" - }, - "peerDependencies": { - "@emotion/react": "^11.0.0-rc.0", - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@emotion/unitless": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" - }, - "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", - "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@emotion/utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", - "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" - }, - "node_modules/@emotion/weak-memoize": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", - "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" - }, - "node_modules/@esbuild/android-arm": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.10.tgz", - "integrity": "sha512-FNONeQPy/ox+5NBkcSbYJxoXj9GWu8gVGJTVmUyoOCKQFDTrHVKgNSzChdNt0I8Aj/iKcsDf2r9BFwv+FSNUXg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.10.tgz", - "integrity": "sha512-w0Ou3Z83LOYEkwaui2M8VwIp+nLi/NA60lBLMvaJ+vXVMcsARYdEzLNE7RSm4+lSg4zq4d7fAVuzk7PNQ5JFgg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", - "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", - "dependencies": { - "@floating-ui/utils": "^0.1.3" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", - "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", - "dependencies": { - "@floating-ui/core": "^1.4.2", - "@floating-ui/utils": "^0.1.3" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz", - "integrity": "sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==", - "dependencies": { - "@floating-ui/dom": "^1.5.1" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", - "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" - }, - "node_modules/@fontsource-variable/inter": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/@fontsource-variable/inter/-/inter-5.0.13.tgz", - "integrity": "sha512-mb2WyZ2rHeqIG8aqGJIvLBOmo4sg2x7SHlsE6PUhwxbOicVzO59EZwSGtzNO3FmchuDPFVAxzcXYcR5B6jE6Qw==" - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@mui/base": { - "version": "5.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.21.tgz", - "integrity": "sha512-eTKWx3WV/nwmRUK4z4K1MzlMyWCsi3WJ3RtV4DiXZeRh4qd4JCyp1Zzzi8Wv9xM4dEBmqQntFoei716PzwmFfA==", - "dependencies": { - "@babel/runtime": "^7.23.2", - "@floating-ui/react-dom": "^2.0.2", - "@mui/types": "^7.2.7", - "@mui/utils": "^5.14.15", - "@popperjs/core": "^2.11.8", - "clsx": "^2.0.0", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/core-downloads-tracker": { - "version": "5.14.14", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.14.tgz", - "integrity": "sha512-Rw/xKiTOUgXD8hdKqj60aC6QcGprMipG7ne2giK6Mz7b4PlhL/xog9xLeclY3BxsRLkZQ05egFnIEY1CSibTbw==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - } - }, - "node_modules/@mui/joy": { - "version": "5.0.0-beta.11", - "resolved": "https://registry.npmjs.org/@mui/joy/-/joy-5.0.0-beta.11.tgz", - "integrity": "sha512-NHtNPaNkpvL8o4VFsMcNBKVlYNaRttl9bLYbK6H0xzVYzk0PV/CHsauY35kpG8o67qsFaXy5nRe5RZPglNwX1Q==", - "dependencies": { - "@babel/runtime": "^7.23.1", - "@mui/base": "5.0.0-beta.20", - "@mui/core-downloads-tracker": "^5.14.14", - "@mui/system": "^5.14.14", - "@mui/types": "^7.2.6", - "@mui/utils": "^5.14.13", - "clsx": "^2.0.0", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/joy/node_modules/@mui/base": { - "version": "5.0.0-beta.20", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.20.tgz", - "integrity": "sha512-CS2pUuqxST7ch9VNDCklRYDbJ3rru20Tx7na92QvVVKfu3RL4z/QLuVIc8jYGsdCnauMaeUSlFNLAJNb0yXe6w==", - "dependencies": { - "@babel/runtime": "^7.23.1", - "@floating-ui/react-dom": "^2.0.2", - "@mui/types": "^7.2.6", - "@mui/utils": "^5.14.13", - "@popperjs/core": "^2.11.8", - "clsx": "^2.0.0", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/private-theming": { - "version": "5.14.14", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.14.tgz", - "integrity": "sha512-n77au3CQj9uu16hak2Y+rvbGSBaJKxziG/gEbOLVGrAuqZ+ycVSkorCfN6Y/4XgYOpG/xvmuiY3JwhAEOzY3iA==", - "dependencies": { - "@babel/runtime": "^7.23.1", - "@mui/utils": "^5.14.13", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/styled-engine": { - "version": "5.14.14", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.14.tgz", - "integrity": "sha512-sF3DS2PVG+cFWvkVHQQaGFpL1h6gSwOW3L91pdxPLQDHDZ5mZ/X0SlXU5XA+WjypoysG4urdAQC7CH/BRvUiqg==", - "dependencies": { - "@babel/runtime": "^7.23.1", - "@emotion/cache": "^11.11.0", - "csstype": "^3.1.2", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@emotion/react": "^11.4.1", - "@emotion/styled": "^11.3.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - } - } - }, - "node_modules/@mui/system": { - "version": "5.14.14", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.14.tgz", - "integrity": "sha512-y4InFmCgGGWXnz+iK4jRTWVikY0HgYnABjz4wgiUgEa2W1H8M4ow+27BegExUWPkj4TWthQ2qG9FOGSMtI+PKA==", - "dependencies": { - "@babel/runtime": "^7.23.1", - "@mui/private-theming": "^5.14.14", - "@mui/styled-engine": "^5.14.13", - "@mui/types": "^7.2.6", - "@mui/utils": "^5.14.13", - "clsx": "^2.0.0", - "csstype": "^3.1.2", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/types": { - "version": "7.2.7", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.7.tgz", - "integrity": "sha512-sofpWmcBqOlTzRbr1cLQuUDKaUYVZTw8ENQrtL39TECRNENEzwgnNPh6WMfqMZlMvf1Aj9DLg74XPjnLr0izUQ==", - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/utils": { - "version": "5.14.15", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.15.tgz", - "integrity": "sha512-QBfHovAvTa0J1jXuYDaXGk+Yyp7+Fm8GSqx6nK2JbezGqzCFfirNdop/+bL9Flh/OQ/64PeXcW4HGDdOge+n3A==", - "dependencies": { - "@babel/runtime": "^7.23.2", - "@types/prop-types": "^15.7.8", - "prop-types": "^15.8.1", - "react-is": "^18.2.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@tabler/icons": { - "version": "2.39.0", - "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-2.39.0.tgz", - "integrity": "sha512-iK3j2jIEGIUaJcbYYg5iwyG1Y/m4lzUxAUbxRpvgeXCWP29jvZaH5hajZmU3KaSealddHuJg7PSQislPHpCsoQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/codecalm" - } - }, - "node_modules/@tabler/icons-react": { - "version": "2.39.0", - "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-2.39.0.tgz", - "integrity": "sha512-MyUK1jqtmHPZBnDXqIc1Y5OnfoqG+tGaSB1/gcl0mlY462fJ5f3QB0ZIZzAHMAGYb6K2iJSdFIFavhcgpDDZ7Q==", - "dependencies": { - "@tabler/icons": "2.39.0", - "prop-types": "^15.7.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/codecalm" - }, - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@types/parse-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.1.tgz", - "integrity": "sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng==" - }, - "node_modules/@types/prop-types": { - "version": "15.7.9", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.9.tgz", - "integrity": "sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==" - }, - "node_modules/@types/react": { - "version": "18.0.21", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.21.tgz", - "integrity": "sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA==", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.0.6", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.6.tgz", - "integrity": "sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" - }, - "node_modules/@vitejs/plugin-react": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-2.1.0.tgz", - "integrity": "sha512-am6rPyyU3LzUYne3Gd9oj9c4Rzbq5hQnuGXSMT6Gujq45Il/+bunwq3lrB7wghLkiF45ygMwft37vgJ/NE8IAA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.18.13", - "@babel/plugin-transform-react-jsx": "^7.18.10", - "@babel/plugin-transform-react-jsx-development": "^7.18.6", - "@babel/plugin-transform-react-jsx-self": "^7.18.6", - "@babel/plugin-transform-react-jsx-source": "^7.18.6", - "magic-string": "^0.26.2", - "react-refresh": "^0.14.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^3.0.0" - } - }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dev": true, - "dependencies": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, - "node_modules/autoprefixer": { - "version": "10.4.12", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz", - "integrity": "sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - ], - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001407", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001414", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz", - "integrity": "sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/clsx": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", - "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", - "dev": true - }, - "node_modules/detective": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", - "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", - "dev": true, - "dependencies": { - "acorn-node": "^1.8.2", - "defined": "^1.0.0", - "minimist": "^1.2.6" - }, - "bin": { - "detective": "bin/detective.js" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.270", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.270.tgz", - "integrity": "sha512-KNhIzgLiJmDDC444dj9vEOpZEgsV96ult9Iff98Vanumn+ShJHd5se8aX6KeVxdc0YQeqdrezBZv89rleDbvSg==", - "dev": true - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/esbuild": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.10.tgz", - "integrity": "sha512-N7wBhfJ/E5fzn/SpNgX+oW2RLRjwaL8Y0ezqNqhjD6w0H2p0rDuEz2FKZqpqLnO8DCaWumKe8dsC/ljvVSSxng==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.15.10", - "@esbuild/linux-loong64": "0.15.10", - "esbuild-android-64": "0.15.10", - "esbuild-android-arm64": "0.15.10", - "esbuild-darwin-64": "0.15.10", - "esbuild-darwin-arm64": "0.15.10", - "esbuild-freebsd-64": "0.15.10", - "esbuild-freebsd-arm64": "0.15.10", - "esbuild-linux-32": "0.15.10", - "esbuild-linux-64": "0.15.10", - "esbuild-linux-arm": "0.15.10", - "esbuild-linux-arm64": "0.15.10", - "esbuild-linux-mips64le": "0.15.10", - "esbuild-linux-ppc64le": "0.15.10", - "esbuild-linux-riscv64": "0.15.10", - "esbuild-linux-s390x": "0.15.10", - "esbuild-netbsd-64": "0.15.10", - "esbuild-openbsd-64": "0.15.10", - "esbuild-sunos-64": "0.15.10", - "esbuild-windows-32": "0.15.10", - "esbuild-windows-64": "0.15.10", - "esbuild-windows-arm64": "0.15.10" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.10.tgz", - "integrity": "sha512-UI7krF8OYO1N7JYTgLT9ML5j4+45ra3amLZKx7LO3lmLt1Ibn8t3aZbX5Pu4BjWiqDuJ3m/hsvhPhK/5Y/YpnA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.10.tgz", - "integrity": "sha512-EOt55D6xBk5O05AK8brXUbZmoFj4chM8u3riGflLa6ziEoVvNjRdD7Cnp82NHQGfSHgYR06XsPI8/sMuA/cUwg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.10.tgz", - "integrity": "sha512-hbDJugTicqIm+WKZgp208d7FcXcaK8j2c0l+fqSJ3d2AzQAfjEYDRM3Z2oMeqSJ9uFxyj/muSACLdix7oTstRA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.10.tgz", - "integrity": "sha512-M1t5+Kj4IgSbYmunf2BB6EKLkWUq+XlqaFRiGOk8bmBapu9bCDrxjf4kUnWn59Dka3I27EiuHBKd1rSO4osLFQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.10.tgz", - "integrity": "sha512-KMBFMa7C8oc97nqDdoZwtDBX7gfpolkk6Bcmj6YFMrtCMVgoU/x2DI1p74DmYl7CSS6Ppa3xgemrLrr5IjIn0w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.10.tgz", - "integrity": "sha512-m2KNbuCX13yQqLlbSojFMHpewbn8wW5uDS6DxRpmaZKzyq8Dbsku6hHvh2U+BcLwWY4mpgXzFUoENEf7IcioGg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.10.tgz", - "integrity": "sha512-guXrwSYFAvNkuQ39FNeV4sNkNms1bLlA5vF1H0cazZBOLdLFIny6BhT+TUbK/hdByMQhtWQ5jI9VAmPKbVPu1w==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.10.tgz", - "integrity": "sha512-jd8XfaSJeucMpD63YNMO1JCrdJhckHWcMv6O233bL4l6ogQKQOxBYSRP/XLWP+6kVTu0obXovuckJDcA0DKtQA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.10.tgz", - "integrity": "sha512-6N8vThLL/Lysy9y4Ex8XoLQAlbZKUyExCWyayGi2KgTBelKpPgj6RZnUaKri0dHNPGgReJriKVU6+KDGQwn10A==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.10.tgz", - "integrity": "sha512-GByBi4fgkvZFTHFDYNftu1DQ1GzR23jws0oWyCfhnI7eMOe+wgwWrc78dbNk709Ivdr/evefm2PJiUBMiusS1A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.10.tgz", - "integrity": "sha512-BxP+LbaGVGIdQNJUNF7qpYjEGWb0YyHVSKqYKrn+pTwH/SiHUxFyJYSP3pqkku61olQiSBnSmWZ+YUpj78Tw7Q==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.10.tgz", - "integrity": "sha512-LoSQCd6498PmninNgqd/BR7z3Bsk/mabImBWuQ4wQgmQEeanzWd5BQU2aNi9mBURCLgyheuZS6Xhrw5luw3OkQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.10.tgz", - "integrity": "sha512-Lrl9Cr2YROvPV4wmZ1/g48httE8z/5SCiXIyebiB5N8VT7pX3t6meI7TQVHw/wQpqP/AF4SksDuFImPTM7Z32Q==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.10.tgz", - "integrity": "sha512-ReP+6q3eLVVP2lpRrvl5EodKX7EZ1bS1/z5j6hsluAlZP5aHhk6ghT6Cq3IANvvDdscMMCB4QEbI+AjtvoOFpA==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.10.tgz", - "integrity": "sha512-iGDYtJCMCqldMskQ4eIV+QSS/CuT7xyy9i2/FjpKvxAuCzrESZXiA1L64YNj6/afuzfBe9i8m/uDkFHy257hTw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.10.tgz", - "integrity": "sha512-ftMMIwHWrnrYnvuJQRJs/Smlcb28F9ICGde/P3FUTCgDDM0N7WA0o9uOR38f5Xe2/OhNCgkjNeb7QeaE3cyWkQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.10.tgz", - "integrity": "sha512-mf7hBL9Uo2gcy2r3rUFMjVpTaGpFJJE5QTDDqUFf1632FxteYANffDZmKbqX0PfeQ2XjUDE604IcE7OJeoHiyg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.10.tgz", - "integrity": "sha512-ttFVo+Cg8b5+qHmZHbEc8Vl17kCleHhLzgT8X04y8zudEApo0PxPg9Mz8Z2cKH1bCYlve1XL8LkyXGFjtUYeGg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.10.tgz", - "integrity": "sha512-2H0gdsyHi5x+8lbng3hLbxDWR7mKHWh5BXZGKVG830KUmXOOWFE2YKJ4tHRkejRduOGDrBvHBriYsGtmTv3ntA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.10.tgz", - "integrity": "sha512-S+th4F+F8VLsHLR0zrUcG+Et4hx0RKgK1eyHc08kztmLOES8BWwMiaGdoW9hiXuzznXQ0I/Fg904MNbr11Nktw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" - }, - "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" - } - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/magic-string": { - "version": "0.26.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.5.tgz", - "integrity": "sha512-yXUIYOOQnEHKHOftp5shMWpB9ImfgfDJpapa38j/qMtTj5QHWucvxP4lUtuRmHT9vAzvtpHkWKXW9xBwimXeNg==", - "dev": true, - "dependencies": { - "sourcemap-codec": "^1.4.8" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "node_modules/monaco-editor": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.39.0.tgz", - "integrity": "sha512-zhbZ2Nx93tLR8aJmL2zI1mhJpsl87HMebNBM6R8z4pLfs8pj604pIVIVwyF1TivcfNtIPpMXL+nb3DsBmE/x6Q==", - "peer": true - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", - "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", - "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", - "dev": true, - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.3.3" - } - }, - "node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", - "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.6" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/prettier": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", - "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "node_modules/react-monaco-editor": { - "version": "0.54.0", - "resolved": "https://registry.npmjs.org/react-monaco-editor/-/react-monaco-editor-0.54.0.tgz", - "integrity": "sha512-9JwO69851mfpuhYLHlKbae7omQWJ/2ICE2lbL0VHyNyZR8rCOH7440u+zAtDgiOMpLwmYdY1sEZCdRefywX6GQ==", - "dependencies": { - "prop-types": "^15.8.1" - }, - "peerDependencies": { - "@types/react": ">=16 <= 18", - "monaco-editor": "^0.39.0", - "react": ">=16 <= 18" - } - }, - "node_modules/react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "node_modules/stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwindcss": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.8.tgz", - "integrity": "sha512-YSneUCZSFDYMwk+TGq8qYFdCA3yfBRdBlS7txSq0LUmzyeqRe3a8fBQzbz9M3WS/iFT4BNf/nmw9mEzrnSaC0g==", - "dev": true, - "dependencies": { - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "color-name": "^1.1.4", - "detective": "^5.2.1", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "lilconfig": "^2.0.6", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.14", - "postcss-import": "^14.1.0", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.4", - "postcss-nested": "5.0.6", - "postcss-selector-parser": "^6.0.10", - "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.1" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/tailwindcss/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", - "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/vite": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.7.tgz", - "integrity": "sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==", - "dev": true, - "dependencies": { - "esbuild": "^0.15.9", - "postcss": "^8.4.18", - "resolve": "^1.22.1", - "rollup": "^2.79.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "requires": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - } - }, - "@babel/compat-data": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.3.tgz", - "integrity": "sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw==", - "dev": true - }, - "@babel/core": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz", - "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.3", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-module-transforms": "^7.19.0", - "@babel/helpers": "^7.19.0", - "@babel/parser": "^7.19.3", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.3", - "@babel/types": "^7.19.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - } - }, - "@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", - "dev": true, - "requires": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz", - "integrity": "sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.19.3", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "semver": "^6.3.0" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", - "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", - "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", - "dev": true - }, - "@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==" - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" - }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz", - "integrity": "sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==", - "dev": true, - "requires": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" - } - }, - "@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", - "dev": true - }, - "@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz", - "integrity": "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.19.0" - } - }, - "@babel/plugin-transform-react-jsx-development": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", - "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", - "dev": true, - "requires": { - "@babel/plugin-transform-react-jsx": "^7.18.6" - } - }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz", - "integrity": "sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.18.6.tgz", - "integrity": "sha512-utZmlASneDfdaMh0m/WausbjUjEdGrQJz0vFK93d7wD3xf5wBtX219+q6IlCNZeguIcxS2f/CvLZrlLSvSHQXw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", - "requires": { - "regenerator-runtime": "^0.14.0" - } - }, - "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - } - }, - "@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "requires": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - } - }, - "@emotion/babel-plugin": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", - "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", - "requires": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/serialize": "^1.1.2", - "babel-plugin-macros": "^3.1.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.2.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - } - } - }, - "@emotion/cache": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", - "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", - "requires": { - "@emotion/memoize": "^0.8.1", - "@emotion/sheet": "^1.2.2", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "stylis": "4.2.0" - } - }, - "@emotion/hash": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", - "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" - }, - "@emotion/is-prop-valid": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", - "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", - "requires": { - "@emotion/memoize": "^0.8.1" - } - }, - "@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" - }, - "@emotion/react": { - "version": "11.11.1", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz", - "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==", - "requires": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.11.0", - "@emotion/cache": "^11.11.0", - "@emotion/serialize": "^1.1.2", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "hoist-non-react-statics": "^3.3.1" - } - }, - "@emotion/serialize": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", - "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", - "requires": { - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/unitless": "^0.8.1", - "@emotion/utils": "^1.2.1", - "csstype": "^3.0.2" - } - }, - "@emotion/sheet": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", - "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" - }, - "@emotion/styled": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", - "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", - "requires": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.11.0", - "@emotion/is-prop-valid": "^1.2.1", - "@emotion/serialize": "^1.1.2", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@emotion/utils": "^1.2.1" - } - }, - "@emotion/unitless": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" - }, - "@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", - "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", - "requires": {} - }, - "@emotion/utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", - "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" - }, - "@emotion/weak-memoize": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", - "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" - }, - "@esbuild/android-arm": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.10.tgz", - "integrity": "sha512-FNONeQPy/ox+5NBkcSbYJxoXj9GWu8gVGJTVmUyoOCKQFDTrHVKgNSzChdNt0I8Aj/iKcsDf2r9BFwv+FSNUXg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.10.tgz", - "integrity": "sha512-w0Ou3Z83LOYEkwaui2M8VwIp+nLi/NA60lBLMvaJ+vXVMcsARYdEzLNE7RSm4+lSg4zq4d7fAVuzk7PNQ5JFgg==", - "dev": true, - "optional": true - }, - "@floating-ui/core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", - "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", - "requires": { - "@floating-ui/utils": "^0.1.3" - } - }, - "@floating-ui/dom": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", - "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", - "requires": { - "@floating-ui/core": "^1.4.2", - "@floating-ui/utils": "^0.1.3" - } - }, - "@floating-ui/react-dom": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz", - "integrity": "sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==", - "requires": { - "@floating-ui/dom": "^1.5.1" - } - }, - "@floating-ui/utils": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", - "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" - }, - "@fontsource-variable/inter": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/@fontsource-variable/inter/-/inter-5.0.13.tgz", - "integrity": "sha512-mb2WyZ2rHeqIG8aqGJIvLBOmo4sg2x7SHlsE6PUhwxbOicVzO59EZwSGtzNO3FmchuDPFVAxzcXYcR5B6jE6Qw==" - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "@mui/base": { - "version": "5.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.21.tgz", - "integrity": "sha512-eTKWx3WV/nwmRUK4z4K1MzlMyWCsi3WJ3RtV4DiXZeRh4qd4JCyp1Zzzi8Wv9xM4dEBmqQntFoei716PzwmFfA==", - "requires": { - "@babel/runtime": "^7.23.2", - "@floating-ui/react-dom": "^2.0.2", - "@mui/types": "^7.2.7", - "@mui/utils": "^5.14.15", - "@popperjs/core": "^2.11.8", - "clsx": "^2.0.0", - "prop-types": "^15.8.1" - } - }, - "@mui/core-downloads-tracker": { - "version": "5.14.14", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.14.tgz", - "integrity": "sha512-Rw/xKiTOUgXD8hdKqj60aC6QcGprMipG7ne2giK6Mz7b4PlhL/xog9xLeclY3BxsRLkZQ05egFnIEY1CSibTbw==" - }, - "@mui/joy": { - "version": "5.0.0-beta.11", - "resolved": "https://registry.npmjs.org/@mui/joy/-/joy-5.0.0-beta.11.tgz", - "integrity": "sha512-NHtNPaNkpvL8o4VFsMcNBKVlYNaRttl9bLYbK6H0xzVYzk0PV/CHsauY35kpG8o67qsFaXy5nRe5RZPglNwX1Q==", - "requires": { - "@babel/runtime": "^7.23.1", - "@mui/base": "5.0.0-beta.20", - "@mui/core-downloads-tracker": "^5.14.14", - "@mui/system": "^5.14.14", - "@mui/types": "^7.2.6", - "@mui/utils": "^5.14.13", - "clsx": "^2.0.0", - "prop-types": "^15.8.1" - }, - "dependencies": { - "@mui/base": { - "version": "5.0.0-beta.20", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.20.tgz", - "integrity": "sha512-CS2pUuqxST7ch9VNDCklRYDbJ3rru20Tx7na92QvVVKfu3RL4z/QLuVIc8jYGsdCnauMaeUSlFNLAJNb0yXe6w==", - "requires": { - "@babel/runtime": "^7.23.1", - "@floating-ui/react-dom": "^2.0.2", - "@mui/types": "^7.2.6", - "@mui/utils": "^5.14.13", - "@popperjs/core": "^2.11.8", - "clsx": "^2.0.0", - "prop-types": "^15.8.1" - } - } - } - }, - "@mui/private-theming": { - "version": "5.14.14", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.14.tgz", - "integrity": "sha512-n77au3CQj9uu16hak2Y+rvbGSBaJKxziG/gEbOLVGrAuqZ+ycVSkorCfN6Y/4XgYOpG/xvmuiY3JwhAEOzY3iA==", - "requires": { - "@babel/runtime": "^7.23.1", - "@mui/utils": "^5.14.13", - "prop-types": "^15.8.1" - } - }, - "@mui/styled-engine": { - "version": "5.14.14", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.14.tgz", - "integrity": "sha512-sF3DS2PVG+cFWvkVHQQaGFpL1h6gSwOW3L91pdxPLQDHDZ5mZ/X0SlXU5XA+WjypoysG4urdAQC7CH/BRvUiqg==", - "requires": { - "@babel/runtime": "^7.23.1", - "@emotion/cache": "^11.11.0", - "csstype": "^3.1.2", - "prop-types": "^15.8.1" - } - }, - "@mui/system": { - "version": "5.14.14", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.14.tgz", - "integrity": "sha512-y4InFmCgGGWXnz+iK4jRTWVikY0HgYnABjz4wgiUgEa2W1H8M4ow+27BegExUWPkj4TWthQ2qG9FOGSMtI+PKA==", - "requires": { - "@babel/runtime": "^7.23.1", - "@mui/private-theming": "^5.14.14", - "@mui/styled-engine": "^5.14.13", - "@mui/types": "^7.2.6", - "@mui/utils": "^5.14.13", - "clsx": "^2.0.0", - "csstype": "^3.1.2", - "prop-types": "^15.8.1" - } - }, - "@mui/types": { - "version": "7.2.7", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.7.tgz", - "integrity": "sha512-sofpWmcBqOlTzRbr1cLQuUDKaUYVZTw8ENQrtL39TECRNENEzwgnNPh6WMfqMZlMvf1Aj9DLg74XPjnLr0izUQ==", - "requires": {} - }, - "@mui/utils": { - "version": "5.14.15", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.15.tgz", - "integrity": "sha512-QBfHovAvTa0J1jXuYDaXGk+Yyp7+Fm8GSqx6nK2JbezGqzCFfirNdop/+bL9Flh/OQ/64PeXcW4HGDdOge+n3A==", - "requires": { - "@babel/runtime": "^7.23.2", - "@types/prop-types": "^15.7.8", - "prop-types": "^15.8.1", - "react-is": "^18.2.0" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==" - }, - "@tabler/icons": { - "version": "2.39.0", - "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-2.39.0.tgz", - "integrity": "sha512-iK3j2jIEGIUaJcbYYg5iwyG1Y/m4lzUxAUbxRpvgeXCWP29jvZaH5hajZmU3KaSealddHuJg7PSQislPHpCsoQ==" - }, - "@tabler/icons-react": { - "version": "2.39.0", - "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-2.39.0.tgz", - "integrity": "sha512-MyUK1jqtmHPZBnDXqIc1Y5OnfoqG+tGaSB1/gcl0mlY462fJ5f3QB0ZIZzAHMAGYb6K2iJSdFIFavhcgpDDZ7Q==", - "requires": { - "@tabler/icons": "2.39.0", - "prop-types": "^15.7.2" - } - }, - "@types/parse-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.1.tgz", - "integrity": "sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng==" - }, - "@types/prop-types": { - "version": "15.7.9", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.9.tgz", - "integrity": "sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==" - }, - "@types/react": { - "version": "18.0.21", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.21.tgz", - "integrity": "sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA==", - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/react-dom": { - "version": "18.0.6", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.6.tgz", - "integrity": "sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA==", - "dev": true, - "requires": { - "@types/react": "*" - } - }, - "@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" - }, - "@vitejs/plugin-react": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-2.1.0.tgz", - "integrity": "sha512-am6rPyyU3LzUYne3Gd9oj9c4Rzbq5hQnuGXSMT6Gujq45Il/+bunwq3lrB7wghLkiF45ygMwft37vgJ/NE8IAA==", - "dev": true, - "requires": { - "@babel/core": "^7.18.13", - "@babel/plugin-transform-react-jsx": "^7.18.10", - "@babel/plugin-transform-react-jsx-development": "^7.18.6", - "@babel/plugin-transform-react-jsx-self": "^7.18.6", - "@babel/plugin-transform-react-jsx-source": "^7.18.6", - "magic-string": "^0.26.2", - "react-refresh": "^0.14.0" - } - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dev": true, - "requires": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, - "autoprefixer": { - "version": "10.4.12", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz", - "integrity": "sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q==", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001407", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "requires": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001414", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz", - "integrity": "sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "clsx": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", - "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==" - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", - "dev": true - }, - "detective": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", - "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", - "dev": true, - "requires": { - "acorn-node": "^1.8.2", - "defined": "^1.0.0", - "minimist": "^1.2.6" - } - }, - "didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true - }, - "dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.270", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.270.tgz", - "integrity": "sha512-KNhIzgLiJmDDC444dj9vEOpZEgsV96ult9Iff98Vanumn+ShJHd5se8aX6KeVxdc0YQeqdrezBZv89rleDbvSg==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "esbuild": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.10.tgz", - "integrity": "sha512-N7wBhfJ/E5fzn/SpNgX+oW2RLRjwaL8Y0ezqNqhjD6w0H2p0rDuEz2FKZqpqLnO8DCaWumKe8dsC/ljvVSSxng==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.15.10", - "@esbuild/linux-loong64": "0.15.10", - "esbuild-android-64": "0.15.10", - "esbuild-android-arm64": "0.15.10", - "esbuild-darwin-64": "0.15.10", - "esbuild-darwin-arm64": "0.15.10", - "esbuild-freebsd-64": "0.15.10", - "esbuild-freebsd-arm64": "0.15.10", - "esbuild-linux-32": "0.15.10", - "esbuild-linux-64": "0.15.10", - "esbuild-linux-arm": "0.15.10", - "esbuild-linux-arm64": "0.15.10", - "esbuild-linux-mips64le": "0.15.10", - "esbuild-linux-ppc64le": "0.15.10", - "esbuild-linux-riscv64": "0.15.10", - "esbuild-linux-s390x": "0.15.10", - "esbuild-netbsd-64": "0.15.10", - "esbuild-openbsd-64": "0.15.10", - "esbuild-sunos-64": "0.15.10", - "esbuild-windows-32": "0.15.10", - "esbuild-windows-64": "0.15.10", - "esbuild-windows-arm64": "0.15.10" - } - }, - "esbuild-android-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.10.tgz", - "integrity": "sha512-UI7krF8OYO1N7JYTgLT9ML5j4+45ra3amLZKx7LO3lmLt1Ibn8t3aZbX5Pu4BjWiqDuJ3m/hsvhPhK/5Y/YpnA==", - "dev": true, - "optional": true - }, - "esbuild-android-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.10.tgz", - "integrity": "sha512-EOt55D6xBk5O05AK8brXUbZmoFj4chM8u3riGflLa6ziEoVvNjRdD7Cnp82NHQGfSHgYR06XsPI8/sMuA/cUwg==", - "dev": true, - "optional": true - }, - "esbuild-darwin-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.10.tgz", - "integrity": "sha512-hbDJugTicqIm+WKZgp208d7FcXcaK8j2c0l+fqSJ3d2AzQAfjEYDRM3Z2oMeqSJ9uFxyj/muSACLdix7oTstRA==", - "dev": true, - "optional": true - }, - "esbuild-darwin-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.10.tgz", - "integrity": "sha512-M1t5+Kj4IgSbYmunf2BB6EKLkWUq+XlqaFRiGOk8bmBapu9bCDrxjf4kUnWn59Dka3I27EiuHBKd1rSO4osLFQ==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.10.tgz", - "integrity": "sha512-KMBFMa7C8oc97nqDdoZwtDBX7gfpolkk6Bcmj6YFMrtCMVgoU/x2DI1p74DmYl7CSS6Ppa3xgemrLrr5IjIn0w==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.10.tgz", - "integrity": "sha512-m2KNbuCX13yQqLlbSojFMHpewbn8wW5uDS6DxRpmaZKzyq8Dbsku6hHvh2U+BcLwWY4mpgXzFUoENEf7IcioGg==", - "dev": true, - "optional": true - }, - "esbuild-linux-32": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.10.tgz", - "integrity": "sha512-guXrwSYFAvNkuQ39FNeV4sNkNms1bLlA5vF1H0cazZBOLdLFIny6BhT+TUbK/hdByMQhtWQ5jI9VAmPKbVPu1w==", - "dev": true, - "optional": true - }, - "esbuild-linux-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.10.tgz", - "integrity": "sha512-jd8XfaSJeucMpD63YNMO1JCrdJhckHWcMv6O233bL4l6ogQKQOxBYSRP/XLWP+6kVTu0obXovuckJDcA0DKtQA==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.10.tgz", - "integrity": "sha512-6N8vThLL/Lysy9y4Ex8XoLQAlbZKUyExCWyayGi2KgTBelKpPgj6RZnUaKri0dHNPGgReJriKVU6+KDGQwn10A==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.10.tgz", - "integrity": "sha512-GByBi4fgkvZFTHFDYNftu1DQ1GzR23jws0oWyCfhnI7eMOe+wgwWrc78dbNk709Ivdr/evefm2PJiUBMiusS1A==", - "dev": true, - "optional": true - }, - "esbuild-linux-mips64le": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.10.tgz", - "integrity": "sha512-BxP+LbaGVGIdQNJUNF7qpYjEGWb0YyHVSKqYKrn+pTwH/SiHUxFyJYSP3pqkku61olQiSBnSmWZ+YUpj78Tw7Q==", - "dev": true, - "optional": true - }, - "esbuild-linux-ppc64le": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.10.tgz", - "integrity": "sha512-LoSQCd6498PmninNgqd/BR7z3Bsk/mabImBWuQ4wQgmQEeanzWd5BQU2aNi9mBURCLgyheuZS6Xhrw5luw3OkQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-riscv64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.10.tgz", - "integrity": "sha512-Lrl9Cr2YROvPV4wmZ1/g48httE8z/5SCiXIyebiB5N8VT7pX3t6meI7TQVHw/wQpqP/AF4SksDuFImPTM7Z32Q==", - "dev": true, - "optional": true - }, - "esbuild-linux-s390x": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.10.tgz", - "integrity": "sha512-ReP+6q3eLVVP2lpRrvl5EodKX7EZ1bS1/z5j6hsluAlZP5aHhk6ghT6Cq3IANvvDdscMMCB4QEbI+AjtvoOFpA==", - "dev": true, - "optional": true - }, - "esbuild-netbsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.10.tgz", - "integrity": "sha512-iGDYtJCMCqldMskQ4eIV+QSS/CuT7xyy9i2/FjpKvxAuCzrESZXiA1L64YNj6/afuzfBe9i8m/uDkFHy257hTw==", - "dev": true, - "optional": true - }, - "esbuild-openbsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.10.tgz", - "integrity": "sha512-ftMMIwHWrnrYnvuJQRJs/Smlcb28F9ICGde/P3FUTCgDDM0N7WA0o9uOR38f5Xe2/OhNCgkjNeb7QeaE3cyWkQ==", - "dev": true, - "optional": true - }, - "esbuild-sunos-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.10.tgz", - "integrity": "sha512-mf7hBL9Uo2gcy2r3rUFMjVpTaGpFJJE5QTDDqUFf1632FxteYANffDZmKbqX0PfeQ2XjUDE604IcE7OJeoHiyg==", - "dev": true, - "optional": true - }, - "esbuild-windows-32": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.10.tgz", - "integrity": "sha512-ttFVo+Cg8b5+qHmZHbEc8Vl17kCleHhLzgT8X04y8zudEApo0PxPg9Mz8Z2cKH1bCYlve1XL8LkyXGFjtUYeGg==", - "dev": true, - "optional": true - }, - "esbuild-windows-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.10.tgz", - "integrity": "sha512-2H0gdsyHi5x+8lbng3hLbxDWR7mKHWh5BXZGKVG830KUmXOOWFE2YKJ4tHRkejRduOGDrBvHBriYsGtmTv3ntA==", - "dev": true, - "optional": true - }, - "esbuild-windows-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.10.tgz", - "integrity": "sha512-S+th4F+F8VLsHLR0zrUcG+Et4hx0RKgK1eyHc08kztmLOES8BWwMiaGdoW9hiXuzznXQ0I/Fg904MNbr11Nktw==", - "dev": true, - "optional": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" - }, - "fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - }, - "hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "requires": { - "react-is": "^16.7.0" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } - } - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", - "dev": true - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "magic-string": { - "version": "0.26.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.5.tgz", - "integrity": "sha512-yXUIYOOQnEHKHOftp5shMWpB9ImfgfDJpapa38j/qMtTj5QHWucvxP4lUtuRmHT9vAzvtpHkWKXW9xBwimXeNg==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.8" - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "monaco-editor": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.39.0.tgz", - "integrity": "sha512-zhbZ2Nx93tLR8aJmL2zI1mhJpsl87HMebNBM6R8z4pLfs8pj604pIVIVwyF1TivcfNtIPpMXL+nb3DsBmE/x6Q==", - "peer": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true - }, - "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - }, - "object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true - }, - "postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "dev": true, - "requires": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-import": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", - "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - } - }, - "postcss-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", - "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", - "dev": true, - "requires": { - "camelcase-css": "^2.0.1" - } - }, - "postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, - "requires": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - } - }, - "postcss-nested": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", - "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.6" - } - }, - "postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "prettier": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", - "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", - "dev": true - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } - } - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true - }, - "react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "requires": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - } - }, - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "react-monaco-editor": { - "version": "0.54.0", - "resolved": "https://registry.npmjs.org/react-monaco-editor/-/react-monaco-editor-0.54.0.tgz", - "integrity": "sha512-9JwO69851mfpuhYLHlKbae7omQWJ/2ICE2lbL0VHyNyZR8rCOH7440u+zAtDgiOMpLwmYdY1sEZCdRefywX6GQ==", - "requires": { - "prop-types": "^15.8.1" - } - }, - "react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", - "dev": true - }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "requires": { - "pify": "^2.3.0" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - }, - "tailwindcss": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.8.tgz", - "integrity": "sha512-YSneUCZSFDYMwk+TGq8qYFdCA3yfBRdBlS7txSq0LUmzyeqRe3a8fBQzbz9M3WS/iFT4BNf/nmw9mEzrnSaC0g==", - "dev": true, - "requires": { - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "color-name": "^1.1.4", - "detective": "^5.2.1", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "lilconfig": "^2.0.6", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.14", - "postcss-import": "^14.1.0", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.4", - "postcss-nested": "5.0.6", - "postcss-selector-parser": "^6.0.10", - "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.1" - }, - "dependencies": { - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", - "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "vite": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.7.tgz", - "integrity": "sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==", - "dev": true, - "requires": { - "esbuild": "^0.15.9", - "fsevents": "~2.3.2", - "postcss": "^8.4.18", - "resolve": "^1.22.1", - "rollup": "^2.79.1" - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" - } - } + "name": "{{.ProjectName}}", + "version": "0.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "{{.ProjectName}}", + "version": "0.0.0", + "dependencies": { + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@fontsource-variable/inter": "^5.0.13", + "@mui/base": "^5.0.0-beta.21", + "@mui/joy": "^5.0.0-beta.11", + "@tabler/icons-react": "^2.39.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-monaco-editor": "^0.54.0" + }, + "devDependencies": { + "@types/react": "^18.0.17", + "@types/react-dom": "^18.0.6", + "@vitejs/plugin-react": "^2.1.0", + "autoprefixer": "^10.4.12", + "postcss": "^8.4.17", + "prettier": "3.1.1", + "tailwindcss": "^3.1.8", + "typescript": "^4.6.4", + "vite": "^3.1.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.3.tgz", + "integrity": "sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz", + "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.3", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helpers": "^7.19.0", + "@babel/parser": "^7.19.3", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.3", + "@babel/types": "^7.19.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz", + "integrity": "sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.19.3", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", + "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", + "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz", + "integrity": "sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz", + "integrity": "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", + "dev": true, + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz", + "integrity": "sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.18.6.tgz", + "integrity": "sha512-utZmlASneDfdaMh0m/WausbjUjEdGrQJz0vFK93d7wD3xf5wBtX219+q6IlCNZeguIcxS2f/CvLZrlLSvSHQXw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/react": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz", + "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", + "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "node_modules/@emotion/styled": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", + "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.1", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, + "node_modules/@esbuild/android-arm": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.10.tgz", + "integrity": "sha512-FNONeQPy/ox+5NBkcSbYJxoXj9GWu8gVGJTVmUyoOCKQFDTrHVKgNSzChdNt0I8Aj/iKcsDf2r9BFwv+FSNUXg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.10.tgz", + "integrity": "sha512-w0Ou3Z83LOYEkwaui2M8VwIp+nLi/NA60lBLMvaJ+vXVMcsARYdEzLNE7RSm4+lSg4zq4d7fAVuzk7PNQ5JFgg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", + "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", + "dependencies": { + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "dependencies": { + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz", + "integrity": "sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==", + "dependencies": { + "@floating-ui/dom": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", + "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" + }, + "node_modules/@fontsource-variable/inter": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/@fontsource-variable/inter/-/inter-5.0.13.tgz", + "integrity": "sha512-mb2WyZ2rHeqIG8aqGJIvLBOmo4sg2x7SHlsE6PUhwxbOicVzO59EZwSGtzNO3FmchuDPFVAxzcXYcR5B6jE6Qw==" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mui/base": { + "version": "5.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.21.tgz", + "integrity": "sha512-eTKWx3WV/nwmRUK4z4K1MzlMyWCsi3WJ3RtV4DiXZeRh4qd4JCyp1Zzzi8Wv9xM4dEBmqQntFoei716PzwmFfA==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@floating-ui/react-dom": "^2.0.2", + "@mui/types": "^7.2.7", + "@mui/utils": "^5.14.15", + "@popperjs/core": "^2.11.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.14.14", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.14.tgz", + "integrity": "sha512-Rw/xKiTOUgXD8hdKqj60aC6QcGprMipG7ne2giK6Mz7b4PlhL/xog9xLeclY3BxsRLkZQ05egFnIEY1CSibTbw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + } + }, + "node_modules/@mui/joy": { + "version": "5.0.0-beta.11", + "resolved": "https://registry.npmjs.org/@mui/joy/-/joy-5.0.0-beta.11.tgz", + "integrity": "sha512-NHtNPaNkpvL8o4VFsMcNBKVlYNaRttl9bLYbK6H0xzVYzk0PV/CHsauY35kpG8o67qsFaXy5nRe5RZPglNwX1Q==", + "dependencies": { + "@babel/runtime": "^7.23.1", + "@mui/base": "5.0.0-beta.20", + "@mui/core-downloads-tracker": "^5.14.14", + "@mui/system": "^5.14.14", + "@mui/types": "^7.2.6", + "@mui/utils": "^5.14.13", + "clsx": "^2.0.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/joy/node_modules/@mui/base": { + "version": "5.0.0-beta.20", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.20.tgz", + "integrity": "sha512-CS2pUuqxST7ch9VNDCklRYDbJ3rru20Tx7na92QvVVKfu3RL4z/QLuVIc8jYGsdCnauMaeUSlFNLAJNb0yXe6w==", + "dependencies": { + "@babel/runtime": "^7.23.1", + "@floating-ui/react-dom": "^2.0.2", + "@mui/types": "^7.2.6", + "@mui/utils": "^5.14.13", + "@popperjs/core": "^2.11.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "5.14.14", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.14.tgz", + "integrity": "sha512-n77au3CQj9uu16hak2Y+rvbGSBaJKxziG/gEbOLVGrAuqZ+ycVSkorCfN6Y/4XgYOpG/xvmuiY3JwhAEOzY3iA==", + "dependencies": { + "@babel/runtime": "^7.23.1", + "@mui/utils": "^5.14.13", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "5.14.14", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.14.tgz", + "integrity": "sha512-sF3DS2PVG+cFWvkVHQQaGFpL1h6gSwOW3L91pdxPLQDHDZ5mZ/X0SlXU5XA+WjypoysG4urdAQC7CH/BRvUiqg==", + "dependencies": { + "@babel/runtime": "^7.23.1", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "5.14.14", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.14.tgz", + "integrity": "sha512-y4InFmCgGGWXnz+iK4jRTWVikY0HgYnABjz4wgiUgEa2W1H8M4ow+27BegExUWPkj4TWthQ2qG9FOGSMtI+PKA==", + "dependencies": { + "@babel/runtime": "^7.23.1", + "@mui/private-theming": "^5.14.14", + "@mui/styled-engine": "^5.14.13", + "@mui/types": "^7.2.6", + "@mui/utils": "^5.14.13", + "clsx": "^2.0.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.2.7", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.7.tgz", + "integrity": "sha512-sofpWmcBqOlTzRbr1cLQuUDKaUYVZTw8ENQrtL39TECRNENEzwgnNPh6WMfqMZlMvf1Aj9DLg74XPjnLr0izUQ==", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.14.15", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.15.tgz", + "integrity": "sha512-QBfHovAvTa0J1jXuYDaXGk+Yyp7+Fm8GSqx6nK2JbezGqzCFfirNdop/+bL9Flh/OQ/64PeXcW4HGDdOge+n3A==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@types/prop-types": "^15.7.8", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@tabler/icons": { + "version": "2.39.0", + "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-2.39.0.tgz", + "integrity": "sha512-iK3j2jIEGIUaJcbYYg5iwyG1Y/m4lzUxAUbxRpvgeXCWP29jvZaH5hajZmU3KaSealddHuJg7PSQislPHpCsoQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/codecalm" + } + }, + "node_modules/@tabler/icons-react": { + "version": "2.39.0", + "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-2.39.0.tgz", + "integrity": "sha512-MyUK1jqtmHPZBnDXqIc1Y5OnfoqG+tGaSB1/gcl0mlY462fJ5f3QB0ZIZzAHMAGYb6K2iJSdFIFavhcgpDDZ7Q==", + "dependencies": { + "@tabler/icons": "2.39.0", + "prop-types": "^15.7.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/codecalm" + }, + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.1.tgz", + "integrity": "sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.9", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.9.tgz", + "integrity": "sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==" + }, + "node_modules/@types/react": { + "version": "18.0.21", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.21.tgz", + "integrity": "sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.0.6", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.6.tgz", + "integrity": "sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + }, + "node_modules/@vitejs/plugin-react": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-2.1.0.tgz", + "integrity": "sha512-am6rPyyU3LzUYne3Gd9oj9c4Rzbq5hQnuGXSMT6Gujq45Il/+bunwq3lrB7wghLkiF45ygMwft37vgJ/NE8IAA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.18.13", + "@babel/plugin-transform-react-jsx": "^7.18.10", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-jsx-self": "^7.18.6", + "@babel/plugin-transform-react-jsx-source": "^7.18.6", + "magic-string": "^0.26.2", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^3.0.0" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/autoprefixer": { + "version": "10.4.12", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz", + "integrity": "sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001407", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001414", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz", + "integrity": "sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", + "dev": true + }, + "node_modules/detective": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", + "dev": true, + "dependencies": { + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" + }, + "bin": { + "detective": "bin/detective.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.270", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.270.tgz", + "integrity": "sha512-KNhIzgLiJmDDC444dj9vEOpZEgsV96ult9Iff98Vanumn+ShJHd5se8aX6KeVxdc0YQeqdrezBZv89rleDbvSg==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/esbuild": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.10.tgz", + "integrity": "sha512-N7wBhfJ/E5fzn/SpNgX+oW2RLRjwaL8Y0ezqNqhjD6w0H2p0rDuEz2FKZqpqLnO8DCaWumKe8dsC/ljvVSSxng==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.15.10", + "@esbuild/linux-loong64": "0.15.10", + "esbuild-android-64": "0.15.10", + "esbuild-android-arm64": "0.15.10", + "esbuild-darwin-64": "0.15.10", + "esbuild-darwin-arm64": "0.15.10", + "esbuild-freebsd-64": "0.15.10", + "esbuild-freebsd-arm64": "0.15.10", + "esbuild-linux-32": "0.15.10", + "esbuild-linux-64": "0.15.10", + "esbuild-linux-arm": "0.15.10", + "esbuild-linux-arm64": "0.15.10", + "esbuild-linux-mips64le": "0.15.10", + "esbuild-linux-ppc64le": "0.15.10", + "esbuild-linux-riscv64": "0.15.10", + "esbuild-linux-s390x": "0.15.10", + "esbuild-netbsd-64": "0.15.10", + "esbuild-openbsd-64": "0.15.10", + "esbuild-sunos-64": "0.15.10", + "esbuild-windows-32": "0.15.10", + "esbuild-windows-64": "0.15.10", + "esbuild-windows-arm64": "0.15.10" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.10.tgz", + "integrity": "sha512-UI7krF8OYO1N7JYTgLT9ML5j4+45ra3amLZKx7LO3lmLt1Ibn8t3aZbX5Pu4BjWiqDuJ3m/hsvhPhK/5Y/YpnA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.10.tgz", + "integrity": "sha512-EOt55D6xBk5O05AK8brXUbZmoFj4chM8u3riGflLa6ziEoVvNjRdD7Cnp82NHQGfSHgYR06XsPI8/sMuA/cUwg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.10.tgz", + "integrity": "sha512-hbDJugTicqIm+WKZgp208d7FcXcaK8j2c0l+fqSJ3d2AzQAfjEYDRM3Z2oMeqSJ9uFxyj/muSACLdix7oTstRA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.10.tgz", + "integrity": "sha512-M1t5+Kj4IgSbYmunf2BB6EKLkWUq+XlqaFRiGOk8bmBapu9bCDrxjf4kUnWn59Dka3I27EiuHBKd1rSO4osLFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.10.tgz", + "integrity": "sha512-KMBFMa7C8oc97nqDdoZwtDBX7gfpolkk6Bcmj6YFMrtCMVgoU/x2DI1p74DmYl7CSS6Ppa3xgemrLrr5IjIn0w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.10.tgz", + "integrity": "sha512-m2KNbuCX13yQqLlbSojFMHpewbn8wW5uDS6DxRpmaZKzyq8Dbsku6hHvh2U+BcLwWY4mpgXzFUoENEf7IcioGg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.10.tgz", + "integrity": "sha512-guXrwSYFAvNkuQ39FNeV4sNkNms1bLlA5vF1H0cazZBOLdLFIny6BhT+TUbK/hdByMQhtWQ5jI9VAmPKbVPu1w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.10.tgz", + "integrity": "sha512-jd8XfaSJeucMpD63YNMO1JCrdJhckHWcMv6O233bL4l6ogQKQOxBYSRP/XLWP+6kVTu0obXovuckJDcA0DKtQA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.10.tgz", + "integrity": "sha512-6N8vThLL/Lysy9y4Ex8XoLQAlbZKUyExCWyayGi2KgTBelKpPgj6RZnUaKri0dHNPGgReJriKVU6+KDGQwn10A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.10.tgz", + "integrity": "sha512-GByBi4fgkvZFTHFDYNftu1DQ1GzR23jws0oWyCfhnI7eMOe+wgwWrc78dbNk709Ivdr/evefm2PJiUBMiusS1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.10.tgz", + "integrity": "sha512-BxP+LbaGVGIdQNJUNF7qpYjEGWb0YyHVSKqYKrn+pTwH/SiHUxFyJYSP3pqkku61olQiSBnSmWZ+YUpj78Tw7Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.10.tgz", + "integrity": "sha512-LoSQCd6498PmninNgqd/BR7z3Bsk/mabImBWuQ4wQgmQEeanzWd5BQU2aNi9mBURCLgyheuZS6Xhrw5luw3OkQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.10.tgz", + "integrity": "sha512-Lrl9Cr2YROvPV4wmZ1/g48httE8z/5SCiXIyebiB5N8VT7pX3t6meI7TQVHw/wQpqP/AF4SksDuFImPTM7Z32Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.10.tgz", + "integrity": "sha512-ReP+6q3eLVVP2lpRrvl5EodKX7EZ1bS1/z5j6hsluAlZP5aHhk6ghT6Cq3IANvvDdscMMCB4QEbI+AjtvoOFpA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.10.tgz", + "integrity": "sha512-iGDYtJCMCqldMskQ4eIV+QSS/CuT7xyy9i2/FjpKvxAuCzrESZXiA1L64YNj6/afuzfBe9i8m/uDkFHy257hTw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.10.tgz", + "integrity": "sha512-ftMMIwHWrnrYnvuJQRJs/Smlcb28F9ICGde/P3FUTCgDDM0N7WA0o9uOR38f5Xe2/OhNCgkjNeb7QeaE3cyWkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.10.tgz", + "integrity": "sha512-mf7hBL9Uo2gcy2r3rUFMjVpTaGpFJJE5QTDDqUFf1632FxteYANffDZmKbqX0PfeQ2XjUDE604IcE7OJeoHiyg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.10.tgz", + "integrity": "sha512-ttFVo+Cg8b5+qHmZHbEc8Vl17kCleHhLzgT8X04y8zudEApo0PxPg9Mz8Z2cKH1bCYlve1XL8LkyXGFjtUYeGg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.10.tgz", + "integrity": "sha512-2H0gdsyHi5x+8lbng3hLbxDWR7mKHWh5BXZGKVG830KUmXOOWFE2YKJ4tHRkejRduOGDrBvHBriYsGtmTv3ntA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.10.tgz", + "integrity": "sha512-S+th4F+F8VLsHLR0zrUcG+Et4hx0RKgK1eyHc08kztmLOES8BWwMiaGdoW9hiXuzznXQ0I/Fg904MNbr11Nktw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/magic-string": { + "version": "0.26.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.5.tgz", + "integrity": "sha512-yXUIYOOQnEHKHOftp5shMWpB9ImfgfDJpapa38j/qMtTj5QHWucvxP4lUtuRmHT9vAzvtpHkWKXW9xBwimXeNg==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "node_modules/monaco-editor": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.39.0.tgz", + "integrity": "sha512-zhbZ2Nx93tLR8aJmL2zI1mhJpsl87HMebNBM6R8z4pLfs8pj604pIVIVwyF1TivcfNtIPpMXL+nb3DsBmE/x6Q==", + "peer": true + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", + "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", + "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.6" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prettier": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/react-monaco-editor": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/react-monaco-editor/-/react-monaco-editor-0.54.0.tgz", + "integrity": "sha512-9JwO69851mfpuhYLHlKbae7omQWJ/2ICE2lbL0VHyNyZR8rCOH7440u+zAtDgiOMpLwmYdY1sEZCdRefywX6GQ==", + "dependencies": { + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "@types/react": ">=16 <= 18", + "monaco-editor": "^0.39.0", + "react": ">=16 <= 18" + } + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.8.tgz", + "integrity": "sha512-YSneUCZSFDYMwk+TGq8qYFdCA3yfBRdBlS7txSq0LUmzyeqRe3a8fBQzbz9M3WS/iFT4BNf/nmw9mEzrnSaC0g==", + "dev": true, + "dependencies": { + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "color-name": "^1.1.4", + "detective": "^5.2.1", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "lilconfig": "^2.0.6", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.14", + "postcss-import": "^14.1.0", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.4", + "postcss-nested": "5.0.6", + "postcss-selector-parser": "^6.0.10", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.22.1" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/tailwindcss/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", + "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/vite": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.7.tgz", + "integrity": "sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==", + "dev": true, + "dependencies": { + "esbuild": "^0.15.9", + "postcss": "^8.4.18", + "resolve": "^1.22.1", + "rollup": "^2.79.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "requires": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + } + }, + "@babel/compat-data": { + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.3.tgz", + "integrity": "sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw==", + "dev": true + }, + "@babel/core": { + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz", + "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.3", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helpers": "^7.19.0", + "@babel/parser": "^7.19.3", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.3", + "@babel/types": "^7.19.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + } + }, + "@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "dev": true, + "requires": { + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz", + "integrity": "sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.19.3", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "requires": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", + "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", + "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", + "dev": true + }, + "@babel/helper-simple-access": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==" + }, + "@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz", + "integrity": "sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==", + "dev": true, + "requires": { + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" + } + }, + "@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "requires": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "dev": true + }, + "@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz", + "integrity": "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.19.0" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", + "dev": true, + "requires": { + "@babel/plugin-transform-react-jsx": "^7.18.6" + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz", + "integrity": "sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.18.6.tgz", + "integrity": "sha512-utZmlASneDfdaMh0m/WausbjUjEdGrQJz0vFK93d7wD3xf5wBtX219+q6IlCNZeguIcxS2f/CvLZrlLSvSHQXw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/runtime": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "requires": { + "regenerator-runtime": "^0.14.0" + } + }, + "@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + } + }, + "@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "requires": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + }, + "@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + } + } + }, + "@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "requires": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "@emotion/is-prop-valid": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "requires": { + "@emotion/memoize": "^0.8.1" + } + }, + "@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "@emotion/react": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz", + "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + } + }, + "@emotion/serialize": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", + "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", + "requires": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "@emotion/styled": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", + "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.1", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + } + }, + "@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "requires": {} + }, + "@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, + "@esbuild/android-arm": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.10.tgz", + "integrity": "sha512-FNONeQPy/ox+5NBkcSbYJxoXj9GWu8gVGJTVmUyoOCKQFDTrHVKgNSzChdNt0I8Aj/iKcsDf2r9BFwv+FSNUXg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.10.tgz", + "integrity": "sha512-w0Ou3Z83LOYEkwaui2M8VwIp+nLi/NA60lBLMvaJ+vXVMcsARYdEzLNE7RSm4+lSg4zq4d7fAVuzk7PNQ5JFgg==", + "dev": true, + "optional": true + }, + "@floating-ui/core": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", + "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", + "requires": { + "@floating-ui/utils": "^0.1.3" + } + }, + "@floating-ui/dom": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "requires": { + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" + } + }, + "@floating-ui/react-dom": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz", + "integrity": "sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==", + "requires": { + "@floating-ui/dom": "^1.5.1" + } + }, + "@floating-ui/utils": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", + "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" + }, + "@fontsource-variable/inter": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/@fontsource-variable/inter/-/inter-5.0.13.tgz", + "integrity": "sha512-mb2WyZ2rHeqIG8aqGJIvLBOmo4sg2x7SHlsE6PUhwxbOicVzO59EZwSGtzNO3FmchuDPFVAxzcXYcR5B6jE6Qw==" + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "@mui/base": { + "version": "5.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.21.tgz", + "integrity": "sha512-eTKWx3WV/nwmRUK4z4K1MzlMyWCsi3WJ3RtV4DiXZeRh4qd4JCyp1Zzzi8Wv9xM4dEBmqQntFoei716PzwmFfA==", + "requires": { + "@babel/runtime": "^7.23.2", + "@floating-ui/react-dom": "^2.0.2", + "@mui/types": "^7.2.7", + "@mui/utils": "^5.14.15", + "@popperjs/core": "^2.11.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1" + } + }, + "@mui/core-downloads-tracker": { + "version": "5.14.14", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.14.tgz", + "integrity": "sha512-Rw/xKiTOUgXD8hdKqj60aC6QcGprMipG7ne2giK6Mz7b4PlhL/xog9xLeclY3BxsRLkZQ05egFnIEY1CSibTbw==" + }, + "@mui/joy": { + "version": "5.0.0-beta.11", + "resolved": "https://registry.npmjs.org/@mui/joy/-/joy-5.0.0-beta.11.tgz", + "integrity": "sha512-NHtNPaNkpvL8o4VFsMcNBKVlYNaRttl9bLYbK6H0xzVYzk0PV/CHsauY35kpG8o67qsFaXy5nRe5RZPglNwX1Q==", + "requires": { + "@babel/runtime": "^7.23.1", + "@mui/base": "5.0.0-beta.20", + "@mui/core-downloads-tracker": "^5.14.14", + "@mui/system": "^5.14.14", + "@mui/types": "^7.2.6", + "@mui/utils": "^5.14.13", + "clsx": "^2.0.0", + "prop-types": "^15.8.1" + }, + "dependencies": { + "@mui/base": { + "version": "5.0.0-beta.20", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.20.tgz", + "integrity": "sha512-CS2pUuqxST7ch9VNDCklRYDbJ3rru20Tx7na92QvVVKfu3RL4z/QLuVIc8jYGsdCnauMaeUSlFNLAJNb0yXe6w==", + "requires": { + "@babel/runtime": "^7.23.1", + "@floating-ui/react-dom": "^2.0.2", + "@mui/types": "^7.2.6", + "@mui/utils": "^5.14.13", + "@popperjs/core": "^2.11.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1" + } + } + } + }, + "@mui/private-theming": { + "version": "5.14.14", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.14.tgz", + "integrity": "sha512-n77au3CQj9uu16hak2Y+rvbGSBaJKxziG/gEbOLVGrAuqZ+ycVSkorCfN6Y/4XgYOpG/xvmuiY3JwhAEOzY3iA==", + "requires": { + "@babel/runtime": "^7.23.1", + "@mui/utils": "^5.14.13", + "prop-types": "^15.8.1" + } + }, + "@mui/styled-engine": { + "version": "5.14.14", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.14.tgz", + "integrity": "sha512-sF3DS2PVG+cFWvkVHQQaGFpL1h6gSwOW3L91pdxPLQDHDZ5mZ/X0SlXU5XA+WjypoysG4urdAQC7CH/BRvUiqg==", + "requires": { + "@babel/runtime": "^7.23.1", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + } + }, + "@mui/system": { + "version": "5.14.14", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.14.tgz", + "integrity": "sha512-y4InFmCgGGWXnz+iK4jRTWVikY0HgYnABjz4wgiUgEa2W1H8M4ow+27BegExUWPkj4TWthQ2qG9FOGSMtI+PKA==", + "requires": { + "@babel/runtime": "^7.23.1", + "@mui/private-theming": "^5.14.14", + "@mui/styled-engine": "^5.14.13", + "@mui/types": "^7.2.6", + "@mui/utils": "^5.14.13", + "clsx": "^2.0.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + } + }, + "@mui/types": { + "version": "7.2.7", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.7.tgz", + "integrity": "sha512-sofpWmcBqOlTzRbr1cLQuUDKaUYVZTw8ENQrtL39TECRNENEzwgnNPh6WMfqMZlMvf1Aj9DLg74XPjnLr0izUQ==", + "requires": {} + }, + "@mui/utils": { + "version": "5.14.15", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.15.tgz", + "integrity": "sha512-QBfHovAvTa0J1jXuYDaXGk+Yyp7+Fm8GSqx6nK2JbezGqzCFfirNdop/+bL9Flh/OQ/64PeXcW4HGDdOge+n3A==", + "requires": { + "@babel/runtime": "^7.23.2", + "@types/prop-types": "^15.7.8", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==" + }, + "@tabler/icons": { + "version": "2.39.0", + "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-2.39.0.tgz", + "integrity": "sha512-iK3j2jIEGIUaJcbYYg5iwyG1Y/m4lzUxAUbxRpvgeXCWP29jvZaH5hajZmU3KaSealddHuJg7PSQislPHpCsoQ==" + }, + "@tabler/icons-react": { + "version": "2.39.0", + "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-2.39.0.tgz", + "integrity": "sha512-MyUK1jqtmHPZBnDXqIc1Y5OnfoqG+tGaSB1/gcl0mlY462fJ5f3QB0ZIZzAHMAGYb6K2iJSdFIFavhcgpDDZ7Q==", + "requires": { + "@tabler/icons": "2.39.0", + "prop-types": "^15.7.2" + } + }, + "@types/parse-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.1.tgz", + "integrity": "sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng==" + }, + "@types/prop-types": { + "version": "15.7.9", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.9.tgz", + "integrity": "sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==" + }, + "@types/react": { + "version": "18.0.21", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.21.tgz", + "integrity": "sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA==", + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-dom": { + "version": "18.0.6", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.6.tgz", + "integrity": "sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + }, + "@vitejs/plugin-react": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-2.1.0.tgz", + "integrity": "sha512-am6rPyyU3LzUYne3Gd9oj9c4Rzbq5hQnuGXSMT6Gujq45Il/+bunwq3lrB7wghLkiF45ygMwft37vgJ/NE8IAA==", + "dev": true, + "requires": { + "@babel/core": "^7.18.13", + "@babel/plugin-transform-react-jsx": "^7.18.10", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-jsx-self": "^7.18.6", + "@babel/plugin-transform-react-jsx-source": "^7.18.6", + "magic-string": "^0.26.2", + "react-refresh": "^0.14.0" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "autoprefixer": { + "version": "10.4.12", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz", + "integrity": "sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q==", + "dev": true, + "requires": { + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001407", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "requires": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001414", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz", + "integrity": "sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==" + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", + "dev": true + }, + "detective": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", + "dev": true, + "requires": { + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" + } + }, + "didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.270", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.270.tgz", + "integrity": "sha512-KNhIzgLiJmDDC444dj9vEOpZEgsV96ult9Iff98Vanumn+ShJHd5se8aX6KeVxdc0YQeqdrezBZv89rleDbvSg==", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "esbuild": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.10.tgz", + "integrity": "sha512-N7wBhfJ/E5fzn/SpNgX+oW2RLRjwaL8Y0ezqNqhjD6w0H2p0rDuEz2FKZqpqLnO8DCaWumKe8dsC/ljvVSSxng==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.15.10", + "@esbuild/linux-loong64": "0.15.10", + "esbuild-android-64": "0.15.10", + "esbuild-android-arm64": "0.15.10", + "esbuild-darwin-64": "0.15.10", + "esbuild-darwin-arm64": "0.15.10", + "esbuild-freebsd-64": "0.15.10", + "esbuild-freebsd-arm64": "0.15.10", + "esbuild-linux-32": "0.15.10", + "esbuild-linux-64": "0.15.10", + "esbuild-linux-arm": "0.15.10", + "esbuild-linux-arm64": "0.15.10", + "esbuild-linux-mips64le": "0.15.10", + "esbuild-linux-ppc64le": "0.15.10", + "esbuild-linux-riscv64": "0.15.10", + "esbuild-linux-s390x": "0.15.10", + "esbuild-netbsd-64": "0.15.10", + "esbuild-openbsd-64": "0.15.10", + "esbuild-sunos-64": "0.15.10", + "esbuild-windows-32": "0.15.10", + "esbuild-windows-64": "0.15.10", + "esbuild-windows-arm64": "0.15.10" + } + }, + "esbuild-android-64": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.10.tgz", + "integrity": "sha512-UI7krF8OYO1N7JYTgLT9ML5j4+45ra3amLZKx7LO3lmLt1Ibn8t3aZbX5Pu4BjWiqDuJ3m/hsvhPhK/5Y/YpnA==", + "dev": true, + "optional": true + }, + "esbuild-android-arm64": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.10.tgz", + "integrity": "sha512-EOt55D6xBk5O05AK8brXUbZmoFj4chM8u3riGflLa6ziEoVvNjRdD7Cnp82NHQGfSHgYR06XsPI8/sMuA/cUwg==", + "dev": true, + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.10.tgz", + "integrity": "sha512-hbDJugTicqIm+WKZgp208d7FcXcaK8j2c0l+fqSJ3d2AzQAfjEYDRM3Z2oMeqSJ9uFxyj/muSACLdix7oTstRA==", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.10.tgz", + "integrity": "sha512-M1t5+Kj4IgSbYmunf2BB6EKLkWUq+XlqaFRiGOk8bmBapu9bCDrxjf4kUnWn59Dka3I27EiuHBKd1rSO4osLFQ==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.10.tgz", + "integrity": "sha512-KMBFMa7C8oc97nqDdoZwtDBX7gfpolkk6Bcmj6YFMrtCMVgoU/x2DI1p74DmYl7CSS6Ppa3xgemrLrr5IjIn0w==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.10.tgz", + "integrity": "sha512-m2KNbuCX13yQqLlbSojFMHpewbn8wW5uDS6DxRpmaZKzyq8Dbsku6hHvh2U+BcLwWY4mpgXzFUoENEf7IcioGg==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.10.tgz", + "integrity": "sha512-guXrwSYFAvNkuQ39FNeV4sNkNms1bLlA5vF1H0cazZBOLdLFIny6BhT+TUbK/hdByMQhtWQ5jI9VAmPKbVPu1w==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.10.tgz", + "integrity": "sha512-jd8XfaSJeucMpD63YNMO1JCrdJhckHWcMv6O233bL4l6ogQKQOxBYSRP/XLWP+6kVTu0obXovuckJDcA0DKtQA==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.10.tgz", + "integrity": "sha512-6N8vThLL/Lysy9y4Ex8XoLQAlbZKUyExCWyayGi2KgTBelKpPgj6RZnUaKri0dHNPGgReJriKVU6+KDGQwn10A==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.10.tgz", + "integrity": "sha512-GByBi4fgkvZFTHFDYNftu1DQ1GzR23jws0oWyCfhnI7eMOe+wgwWrc78dbNk709Ivdr/evefm2PJiUBMiusS1A==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.10.tgz", + "integrity": "sha512-BxP+LbaGVGIdQNJUNF7qpYjEGWb0YyHVSKqYKrn+pTwH/SiHUxFyJYSP3pqkku61olQiSBnSmWZ+YUpj78Tw7Q==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.10.tgz", + "integrity": "sha512-LoSQCd6498PmninNgqd/BR7z3Bsk/mabImBWuQ4wQgmQEeanzWd5BQU2aNi9mBURCLgyheuZS6Xhrw5luw3OkQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-riscv64": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.10.tgz", + "integrity": "sha512-Lrl9Cr2YROvPV4wmZ1/g48httE8z/5SCiXIyebiB5N8VT7pX3t6meI7TQVHw/wQpqP/AF4SksDuFImPTM7Z32Q==", + "dev": true, + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.10.tgz", + "integrity": "sha512-ReP+6q3eLVVP2lpRrvl5EodKX7EZ1bS1/z5j6hsluAlZP5aHhk6ghT6Cq3IANvvDdscMMCB4QEbI+AjtvoOFpA==", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.10.tgz", + "integrity": "sha512-iGDYtJCMCqldMskQ4eIV+QSS/CuT7xyy9i2/FjpKvxAuCzrESZXiA1L64YNj6/afuzfBe9i8m/uDkFHy257hTw==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.10.tgz", + "integrity": "sha512-ftMMIwHWrnrYnvuJQRJs/Smlcb28F9ICGde/P3FUTCgDDM0N7WA0o9uOR38f5Xe2/OhNCgkjNeb7QeaE3cyWkQ==", + "dev": true, + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.10.tgz", + "integrity": "sha512-mf7hBL9Uo2gcy2r3rUFMjVpTaGpFJJE5QTDDqUFf1632FxteYANffDZmKbqX0PfeQ2XjUDE604IcE7OJeoHiyg==", + "dev": true, + "optional": true + }, + "esbuild-windows-32": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.10.tgz", + "integrity": "sha512-ttFVo+Cg8b5+qHmZHbEc8Vl17kCleHhLzgT8X04y8zudEApo0PxPg9Mz8Z2cKH1bCYlve1XL8LkyXGFjtUYeGg==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.10.tgz", + "integrity": "sha512-2H0gdsyHi5x+8lbng3hLbxDWR7mKHWh5BXZGKVG830KUmXOOWFE2YKJ4tHRkejRduOGDrBvHBriYsGtmTv3ntA==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.10.tgz", + "integrity": "sha512-S+th4F+F8VLsHLR0zrUcG+Et4hx0RKgK1eyHc08kztmLOES8BWwMiaGdoW9hiXuzznXQ0I/Fg904MNbr11Nktw==", + "dev": true, + "optional": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "lilconfig": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", + "dev": true + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "magic-string": { + "version": "0.26.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.5.tgz", + "integrity": "sha512-yXUIYOOQnEHKHOftp5shMWpB9ImfgfDJpapa38j/qMtTj5QHWucvxP4lUtuRmHT9vAzvtpHkWKXW9xBwimXeNg==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "monaco-editor": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.39.0.tgz", + "integrity": "sha512-zhbZ2Nx93tLR8aJmL2zI1mhJpsl87HMebNBM6R8z4pLfs8pj604pIVIVwyF1TivcfNtIPpMXL+nb3DsBmE/x6Q==", + "peer": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true + }, + "node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + }, + "postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "dev": true, + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-js": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", + "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", + "dev": true, + "requires": { + "camelcase-css": "^2.0.1" + } + }, + "postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "requires": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + } + }, + "postcss-nested": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", + "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.6" + } + }, + "postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "prettier": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", + "dev": true + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true + }, + "react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "react-monaco-editor": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/react-monaco-editor/-/react-monaco-editor-0.54.0.tgz", + "integrity": "sha512-9JwO69851mfpuhYLHlKbae7omQWJ/2ICE2lbL0VHyNyZR8rCOH7440u+zAtDgiOMpLwmYdY1sEZCdRefywX6GQ==", + "requires": { + "prop-types": "^15.8.1" + } + }, + "react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "requires": { + "pify": "^2.3.0" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "tailwindcss": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.8.tgz", + "integrity": "sha512-YSneUCZSFDYMwk+TGq8qYFdCA3yfBRdBlS7txSq0LUmzyeqRe3a8fBQzbz9M3WS/iFT4BNf/nmw9mEzrnSaC0g==", + "dev": true, + "requires": { + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "color-name": "^1.1.4", + "detective": "^5.2.1", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "lilconfig": "^2.0.6", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.14", + "postcss-import": "^14.1.0", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.4", + "postcss-nested": "5.0.6", + "postcss-selector-parser": "^6.0.10", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.22.1" + }, + "dependencies": { + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", + "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "vite": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.7.tgz", + "integrity": "sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==", + "dev": true, + "requires": { + "esbuild": "^0.15.9", + "fsevents": "~2.3.2", + "postcss": "^8.4.18", + "resolve": "^1.22.1", + "rollup": "^2.79.1" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + } + } } diff --git a/frontend/package.json b/frontend/package.json index 061f833..f28203b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,34 +1,34 @@ { - "name": "{{.ProjectName}}", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "tsc && vite build", - "preview": "vite preview" - }, - "dependencies": { - "@emotion/react": "^11.11.1", - "@emotion/styled": "^11.11.0", - "@fontsource-variable/inter": "^5.0.13", - "@mui/base": "^5.0.0-beta.21", - "@mui/joy": "^5.0.0-beta.11", - "@tabler/icons-react": "^2.39.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-monaco-editor": "^0.54.0" - }, - "devDependencies": { - "@types/react": "^18.0.17", - "@types/react-dom": "^18.0.6", - "@vitejs/plugin-react": "^2.1.0", - "autoprefixer": "^10.4.12", - "postcss": "^8.4.17", - "prettier": "3.1.1", - "tailwindcss": "^3.1.8", - "typescript": "^4.6.4", - "vite": "^3.1.0" - }, - "author": "{{.AuthorName}}" + "name": "{{.ProjectName}}", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@fontsource-variable/inter": "^5.0.13", + "@mui/base": "^5.0.0-beta.21", + "@mui/joy": "^5.0.0-beta.11", + "@tabler/icons-react": "^2.39.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-monaco-editor": "^0.54.0" + }, + "devDependencies": { + "@types/react": "^18.0.17", + "@types/react-dom": "^18.0.6", + "@vitejs/plugin-react": "^2.1.0", + "autoprefixer": "^10.4.12", + "postcss": "^8.4.17", + "prettier": "3.1.1", + "tailwindcss": "^3.1.8", + "typescript": "^4.6.4", + "vite": "^3.1.0" + }, + "author": "{{.AuthorName}}" } diff --git a/frontend/postcss.config.cjs b/frontend/postcss.config.cjs index 12a703d..e873f1a 100644 --- a/frontend/postcss.config.cjs +++ b/frontend/postcss.config.cjs @@ -1,6 +1,6 @@ module.exports = { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, }; diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index a548194..6272885 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1,21 +1,21 @@ import { - Alert, - AspectRatio, - Button, - Card, - DialogActions, - DialogTitle, - Divider, - Drawer, - IconButton, - List, - ListItem, - ListItemButton, - Modal, - ModalClose, - ModalDialog, - Tooltip, - Typography, + Alert, + AspectRatio, + Button, + Card, + DialogActions, + DialogTitle, + Divider, + Drawer, + IconButton, + List, + ListItem, + ListItemButton, + Modal, + ModalClose, + ModalDialog, + Tooltip, + Typography, } from "@mui/joy"; import { ThemeSwitcher } from "./components/ThemeSwitcher"; import { HomeButton } from "./components/HomeButton"; @@ -23,283 +23,303 @@ import { ServerList } from "./components/ServerList"; import React, { useEffect, useState } from "react"; import { Server } from "./pages/Server"; import { - IconArrowLeft, - IconExternalLink, - IconHome, - IconInfoCircle, - IconPlus, - IconRefresh, + IconArrowLeft, + IconExternalLink, + IconHome, + IconInfoCircle, + IconPlus, + IconRefresh, } from "@tabler/icons-react"; import { - CreateServer, - GetAllServers, - GetAllServersFromDir, - GetServerDir, + CreateServer, + GetAllServers, + GetAllServersFromDir, + GetServerDir, } from "../wailsjs/go/server/ServerController"; import { server } from "../wailsjs/go/models"; import { - BrowserOpenURL, - EventsOff, - EventsOn, - LogDebug, + BrowserOpenURL, + EventsOff, + EventsOn, + LogDebug, } from "../wailsjs/runtime"; import { AlertProvider, useAlert } from "./components/AlertProvider"; import banner from "./assets/AASM_V3_banner2.png"; import { GetVersion } from "../wailsjs/go/helpers/HelpersController"; enum ServerListType { - CARD, - LIST, + CARD, + LIST, } function App() { - const [activeServer, setActiveServer] = useState( - undefined, - ); - const [drawerOpen, setDrawerOpen] = useState(false); - const [servers, setServers] = useState<{ - [key: number]: server.Server; - } | null>(null); - const [infoModalOpen, setInfoModalOpen] = useState(false); - const [appVersion, setAppVersion] = useState(""); - const [earlyError, setEarlyError] = useState(""); + const [activeServer, setActiveServer] = useState( + undefined, + ); + const [drawerOpen, setDrawerOpen] = useState(false); + const [servers, setServers] = useState<{ + [key: number]: server.Server; + } | null>(null); + const [infoModalOpen, setInfoModalOpen] = useState(false); + const [appVersion, setAppVersion] = useState(""); + const [earlyError, setEarlyError] = useState(""); - //This gets all the servers but if one server is changed manually it does not update it! - function getServers() { - GetAllServers() - .then((result) => { - if (typeof result === "object") { - setServers(result); - } else { - // Handle the case where the function returns a boolean. - LogDebug("GetAllServers status: " + result); - } - }) - .catch((error) => { - setEarlyError(error); - console.error(error); - }); - } + //This gets all the servers but if one server is changed manually it does not update it! + function getServers() { + GetAllServers() + .then((result) => { + if (typeof result === "object") { + setServers(result); + } else { + // Handle the case where the function returns a boolean. + LogDebug("GetAllServers status: " + result); + } + }) + .catch((error) => { + setEarlyError(error); + console.error(error); + }); + } - function getServersFromDir() { - GetAllServersFromDir() - .then((result) => { - if (typeof result === "object") { - setServers(result); - console.log(result); - } else { - // Handle the case where the function returns a boolean. - LogDebug("GetAllServers status: " + result); - } - }) - .catch((error) => { - setEarlyError(error); - console.error(error); - }); - } + function getServersFromDir() { + GetAllServersFromDir() + .then((result) => { + if (typeof result === "object") { + setServers(result); + console.log(result); + } else { + // Handle the case where the function returns a boolean. + LogDebug("GetAllServers status: " + result); + } + }) + .catch((error) => { + setEarlyError(error); + console.error(error); + }); + } - useEffect(() => { - getServers(); - GetVersion().then((version) => setAppVersion(version)); - }, []); + useEffect(() => { + getServers(); + GetVersion().then((version) => setAppVersion(version)); + }, []); - useEffect(() => { - EventsOn("reloadServers", getServers); - return () => EventsOff("reloadServers"); - }, []); + useEffect(() => { + EventsOn("reloadServers", getServers); + return () => EventsOff("reloadServers"); + }, []); - //events - useEffect(() => { - EventsOn("serverSaved", getServers); - return () => { - EventsOff("serverSaved"); - }; - }, []); + //events + useEffect(() => { + EventsOn("serverSaved", getServers); + return () => { + EventsOff("serverSaved"); + }; + }, []); - const handleCreateNewServerClicked = () => { - CreateServer(true) - .then((server) => { - getServers(); - setActiveServer(server.id); - setDrawerOpen(false); - }) - .catch((r) => console.error(r)); - }; + const handleCreateNewServerClicked = () => { + CreateServer(true) + .then((server) => { + getServers(); + setActiveServer(server.id); + setDrawerOpen(false); + }) + .catch((r) => console.error(r)); + }; - const ServerDrawer = ( - setDrawerOpen(false)} size="md"> - + const ServerDrawer = ( + setDrawerOpen(false)} + size="md" + > + - Servers: - - - - - - - { - getServersFromDir(); - setActiveServer(undefined); - }} - > - - - - - { - getServers(); - setActiveServer(undefined); - }} - > - - - - - { - GetServerDir().then((dir: string) => - BrowserOpenURL("file:///" + dir), - ); - }} - > - - - - - - - Create new server - - - - - - ); + Servers: + + + + + + + { + getServersFromDir(); + setActiveServer(undefined); + }} + > + + + + + { + getServers(); + setActiveServer(undefined); + }} + > + + + + + { + GetServerDir().then((dir: string) => + BrowserOpenURL("file:///" + dir), + ); + }} + > + + + + + + + Create new server + + + + + + ); - let mainUi = null; - if (activeServer !== undefined) { - mainUi = ; - } else { - if (servers !== null && Object.keys(servers).length > 0) { - mainUi = ( -
-

Select a server:

- -
- ); - } else { - mainUi = ( -
-

You have no servers yet!

- - - {earlyError} - -
- ); - } - } + let mainUi = null; + if (activeServer !== undefined) { + mainUi = ; + } else { + if (servers !== null && Object.keys(servers).length > 0) { + mainUi = ( +
+

Select a server:

+ +
+ ); + } else { + mainUi = ( +
+

You have no servers yet!

+ + + {earlyError} + +
+ ); + } + } - return ( -
- -
-
- -
-
- - - setInfoModalOpen(true)} - > - - - setInfoModalOpen(false)}> - - - - - - -
- Info: - - Version: {appVersion} - -
- - - -
-
-
-
-
- {mainUi} + return ( +
+ +
+
+ +
+
+ + + setInfoModalOpen(true)} + > + + + setInfoModalOpen(false)} + > + + + + + + +
+ + Info: + + + Version: {appVersion} + +
+ + + +
+
+
+
+
+ {mainUi} - {ServerDrawer} -
-
- ); + {ServerDrawer} +
+
+ ); } export default App; diff --git a/frontend/src/components/AlertProvider.tsx b/frontend/src/components/AlertProvider.tsx index 007ce95..9ca4062 100644 --- a/frontend/src/components/AlertProvider.tsx +++ b/frontend/src/components/AlertProvider.tsx @@ -3,85 +3,89 @@ import { Alert } from "@mui/joy"; import { IconX } from "@tabler/icons-react"; type AlertContextType = { - addAlert: ( - message: string, - severity: - | "success" - | "warning" - | "primary" - | "neutral" - | "danger" - | undefined, - ) => void; - alerts: Alert[]; + addAlert: ( + message: string, + severity: + | "success" + | "warning" + | "primary" + | "neutral" + | "danger" + | undefined, + ) => void; + alerts: Alert[]; }; const AlertContext = createContext(undefined); type AlertProviderProps = { - children: ReactNode; + children: ReactNode; }; type Alert = { - message: string; - severity: - | "success" - | "warning" - | "primary" - | "neutral" - | "danger" - | undefined; + message: string; + severity: + | "success" + | "warning" + | "primary" + | "neutral" + | "danger" + | undefined; }; export function AlertProvider({ children }: AlertProviderProps) { - const [alerts, setAlerts] = useState([]); + const [alerts, setAlerts] = useState([]); - const addAlert = ( - message: string, - severity: - | "success" - | "warning" - | "primary" - | "neutral" - | "danger" - | undefined, - ) => { - const newAlert = { message, severity }; - setAlerts([...alerts, newAlert]); + const addAlert = ( + message: string, + severity: + | "success" + | "warning" + | "primary" + | "neutral" + | "danger" + | undefined, + ) => { + const newAlert = { message, severity }; + setAlerts([...alerts, newAlert]); - console.log(alerts); - }; + console.log(alerts); + }; - const removeAlert = (index: number) => { - const updatedAlerts = [...alerts]; - updatedAlerts.splice(index, 1); - setAlerts(updatedAlerts); - }; + const removeAlert = (index: number) => { + const updatedAlerts = [...alerts]; + updatedAlerts.splice(index, 1); + setAlerts(updatedAlerts); + }; - return ( - - {children} + return ( + + {children} -
- {alerts.map((alert, index) => ( - removeAlert(index)} />} - > - {alert.message} - - ))} -
-
- ); +
+ {alerts.map((alert, index) => ( + removeAlert(index)} /> + } + > + {alert.message} + + ))} +
+
+ ); } export function useAlert() { - const context = useContext(AlertContext); - if (!context) { - throw new Error("useAlert must be used within an AlertProvider"); - } - return context; + const context = useContext(AlertContext); + if (!context) { + throw new Error("useAlert must be used within an AlertProvider"); + } + return context; } diff --git a/frontend/src/components/HomeButton.tsx b/frontend/src/components/HomeButton.tsx index 90d8af9..0ff3909 100644 --- a/frontend/src/components/HomeButton.tsx +++ b/frontend/src/components/HomeButton.tsx @@ -4,17 +4,17 @@ import { IconHome } from "@tabler/icons-react"; import { server } from "../../wailsjs/go/models"; type Props = { - setServ: React.Dispatch>; + setServ: React.Dispatch>; }; export const HomeButton = ({ setServ }: Props) => { - return ( - setServ(undefined)} - > - - - ); + return ( + setServ(undefined)} + > + + + ); }; diff --git a/frontend/src/components/PasswordInput.tsx b/frontend/src/components/PasswordInput.tsx index 16c6ba0..aa53c9e 100644 --- a/frontend/src/components/PasswordInput.tsx +++ b/frontend/src/components/PasswordInput.tsx @@ -3,35 +3,35 @@ import React, { useState } from "react"; import { IconEye, IconEyeClosed } from "@tabler/icons-react"; type Props = { - onChange: React.ChangeEventHandler | undefined; - value: string | ReadonlyArray | number | undefined; - children?: any; - className?: string | undefined; - disabled?: boolean; + onChange: React.ChangeEventHandler | undefined; + value: string | ReadonlyArray | number | undefined; + children?: any; + className?: string | undefined; + disabled?: boolean; }; export function PasswordInput({ - onChange, - value, - children, - className, - disabled, + onChange, + value, + children, + className, + disabled, }: Props) { - const [textVisible, setTextVisible] = useState(false); - return ( - setTextVisible(!textVisible)}> - {textVisible ? : } - - } - value={value} - onChange={onChange} - className={className} - disabled={disabled} - > - {children} - - ); + const [textVisible, setTextVisible] = useState(false); + return ( + setTextVisible(!textVisible)}> + {textVisible ? : } + + } + value={value} + onChange={onChange} + className={className} + disabled={disabled} + > + {children} + + ); } diff --git a/frontend/src/components/ServerList.tsx b/frontend/src/components/ServerList.tsx index 0c2a15c..b3d918e 100644 --- a/frontend/src/components/ServerList.tsx +++ b/frontend/src/components/ServerList.tsx @@ -2,201 +2,212 @@ import { Button, Card, List, ListItem, ListItemButton } from "@mui/joy"; import { server } from "../../wailsjs/go/models"; import { IconPlus } from "@tabler/icons-react"; import { - GetConnectedPlayerCount, - GetServerStatus, + GetConnectedPlayerCount, + GetServerStatus, } from "../../wailsjs/go/server/ServerController"; import React, { useState, useEffect } from "react"; import { useAlert } from "../components/AlertProvider"; enum ServerListType { - CARD, - LIST, + CARD, + LIST, } type Props = { - serverListType: ServerListType; - servers: { [key: number]: server.Server } | null; - setActiveServer: React.Dispatch>; - setDrawerOpen: React.Dispatch>; - handleCreateNewServerClicked: () => void; + serverListType: ServerListType; + servers: { [key: number]: server.Server } | null; + setActiveServer: React.Dispatch>; + setDrawerOpen: React.Dispatch>; + handleCreateNewServerClicked: () => void; }; export const ServerList = ({ - serverListType, - servers, - setActiveServer, - setDrawerOpen, - handleCreateNewServerClicked, + serverListType, + servers, + setActiveServer, + setDrawerOpen, + handleCreateNewServerClicked, }: Props) => { - const [playerCounts, setPlayerCounts] = useState< - Record - >({}); - const [serverStatuses, setServerStatuses] = useState< - Record - >({}); - - const { addAlert } = useAlert(); - - // Having a separate useEffect for player counts and server statuses means that each value doesn't have to wait for the other - // I found that having them joined created a situation where player count would be loading as the server started, which forced - // the server status to wait for player count to be fetched. - useEffect(() => { - const refreshPlayerCounts = async () => { - if (!servers) { - return; - } - - await Promise.all( - Object.keys(servers).map(async (key) => { - const serverId = parseInt(key, 10); - if (isNaN(serverId)) { - console.error("Parsing server key failed"); - return; - } - - GetConnectedPlayerCount(serverId) - .then((count) => { - setPlayerCounts((prevPlayerCounts) => { - return { - ...prevPlayerCounts, - [serverId]: count as number, - }; - }); - }) - .catch(() => { - setPlayerCounts((prevPlayerCounts) => { - return { - ...prevPlayerCounts, - [serverId]: 0, - }; - }); - }); - }), - ); - }; - - refreshPlayerCounts(); - }, [servers]); - - useEffect(() => { - const refreshServerStatuses = async () => { - if (!servers) { - return; - } - - await Promise.all( - Object.keys(servers).map(async (key) => { - const serverId = parseInt(key, 10); - if (isNaN(serverId)) { - console.error("Parsing server key failed"); - return; - } - - GetServerStatus(serverId) - .catch((reason) => { - console.error("serverstatus: " + reason); - addAlert(reason, "danger"); - }) - .then((count) => { - setServerStatuses((prevServerStatuses) => { - return { - ...prevServerStatuses, - [serverId]: count as boolean | undefined, - }; - }); - }); - }), - ); - }; - - refreshServerStatuses(); - }, [servers]); - - return ( - <> - - {servers === null ? ( - No servers found or failed to find servers - ) : ( - Object.keys(servers).map((key) => { - const index = parseInt(key, 10); - if (isNaN(index)) { - console.error("Parsing server key failed"); - return null; - } - - const server = servers[index]; - const playerCount = playerCounts[index]; - const serverStatus = serverStatuses[index]; - - if (serverListType === ServerListType.LIST) { - return ( - - { - setActiveServer(index); - setDrawerOpen(false); - }} - > - {index}:{" "} - {server.serverAlias ? server.serverAlias : "Unnamed Server"} - - - ); - } else if (serverListType === ServerListType.CARD) { - return ( - - { - setActiveServer(index); - }} - > -
-
- {server.serverAlias - ? server.serverAlias - : "Unnamed Server"} -
-
- {server.ipAddress}:{server.queryPort} -
- -
- Players:{" "} - {playerCount !== undefined - ? `${playerCount}/${server.maxPlayers}` - : "Loading..."} -
-
- Status:{" "} - {serverStatus !== undefined - ? serverStatus - ? "Running" - : "Stopped" - : "Loading..."} -
-
-
-
- ); - } - }) - )} -
- {serverListType === ServerListType.CARD ? ( - - ) : ( - <> - )} - - ); + const [playerCounts, setPlayerCounts] = useState< + Record + >({}); + const [serverStatuses, setServerStatuses] = useState< + Record + >({}); + + const { addAlert } = useAlert(); + + // Having a separate useEffect for player counts and server statuses means that each value doesn't have to wait for the other + // I found that having them joined created a situation where player count would be loading as the server started, which forced + // the server status to wait for player count to be fetched. + useEffect(() => { + const refreshPlayerCounts = async () => { + if (!servers) { + return; + } + + await Promise.all( + Object.keys(servers).map(async (key) => { + const serverId = parseInt(key, 10); + if (isNaN(serverId)) { + console.error("Parsing server key failed"); + return; + } + + GetConnectedPlayerCount(serverId) + .then((count) => { + setPlayerCounts((prevPlayerCounts) => { + return { + ...prevPlayerCounts, + [serverId]: count as number, + }; + }); + }) + .catch(() => { + setPlayerCounts((prevPlayerCounts) => { + return { + ...prevPlayerCounts, + [serverId]: 0, + }; + }); + }); + }), + ); + }; + + refreshPlayerCounts(); + }, [servers]); + + useEffect(() => { + const refreshServerStatuses = async () => { + if (!servers) { + return; + } + + await Promise.all( + Object.keys(servers).map(async (key) => { + const serverId = parseInt(key, 10); + if (isNaN(serverId)) { + console.error("Parsing server key failed"); + return; + } + + GetServerStatus(serverId) + .catch((reason) => { + console.error("serverstatus: " + reason); + addAlert(reason, "danger"); + }) + .then((count) => { + setServerStatuses((prevServerStatuses) => { + return { + ...prevServerStatuses, + [serverId]: count as boolean | undefined, + }; + }); + }); + }), + ); + }; + + refreshServerStatuses(); + }, [servers]); + + return ( + <> + + {servers === null ? ( + + No servers found or failed to find servers + + ) : ( + Object.keys(servers).map((key) => { + const index = parseInt(key, 10); + if (isNaN(index)) { + console.error("Parsing server key failed"); + return null; + } + + const server = servers[index]; + const playerCount = playerCounts[index]; + const serverStatus = serverStatuses[index]; + + if (serverListType === ServerListType.LIST) { + return ( + + { + setActiveServer(index); + setDrawerOpen(false); + }} + > + {index}:{" "} + {server.serverAlias + ? server.serverAlias + : "Unnamed Server"} + + + ); + } else if (serverListType === ServerListType.CARD) { + return ( + + { + setActiveServer(index); + }} + > +
+
+ {server.serverAlias + ? server.serverAlias + : "Unnamed Server"} +
+
+ {server.ipAddress}: + {server.queryPort} +
+ +
+ Players:{" "} + {playerCount !== undefined + ? `${playerCount}/${server.maxPlayers}` + : "Loading..."} +
+
+ Status:{" "} + {serverStatus !== undefined + ? serverStatus + ? "Running" + : "Stopped" + : "Loading..."} +
+
+
+
+ ); + } + }) + )} +
+ {serverListType === ServerListType.CARD ? ( + + ) : ( + <> + )} + + ); }; diff --git a/frontend/src/components/Slider.tsx b/frontend/src/components/Slider.tsx index 954af08..a52cba9 100644 --- a/frontend/src/components/Slider.tsx +++ b/frontend/src/components/Slider.tsx @@ -2,52 +2,52 @@ import React from "react"; import { server } from "../../wailsjs/go/models"; import { Input, Slider as Sl } from "@mui/joy"; type Props = { - value: number; - onChange: (value: number) => void; - className?: string; - sliderMax?: number; - sliderStep?: number; - sliderMin?: number; - disabled?: boolean; + value: number; + onChange: (value: number) => void; + className?: string; + sliderMax?: number; + sliderStep?: number; + sliderMin?: number; + disabled?: boolean; }; export function Slider({ - value, - onChange, - className, - sliderMax, - sliderStep, - sliderMin, - disabled, + value, + onChange, + className, + sliderMax, + sliderStep, + sliderMin, + disabled, }: Props) { - return ( -
-
- { - let val = v as number; - onChange(val); - }} - > - { - let val = parseInt(e.target.value); - onChange(val); - }} - > -
-
- ); + return ( +
+
+ { + let val = v as number; + onChange(val); + }} + > + { + let val = parseInt(e.target.value); + onChange(val); + }} + > +
+
+ ); } diff --git a/frontend/src/components/ThemeSwitcher.tsx b/frontend/src/components/ThemeSwitcher.tsx index 1138fdb..46586c5 100644 --- a/frontend/src/components/ThemeSwitcher.tsx +++ b/frontend/src/components/ThemeSwitcher.tsx @@ -3,23 +3,23 @@ import React from "react"; import { IconMoon, IconSun } from "@tabler/icons-react"; export const ThemeSwitcher = () => { - const { mode, setMode } = useColorScheme(); - const [mounted, setMounted] = React.useState(false); + const { mode, setMode } = useColorScheme(); + const [mounted, setMounted] = React.useState(false); - React.useEffect(() => { - setMounted(true); - }, []); + React.useEffect(() => { + setMounted(true); + }, []); - if (!mounted) { - return null; - } - return ( - setMode(mode === "dark" ? "light" : "dark")} - > - {mode === "dark" ? : } - - ); + if (!mounted) { + return null; + } + return ( + setMode(mode === "dark" ? "light" : "dark")} + > + {mode === "dark" ? : } + + ); }; diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index 3611d49..14443e3 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -10,13 +10,13 @@ const container = document.getElementById("root"); const root = createRoot(container!); root.render( - - - - - - - - - , + + + + + + + + + , ); diff --git a/frontend/src/pages/InstallUpdater.tsx b/frontend/src/pages/InstallUpdater.tsx index 2157d4e..841e052 100644 --- a/frontend/src/pages/InstallUpdater.tsx +++ b/frontend/src/pages/InstallUpdater.tsx @@ -1,15 +1,15 @@ import React, { useEffect, useState } from "react"; import { server } from "../../wailsjs/go/models"; import { - Button, - Card, - Divider, - FormLabel, - Input, - LinearProgress, - Modal, - ModalDialog, - Typography, + Button, + Card, + Divider, + FormLabel, + Input, + LinearProgress, + Modal, + ModalDialog, + Typography, } from "@mui/joy"; import { OpenDirectoryDialog } from "../../wailsjs/go/helpers/HelpersController"; import { IconDownload, IconTrash } from "@tabler/icons-react"; @@ -19,121 +19,123 @@ import { useAlert } from "../components/AlertProvider"; import { DeleteProfile } from "../../wailsjs/go/server/ServerController"; type Props = { - setServ: React.Dispatch>; - serv: server.Server; - onInstalled: () => void; + setServ: React.Dispatch>; + serv: server.Server; + onInstalled: () => void; }; export function InstallUpdater({ setServ, serv, onInstalled }: Props) { - const [action, setAction] = useState("Preparing"); - const [progress, setProgress] = useState(0.0); - const [isCompleted, setIsCompleted] = useState(false); - const [installerModalOpen, setInstallerModalOpen] = useState(false); - const { addAlert } = useAlert(); - function onServerPathClicked() { - OpenDirectoryDialog().then((val) => - setServ((p) => ({ ...p, serverPath: val })), - ); - } + const [action, setAction] = useState("Preparing"); + const [progress, setProgress] = useState(0.0); + const [isCompleted, setIsCompleted] = useState(false); + const [installerModalOpen, setInstallerModalOpen] = useState(false); + const { addAlert } = useAlert(); + function onServerPathClicked() { + OpenDirectoryDialog().then((val) => + setServ((p) => ({ ...p, serverPath: val })), + ); + } - function onStartInstallButtonClicked() { - if (serv.serverPath == "") { - addAlert("Server Path must be set to a path", "warning"); - return; - } - setInstallerModalOpen(true); - InstallUpdateVerify(serv.serverPath).catch((err) => { - setAction("failed installing: " + err.message); - setInstallerModalOpen(false); - console.error(err); - addAlert("Installer failed: " + err, "danger"); - }); - } + function onStartInstallButtonClicked() { + if (serv.serverPath == "") { + addAlert("Server Path must be set to a path", "warning"); + return; + } + setInstallerModalOpen(true); + InstallUpdateVerify(serv.serverPath).catch((err) => { + setAction("failed installing: " + err.message); + setInstallerModalOpen(false); + console.error(err); + addAlert("Installer failed: " + err, "danger"); + }); + } - function onCancelButtonClicked() { - DeleteProfile(serv.id) - .then(() => { - addAlert("Deleted profile", "success"); - setTimeout(() => { - location.reload(); - }, 500); - }) - .catch((err) => { - console.error(err); - addAlert(err, "danger"); - }); - } + function onCancelButtonClicked() { + DeleteProfile(serv.id) + .then(() => { + addAlert("Deleted profile", "success"); + setTimeout(() => { + location.reload(); + }, 500); + }) + .catch((err) => { + console.error(err); + addAlert(err, "danger"); + }); + } - useEffect(() => { - EventsOn("installingUpdateAction", (data) => { - setAction(data); - }); - EventsOn("installingUpdateProgress", (data) => { - setProgress(data); - }); - EventsOn("appInstalled", () => { - setIsCompleted(true); - setAction("Done"); - setProgress(100); - }); - }, []); + useEffect(() => { + EventsOn("installingUpdateAction", (data) => { + setAction(data); + }); + EventsOn("installingUpdateProgress", (data) => { + setProgress(data); + }); + EventsOn("appInstalled", () => { + setIsCompleted(true); + setAction("Done"); + setProgress(100); + }); + }, []); - return ( -
- - - Install/Update server - - - Status: {action} - - - Progress: - -
- -
- -
-
- - Install server - - Server Path - -
- - -
-
-
- ); + return ( +
+ + + + Install/Update server + + + + Status: {action} + + + Progress: + +
+ +
+ +
+
+ + Install server + + Server Path + +
+ + +
+
+
+ ); } diff --git a/frontend/src/pages/Server.tsx b/frontend/src/pages/Server.tsx index f43c87b..dabbae7 100644 --- a/frontend/src/pages/Server.tsx +++ b/frontend/src/pages/Server.tsx @@ -1,42 +1,42 @@ import { - Button, - ButtonGroup, - Card, - DialogActions, - DialogContent, - DialogTitle, - Divider, - IconButton, - Input, - Modal, - ModalDialog, - Tab, - TabList, - Tabs, - Tooltip, + Button, + ButtonGroup, + Card, + DialogActions, + DialogContent, + DialogTitle, + Divider, + IconButton, + Input, + Modal, + ModalDialog, + Tab, + TabList, + Tabs, + Tooltip, } from "@mui/joy"; import { Administration } from "./server/Administration"; import { General } from "./server/General"; import { useEffect, useState } from "react"; import { server } from "../../wailsjs/go/models"; import { - CheckServerInstalled, - ForceStopServer, - GetGusAsMap, - GetServer, - GetServerStatus, - SaveGusFromMap, - SaveServer, - StartServer, - StopServer, + CheckServerInstalled, + ForceStopServer, + GetGusAsMap, + GetServer, + GetServerStatus, + SaveGusFromMap, + SaveServer, + StartServer, + StopServer, } from "../../wailsjs/go/server/ServerController"; import { InstallUpdater } from "./InstallUpdater"; import { useAlert } from "../components/AlertProvider"; import { BrowserOpenURL, EventsOff, EventsOn } from "../../wailsjs/runtime"; import { - IconAlertCircleFilled, - IconExternalLink, - IconReload, + IconAlertCircleFilled, + IconExternalLink, + IconReload, } from "@tabler/icons-react"; import { Console } from "./server/Console"; import { UpdaterModal } from "./UpdaterModal"; @@ -46,432 +46,478 @@ import { Mods } from "./server/Mods"; import { Ini } from "./server/Ini"; type Props = { - id: number | undefined; - className?: string; + id: number | undefined; + className?: string; }; export const Server = ({ id, className }: Props) => { - const defaultServer = new server.Server(); - defaultServer.id = -1; - defaultServer.serverAlias = ""; - defaultServer.ipAddress = "0.0.0.0"; + const defaultServer = new server.Server(); + defaultServer.id = -1; + defaultServer.serverAlias = ""; + defaultServer.ipAddress = "0.0.0.0"; - const placeholderGus: { [key: string]: { [key: string]: Array } } = { - unknown: { - unknown: [""], // Default value for MaxPlayers - }, - }; + const placeholderGus: { [key: string]: { [key: string]: Array } } = + { + unknown: { + unknown: [""], // Default value for MaxPlayers + }, + }; - const [serv, setServ] = useState(defaultServer); - const [isInstalled, setIsInstalled] = useState(false); - const [serverStatus, setServerStatus] = useState(false); - const [forceStopModalOpen, setForceStopModalOpen] = useState(false); - const [startModalOpen, setStartModalOpen] = useState(false); - const [gus, setGus] = useState<{ - [key: string]: { [key: string]: Array }; - }>(placeholderGus); + const [serv, setServ] = useState(defaultServer); + const [isInstalled, setIsInstalled] = useState(false); + const [serverStatus, setServerStatus] = useState(false); + const [forceStopModalOpen, setForceStopModalOpen] = useState(false); + const [startModalOpen, setStartModalOpen] = useState(false); + const [gus, setGus] = useState<{ + [key: string]: { [key: string]: Array }; + }>(placeholderGus); - const [updaterModalOpen, setUpdaterModalOpen] = useState(false); - const { addAlert } = useAlert(); + const [updaterModalOpen, setUpdaterModalOpen] = useState(false); + const { addAlert } = useAlert(); - //region useEffect land :) + //region useEffect land :) - useEffect(() => { - if (serv.id >= 0) { - GetGusAsMap(serv.id) - .then((val) => setGus(val)) - .catch((reason) => console.error(reason)); - } - }, [serv]); + useEffect(() => { + if (serv.id >= 0) { + GetGusAsMap(serv.id) + .then((val) => setGus(val)) + .catch((reason) => console.error(reason)); + } + }, [serv]); - /*useEffect(() => { + /*useEffect(() => { EventsOn("fileChanged", (data) => { GetGusAsMap(serv.id).then((val) => {setGus(val); console.log(val)}).catch((reason) => console.error(reason)) }) }, []);*/ - useEffect(() => { - //check if gus is placeholder - if (Object.keys(gus).length === 1 && Object.keys(gus)[0] === "unknown") { - return; - } + useEffect(() => { + //check if gus is placeholder + if ( + Object.keys(gus).length === 1 && + Object.keys(gus)[0] === "unknown" + ) { + return; + } - //update gus with new values - SaveGusFromMap(serv.id, gus).catch((reason) => console.error(reason)); - }, [gus]); + //update gus with new values + SaveGusFromMap(serv.id, gus).catch((reason) => console.error(reason)); + }, [gus]); - useEffect(() => { - if (serv.id >= 0) { - CheckServerInstalled(serv.id) - .then((val) => setIsInstalled(val)) - .catch((reason) => console.error(reason)); - } - }, [serv]); + useEffect(() => { + if (serv.id >= 0) { + CheckServerInstalled(serv.id) + .then((val) => setIsInstalled(val)) + .catch((reason) => console.error(reason)); + } + }, [serv]); - useEffect(() => { - if (id !== undefined) { - GetServer(id) - .then((s) => { - setServ(s); - }) - .catch((reason) => console.error(reason)); - } - }, [id]); + useEffect(() => { + if (id !== undefined) { + GetServer(id) + .then((s) => { + setServ(s); + }) + .catch((reason) => console.error(reason)); + } + }, [id]); - useEffect(() => { - if (serv.id >= 0) { - SaveServer(serv).catch((reason) => { - console.error(reason); - addAlert(reason, "danger"); - }); - } - }, [serv]); + useEffect(() => { + if (serv.id >= 0) { + SaveServer(serv).catch((reason) => { + console.error(reason); + addAlert(reason, "danger"); + }); + } + }, [serv]); - useEffect(() => { - EventsOn("onServerExit", (id) => { - if (id === serv.id) { - console.log("server stopped"); - setServerStatus(false); - } - }); - return () => EventsOff("onServerExit"); - }, []); - useEffect(() => { - EventsOn("onServerStart", (id) => { - if (id === serv.id) { - console.log("server started"); - setServerStatus(true); - } - }); - return () => EventsOff("onServerStart"); - }, []); - useEffect(() => { - EventsOn("RestartServer", (id) => { - StartServer(id) - .catch((err) => { - addAlert(err, "danger"); - console.error(err); - }) - .then(() => - setTimeout(function () { - GetServerStatus(id) - .catch((reason) => { - console.error("serverstatus: " + reason); - addAlert(reason, "danger"); - }) - .then((s) => { - if (typeof s === "boolean") { - setServerStatus(s); - } - }); - }, 200), - ); - }); - return () => EventsOff("RestartServer"); - }, []); + useEffect(() => { + EventsOn("onServerExit", (id) => { + if (id === serv.id) { + console.log("server stopped"); + setServerStatus(false); + } + }); + return () => EventsOff("onServerExit"); + }, []); + useEffect(() => { + EventsOn("onServerStart", (id) => { + if (id === serv.id) { + console.log("server started"); + setServerStatus(true); + } + }); + return () => EventsOff("onServerStart"); + }, []); + useEffect(() => { + EventsOn("RestartServer", (id) => { + StartServer(id) + .catch((err) => { + addAlert(err, "danger"); + console.error(err); + }) + .then(() => + setTimeout(function () { + GetServerStatus(id) + .catch((reason) => { + console.error("serverstatus: " + reason); + addAlert(reason, "danger"); + }) + .then((s) => { + if (typeof s === "boolean") { + setServerStatus(s); + } + }); + }, 200), + ); + }); + return () => EventsOff("RestartServer"); + }, []); - useEffect(() => { - if (serv.id >= 0) { - refreshServerStatus(); - } - }, [serv]); + useEffect(() => { + if (serv.id >= 0) { + refreshServerStatus(); + } + }, [serv]); - useEffect(() => { - EventsOn("reloadServers", () => { - if (id !== undefined) { - GetServer(id) - .then((s) => { - setServ(s); - }) - .catch((reason) => console.error(reason)); - } - }); - return () => EventsOff("reloadServers"); - }, []); + useEffect(() => { + EventsOn("reloadServers", () => { + if (id !== undefined) { + GetServer(id) + .then((s) => { + setServ(s); + }) + .catch((reason) => console.error(reason)); + } + }); + return () => EventsOff("reloadServers"); + }, []); - //endregion + //endregion - function onServerStartButtonClicked() { - if (serv.serverPath == "") { - addAlert("Server Path must be set to a path", "warning"); - return; - } + function onServerStartButtonClicked() { + if (serv.serverPath == "") { + addAlert("Server Path must be set to a path", "warning"); + return; + } - if (serv.disableUpdateOnStart) { - startServer(); - } else { - setUpdaterModalOpen(true); - InstallUpdateVerify(serv.serverPath) - .catch((err) => { - addAlert("failed installing: " + err.message, "danger"); - setUpdaterModalOpen(false); - console.error(err); - }) - .then(() => { - setUpdaterModalOpen(false); - startServer(); - }); - } - } + if (serv.disableUpdateOnStart) { + startServer(); + } else { + setUpdaterModalOpen(true); + InstallUpdateVerify(serv.serverPath) + .catch((err) => { + addAlert("failed installing: " + err.message, "danger"); + setUpdaterModalOpen(false); + console.error(err); + }) + .then(() => { + setUpdaterModalOpen(false); + startServer(); + }); + } + } - function startServer() { - StartServer(serv.id) - .catch((err) => { - addAlert(err, "danger"); - console.error(err); - }) - .then(() => - setTimeout(function () { - setServerStatus(true); - //refreshServerStatus() - }, 200), - ); - } + function startServer() { + StartServer(serv.id) + .catch((err) => { + addAlert(err, "danger"); + console.error(err); + }) + .then(() => + setTimeout(function () { + setServerStatus(true); + //refreshServerStatus() + }, 200), + ); + } - function onServerStopButtonClicked() { - addAlert("Stopping server...", "neutral"); - StopServer(serv.id) - .then(() => { - addAlert("Stopped server", "success"); - setServerStatus(false); - }) - .catch((err) => addAlert("error stopping server: " + err, "danger")); - } + function onServerStopButtonClicked() { + addAlert("Stopping server...", "neutral"); + StopServer(serv.id) + .then(() => { + addAlert("Stopped server", "success"); + setServerStatus(false); + }) + .catch((err) => + addAlert("error stopping server: " + err, "danger"), + ); + } - function onServerForceStopButtonClicked() { - ForceStopServer(serv.id) - .catch((err) => { - addAlert(err, "danger"); - console.error(err); - }) - .then(() => setServerStatus(false)); - } + function onServerForceStopButtonClicked() { + ForceStopServer(serv.id) + .catch((err) => { + addAlert(err, "danger"); + console.error(err); + }) + .then(() => setServerStatus(false)); + } - function refreshServerStatus() { - GetServerStatus(serv.id) - .catch((reason) => { - console.error("serverstatus: " + reason); - addAlert(reason, "danger"); - }) - .then((s) => { - if (typeof s === "boolean") { - setServerStatus(s); - } - }); - } + function refreshServerStatus() { + GetServerStatus(serv.id) + .catch((reason) => { + console.error("serverstatus: " + reason); + addAlert(reason, "danger"); + }) + .then((s) => { + if (typeof s === "boolean") { + setServerStatus(s); + } + }); + } - if (id !== undefined) { - return ( - - {isInstalled ? ( - -
-
- - setServ((p) => ({ - ...p, - serverAlias: - e.target.value /*, convertValues: p.convertValues*/, - })) - } - /> - - BrowserOpenURL("file:///" + serv.serverPath)} - > - - - - - { - GetGusAsMap(serv.id) - .then((val) => setGus(val)) - .catch((reason) => console.error(reason)); - }} - > - - - -
+ if (id !== undefined) { + return ( + + {isInstalled ? ( + +
+
+ + setServ((p) => ({ + ...p, + serverAlias: + e.target + .value /*, convertValues: p.convertValues*/, + })) + } + /> + + + BrowserOpenURL( + "file:///" + serv.serverPath, + ) + } + > + + + + + { + GetGusAsMap(serv.id) + .then((val) => setGus(val)) + .catch((reason) => + console.error(reason), + ); + }} + > + + + +
-
- - - - - +
+ + + + + - setUpdaterModalOpen(false)} - > - setForceStopModalOpen(false)} - > - - - - Confirmation - - - - Are you sure you want to forcefully stop the server? No - save action will be performed! - - - - - - - - setStartModalOpen(false)} - > - - - - Confirmation - - - - Are you sure you want to start the server? This action - will overwrite ini files in the server directory! -
-
- - + + setUpdaterModalOpen(false) + } + > + setForceStopModalOpen(false)} + > + + + + Confirmation + + + + Are you sure you want to forcefully + stop the server? No save action will + be performed! + + + + + + + + setStartModalOpen(false)} + > + + + + Confirmation + + + + Are you sure you want to start the + server? This action will overwrite + ini files in the server directory! +
+
+ + - - - -
-
-
-
- - - Console - - - General Settings - - - Mods - - - Ini configuration - - - Administration - - - - - - - - CheckServerInstalled(serv.id) - .then((val) => setIsInstalled(val)) - .catch((reason) => console.error(reason)) - } - /> - - ) : ( - setIsInstalled(true)} - /> - )} - - ); - } else { - return ( - - -
-

No server found/selected

-
-
-
- ); - } + + + + + +
+
+ + + Console + + + General Settings + + + Mods + + + Ini configuration + + + Administration + + + + + + + + CheckServerInstalled(serv.id) + .then((val) => setIsInstalled(val)) + .catch((reason) => console.error(reason)) + } + /> +
+ ) : ( + setIsInstalled(true)} + /> + )} +
+ ); + } else { + return ( + + +
+

+ No server found/selected +

+
+
+
+ ); + } }; diff --git a/frontend/src/pages/UpdaterModal.tsx b/frontend/src/pages/UpdaterModal.tsx index 1683de5..b37be6c 100644 --- a/frontend/src/pages/UpdaterModal.tsx +++ b/frontend/src/pages/UpdaterModal.tsx @@ -1,11 +1,11 @@ import { - Button, - Divider, - LinearProgress, - Modal, - ModalClose, - ModalDialog, - Typography, + Button, + Divider, + LinearProgress, + Modal, + ModalClose, + ModalDialog, + Typography, } from "@mui/joy"; import React, { useEffect, useState } from "react"; import { server } from "../../wailsjs/go/models"; @@ -13,54 +13,54 @@ import { useAlert } from "../components/AlertProvider"; import { EventsOn } from "../../wailsjs/runtime"; type Props = { - onCompleted?: () => void; - open: boolean; - onClose?: () => void; + onCompleted?: () => void; + open: boolean; + onClose?: () => void; }; export function UpdaterModal({ onCompleted, open, onClose }: Props) { - const [action, setAction] = useState("Preparing"); - const [progress, setProgress] = useState(0.0); - const [isCompleted, setIsCompleted] = useState(false); + const [action, setAction] = useState("Preparing"); + const [progress, setProgress] = useState(0.0); + const [isCompleted, setIsCompleted] = useState(false); - useEffect(() => { - EventsOn("installingUpdateAction", (data) => { - setAction(data); - }); - EventsOn("installingUpdateProgress", (data) => { - setProgress(data); - }); - EventsOn("appInstalled", (i) => { - setIsCompleted(true); - setAction("Preparing"); - setProgress(0.0); - }); - }, []); + useEffect(() => { + EventsOn("installingUpdateAction", (data) => { + setAction(data); + }); + EventsOn("installingUpdateProgress", (data) => { + setProgress(data); + }); + EventsOn("appInstalled", (i) => { + setIsCompleted(true); + setAction("Preparing"); + setProgress(0.0); + }); + }, []); - useEffect(() => { - if (isCompleted && onCompleted) { - onCompleted(); - } - }, [isCompleted]); + useEffect(() => { + if (isCompleted && onCompleted) { + onCompleted(); + } + }, [isCompleted]); - return ( - - - Updating server... - - The server will start automatically after the update - - - - Status: {action} - - - Progress: - -
- -
-
-
- ); + return ( + + + Updating server... + + The server will start automatically after the update + + + + Status: {action} + + + Progress: + +
+ +
+
+
+ ); } diff --git a/frontend/src/pages/server/Administration.tsx b/frontend/src/pages/server/Administration.tsx index 529b090..7c55e64 100644 --- a/frontend/src/pages/server/Administration.tsx +++ b/frontend/src/pages/server/Administration.tsx @@ -1,27 +1,27 @@ import { - Button, - Card, - Checkbox, - DialogActions, - DialogContent, - DialogTitle, - Divider, - FormLabel, - Input, - Modal, - ModalDialog, - TabPanel, - Tooltip, - Typography, + Button, + Card, + Checkbox, + DialogActions, + DialogContent, + DialogTitle, + Divider, + FormLabel, + Input, + Modal, + ModalDialog, + TabPanel, + Tooltip, + Typography, } from "@mui/joy"; import React, { useEffect, useState } from "react"; import { - DeleteProfile, - DeleteServerFiles, - GetAllServersFromDir, - GetServerConfigFile, - GetServerStartupCommand, - SaveServerConfigFile, + DeleteProfile, + DeleteServerFiles, + GetAllServersFromDir, + GetServerConfigFile, + GetServerStartupCommand, + SaveServerConfigFile, } from "../../../wailsjs/go/server/ServerController"; import { server } from "../../../wailsjs/go/models"; import { useAlert } from "../../components/AlertProvider"; @@ -31,346 +31,367 @@ import config from "tailwindcss/defaultConfig"; import { LogDebug } from "../../../wailsjs/runtime"; type Props = { - setServ: React.Dispatch>; - serv: server.Server; - onServerFilesDeleted: () => void; + setServ: React.Dispatch>; + serv: server.Server; + onServerFilesDeleted: () => void; }; function ServerAdministrationCard({ - setServ, - serv, - onServerFilesDeleted, + setServ, + serv, + onServerFilesDeleted, }: { - setServ: React.Dispatch>; - serv: server.Server; - onServerFilesDeleted: () => void; + setServ: React.Dispatch>; + serv: server.Server; + onServerFilesDeleted: () => void; }) { - const [deleteServerFilesModalOpen, setDeleteServerFilesModalOpen] = - useState(false); - const [deleteProfileModalOpen, setDeleteProfileModalOpen] = useState(false); - const [deleteEverythingModalOpen, setDeleteEverythingModalOpen] = - useState(false); + const [deleteServerFilesModalOpen, setDeleteServerFilesModalOpen] = + useState(false); + const [deleteProfileModalOpen, setDeleteProfileModalOpen] = useState(false); + const [deleteEverythingModalOpen, setDeleteEverythingModalOpen] = + useState(false); - const { addAlert } = useAlert(); + const { addAlert } = useAlert(); - function onDeleteServerFilesButtonClicked() { - DeleteServerFiles(serv.id) - .then(() => { - addAlert("Deleted server files", "success"); - setServ(serv); - onServerFilesDeleted(); - }) - .catch((err) => { - console.error(err); - addAlert(err, "danger"); - }); - } + function onDeleteServerFilesButtonClicked() { + DeleteServerFiles(serv.id) + .then(() => { + addAlert("Deleted server files", "success"); + setServ(serv); + onServerFilesDeleted(); + }) + .catch((err) => { + console.error(err); + addAlert(err, "danger"); + }); + } - function onDeleteProfileButtonClicked() { - DeleteProfile(serv.id) - .then(() => { - addAlert("Deleted profile", "success"); - location.reload(); - }) - .catch((err) => { - console.error(err); - addAlert(err, "danger"); - }); - } + function onDeleteProfileButtonClicked() { + DeleteProfile(serv.id) + .then(() => { + addAlert("Deleted profile", "success"); + location.reload(); + }) + .catch((err) => { + console.error(err); + addAlert(err, "danger"); + }); + } - function onDeleteEverythingButtonClicked() { - DeleteServerFiles(serv.id) - .then(() => DeleteProfile(serv.id)) - .then(() => { - addAlert("Deleted everything", "success"); - location.reload(); - }) - .catch((err) => { - console.error(err); - addAlert(err, "danger"); - }); - } + function onDeleteEverythingButtonClicked() { + DeleteServerFiles(serv.id) + .then(() => DeleteProfile(serv.id)) + .then(() => { + addAlert("Deleted everything", "success"); + location.reload(); + }) + .catch((err) => { + console.error(err); + addAlert(err, "danger"); + }); + } - return ( - - Server Administration - + return ( + + Server Administration + -
-
- setDeleteServerFilesModalOpen(false)} - > - - - - Confirmation - - - - Are you sure you want to delete the server files? You cannot - reverse this action! - - - - - - - - -
-
- setDeleteProfileModalOpen(false)} - > - - - - Confirmation - - - - Are you sure you want to delete the profile? You cannot reverse - this action! - - - - - - - - -
-
- setDeleteEverythingModalOpen(false)} - > - - - - Confirmation - - - - Are you sure you want to delete everything? You cannot reverse - this action! - - - - - - - - -
-
-
- ); +
+
+ setDeleteServerFilesModalOpen(false)} + > + + + + Confirmation + + + + Are you sure you want to delete the server + files? You cannot reverse this action! + + + + + + + + +
+
+ setDeleteProfileModalOpen(false)} + > + + + + Confirmation + + + + Are you sure you want to delete the profile? You + cannot reverse this action! + + + + + + + + +
+
+ setDeleteEverythingModalOpen(false)} + > + + + + Confirmation + + + + Are you sure you want to delete everything? You + cannot reverse this action! + + + + + + + + +
+
+
+ ); } function ServerStartupCard({ - setServ, - serv, + setServ, + serv, }: { - setServ: React.Dispatch>; - serv: server.Server; + setServ: React.Dispatch>; + serv: server.Server; }) { - const [showServerCommandModalOpen, setShowServerCommandModalOpen] = - useState(false); - const [serverCommand, setServerCommand] = useState(""); + const [showServerCommandModalOpen, setShowServerCommandModalOpen] = + useState(false); + const [serverCommand, setServerCommand] = useState(""); - const { addAlert } = useAlert(); + const { addAlert } = useAlert(); - return ( - -
- Server startup - -
-
- setShowServerCommandModalOpen(false)} - > - - - - Server startup command - - - {serverCommand} - - - - - + return ( + +
+ Server startup + +
+
+ + setShowServerCommandModalOpen(false) + } + > + + + + Server startup command + + + + {serverCommand} + + + + + + - -
-
-
-
- + +
+
+
+
+ -
-
- - setServ((p) => ({ - ...p, - disableUpdateOnStart: e.target.checked, - })) - } - /> -
- - setServ((p) => ({ - ...p, - useAsaAPI: e.target.checked, - })) - } - /> -
- {/* setServ((p) => ({ ...p, restartOnServerQuit: e.target.checked }))} />*/} - - setServ((p) => ({ - ...p, - startWithApplication: e.target.checked, - })) - } - /> -
+
+
+ + setServ((p) => ({ + ...p, + disableUpdateOnStart: e.target.checked, + })) + } + /> +
+ + setServ((p) => ({ + ...p, + useAsaAPI: e.target.checked, + })) + } + /> +
+ {/* setServ((p) => ({ ...p, restartOnServerQuit: e.target.checked }))} />*/} + + setServ((p) => ({ + ...p, + startWithApplication: e.target.checked, + })) + } + /> +
- - Custom server "dash" arguments (only use args like: - -EnableIdlePlayerKick -ForceAllowCaveFlyers) - - - setServ((p) => ({ - ...p, - extraDashArgs: e.target.value, - })) - } - > - - Custom server "questionmark" arguments (only use args like: - ?PreventSpawnAnimations=true?PreventTribeAlliances=true) - - - setServ((p) => ({ - ...p, - extraQuestionmarkArguments: e.target.value, - })) - } - > -
-
- - ); + + Custom server "dash" arguments (only use args like: + -EnableIdlePlayerKick -ForceAllowCaveFlyers) + + + setServ((p) => ({ + ...p, + extraDashArgs: e.target.value, + })) + } + > + + Custom server "questionmark" arguments (only use args + like: + ?PreventSpawnAnimations=true?PreventTribeAlliances=true) + + + setServ((p) => ({ + ...p, + extraQuestionmarkArguments: e.target.value, + })) + } + > +
+
+
+ ); } function ExtraSettingsCard({ - setServ, - serv, + setServ, + serv, }: { - setServ: React.Dispatch>; - serv: server.Server; + setServ: React.Dispatch>; + serv: server.Server; }) { - return ( - - Extra Settings - + return ( + + Extra Settings + -
-
- {/* +
+
+ {/* setServ((p) => ({ ...p, @@ -378,116 +399,123 @@ function ExtraSettingsCard({ }))}/>
*/} - - - setServ((p) => ({ - ...p, - discordWebHookEnabled: e.target.checked, - })) - } - /> - - - - Discord webhook url - - setServ((p) => ({ - ...p, - discordWebHook: e.target.value, - })) - } - > - - -
-
- - ); + + + setServ((p) => ({ + ...p, + discordWebHookEnabled: e.target.checked, + })) + } + /> + + + + Discord webhook url + + setServ((p) => ({ + ...p, + discordWebHook: e.target.value, + })) + } + > + + +
+
+
+ ); } function ManualConfigEditorCard({ - setServ, - serv, + setServ, + serv, }: { - setServ: React.Dispatch>; - serv: server.Server; + setServ: React.Dispatch>; + serv: server.Server; }) { - const [content, setContent] = useState(""); + const [content, setContent] = useState(""); - const { addAlert } = useAlert(); + const { addAlert } = useAlert(); - const getServerConfigFile = () => { - GetServerConfigFile(serv.id) - .then((config) => { - setContent(config); - }) - .catch((err) => { - console.error(err); - addAlert(err, "danger"); - }); - }; + const getServerConfigFile = () => { + GetServerConfigFile(serv.id) + .then((config) => { + setContent(config); + }) + .catch((err) => { + console.error(err); + addAlert(err, "danger"); + }); + }; - useEffect(() => { - getServerConfigFile(); - }, []); + useEffect(() => { + getServerConfigFile(); + }, []); - useEffect(() => { - return () => { - setTimeout(getServerConfigFile, 50); - }; - }, [serv]); + useEffect(() => { + return () => { + setTimeout(getServerConfigFile, 50); + }; + }, [serv]); - const handleEditorChange = (value: string) => { - setContent(value); - }; + const handleEditorChange = (value: string) => { + setContent(value); + }; - const onSaveConfigButtonClicked = () => { - SaveServerConfigFile(content, serv.id) - .then(() => {}) - .catch((err) => { - console.error(err); - addAlert(err, "danger"); - }); - location.reload(); - }; + const onSaveConfigButtonClicked = () => { + SaveServerConfigFile(content, serv.id) + .then(() => {}) + .catch((err) => { + console.error(err); + addAlert(err, "danger"); + }); + location.reload(); + }; - return ( - - Edit Config manually - -
- - -
-
- ); + return ( + + Edit Config manually + +
+ + +
+
+ ); } export function Administration({ setServ, serv, onServerFilesDeleted }: Props) { - return ( - - - - - - - ); + return ( + + + + + + + ); } diff --git a/frontend/src/pages/server/Console.tsx b/frontend/src/pages/server/Console.tsx index a956b39..c92338f 100644 --- a/frontend/src/pages/server/Console.tsx +++ b/frontend/src/pages/server/Console.tsx @@ -5,211 +5,218 @@ import { SendRconCommand } from "../../../wailsjs/go/helpers/HelpersController"; import { IconEraser, IconSend } from "@tabler/icons-react"; type Message = { - text: string; - sender: string; + text: string; + sender: string; }; type Props = { - setServ: React.Dispatch>; - serv: server.Server; - serverStatus: boolean; + setServ: React.Dispatch>; + serv: server.Server; + serverStatus: boolean; }; function ConsoleCard({ - setServ, - serv, - serverStatus, - input, - messages, - terminalRef, - setInput, - setMessages, - writeAndDoRconCommand, + setServ, + serv, + serverStatus, + input, + messages, + terminalRef, + setInput, + setMessages, + writeAndDoRconCommand, }: Props & { - input: string; - messages: Message[]; - terminalRef: React.RefObject; - setInput: React.Dispatch>; - setMessages: React.Dispatch>; - writeAndDoRconCommand: (text: string) => void; + input: string; + messages: Message[]; + terminalRef: React.RefObject; + setInput: React.Dispatch>; + setMessages: React.Dispatch>; + writeAndDoRconCommand: (text: string) => void; }) { - return ( - -
- {messages.map((message, index) => ( -
- {message.sender === "server" ? ( - - {message.text} -
-
- ) : ( - - [{message.sender}]{" "} - $ {message.text} -
-
- )} -
- ))} -
- setInput(e.target.value)} - startDecorator={$} - endDecorator={ - - - { - writeAndDoRconCommand(input); - }} - className={"m-1"} - > - - - - - { - setMessages([]); - }} - className={"m-1"} - > - - - - - } - onKeyPress={(e) => { - if (e.key === "Enter") { - writeAndDoRconCommand(input); - } - }} - > -
- ); + return ( + +
+ {messages.map((message, index) => ( +
+ {message.sender === "server" ? ( + + {message.text} +
+
+ ) : ( + + + [{message.sender}] + {" "} + ${" "} + {message.text} +
+
+ )} +
+ ))} +
+ setInput(e.target.value)} + startDecorator={$} + endDecorator={ + + + { + writeAndDoRconCommand(input); + }} + className={"m-1"} + > + + + + + { + setMessages([]); + }} + className={"m-1"} + > + + + + + } + onKeyPress={(e) => { + if (e.key === "Enter") { + writeAndDoRconCommand(input); + } + }} + > +
+ ); } function CommandCard({ - setServ, - serv, - serverStatus, - writeAndDoRconCommand, + setServ, + serv, + serverStatus, + writeAndDoRconCommand, }: Props & { writeAndDoRconCommand: (text: string) => void }) { - return ( - -
-
- -
-
- -
-
-
- ); + return ( + +
+
+ +
+
+ +
+
+
+ ); } export function Console({ setServ, serv, serverStatus }: Props) { - const [input, setInput] = useState(""); - const [messages, setMessages] = useState(() => { - const storedMessages = localStorage.getItem("consoleMessages"); - return storedMessages ? JSON.parse(storedMessages) : []; - }); + const [input, setInput] = useState(""); + const [messages, setMessages] = useState(() => { + const storedMessages = localStorage.getItem("consoleMessages"); + return storedMessages ? JSON.parse(storedMessages) : []; + }); - const terminalRef = useRef(null); + const terminalRef = useRef(null); - const writeToConsole = (text: string, sender: string = "user") => { - const newMessage: Message = { text, sender }; - setMessages((prevMessages) => [...prevMessages, newMessage]); - }; - const doRconCommand = (text: string) => { - SendRconCommand(text, serv.ipAddress, serv.rconPort, serv.adminPassword) - .then((resp) => writeToConsole(resp, "server")) - .catch((err) => - writeToConsole("error sending command: " + err, "server"), - ); - }; + const writeToConsole = (text: string, sender: string = "user") => { + const newMessage: Message = { text, sender }; + setMessages((prevMessages) => [...prevMessages, newMessage]); + }; + const doRconCommand = (text: string) => { + SendRconCommand(text, serv.ipAddress, serv.rconPort, serv.adminPassword) + .then((resp) => writeToConsole(resp, "server")) + .catch((err) => + writeToConsole("error sending command: " + err, "server"), + ); + }; - const writeAndDoRconCommand = (text: string) => { - writeToConsole(text); - doRconCommand(text); - setInput(""); - }; + const writeAndDoRconCommand = (text: string) => { + writeToConsole(text); + doRconCommand(text); + setInput(""); + }; - useEffect(() => { - localStorage.setItem("consoleMessages", JSON.stringify(messages)); - }, [messages]); + useEffect(() => { + localStorage.setItem("consoleMessages", JSON.stringify(messages)); + }, [messages]); - useEffect(() => { - if (terminalRef.current) { - terminalRef.current.scrollTop = terminalRef.current.scrollHeight; - } - }, [messages]); + useEffect(() => { + if (terminalRef.current) { + terminalRef.current.scrollTop = terminalRef.current.scrollHeight; + } + }, [messages]); - useEffect(() => { - if (!serverStatus) { - setMessages([]); - } - }, [serverStatus]); + useEffect(() => { + if (!serverStatus) { + setMessages([]); + } + }, [serverStatus]); - useEffect(() => { - setMessages([]); - }, [serv.id]); + useEffect(() => { + setMessages([]); + }, [serv.id]); - if (serverStatus) { - return ( - - - - - ); - } else { - return ( - -
-

Server is not running

-
-
- ); - } + if (serverStatus) { + return ( + + + + + ); + } else { + return ( + +
+

+ Server is not running +

+
+
+ ); + } } diff --git a/frontend/src/pages/server/General.tsx b/frontend/src/pages/server/General.tsx index 0832b18..fba0928 100644 --- a/frontend/src/pages/server/General.tsx +++ b/frontend/src/pages/server/General.tsx @@ -1,26 +1,26 @@ import { - Card, - Divider, - FormLabel, - Input, - Select, - TabPanel, - Typography, - Option, - Autocomplete, - Textarea, - Tooltip, - Checkbox, + Card, + Divider, + FormLabel, + Input, + Select, + TabPanel, + Typography, + Option, + Autocomplete, + Textarea, + Tooltip, + Checkbox, } from "@mui/joy"; import { server } from "../../../wailsjs/go/models"; import React, { useEffect, useState } from "react"; import { - GetGusAsMap, - GetNetworkInterfacesIp, - GetValueFromGus, - SaveGusFromMap, - UpdateValueInGus, + GetGusAsMap, + GetNetworkInterfacesIp, + GetValueFromGus, + SaveGusFromMap, + UpdateValueInGus, } from "../../../wailsjs/go/server/ServerController"; import { PasswordInput } from "../../components/PasswordInput"; import { Slider } from "../../components/Slider"; @@ -28,330 +28,378 @@ import { useAlert } from "../../components/AlertProvider"; import { EventsOn } from "../../../wailsjs/runtime"; type Props = { - setServ: React.Dispatch>; - serv: server.Server; - setGus: React.Dispatch< - React.SetStateAction<{ [key: string]: { [key: string]: Array } }> - >; - gus: { [key: string]: { [key: string]: Array } }; + setServ: React.Dispatch>; + serv: server.Server; + setGus: React.Dispatch< + React.SetStateAction<{ + [key: string]: { [key: string]: Array }; + }> + >; + gus: { [key: string]: { [key: string]: Array } }; }; function GeneralSettings({ setServ, serv, setGus, gus }: Props) { - const { addAlert } = useAlert(); + const { addAlert } = useAlert(); - if ( - gus === undefined || - (Object.keys(gus).length === 1 && Object.keys(gus)[0] === "unknown") - ) { - return ( - - Loading... - - - ); - } else { - return ( - - Server Name and Passwords - -
-
- Server Name: - - setServ((p) => ({ ...p, serverName: e.target.value })) - } - > -
-
- Server Password: - - setServ((p) => ({ ...p, serverPassword: e.target.value })) - } - > -
-
- Admin Password: - - setServ((p) => ({ ...p, adminPassword: e.target.value })) - } - > -
-
- Spectator Password: - - setServ((p) => ({ ...p, spectatorPassword: e.target.value })) - } - > -
-
- Server Map - -
-
- Map Name of Mod Map path: - setServ((p) => ({ ...p, serverMap: v }))} - > -
-
- Auto Save - -
-
- Auto Save interval: - - { - setGus((p) => { - const newState = { ...p }; - newState["ServerSettings"].AutoSavePeriodMinutes[0] = - v.toString(); - return newState; - }); - }} - /> - -
-
- Message of the Day - -
-
- Message - -
-
- Duration: - - { - if (v >= 0) { - setGus((p) => { - const newState = { ...p }; - newState["MessageOfTheDay"].Duration[0] = v.toString(); - return newState; - }); - } - }} - /> - -
-
- Server Settings - -
-
-
- Max Players: - { - if (v >= 0) { - setServ((p) => { - const newState = { ...p }; - newState.maxPlayers = v; - return newState; - }); - } - }} - /> -
-
- - - {" "} - - setServ((p) => ({ - ...p, - kickIdlePlayers: e.target.checked, - })) - } - />{" "} - Kick Idle Players Period: - - - { - if (v >= 0) { - setGus((p) => { - const newState = { ...p }; - newState["ServerSettings"].KickIdlePlayersPeriod[0] = - v.toString(); - return newState; - }); - } - }} - /> -
-
-
-
- ); - } + if ( + gus === undefined || + (Object.keys(gus).length === 1 && Object.keys(gus)[0] === "unknown") + ) { + return ( + + Loading... + + + ); + } else { + return ( + + + Server Name and Passwords + + +
+
+ Server Name: + + setServ((p) => ({ + ...p, + serverName: e.target.value, + })) + } + > +
+
+ Server Password: + + setServ((p) => ({ + ...p, + serverPassword: e.target.value, + })) + } + > +
+
+ Admin Password: + + setServ((p) => ({ + ...p, + adminPassword: e.target.value, + })) + } + > +
+
+ Spectator Password: + + setServ((p) => ({ + ...p, + spectatorPassword: e.target.value, + })) + } + > +
+
+ Server Map + +
+
+ Map Name of Mod Map path: + + setServ((p) => ({ ...p, serverMap: v })) + } + > +
+
+ Auto Save + +
+
+ Auto Save interval: + + { + setGus((p) => { + const newState = { ...p }; + newState[ + "ServerSettings" + ].AutoSavePeriodMinutes[0] = + v.toString(); + return newState; + }); + }} + /> + +
+
+ Message of the Day + +
+
+ Message + +
+
+ Duration: + + { + if (v >= 0) { + setGus((p) => { + const newState = { ...p }; + newState[ + "MessageOfTheDay" + ].Duration[0] = v.toString(); + return newState; + }); + } + }} + /> + +
+
+ Server Settings + +
+
+
+ Max Players: + { + if (v >= 0) { + setServ((p) => { + const newState = { ...p }; + newState.maxPlayers = v; + return newState; + }); + } + }} + /> +
+
+ + + {" "} + + setServ((p) => ({ + ...p, + kickIdlePlayers: + e.target.checked, + })) + } + />{" "} + Kick Idle Players Period: + + + { + if (v >= 0) { + setGus((p) => { + const newState = { ...p }; + newState[ + "ServerSettings" + ].KickIdlePlayersPeriod[0] = + v.toString(); + return newState; + }); + } + }} + /> +
+
+
+
+ ); + } } function NetworkingCard({ - setServ, - serv, + setServ, + serv, }: { - setServ: React.Dispatch>; - serv: server.Server; + setServ: React.Dispatch>; + serv: server.Server; }) { - const defInter: { [p: string]: string } = { - none: "", - }; + const defInter: { [p: string]: string } = { + none: "", + }; - const [interfaces, setInterfaces] = useState<{ [p: string]: string }>( - defInter, - ); + const [interfaces, setInterfaces] = useState<{ [p: string]: string }>( + defInter, + ); - const interfaceEntries = Object.entries(interfaces); + const interfaceEntries = Object.entries(interfaces); - const interfaceElements = interfaceEntries.map(([key, value], index) => ( - - )); + const interfaceElements = interfaceEntries.map(([key, value], index) => ( + + )); - useEffect(() => { - GetNetworkInterfacesIp() - .then((val) => setInterfaces(val)) - .catch((reason) => console.error(reason)); - }, []); + useEffect(() => { + GetNetworkInterfacesIp() + .then((val) => setInterfaces(val)) + .catch((reason) => console.error(reason)); + }, []); - return ( - - Networking - - IP Address: - - Ports: -
-
- Server Port: - - parseInt(e.target.value) >= 1 && parseInt(e.target.value) <= 65535 - ? setServ((p) => ({ - ...p, - serverPort: parseInt(e.target.value), - peerPort: parseInt(e.target.value) + 1, - })) - : null - } - > -
-
- Peer Port: - -
-
- Query Port: - - parseInt(e.target.value) >= 1 && parseInt(e.target.value) <= 65535 - ? setServ((p) => ({ - ...p, - queryPort: parseInt(e.target.value), - })) - : null - } - > -
-
- RCON Port: - - parseInt(e.target.value) >= 1 && parseInt(e.target.value) <= 65535 - ? setServ((p) => ({ ...p, rconPort: parseInt(e.target.value) })) - : null - } - type={"number"} - > -
-
-
- ); + return ( + + Networking + + IP Address: + + Ports: +
+
+ Server Port: + + parseInt(e.target.value) >= 1 && + parseInt(e.target.value) <= 65535 + ? setServ((p) => ({ + ...p, + serverPort: parseInt(e.target.value), + peerPort: parseInt(e.target.value) + 1, + })) + : null + } + > +
+
+ Peer Port: + +
+
+ Query Port: + + parseInt(e.target.value) >= 1 && + parseInt(e.target.value) <= 65535 + ? setServ((p) => ({ + ...p, + queryPort: parseInt(e.target.value), + })) + : null + } + > +
+
+ RCON Port: + + parseInt(e.target.value) >= 1 && + parseInt(e.target.value) <= 65535 + ? setServ((p) => ({ + ...p, + rconPort: parseInt(e.target.value), + })) + : null + } + type={"number"} + > +
+
+
+ ); } export function General(props: Props) { - return ( - - - - - ); + return ( + + + + + ); } diff --git a/frontend/src/pages/server/Ini.tsx b/frontend/src/pages/server/Ini.tsx index a35fa86..1e69126 100644 --- a/frontend/src/pages/server/Ini.tsx +++ b/frontend/src/pages/server/Ini.tsx @@ -1,16 +1,16 @@ import { - Button, - Card, - Textarea, - FormLabel, - TabPanel, - Tooltip, - Input, - Typography, - Accordion, - AccordionDetails, - AccordionGroup, - AccordionSummary, + Button, + Card, + Textarea, + FormLabel, + TabPanel, + Tooltip, + Input, + Typography, + Accordion, + AccordionDetails, + AccordionGroup, + AccordionSummary, } from "@mui/joy"; import { server } from "../../../wailsjs/go/models"; import { Slider } from "../../components/Slider"; @@ -19,14 +19,15 @@ import React from "react"; import { useAlert } from "../../components/AlertProvider"; import { OpenFileDialog } from "../../../wailsjs/go/helpers/HelpersController"; type Props = { - setServ: React.Dispatch>; - serv: server.Server; + setServ: React.Dispatch>; + serv: server.Server; }; export function Ini({ setServ, serv }: Props) { - return ( - - Not implemented yet, use manual configuration trough ini files for now. - - ); + return ( + + Not implemented yet, use manual configuration trough ini files for + now. + + ); } diff --git a/frontend/src/pages/server/Mods.tsx b/frontend/src/pages/server/Mods.tsx index 08f056a..a282c98 100644 --- a/frontend/src/pages/server/Mods.tsx +++ b/frontend/src/pages/server/Mods.tsx @@ -1,46 +1,48 @@ import React from "react"; import { server } from "../../../wailsjs/go/models"; import { - Card, - Divider, - FormLabel, - Input, - TabPanel, - Typography, + Card, + Divider, + FormLabel, + Input, + TabPanel, + Typography, } from "@mui/joy"; type Props = { - setServ: React.Dispatch>; - serv: server.Server; + setServ: React.Dispatch>; + serv: server.Server; }; function GeneralServerSettingsCard({ - setServ, - serv, + setServ, + serv, }: { - setServ: React.Dispatch>; - serv: server.Server; + setServ: React.Dispatch>; + serv: server.Server; }) { - return ( - -
-
- Mods (e.g.: modid1,modid2,modid3) - setServ((p) => ({ ...p, mods: e.target.value }))} - > -
-
-
- ); + return ( + +
+
+ Mods (e.g.: modid1,modid2,modid3) + + setServ((p) => ({ ...p, mods: e.target.value })) + } + > +
+
+
+ ); } export function Mods({ setServ, serv }: Props) { - return ( - - - - ); + return ( + + + + ); } diff --git a/frontend/tailwind.config.cjs b/frontend/tailwind.config.cjs index 49913a3..f491f6e 100644 --- a/frontend/tailwind.config.cjs +++ b/frontend/tailwind.config.cjs @@ -1,17 +1,17 @@ /** @type {import('tailwindcss').Config} */ module.exports = { - content: ["./src/**/*.{js,jsx,ts,tsx}"], - theme: { - extend: { - fontFamily: { - jetbrains: ["JetBrains Mono", "monospace"], - }, - }, - }, - plugins: [], + content: ["./src/**/*.{js,jsx,ts,tsx}"], + theme: { + extend: { + fontFamily: { + jetbrains: ["JetBrains Mono", "monospace"], + }, + }, + }, + plugins: [], - corePlugins: { - preflight: false, - }, - important: "#root", + corePlugins: { + preflight: false, + }, + important: "#root", }; diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index 3d0a51a..eb60c8e 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -1,21 +1,21 @@ { - "compilerOptions": { - "target": "ESNext", - "useDefineForClassFields": true, - "lib": ["DOM", "DOM.Iterable", "ESNext"], - "allowJs": false, - "skipLibCheck": true, - "esModuleInterop": false, - "allowSyntheticDefaultImports": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "module": "ESNext", - "moduleResolution": "Node", - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx" - }, - "include": ["src"], - "references": [{ "path": "./tsconfig.node.json" }] + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "allowJs": false, + "skipLibCheck": true, + "esModuleInterop": false, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "ESNext", + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx" + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] } diff --git a/frontend/tsconfig.node.json b/frontend/tsconfig.node.json index 9d31e2a..d3bf4b8 100644 --- a/frontend/tsconfig.node.json +++ b/frontend/tsconfig.node.json @@ -1,9 +1,9 @@ { - "compilerOptions": { - "composite": true, - "module": "ESNext", - "moduleResolution": "Node", - "allowSyntheticDefaultImports": true - }, - "include": ["vite.config.ts"] + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] } diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 9cc50ea..357dfe3 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -3,5 +3,5 @@ import react from "@vitejs/plugin-react"; // https://vitejs.dev/config/ export default defineConfig({ - plugins: [react()], + plugins: [react()], }); From b4c790320f0988ceeae22b7883bf9c266dc257ad Mon Sep 17 00:00:00 2001 From: Jens van de Wiel Date: Tue, 26 Dec 2023 21:38:33 +0100 Subject: [PATCH 11/11] added more options --- frontend/src/pages/server/General.tsx | 35 +++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/frontend/src/pages/server/General.tsx b/frontend/src/pages/server/General.tsx index fba0928..6183cf6 100644 --- a/frontend/src/pages/server/General.tsx +++ b/frontend/src/pages/server/General.tsx @@ -206,7 +206,7 @@ function GeneralSettings({ setServ, serv, setGus, gus }: Props) {
-
+
Max Players:
-
+
+
+ Ban list url: + { + setGus((p) => { + const newState = { ...p }; + newState["ServerSettings"]["BanListURL"] = [ + e.target.value, + ]; + return newState; + }); + }} + > +
+
+ Allowed Cheaters URL: + { + setGus((p) => { + const newState = { ...p }; + newState["ServerSettings"][ + "AllowedCheatersURL" + ] = [e.target.value]; + return newState; + }); + }} + > +
); } } + function NetworkingCard({ setServ, serv,