summaryrefslogtreecommitdiff
path: root/opendc-web
diff options
context:
space:
mode:
Diffstat (limited to 'opendc-web')
-rw-r--r--opendc-web/opendc-web-proto/build.gradle.kts9
-rw-r--r--opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/JobState.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/JobState.kt)8
-rw-r--r--opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/OperationalPhenomena.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/OperationalPhenomena.kt)9
-rw-r--r--opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/ProtocolError.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/ProtocolError.kt)6
-rw-r--r--opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/Targets.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/Targets.kt)13
-rw-r--r--opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/Trace.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/Trace.kt)10
-rw-r--r--opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/Workload.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/Workload.kt)21
-rw-r--r--opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/Job.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/runner/Job.kt)36
-rw-r--r--opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/JobService.java60
-rw-r--r--opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/Portfolio.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/runner/Portfolio.kt)18
-rw-r--r--opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/Scenario.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/runner/Scenario.kt)31
-rw-r--r--opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/Topology.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/runner/Topology.kt)20
-rw-r--r--opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/Machine.java38
-rw-r--r--opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/MemoryUnit.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/MemoryUnit.kt)12
-rw-r--r--opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/ProcessingUnit.java29
-rw-r--r--opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/Rack.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/Rack.kt)14
-rw-r--r--opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/Room.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/Room.kt)13
-rw-r--r--opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/RoomTile.java28
-rw-r--r--opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/Job.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/ProcessingUnit.kt)20
-rw-r--r--opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/Portfolio.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/Portfolio.kt)34
-rw-r--r--opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/Project.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/Project.kt)22
-rw-r--r--opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/ProjectRole.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/ProjectRole.kt)6
-rw-r--r--opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/Scenario.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/Scenario.kt)71
-rw-r--r--opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/Topology.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/Topology.kt)40
-rw-r--r--opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/User.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/User.kt)9
-rw-r--r--opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/UserAccounting.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/UserAccounting.kt)12
-rw-r--r--opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/RoomTile.kt34
-rw-r--r--opendc-web/opendc-web-proto/src/main/resources/META-INF/beans.xml0
-rw-r--r--opendc-web/opendc-web-quarkus-deployment/build.gradle.kts (renamed from opendc-web/opendc-web-ui-quarkus-deployment/build.gradle.kts)5
-rw-r--r--opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/runner/OpenDCRunnerBuildItem.java (renamed from opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerBuildItem.java)4
-rw-r--r--opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/runner/OpenDCRunnerConfig.java (renamed from opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerConfig.java)4
-rw-r--r--opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/runner/OpenDCRunnerProcessor.java (renamed from opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerProcessor.java)8
-rw-r--r--opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/ui/NextRouteManifestBuildItem.java (renamed from opendc-web/opendc-web-ui-quarkus-deployment/src/main/java/org/opendc/web/ui/deployment/OpenDCUiRoutingBuildItem.java)70
-rw-r--r--opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/ui/OpenDCUiProcessor.java57
-rw-r--r--opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/ui/QuinoaNextRoutingProcessor.java154
-rw-r--r--opendc-web/opendc-web-quarkus/build.gradle.kts (renamed from opendc-web/opendc-web-ui-quarkus/build.gradle.kts)6
-rw-r--r--opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/runner/OpenDCRunnerRecorder.java (renamed from opendc-web/opendc-web-runner-quarkus/src/main/java/org/opendc/web/runner/runtime/OpenDCRunnerRecorder.java)4
-rw-r--r--opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/runner/OpenDCRunnerRuntimeConfig.java (renamed from opendc-web/opendc-web-runner-quarkus/src/main/java/org/opendc/web/runner/runtime/OpenDCRunnerRuntimeConfig.java)4
-rw-r--r--opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/ui/AuthConfiguration.java (renamed from opendc-web/opendc-web-ui-quarkus-deployment/src/main/java/org/opendc/web/ui/deployment/AuthConfiguration.java)4
-rw-r--r--opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/ui/OpenDCUiConfig.java (renamed from opendc-web/opendc-web-ui-quarkus-deployment/src/main/java/org/opendc/web/ui/deployment/OpenDCUiConfig.java)15
-rw-r--r--opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/ui/OpenDCUiRecorder.java76
-rw-r--r--opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/ui/QuinoaNextRoutingRecorder.java (renamed from opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/error/MissingKotlinParameterExceptionMapper.java)45
-rw-r--r--opendc-web/opendc-web-quarkus/src/main/resources/META-INF/quarkus-extension.yaml (renamed from opendc-web/opendc-web-ui-quarkus/src/main/resources/META-INF/quarkus-extension.yaml)0
-rw-r--r--opendc-web/opendc-web-runner-quarkus-deployment/build.gradle.kts37
-rw-r--r--opendc-web/opendc-web-runner-quarkus/build.gradle.kts47
-rw-r--r--opendc-web/opendc-web-runner-quarkus/src/main/resources/META-INF/quarkus-extension.yaml5
-rw-r--r--opendc-web/opendc-web-runner/Dockerfile3
-rw-r--r--opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/internal/JobManagerImpl.kt8
-rw-r--r--opendc-web/opendc-web-server/Dockerfile7
-rw-r--r--opendc-web/opendc-web-server/build.gradle.kts11
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Job.java11
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Portfolio.java1
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Project.java4
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/ProjectAuthorization.java38
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Scenario.java18
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Topology.java5
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/runner/JobResource.java2
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/PortfolioResource.java2
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/PortfolioScenarioResource.java14
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/ProjectResource.java2
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/TopologyResource.java4
-rw-r--r--opendc-web/opendc-web-server/src/main/resources/application-dev.properties10
-rw-r--r--opendc-web/opendc-web-server/src/main/resources/application-docker.properties11
-rw-r--r--opendc-web/opendc-web-server/src/main/resources/application.properties3
-rw-r--r--opendc-web/opendc-web-server/src/main/resources/load_data.sql58
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/.dockerignore (renamed from opendc-web/opendc-web-ui/.dockerignore)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/.eslintrc (renamed from opendc-web/opendc-web-ui/.eslintrc)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/.gitignore (renamed from opendc-web/opendc-web-ui/.gitignore)1
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/.prettierrc.yaml (renamed from opendc-web/opendc-web-ui/.prettierrc.yaml)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/Dockerfile (renamed from opendc-web/opendc-web-ui/Dockerfile)15
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/README.md (renamed from opendc-web/opendc-web-ui/README.md)6
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/api/index.js (renamed from opendc-web/opendc-web-ui/src/api/index.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/api/portfolios.js (renamed from opendc-web/opendc-web-ui/src/api/portfolios.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/api/projects.js (renamed from opendc-web/opendc-web-ui/src/api/projects.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/api/scenarios.js (renamed from opendc-web/opendc-web-ui/src/api/scenarios.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/api/schedulers.js (renamed from opendc-web/opendc-web-ui/src/api/schedulers.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/api/topologies.js (renamed from opendc-web/opendc-web-ui/src/api/topologies.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/api/traces.js (renamed from opendc-web/opendc-web-ui/src/api/traces.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/api/users.js (renamed from opendc-web/opendc-web-ui/src/api/users.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/auth.js (renamed from opendc-web/opendc-web-ui/src/auth.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/AppHeader.js (renamed from opendc-web/opendc-web-ui/src/components/AppHeader.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/AppHeader.module.css (renamed from opendc-web/opendc-web-ui/src/components/AppHeader.module.css)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/AppHeaderTools.js (renamed from opendc-web/opendc-web-ui/src/components/AppHeaderTools.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/AppHeaderUser.js (renamed from opendc-web/opendc-web-ui/src/components/AppHeaderUser.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/AppPage.js (renamed from opendc-web/opendc-web-ui/src/components/AppPage.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/context/ContextSelectionSection.js (renamed from opendc-web/opendc-web-ui/src/components/context/ContextSelectionSection.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/context/ContextSelectionSection.module.css (renamed from opendc-web/opendc-web-ui/src/components/context/ContextSelectionSection.module.css)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/context/ContextSelector.js (renamed from opendc-web/opendc-web-ui/src/components/context/ContextSelector.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/context/ContextSelector.module.css (renamed from opendc-web/opendc-web-ui/src/components/context/ContextSelector.module.css)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/context/PortfolioSelector.js (renamed from opendc-web/opendc-web-ui/src/components/context/PortfolioSelector.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/context/ProjectSelector.js (renamed from opendc-web/opendc-web-ui/src/components/context/ProjectSelector.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/context/TopologySelector.js (renamed from opendc-web/opendc-web-ui/src/components/context/TopologySelector.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/portfolios/NewScenario.js (renamed from opendc-web/opendc-web-ui/src/components/portfolios/NewScenario.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/portfolios/NewScenarioModal.js (renamed from opendc-web/opendc-web-ui/src/components/portfolios/NewScenarioModal.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/portfolios/PortfolioOverview.js (renamed from opendc-web/opendc-web-ui/src/components/portfolios/PortfolioOverview.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/portfolios/PortfolioResultInfo.js (renamed from opendc-web/opendc-web-ui/src/components/portfolios/PortfolioResultInfo.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/portfolios/PortfolioResults.js (renamed from opendc-web/opendc-web-ui/src/components/portfolios/PortfolioResults.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/portfolios/ScenarioState.js (renamed from opendc-web/opendc-web-ui/src/components/portfolios/ScenarioState.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/portfolios/ScenarioTable.js (renamed from opendc-web/opendc-web-ui/src/components/portfolios/ScenarioTable.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/projects/FilterPanel.js (renamed from opendc-web/opendc-web-ui/src/components/projects/FilterPanel.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/projects/FilterPanel.module.css (renamed from opendc-web/opendc-web-ui/src/components/projects/FilterPanel.module.css)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/projects/NewPortfolio.js (renamed from opendc-web/opendc-web-ui/src/components/projects/NewPortfolio.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/projects/NewPortfolioModal.js (renamed from opendc-web/opendc-web-ui/src/components/projects/NewPortfolioModal.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/projects/NewTopology.js (renamed from opendc-web/opendc-web-ui/src/components/projects/NewTopology.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/projects/NewTopologyModal.js (renamed from opendc-web/opendc-web-ui/src/components/projects/NewTopologyModal.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/projects/PortfolioTable.js (renamed from opendc-web/opendc-web-ui/src/components/projects/PortfolioTable.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/projects/ProjectCollection.js (renamed from opendc-web/opendc-web-ui/src/components/projects/ProjectCollection.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/projects/ProjectOverview.js (renamed from opendc-web/opendc-web-ui/src/components/projects/ProjectOverview.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/projects/TopologyTable.js (renamed from opendc-web/opendc-web-ui/src/components/projects/TopologyTable.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/RoomTable.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/RoomTable.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/TopologyMap.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/TopologyMap.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/TopologyOverview.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/TopologyOverview.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/GrayContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/GrayContainer.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/MapConstants.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/MapConstants.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/MapStage.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/MapStage.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/MapStage.module.css (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/MapStage.module.css)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/RackContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/RackContainer.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/RackEnergyFillContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/RackEnergyFillContainer.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/RackSpaceFillContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/RackSpaceFillContainer.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/RoomContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/RoomContainer.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/TileContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/TileContainer.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/TopologyContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/TopologyContainer.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/WallContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/WallContainer.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/Collapse.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/controls/Collapse.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/Collapse.module.css (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/controls/Collapse.module.css)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/ScaleIndicator.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/controls/ScaleIndicator.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/ScaleIndicator.module.css (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/controls/ScaleIndicator.module.css)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/Toolbar.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/controls/Toolbar.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/Toolbar.module.css (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/controls/Toolbar.module.css)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/Backdrop.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/elements/Backdrop.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/GrayLayer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/elements/GrayLayer.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/HoverTile.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/elements/HoverTile.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/ImageComponent.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/elements/ImageComponent.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/RackFillBar.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/elements/RackFillBar.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/RoomTile.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/elements/RoomTile.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/TileObject.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/elements/TileObject.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/TilePlusIcon.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/elements/TilePlusIcon.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/WallSegment.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/elements/WallSegment.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/GridGroup.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/groups/GridGroup.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/RackGroup.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/groups/RackGroup.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/RoomGroup.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/groups/RoomGroup.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/TileGroup.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/groups/TileGroup.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/TopologyGroup.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/groups/TopologyGroup.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/WallGroup.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/groups/WallGroup.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/layers/HoverLayerComponent.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/layers/HoverLayerComponent.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/layers/MapLayer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/layers/MapLayer.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/layers/ObjectHoverLayer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/layers/ObjectHoverLayer.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/map/layers/RoomHoverLayer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/layers/RoomHoverLayer.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/NameComponent.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/NameComponent.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/TopologySidebar.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/TopologySidebar.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/TopologySidebar.module.css (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/TopologySidebar.module.css)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/building/BuildingSidebar.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/building/BuildingSidebar.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/building/NewRoomConstructionComponent.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/building/NewRoomConstructionComponent.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/building/NewRoomConstructionContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/building/NewRoomConstructionContainer.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/DeleteMachine.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/DeleteMachine.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/MachineSidebar.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/MachineSidebar.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitAddComponent.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitAddComponent.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitAddContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitAddContainer.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitListComponent.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitListComponent.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitListContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitListContainer.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitTabsComponent.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitTabsComponent.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitType.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitType.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/AddPrefab.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/AddPrefab.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/DeleteRackContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/DeleteRackContainer.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/MachineComponent.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/MachineComponent.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/MachineListComponent.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/MachineListComponent.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/MachineListContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/MachineListContainer.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/RackNameContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/RackNameContainer.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/RackSidebar.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/RackSidebar.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/RackSidebar.module.css (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/RackSidebar.module.css)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/DeleteRoomContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/DeleteRoomContainer.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/EditRoomContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/EditRoomContainer.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/RackConstructionComponent.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/RackConstructionComponent.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/RackConstructionContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/RackConstructionContainer.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/RoomName.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/RoomName.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/RoomSidebar.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/RoomSidebar.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/util/TableEmptyState.js (renamed from opendc-web/opendc-web-ui/src/components/util/TableEmptyState.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/util/modals/ConfirmationModal.js (renamed from opendc-web/opendc-web-ui/src/components/util/modals/ConfirmationModal.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/util/modals/Modal.js (renamed from opendc-web/opendc-web-ui/src/components/util/modals/Modal.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/components/util/modals/TextInputModal.js (renamed from opendc-web/opendc-web-ui/src/components/util/modals/TextInputModal.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/config.js (renamed from opendc-web/opendc-web-ui/src/config.js)12
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/data/experiments.js (renamed from opendc-web/opendc-web-ui/src/data/experiments.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/data/project.js (renamed from opendc-web/opendc-web-ui/src/data/project.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/data/query.js (renamed from opendc-web/opendc-web-ui/src/data/query.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/data/topology.js (renamed from opendc-web/opendc-web-ui/src/data/topology.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/data/user.js (renamed from opendc-web/opendc-web-ui/src/data/user.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/next.config.js (renamed from opendc-web/opendc-web-ui/next.config.js)7
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/package-lock.json (renamed from opendc-web/opendc-web-ui/package-lock.json)3495
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/package.json (renamed from opendc-web/opendc-web-ui/package.json)3
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/pages/404.js (renamed from opendc-web/opendc-web-ui/src/pages/404.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/pages/_app.js (renamed from opendc-web/opendc-web-ui/src/pages/_app.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/pages/_document.js (renamed from opendc-web/opendc-web-ui/src/pages/_document.js)2
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/pages/logout.js (renamed from opendc-web/opendc-web-ui/src/pages/logout.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/pages/projects/[project]/index.js (renamed from opendc-web/opendc-web-ui/src/pages/projects/[project]/index.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/pages/projects/[project]/portfolios/[portfolio].js (renamed from opendc-web/opendc-web-ui/src/pages/projects/[project]/portfolios/[portfolio].js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/pages/projects/[project]/topologies/[topology].js (renamed from opendc-web/opendc-web-ui/src/pages/projects/[project]/topologies/[topology].js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/pages/projects/index.js (renamed from opendc-web/opendc-web-ui/src/pages/projects/index.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/favicon.ico (renamed from opendc-web/opendc-web-ui/public/favicon.ico)bin99678 -> 99678 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/humans.txt (renamed from opendc-web/opendc-web-ui/public/humans.txt)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/avatar.svg (renamed from opendc-web/opendc-web-ui/public/img/avatar.svg)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/datacenter-drawing.png (renamed from opendc-web/opendc-web-ui/public/img/datacenter-drawing.png)bin207909 -> 207909 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/logo.png (renamed from opendc-web/opendc-web-ui/public/img/logo.png)bin2825 -> 2825 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/logo.svg (renamed from opendc-web/opendc-web-ui/public/img/logo.svg)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/opendc-architecture.png (renamed from opendc-web/opendc-web-ui/public/img/opendc-architecture.png)bin45056 -> 45056 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/opendc-timeline-v2.png (renamed from opendc-web/opendc-web-ui/public/img/opendc-timeline-v2.png)bin33460 -> 33460 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/portraits/aiosup.png (renamed from opendc-web/opendc-web-ui/public/img/portraits/aiosup.png)bin71879 -> 71879 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/portraits/evaneyk.png (renamed from opendc-web/opendc-web-ui/public/img/portraits/evaneyk.png)bin89028 -> 89028 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/portraits/fmastenbroek.png (renamed from opendc-web/opendc-web-ui/public/img/portraits/fmastenbroek.png)bin123006 -> 123006 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/portraits/gandreadis.png (renamed from opendc-web/opendc-web-ui/public/img/portraits/gandreadis.png)bin76426 -> 76426 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/portraits/hhe.png (renamed from opendc-web/opendc-web-ui/public/img/portraits/hhe.png)bin102718 -> 102718 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/portraits/jbosch.png (renamed from opendc-web/opendc-web-ui/public/img/portraits/jbosch.png)bin101618 -> 101618 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/portraits/jburley.png (renamed from opendc-web/opendc-web-ui/public/img/portraits/jburley.png)bin328112 -> 328112 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/portraits/lfdversluis.png (renamed from opendc-web/opendc-web-ui/public/img/portraits/lfdversluis.png)bin67796 -> 67796 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/portraits/loverweel.png (renamed from opendc-web/opendc-web-ui/public/img/portraits/loverweel.png)bin65866 -> 65866 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/portraits/sjounaid.png (renamed from opendc-web/opendc-web-ui/public/img/portraits/sjounaid.png)bin94523 -> 94523 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/portraits/vvanbeek.png (renamed from opendc-web/opendc-web-ui/public/img/portraits/vvanbeek.png)bin85159 -> 85159 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/portraits/wlai.png (renamed from opendc-web/opendc-web-ui/public/img/portraits/wlai.png)bin72873 -> 72873 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/screenshot-construction.png (renamed from opendc-web/opendc-web-ui/public/img/screenshot-construction.png)bin275103 -> 275103 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/screenshot-simulation.png (renamed from opendc-web/opendc-web-ui/public/img/screenshot-simulation.png)bin291836 -> 291836 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/stakeholders/Developer.png (renamed from opendc-web/opendc-web-ui/public/img/stakeholders/Developer.png)bin11411 -> 11411 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/stakeholders/Manager.png (renamed from opendc-web/opendc-web-ui/public/img/stakeholders/Manager.png)bin9946 -> 9946 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/stakeholders/Researcher.png (renamed from opendc-web/opendc-web-ui/public/img/stakeholders/Researcher.png)bin10984 -> 10984 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/stakeholders/Sales.png (renamed from opendc-web/opendc-web-ui/public/img/stakeholders/Sales.png)bin10074 -> 10074 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/stakeholders/Student.png (renamed from opendc-web/opendc-web-ui/public/img/stakeholders/Student.png)bin12960 -> 12960 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/topology/cpu-icon.png (renamed from opendc-web/opendc-web-ui/public/img/topology/cpu-icon.png)bin4062 -> 4062 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/topology/gpu-icon.png (renamed from opendc-web/opendc-web-ui/public/img/topology/gpu-icon.png)bin2227 -> 2227 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/topology/memory-icon.png (renamed from opendc-web/opendc-web-ui/public/img/topology/memory-icon.png)bin1980 -> 1980 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/topology/rack-energy-icon.png (renamed from opendc-web/opendc-web-ui/public/img/topology/rack-energy-icon.png)bin893 -> 893 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/topology/rack-space-icon.png (renamed from opendc-web/opendc-web-ui/public/img/topology/rack-space-icon.png)bin957 -> 957 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/topology/storage-icon.png (renamed from opendc-web/opendc-web-ui/public/img/topology/storage-icon.png)bin4038 -> 4038 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/img/tudelft-icon.png (renamed from opendc-web/opendc-web-ui/public/img/tudelft-icon.png)bin4387 -> 4387 bytes
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/manifest.json (renamed from opendc-web/opendc-web-ui/public/manifest.json)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/public/robots.txt (renamed from opendc-web/opendc-web-ui/public/robots.txt)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/redux/actions/interaction-level.js (renamed from opendc-web/opendc-web-ui/src/redux/actions/interaction-level.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/redux/actions/topology/building.js (renamed from opendc-web/opendc-web-ui/src/redux/actions/topology/building.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/redux/actions/topology/index.js (renamed from opendc-web/opendc-web-ui/src/redux/actions/topology/index.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/redux/actions/topology/machine.js (renamed from opendc-web/opendc-web-ui/src/redux/actions/topology/machine.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/redux/actions/topology/rack.js (renamed from opendc-web/opendc-web-ui/src/redux/actions/topology/rack.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/redux/actions/topology/room.js (renamed from opendc-web/opendc-web-ui/src/redux/actions/topology/room.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/redux/index.js (renamed from opendc-web/opendc-web-ui/src/redux/index.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/redux/reducers/construction-mode.js (renamed from opendc-web/opendc-web-ui/src/redux/reducers/construction-mode.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/redux/reducers/index.js (renamed from opendc-web/opendc-web-ui/src/redux/reducers/index.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/redux/reducers/interaction-level.js (renamed from opendc-web/opendc-web-ui/src/redux/reducers/interaction-level.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/index.js (renamed from opendc-web/opendc-web-ui/src/redux/reducers/topology/index.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/machine.js (renamed from opendc-web/opendc-web-ui/src/redux/reducers/topology/machine.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/rack.js (renamed from opendc-web/opendc-web-ui/src/redux/reducers/topology/rack.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/room.js (renamed from opendc-web/opendc-web-ui/src/redux/reducers/topology/room.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/tile.js (renamed from opendc-web/opendc-web-ui/src/redux/reducers/topology/tile.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/topology.js (renamed from opendc-web/opendc-web-ui/src/redux/reducers/topology/topology.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/redux/sagas/index.js (renamed from opendc-web/opendc-web-ui/src/redux/sagas/index.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/redux/sagas/topology.js (renamed from opendc-web/opendc-web-ui/src/redux/sagas/topology.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/shapes.js (renamed from opendc-web/opendc-web-ui/src/shapes.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/style/index.css (renamed from opendc-web/opendc-web-ui/src/style/index.css)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/util/authorizations.js (renamed from opendc-web/opendc-web-ui/src/util/authorizations.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/util/available-metrics.js (renamed from opendc-web/opendc-web-ui/src/util/available-metrics.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/util/colors.js (renamed from opendc-web/opendc-web-ui/src/util/colors.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/util/date-time.js (renamed from opendc-web/opendc-web-ui/src/util/date-time.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/util/date-time.test.js (renamed from opendc-web/opendc-web-ui/src/util/date-time.test.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/util/effect-ref.js (renamed from opendc-web/opendc-web-ui/src/util/effect-ref.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/util/tile-calculations.js (renamed from opendc-web/opendc-web-ui/src/util/tile-calculations.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/util/topology-schema.js (renamed from opendc-web/opendc-web-ui/src/util/topology-schema.js)0
-rw-r--r--opendc-web/opendc-web-server/src/main/webui/util/unit-specifications.js (renamed from opendc-web/opendc-web-ui/src/util/unit-specifications.js)0
-rw-r--r--opendc-web/opendc-web-server/src/test/java/org/opendc/web/server/service/UserAccountingServiceTest.java10
-rw-r--r--opendc-web/opendc-web-ui-quarkus-deployment/src/main/java/org/opendc/web/ui/deployment/OpenDCUiProcessor.java301
-rw-r--r--opendc-web/opendc-web-ui-quarkus/src/main/java/org/opendc/web/ui/runtime/OpenDCUiRecorder.java98
-rw-r--r--opendc-web/opendc-web-ui-quarkus/src/main/java/org/opendc/web/ui/runtime/OpenDCUiRuntimeConfig.java39
-rw-r--r--opendc-web/opendc-web-ui/build.gradle.kts144
-rwxr-xr-xopendc-web/opendc-web-ui/scripts/envsubst.sh14
268 files changed, 4322 insertions, 1205 deletions
diff --git a/opendc-web/opendc-web-proto/build.gradle.kts b/opendc-web/opendc-web-proto/build.gradle.kts
index 9b307655..bbec8bd0 100644
--- a/opendc-web/opendc-web-proto/build.gradle.kts
+++ b/opendc-web/opendc-web-proto/build.gradle.kts
@@ -24,16 +24,13 @@ description = "Web communication protocol for OpenDC"
// Build configuration
plugins {
- `kotlin-library-conventions`
- id("org.kordamp.gradle.jandex") // Necessary for Quarkus to process annotations
+ `java-library-conventions`
}
dependencies {
implementation(libs.jackson.annotations)
implementation(libs.jakarta.validation)
+ implementation(libs.jakarta.ws.rs.api)
+ implementation(libs.microprofile.rest.client.api)
implementation(libs.microprofile.openapi.api)
}
-
-tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
- kotlinOptions.javaParameters = true
-}
diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/JobState.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/JobState.java
index a8e67ec5..14a0faba 100644
--- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/JobState.kt
+++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/JobState.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 AtLarge Research
+ * Copyright (c) 2023 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -20,12 +20,12 @@
* SOFTWARE.
*/
-package org.opendc.web.proto
+package org.opendc.web.proto;
/**
* State of a scenario for the simulator runner.
*/
-public enum class JobState {
+public enum JobState {
/**
* The job is pending to be claimed by a runner.
*/
@@ -49,5 +49,5 @@ public enum class JobState {
/**
* The job has failed.
*/
- FAILED,
+ FAILED
}
diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/OperationalPhenomena.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/OperationalPhenomena.java
index 28006d27..cf492e38 100644
--- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/OperationalPhenomena.kt
+++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/OperationalPhenomena.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2021 AtLarge Research
+ * Copyright (c) 2023 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -20,12 +20,9 @@
* SOFTWARE.
*/
-package org.opendc.web.proto
+package org.opendc.web.proto;
/**
* Object describing the enabled operational phenomena for a scenario.
*/
-public data class OperationalPhenomena(
- val failures: Boolean,
- val interference: Boolean,
-)
+public record OperationalPhenomena(boolean failures, boolean interference) {}
diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/ProtocolError.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/ProtocolError.java
index e7fe2702..cb9324ea 100644
--- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/ProtocolError.kt
+++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/ProtocolError.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 AtLarge Research
+ * Copyright (c) 2023 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -20,9 +20,9 @@
* SOFTWARE.
*/
-package org.opendc.web.proto
+package org.opendc.web.proto;
/**
* Container for reporting errors.
*/
-public data class ProtocolError(val code: Int, val message: String)
+public record ProtocolError(int code, String message) {}
diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/Targets.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/Targets.java
index 25516ff0..4823bb66 100644
--- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/Targets.kt
+++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/Targets.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 AtLarge Research
+ * Copyright (c) 2023 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -20,9 +20,10 @@
* SOFTWARE.
*/
-package org.opendc.web.proto
+package org.opendc.web.proto;
-import jakarta.validation.constraints.Min
+import jakarta.validation.constraints.Min;
+import java.util.Set;
/**
* The targets of a portfolio.
@@ -30,8 +31,4 @@ import jakarta.validation.constraints.Min
* @param metrics The selected metrics to track during simulation.
* @param repeats The number of repetitions per scenario.
*/
-public data class Targets(
- val metrics: Set<String>,
- @field:Min(1)
- val repeats: Int = 1,
-)
+public record Targets(Set<String> metrics, @Min(1) int repeats) {}
diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/Trace.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/Trace.java
index 2952a273..adf916d3 100644
--- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/Trace.kt
+++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/Trace.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 AtLarge Research
+ * Copyright (c) 2023 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -20,7 +20,7 @@
* SOFTWARE.
*/
-package org.opendc.web.proto
+package org.opendc.web.proto;
/**
* A workload trace available for simulation.
@@ -29,8 +29,4 @@ package org.opendc.web.proto
* @param name The name of the trace.
* @param type The type of trace.
*/
-public data class Trace(
- val id: String,
- val name: String,
- val type: String,
-)
+public record Trace(String id, String name, String type) {}
diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/Workload.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/Workload.java
index 58daf817..e8f552d6 100644
--- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/Workload.kt
+++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/Workload.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2021 AtLarge Research
+ * Copyright (c) 2023 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -20,25 +20,24 @@
* SOFTWARE.
*/
-package org.opendc.web.proto
+package org.opendc.web.proto;
-import jakarta.validation.constraints.DecimalMax
-import jakarta.validation.constraints.DecimalMin
+import jakarta.validation.constraints.DecimalMax;
+import jakarta.validation.constraints.DecimalMin;
/**
* The workload to simulate for a scenario.
*/
-public data class Workload(val trace: Trace, val samplingFraction: Double) {
+public record Workload(Trace trace, double samplingFraction) {
/**
* Specification for a workload.
*
* @param trace The unique identifier of the trace.
* @param samplingFraction The fraction of the workload to sample.
*/
- public data class Spec(
- val trace: String,
- @DecimalMin(value = "0.001", message = "Sampling fraction must be non-zero")
- @DecimalMax(value = "1", message = "Sampling fraction cannot exceed one")
- val samplingFraction: Double,
- )
+ public record Spec(
+ String trace,
+ @DecimalMin(value = "0.001", message = "Sampling fraction must be non-zero")
+ @DecimalMax(value = "1", message = "Sampling fraction cannot exceed one")
+ double samplingFraction) {}
}
diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/runner/Job.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/Job.java
index 34642436..587fe451 100644
--- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/runner/Job.kt
+++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/Job.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 AtLarge Research
+ * Copyright (c) 2023 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -20,32 +20,32 @@
* SOFTWARE.
*/
-package org.opendc.web.proto.runner
+package org.opendc.web.proto.runner;
-import org.eclipse.microprofile.openapi.annotations.media.Schema
-import org.opendc.web.proto.JobState
-import java.time.Instant
+import java.time.Instant;
+import java.util.Map;
+import org.eclipse.microprofile.openapi.annotations.media.Schema;
+import org.opendc.web.proto.JobState;
/**
* A simulation job to be simulated by a runner.
*/
@Schema(name = "Runner.Job")
-public data class Job(
- val id: Long,
- val scenario: Scenario,
- val state: JobState,
- val createdAt: Instant,
- val updatedAt: Instant,
- val runtime: Int,
- val results: Map<String, Any>? = null,
-) {
+public record Job(
+ long id,
+ Scenario scenario,
+ JobState state,
+ Instant createdAt,
+ Instant updatedAt,
+ int runtime,
+ Map<String, ?> results) {
/**
* A request to update the state of a job.
*
- * @property state The next state of the job.
- * @property runtime The runtime of the job (in seconds).
- * @property results The results of the job.
+ * @param state The next state of the job.
+ * @param runtime The runtime of the job (in seconds).
+ * @param results The results of the job.
*/
@Schema(name = "Runner.Job.Update")
- public data class Update(val state: JobState, val runtime: Int, val results: Map<String, Any>? = null)
+ public record Update(JobState state, int runtime, Map<String, ?> results) {}
}
diff --git a/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/JobService.java b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/JobService.java
new file mode 100644
index 00000000..33b520a0
--- /dev/null
+++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/JobService.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2023 AtLarge Research
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package org.opendc.web.proto.runner;
+
+import jakarta.validation.Valid;
+import jakarta.ws.rs.Consumes;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import java.util.List;
+import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
+
+/**
+ * Service for interacting with the OpenDC job server.
+ */
+@Path("/jobs")
+@RegisterRestClient
+public interface JobService {
+ /**
+ * Obtain all pending simulation jobs.
+ */
+ @GET
+ List<Job> queryPending();
+
+ /**
+ * Get a job by identifier.
+ */
+ @GET
+ @Path("{job}")
+ Job get(@PathParam("job") long id);
+
+ /**
+ * Atomically update the state of a job.
+ */
+ @POST
+ @Path("{job}")
+ @Consumes("application/json")
+ Job update(@PathParam("job") long id, @Valid Job.Update update);
+}
diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/runner/Portfolio.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/Portfolio.java
index 916d8cf0..44f0b500 100644
--- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/runner/Portfolio.kt
+++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/Portfolio.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 AtLarge Research
+ * Copyright (c) 2023 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -20,14 +20,13 @@
* SOFTWARE.
*/
-package org.opendc.web.proto.runner
+package org.opendc.web.proto.runner;
-import org.eclipse.microprofile.openapi.annotations.media.Schema
-import org.opendc.web.proto.Targets
-import org.opendc.web.proto.user.Portfolio
+import org.eclipse.microprofile.openapi.annotations.media.Schema;
+import org.opendc.web.proto.Targets;
/**
- * A [Portfolio] as seen from the runner's perspective.
+ * A {@link Portfolio} as seen from the runner's perspective.
*
* @param id The unique identifier of the portfolio.
* @param number The number of the portfolio for the project.
@@ -35,9 +34,4 @@ import org.opendc.web.proto.user.Portfolio
* @param targets The targets of the portfolio.
*/
@Schema(name = "Runner.Portfolio")
-public data class Portfolio(
- val id: Long,
- val number: Int,
- val name: String,
- val targets: Targets,
-)
+public record Portfolio(long id, int number, String name, Targets targets) {}
diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/runner/Scenario.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/Scenario.java
index ebc10bb0..8005ac3b 100644
--- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/runner/Scenario.kt
+++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/Scenario.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 AtLarge Research
+ * Copyright (c) 2023 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -20,23 +20,22 @@
* SOFTWARE.
*/
-package org.opendc.web.proto.runner
+package org.opendc.web.proto.runner;
-import org.eclipse.microprofile.openapi.annotations.media.Schema
-import org.opendc.web.proto.OperationalPhenomena
-import org.opendc.web.proto.Workload
+import org.eclipse.microprofile.openapi.annotations.media.Schema;
+import org.opendc.web.proto.OperationalPhenomena;
+import org.opendc.web.proto.Workload;
/**
- * A [Scenario] that is exposed to an OpenDC runner.
+ * A {@link Scenario} that is exposed to an OpenDC runner.
*/
@Schema(name = "Runner.Scenario")
-public data class Scenario(
- val id: Long,
- val number: Int,
- val portfolio: Portfolio,
- val name: String,
- val workload: Workload,
- val topology: Topology,
- val phenomena: OperationalPhenomena,
- val schedulerName: String,
-)
+public record Scenario(
+ long id,
+ int number,
+ Portfolio portfolio,
+ String name,
+ Workload workload,
+ Topology topology,
+ OperationalPhenomena phenomena,
+ String schedulerName) {}
diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/runner/Topology.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/Topology.java
index 4bffdee9..fdabd12d 100644
--- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/runner/Topology.kt
+++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/Topology.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 AtLarge Research
+ * Copyright (c) 2023 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -20,21 +20,15 @@
* SOFTWARE.
*/
-package org.opendc.web.proto.runner
+package org.opendc.web.proto.runner;
-import org.eclipse.microprofile.openapi.annotations.media.Schema
-import org.opendc.web.proto.Room
-import java.time.Instant
+import java.time.Instant;
+import java.util.List;
+import org.eclipse.microprofile.openapi.annotations.media.Schema;
+import org.opendc.web.proto.topology.Room;
/**
* A [Topology] that is exposed to an OpenDC runner.
*/
@Schema(name = "Runner.Topology")
-public data class Topology(
- val id: Long,
- val number: Int,
- val name: String,
- val rooms: List<Room>,
- val createdAt: Instant,
- val updatedAt: Instant,
-)
+public record Topology(long id, int number, String name, List<Room> rooms, Instant createdAt, Instant updatedAt) {}
diff --git a/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/Machine.java b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/Machine.java
new file mode 100644
index 00000000..ec78f249
--- /dev/null
+++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/Machine.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2023 AtLarge Research
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package org.opendc.web.proto.topology;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.util.List;
+
+/**
+ * A machine in a rack.
+ */
+public record Machine(
+ String id,
+ int position,
+ List<ProcessingUnit> cpus,
+ List<ProcessingUnit> gpus,
+ @JsonProperty("memories") List<MemoryUnit> memory,
+ @JsonProperty("storages") List<MemoryUnit> storage,
+ String rackId) {}
diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/MemoryUnit.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/MemoryUnit.java
index 00560ad6..a53b584a 100644
--- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/MemoryUnit.kt
+++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/MemoryUnit.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2021 AtLarge Research
+ * Copyright (c) 2023 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -20,15 +20,9 @@
* SOFTWARE.
*/
-package org.opendc.web.proto
+package org.opendc.web.proto.topology;
/**
* A memory unit in a system.
*/
-public data class MemoryUnit(
- val id: String,
- val name: String,
- val speedMbPerS: Double,
- val sizeMb: Double,
- val energyConsumptionW: Double,
-)
+public record MemoryUnit(String id, String name, double speedMbPerS, double sizeMb, double energyConsumptionW) {}
diff --git a/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/ProcessingUnit.java b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/ProcessingUnit.java
new file mode 100644
index 00000000..baa61aac
--- /dev/null
+++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/ProcessingUnit.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2023 AtLarge Research
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package org.opendc.web.proto.topology;
+
+/**
+ * A CPU model.
+ */
+public record ProcessingUnit(
+ String id, String name, double clockRateMhz, int numberOfCores, double energyConsumptionW) {}
diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/Rack.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/Rack.java
index c997e814..b68fddd3 100644
--- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/Rack.kt
+++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/Rack.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 AtLarge Research
+ * Copyright (c) 2023 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -20,15 +20,11 @@
* SOFTWARE.
*/
-package org.opendc.web.proto
+package org.opendc.web.proto.topology;
+
+import java.util.List;
/**
* A rack in a datacenter.
*/
-public data class Rack(
- val id: String,
- val name: String,
- val capacity: Int,
- val powerCapacityW: Double,
- val machines: List<Machine>,
-)
+public record Rack(String id, String name, int capacity, double powerCapacityW, List<Machine> machines) {}
diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/Room.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/Room.java
index 5b305168..530d21f5 100644
--- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/Room.kt
+++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/Room.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 AtLarge Research
+ * Copyright (c) 2023 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -20,14 +20,11 @@
* SOFTWARE.
*/
-package org.opendc.web.proto
+package org.opendc.web.proto.topology;
+
+import java.util.Set;
/**
* A room in a datacenter.
*/
-public data class Room(
- val id: String,
- val name: String,
- val tiles: Set<RoomTile>,
- val topologyId: String? = null,
-)
+public record Room(String id, String name, Set<RoomTile> tiles, String topologyId) {}
diff --git a/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/RoomTile.java b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/RoomTile.java
new file mode 100644
index 00000000..a7240541
--- /dev/null
+++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/RoomTile.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2023 AtLarge Research
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package org.opendc.web.proto.topology;
+
+/**
+ * A location in a room.
+ */
+public record RoomTile(String id, double positionX, double positionY, Rack rack, String roomId) {}
diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/ProcessingUnit.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/Job.java
index 86f40516..480efdad 100644
--- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/ProcessingUnit.kt
+++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/Job.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2021 AtLarge Research
+ * Copyright (c) 2023 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -20,15 +20,15 @@
* SOFTWARE.
*/
-package org.opendc.web.proto
+package org.opendc.web.proto.user;
+
+import java.time.Instant;
+import java.util.Map;
+import org.opendc.web.proto.JobState;
/**
- * A CPU model.
+ * A simulation job that is associated with a {@link Scenario}.
+ * <p>
+ * This entity is exposed in the runner-facing API via {@link Job}.
*/
-public data class ProcessingUnit(
- val id: String,
- val name: String,
- val clockRateMhz: Double,
- val numberOfCores: Int,
- val energyConsumptionW: Double,
-)
+public record Job(long id, JobState state, Instant createdAt, Instant updatedAt, Map<String, ?> results) {}
diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/Portfolio.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/Portfolio.java
index 6f433a04..ff8d9e82 100644
--- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/Portfolio.kt
+++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/Portfolio.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 AtLarge Research
+ * Copyright (c) 2023 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -20,11 +20,12 @@
* SOFTWARE.
*/
-package org.opendc.web.proto.user
+package org.opendc.web.proto.user;
-import jakarta.validation.constraints.NotBlank
-import org.eclipse.microprofile.openapi.annotations.media.Schema
-import org.opendc.web.proto.Targets
+import jakarta.validation.constraints.NotBlank;
+import java.util.List;
+import org.eclipse.microprofile.openapi.annotations.media.Schema;
+import org.opendc.web.proto.Targets;
/**
* A portfolio is the composition of multiple scenarios.
@@ -36,23 +37,13 @@ import org.opendc.web.proto.Targets
* @param targets The targets of the portfolio.
* @param scenarios The scenarios in the portfolio.
*/
-public data class Portfolio(
- val id: Long,
- val number: Int,
- val project: Project,
- val name: String,
- val targets: Targets,
- val scenarios: List<Scenario.Summary>,
-) {
+public record Portfolio(
+ long id, int number, Project project, String name, Targets targets, List<Scenario.Summary> scenarios) {
/**
* A request to create a new portfolio.
*/
@Schema(name = "Portfolio.Update")
- public data class Create(
- @field:NotBlank(message = "Name must not be empty")
- val name: String,
- val targets: Targets,
- )
+ public record Create(@NotBlank(message = "Name must not be empty") String name, Targets targets) {}
/**
* A summary view of a [Portfolio] provided for nested relations.
@@ -63,10 +54,5 @@ public data class Portfolio(
* @param targets The targets of the portfolio.
*/
@Schema(name = "Portfolio.Summary")
- public data class Summary(
- val id: Long,
- val number: Int,
- val name: String,
- val targets: Targets,
- )
+ public record Summary(long id, int number, String name, Targets targets) {}
}
diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/Project.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/Project.java
index 635552a9..534fdb26 100644
--- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/Project.kt
+++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/Project.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 AtLarge Research
+ * Copyright (c) 2023 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -20,27 +20,19 @@
* SOFTWARE.
*/
-package org.opendc.web.proto.user
+package org.opendc.web.proto.user;
-import jakarta.validation.constraints.NotBlank
-import org.eclipse.microprofile.openapi.annotations.media.Schema
-import java.time.Instant
+import jakarta.validation.constraints.NotBlank;
+import java.time.Instant;
+import org.eclipse.microprofile.openapi.annotations.media.Schema;
/**
* A project in OpenDC encapsulates all the datacenter designs and simulation runs for a set of users.
*/
-public data class Project(
- val id: Long,
- val name: String,
- val createdAt: Instant,
- val updatedAt: Instant,
- val role: ProjectRole,
-) {
+public record Project(long id, String name, Instant createdAt, Instant updatedAt, ProjectRole role) {
/**
* A request to create a new project.
*/
@Schema(name = "Project.Create")
- public data class Create(
- @field:NotBlank(message = "Name must not be empty") val name: String,
- )
+ public record Create(@NotBlank(message = "Name must not be empty") String name) {}
}
diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/ProjectRole.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/ProjectRole.java
index 0f6de1fc..434ab472 100644
--- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/ProjectRole.kt
+++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/ProjectRole.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 AtLarge Research
+ * Copyright (c) 2023 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -20,12 +20,12 @@
* SOFTWARE.
*/
-package org.opendc.web.proto.user
+package org.opendc.web.proto.user;
/**
* The role of a user in a project.
*/
-public enum class ProjectRole {
+public enum ProjectRole {
/**
* The user is allowed to view the project.
*/
diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/Scenario.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/Scenario.java
index e0c790f5..7add5656 100644
--- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/Scenario.kt
+++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/Scenario.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 AtLarge Research
+ * Copyright (c) 2023 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -20,28 +20,28 @@
* SOFTWARE.
*/
-package org.opendc.web.proto.user
+package org.opendc.web.proto.user;
-import jakarta.validation.constraints.NotBlank
-import org.eclipse.microprofile.openapi.annotations.media.Schema
-import org.opendc.web.proto.OperationalPhenomena
-import org.opendc.web.proto.Workload
+import jakarta.validation.constraints.NotBlank;
+import java.util.List;
+import org.eclipse.microprofile.openapi.annotations.media.Schema;
+import org.opendc.web.proto.OperationalPhenomena;
+import org.opendc.web.proto.Workload;
/**
* A single scenario to be explored by the simulator.
*/
-public data class Scenario(
- val id: Long,
- val number: Int,
- val project: Project,
- val portfolio: Portfolio.Summary,
- val name: String,
- val workload: Workload,
- val topology: Topology.Summary,
- val phenomena: OperationalPhenomena,
- val schedulerName: String,
- val jobs: List<Job>,
-) {
+public record Scenario(
+ long id,
+ int number,
+ Project project,
+ Portfolio.Summary portfolio,
+ String name,
+ Workload workload,
+ Topology.Summary topology,
+ OperationalPhenomena phenomena,
+ String schedulerName,
+ List<Job> jobs) {
/**
* Create a new scenario.
*
@@ -52,14 +52,12 @@ public data class Scenario(
* @param schedulerName The name of the scheduler.
*/
@Schema(name = "Scenario.Create")
- public data class Create(
- @field:NotBlank(message = "Name must not be empty")
- val name: String,
- val workload: Workload.Spec,
- val topology: Long,
- val phenomena: OperationalPhenomena,
- val schedulerName: String,
- )
+ public record Create(
+ @NotBlank(message = "Name must not be empty") String name,
+ Workload.Spec workload,
+ long topology,
+ OperationalPhenomena phenomena,
+ String schedulerName) {}
/**
* A summary view of a [Scenario] provided for nested relations.
@@ -70,17 +68,16 @@ public data class Scenario(
* @param workload The workload to be modeled by the scenario.
* @param phenomena The phenomena simulated for this scenario.
* @param schedulerName The scheduler name to use for the experiment.
- * @param job The simulation job associated with the scenario.
+ * @param jobs The simulation jobs associated with the scenario.
*/
@Schema(name = "Scenario.Summary")
- public data class Summary(
- val id: Long,
- val number: Int,
- val name: String,
- val workload: Workload,
- val topology: Topology.Summary,
- val phenomena: OperationalPhenomena,
- val schedulerName: String,
- val jobs: List<Job>,
- )
+ public record Summary(
+ long id,
+ int number,
+ String name,
+ Workload workload,
+ Topology.Summary topology,
+ OperationalPhenomena phenomena,
+ String schedulerName,
+ List<Job> jobs) {}
}
diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/Topology.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/Topology.java
index 0943eaf8..7291c77b 100644
--- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/Topology.kt
+++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/Topology.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 AtLarge Research
+ * Copyright (c) 2023 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -20,40 +20,30 @@
* SOFTWARE.
*/
-package org.opendc.web.proto.user
+package org.opendc.web.proto.user;
-import jakarta.validation.constraints.NotBlank
-import org.eclipse.microprofile.openapi.annotations.media.Schema
-import org.opendc.web.proto.Room
-import java.time.Instant
+import jakarta.validation.constraints.NotBlank;
+import java.time.Instant;
+import java.util.List;
+import org.eclipse.microprofile.openapi.annotations.media.Schema;
+import org.opendc.web.proto.topology.Room;
/**
* Model for an OpenDC topology.
*/
-public data class Topology(
- val id: Long,
- val number: Int,
- val project: Project,
- val name: String,
- val rooms: List<Room>,
- val createdAt: Instant,
- val updatedAt: Instant,
-) {
+public record Topology(
+ long id, int number, Project project, String name, List<Room> rooms, Instant createdAt, Instant updatedAt) {
/**
* Create a new topology for a project.
*/
@Schema(name = "Topology.Create")
- public data class Create(
- @field:NotBlank(message = "Name must not be empty")
- val name: String,
- val rooms: List<Room>,
- )
+ public record Create(@NotBlank(message = "Name must not be empty") String name, List<Room> rooms) {}
/**
* Update an existing topology.
*/
@Schema(name = "Topology.Update")
- public data class Update(val rooms: List<Room>)
+ public record Update(List<Room> rooms) {}
/**
* A summary view of a [Topology] provided for nested relations.
@@ -65,11 +55,5 @@ public data class Topology(
* @param updatedAt The instant at which the topology was updated.
*/
@Schema(name = "Topology.Summary")
- public data class Summary(
- val id: Long,
- val number: Int,
- val name: String,
- val createdAt: Instant,
- val updatedAt: Instant,
- )
+ public record Summary(long id, int number, String name, Instant createdAt, Instant updatedAt) {}
}
diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/User.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/User.java
index 33dad4ff..030d9207 100644
--- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/User.kt
+++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/User.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 AtLarge Research
+ * Copyright (c) 2023 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -20,12 +20,9 @@
* SOFTWARE.
*/
-package org.opendc.web.proto.user
+package org.opendc.web.proto.user;
/**
* A user of OpenDC.
*/
-public data class User(
- val userId: String,
- val accounting: UserAccounting,
-)
+public record User(String userId, UserAccounting accounting) {}
diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/UserAccounting.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/UserAccounting.java
index 970721eb..3831381f 100644
--- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/UserAccounting.kt
+++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/UserAccounting.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 AtLarge Research
+ * Copyright (c) 2023 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -20,15 +20,11 @@
* SOFTWARE.
*/
-package org.opendc.web.proto.user
+package org.opendc.web.proto.user;
-import java.time.LocalDate
+import java.time.LocalDate;
/**
* Accounting data for a user.
*/
-public data class UserAccounting(
- val periodEnd: LocalDate,
- val simulationTime: Int,
- val simulationTimeBudget: Int,
-)
+public record UserAccounting(LocalDate periodEnd, int simulationTime, int simulationTimeBudget) {}
diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/RoomTile.kt b/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/RoomTile.kt
deleted file mode 100644
index 666d66ee..00000000
--- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/RoomTile.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (c) 2022 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.web.proto
-
-/**
- * A room tile.
- */
-public data class RoomTile(
- val id: String,
- val positionX: Double,
- val positionY: Double,
- val rack: Rack? = null,
- val roomId: String? = null,
-)
diff --git a/opendc-web/opendc-web-proto/src/main/resources/META-INF/beans.xml b/opendc-web/opendc-web-proto/src/main/resources/META-INF/beans.xml
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/opendc-web/opendc-web-proto/src/main/resources/META-INF/beans.xml
diff --git a/opendc-web/opendc-web-ui-quarkus-deployment/build.gradle.kts b/opendc-web/opendc-web-quarkus-deployment/build.gradle.kts
index 6be49e22..5dfdb65b 100644
--- a/opendc-web/opendc-web-ui-quarkus-deployment/build.gradle.kts
+++ b/opendc-web/opendc-web-quarkus-deployment/build.gradle.kts
@@ -30,10 +30,11 @@ plugins {
dependencies {
implementation(platform(libs.quarkus.bom))
- implementation(projects.opendcWeb.opendcWebUi)
- implementation(projects.opendcWeb.opendcWebUiQuarkus)
+ implementation(projects.opendcWeb.opendcWebQuarkus)
+ implementation(projects.opendcTrace.opendcTraceApi)
implementation(libs.quarkus.core.deployment)
implementation(libs.quarkus.vertx.http.deployment)
implementation(libs.quarkus.arc.deployment)
+ implementation(libs.quarkus.quinoa.deployment)
}
diff --git a/opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerBuildItem.java b/opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/runner/OpenDCRunnerBuildItem.java
index 3be15ee3..544365c8 100644
--- a/opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerBuildItem.java
+++ b/opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/runner/OpenDCRunnerBuildItem.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 AtLarge Research
+ * Copyright (c) 2023 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -20,7 +20,7 @@
* SOFTWARE.
*/
-package org.opendc.web.runner.deployment;
+package org.opendc.web.quarkus.deployment.runner;
import io.quarkus.builder.item.SimpleBuildItem;
import io.quarkus.runtime.RuntimeValue;
diff --git a/opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerConfig.java b/opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/runner/OpenDCRunnerConfig.java
index ccbc5e19..1bc201b2 100644
--- a/opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerConfig.java
+++ b/opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/runner/OpenDCRunnerConfig.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 AtLarge Research
+ * Copyright (c) 2023 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -20,7 +20,7 @@
* SOFTWARE.
*/
-package org.opendc.web.runner.deployment;
+package org.opendc.web.quarkus.deployment.runner;
import io.quarkus.runtime.annotations.ConfigItem;
import io.quarkus.runtime.annotations.ConfigRoot;
diff --git a/opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerProcessor.java b/opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/runner/OpenDCRunnerProcessor.java
index 85a973e7..a796c01d 100644
--- a/opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerProcessor.java
+++ b/opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/runner/OpenDCRunnerProcessor.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 AtLarge Research
+ * Copyright (c) 2023 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -20,7 +20,7 @@
* SOFTWARE.
*/
-package org.opendc.web.runner.deployment;
+package org.opendc.web.quarkus.deployment.runner;
import static io.quarkus.deployment.annotations.ExecutionTime.RUNTIME_INIT;
@@ -36,10 +36,10 @@ import java.io.IOException;
import java.util.Set;
import java.util.function.BooleanSupplier;
import org.opendc.trace.spi.TraceFormat;
+import org.opendc.web.quarkus.runtime.runner.OpenDCRunnerRecorder;
+import org.opendc.web.quarkus.runtime.runner.OpenDCRunnerRuntimeConfig;
import org.opendc.web.runner.JobManager;
import org.opendc.web.runner.OpenDCRunner;
-import org.opendc.web.runner.runtime.OpenDCRunnerRecorder;
-import org.opendc.web.runner.runtime.OpenDCRunnerRuntimeConfig;
/**
* Build processor for the OpenDC web runner Quarkus extension.
diff --git a/opendc-web/opendc-web-ui-quarkus-deployment/src/main/java/org/opendc/web/ui/deployment/OpenDCUiRoutingBuildItem.java b/opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/ui/NextRouteManifestBuildItem.java
index 6cf44893..4640b04b 100644
--- a/opendc-web/opendc-web-ui-quarkus-deployment/src/main/java/org/opendc/web/ui/deployment/OpenDCUiRoutingBuildItem.java
+++ b/opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/ui/NextRouteManifestBuildItem.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 AtLarge Research
+ * Copyright (c) 2023 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -20,28 +20,28 @@
* SOFTWARE.
*/
-package org.opendc.web.ui.deployment;
+package org.opendc.web.quarkus.deployment.ui;
import io.quarkus.builder.item.SimpleBuildItem;
import java.util.List;
/**
- * Build item containing the routes for the OpenDC web UI.
+ * Build item containing the route manifest of the Next.js application.
*/
-public final class OpenDCUiRoutingBuildItem extends SimpleBuildItem {
+public final class NextRouteManifestBuildItem extends SimpleBuildItem {
private final boolean custom404;
private final List<Page> pages;
private final List<Redirect> redirects;
/**
- * Construct a {@link OpenDCUiRoutingBuildItem} instance.
+ * Construct a {@link NextRouteManifestBuildItem} object.
*
* @param routes The routes defined by Next.js.
* @param redirects The redirects that have been defined by Next.js.
* @param custom404 A flag to indicate that custom 404 pages are enabled.
*/
- public OpenDCUiRoutingBuildItem(List<Page> routes, List<Redirect> redirects, boolean custom404) {
+ public NextRouteManifestBuildItem(List<Page> routes, List<Redirect> redirects, boolean custom404) {
this.custom404 = custom404;
this.pages = routes;
this.redirects = redirects;
@@ -61,58 +61,18 @@ public final class OpenDCUiRoutingBuildItem extends SimpleBuildItem {
/**
* A redirect defined by the Next.js routes manifest.
+ *
+ * @param path The path that should result in a redirect.
+ * @param destination The destination of the redirect.
+ * @param statusCode The status code of the redirect.
*/
- public static final class Redirect {
-
- private final String path;
- private final String destination;
- private final int statusCode;
-
- /**
- * Construct a {@link Redirect} route.
- *
- * @param path The path that should result in a redirect.
- * @param destination The destination of the redirect.
- * @param statusCode The status code of the redirect.
- */
- public Redirect(String path, String destination, int statusCode) {
- this.statusCode = statusCode;
- this.path = path;
- this.destination = destination;
- }
-
- public String getPath() {
- return path;
- }
-
- public String getDestination() {
- return destination;
- }
-
- public int getStatusCode() {
- return statusCode;
- }
- }
+ public record Redirect(String path, String destination, int statusCode) {}
/**
* A page defined by the Next.js routes manifest.
+ *
+ * @param path The path that to the page.
+ * @param name The name of the page.
*/
- public static final class Page {
-
- private final String path;
- private final String name;
-
- public Page(String path, String page) {
- this.path = path;
- this.name = page;
- }
-
- public String getPath() {
- return path;
- }
-
- public String getName() {
- return name;
- }
- }
+ public record Page(String path, String name) {}
}
diff --git a/opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/ui/OpenDCUiProcessor.java b/opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/ui/OpenDCUiProcessor.java
new file mode 100644
index 00000000..8b2c0244
--- /dev/null
+++ b/opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/ui/OpenDCUiProcessor.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2023 AtLarge Research
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package org.opendc.web.quarkus.deployment.ui;
+
+import io.quarkus.deployment.annotations.BuildProducer;
+import io.quarkus.deployment.annotations.BuildStep;
+import io.quarkus.deployment.annotations.ExecutionTime;
+import io.quarkus.deployment.annotations.Record;
+import io.quarkus.vertx.http.deployment.HttpRootPathBuildItem;
+import io.quarkus.vertx.http.deployment.RouteBuildItem;
+import org.opendc.web.quarkus.runtime.ui.OpenDCUiConfig;
+import org.opendc.web.quarkus.runtime.ui.OpenDCUiRecorder;
+
+/**
+ * Quarkus build processor for the OpenDC web UI.
+ */
+public class OpenDCUiProcessor {
+ /**
+ * Register a route handler for serving the config of the OpenDC web UI.
+ */
+ @BuildStep
+ @Record(ExecutionTime.RUNTIME_INIT)
+ public RouteBuildItem registerConfigHandler(
+ OpenDCUiRecorder openDCUiRecorder,
+ BuildProducer<RouteBuildItem> routes,
+ HttpRootPathBuildItem httpRootPathBuildItem,
+ OpenDCUiConfig openDCUiConfig) {
+
+ String basePath = httpRootPathBuildItem.getRootPath();
+
+ return httpRootPathBuildItem
+ .routeBuilder()
+ .route(basePath + "/__ENV.js")
+ .handler(openDCUiRecorder.configHandler(openDCUiConfig))
+ .build();
+ }
+}
diff --git a/opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/ui/QuinoaNextRoutingProcessor.java b/opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/ui/QuinoaNextRoutingProcessor.java
new file mode 100644
index 00000000..ddaa8809
--- /dev/null
+++ b/opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/ui/QuinoaNextRoutingProcessor.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (c) 2023 AtLarge Research
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package org.opendc.web.quarkus.deployment.ui;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.quarkiverse.quinoa.deployment.items.BuiltResourcesBuildItem;
+import io.quarkiverse.quinoa.deployment.items.ConfiguredQuinoaBuildItem;
+import io.quarkiverse.quinoa.deployment.items.TargetDirBuildItem;
+import io.quarkus.deployment.IsNormal;
+import io.quarkus.deployment.annotations.BuildProducer;
+import io.quarkus.deployment.annotations.BuildStep;
+import io.quarkus.deployment.annotations.ExecutionTime;
+import io.quarkus.deployment.annotations.Record;
+import io.quarkus.vertx.http.deployment.HttpRootPathBuildItem;
+import io.quarkus.vertx.http.deployment.RouteBuildItem;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.regex.Pattern;
+import org.opendc.web.quarkus.runtime.ui.QuinoaNextRoutingRecorder;
+
+/**
+ * Quarkus build processor for enabling dynamic routes and redirects in Quinoa for Next.js applications.
+ */
+public class QuinoaNextRoutingProcessor {
+ private static final Pattern PATH_PARAM_PATTERN = Pattern.compile("\\[(\\w+)]");
+ private final ObjectMapper objectMapper = new ObjectMapper();
+
+ /**
+ * Build the dynamic routes of the application based on the route manifest generated by Next.js.
+ *
+ * @param configuredQuinoa Quinoa configuration pointing to the UI directory.
+ * @param targetDirBuildItem Dependency on the build directory to ensure the Next.js is built before this build step
+ * is run.
+ * @return Routing manifest generated by the Next.js application.
+ */
+ @BuildStep
+ public NextRouteManifestBuildItem buildRoutes(
+ ConfiguredQuinoaBuildItem configuredQuinoa, TargetDirBuildItem targetDirBuildItem) throws IOException {
+ if (configuredQuinoa == null) {
+ return null;
+ }
+
+ Path routeManifestPath = configuredQuinoa.uiDir().resolve(".next/routes-manifest.json");
+ if (Files.notExists(routeManifestPath)) {
+ throw new FileNotFoundException("Cannot find " + routeManifestPath + " for creating route map");
+ }
+
+ JsonNode routeManifest = objectMapper.readTree(routeManifestPath.toFile());
+
+ var pages = new ArrayList<NextRouteManifestBuildItem.Page>();
+ for (Iterator<JsonNode> it = routeManifest.get("staticRoutes").elements(); it.hasNext(); ) {
+ JsonNode route = it.next();
+
+ String page = route.get("page").asText();
+
+ // Static routes do not have any path parameters
+ pages.add(new NextRouteManifestBuildItem.Page(page, page));
+ }
+
+ for (Iterator<JsonNode> it = routeManifest.get("dynamicRoutes").elements(); it.hasNext(); ) {
+ JsonNode route = it.next();
+
+ String page = route.get("page").asText();
+ String path = PATH_PARAM_PATTERN.matcher(page).replaceAll(r -> ":" + r.group(1));
+
+ pages.add(new NextRouteManifestBuildItem.Page(path, page));
+ }
+
+ var redirects = new ArrayList<NextRouteManifestBuildItem.Redirect>();
+ for (Iterator<JsonNode> it = routeManifest.get("redirects").elements(); it.hasNext(); ) {
+ JsonNode redirect = it.next();
+ if (redirect.has("internal")) {
+ continue;
+ }
+
+ int statusCode = redirect.get("statusCode").asInt();
+ String path = redirect.get("source").asText();
+ String destination = redirect.get("destination").asText();
+
+ if (path.isEmpty()) {
+ path = "/";
+ }
+
+ redirects.add(new NextRouteManifestBuildItem.Redirect(path, destination, statusCode));
+ }
+
+ var custom404 = routeManifest.get("pages404").asBoolean();
+ return new NextRouteManifestBuildItem(pages, redirects, custom404);
+ }
+
+ /**
+ * Register the dynamic routes and redirects of the Next.js application.
+ */
+ @Record(ExecutionTime.RUNTIME_INIT)
+ @BuildStep(onlyIf = IsNormal.class)
+ public void registerNextRoutes(
+ QuinoaNextRoutingRecorder recorder,
+ BuildProducer<RouteBuildItem> routes,
+ HttpRootPathBuildItem httpRootPathBuildItem,
+ BuiltResourcesBuildItem uiResources,
+ NextRouteManifestBuildItem routeManifestBuildItem) {
+
+ if (uiResources.getNames().isEmpty()) {
+ return;
+ }
+
+ String basePath = httpRootPathBuildItem.getRootPath();
+
+ /* Construct redirects */
+ for (var redirect : routeManifestBuildItem.getRedirects()) {
+ String destination = basePath.equals("/") ? redirect.destination() : basePath + redirect.destination();
+
+ routes.produce(httpRootPathBuildItem
+ .routeBuilder()
+ .route(basePath + redirect.path())
+ .handler(recorder.redirectHandler(destination, redirect.statusCode()))
+ .build());
+ }
+
+ /* Construct dynamic routes */
+ for (var page : routeManifestBuildItem.getPages()) {
+ routes.produce(httpRootPathBuildItem
+ .routeBuilder()
+ .route(basePath + page.path())
+ .handler(recorder.pageHandler(basePath, page.name()))
+ .build());
+ }
+ }
+}
diff --git a/opendc-web/opendc-web-ui-quarkus/build.gradle.kts b/opendc-web/opendc-web-quarkus/build.gradle.kts
index 3f8887f6..a48c2eb3 100644
--- a/opendc-web/opendc-web-ui-quarkus/build.gradle.kts
+++ b/opendc-web/opendc-web-quarkus/build.gradle.kts
@@ -28,15 +28,15 @@ plugins {
}
quarkusExtension {
- deploymentModule.set("opendc-web-ui-quarkus-deployment")
+ deploymentModule.set("opendc-web-quarkus-deployment")
}
dependencies {
implementation(platform(libs.quarkus.bom))
+ api(projects.opendcWeb.opendcWebRunner)
+
implementation(libs.quarkus.core.runtime)
implementation(libs.quarkus.vertx.http.runtime)
implementation(libs.quarkus.arc.runtime)
}
-
-evaluationDependsOn(projects.opendcWeb.opendcWebUiQuarkusDeployment.dependencyProject.path)
diff --git a/opendc-web/opendc-web-runner-quarkus/src/main/java/org/opendc/web/runner/runtime/OpenDCRunnerRecorder.java b/opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/runner/OpenDCRunnerRecorder.java
index d5d524f1..814ddf15 100644
--- a/opendc-web/opendc-web-runner-quarkus/src/main/java/org/opendc/web/runner/runtime/OpenDCRunnerRecorder.java
+++ b/opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/runner/OpenDCRunnerRecorder.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 AtLarge Research
+ * Copyright (c) 2023 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -20,7 +20,7 @@
* SOFTWARE.
*/
-package org.opendc.web.runner.runtime;
+package org.opendc.web.quarkus.runtime.runner;
import io.quarkus.runtime.RuntimeValue;
import io.quarkus.runtime.ShutdownContext;
diff --git a/opendc-web/opendc-web-runner-quarkus/src/main/java/org/opendc/web/runner/runtime/OpenDCRunnerRuntimeConfig.java b/opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/runner/OpenDCRunnerRuntimeConfig.java
index 61c07e48..fbc56bfa 100644
--- a/opendc-web/opendc-web-runner-quarkus/src/main/java/org/opendc/web/runner/runtime/OpenDCRunnerRuntimeConfig.java
+++ b/opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/runner/OpenDCRunnerRuntimeConfig.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 AtLarge Research
+ * Copyright (c) 2023 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -20,7 +20,7 @@
* SOFTWARE.
*/
-package org.opendc.web.runner.runtime;
+package org.opendc.web.quarkus.runtime.runner;
import io.quarkus.runtime.annotations.ConfigItem;
import io.quarkus.runtime.annotations.ConfigPhase;
diff --git a/opendc-web/opendc-web-ui-quarkus-deployment/src/main/java/org/opendc/web/ui/deployment/AuthConfiguration.java b/opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/ui/AuthConfiguration.java
index 82e02549..10f91923 100644
--- a/opendc-web/opendc-web-ui-quarkus-deployment/src/main/java/org/opendc/web/ui/deployment/AuthConfiguration.java
+++ b/opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/ui/AuthConfiguration.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 AtLarge Research
+ * Copyright (c) 2023 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -20,7 +20,7 @@
* SOFTWARE.
*/
-package org.opendc.web.ui.deployment;
+package org.opendc.web.quarkus.runtime.ui;
import io.quarkus.runtime.annotations.ConfigGroup;
import io.quarkus.runtime.annotations.ConfigItem;
diff --git a/opendc-web/opendc-web-ui-quarkus-deployment/src/main/java/org/opendc/web/ui/deployment/OpenDCUiConfig.java b/opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/ui/OpenDCUiConfig.java
index 091e60ab..541cfdc1 100644
--- a/opendc-web/opendc-web-ui-quarkus-deployment/src/main/java/org/opendc/web/ui/deployment/OpenDCUiConfig.java
+++ b/opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/ui/OpenDCUiConfig.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 AtLarge Research
+ * Copyright (c) 2023 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -20,24 +20,19 @@
* SOFTWARE.
*/
-package org.opendc.web.ui.deployment;
+package org.opendc.web.quarkus.runtime.ui;
import io.quarkus.runtime.annotations.ConfigItem;
+import io.quarkus.runtime.annotations.ConfigPhase;
import io.quarkus.runtime.annotations.ConfigRoot;
import java.util.Optional;
/**
- * Build-time configuration for the OpenDC UI extension.
+ * Configuration for the OpenDC web UI.
*/
-@ConfigRoot(name = "opendc-ui")
+@ConfigRoot(phase = ConfigPhase.RUN_TIME, name = "opendc-ui")
public class OpenDCUiConfig {
/**
- * A flag to include the OpenDC UI extension into the build.
- */
- @ConfigItem(defaultValue = "true")
- boolean include;
-
- /**
* The base URL of the OpenDC API.
*/
@ConfigItem(defaultValue = "/api")
diff --git a/opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/ui/OpenDCUiRecorder.java b/opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/ui/OpenDCUiRecorder.java
new file mode 100644
index 00000000..5783e431
--- /dev/null
+++ b/opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/ui/OpenDCUiRecorder.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2023 AtLarge Research
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package org.opendc.web.quarkus.runtime.ui;
+
+import static io.vertx.ext.web.handler.StaticHandler.DEFAULT_MAX_AGE_SECONDS;
+
+import io.quarkus.runtime.annotations.Recorder;
+import io.vertx.core.Handler;
+import io.vertx.core.http.HttpHeaders;
+import io.vertx.core.http.HttpMethod;
+import io.vertx.core.http.HttpServerRequest;
+import io.vertx.core.json.JsonObject;
+import io.vertx.ext.web.RoutingContext;
+import io.vertx.ext.web.impl.Utils;
+
+/**
+ * Recorder class for the OpenDC web UI.
+ */
+@Recorder
+public class OpenDCUiRecorder {
+ /**
+ * Construct a {@link Handler} for serving the configuration of the OpenDC web UI.
+ */
+ public Handler<RoutingContext> configHandler(OpenDCUiConfig config) {
+ return (event) -> {
+ HttpServerRequest request = event.request();
+ if (request.method() != HttpMethod.GET && request.method() != HttpMethod.HEAD) {
+ event.next();
+ return;
+ }
+
+ event.response()
+ .setStatusCode(200)
+ .putHeader(HttpHeaders.CONTENT_TYPE, "text/javascript")
+ .putHeader(HttpHeaders.CACHE_CONTROL, "public, immutable, max-age=" + DEFAULT_MAX_AGE_SECONDS)
+ .putHeader(HttpHeaders.DATE, Utils.formatRFC1123DateTime(System.currentTimeMillis()))
+ .end(OpenDCUiRecorder.serializeConfig(config));
+ };
+ }
+
+ /**
+ * Serialize the configuration of the OpenDC web UI into JSON.
+ *
+ * @param config The configuration of the OpenDC web UI specified by the user.
+ * @return JS serialized version of the OpenDC web UI config.
+ */
+ private static String serializeConfig(OpenDCUiConfig config) {
+ JsonObject configJson = JsonObject.of("NEXT_PUBLIC_API_BASE_URL", config.apiBaseUrl);
+ config.auth.domain.ifPresent(s -> configJson.put("NEXT_PUBLIC_AUTH0_DOMAIN", s));
+ config.auth.clientId.ifPresent(s -> configJson.put("NEXT_PUBLIC_AUTH0_CLIENT_ID", s));
+ config.auth.audience.ifPresent(s -> configJson.put("NEXT_PUBLIC_AUTH0_AUDIENCE", s));
+ config.sentryDsn.ifPresent(s -> configJson.put("NEXT_PUBLIC_SENTRY_DSN", s));
+
+ return "window.__ENV = " + configJson.encode() + ";";
+ }
+}
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/error/MissingKotlinParameterExceptionMapper.java b/opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/ui/QuinoaNextRoutingRecorder.java
index 345acdfe..c511220d 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/error/MissingKotlinParameterExceptionMapper.java
+++ b/opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/ui/QuinoaNextRoutingRecorder.java
@@ -20,27 +20,36 @@
* SOFTWARE.
*/
-package org.opendc.web.server.rest.error;
+package org.opendc.web.quarkus.runtime.ui;
-import com.fasterxml.jackson.module.kotlin.MissingKotlinParameterException;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.Response;
-import jakarta.ws.rs.ext.ExceptionMapper;
-import jakarta.ws.rs.ext.Provider;
-import org.opendc.web.proto.ProtocolError;
+import io.quarkus.runtime.annotations.Recorder;
+import io.vertx.core.Handler;
+import io.vertx.ext.web.RoutingContext;
/**
- * An [ExceptionMapper] for [MissingKotlinParameterException] thrown by Jackson.
+ * Recorder class for building route handlers for Next.js pages and redirects.
*/
-@Provider
-public final class MissingKotlinParameterExceptionMapper implements ExceptionMapper<MissingKotlinParameterException> {
- @Override
- public Response toResponse(MissingKotlinParameterException exception) {
- return Response.status(Response.Status.BAD_REQUEST)
- .entity(new ProtocolError(
- Response.Status.BAD_REQUEST.getStatusCode(),
- "Field " + exception.getParameter().getName() + " is missing from body."))
- .type(MediaType.APPLICATION_JSON)
- .build();
+@Recorder
+public class QuinoaNextRoutingRecorder {
+ /**
+ * Construct a {@link Handler} for serving a dynamic route of a Next.js application.
+ */
+ public Handler<RoutingContext> pageHandler(String basePath, String page) {
+ return (event) -> event.reroute(basePath + page + ".html");
+ }
+
+ /**
+ * Construct a {@link Handler} for handling redirects of a Next.js application.
+ */
+ public Handler<RoutingContext> redirectHandler(String destination, int statusCode) {
+ return (event) -> {
+ String query = event.request().query();
+ String fullDestination = query != null ? destination + "?" + query : destination;
+
+ event.response()
+ .setStatusCode(statusCode)
+ .putHeader("Location", fullDestination)
+ .end();
+ };
}
}
diff --git a/opendc-web/opendc-web-ui-quarkus/src/main/resources/META-INF/quarkus-extension.yaml b/opendc-web/opendc-web-quarkus/src/main/resources/META-INF/quarkus-extension.yaml
index 581a1779..581a1779 100644
--- a/opendc-web/opendc-web-ui-quarkus/src/main/resources/META-INF/quarkus-extension.yaml
+++ b/opendc-web/opendc-web-quarkus/src/main/resources/META-INF/quarkus-extension.yaml
diff --git a/opendc-web/opendc-web-runner-quarkus-deployment/build.gradle.kts b/opendc-web/opendc-web-runner-quarkus-deployment/build.gradle.kts
deleted file mode 100644
index 589337f4..00000000
--- a/opendc-web/opendc-web-runner-quarkus-deployment/build.gradle.kts
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 2022 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-description = "Quarkus extension for the OpenDC experiment runner"
-
-// Build configuration
-plugins {
- `java-library-conventions`
-}
-
-dependencies {
- implementation(projects.opendcWeb.opendcWebRunnerQuarkus)
- implementation(projects.opendcTrace.opendcTraceApi)
-
- implementation(platform(libs.quarkus.bom))
- implementation(libs.quarkus.core.deployment)
- implementation(libs.quarkus.arc.deployment)
-}
diff --git a/opendc-web/opendc-web-runner-quarkus/build.gradle.kts b/opendc-web/opendc-web-runner-quarkus/build.gradle.kts
deleted file mode 100644
index 8e4e08d5..00000000
--- a/opendc-web/opendc-web-runner-quarkus/build.gradle.kts
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2022 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-description = "Quarkus extension for the OpenDC experiment runner"
-
-plugins {
- `java-library-conventions`
- id("io.quarkus.extension")
-}
-
-quarkusExtension {
- deploymentModule.set("opendc-web-runner-quarkus-deployment")
-}
-
-dependencies {
- modules {
- module("javax.annotation:javax.annotation-api") {
- replacedBy("jakarta.annotation:jakarta.annotation-api", "javax has been replaced by Jakarta")
- }
- }
-
- api(projects.opendcWeb.opendcWebRunner)
-
- implementation(platform(libs.quarkus.bom))
- implementation(libs.quarkus.core.runtime)
-}
-
-evaluationDependsOn(projects.opendcWeb.opendcWebRunnerQuarkusDeployment.dependencyProject.path)
diff --git a/opendc-web/opendc-web-runner-quarkus/src/main/resources/META-INF/quarkus-extension.yaml b/opendc-web/opendc-web-runner-quarkus/src/main/resources/META-INF/quarkus-extension.yaml
deleted file mode 100644
index b93b467a..00000000
--- a/opendc-web/opendc-web-runner-quarkus/src/main/resources/META-INF/quarkus-extension.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
----
-name: "OpenDC Web Runner"
-metadata:
- status: "preview"
- unlisted: true
diff --git a/opendc-web/opendc-web-runner/Dockerfile b/opendc-web/opendc-web-runner/Dockerfile
index 9ec184ee..d00c53fc 100644
--- a/opendc-web/opendc-web-runner/Dockerfile
+++ b/opendc-web/opendc-web-runner/Dockerfile
@@ -1,6 +1,5 @@
FROM eclipse-temurin:21-jdk-jammy
-MAINTAINER OpenDC Maintainers <opendc@atlarge-research.com>
-
+LABEL org.opencontainers.image.authors="OpenDC Maintainers <opendc@atlarge-research.com>"
# Obtain (cache) Gradle wrapper
COPY gradlew /app/
COPY gradle /app/gradle
diff --git a/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/internal/JobManagerImpl.kt b/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/internal/JobManagerImpl.kt
index 7081041c..a0955978 100644
--- a/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/internal/JobManagerImpl.kt
+++ b/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/internal/JobManagerImpl.kt
@@ -37,7 +37,7 @@ internal class JobManagerImpl(private val client: OpenDCRunnerClient) : JobManag
override fun claim(id: Long): Boolean {
return try {
- client.jobs.update(id, Job.Update(JobState.CLAIMED, 0))
+ client.jobs.update(id, Job.Update(JobState.CLAIMED, 0, null))
true
} catch (e: IllegalStateException) {
false
@@ -48,7 +48,7 @@ internal class JobManagerImpl(private val client: OpenDCRunnerClient) : JobManag
id: Long,
runtime: Int,
): Boolean {
- val res = client.jobs.update(id, Job.Update(JobState.RUNNING, runtime))
+ val res = client.jobs.update(id, Job.Update(JobState.RUNNING, runtime, null))
return res?.state != JobState.FAILED
}
@@ -56,7 +56,7 @@ internal class JobManagerImpl(private val client: OpenDCRunnerClient) : JobManag
id: Long,
runtime: Int,
) {
- client.jobs.update(id, Job.Update(JobState.FAILED, runtime))
+ client.jobs.update(id, Job.Update(JobState.FAILED, runtime, null))
}
override fun finish(
@@ -64,6 +64,6 @@ internal class JobManagerImpl(private val client: OpenDCRunnerClient) : JobManag
runtime: Int,
results: Map<String, Any>,
) {
- client.jobs.update(id, Job.Update(JobState.FINISHED, runtime))
+ client.jobs.update(id, Job.Update(JobState.FINISHED, runtime, results))
}
}
diff --git a/opendc-web/opendc-web-server/Dockerfile b/opendc-web/opendc-web-server/Dockerfile
index 2aee7ddf..7e8d34c3 100644
--- a/opendc-web/opendc-web-server/Dockerfile
+++ b/opendc-web/opendc-web-server/Dockerfile
@@ -1,6 +1,4 @@
FROM eclipse-temurin:21-jdk-jammy
-MAINTAINER OpenDC Maintainers <opendc@atlarge-research.com>
-
# Obtain (cache) Gradle wrapper
COPY gradlew /app/
COPY gradle /app/gradle
@@ -17,7 +15,10 @@ ENV OPENDC_AUTH0_AUDIENCE=$OPENDC_AUTH0_AUDIENCE
ENV OPENDC_AUTH0_DOCS_CLIENT_ID=$OPENDC_AUTH0_DOCS_CLIENT_ID
COPY ./ /app/
-RUN ./gradlew --no-daemon :opendc-web:opendc-web-server:quarkusBuild -Dquarkus.profile=docker
+RUN curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash && \
+ . ~/.nvm/nvm.sh && \
+ nvm install --lts && \
+ ./gradlew --no-daemon :opendc-web:opendc-web-server:quarkusBuild -Dquarkus.profile=docker
FROM eclipse-temurin:21-jdk-jammy
COPY --from=0 /app/opendc-web/opendc-web-server/build/quarkus-app /opt/opendc
diff --git a/opendc-web/opendc-web-server/build.gradle.kts b/opendc-web/opendc-web-server/build.gradle.kts
index 484e98c0..3a99f3ce 100644
--- a/opendc-web/opendc-web-server/build.gradle.kts
+++ b/opendc-web/opendc-web-server/build.gradle.kts
@@ -32,12 +32,8 @@ dependencies {
implementation(enforcedPlatform(libs.quarkus.bom))
implementation(projects.opendcWeb.opendcWebProto)
- testImplementation("junit:junit:4.13.1")
- testImplementation("junit:junit:4.13.1")
- compileOnly(projects.opendcWeb.opendcWebUiQuarkusDeployment) // Temporary fix for Quarkus/Gradle issues
- compileOnly(projects.opendcWeb.opendcWebRunnerQuarkusDeployment)
- implementation(projects.opendcWeb.opendcWebUiQuarkus)
- implementation(projects.opendcWeb.opendcWebRunnerQuarkus)
+ compileOnly(projects.opendcWeb.opendcWebQuarkusDeployment)
+ implementation(projects.opendcWeb.opendcWebQuarkus)
implementation(libs.quarkus.kotlin)
implementation(libs.quarkus.resteasy.core)
@@ -47,6 +43,7 @@ dependencies {
implementation(libs.quarkus.security)
implementation(libs.quarkus.oidc)
+ implementation(libs.quarkus.quinoa.runtime)
implementation(libs.quarkus.hibernate.orm.core)
implementation(libs.quarkus.hibernate.orm.panache)
@@ -68,7 +65,7 @@ val createStartScripts by tasks.creating(CreateStartScripts::class) {
applicationName = "opendc-server"
mainClass.set("io.quarkus.bootstrap.runner.QuarkusEntryPoint")
classpath = files("lib/quarkus-run.jar")
- outputDir = project.layout.buildDirectory.get().asFile.resolve("scripts")
+ outputDir = project.layout.buildDirectory.dir("scripts").get().asFile
}
distributions {
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Job.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Job.java
index a0ac390f..ef342e5f 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Job.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Job.java
@@ -28,6 +28,17 @@ import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
import io.quarkus.hibernate.orm.panache.PanacheQuery;
import io.quarkus.panache.common.Parameters;
import jakarta.persistence.*;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.EnumType;
+import jakarta.persistence.Enumerated;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.ForeignKey;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
import java.time.Instant;
import java.util.Map;
import org.hibernate.annotations.Type;
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Portfolio.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Portfolio.java
index c2695192..80031c0a 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Portfolio.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Portfolio.java
@@ -51,6 +51,7 @@ import org.opendc.web.proto.Targets;
*/
@Entity
@Table(
+ name = "portfolios",
uniqueConstraints = {
@UniqueConstraint(
name = "uk_portfolios_number",
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Project.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Project.java
index f4e5305d..ca032e21 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Project.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Project.java
@@ -44,7 +44,7 @@ import java.util.Set;
* A project in OpenDC encapsulates all the datacenter designs and simulation runs for a set of users.
*/
@Entity
-@Table
+@Table(name = "projects")
@NamedQueries({
@NamedQuery(
name = "Project.findByUser",
@@ -52,7 +52,7 @@ import java.util.Set;
"""
SELECT a
FROM ProjectAuthorization a
- WHERE a.key.userName = :userName
+ WHERE a.key.userId = :userId
"""),
@NamedQuery(
name = "Project.allocatePortfolio",
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/ProjectAuthorization.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/ProjectAuthorization.java
index 3776ae12..ad94ad29 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/ProjectAuthorization.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/ProjectAuthorization.java
@@ -47,7 +47,7 @@ import org.opendc.web.proto.user.ProjectRole;
* An authorization for some user to participate in a project.
*/
@Entity
-@Table
+@Table(name = "project_authorizations")
@NamedQueries({
@NamedQuery(
name = "ProjectAuthorization.findByUser",
@@ -55,7 +55,7 @@ import org.opendc.web.proto.user.ProjectRole;
"""
SELECT a
FROM ProjectAuthorization a
- WHERE a.key.userName = :userName
+ WHERE a.key.userId = :userId
"""),
})
public class ProjectAuthorization extends PanacheEntityBase {
@@ -88,8 +88,8 @@ public class ProjectAuthorization extends PanacheEntityBase {
/**
* Construct a {@link ProjectAuthorization} object.
*/
- public ProjectAuthorization(Project project, String userName, ProjectRole role) {
- this.key = new ProjectAuthorization.Key(project.id, userName);
+ public ProjectAuthorization(Project project, String userId, ProjectRole role) {
+ this.key = new ProjectAuthorization.Key(project.id, userId);
this.project = project;
this.role = role;
}
@@ -100,25 +100,25 @@ public class ProjectAuthorization extends PanacheEntityBase {
protected ProjectAuthorization() {}
/**
- * List all projects for the user with the specified <code>userName</code>.
+ * List all projects for the user with the specified <code>userId</code>.
*
- * @param userName The identifier of the user that is requesting the list of projects.
+ * @param userId The identifier of the user that is requesting the list of projects.
* @return A query returning projects that the user has received authorization for.
*/
- public static PanacheQuery<ProjectAuthorization> findByUser(String userName) {
- return find("#ProjectAuthorization.findByUser", Parameters.with("userName", userName));
+ public static PanacheQuery<ProjectAuthorization> findByUser(String userId) {
+ return find("#ProjectAuthorization.findByUser", Parameters.with("userId", userId));
}
/**
- * Find the project with <code>id</code> for the user with the specified <code>userName</code>.
+ * Find the project with <code>id</code> for the user with the specified <code>userId</code>.
*
- * @param userName The identifier of the user that is requesting the list of projects.
- * @param project_id The unique identifier of the project.
+ * @param userId The identifier of the user that is requesting the list of projects.
+ * @param id The unique identifier of the project.
* @return The project with the specified identifier or <code>null</code> if it does not exist or is not accessible
* to the user with the specified identifier.
*/
- public static ProjectAuthorization findByUser(String userName, long project_id) {
- return findById(new ProjectAuthorization.Key(project_id, userName));
+ public static ProjectAuthorization findByUser(String userId, long id) {
+ return findById(new ProjectAuthorization.Key(id, userId));
}
/**
@@ -146,12 +146,12 @@ public class ProjectAuthorization extends PanacheEntityBase {
@Column(name = "project_id", nullable = false)
public long projectId;
- @Column(name = "user_name", nullable = false)
- public String userName;
+ @Column(name = "user_id", nullable = false)
+ public String userId;
- public Key(long projectId, String userName) {
+ public Key(long projectId, String userId) {
this.projectId = projectId;
- this.userName = userName;
+ this.userId = userId;
}
protected Key() {}
@@ -161,12 +161,12 @@ public class ProjectAuthorization extends PanacheEntityBase {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Key key = (Key) o;
- return projectId == key.projectId && userName.equals(key.userName);
+ return projectId == key.projectId && userId.equals(key.userId);
}
@Override
public int hashCode() {
- return Objects.hash(projectId, userName);
+ return Objects.hash(projectId, userId);
}
}
}
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Scenario.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Scenario.java
index c79ef5bb..0224ae43 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Scenario.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Scenario.java
@@ -27,6 +27,20 @@ import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
import io.quarkus.hibernate.orm.panache.PanacheQuery;
import io.quarkus.panache.common.Parameters;
import jakarta.persistence.*;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Embedded;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.ForeignKey;
+import jakarta.persistence.Index;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.Table;
+import jakarta.persistence.UniqueConstraint;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.annotations.Type;
@@ -37,6 +51,7 @@ import org.opendc.web.proto.OperationalPhenomena;
*/
@Entity
@Table(
+ name = "scenarios",
uniqueConstraints = {
@UniqueConstraint(
name = "uk_scenarios_number",
@@ -109,13 +124,10 @@ public class Scenario extends PanacheEntityBase {
/**
* Operational phenomena activated in the scenario.
- * @Column(columnDefinition = "jsonb", nullable = false, updatable = false)
- * @Type(JsonType.class)
*/
@Column(columnDefinition = "jsonb", nullable = false, updatable = false)
@Type(JsonType.class)
public OperationalPhenomena phenomena;
-
/**
* The name of the VM scheduler used in the scenario.
*/
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Topology.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Topology.java
index 8a4e2ae2..ff8b4416 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Topology.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Topology.java
@@ -41,13 +41,14 @@ import jakarta.persistence.UniqueConstraint;
import java.time.Instant;
import java.util.List;
import org.hibernate.annotations.Type;
-import org.opendc.web.proto.Room;
+import org.opendc.web.proto.topology.Room;
/**
* A datacenter design in OpenDC.
*/
@Entity
@Table(
+ name = "topologies",
uniqueConstraints = {
@UniqueConstraint(
name = "uk_topologies_number",
@@ -103,8 +104,6 @@ public class Topology extends PanacheEntityBase {
/**
* Datacenter design in JSON
- * @Column(columnDefinition = "jsonb", nullable = false)
- * @Type(JsonType.class)
*/
@Column(columnDefinition = "jsonb", nullable = false)
@Type(JsonType.class)
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/runner/JobResource.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/runner/JobResource.java
index 4dde8654..2b774082 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/runner/JobResource.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/runner/JobResource.java
@@ -98,7 +98,7 @@ public final class JobResource {
}
try {
- jobService.updateJob(job, update.getState(), update.getRuntime(), update.getResults());
+ jobService.updateJob(job, update.state(), update.runtime(), update.results());
} catch (IllegalArgumentException e) {
throw new WebApplicationException(e, 400);
} catch (IllegalStateException e) {
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/PortfolioResource.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/PortfolioResource.java
index 2a3a40f4..e4d5362c 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/PortfolioResource.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/PortfolioResource.java
@@ -100,7 +100,7 @@ public final class PortfolioResource {
var project = auth.project;
int number = project.allocatePortfolio(now);
- Portfolio portfolio = new Portfolio(project, number, request.getName(), request.getTargets());
+ Portfolio portfolio = new Portfolio(project, number, request.name(), request.targets());
project.portfolios.add(portfolio);
portfolio.persist();
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/PortfolioScenarioResource.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/PortfolioScenarioResource.java
index 789808c8..ea87a7ad 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/PortfolioScenarioResource.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/PortfolioScenarioResource.java
@@ -118,12 +118,12 @@ public final class PortfolioScenarioResource {
throw new WebApplicationException("Portfolio not found", 404);
}
- Topology topology = Topology.findByProject(projectId, (int) request.getTopology());
+ Topology topology = Topology.findByProject(projectId, (int) request.topology());
if (topology == null) {
throw new WebApplicationException("Referred topology does not exist", 400);
}
- Trace trace = Trace.findById(request.getWorkload().getTrace());
+ Trace trace = Trace.findById(request.workload().trace());
if (trace == null) {
throw new WebApplicationException("Referred trace does not exist", 400);
}
@@ -136,14 +136,14 @@ public final class PortfolioScenarioResource {
project,
portfolio,
number,
- request.getName(),
- new Workload(trace, request.getWorkload().getSamplingFraction()),
+ request.name(),
+ new Workload(trace, request.workload().samplingFraction()),
topology,
- request.getPhenomena(),
- request.getSchedulerName());
+ request.phenomena(),
+ request.schedulerName());
scenario.persist();
- Job job = new Job(scenario, userId, now, portfolio.targets.getRepeats());
+ Job job = new Job(scenario, userId, now, portfolio.targets.repeats());
job.persist();
// Fail the job if there is not enough budget for the simulation
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/ProjectResource.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/ProjectResource.java
index ae1c959e..40ebc666 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/ProjectResource.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/ProjectResource.java
@@ -79,7 +79,7 @@ public final class ProjectResource {
@Consumes("application/json")
public org.opendc.web.proto.user.Project create(@Valid org.opendc.web.proto.user.Project.Create request) {
Instant now = Instant.now();
- Project entity = new Project(request.getName(), now);
+ Project entity = new Project(request.name(), now);
entity.persist();
ProjectAuthorization authorization =
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/TopologyResource.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/TopologyResource.java
index b8c542d3..25819e32 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/TopologyResource.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/TopologyResource.java
@@ -104,7 +104,7 @@ public final class TopologyResource {
Project project = auth.project;
int number = project.allocateTopology(now);
- Topology topology = new Topology(project, number, request.getName(), now, request.getRooms());
+ Topology topology = new Topology(project, number, request.name(), now, request.rooms());
project.topologies.add(topology);
topology.persist();
@@ -164,7 +164,7 @@ public final class TopologyResource {
}
entity.updatedAt = Instant.now();
- entity.rooms = request.getRooms();
+ entity.rooms = request.rooms();
return UserProtocol.toDto(entity, auth);
}
diff --git a/opendc-web/opendc-web-server/src/main/resources/application-dev.properties b/opendc-web/opendc-web-server/src/main/resources/application-dev.properties
index 5fbc4c04..98b1e9eb 100644
--- a/opendc-web/opendc-web-server/src/main/resources/application-dev.properties
+++ b/opendc-web/opendc-web-server/src/main/resources/application-dev.properties
@@ -24,11 +24,21 @@ quarkus.datasource.jdbc.url=jdbc:h2:mem:default;DB_CLOSE_DELAY=-1;INIT=CREATE TY
# Hibernate
quarkus.hibernate-orm.dialect=org.hibernate.dialect.H2Dialect
+quarkus.hibernate-orm.log.sql=true
quarkus.flyway.clean-at-start=true
+quarkus.flyway.locations=db/migration,db/testing
# Disable authentication
+quarkus.oidc.enabled=false
opendc.security.enabled=false
+# Create new tables and fill them
+quarkus.hibernate-orm.database.generation=drop-and-create
+quarkus.hibernate-orm.sql-load-script=load_data.sql
+
+# Quinoa
+quarkus.quinoa.dev-server=true
+
# Mount web UI at root and API at "/api"
quarkus.resteasy.path=/api
diff --git a/opendc-web/opendc-web-server/src/main/resources/application-docker.properties b/opendc-web/opendc-web-server/src/main/resources/application-docker.properties
index eae9ee1e..f0b3e7dc 100644
--- a/opendc-web/opendc-web-server/src/main/resources/application-docker.properties
+++ b/opendc-web/opendc-web-server/src/main/resources/application-docker.properties
@@ -27,10 +27,7 @@ quarkus.datasource.password=${OPENDC_DB_PASSWORD}
quarkus.datasource.jdbc.url=${OPENDC_DB_URL}
# Hibernate
-quarkus.hibernate-orm.dialect=org.hibernate.dialect.PostgreSQL95Dialect
-
-# Disable OpenDC web UI
-quarkus.opendc-ui.include=false
+quarkus.hibernate-orm.dialect=org.hibernate.dialect.PostgreSQLDialect
# Security
opendc.security.enabled=true
@@ -47,3 +44,9 @@ quarkus.smallrye-openapi.security-scheme=oidc
quarkus.smallrye-openapi.security-scheme-name=Auth0
quarkus.smallrye-openapi.oidc-open-id-connect-url=https://${OPENDC_AUTH0_DOMAIN:opendc.eu.auth0.com}/.well-known/openid-configuration
quarkus.smallrye-openapi.servers=https://api.opendc.org
+
+# Enable the settings below if you want to test the docker-compose deployment locally
+#quarkus.hibernate-orm.database.generation=drop-and-create
+#quarkus.resteasy.path=/api
+#quarkus.oidc.enabled=false
+#opendc.security.enabled=false
diff --git a/opendc-web/opendc-web-server/src/main/resources/application.properties b/opendc-web/opendc-web-server/src/main/resources/application.properties
index 0f47db30..8daeccf3 100644
--- a/opendc-web/opendc-web-server/src/main/resources/application.properties
+++ b/opendc-web/opendc-web-server/src/main/resources/application.properties
@@ -22,6 +22,9 @@
quarkus.http.cors=true
quarkus.http.cors.origins=http://localhost:3000,https://opendc.org
+# Quinoa
+quarkus.quinoa.dev-server=false
+
# Security
quarkus.oidc.enabled=${opendc.security.enabled}
diff --git a/opendc-web/opendc-web-server/src/main/resources/load_data.sql b/opendc-web/opendc-web-server/src/main/resources/load_data.sql
index 72396cef..39cb3a02 100644
--- a/opendc-web/opendc-web-server/src/main/resources/load_data.sql
+++ b/opendc-web/opendc-web-server/src/main/resources/load_data.sql
@@ -1,56 +1,56 @@
-- Insert data
-INSERT INTO PROJECT (created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at, id)
+INSERT INTO projects (created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at, id)
VALUES ('2024-03-01T15:31:41.579969Z', 'Test Project 1', 0, 0, 0, '2024-03-01T15:31:41.579969Z', 1);
-INSERT INTO PROJECTAUTHORIZATION (role, project_id, user_name)
+INSERT INTO project_authorizations (role, project_id, user_id)
VALUES ('OWNER', 1, 'test_user_1');
-- Add test user 2 as a viewer for project 1
-INSERT INTO PROJECTAUTHORIZATION (role, project_id, user_name)
+INSERT INTO project_authorizations (role, project_id, user_id)
VALUES ('VIEWER', 1, 'test_user_2');
-- Add test user 3 as an editor for project 1
-INSERT INTO PROJECTAUTHORIZATION (role, project_id, user_name)
+INSERT INTO project_authorizations (role, project_id, user_id)
VALUES ('EDITOR', 1, 'test_user_3');
-- Create a project for test user 2
-INSERT INTO PROJECT (created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at, id)
+INSERT INTO projects (created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at, id)
VALUES ('2024-03-01T15:31:41.579969Z', 'Test Project 2', 0, 0, 0, '2024-03-01T15:31:41.579969Z', 2);
-INSERT INTO PROJECTAUTHORIZATION (role, project_id, user_name)
+INSERT INTO project_authorizations (role, project_id, user_id)
VALUES ('OWNER', 2, 'test_user_2');
-- Create three projects for test user 3. User 3 has multiple projects to test getAll
-INSERT INTO PROJECT (created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at, id)
+INSERT INTO projects (created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at, id)
VALUES ('2024-03-01T15:31:41.579969Z', 'Test Project 3', 0, 0, 0, '2024-03-01T15:31:41.579969Z', 3);
-INSERT INTO PROJECTAUTHORIZATION (role, project_id, user_name)
+INSERT INTO project_authorizations (role, project_id, user_id)
VALUES ('OWNER', 3, 'test_user_3');
-INSERT INTO PROJECT (created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at, id)
+INSERT INTO projects (created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at, id)
VALUES ('2024-03-01T15:31:41.579969Z', 'Test Project 4', 0, 0, 0, '2024-03-01T15:31:41.579969Z', 4);
-INSERT INTO PROJECTAUTHORIZATION (role, project_id, user_name)
+INSERT INTO project_authorizations (role, project_id, user_id)
VALUES ('OWNER', 4, 'test_user_3');
-INSERT INTO PROJECT (created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at, id)
+INSERT INTO projects (created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at, id)
VALUES ('2024-03-01T15:31:41.579969Z', 'Test Project 5', 0, 0, 0, '2024-03-01T15:31:41.579969Z', 5);
-INSERT INTO PROJECTAUTHORIZATION (role, project_id, user_name)
+INSERT INTO project_authorizations (role, project_id, user_id)
VALUES ('OWNER', 5, 'test_user_3');
-- Project to delete
-INSERT INTO PROJECT (created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at, id)
+INSERT INTO projects (created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at, id)
VALUES ('2024-03-01T15:31:41.579969Z', 'Test Project Delete', 0, 0, 0, '2024-03-01T15:31:41.579969Z', 6);
-INSERT INTO PROJECTAUTHORIZATION (role, project_id, user_name)
+INSERT INTO project_authorizations (role, project_id, user_id)
VALUES ('OWNER', 6, 'test_user_1');
-- --------------------------------------------------------------------------------
@@ -58,16 +58,16 @@ VALUES ('OWNER', 6, 'test_user_1');
-- --------------------------------------------------------------------------------
-- Add Portfolio to project 1
-INSERT INTO PORTFOLIO (name, number, project_id, targets, id)
+INSERT INTO portfolios (name, number, project_id, targets, id)
VALUES ('Test PortFolio Base', 1, 1, '{"metrics": [], "repeats":1}' FORMAT JSON, 1);
-INSERT INTO PORTFOLIO (name, number, project_id, targets, id)
+INSERT INTO portfolios (name, number, project_id, targets, id)
VALUES ('Test PortFolio Delete', 2, 1, '{"metrics": [], "repeats":1}' FORMAT JSON, 2);
-INSERT INTO PORTFOLIO (name, number, project_id, targets, id)
+INSERT INTO portfolios (name, number, project_id, targets, id)
VALUES ('Test PortFolio DeleteEditor', 3, 1, '{"metrics": [], "repeats":1}' FORMAT JSON, 3);
-UPDATE Project p
+UPDATE projects p
SET p.portfolios_created = 3, p.updated_at = '2024-03-01T15:31:41.579969Z'
WHERE p.id = 1;
@@ -75,19 +75,19 @@ WHERE p.id = 1;
-- Topologies
-- --------------------------------------------------------------------------------
-INSERT INTO TOPOLOGY (created_at, name, number, project_id, rooms, updated_at, id)
+INSERT INTO topologies (created_at, name, number, project_id, rooms, updated_at, id)
VALUES ('2024-03-01T15:31:41.579969Z', 'Test Topology testUpdate', 1, 1, '[]' FORMAT JSON, '2024-03-01T15:31:41.579969Z', 1);
-INSERT INTO TOPOLOGY (created_at, name, number, project_id, rooms, updated_at, id)
+INSERT INTO topologies (created_at, name, number, project_id, rooms, updated_at, id)
VALUES ('2024-03-01T15:31:41.579969Z', 'Test Topology testDeleteAsEditor', 2, 1, '[]' FORMAT JSON, '2024-03-01T15:31:41.579969Z', 2);
-INSERT INTO TOPOLOGY (created_at, name, number, project_id, rooms, updated_at, id)
+INSERT INTO topologies (created_at, name, number, project_id, rooms, updated_at, id)
VALUES ('2024-03-01T15:31:41.579969Z', 'Test Topology testDelete', 3, 1, '[]' FORMAT JSON, '2024-03-01T15:31:41.579969Z', 3);
-INSERT INTO TOPOLOGY (created_at, name, number, project_id, rooms, updated_at, id)
+INSERT INTO topologies (created_at, name, number, project_id, rooms, updated_at, id)
VALUES ('2024-03-01T15:31:41.579969Z', 'Test Topology testDeleteUsed', 4, 1, '[]' FORMAT JSON, '2024-03-01T15:31:41.579969Z', 4);
-UPDATE Project p
+UPDATE projects p
SET p.topologies_created = 4, p.updated_at = '2024-03-01T15:31:41.579969Z'
WHERE p.id = 1;
@@ -95,21 +95,21 @@ WHERE p.id = 1;
-- Traces
-- --------------------------------------------------------------------------------
-INSERT INTO TRACE (id, name, type)
+INSERT INTO trace (id, name, type)
VALUES ('bitbrains-small', 'Bitbrains Small', 'small');
-- --------------------------------------------------------------------------------
-- Scenario
-- --------------------------------------------------------------------------------
-INSERT INTO SCENARIO (name, number, phenomena, portfolio_id, project_id, scheduler_name, topology_id, sampling_fraction, trace_id, id)
+INSERT INTO scenarios (name, number, phenomena, portfolio_id, project_id, scheduler_name, topology_id, sampling_fraction, trace_id, id)
VALUES ('Test Scenario testDelete', 1, '{"failures": false, "interference": false}' FORMAT JSON, 1, 1, 'test', 1, 1.0, 'bitbrains-small', 1);
-INSERT INTO SCENARIO (name, number, phenomena, portfolio_id, project_id, scheduler_name, topology_id, sampling_fraction, trace_id, id)
+INSERT INTO scenarios (name, number, phenomena, portfolio_id, project_id, scheduler_name, topology_id, sampling_fraction, trace_id, id)
VALUES ('Test Scenario testDeleteUsed', 2, '{"failures": false, "interference": false}' FORMAT JSON, 1, 1, 'test', 4, 1.0, 'bitbrains-small', 2);
-UPDATE Project p
+UPDATE projects p
SET p.scenarios_created = 2, p.updated_at = '2024-03-01T15:31:41.579969Z'
WHERE p.id = 1;
@@ -117,8 +117,8 @@ WHERE p.id = 1;
-- Job
-- --------------------------------------------------------------------------------
-INSERT INTO JOB (scenario_id, created_by, created_at, repeats, updated_at, state, runtime, results, id)
+INSERT INTO job (scenario_id, created_by, created_at, repeats, updated_at, state, runtime, results, id)
VALUES (1, 'test_user_1', '2024-03-01T15:31:41.579969Z', 1, '2024-03-01T15:31:41.579969Z', 'PENDING', 1, '{}' FORMAT JSON, 1);
-INSERT INTO JOB (scenario_id, created_by, created_at, repeats, updated_at, state, runtime, results, id)
+INSERT INTO job (scenario_id, created_by, created_at, repeats, updated_at, state, runtime, results, id)
VALUES (1, 'test_user_1', '2024-03-01T15:31:41.579969Z', 1, '2024-03-01T15:31:41.579969Z', 'PENDING', 1, '{}' FORMAT JSON, 2);
diff --git a/opendc-web/opendc-web-ui/.dockerignore b/opendc-web/opendc-web-server/src/main/webui/.dockerignore
index b91894f6..b91894f6 100644
--- a/opendc-web/opendc-web-ui/.dockerignore
+++ b/opendc-web/opendc-web-server/src/main/webui/.dockerignore
diff --git a/opendc-web/opendc-web-ui/.eslintrc b/opendc-web/opendc-web-server/src/main/webui/.eslintrc
index 1446fa02..1446fa02 100644
--- a/opendc-web/opendc-web-ui/.eslintrc
+++ b/opendc-web/opendc-web-server/src/main/webui/.eslintrc
diff --git a/opendc-web/opendc-web-ui/.gitignore b/opendc-web/opendc-web-server/src/main/webui/.gitignore
index 54eada4c..0f845719 100644
--- a/opendc-web/opendc-web-ui/.gitignore
+++ b/opendc-web/opendc-web-server/src/main/webui/.gitignore
@@ -6,6 +6,7 @@
# Production
/build
+/public/__ENV.js
# Misc
.DS_Store
diff --git a/opendc-web/opendc-web-ui/.prettierrc.yaml b/opendc-web/opendc-web-server/src/main/webui/.prettierrc.yaml
index 9a2b9a95..9a2b9a95 100644
--- a/opendc-web/opendc-web-ui/.prettierrc.yaml
+++ b/opendc-web/opendc-web-server/src/main/webui/.prettierrc.yaml
diff --git a/opendc-web/opendc-web-ui/Dockerfile b/opendc-web/opendc-web-server/src/main/webui/Dockerfile
index 24ca2b3e..6e30c96f 100644
--- a/opendc-web/opendc-web-ui/Dockerfile
+++ b/opendc-web/opendc-web-server/src/main/webui/Dockerfile
@@ -1,6 +1,5 @@
FROM node:18-slim AS staging
-MAINTAINER OpenDC Maintainers <opendc@atlarge-research.com>
-
+LABEL org.opencontainers.image.authors="OpenDC Maintainers <opendc@atlarge-research.com>"
# Copy package details
COPY ./package.json ./package-lock.json /opendc/
RUN cd /opendc && npm ci
@@ -11,21 +10,13 @@ FROM node:18-slim AS build
COPY ./ /opendc
COPY --from=staging /opendc/node_modules /opendc/node_modules
RUN cd /opendc/ \
- # Environmental variables that will be substituted during image runtime
- && export NEXT_PUBLIC_API_BASE_URL="%%NEXT_PUBLIC_API_BASE_URL%%" \
- NEXT_PUBLIC_SENTRY_DSN="%%NEXT_PUBLIC_SENTRY_DSN%%" \
- NEXT_PUBLIC_AUTH0_DOMAIN="%%NEXT_PUBLIC_AUTH0_DOMAIN%%" \
- NEXT_PUBLIC_AUTH0_CLIENT_ID="%%NEXT_PUBLIC_AUTH0_CLIENT_ID%%" \
- NEXT_PUBLIC_AUTH0_AUDIENCE="%%NEXT_PUBLIC_AUTH0_AUDIENCE%%" \
&& npm run build \
- && npm cache clean --force \
- && mv build/next build/next.template
-
+ && npm cache clean --force
FROM node:18-slim
COPY --from=build /opendc /opendc
WORKDIR /opendc
-CMD ./scripts/envsubst.sh; npm run start
+CMD npm run start
LABEL org.opencontainers.image.authors="OpenDC Maintainers <opendc@atlarge-research.com>"
LABEL org.opencontainers.image.url="https://opendc.org"
diff --git a/opendc-web/opendc-web-ui/README.md b/opendc-web/opendc-web-server/src/main/webui/README.md
index a1133475..24788e37 100644
--- a/opendc-web/opendc-web-ui/README.md
+++ b/opendc-web/opendc-web-server/src/main/webui/README.md
@@ -10,7 +10,7 @@ dynamic components and their styles are contained in `src`.
### Pages
-All pages are represented by a component in the `src/pages` directory, following
+All pages are represented by a component in the `pages` directory, following
the [Next.js conventions](https://nextjs.org/docs/routing/introduction) for routing. There are components for the
following pages:
@@ -40,8 +40,8 @@ located in `src/api`. The actual logic responsible for calling these functions i
### State Management
State for the topology editor is managed via a Redux store. State is kept there in an immutable form, only to be modified through
-actions being dispatched. These actions are contained in the `src/actions` folder, and the reducers (managing how state
-is updated according to dispatched actions) are located in `src/reducers`. If you're not familiar with the Redux
+actions being dispatched. These actions are contained in the `actions` folder, and the reducers (managing how state
+is updated according to dispatched actions) are located in `reducers`. If you're not familiar with the Redux
approach to state management, have a look at their [official documentation](https://redux.js.org/).
## Running the development server
diff --git a/opendc-web/opendc-web-ui/src/api/index.js b/opendc-web/opendc-web-server/src/main/webui/api/index.js
index 3411b96e..3411b96e 100644
--- a/opendc-web/opendc-web-ui/src/api/index.js
+++ b/opendc-web/opendc-web-server/src/main/webui/api/index.js
diff --git a/opendc-web/opendc-web-ui/src/api/portfolios.js b/opendc-web/opendc-web-server/src/main/webui/api/portfolios.js
index d818876f..d818876f 100644
--- a/opendc-web/opendc-web-ui/src/api/portfolios.js
+++ b/opendc-web/opendc-web-server/src/main/webui/api/portfolios.js
diff --git a/opendc-web/opendc-web-ui/src/api/projects.js b/opendc-web/opendc-web-server/src/main/webui/api/projects.js
index e7e095da..e7e095da 100644
--- a/opendc-web/opendc-web-ui/src/api/projects.js
+++ b/opendc-web/opendc-web-server/src/main/webui/api/projects.js
diff --git a/opendc-web/opendc-web-ui/src/api/scenarios.js b/opendc-web/opendc-web-server/src/main/webui/api/scenarios.js
index 7eeb8f28..7eeb8f28 100644
--- a/opendc-web/opendc-web-ui/src/api/scenarios.js
+++ b/opendc-web/opendc-web-server/src/main/webui/api/scenarios.js
diff --git a/opendc-web/opendc-web-ui/src/api/schedulers.js b/opendc-web/opendc-web-server/src/main/webui/api/schedulers.js
index 0b8b8153..0b8b8153 100644
--- a/opendc-web/opendc-web-ui/src/api/schedulers.js
+++ b/opendc-web/opendc-web-server/src/main/webui/api/schedulers.js
diff --git a/opendc-web/opendc-web-ui/src/api/topologies.js b/opendc-web/opendc-web-server/src/main/webui/api/topologies.js
index 0509c6d0..0509c6d0 100644
--- a/opendc-web/opendc-web-ui/src/api/topologies.js
+++ b/opendc-web/opendc-web-server/src/main/webui/api/topologies.js
diff --git a/opendc-web/opendc-web-ui/src/api/traces.js b/opendc-web/opendc-web-server/src/main/webui/api/traces.js
index fd637ac3..fd637ac3 100644
--- a/opendc-web/opendc-web-ui/src/api/traces.js
+++ b/opendc-web/opendc-web-server/src/main/webui/api/traces.js
diff --git a/opendc-web/opendc-web-ui/src/api/users.js b/opendc-web/opendc-web-server/src/main/webui/api/users.js
index 12a9be05..12a9be05 100644
--- a/opendc-web/opendc-web-ui/src/api/users.js
+++ b/opendc-web/opendc-web-server/src/main/webui/api/users.js
diff --git a/opendc-web/opendc-web-ui/src/auth.js b/opendc-web/opendc-web-server/src/main/webui/auth.js
index 8c88f526..8c88f526 100644
--- a/opendc-web/opendc-web-ui/src/auth.js
+++ b/opendc-web/opendc-web-server/src/main/webui/auth.js
diff --git a/opendc-web/opendc-web-ui/src/components/AppHeader.js b/opendc-web/opendc-web-server/src/main/webui/components/AppHeader.js
index 514dce2a..514dce2a 100644
--- a/opendc-web/opendc-web-ui/src/components/AppHeader.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/AppHeader.js
diff --git a/opendc-web/opendc-web-ui/src/components/AppHeader.module.css b/opendc-web/opendc-web-server/src/main/webui/components/AppHeader.module.css
index 9d5dbed1..9d5dbed1 100644
--- a/opendc-web/opendc-web-ui/src/components/AppHeader.module.css
+++ b/opendc-web/opendc-web-server/src/main/webui/components/AppHeader.module.css
diff --git a/opendc-web/opendc-web-ui/src/components/AppHeaderTools.js b/opendc-web/opendc-web-server/src/main/webui/components/AppHeaderTools.js
index 499bceef..499bceef 100644
--- a/opendc-web/opendc-web-ui/src/components/AppHeaderTools.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/AppHeaderTools.js
diff --git a/opendc-web/opendc-web-ui/src/components/AppHeaderUser.js b/opendc-web/opendc-web-server/src/main/webui/components/AppHeaderUser.js
index 3a73d9ba..3a73d9ba 100644
--- a/opendc-web/opendc-web-ui/src/components/AppHeaderUser.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/AppHeaderUser.js
diff --git a/opendc-web/opendc-web-ui/src/components/AppPage.js b/opendc-web/opendc-web-server/src/main/webui/components/AppPage.js
index 2893146e..2893146e 100644
--- a/opendc-web/opendc-web-ui/src/components/AppPage.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/AppPage.js
diff --git a/opendc-web/opendc-web-ui/src/components/context/ContextSelectionSection.js b/opendc-web/opendc-web-server/src/main/webui/components/context/ContextSelectionSection.js
index f3c25b79..f3c25b79 100644
--- a/opendc-web/opendc-web-ui/src/components/context/ContextSelectionSection.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/context/ContextSelectionSection.js
diff --git a/opendc-web/opendc-web-ui/src/components/context/ContextSelectionSection.module.css b/opendc-web/opendc-web-server/src/main/webui/components/context/ContextSelectionSection.module.css
index 0e902af0..0e902af0 100644
--- a/opendc-web/opendc-web-ui/src/components/context/ContextSelectionSection.module.css
+++ b/opendc-web/opendc-web-server/src/main/webui/components/context/ContextSelectionSection.module.css
diff --git a/opendc-web/opendc-web-ui/src/components/context/ContextSelector.js b/opendc-web/opendc-web-server/src/main/webui/components/context/ContextSelector.js
index d2601008..d2601008 100644
--- a/opendc-web/opendc-web-ui/src/components/context/ContextSelector.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/context/ContextSelector.js
diff --git a/opendc-web/opendc-web-ui/src/components/context/ContextSelector.module.css b/opendc-web/opendc-web-server/src/main/webui/components/context/ContextSelector.module.css
index 7662d00c..7662d00c 100644
--- a/opendc-web/opendc-web-ui/src/components/context/ContextSelector.module.css
+++ b/opendc-web/opendc-web-server/src/main/webui/components/context/ContextSelector.module.css
diff --git a/opendc-web/opendc-web-ui/src/components/context/PortfolioSelector.js b/opendc-web/opendc-web-server/src/main/webui/components/context/PortfolioSelector.js
index e401e6fc..e401e6fc 100644
--- a/opendc-web/opendc-web-ui/src/components/context/PortfolioSelector.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/context/PortfolioSelector.js
diff --git a/opendc-web/opendc-web-ui/src/components/context/ProjectSelector.js b/opendc-web/opendc-web-server/src/main/webui/components/context/ProjectSelector.js
index f2791b38..f2791b38 100644
--- a/opendc-web/opendc-web-ui/src/components/context/ProjectSelector.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/context/ProjectSelector.js
diff --git a/opendc-web/opendc-web-ui/src/components/context/TopologySelector.js b/opendc-web/opendc-web-server/src/main/webui/components/context/TopologySelector.js
index 355d9f4b..355d9f4b 100644
--- a/opendc-web/opendc-web-ui/src/components/context/TopologySelector.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/context/TopologySelector.js
diff --git a/opendc-web/opendc-web-ui/src/components/portfolios/NewScenario.js b/opendc-web/opendc-web-server/src/main/webui/components/portfolios/NewScenario.js
index fd9a72d2..fd9a72d2 100644
--- a/opendc-web/opendc-web-ui/src/components/portfolios/NewScenario.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/portfolios/NewScenario.js
diff --git a/opendc-web/opendc-web-ui/src/components/portfolios/NewScenarioModal.js b/opendc-web/opendc-web-server/src/main/webui/components/portfolios/NewScenarioModal.js
index ed35c163..ed35c163 100644
--- a/opendc-web/opendc-web-ui/src/components/portfolios/NewScenarioModal.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/portfolios/NewScenarioModal.js
diff --git a/opendc-web/opendc-web-ui/src/components/portfolios/PortfolioOverview.js b/opendc-web/opendc-web-server/src/main/webui/components/portfolios/PortfolioOverview.js
index e561b655..e561b655 100644
--- a/opendc-web/opendc-web-ui/src/components/portfolios/PortfolioOverview.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/portfolios/PortfolioOverview.js
diff --git a/opendc-web/opendc-web-ui/src/components/portfolios/PortfolioResultInfo.js b/opendc-web/opendc-web-server/src/main/webui/components/portfolios/PortfolioResultInfo.js
index dbfa928f..dbfa928f 100644
--- a/opendc-web/opendc-web-ui/src/components/portfolios/PortfolioResultInfo.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/portfolios/PortfolioResultInfo.js
diff --git a/opendc-web/opendc-web-ui/src/components/portfolios/PortfolioResults.js b/opendc-web/opendc-web-server/src/main/webui/components/portfolios/PortfolioResults.js
index 62150fa7..62150fa7 100644
--- a/opendc-web/opendc-web-ui/src/components/portfolios/PortfolioResults.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/portfolios/PortfolioResults.js
diff --git a/opendc-web/opendc-web-ui/src/components/portfolios/ScenarioState.js b/opendc-web/opendc-web-server/src/main/webui/components/portfolios/ScenarioState.js
index 99d83f64..99d83f64 100644
--- a/opendc-web/opendc-web-ui/src/components/portfolios/ScenarioState.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/portfolios/ScenarioState.js
diff --git a/opendc-web/opendc-web-ui/src/components/portfolios/ScenarioTable.js b/opendc-web/opendc-web-server/src/main/webui/components/portfolios/ScenarioTable.js
index b068d045..b068d045 100644
--- a/opendc-web/opendc-web-ui/src/components/portfolios/ScenarioTable.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/portfolios/ScenarioTable.js
diff --git a/opendc-web/opendc-web-ui/src/components/projects/FilterPanel.js b/opendc-web/opendc-web-server/src/main/webui/components/projects/FilterPanel.js
index 5aaa56ac..5aaa56ac 100644
--- a/opendc-web/opendc-web-ui/src/components/projects/FilterPanel.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/projects/FilterPanel.js
diff --git a/opendc-web/opendc-web-ui/src/components/projects/FilterPanel.module.css b/opendc-web/opendc-web-server/src/main/webui/components/projects/FilterPanel.module.css
index 15c36821..15c36821 100644
--- a/opendc-web/opendc-web-ui/src/components/projects/FilterPanel.module.css
+++ b/opendc-web/opendc-web-server/src/main/webui/components/projects/FilterPanel.module.css
diff --git a/opendc-web/opendc-web-ui/src/components/projects/NewPortfolio.js b/opendc-web/opendc-web-server/src/main/webui/components/projects/NewPortfolio.js
index aebcc3c9..aebcc3c9 100644
--- a/opendc-web/opendc-web-ui/src/components/projects/NewPortfolio.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/projects/NewPortfolio.js
diff --git a/opendc-web/opendc-web-ui/src/components/projects/NewPortfolioModal.js b/opendc-web/opendc-web-server/src/main/webui/components/projects/NewPortfolioModal.js
index ba4bc819..ba4bc819 100644
--- a/opendc-web/opendc-web-ui/src/components/projects/NewPortfolioModal.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/projects/NewPortfolioModal.js
diff --git a/opendc-web/opendc-web-ui/src/components/projects/NewTopology.js b/opendc-web/opendc-web-server/src/main/webui/components/projects/NewTopology.js
index 4c569c56..4c569c56 100644
--- a/opendc-web/opendc-web-ui/src/components/projects/NewTopology.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/projects/NewTopology.js
diff --git a/opendc-web/opendc-web-ui/src/components/projects/NewTopologyModal.js b/opendc-web/opendc-web-server/src/main/webui/components/projects/NewTopologyModal.js
index 780ec034..780ec034 100644
--- a/opendc-web/opendc-web-ui/src/components/projects/NewTopologyModal.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/projects/NewTopologyModal.js
diff --git a/opendc-web/opendc-web-ui/src/components/projects/PortfolioTable.js b/opendc-web/opendc-web-server/src/main/webui/components/projects/PortfolioTable.js
index 0afeaeaf..0afeaeaf 100644
--- a/opendc-web/opendc-web-ui/src/components/projects/PortfolioTable.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/projects/PortfolioTable.js
diff --git a/opendc-web/opendc-web-ui/src/components/projects/ProjectCollection.js b/opendc-web/opendc-web-server/src/main/webui/components/projects/ProjectCollection.js
index a26fed46..a26fed46 100644
--- a/opendc-web/opendc-web-ui/src/components/projects/ProjectCollection.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/projects/ProjectCollection.js
diff --git a/opendc-web/opendc-web-ui/src/components/projects/ProjectOverview.js b/opendc-web/opendc-web-server/src/main/webui/components/projects/ProjectOverview.js
index 3e1656f6..3e1656f6 100644
--- a/opendc-web/opendc-web-ui/src/components/projects/ProjectOverview.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/projects/ProjectOverview.js
diff --git a/opendc-web/opendc-web-ui/src/components/projects/TopologyTable.js b/opendc-web/opendc-web-server/src/main/webui/components/projects/TopologyTable.js
index 1c2c4f04..1c2c4f04 100644
--- a/opendc-web/opendc-web-ui/src/components/projects/TopologyTable.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/projects/TopologyTable.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/RoomTable.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/RoomTable.js
index 7f7b4171..7f7b4171 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/RoomTable.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/RoomTable.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/TopologyMap.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/TopologyMap.js
index ff583750..ff583750 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/TopologyMap.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/TopologyMap.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/TopologyOverview.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/TopologyOverview.js
index f8ee4990..f8ee4990 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/TopologyOverview.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/TopologyOverview.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/GrayContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/GrayContainer.js
index ccf637e5..ccf637e5 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/GrayContainer.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/GrayContainer.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/MapConstants.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/MapConstants.js
index 4c3b2757..4c3b2757 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/MapConstants.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/MapConstants.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/MapStage.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/MapStage.js
index e2b626ec..e2b626ec 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/MapStage.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/MapStage.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/MapStage.module.css b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/MapStage.module.css
index 47c3dde2..47c3dde2 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/MapStage.module.css
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/MapStage.module.css
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/RackContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/RackContainer.js
index 14449a91..14449a91 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/RackContainer.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/RackContainer.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/RackEnergyFillContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/RackEnergyFillContainer.js
index a1ca7426..a1ca7426 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/RackEnergyFillContainer.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/RackEnergyFillContainer.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/RackSpaceFillContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/RackSpaceFillContainer.js
index 2039a9d3..2039a9d3 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/RackSpaceFillContainer.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/RackSpaceFillContainer.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/RoomContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/RoomContainer.js
index 76785bea..76785bea 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/RoomContainer.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/RoomContainer.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/TileContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/TileContainer.js
index 0788b894..0788b894 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/TileContainer.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/TileContainer.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/TopologyContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/TopologyContainer.js
index cc0d46b3..cc0d46b3 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/TopologyContainer.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/TopologyContainer.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/WallContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/WallContainer.js
index 106d8d3d..106d8d3d 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/WallContainer.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/WallContainer.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/controls/Collapse.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/Collapse.js
index 931ded94..931ded94 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/controls/Collapse.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/Collapse.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/controls/Collapse.module.css b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/Collapse.module.css
index 70fd465f..70fd465f 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/controls/Collapse.module.css
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/Collapse.module.css
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/controls/ScaleIndicator.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/ScaleIndicator.js
index 3ec893fb..3ec893fb 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/controls/ScaleIndicator.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/ScaleIndicator.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/controls/ScaleIndicator.module.css b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/ScaleIndicator.module.css
index f19e0ff2..f19e0ff2 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/controls/ScaleIndicator.module.css
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/ScaleIndicator.module.css
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/controls/Toolbar.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/Toolbar.js
index 00aaf3e1..00aaf3e1 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/controls/Toolbar.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/Toolbar.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/controls/Toolbar.module.css b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/Toolbar.module.css
index 007389da..007389da 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/controls/Toolbar.module.css
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/Toolbar.module.css
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/Backdrop.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/Backdrop.js
index 93037b51..93037b51 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/Backdrop.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/Backdrop.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/GrayLayer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/GrayLayer.js
index 08c687f6..08c687f6 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/GrayLayer.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/GrayLayer.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/HoverTile.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/HoverTile.js
index 20c2c6d1..20c2c6d1 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/HoverTile.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/HoverTile.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/ImageComponent.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/ImageComponent.js
index fdae53f2..fdae53f2 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/ImageComponent.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/ImageComponent.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/RackFillBar.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/RackFillBar.js
index aa284944..aa284944 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/RackFillBar.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/RackFillBar.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/RoomTile.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/RoomTile.js
index e7329dc0..e7329dc0 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/RoomTile.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/RoomTile.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/TileObject.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/TileObject.js
index 3211f187..3211f187 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/TileObject.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/TileObject.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/TilePlusIcon.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/TilePlusIcon.js
index 186c2b3a..186c2b3a 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/TilePlusIcon.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/TilePlusIcon.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/WallSegment.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/WallSegment.js
index 4f18813e..4f18813e 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/WallSegment.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/WallSegment.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/groups/GridGroup.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/GridGroup.js
index d66a18de..d66a18de 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/groups/GridGroup.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/GridGroup.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/groups/RackGroup.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/RackGroup.js
index ed942661..ed942661 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/groups/RackGroup.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/RackGroup.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/groups/RoomGroup.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/RoomGroup.js
index 3f8b3089..3f8b3089 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/groups/RoomGroup.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/RoomGroup.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/groups/TileGroup.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/TileGroup.js
index f2084017..f2084017 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/groups/TileGroup.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/TileGroup.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/groups/TopologyGroup.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/TopologyGroup.js
index 011dcf34..011dcf34 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/groups/TopologyGroup.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/TopologyGroup.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/groups/WallGroup.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/WallGroup.js
index 6cbd1cd0..6cbd1cd0 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/groups/WallGroup.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/WallGroup.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/layers/HoverLayerComponent.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/layers/HoverLayerComponent.js
index d7e0c56a..d7e0c56a 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/layers/HoverLayerComponent.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/layers/HoverLayerComponent.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/layers/MapLayer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/layers/MapLayer.js
index c902532b..c902532b 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/layers/MapLayer.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/layers/MapLayer.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/layers/ObjectHoverLayer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/layers/ObjectHoverLayer.js
index 5e741a3b..5e741a3b 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/layers/ObjectHoverLayer.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/layers/ObjectHoverLayer.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/layers/RoomHoverLayer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/layers/RoomHoverLayer.js
index b9cfcaf4..b9cfcaf4 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/map/layers/RoomHoverLayer.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/layers/RoomHoverLayer.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/NameComponent.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/NameComponent.js
index ececd07b..ececd07b 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/NameComponent.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/NameComponent.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/TopologySidebar.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/TopologySidebar.js
index 5aaa7834..5aaa7834 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/TopologySidebar.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/TopologySidebar.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/TopologySidebar.module.css b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/TopologySidebar.module.css
index 3853c625..3853c625 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/TopologySidebar.module.css
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/TopologySidebar.module.css
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/building/BuildingSidebar.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/building/BuildingSidebar.js
index 5fcd46be..5fcd46be 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/building/BuildingSidebar.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/building/BuildingSidebar.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/building/NewRoomConstructionComponent.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/building/NewRoomConstructionComponent.js
index 9fc85d0c..9fc85d0c 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/building/NewRoomConstructionComponent.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/building/NewRoomConstructionComponent.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/building/NewRoomConstructionContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/building/NewRoomConstructionContainer.js
index c149b224..c149b224 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/building/NewRoomConstructionContainer.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/building/NewRoomConstructionContainer.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/DeleteMachine.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/DeleteMachine.js
index a4b9457b..a4b9457b 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/DeleteMachine.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/DeleteMachine.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/MachineSidebar.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/MachineSidebar.js
index 8a4c33dc..8a4c33dc 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/MachineSidebar.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/MachineSidebar.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitAddComponent.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitAddComponent.js
index 18cba23a..18cba23a 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitAddComponent.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitAddComponent.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitAddContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitAddContainer.js
index a0054ef6..a0054ef6 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitAddContainer.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitAddContainer.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitListComponent.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitListComponent.js
index 75ab0ad7..75ab0ad7 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitListComponent.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitListComponent.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitListContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitListContainer.js
index bcd4bdcc..bcd4bdcc 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitListContainer.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitListContainer.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitTabsComponent.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitTabsComponent.js
index 4032d607..4032d607 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitTabsComponent.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitTabsComponent.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitType.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitType.js
index b6d7bf8b..b6d7bf8b 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitType.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitType.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/AddPrefab.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/AddPrefab.js
index 6a0c3ff3..6a0c3ff3 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/AddPrefab.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/AddPrefab.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/DeleteRackContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/DeleteRackContainer.js
index 0583a7a4..0583a7a4 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/DeleteRackContainer.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/DeleteRackContainer.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/MachineComponent.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/MachineComponent.js
index b0a96a9f..b0a96a9f 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/MachineComponent.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/MachineComponent.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/MachineListComponent.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/MachineListComponent.js
index 02c97730..02c97730 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/MachineListComponent.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/MachineListComponent.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/MachineListContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/MachineListContainer.js
index e1914730..e1914730 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/MachineListContainer.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/MachineListContainer.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/RackNameContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/RackNameContainer.js
index c3422318..c3422318 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/RackNameContainer.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/RackNameContainer.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/RackSidebar.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/RackSidebar.js
index cb7d3b68..cb7d3b68 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/RackSidebar.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/RackSidebar.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/RackSidebar.module.css b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/RackSidebar.module.css
index f4c8829f..f4c8829f 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/RackSidebar.module.css
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/RackSidebar.module.css
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/DeleteRoomContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/DeleteRoomContainer.js
index 29b8f78a..29b8f78a 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/DeleteRoomContainer.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/DeleteRoomContainer.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/EditRoomContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/EditRoomContainer.js
index 7a278cd6..7a278cd6 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/EditRoomContainer.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/EditRoomContainer.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/RackConstructionComponent.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/RackConstructionComponent.js
index a384d5d5..a384d5d5 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/RackConstructionComponent.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/RackConstructionComponent.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/RackConstructionContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/RackConstructionContainer.js
index e04287a5..e04287a5 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/RackConstructionContainer.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/RackConstructionContainer.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/RoomName.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/RoomName.js
index 72d45bea..72d45bea 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/RoomName.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/RoomName.js
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/RoomSidebar.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/RoomSidebar.js
index 6ad489e0..6ad489e0 100644
--- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/RoomSidebar.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/RoomSidebar.js
diff --git a/opendc-web/opendc-web-ui/src/components/util/TableEmptyState.js b/opendc-web/opendc-web-server/src/main/webui/components/util/TableEmptyState.js
index 9d16ffbb..9d16ffbb 100644
--- a/opendc-web/opendc-web-ui/src/components/util/TableEmptyState.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/util/TableEmptyState.js
diff --git a/opendc-web/opendc-web-ui/src/components/util/modals/ConfirmationModal.js b/opendc-web/opendc-web-server/src/main/webui/components/util/modals/ConfirmationModal.js
index f6e1c98b..f6e1c98b 100644
--- a/opendc-web/opendc-web-ui/src/components/util/modals/ConfirmationModal.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/util/modals/ConfirmationModal.js
diff --git a/opendc-web/opendc-web-ui/src/components/util/modals/Modal.js b/opendc-web/opendc-web-server/src/main/webui/components/util/modals/Modal.js
index d4577062..d4577062 100644
--- a/opendc-web/opendc-web-ui/src/components/util/modals/Modal.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/util/modals/Modal.js
diff --git a/opendc-web/opendc-web-ui/src/components/util/modals/TextInputModal.js b/opendc-web/opendc-web-server/src/main/webui/components/util/modals/TextInputModal.js
index 392a729e..392a729e 100644
--- a/opendc-web/opendc-web-ui/src/components/util/modals/TextInputModal.js
+++ b/opendc-web/opendc-web-server/src/main/webui/components/util/modals/TextInputModal.js
diff --git a/opendc-web/opendc-web-ui/src/config.js b/opendc-web/opendc-web-server/src/main/webui/config.js
index 52952d69..1a0ba02c 100644
--- a/opendc-web/opendc-web-ui/src/config.js
+++ b/opendc-web/opendc-web-server/src/main/webui/config.js
@@ -20,22 +20,24 @@
* SOFTWARE.
*/
+import { env } from 'next-runtime-env';
+
/**
* URL to OpenDC API.
*/
-export const apiUrl = process.env.NEXT_PUBLIC_API_BASE_URL
+export const apiUrl = env("NEXT_PUBLIC_API_BASE_URL")
/**
* Authentication configuration.
*/
export const auth = {
- domain: process.env.NEXT_PUBLIC_AUTH0_DOMAIN,
- clientId: process.env.NEXT_PUBLIC_AUTH0_CLIENT_ID,
- audience: process.env.NEXT_PUBLIC_AUTH0_AUDIENCE,
+ domain: env("NEXT_PUBLIC_AUTH0_DOMAIN"),
+ clientId: env("NEXT_PUBLIC_AUTH0_CLIENT_ID"),
+ audience: env("NEXT_PUBLIC_AUTH0_AUDIENCE"),
redirectUri: global.window && global.window.location.origin,
}
/**
* Sentry DSN for web frontend.
*/
-export const sentryDsn = process.env.NEXT_PUBLIC_SENTRY_DSN
+export const sentryDsn = env("NEXT_PUBLIC_SENTRY_DSN")
diff --git a/opendc-web/opendc-web-ui/src/data/experiments.js b/opendc-web/opendc-web-server/src/main/webui/data/experiments.js
index ca8912a2..ca8912a2 100644
--- a/opendc-web/opendc-web-ui/src/data/experiments.js
+++ b/opendc-web/opendc-web-server/src/main/webui/data/experiments.js
diff --git a/opendc-web/opendc-web-ui/src/data/project.js b/opendc-web/opendc-web-server/src/main/webui/data/project.js
index 60a8fab6..60a8fab6 100644
--- a/opendc-web/opendc-web-ui/src/data/project.js
+++ b/opendc-web/opendc-web-server/src/main/webui/data/project.js
diff --git a/opendc-web/opendc-web-ui/src/data/query.js b/opendc-web/opendc-web-server/src/main/webui/data/query.js
index 3e5423b9..3e5423b9 100644
--- a/opendc-web/opendc-web-ui/src/data/query.js
+++ b/opendc-web/opendc-web-server/src/main/webui/data/query.js
diff --git a/opendc-web/opendc-web-ui/src/data/topology.js b/opendc-web/opendc-web-server/src/main/webui/data/topology.js
index d5e624d5..d5e624d5 100644
--- a/opendc-web/opendc-web-ui/src/data/topology.js
+++ b/opendc-web/opendc-web-server/src/main/webui/data/topology.js
diff --git a/opendc-web/opendc-web-ui/src/data/user.js b/opendc-web/opendc-web-server/src/main/webui/data/user.js
index 97c0e1e2..97c0e1e2 100644
--- a/opendc-web/opendc-web-ui/src/data/user.js
+++ b/opendc-web/opendc-web-server/src/main/webui/data/user.js
diff --git a/opendc-web/opendc-web-ui/next.config.js b/opendc-web/opendc-web-server/src/main/webui/next.config.js
index f761ba74..a11b4778 100644
--- a/opendc-web/opendc-web-ui/next.config.js
+++ b/opendc-web/opendc-web-server/src/main/webui/next.config.js
@@ -23,13 +23,16 @@
// PatternFly 4 uses global CSS imports in its distribution files. Therefore,
// we need to transpile the modules before we can use them.
const { withGlobalCss } = require('next-global-css')
-const { PHASE_DEVELOPMENT_SERVER } = require("next/constants");
const withConfig = withGlobalCss()
+// Generate dynamic env file
+const { configureRuntimeEnv } = require('next-runtime-env/build/configure');
+
+configureRuntimeEnv();
+
module.exports = (phase) => withConfig({
basePath: process.env.NEXT_BASE_PATH && '/' + process.env.NEXT_BASE_PATH,
reactStrictMode: true,
- distDir: phase === PHASE_DEVELOPMENT_SERVER ? 'build/next-dev' : 'build/next',
async redirects() {
return [
{
diff --git a/opendc-web/opendc-web-ui/package-lock.json b/opendc-web/opendc-web-server/src/main/webui/package-lock.json
index 5d78081e..71add29b 100644
--- a/opendc-web/opendc-web-ui/package-lock.json
+++ b/opendc-web/opendc-web-server/src/main/webui/package-lock.json
@@ -22,6 +22,7 @@
"mathjs": "^11.7.0",
"next": "^13.5.4",
"next-global-css": "^1.3.1",
+ "next-runtime-env": "^1.7.1",
"normalizr": "^3.6.2",
"prettier": "^2.8.7",
"prop-types": "^15.8.1",
@@ -932,7 +933,6 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -1175,7 +1175,6 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -1204,7 +1203,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -1215,8 +1213,7 @@
"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
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"node_modules/complex.js": {
"version": "2.1.1",
@@ -2391,7 +2388,6 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
"engines": {
"node": ">=8"
}
@@ -3105,6 +3101,24 @@
"resolved": "https://registry.npmjs.org/next-global-css/-/next-global-css-1.3.1.tgz",
"integrity": "sha512-+OnTwQKmv1lDP7r4R3T94oq6372R9UGVivchBQu49j7ZjzvSXHCnv93yAuhgMkvUgAbGifTs8sQ5YL9wjyAxfA=="
},
+ "node_modules/next-runtime-env": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/next-runtime-env/-/next-runtime-env-1.7.1.tgz",
+ "integrity": "sha512-KIWciYVcYBoc0dBTyx7tEogyESacAJCkseU9+AcIYbkq3MiV6WyhHHPfDONpXbJSlpT3u3utrSrngua2EFlfyA==",
+ "dependencies": {
+ "chalk": "^4.1.2"
+ }
+ },
+ "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==",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/normalizr": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/normalizr/-/normalizr-3.6.2.tgz",
@@ -3990,7 +4004,6 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -4661,5 +4674,3473 @@
"url": "https://github.com/sponsors/sindresorhus"
}
}
+ },
+ "dependencies": {
+ "@auth0/auth0-react": {
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/@auth0/auth0-react/-/auth0-react-1.12.1.tgz",
+ "integrity": "sha512-8+ecK/4rE0AGsxLW2IDcr1oPbT55tuE6cQEzEIOkQjB6QGQxxWMzQy0D4nMKw3JUAc7nYcFVOABNFNbc471n9Q==",
+ "requires": {
+ "@auth0/auth0-spa-js": "^1.22.6"
+ }
+ },
+ "@auth0/auth0-spa-js": {
+ "version": "1.22.6",
+ "resolved": "https://registry.npmjs.org/@auth0/auth0-spa-js/-/auth0-spa-js-1.22.6.tgz",
+ "integrity": "sha512-iL3O0vWanfKFVgy1J2ZHDPlAUK6EVHWEHWS6mUXwHEuPiK39tjlQtyUKQIJI1F5YsZB75ijGgRWMTawSDXlwCA==",
+ "requires": {
+ "abortcontroller-polyfill": "^1.7.3",
+ "browser-tabs-lock": "^1.2.15",
+ "core-js": "^3.25.4",
+ "es-cookie": "~1.3.2",
+ "fast-text-encoding": "^1.0.6",
+ "promise-polyfill": "^8.2.3",
+ "unfetch": "^4.2.0"
+ }
+ },
+ "@babel/runtime": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz",
+ "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==",
+ "requires": {
+ "regenerator-runtime": "^0.13.11"
+ }
+ },
+ "@babel/runtime-corejs3": {
+ "version": "7.19.6",
+ "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.6.tgz",
+ "integrity": "sha512-oWNn1ZlGde7b4i/3tnixpH9qI0bOAACiUs+KEES4UUCnsPjVWFlWdLV/iwJuPC2qp3EowbAqsm+0XqNwnwYhxA==",
+ "dev": true,
+ "requires": {
+ "core-js-pure": "^3.25.1",
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "@eslint-community/eslint-utils": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
+ "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^3.3.0"
+ }
+ },
+ "@eslint-community/regexpp": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.1.tgz",
+ "integrity": "sha512-BISJ6ZE4xQsuL/FmsyRaiffpq977bMlsKfGHTQrOGFErfByxIe6iZTxPf/00Zon9b9a7iUykfQwejN3s2ZW/Bw==",
+ "dev": true
+ },
+ "@eslint/eslintrc": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz",
+ "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.5.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ }
+ },
+ "@eslint/js": {
+ "version": "8.36.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz",
+ "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==",
+ "dev": true
+ },
+ "@humanwhocodes/config-array": {
+ "version": "0.11.8",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
+ "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==",
+ "dev": true,
+ "requires": {
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.5"
+ }
+ },
+ "@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true
+ },
+ "@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "dev": true
+ },
+ "@juggle/resize-observer": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz",
+ "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA=="
+ },
+ "@next/env": {
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-13.5.4.tgz",
+ "integrity": "sha512-LGegJkMvRNw90WWphGJ3RMHMVplYcOfRWf2Be3td3sUa+1AaxmsYyANsA+znrGCBjXJNi4XAQlSoEfUxs/4kIQ=="
+ },
+ "@next/eslint-plugin-next": {
+ "version": "13.2.4",
+ "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.2.4.tgz",
+ "integrity": "sha512-ck1lI+7r1mMJpqLNa3LJ5pxCfOB1lfJncKmRJeJxcJqcngaFwylreLP7da6Rrjr6u2gVRTfmnkSkjc80IiQCwQ==",
+ "dev": true,
+ "requires": {
+ "glob": "7.1.7"
+ }
+ },
+ "@next/swc-darwin-arm64": {
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.4.tgz",
+ "integrity": "sha512-Df8SHuXgF1p+aonBMcDPEsaahNo2TCwuie7VXED4FVyECvdXfRT9unapm54NssV9tF3OQFKBFOdlje4T43VO0w==",
+ "optional": true
+ },
+ "@next/swc-darwin-x64": {
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.4.tgz",
+ "integrity": "sha512-siPuUwO45PnNRMeZnSa8n/Lye5ZX93IJom9wQRB5DEOdFrw0JjOMu1GINB8jAEdwa7Vdyn1oJ2xGNaQpdQQ9Pw==",
+ "optional": true
+ },
+ "@next/swc-linux-arm64-gnu": {
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.4.tgz",
+ "integrity": "sha512-l/k/fvRP/zmB2jkFMfefmFkyZbDkYW0mRM/LB+tH5u9pB98WsHXC0WvDHlGCYp3CH/jlkJPL7gN8nkTQVrQ/2w==",
+ "optional": true
+ },
+ "@next/swc-linux-arm64-musl": {
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.4.tgz",
+ "integrity": "sha512-YYGb7SlLkI+XqfQa8VPErljb7k9nUnhhRrVaOdfJNCaQnHBcvbT7cx/UjDQLdleJcfyg1Hkn5YSSIeVfjgmkTg==",
+ "optional": true
+ },
+ "@next/swc-linux-x64-gnu": {
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.4.tgz",
+ "integrity": "sha512-uE61vyUSClnCH18YHjA8tE1prr/PBFlBFhxBZis4XBRJoR+txAky5d7gGNUIbQ8sZZ7LVkSVgm/5Fc7mwXmRAg==",
+ "optional": true
+ },
+ "@next/swc-linux-x64-musl": {
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.4.tgz",
+ "integrity": "sha512-qVEKFYML/GvJSy9CfYqAdUexA6M5AklYcQCW+8JECmkQHGoPxCf04iMh7CPR7wkHyWWK+XLt4Ja7hhsPJtSnhg==",
+ "optional": true
+ },
+ "@next/swc-win32-arm64-msvc": {
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.4.tgz",
+ "integrity": "sha512-mDSQfqxAlfpeZOLPxLymZkX0hYF3juN57W6vFHTvwKlnHfmh12Pt7hPIRLYIShk8uYRsKPtMTth/EzpwRI+u8w==",
+ "optional": true
+ },
+ "@next/swc-win32-ia32-msvc": {
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.4.tgz",
+ "integrity": "sha512-aoqAT2XIekIWoriwzOmGFAvTtVY5O7JjV21giozBTP5c6uZhpvTWRbmHXbmsjZqY4HnEZQRXWkSAppsIBweKqw==",
+ "optional": true
+ },
+ "@next/swc-win32-x64-msvc": {
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.4.tgz",
+ "integrity": "sha512-cyRvlAxwlddlqeB9xtPSfNSCRy8BOa4wtMo0IuI9P7Y0XT2qpDrpFKRyZ7kUngZis59mPVla5k8X1oOJ8RxDYg==",
+ "optional": true
+ },
+ "@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"
+ }
+ },
+ "@patternfly/react-charts": {
+ "version": "6.94.18",
+ "resolved": "https://registry.npmjs.org/@patternfly/react-charts/-/react-charts-6.94.18.tgz",
+ "integrity": "sha512-56WxnZYC3blRX41mW67JaPxJ3YhXViLvwGpEsZrYCccla/rTV8JgKK0gjHnqtzPQiVBfpn+3ewOyNCOR5uRoSw==",
+ "requires": {
+ "@patternfly/react-styles": "^4.92.6",
+ "@patternfly/react-tokens": "^4.94.6",
+ "hoist-non-react-statics": "^3.3.0",
+ "lodash": "^4.17.19",
+ "tslib": "^2.0.0",
+ "victory-area": "^36.6.7",
+ "victory-axis": "^36.6.7",
+ "victory-bar": "^36.6.7",
+ "victory-chart": "^36.6.7",
+ "victory-core": "^36.6.7",
+ "victory-create-container": "^36.6.7",
+ "victory-cursor-container": "^36.6.7",
+ "victory-group": "^36.6.7",
+ "victory-legend": "^36.6.7",
+ "victory-line": "^36.6.7",
+ "victory-pie": "^36.6.7",
+ "victory-scatter": "^36.6.7",
+ "victory-stack": "^36.6.7",
+ "victory-tooltip": "^36.6.7",
+ "victory-voronoi-container": "^36.6.7",
+ "victory-zoom-container": "^36.6.7"
+ }
+ },
+ "@patternfly/react-core": {
+ "version": "4.276.6",
+ "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-4.276.6.tgz",
+ "integrity": "sha512-G0K+378jf9jw9g+hCAoKnsAe/UGTRspqPeuAYypF2FgNr+dC7dUpc7/VkNhZBVqSJzUWVEK8NyXcqkfi0IemIg==",
+ "requires": {
+ "@patternfly/react-icons": "^4.93.6",
+ "@patternfly/react-styles": "^4.92.6",
+ "@patternfly/react-tokens": "^4.94.6",
+ "focus-trap": "6.9.2",
+ "react-dropzone": "9.0.0",
+ "tippy.js": "5.1.2",
+ "tslib": "^2.0.0"
+ }
+ },
+ "@patternfly/react-icons": {
+ "version": "4.93.6",
+ "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-4.93.6.tgz",
+ "integrity": "sha512-ZrXegc/81oiuTIeWvoHb3nG/eZODbB4rYmekBEsrbiysyO7m/sUFoi/RLvgFINrRoh6YCJqL5fj06Jg6d7jX1g==",
+ "requires": {}
+ },
+ "@patternfly/react-styles": {
+ "version": "4.92.6",
+ "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-4.92.6.tgz",
+ "integrity": "sha512-b8uQdEReMyeoMzjpMri845QxqtupY/tIFFYfVeKoB2neno8gkcW1RvDdDe62LF88q45OktCwAe/8A99ker10Iw=="
+ },
+ "@patternfly/react-table": {
+ "version": "4.112.39",
+ "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-4.112.39.tgz",
+ "integrity": "sha512-U+hOMgYlbghGH4M5MX+qt0GkVi/ocrGnxDnm11YiS3CtEGsd6Rr0NeqMmk0uoR46Od4Pr5tKuXxZhPP32sCL/w==",
+ "requires": {
+ "@patternfly/react-core": "^4.276.6",
+ "@patternfly/react-icons": "^4.93.6",
+ "@patternfly/react-styles": "^4.92.6",
+ "@patternfly/react-tokens": "^4.94.6",
+ "lodash": "^4.17.19",
+ "tslib": "^2.0.0"
+ }
+ },
+ "@patternfly/react-tokens": {
+ "version": "4.94.6",
+ "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-4.94.6.tgz",
+ "integrity": "sha512-tm7C6nat+uKMr1hrapis7hS3rN9cr41tpcCKhx6cod6FLU8KwF2Yt5KUxakhIOCEcE/M/EhXhAw/qejp8w0r7Q=="
+ },
+ "@pkgr/utils": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz",
+ "integrity": "sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.3",
+ "is-glob": "^4.0.3",
+ "open": "^8.4.0",
+ "picocolors": "^1.0.0",
+ "tiny-glob": "^0.2.9",
+ "tslib": "^2.4.0"
+ }
+ },
+ "@redux-saga/core": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@redux-saga/core/-/core-1.2.3.tgz",
+ "integrity": "sha512-U1JO6ncFBAklFTwoQ3mjAeQZ6QGutsJzwNBjgVLSWDpZTRhobUzuVDS1qH3SKGJD8fvqoaYOjp6XJ3gCmeZWgA==",
+ "requires": {
+ "@babel/runtime": "^7.6.3",
+ "@redux-saga/deferred": "^1.2.1",
+ "@redux-saga/delay-p": "^1.2.1",
+ "@redux-saga/is": "^1.1.3",
+ "@redux-saga/symbols": "^1.1.3",
+ "@redux-saga/types": "^1.2.1",
+ "redux": "^4.0.4",
+ "typescript-tuple": "^2.2.1"
+ }
+ },
+ "@redux-saga/deferred": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@redux-saga/deferred/-/deferred-1.2.1.tgz",
+ "integrity": "sha512-cmin3IuuzMdfQjA0lG4B+jX+9HdTgHZZ+6u3jRAOwGUxy77GSlTi4Qp2d6PM1PUoTmQUR5aijlA39scWWPF31g=="
+ },
+ "@redux-saga/delay-p": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@redux-saga/delay-p/-/delay-p-1.2.1.tgz",
+ "integrity": "sha512-MdiDxZdvb1m+Y0s4/hgdcAXntpUytr9g0hpcOO1XFVyyzkrDu3SKPgBFOtHn7lhu7n24ZKIAT1qtKyQjHqRd+w==",
+ "requires": {
+ "@redux-saga/symbols": "^1.1.3"
+ }
+ },
+ "@redux-saga/is": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@redux-saga/is/-/is-1.1.3.tgz",
+ "integrity": "sha512-naXrkETG1jLRfVfhOx/ZdLj0EyAzHYbgJWkXbB3qFliPcHKiWbv/ULQryOAEKyjrhiclmr6AMdgsXFyx7/yE6Q==",
+ "requires": {
+ "@redux-saga/symbols": "^1.1.3",
+ "@redux-saga/types": "^1.2.1"
+ }
+ },
+ "@redux-saga/symbols": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@redux-saga/symbols/-/symbols-1.1.3.tgz",
+ "integrity": "sha512-hCx6ZvU4QAEUojETnX8EVg4ubNLBFl1Lps4j2tX7o45x/2qg37m3c6v+kSp8xjDJY+2tJw4QB3j8o8dsl1FDXg=="
+ },
+ "@redux-saga/types": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@redux-saga/types/-/types-1.2.1.tgz",
+ "integrity": "sha512-1dgmkh+3so0+LlBWRhGA33ua4MYr7tUOj+a9Si28vUi0IUFNbff1T3sgpeDJI/LaC75bBYnQ0A3wXjn0OrRNBA=="
+ },
+ "@rushstack/eslint-patch": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz",
+ "integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==",
+ "dev": true
+ },
+ "@sentry-internal/tracing": {
+ "version": "7.45.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.45.0.tgz",
+ "integrity": "sha512-0aIDY2OvUX7k2XHaimOlWkboXoQvJ9dEKvfpu0Wh0YxfUTGPa+wplUdg3WVdkk018sq1L11MKmj4MPZyYUvXhw==",
+ "requires": {
+ "@sentry/core": "7.45.0",
+ "@sentry/types": "7.45.0",
+ "@sentry/utils": "7.45.0",
+ "tslib": "^1.9.3"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ }
+ }
+ },
+ "@sentry/browser": {
+ "version": "7.45.0",
+ "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.45.0.tgz",
+ "integrity": "sha512-/dUrUwnI34voMj+jSJT7b5Jun+xy1utVyzzwTq3Oc22N+SB17ZOX9svZ4jl1Lu6tVJPVjPyvL6zlcbrbMwqFjg==",
+ "requires": {
+ "@sentry-internal/tracing": "7.45.0",
+ "@sentry/core": "7.45.0",
+ "@sentry/replay": "7.45.0",
+ "@sentry/types": "7.45.0",
+ "@sentry/utils": "7.45.0",
+ "tslib": "^1.9.3"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ }
+ }
+ },
+ "@sentry/core": {
+ "version": "7.45.0",
+ "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.45.0.tgz",
+ "integrity": "sha512-xJfdTS4lRmHvZI/A5MazdnKhBJFkisKu6G9EGNLlZLre+6W4PH5sb7QX4+xoBdqG7v10Jvdia112vi762ojO2w==",
+ "requires": {
+ "@sentry/types": "7.45.0",
+ "@sentry/utils": "7.45.0",
+ "tslib": "^1.9.3"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ }
+ }
+ },
+ "@sentry/react": {
+ "version": "7.45.0",
+ "resolved": "https://registry.npmjs.org/@sentry/react/-/react-7.45.0.tgz",
+ "integrity": "sha512-Dbz85nfvMUikbLHUuIt6fBNPmTvThFn+rWB5KS1NIOJifyWAdpIU3X7yCUJE5xhsUObNLiHlNJlqhaQI4nR1bQ==",
+ "requires": {
+ "@sentry/browser": "7.45.0",
+ "@sentry/types": "7.45.0",
+ "@sentry/utils": "7.45.0",
+ "hoist-non-react-statics": "^3.3.2",
+ "tslib": "^1.9.3"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ }
+ }
+ },
+ "@sentry/replay": {
+ "version": "7.45.0",
+ "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.45.0.tgz",
+ "integrity": "sha512-smM7FIcFIyKu30BqCl8BzLo1gH/z9WwXdGX6V0fNvHab9fJZ09+xjFn+LmIyo6N8H8jjwsup0+yQ12kiF/ZsEw==",
+ "requires": {
+ "@sentry/core": "7.45.0",
+ "@sentry/types": "7.45.0",
+ "@sentry/utils": "7.45.0"
+ }
+ },
+ "@sentry/tracing": {
+ "version": "7.45.0",
+ "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.45.0.tgz",
+ "integrity": "sha512-FsoFmZPzTBGvWeJH73NxSF1ot61Zw3aIZo5XolengiKnRmcrQOFxebtMKBiZ61QBRYGqsm5uT7QB7zITU6Ikgg==",
+ "requires": {
+ "@sentry-internal/tracing": "7.45.0"
+ }
+ },
+ "@sentry/types": {
+ "version": "7.45.0",
+ "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.45.0.tgz",
+ "integrity": "sha512-iFt7msfUK8LCodFF3RKUyaxy9tJv/gpWhzxUFyNxtuVwlpmd+q6mtsFGn8Af3pbpm8A+MKyz1ebMwXj0PQqknw=="
+ },
+ "@sentry/utils": {
+ "version": "7.45.0",
+ "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.45.0.tgz",
+ "integrity": "sha512-aTY7qqtNUudd09SH5DVSKMm3iQ6ZeWufduc0I9bPZe6UMM09BDc4KmjmrzRkdQ+VaOmHo7+v+HZKQk5f+AbuTQ==",
+ "requires": {
+ "@sentry/types": "7.45.0",
+ "tslib": "^1.9.3"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ }
+ }
+ },
+ "@swc/helpers": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz",
+ "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==",
+ "requires": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "@types/d3-array": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.3.tgz",
+ "integrity": "sha512-Reoy+pKnvsksN0lQUlcH6dOGjRZ/3WRwXR//m+/8lt1BXeI4xyaUZoqULNjyXXRuh0Mj4LNpkCvhUpQlY3X5xQ=="
+ },
+ "@types/d3-color": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz",
+ "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA=="
+ },
+ "@types/d3-ease": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz",
+ "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA=="
+ },
+ "@types/d3-interpolate": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
+ "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==",
+ "requires": {
+ "@types/d3-color": "*"
+ }
+ },
+ "@types/d3-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz",
+ "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg=="
+ },
+ "@types/d3-scale": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.2.tgz",
+ "integrity": "sha512-Yk4htunhPAwN0XGlIwArRomOjdoBFXC3+kCxK2Ubg7I9shQlVSJy/pG/Ht5ASN+gdMIalpk8TJ5xV74jFsetLA==",
+ "requires": {
+ "@types/d3-time": "*"
+ }
+ },
+ "@types/d3-shape": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.0.tgz",
+ "integrity": "sha512-jYIYxFFA9vrJ8Hd4Se83YI6XF+gzDL1aC5DCsldai4XYYiVNdhtpGbA/GM6iyQ8ayhSp3a148LY34hy7A4TxZA==",
+ "requires": {
+ "@types/d3-path": "*"
+ }
+ },
+ "@types/d3-time": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz",
+ "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg=="
+ },
+ "@types/d3-timer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz",
+ "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g=="
+ },
+ "@types/hoist-non-react-statics": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz",
+ "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==",
+ "requires": {
+ "@types/react": "*",
+ "hoist-non-react-statics": "^3.3.0"
+ }
+ },
+ "@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
+ "dev": true
+ },
+ "@types/prop-types": {
+ "version": "15.7.5",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
+ "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w=="
+ },
+ "@types/react": {
+ "version": "18.0.23",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.23.tgz",
+ "integrity": "sha512-R1wTULtCiJkudAN2DJGoYYySbGtOdzZyUWAACYinKdiQC8auxso4kLDUhQ7AJ2kh3F6A6z4v69U6tNY39hihVQ==",
+ "requires": {
+ "@types/prop-types": "*",
+ "@types/scheduler": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "@types/react-reconciler": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.2.tgz",
+ "integrity": "sha512-8tu6lHzEgYPlfDf/J6GOQdIc+gs+S2yAqlby3zTsB3SP2svlqTYe5fwZNtZyfactP74ShooP2vvi1BOp9ZemWw==",
+ "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=="
+ },
+ "@types/use-sync-external-store": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz",
+ "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA=="
+ },
+ "@typescript-eslint/parser": {
+ "version": "5.42.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.42.1.tgz",
+ "integrity": "sha512-kAV+NiNBWVQDY9gDJDToTE/NO8BHi4f6b7zTsVAJoTkmB/zlfOpiEVBzHOKtlgTndCKe8vj9F/PuolemZSh50Q==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/scope-manager": "5.42.1",
+ "@typescript-eslint/types": "5.42.1",
+ "@typescript-eslint/typescript-estree": "5.42.1",
+ "debug": "^4.3.4"
+ }
+ },
+ "@typescript-eslint/scope-manager": {
+ "version": "5.42.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.42.1.tgz",
+ "integrity": "sha512-QAZY/CBP1Emx4rzxurgqj3rUinfsh/6mvuKbLNMfJMMKYLRBfweus8brgXF8f64ABkIZ3zdj2/rYYtF8eiuksQ==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.42.1",
+ "@typescript-eslint/visitor-keys": "5.42.1"
+ }
+ },
+ "@typescript-eslint/types": {
+ "version": "5.42.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.42.1.tgz",
+ "integrity": "sha512-Qrco9dsFF5lhalz+lLFtxs3ui1/YfC6NdXu+RAGBa8uSfn01cjO7ssCsjIsUs484vny9Xm699FSKwpkCcqwWwA==",
+ "dev": true
+ },
+ "@typescript-eslint/typescript-estree": {
+ "version": "5.42.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.42.1.tgz",
+ "integrity": "sha512-qElc0bDOuO0B8wDhhW4mYVgi/LZL+igPwXtV87n69/kYC/7NG3MES0jHxJNCr4EP7kY1XVsRy8C/u3DYeTKQmw==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.42.1",
+ "@typescript-eslint/visitor-keys": "5.42.1",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ }
+ },
+ "@typescript-eslint/visitor-keys": {
+ "version": "5.42.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.42.1.tgz",
+ "integrity": "sha512-LOQtSF4z+hejmpUvitPlc4hA7ERGoj2BVkesOcG91HCn8edLGUXbTrErmutmPbl8Bo9HjAvOO/zBKQHExXNA2A==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.42.1",
+ "eslint-visitor-keys": "^3.3.0"
+ }
+ },
+ "abortcontroller-polyfill": {
+ "version": "1.7.5",
+ "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz",
+ "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ=="
+ },
+ "acorn": {
+ "version": "8.8.2",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
+ "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
+ "dev": true
+ },
+ "acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "requires": {}
+ },
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "anymatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "aria-query": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz",
+ "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==",
+ "dev": true,
+ "requires": {
+ "@babel/runtime": "^7.10.2",
+ "@babel/runtime-corejs3": "^7.10.2"
+ }
+ },
+ "array-includes": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz",
+ "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "get-intrinsic": "^1.1.3",
+ "is-string": "^1.0.7"
+ }
+ },
+ "array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true
+ },
+ "array.prototype.flat": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz",
+ "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "es-shim-unscopables": "^1.0.0"
+ }
+ },
+ "array.prototype.flatmap": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz",
+ "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "es-shim-unscopables": "^1.0.0"
+ }
+ },
+ "ast-types-flow": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
+ "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==",
+ "dev": true
+ },
+ "attr-accept": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-1.1.3.tgz",
+ "integrity": "sha512-iT40nudw8zmCweivz6j58g+RT33I4KbaIvRUhjNmDwO2WmsQUxFEZZYZ5w3vXe5x5MX9D7mfvA/XaLOZYFR9EQ==",
+ "requires": {
+ "core-js": "^2.5.0"
+ },
+ "dependencies": {
+ "core-js": {
+ "version": "2.6.12",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
+ }
+ }
+ },
+ "axe-core": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.5.0.tgz",
+ "integrity": "sha512-4+rr8eQ7+XXS5nZrKcMO/AikHL0hVqy+lHWAnE3xdHl+aguag8SOQ6eEqLexwLNWgXIMfunGuD3ON1/6Kyet0A==",
+ "dev": true
+ },
+ "axobject-query": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
+ "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "big-integer": {
+ "version": "1.6.51",
+ "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz",
+ "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg=="
+ },
+ "binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "optional": true,
+ "peer": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "devOptional": true,
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "broadcast-channel": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz",
+ "integrity": "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==",
+ "requires": {
+ "@babel/runtime": "^7.7.2",
+ "detect-node": "^2.1.0",
+ "js-sha3": "0.8.0",
+ "microseconds": "0.2.0",
+ "nano-time": "1.0.0",
+ "oblivious-set": "1.0.0",
+ "rimraf": "3.0.2",
+ "unload": "2.2.0"
+ }
+ },
+ "browser-tabs-lock": {
+ "version": "1.2.15",
+ "resolved": "https://registry.npmjs.org/browser-tabs-lock/-/browser-tabs-lock-1.2.15.tgz",
+ "integrity": "sha512-J8K9vdivK0Di+b8SBdE7EZxDr88TnATing7XoLw6+nFkXMQ6sVBh92K3NQvZlZU91AIkFRi0w3sztk5Z+vsswA==",
+ "requires": {
+ "lodash": ">=4.17.21"
+ }
+ },
+ "busboy": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
+ "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
+ "requires": {
+ "streamsearch": "^1.1.0"
+ }
+ },
+ "call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ }
+ },
+ "callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true
+ },
+ "caniuse-lite": {
+ "version": "1.0.30001426",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001426.tgz",
+ "integrity": "sha512-n7cosrHLl8AWt0wwZw/PJZgUg3lV0gk9LMI7ikGJwhyhgsd2Nb65vKvmSexCqq/J7rbH3mFG6yZZiPR5dLPW5A=="
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "optional": true,
+ "peer": 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==",
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ }
+ }
+ },
+ "client-only": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
+ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="
+ },
+ "clsx": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz",
+ "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg=="
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "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=="
+ },
+ "complex.js": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.1.1.tgz",
+ "integrity": "sha512-8njCHOTtFFLtegk6zQo0kkVX1rngygb/KQI6z1qZxlFI3scluC+LVTCFbrkWjBv4vvLlbQ9t88IPMC6k95VTTg=="
+ },
+ "computed-styles": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/computed-styles/-/computed-styles-1.1.2.tgz",
+ "integrity": "sha512-CGbti1B791SKg6goVX0cSI++hFBSzY9+7+lhX8lqXDI5FHexluglI1cPtvIifS4mEcWxPJ+HKYPr2t6nqz7PxA=="
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ },
+ "core-js": {
+ "version": "3.29.1",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.29.1.tgz",
+ "integrity": "sha512-+jwgnhg6cQxKYIIjGtAHq2nwUOolo9eoFZ4sHfUH09BLXBgxnH4gA0zEd+t+BO2cNB8idaBtZFcFTRjQJRJmAw=="
+ },
+ "core-js-pure": {
+ "version": "3.26.0",
+ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.0.tgz",
+ "integrity": "sha512-LiN6fylpVBVwT8twhhluD9TzXmZQQsr2I2eIKtWNbZI1XMfBT7CV18itaN6RA7EtQd/SDdRx/wzvAShX2HvhQA==",
+ "dev": true
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "csstype": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz",
+ "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw=="
+ },
+ "d3-array": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.0.tgz",
+ "integrity": "sha512-3yXFQo0oG3QCxbF06rMPFyGRMGJNS7NvsV1+2joOjbBE+9xvWQ8+GcMJAjRCzw06zQ3/arXeJgbPYcjUCuC+3g==",
+ "requires": {
+ "internmap": "1 - 2"
+ }
+ },
+ "d3-color": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
+ "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="
+ },
+ "d3-ease": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
+ "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="
+ },
+ "d3-format": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz",
+ "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA=="
+ },
+ "d3-interpolate": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
+ "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
+ "requires": {
+ "d3-color": "1 - 3"
+ }
+ },
+ "d3-path": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz",
+ "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w=="
+ },
+ "d3-scale": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
+ "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
+ "requires": {
+ "d3-array": "2.10.0 - 3",
+ "d3-format": "1 - 3",
+ "d3-interpolate": "1.2.0 - 3",
+ "d3-time": "2.1.1 - 3",
+ "d3-time-format": "2 - 4"
+ }
+ },
+ "d3-shape": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.1.0.tgz",
+ "integrity": "sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ==",
+ "requires": {
+ "d3-path": "1 - 3"
+ }
+ },
+ "d3-time": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz",
+ "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==",
+ "requires": {
+ "d3-array": "2 - 3"
+ }
+ },
+ "d3-time-format": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
+ "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
+ "requires": {
+ "d3-time": "1 - 3"
+ }
+ },
+ "d3-timer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
+ "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="
+ },
+ "damerau-levenshtein": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
+ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
+ "dev": true
+ },
+ "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"
+ }
+ },
+ "decimal.js": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
+ "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA=="
+ },
+ "deep-diff": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.8.tgz",
+ "integrity": "sha512-yVn6RZmHiGnxRKR9sJb3iVV2XTF1Ghh2DiWRZ3dMnGc43yUdWWF/kX6lQyk3+P84iprfWKU/8zFTrlkvtFm1ug=="
+ },
+ "deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "define-lazy-prop": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
+ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
+ "dev": true
+ },
+ "define-properties": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz",
+ "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
+ "dev": true,
+ "requires": {
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ }
+ },
+ "delaunator": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-4.0.1.tgz",
+ "integrity": "sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag=="
+ },
+ "delaunay-find": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/delaunay-find/-/delaunay-find-0.0.6.tgz",
+ "integrity": "sha512-1+almjfrnR7ZamBk0q3Nhg6lqSe6Le4vL0WJDSMx4IDbQwTpUTXPjxC00lqLBT8MYsJpPCbI16sIkw9cPsbi7Q==",
+ "requires": {
+ "delaunator": "^4.0.0"
+ }
+ },
+ "detect-node": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
+ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="
+ },
+ "dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "requires": {
+ "path-type": "^4.0.0"
+ }
+ },
+ "doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true
+ },
+ "enhanced-resolve": {
+ "version": "5.12.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz",
+ "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ }
+ },
+ "es-abstract": {
+ "version": "1.20.4",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz",
+ "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "function.prototype.name": "^1.1.5",
+ "get-intrinsic": "^1.1.3",
+ "get-symbol-description": "^1.0.0",
+ "has": "^1.0.3",
+ "has-property-descriptors": "^1.0.0",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.3",
+ "is-callable": "^1.2.7",
+ "is-negative-zero": "^2.0.2",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.2",
+ "is-string": "^1.0.7",
+ "is-weakref": "^1.0.2",
+ "object-inspect": "^1.12.2",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.4",
+ "regexp.prototype.flags": "^1.4.3",
+ "safe-regex-test": "^1.0.0",
+ "string.prototype.trimend": "^1.0.5",
+ "string.prototype.trimstart": "^1.0.5",
+ "unbox-primitive": "^1.0.2"
+ }
+ },
+ "es-cookie": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/es-cookie/-/es-cookie-1.3.2.tgz",
+ "integrity": "sha512-UTlYYhXGLOy05P/vKVT2Ui7WtC7NiRzGtJyAKKn32g5Gvcjn7KAClLPWlipCtxIus934dFg9o9jXiBL0nP+t9Q=="
+ },
+ "es-shim-unscopables": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
+ "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "escape-latex": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz",
+ "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw=="
+ },
+ "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==",
+ "dev": true
+ },
+ "eslint": {
+ "version": "8.36.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz",
+ "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==",
+ "dev": true,
+ "requires": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.4.0",
+ "@eslint/eslintrc": "^2.0.1",
+ "@eslint/js": "8.36.0",
+ "@humanwhocodes/config-array": "^0.11.8",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.1.1",
+ "eslint-visitor-keys": "^3.3.0",
+ "espree": "^9.5.0",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "grapheme-splitter": "^1.0.4",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-sdsl": "^4.1.4",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "strip-ansi": "^6.0.1",
+ "strip-json-comments": "^3.1.0",
+ "text-table": "^0.2.0"
+ }
+ },
+ "eslint-config-next": {
+ "version": "13.2.4",
+ "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.2.4.tgz",
+ "integrity": "sha512-lunIBhsoeqw6/Lfkd6zPt25w1bn0znLA/JCL+au1HoEpSb4/PpsOYsYtgV/q+YPsoKIOzFyU5xnb04iZnXjUvg==",
+ "dev": true,
+ "requires": {
+ "@next/eslint-plugin-next": "13.2.4",
+ "@rushstack/eslint-patch": "^1.1.3",
+ "@typescript-eslint/parser": "^5.42.0",
+ "eslint-import-resolver-node": "^0.3.6",
+ "eslint-import-resolver-typescript": "^3.5.2",
+ "eslint-plugin-import": "^2.26.0",
+ "eslint-plugin-jsx-a11y": "^6.5.1",
+ "eslint-plugin-react": "^7.31.7",
+ "eslint-plugin-react-hooks": "^4.5.0"
+ }
+ },
+ "eslint-import-resolver-node": {
+ "version": "0.3.7",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz",
+ "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==",
+ "dev": true,
+ "requires": {
+ "debug": "^3.2.7",
+ "is-core-module": "^2.11.0",
+ "resolve": "^1.22.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ }
+ }
+ },
+ "eslint-import-resolver-typescript": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.3.tgz",
+ "integrity": "sha512-njRcKYBc3isE42LaTcJNVANR3R99H9bAxBDMNDr2W7yq5gYPxbU3MkdhsQukxZ/Xg9C2vcyLlDsbKfRDg0QvCQ==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.3.4",
+ "enhanced-resolve": "^5.10.0",
+ "get-tsconfig": "^4.2.0",
+ "globby": "^13.1.2",
+ "is-core-module": "^2.10.0",
+ "is-glob": "^4.0.3",
+ "synckit": "^0.8.4"
+ },
+ "dependencies": {
+ "globby": {
+ "version": "13.1.3",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz",
+ "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==",
+ "dev": true,
+ "requires": {
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.11",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^4.0.0"
+ }
+ },
+ "slash": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
+ "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-module-utils": {
+ "version": "2.7.4",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz",
+ "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==",
+ "dev": true,
+ "requires": {
+ "debug": "^3.2.7"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ }
+ }
+ },
+ "eslint-plugin-import": {
+ "version": "2.27.5",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz",
+ "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==",
+ "dev": true,
+ "requires": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "array.prototype.flatmap": "^1.3.1",
+ "debug": "^3.2.7",
+ "doctrine": "^2.1.0",
+ "eslint-import-resolver-node": "^0.3.7",
+ "eslint-module-utils": "^2.7.4",
+ "has": "^1.0.3",
+ "is-core-module": "^2.11.0",
+ "is-glob": "^4.0.3",
+ "minimatch": "^3.1.2",
+ "object.values": "^1.1.6",
+ "resolve": "^1.22.1",
+ "semver": "^6.3.0",
+ "tsconfig-paths": "^3.14.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-plugin-jsx-a11y": {
+ "version": "6.6.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz",
+ "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==",
+ "dev": true,
+ "requires": {
+ "@babel/runtime": "^7.18.9",
+ "aria-query": "^4.2.2",
+ "array-includes": "^3.1.5",
+ "ast-types-flow": "^0.0.7",
+ "axe-core": "^4.4.3",
+ "axobject-query": "^2.2.0",
+ "damerau-levenshtein": "^1.0.8",
+ "emoji-regex": "^9.2.2",
+ "has": "^1.0.3",
+ "jsx-ast-utils": "^3.3.2",
+ "language-tags": "^1.0.5",
+ "minimatch": "^3.1.2",
+ "semver": "^6.3.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-plugin-react": {
+ "version": "7.31.10",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.10.tgz",
+ "integrity": "sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==",
+ "dev": true,
+ "requires": {
+ "array-includes": "^3.1.5",
+ "array.prototype.flatmap": "^1.3.0",
+ "doctrine": "^2.1.0",
+ "estraverse": "^5.3.0",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.5",
+ "object.fromentries": "^2.0.5",
+ "object.hasown": "^1.1.1",
+ "object.values": "^1.1.5",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.3",
+ "semver": "^6.3.0",
+ "string.prototype.matchall": "^4.0.7"
+ },
+ "dependencies": {
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "resolve": {
+ "version": "2.0.0-next.4",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz",
+ "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==",
+ "dev": true,
+ "requires": {
+ "is-core-module": "^2.9.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ }
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-plugin-react-hooks": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz",
+ "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==",
+ "dev": true,
+ "requires": {}
+ },
+ "eslint-scope": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+ "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+ "dev": true
+ },
+ "espree": {
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz",
+ "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.8.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.3.0"
+ }
+ },
+ "esquery": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
+ "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.1.0"
+ }
+ },
+ "esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.2.0"
+ }
+ },
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true
+ },
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true
+ },
+ "fast-text-encoding": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz",
+ "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w=="
+ },
+ "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"
+ }
+ },
+ "file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "requires": {
+ "flat-cache": "^3.0.4"
+ }
+ },
+ "file-saver": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-1.3.8.tgz",
+ "integrity": "sha512-spKHSBQIxxS81N/O21WmuXA2F6wppUCsutpzenOeZzOCCJ5gEfcbqJP983IrpLXzYmXnMUa6J03SubcNPdKrlg=="
+ },
+ "file-selector": {
+ "version": "0.1.19",
+ "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.1.19.tgz",
+ "integrity": "sha512-kCWw3+Aai8Uox+5tHCNgMFaUdgidxvMnLWO6fM5sZ0hA2wlHP5/DHGF0ECe84BiB95qdJbKNEJhWKVDvMN+JDQ==",
+ "requires": {
+ "tslib": "^2.0.1"
+ }
+ },
+ "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==",
+ "devOptional": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "requires": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ }
+ },
+ "flatted": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
+ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
+ "dev": true
+ },
+ "focus-trap": {
+ "version": "6.9.2",
+ "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-6.9.2.tgz",
+ "integrity": "sha512-gBEuXOPNOKPrLdZpMFUSTyIo1eT2NSZRrwZ9r/0Jqw5tmT3Yvxfmu8KBHw8xW2XQkw6E/JoG+OlEq7UDtSUNgw==",
+ "requires": {
+ "tabbable": "^5.3.2"
+ }
+ },
+ "fraction.js": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
+ "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA=="
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+ },
+ "fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "optional": true,
+ "peer": true
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "function.prototype.name": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
+ "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.19.0",
+ "functions-have-names": "^1.2.2"
+ }
+ },
+ "functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "dev": true
+ },
+ "get-intrinsic": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
+ "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.3"
+ }
+ },
+ "get-symbol-description": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
+ "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.1"
+ }
+ },
+ "get-tsconfig": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.4.0.tgz",
+ "integrity": "sha512-0Gdjo/9+FzsYhXCEFueo2aY1z1tpXrxWZzP7k8ul9qt1U5o8rYJwTJYmaeHdrVosYIVYkOy2iwCJ9FdpocJhPQ==",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.7",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+ "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "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"
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
+ },
+ "globals": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.20.2"
+ }
+ },
+ "globalyzer": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz",
+ "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==",
+ "dev": true
+ },
+ "globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "requires": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ }
+ },
+ "globrex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
+ "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
+ },
+ "grapheme-splitter": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
+ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
+ "dev": true
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-bigints": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
+ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "has-property-descriptors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
+ "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
+ "dev": true,
+ "requires": {
+ "get-intrinsic": "^1.1.1"
+ }
+ },
+ "has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "dev": true
+ },
+ "has-tostringtag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
+ "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.2"
+ }
+ },
+ "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"
+ }
+ },
+ "ignore": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+ "dev": true
+ },
+ "immer": {
+ "version": "9.0.21",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz",
+ "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA=="
+ },
+ "immutable": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz",
+ "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==",
+ "optional": true,
+ "peer": true
+ },
+ "import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "requires": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ }
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "internal-slot": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
+ "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
+ "dev": true,
+ "requires": {
+ "get-intrinsic": "^1.1.0",
+ "has": "^1.0.3",
+ "side-channel": "^1.0.4"
+ }
+ },
+ "internmap": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
+ "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="
+ },
+ "is-bigint": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "dev": true,
+ "requires": {
+ "has-bigints": "^1.0.1"
+ }
+ },
+ "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==",
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "binary-extensions": "^2.0.0"
+ }
+ },
+ "is-boolean-object": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "dev": true
+ },
+ "is-core-module": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
+ "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "is-date-object": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
+ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+ "dev": true,
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "devOptional": true
+ },
+ "is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "devOptional": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-negative-zero": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
+ "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
+ "dev": true
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "devOptional": true
+ },
+ "is-number-object": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
+ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "dev": true,
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true
+ },
+ "is-regex": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-shared-array-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
+ "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2"
+ }
+ },
+ "is-string": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "dev": true,
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-symbol": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.2"
+ }
+ },
+ "is-weakref": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2"
+ }
+ },
+ "is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "dev": true,
+ "requires": {
+ "is-docker": "^2.0.0"
+ }
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "its-fine": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.0.6.tgz",
+ "integrity": "sha512-VZJZPwVT2kxe5KQv+TxCjojfLiUIut8zXDNLTxcM7gJ/xQ/bSPk5M0neZ+j3myy45KKkltY1mm1jyJgx3Fxsdg==",
+ "requires": {
+ "@types/react-reconciler": "^0.28.0"
+ }
+ },
+ "javascript-natural-sort": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz",
+ "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw=="
+ },
+ "js-sdsl": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz",
+ "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==",
+ "dev": true
+ },
+ "js-sha3": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz",
+ "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q=="
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ },
+ "js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "requires": {
+ "argparse": "^2.0.1"
+ }
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="
+ },
+ "json5": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "jsx-ast-utils": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz",
+ "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==",
+ "dev": true,
+ "requires": {
+ "array-includes": "^3.1.5",
+ "object.assign": "^4.1.3"
+ }
+ },
+ "konva": {
+ "version": "8.4.3",
+ "resolved": "https://registry.npmjs.org/konva/-/konva-8.4.3.tgz",
+ "integrity": "sha512-ARqdgAbdNIougRlOKvkQwHlGhXPRBV4KvhCP+qoPpGoVQwwiJe4Hkdu4HHdRPb9rGUp04jDTAxBzEwBsE272pg=="
+ },
+ "language-subtag-registry": {
+ "version": "0.3.22",
+ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz",
+ "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==",
+ "dev": true
+ },
+ "language-tags": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz",
+ "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==",
+ "dev": true,
+ "requires": {
+ "language-subtag-registry": "~0.3.2"
+ }
+ },
+ "levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ }
+ },
+ "locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^5.0.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "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"
+ }
+ },
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "match-sorter": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.1.tgz",
+ "integrity": "sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==",
+ "requires": {
+ "@babel/runtime": "^7.12.5",
+ "remove-accents": "0.4.2"
+ }
+ },
+ "mathjs": {
+ "version": "11.7.0",
+ "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-11.7.0.tgz",
+ "integrity": "sha512-RCXtrP5xGIbl9PUc5+7QL81rBCUjzoIZ0ugNqKsarOUxg+x7deY0BzfNai+bGfUL/T+1uYq1xs5w2xVdL3lp0g==",
+ "requires": {
+ "@babel/runtime": "^7.21.0",
+ "complex.js": "^2.1.1",
+ "decimal.js": "^10.4.3",
+ "escape-latex": "^1.2.0",
+ "fraction.js": "^4.2.0",
+ "javascript-natural-sort": "^0.7.1",
+ "seedrandom": "^3.0.5",
+ "tiny-emitter": "^2.1.0",
+ "typed-function": "^4.1.0"
+ }
+ },
+ "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"
+ }
+ },
+ "microseconds": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz",
+ "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA=="
+ },
+ "minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": 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
+ },
+ "nano-time": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz",
+ "integrity": "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==",
+ "requires": {
+ "big-integer": "^1.6.16"
+ }
+ },
+ "nanoid": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
+ "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA=="
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "next": {
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/next/-/next-13.5.4.tgz",
+ "integrity": "sha512-+93un5S779gho8y9ASQhb/bTkQF17FNQOtXLKAj3lsNgltEcF0C5PMLLncDmH+8X1EnJH1kbqAERa29nRXqhjA==",
+ "requires": {
+ "@next/env": "13.5.4",
+ "@next/swc-darwin-arm64": "13.5.4",
+ "@next/swc-darwin-x64": "13.5.4",
+ "@next/swc-linux-arm64-gnu": "13.5.4",
+ "@next/swc-linux-arm64-musl": "13.5.4",
+ "@next/swc-linux-x64-gnu": "13.5.4",
+ "@next/swc-linux-x64-musl": "13.5.4",
+ "@next/swc-win32-arm64-msvc": "13.5.4",
+ "@next/swc-win32-ia32-msvc": "13.5.4",
+ "@next/swc-win32-x64-msvc": "13.5.4",
+ "@swc/helpers": "0.5.2",
+ "busboy": "1.6.0",
+ "caniuse-lite": "^1.0.30001406",
+ "postcss": "8.4.31",
+ "styled-jsx": "5.1.1",
+ "watchpack": "2.4.0"
+ }
+ },
+ "next-global-css": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/next-global-css/-/next-global-css-1.3.1.tgz",
+ "integrity": "sha512-+OnTwQKmv1lDP7r4R3T94oq6372R9UGVivchBQu49j7ZjzvSXHCnv93yAuhgMkvUgAbGifTs8sQ5YL9wjyAxfA=="
+ },
+ "next-runtime-env": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/next-runtime-env/-/next-runtime-env-1.7.1.tgz",
+ "integrity": "sha512-KIWciYVcYBoc0dBTyx7tEogyESacAJCkseU9+AcIYbkq3MiV6WyhHHPfDONpXbJSlpT3u3utrSrngua2EFlfyA==",
+ "requires": {
+ "chalk": "^4.1.2"
+ }
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "optional": true,
+ "peer": true
+ },
+ "normalizr": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/normalizr/-/normalizr-3.6.2.tgz",
+ "integrity": "sha512-30qCybsBaCBciotorvuOZTCGEg2AXrJfADMT2Kk/lvpIAcipHdK0zc33nNtwKzyfQAqIJXAcqET6YgflYUgsoQ=="
+ },
+ "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-inspect": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
+ "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
+ "dev": true
+ },
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true
+ },
+ "object.assign": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
+ "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "has-symbols": "^1.0.3",
+ "object-keys": "^1.1.1"
+ }
+ },
+ "object.entries": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz",
+ "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.19.1"
+ }
+ },
+ "object.fromentries": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz",
+ "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.19.1"
+ }
+ },
+ "object.hasown": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz",
+ "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.19.5"
+ }
+ },
+ "object.values": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz",
+ "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ }
+ },
+ "oblivious-set": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz",
+ "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw=="
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "open": {
+ "version": "8.4.2",
+ "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
+ "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
+ "dev": true,
+ "requires": {
+ "define-lazy-prop": "^2.0.0",
+ "is-docker": "^2.1.1",
+ "is-wsl": "^2.2.0"
+ }
+ },
+ "optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "requires": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ }
+ },
+ "p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "requires": {
+ "yocto-queue": "^0.1.0"
+ }
+ },
+ "p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^3.0.2"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "callsites": "^3.0.0"
+ }
+ },
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
+ "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==",
+ "dev": true
+ },
+ "path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true
+ },
+ "picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+ },
+ "picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "devOptional": true
+ },
+ "popper.js": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz",
+ "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ=="
+ },
+ "postcss": {
+ "version": "8.4.31",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
+ "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
+ "requires": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ }
+ },
+ "prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true
+ },
+ "prettier": {
+ "version": "2.8.7",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz",
+ "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw=="
+ },
+ "promise-polyfill": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.3.0.tgz",
+ "integrity": "sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg=="
+ },
+ "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"
+ }
+ },
+ "prop-types-extra": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz",
+ "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==",
+ "requires": {
+ "react-is": "^16.3.2",
+ "warning": "^4.0.0"
+ }
+ },
+ "punycode": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+ "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+ "dev": true
+ },
+ "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
+ },
+ "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-dropzone": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-9.0.0.tgz",
+ "integrity": "sha512-wZ2o9B2qkdE3RumWhfyZT9swgJYJPeU5qHEcMU8weYpmLex1eeWX0CC32/Y0VutB+BBi2D+iePV/YZIiB4kZGw==",
+ "requires": {
+ "attr-accept": "^1.1.3",
+ "file-selector": "^0.1.8",
+ "prop-types": "^15.6.2",
+ "prop-types-extra": "^1.1.0"
+ }
+ },
+ "react-fast-compare": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz",
+ "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA=="
+ },
+ "react-hotkeys-hook": {
+ "version": "4.3.8",
+ "resolved": "https://registry.npmjs.org/react-hotkeys-hook/-/react-hotkeys-hook-4.3.8.tgz",
+ "integrity": "sha512-RmrIQ3M259c84MnYVEAQsmHkD6s7XUgLG0rW6S7qjt1Lh7q+SPIz5b6obVU8OJw1Utsj1mUCj6twtBPaK/ytww==",
+ "requires": {}
+ },
+ "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=="
+ },
+ "react-konva": {
+ "version": "18.2.5",
+ "resolved": "https://registry.npmjs.org/react-konva/-/react-konva-18.2.5.tgz",
+ "integrity": "sha512-lTqJStcHnpGSXB9RlV7p5at3MpRML/TujzbuUDZRIInsLocJ/I4Nhhg3w6yJm9UV05kcwr88OY6LO+2zRyzXog==",
+ "requires": {
+ "@types/react-reconciler": "^0.28.2",
+ "its-fine": "^1.0.6",
+ "react-reconciler": "~0.29.0",
+ "scheduler": "^0.23.0"
+ }
+ },
+ "react-query": {
+ "version": "3.39.3",
+ "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz",
+ "integrity": "sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==",
+ "requires": {
+ "@babel/runtime": "^7.5.5",
+ "broadcast-channel": "^3.4.1",
+ "match-sorter": "^6.0.2"
+ }
+ },
+ "react-reconciler": {
+ "version": "0.29.0",
+ "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.29.0.tgz",
+ "integrity": "sha512-wa0fGj7Zht1EYMRhKWwoo1H9GApxYLBuhoAuXN0TlltESAjDssB+Apf0T/DngVqaMyPypDmabL37vw/2aRM98Q==",
+ "requires": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.0"
+ }
+ },
+ "react-redux": {
+ "version": "8.0.5",
+ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.0.5.tgz",
+ "integrity": "sha512-Q2f6fCKxPFpkXt1qNRZdEDLlScsDWyrgSj0mliK59qU6W5gvBiKkdMEG2lJzhd1rCctf0hb6EtePPLZ2e0m1uw==",
+ "requires": {
+ "@babel/runtime": "^7.12.1",
+ "@types/hoist-non-react-statics": "^3.3.1",
+ "@types/use-sync-external-store": "^0.0.3",
+ "hoist-non-react-statics": "^3.3.2",
+ "react-is": "^18.0.0",
+ "use-sync-external-store": "^1.0.0"
+ },
+ "dependencies": {
+ "react-is": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
+ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
+ }
+ }
+ },
+ "readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
+ "redux": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz",
+ "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==",
+ "requires": {
+ "@babel/runtime": "^7.9.2"
+ }
+ },
+ "redux-logger": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/redux-logger/-/redux-logger-3.0.6.tgz",
+ "integrity": "sha512-JoCIok7bg/XpqA1JqCqXFypuqBbQzGQySrhFzewB7ThcnysTO30l4VCst86AuB9T9tuT03MAA56Jw2PNhRSNCg==",
+ "requires": {
+ "deep-diff": "^0.3.5"
+ }
+ },
+ "redux-saga": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/redux-saga/-/redux-saga-1.2.3.tgz",
+ "integrity": "sha512-HDe0wTR5nhd8Xr5xjGzoyTbdAw6rjy1GDplFt3JKtKN8/MnkQSRqK/n6aQQhpw5NI4ekDVOaW+w4sdxPBaCoTQ==",
+ "requires": {
+ "@redux-saga/core": "^1.2.3"
+ }
+ },
+ "redux-thunk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz",
+ "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==",
+ "requires": {}
+ },
+ "regenerator-runtime": {
+ "version": "0.13.11",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
+ },
+ "regexp.prototype.flags": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
+ "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3",
+ "functions-have-names": "^1.2.2"
+ }
+ },
+ "remove-accents": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz",
+ "integrity": "sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA=="
+ },
+ "resolve": {
+ "version": "1.22.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+ "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+ "dev": true,
+ "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==",
+ "dev": true
+ },
+ "reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "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-regex-test": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
+ "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.3",
+ "is-regex": "^1.1.4"
+ }
+ },
+ "sass": {
+ "version": "1.55.0",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.55.0.tgz",
+ "integrity": "sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A==",
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "chokidar": ">=3.0.0 <4.0.0",
+ "immutable": "^4.0.0",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ }
+ },
+ "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"
+ }
+ },
+ "seedrandom": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz",
+ "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg=="
+ },
+ "semver": {
+ "version": "7.3.8",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ },
+ "side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ }
+ },
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true
+ },
+ "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=="
+ },
+ "streamsearch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
+ "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg=="
+ },
+ "string.prototype.matchall": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz",
+ "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.19.1",
+ "get-intrinsic": "^1.1.1",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.3",
+ "regexp.prototype.flags": "^1.4.1",
+ "side-channel": "^1.0.4"
+ }
+ },
+ "string.prototype.trimend": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz",
+ "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.19.5"
+ }
+ },
+ "string.prototype.trimstart": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz",
+ "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.19.5"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.1"
+ }
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true
+ },
+ "strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true
+ },
+ "styled-jsx": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz",
+ "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==",
+ "requires": {
+ "client-only": "0.0.1"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.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==",
+ "dev": true
+ },
+ "svgsaver": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/svgsaver/-/svgsaver-0.9.0.tgz",
+ "integrity": "sha512-m94bg62CjuKyhcyJV50ljIPDo5FxEwmdOn60IvHEPlGKhC8gNMnyxbjlYmGi9QW9rIi93DjvfjBuafFfn3+m0w==",
+ "requires": {
+ "computed-styles": "^1.1.2",
+ "file-saver": "^1.3.3"
+ }
+ },
+ "synckit": {
+ "version": "0.8.5",
+ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz",
+ "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==",
+ "dev": true,
+ "requires": {
+ "@pkgr/utils": "^2.3.1",
+ "tslib": "^2.5.0"
+ }
+ },
+ "tabbable": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-5.3.3.tgz",
+ "integrity": "sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA=="
+ },
+ "tapable": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+ "dev": true
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true
+ },
+ "tiny-emitter": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
+ "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
+ },
+ "tiny-glob": {
+ "version": "0.2.9",
+ "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz",
+ "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==",
+ "dev": true,
+ "requires": {
+ "globalyzer": "0.1.0",
+ "globrex": "^0.1.2"
+ }
+ },
+ "tippy.js": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-5.1.2.tgz",
+ "integrity": "sha512-Qtrv2wqbRbaKMUb6bWWBQWPayvcDKNrGlvihxtsyowhT7RLGEh1STWuy6EMXC6QLkfKPB2MLnf8W2mzql9VDAw==",
+ "requires": {
+ "popper.js": "^1.16.0"
+ }
+ },
+ "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==",
+ "devOptional": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "tsconfig-paths": {
+ "version": "3.14.2",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz",
+ "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==",
+ "dev": true,
+ "requires": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg=="
+ },
+ "tsutils": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.8.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ }
+ }
+ },
+ "type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1"
+ }
+ },
+ "type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true
+ },
+ "typed-function": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-4.1.0.tgz",
+ "integrity": "sha512-DGwUl6cioBW5gw2L+6SMupGwH/kZOqivy17E4nsh1JI9fKF87orMmlQx3KISQPmg3sfnOUGlwVkroosvgddrlg=="
+ },
+ "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,
+ "peer": true
+ },
+ "typescript-compare": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/typescript-compare/-/typescript-compare-0.0.2.tgz",
+ "integrity": "sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA==",
+ "requires": {
+ "typescript-logic": "^0.0.0"
+ }
+ },
+ "typescript-logic": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/typescript-logic/-/typescript-logic-0.0.0.tgz",
+ "integrity": "sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q=="
+ },
+ "typescript-tuple": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/typescript-tuple/-/typescript-tuple-2.2.1.tgz",
+ "integrity": "sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q==",
+ "requires": {
+ "typescript-compare": "^0.0.2"
+ }
+ },
+ "unbox-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.0.3",
+ "which-boxed-primitive": "^1.0.2"
+ }
+ },
+ "unfetch": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz",
+ "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA=="
+ },
+ "unload": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz",
+ "integrity": "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==",
+ "requires": {
+ "@babel/runtime": "^7.6.2",
+ "detect-node": "^2.0.4"
+ }
+ },
+ "uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "use-resize-observer": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/use-resize-observer/-/use-resize-observer-9.1.0.tgz",
+ "integrity": "sha512-R25VqO9Wb3asSD4eqtcxk8sJalvIOYBqS8MNZlpDSQ4l4xMQxC/J7Id9HoTqPq8FwULIn0PVW+OAqF2dyYbjow==",
+ "requires": {
+ "@juggle/resize-observer": "^3.3.1"
+ }
+ },
+ "use-sync-external-store": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
+ "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
+ "requires": {}
+ },
+ "uuid": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
+ "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg=="
+ },
+ "victory-area": {
+ "version": "36.6.8",
+ "resolved": "https://registry.npmjs.org/victory-area/-/victory-area-36.6.8.tgz",
+ "integrity": "sha512-aIyMuzUqiDcpTCB7FUOYDJvqiDPiluEXLOw6Lh1vrUYmV7CNqMDOIBtTau2vI41Ao0o0YJdCAcyzBib9e3UYbw==",
+ "requires": {
+ "lodash": "^4.17.19",
+ "prop-types": "^15.8.1",
+ "victory-core": "^36.6.8",
+ "victory-vendor": "^36.6.8"
+ }
+ },
+ "victory-axis": {
+ "version": "36.6.8",
+ "resolved": "https://registry.npmjs.org/victory-axis/-/victory-axis-36.6.8.tgz",
+ "integrity": "sha512-tClVJEay1YOJAh9rRyyLx8pei7Sr1/xTz04bJmfzFoAxFoPBtvgfFwXhfZ1YjGIl7m5Wh2CiYMY3figueLzYtg==",
+ "requires": {
+ "lodash": "^4.17.19",
+ "prop-types": "^15.8.1",
+ "victory-core": "^36.6.8"
+ }
+ },
+ "victory-bar": {
+ "version": "36.6.8",
+ "resolved": "https://registry.npmjs.org/victory-bar/-/victory-bar-36.6.8.tgz",
+ "integrity": "sha512-jLLPm3IW8/2uSLPvQD9bxzXnTraUYBIDTkbZPZy7oHP01OVzP1sj+MMHcINCWcUbyUyLZDL3u8CvViXjS273JQ==",
+ "requires": {
+ "lodash": "^4.17.19",
+ "prop-types": "^15.8.1",
+ "victory-core": "^36.6.8",
+ "victory-vendor": "^36.6.8"
+ }
+ },
+ "victory-brush-container": {
+ "version": "36.6.8",
+ "resolved": "https://registry.npmjs.org/victory-brush-container/-/victory-brush-container-36.6.8.tgz",
+ "integrity": "sha512-PN5zQ6kjVwZca1qV41WlV6J2IEyQh+2hykRe6c/wERDotVVbSrX3sJVAzUbN+7x2rrK0CL6a/XUI8jDsWTMM2A==",
+ "requires": {
+ "lodash": "^4.17.19",
+ "prop-types": "^15.8.1",
+ "react-fast-compare": "^3.2.0",
+ "victory-core": "^36.6.8"
+ }
+ },
+ "victory-chart": {
+ "version": "36.6.8",
+ "resolved": "https://registry.npmjs.org/victory-chart/-/victory-chart-36.6.8.tgz",
+ "integrity": "sha512-kC1jL63PAmqUrvZNOfwAXNuaIwz4nvXYUuEPu59WRBCOIGDGRgv2wJ1O7O0xYXqDkI57EtAYf9KUK+miEn/Btg==",
+ "requires": {
+ "lodash": "^4.17.19",
+ "prop-types": "^15.8.1",
+ "react-fast-compare": "^3.2.0",
+ "victory-axis": "^36.6.8",
+ "victory-core": "^36.6.8",
+ "victory-polar-axis": "^36.6.8",
+ "victory-shared-events": "^36.6.8"
+ }
+ },
+ "victory-core": {
+ "version": "36.6.8",
+ "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-36.6.8.tgz",
+ "integrity": "sha512-SkyEszZKGyxjqfptfFWYdI22CvCuE9LhkaDpikzIhT2gcE3SuOBO5fk/740XMYE2ZUsJ4Fu/Vy4+8jZi17y44A==",
+ "requires": {
+ "lodash": "^4.17.21",
+ "prop-types": "^15.8.1",
+ "react-fast-compare": "^3.2.0",
+ "victory-vendor": "^36.6.8"
+ }
+ },
+ "victory-create-container": {
+ "version": "36.6.8",
+ "resolved": "https://registry.npmjs.org/victory-create-container/-/victory-create-container-36.6.8.tgz",
+ "integrity": "sha512-H2BsdTbJ/RxxcEg5lzk3TDlihtOs7I/5KaIBP3yosPs702i40mL2qndkRkj08QeiZhkaKfQ2GOUvyP+t7DSdmg==",
+ "requires": {
+ "lodash": "^4.17.19",
+ "victory-brush-container": "^36.6.8",
+ "victory-core": "^36.6.8",
+ "victory-cursor-container": "^36.6.8",
+ "victory-selection-container": "^36.6.8",
+ "victory-voronoi-container": "^36.6.8",
+ "victory-zoom-container": "^36.6.8"
+ }
+ },
+ "victory-cursor-container": {
+ "version": "36.6.8",
+ "resolved": "https://registry.npmjs.org/victory-cursor-container/-/victory-cursor-container-36.6.8.tgz",
+ "integrity": "sha512-3WIBRl+7jnZok6syLfW8RK23nliDcoD/JUTN0YZo6bKBqHeFc4+ur3mlwCfghH7sGoxJRYuOJxTd9x2MwM5HQQ==",
+ "requires": {
+ "lodash": "^4.17.19",
+ "prop-types": "^15.8.1",
+ "victory-core": "^36.6.8"
+ }
+ },
+ "victory-errorbar": {
+ "version": "36.6.8",
+ "resolved": "https://registry.npmjs.org/victory-errorbar/-/victory-errorbar-36.6.8.tgz",
+ "integrity": "sha512-N4JdBy5wV+KU6pus7FBx+5on31oXanO+qVmtRH8u4W7CMWH5EwHortyu2wVYD9K2QoluXemIxZd7kfn14hmqfQ==",
+ "requires": {
+ "lodash": "^4.17.19",
+ "prop-types": "^15.8.1",
+ "victory-core": "^36.6.8"
+ }
+ },
+ "victory-group": {
+ "version": "36.6.8",
+ "resolved": "https://registry.npmjs.org/victory-group/-/victory-group-36.6.8.tgz",
+ "integrity": "sha512-CiupDIGPPWVgwif3ayd8glSlR41mVbuT0Nl0ay9q42w2fiM32syiJAoifIw47X4tL8ow/DXH+/5Pd8eEyA2trA==",
+ "requires": {
+ "lodash": "^4.17.19",
+ "prop-types": "^15.8.1",
+ "react-fast-compare": "^3.2.0",
+ "victory-core": "^36.6.8",
+ "victory-shared-events": "^36.6.8"
+ }
+ },
+ "victory-legend": {
+ "version": "36.6.8",
+ "resolved": "https://registry.npmjs.org/victory-legend/-/victory-legend-36.6.8.tgz",
+ "integrity": "sha512-OnkzB82Mvt5/1LYNsrfZQoXaVvgfp1rCsFRI3imq257Sh/UPy0/eZehCMQs/SVbU0z0EuIpXokhZb3BBdoJgpw==",
+ "requires": {
+ "lodash": "^4.17.19",
+ "prop-types": "^15.8.1",
+ "victory-core": "^36.6.8"
+ }
+ },
+ "victory-line": {
+ "version": "36.6.8",
+ "resolved": "https://registry.npmjs.org/victory-line/-/victory-line-36.6.8.tgz",
+ "integrity": "sha512-MozOejQRZPdzFaru5zUfqVB4TEff6nZjtQhOs+F5yyhXjLgM89zGX30r3jK5cjVdAPbTu4KPUrwktvlw+AkPRA==",
+ "requires": {
+ "lodash": "^4.17.19",
+ "prop-types": "^15.8.1",
+ "victory-core": "^36.6.8",
+ "victory-vendor": "^36.6.8"
+ }
+ },
+ "victory-pie": {
+ "version": "36.6.8",
+ "resolved": "https://registry.npmjs.org/victory-pie/-/victory-pie-36.6.8.tgz",
+ "integrity": "sha512-dUHWiiKd60dlt7OjFa+YYwanHAkP/T0abzy6O3SFxGre52oeqd8px1EoVhlLKpn4ao8L35koG9mvz6/pGyr8Dw==",
+ "requires": {
+ "lodash": "^4.17.19",
+ "prop-types": "^15.8.1",
+ "victory-core": "^36.6.8",
+ "victory-vendor": "^36.6.8"
+ }
+ },
+ "victory-polar-axis": {
+ "version": "36.6.8",
+ "resolved": "https://registry.npmjs.org/victory-polar-axis/-/victory-polar-axis-36.6.8.tgz",
+ "integrity": "sha512-aU+Wp5six21POhI9oXeREnZHljpqcmwFHHnliVGrwgRsuc7TAjfXPWVOX9guEFfh6zQW6IZWWWTTLAN/PIEm9w==",
+ "requires": {
+ "lodash": "^4.17.19",
+ "prop-types": "^15.8.1",
+ "victory-core": "^36.6.8"
+ }
+ },
+ "victory-scatter": {
+ "version": "36.6.8",
+ "resolved": "https://registry.npmjs.org/victory-scatter/-/victory-scatter-36.6.8.tgz",
+ "integrity": "sha512-GKSNneBxIWLsF3eBSTW5IwT5S4YdsfFl4PVCP3/wTa2myfS5DIS9FufEnJp/FEZGalEXYWxeR47rlWqABxAj5A==",
+ "requires": {
+ "lodash": "^4.17.19",
+ "prop-types": "^15.8.1",
+ "victory-core": "^36.6.8"
+ }
+ },
+ "victory-selection-container": {
+ "version": "36.6.8",
+ "resolved": "https://registry.npmjs.org/victory-selection-container/-/victory-selection-container-36.6.8.tgz",
+ "integrity": "sha512-kudYbSX+o7fr64oeN7+EG/c+lqO22aypxVdCwa6BagAGoqqLR4jXxTqqIdp8tvxCgfCCXxopnTKYr46nubypGw==",
+ "requires": {
+ "lodash": "^4.17.19",
+ "prop-types": "^15.8.1",
+ "victory-core": "^36.6.8"
+ }
+ },
+ "victory-shared-events": {
+ "version": "36.6.8",
+ "resolved": "https://registry.npmjs.org/victory-shared-events/-/victory-shared-events-36.6.8.tgz",
+ "integrity": "sha512-hWPOVqMD3Sv6Rl1iyO6ibQrwYF9/eLCnRo0T59/Hsid6On0AJJjL9gv0oEIM5fqz7R7zx9PJmMk877IctEOemw==",
+ "requires": {
+ "json-stringify-safe": "^5.0.1",
+ "lodash": "^4.17.19",
+ "prop-types": "^15.8.1",
+ "react-fast-compare": "^3.2.0",
+ "victory-core": "^36.6.8"
+ }
+ },
+ "victory-stack": {
+ "version": "36.6.8",
+ "resolved": "https://registry.npmjs.org/victory-stack/-/victory-stack-36.6.8.tgz",
+ "integrity": "sha512-Pkux46IqAealOi0KvqQpaJKKKpHCfZ/sh5IeUKYFy+QKWAjiQjG6hFZeHgr2YaS7OfdbvHhoAdvp03KntWzpbw==",
+ "requires": {
+ "lodash": "^4.17.19",
+ "prop-types": "^15.8.1",
+ "react-fast-compare": "^3.2.0",
+ "victory-core": "^36.6.8",
+ "victory-shared-events": "^36.6.8"
+ }
+ },
+ "victory-tooltip": {
+ "version": "36.6.8",
+ "resolved": "https://registry.npmjs.org/victory-tooltip/-/victory-tooltip-36.6.8.tgz",
+ "integrity": "sha512-9P+QeAGyDpP0trJnQ1NtnbDhpoJB0Ghc2boYEehvL12p0OzolY9/Nq5SDP0tu5i1BBujwFXtnoCDqt+mOH25fA==",
+ "requires": {
+ "lodash": "^4.17.19",
+ "prop-types": "^15.8.1",
+ "victory-core": "^36.6.8"
+ }
+ },
+ "victory-vendor": {
+ "version": "36.6.8",
+ "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.6.8.tgz",
+ "integrity": "sha512-H3kyQ+2zgjMPvbPqAl7Vwm2FD5dU7/4bCTQakFQnpIsfDljeOMDojRsrmJfwh4oAlNnWhpAf+mbAoLh8u7dwyQ==",
+ "requires": {
+ "@types/d3-array": "^3.0.3",
+ "@types/d3-ease": "^3.0.0",
+ "@types/d3-interpolate": "^3.0.1",
+ "@types/d3-scale": "^4.0.2",
+ "@types/d3-shape": "^3.1.0",
+ "@types/d3-time": "^3.0.0",
+ "@types/d3-timer": "^3.0.0",
+ "d3-array": "^3.1.6",
+ "d3-ease": "^3.0.1",
+ "d3-interpolate": "^3.0.1",
+ "d3-scale": "^4.0.2",
+ "d3-shape": "^3.1.0",
+ "d3-time": "^3.0.0",
+ "d3-timer": "^3.0.1"
+ }
+ },
+ "victory-voronoi-container": {
+ "version": "36.6.8",
+ "resolved": "https://registry.npmjs.org/victory-voronoi-container/-/victory-voronoi-container-36.6.8.tgz",
+ "integrity": "sha512-x9/OOZdMm4dh38jNhSfBYT0nG6ribsINU0/WNzIn3QcDXFBInsJ7jRySxYmdmk45OdXfbDRwDMqVHk72sWQyUw==",
+ "requires": {
+ "delaunay-find": "0.0.6",
+ "lodash": "^4.17.19",
+ "prop-types": "^15.8.1",
+ "react-fast-compare": "^3.2.0",
+ "victory-core": "^36.6.8",
+ "victory-tooltip": "^36.6.8"
+ }
+ },
+ "victory-zoom-container": {
+ "version": "36.6.8",
+ "resolved": "https://registry.npmjs.org/victory-zoom-container/-/victory-zoom-container-36.6.8.tgz",
+ "integrity": "sha512-gxX5iJUaxrFFZ2IGS0sQnUI+3Mhj6bVLqtOlQd3Krld+9f/ieuUbxl+P+eIyhQU/VyHSlirIZeOGOXJeYcU9jQ==",
+ "requires": {
+ "lodash": "^4.17.19",
+ "prop-types": "^15.8.1",
+ "victory-core": "^36.6.8"
+ }
+ },
+ "warning": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
+ "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==",
+ "requires": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "watchpack": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
+ "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
+ "requires": {
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
+ }
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "which-boxed-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "dev": true,
+ "requires": {
+ "is-bigint": "^1.0.1",
+ "is-boolean-object": "^1.1.0",
+ "is-number-object": "^1.0.4",
+ "is-string": "^1.0.5",
+ "is-symbol": "^1.0.3"
+ }
+ },
+ "word-wrap": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz",
+ "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==",
+ "dev": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true
+ }
}
}
diff --git a/opendc-web/opendc-web-ui/package.json b/opendc-web/opendc-web-server/src/main/webui/package.json
index 18840db6..8e5bda2a 100644
--- a/opendc-web/opendc-web-ui/package.json
+++ b/opendc-web/opendc-web-server/src/main/webui/package.json
@@ -39,6 +39,7 @@
"react-konva": "^18.2.5",
"react-query": "^3.39.3",
"react-redux": "^8.0.5",
+ "next-runtime-env": "^1.7.1",
"redux": "^4.2.1",
"redux-logger": "^3.0.6",
"redux-saga": "^1.2.3",
@@ -57,7 +58,7 @@
"precommit": "lint-staged",
"dev": "next dev",
"lint": "next lint",
- "build": "next build",
+ "build": "next build && next export",
"start": "next start",
"export": "next export -o build/export"
},
diff --git a/opendc-web/opendc-web-ui/src/pages/404.js b/opendc-web/opendc-web-server/src/main/webui/pages/404.js
index 0939bc56..0939bc56 100644
--- a/opendc-web/opendc-web-ui/src/pages/404.js
+++ b/opendc-web/opendc-web-server/src/main/webui/pages/404.js
diff --git a/opendc-web/opendc-web-ui/src/pages/_app.js b/opendc-web/opendc-web-server/src/main/webui/pages/_app.js
index 62ce0539..62ce0539 100644
--- a/opendc-web/opendc-web-ui/src/pages/_app.js
+++ b/opendc-web/opendc-web-server/src/main/webui/pages/_app.js
diff --git a/opendc-web/opendc-web-ui/src/pages/_document.js b/opendc-web/opendc-web-server/src/main/webui/pages/_document.js
index 9f84b2ab..0a01a3eb 100644
--- a/opendc-web/opendc-web-ui/src/pages/_document.js
+++ b/opendc-web/opendc-web-server/src/main/webui/pages/_document.js
@@ -63,6 +63,8 @@ class OpenDCDocument extends Document {
content="OpenDC provides collaborative online datacenter modeling, diverse and effective datacenter simulation, and exploratory datacenter performance feedback."
/>
<meta property="og:locale" content="en_US" />
+ {/* Load config before Next scripts */}
+ <script src="/__ENV.js" />
</Head>
<body>
<Main />
diff --git a/opendc-web/opendc-web-ui/src/pages/logout.js b/opendc-web/opendc-web-server/src/main/webui/pages/logout.js
index 38d5968e..38d5968e 100644
--- a/opendc-web/opendc-web-ui/src/pages/logout.js
+++ b/opendc-web/opendc-web-server/src/main/webui/pages/logout.js
diff --git a/opendc-web/opendc-web-ui/src/pages/projects/[project]/index.js b/opendc-web/opendc-web-server/src/main/webui/pages/projects/[project]/index.js
index 52938bcd..52938bcd 100644
--- a/opendc-web/opendc-web-ui/src/pages/projects/[project]/index.js
+++ b/opendc-web/opendc-web-server/src/main/webui/pages/projects/[project]/index.js
diff --git a/opendc-web/opendc-web-ui/src/pages/projects/[project]/portfolios/[portfolio].js b/opendc-web/opendc-web-server/src/main/webui/pages/projects/[project]/portfolios/[portfolio].js
index 5d1e041b..5d1e041b 100644
--- a/opendc-web/opendc-web-ui/src/pages/projects/[project]/portfolios/[portfolio].js
+++ b/opendc-web/opendc-web-server/src/main/webui/pages/projects/[project]/portfolios/[portfolio].js
diff --git a/opendc-web/opendc-web-ui/src/pages/projects/[project]/topologies/[topology].js b/opendc-web/opendc-web-server/src/main/webui/pages/projects/[project]/topologies/[topology].js
index 48359365..48359365 100644
--- a/opendc-web/opendc-web-ui/src/pages/projects/[project]/topologies/[topology].js
+++ b/opendc-web/opendc-web-server/src/main/webui/pages/projects/[project]/topologies/[topology].js
diff --git a/opendc-web/opendc-web-ui/src/pages/projects/index.js b/opendc-web/opendc-web-server/src/main/webui/pages/projects/index.js
index 97ff105c..97ff105c 100644
--- a/opendc-web/opendc-web-ui/src/pages/projects/index.js
+++ b/opendc-web/opendc-web-server/src/main/webui/pages/projects/index.js
diff --git a/opendc-web/opendc-web-ui/public/favicon.ico b/opendc-web/opendc-web-server/src/main/webui/public/favicon.ico
index c2f40a0d..c2f40a0d 100644
--- a/opendc-web/opendc-web-ui/public/favicon.ico
+++ b/opendc-web/opendc-web-server/src/main/webui/public/favicon.ico
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/humans.txt b/opendc-web/opendc-web-server/src/main/webui/public/humans.txt
index dadcd530..dadcd530 100644
--- a/opendc-web/opendc-web-ui/public/humans.txt
+++ b/opendc-web/opendc-web-server/src/main/webui/public/humans.txt
diff --git a/opendc-web/opendc-web-ui/public/img/avatar.svg b/opendc-web/opendc-web-server/src/main/webui/public/img/avatar.svg
index 73726f9b..73726f9b 100644
--- a/opendc-web/opendc-web-ui/public/img/avatar.svg
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/avatar.svg
diff --git a/opendc-web/opendc-web-ui/public/img/datacenter-drawing.png b/opendc-web/opendc-web-server/src/main/webui/public/img/datacenter-drawing.png
index ec2b7398..ec2b7398 100644
--- a/opendc-web/opendc-web-ui/public/img/datacenter-drawing.png
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/datacenter-drawing.png
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/img/logo.png b/opendc-web/opendc-web-server/src/main/webui/public/img/logo.png
index d743038b..d743038b 100644
--- a/opendc-web/opendc-web-ui/public/img/logo.png
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/logo.png
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/img/logo.svg b/opendc-web/opendc-web-server/src/main/webui/public/img/logo.svg
index 5283a034..5283a034 100644
--- a/opendc-web/opendc-web-ui/public/img/logo.svg
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/logo.svg
diff --git a/opendc-web/opendc-web-ui/public/img/opendc-architecture.png b/opendc-web/opendc-web-server/src/main/webui/public/img/opendc-architecture.png
index e0bf8e9b..e0bf8e9b 100644
--- a/opendc-web/opendc-web-ui/public/img/opendc-architecture.png
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/opendc-architecture.png
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/img/opendc-timeline-v2.png b/opendc-web/opendc-web-server/src/main/webui/public/img/opendc-timeline-v2.png
index 0b2821c4..0b2821c4 100644
--- a/opendc-web/opendc-web-ui/public/img/opendc-timeline-v2.png
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/opendc-timeline-v2.png
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/img/portraits/aiosup.png b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/aiosup.png
index d2019b4d..d2019b4d 100644
--- a/opendc-web/opendc-web-ui/public/img/portraits/aiosup.png
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/aiosup.png
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/img/portraits/evaneyk.png b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/evaneyk.png
index 011c1627..011c1627 100644
--- a/opendc-web/opendc-web-ui/public/img/portraits/evaneyk.png
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/evaneyk.png
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/img/portraits/fmastenbroek.png b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/fmastenbroek.png
index 218b1a6f..218b1a6f 100644
--- a/opendc-web/opendc-web-ui/public/img/portraits/fmastenbroek.png
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/fmastenbroek.png
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/img/portraits/gandreadis.png b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/gandreadis.png
index 96a3abda..96a3abda 100644
--- a/opendc-web/opendc-web-ui/public/img/portraits/gandreadis.png
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/gandreadis.png
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/img/portraits/hhe.png b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/hhe.png
index 4891c7f5..4891c7f5 100644
--- a/opendc-web/opendc-web-ui/public/img/portraits/hhe.png
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/hhe.png
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/img/portraits/jbosch.png b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/jbosch.png
index c76e1fab..c76e1fab 100644
--- a/opendc-web/opendc-web-ui/public/img/portraits/jbosch.png
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/jbosch.png
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/img/portraits/jburley.png b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/jburley.png
index d2691659..d2691659 100644
--- a/opendc-web/opendc-web-ui/public/img/portraits/jburley.png
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/jburley.png
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/img/portraits/lfdversluis.png b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/lfdversluis.png
index 6fbc8472..6fbc8472 100644
--- a/opendc-web/opendc-web-ui/public/img/portraits/lfdversluis.png
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/lfdversluis.png
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/img/portraits/loverweel.png b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/loverweel.png
index 85865977..85865977 100644
--- a/opendc-web/opendc-web-ui/public/img/portraits/loverweel.png
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/loverweel.png
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/img/portraits/sjounaid.png b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/sjounaid.png
index 41878161..41878161 100644
--- a/opendc-web/opendc-web-ui/public/img/portraits/sjounaid.png
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/sjounaid.png
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/img/portraits/vvanbeek.png b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/vvanbeek.png
index 4c8b3311..4c8b3311 100644
--- a/opendc-web/opendc-web-ui/public/img/portraits/vvanbeek.png
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/vvanbeek.png
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/img/portraits/wlai.png b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/wlai.png
index c758846d..c758846d 100644
--- a/opendc-web/opendc-web-ui/public/img/portraits/wlai.png
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/wlai.png
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/img/screenshot-construction.png b/opendc-web/opendc-web-server/src/main/webui/public/img/screenshot-construction.png
index ea20a7c4..ea20a7c4 100644
--- a/opendc-web/opendc-web-ui/public/img/screenshot-construction.png
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/screenshot-construction.png
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/img/screenshot-simulation.png b/opendc-web/opendc-web-server/src/main/webui/public/img/screenshot-simulation.png
index 1bd989c7..1bd989c7 100644
--- a/opendc-web/opendc-web-ui/public/img/screenshot-simulation.png
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/screenshot-simulation.png
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/img/stakeholders/Developer.png b/opendc-web/opendc-web-server/src/main/webui/public/img/stakeholders/Developer.png
index d2638e6c..d2638e6c 100644
--- a/opendc-web/opendc-web-ui/public/img/stakeholders/Developer.png
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/stakeholders/Developer.png
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/img/stakeholders/Manager.png b/opendc-web/opendc-web-server/src/main/webui/public/img/stakeholders/Manager.png
index 92db7459..92db7459 100644
--- a/opendc-web/opendc-web-ui/public/img/stakeholders/Manager.png
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/stakeholders/Manager.png
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/img/stakeholders/Researcher.png b/opendc-web/opendc-web-server/src/main/webui/public/img/stakeholders/Researcher.png
index d87edd39..d87edd39 100644
--- a/opendc-web/opendc-web-ui/public/img/stakeholders/Researcher.png
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/stakeholders/Researcher.png
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/img/stakeholders/Sales.png b/opendc-web/opendc-web-server/src/main/webui/public/img/stakeholders/Sales.png
index 5b7c3a72..5b7c3a72 100644
--- a/opendc-web/opendc-web-ui/public/img/stakeholders/Sales.png
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/stakeholders/Sales.png
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/img/stakeholders/Student.png b/opendc-web/opendc-web-server/src/main/webui/public/img/stakeholders/Student.png
index a4900303..a4900303 100644
--- a/opendc-web/opendc-web-ui/public/img/stakeholders/Student.png
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/stakeholders/Student.png
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/img/topology/cpu-icon.png b/opendc-web/opendc-web-server/src/main/webui/public/img/topology/cpu-icon.png
index 07cfbd31..07cfbd31 100644
--- a/opendc-web/opendc-web-ui/public/img/topology/cpu-icon.png
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/topology/cpu-icon.png
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/img/topology/gpu-icon.png b/opendc-web/opendc-web-server/src/main/webui/public/img/topology/gpu-icon.png
index 55d4fb05..55d4fb05 100644
--- a/opendc-web/opendc-web-ui/public/img/topology/gpu-icon.png
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/topology/gpu-icon.png
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/img/topology/memory-icon.png b/opendc-web/opendc-web-server/src/main/webui/public/img/topology/memory-icon.png
index 36e8a44e..36e8a44e 100644
--- a/opendc-web/opendc-web-ui/public/img/topology/memory-icon.png
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/topology/memory-icon.png
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/img/topology/rack-energy-icon.png b/opendc-web/opendc-web-server/src/main/webui/public/img/topology/rack-energy-icon.png
index 1088c61b..1088c61b 100644
--- a/opendc-web/opendc-web-ui/public/img/topology/rack-energy-icon.png
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/topology/rack-energy-icon.png
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/img/topology/rack-space-icon.png b/opendc-web/opendc-web-server/src/main/webui/public/img/topology/rack-space-icon.png
index 387d7ea6..387d7ea6 100644
--- a/opendc-web/opendc-web-ui/public/img/topology/rack-space-icon.png
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/topology/rack-space-icon.png
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/img/topology/storage-icon.png b/opendc-web/opendc-web-server/src/main/webui/public/img/topology/storage-icon.png
index 7a39cb6f..7a39cb6f 100644
--- a/opendc-web/opendc-web-ui/public/img/topology/storage-icon.png
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/topology/storage-icon.png
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/img/tudelft-icon.png b/opendc-web/opendc-web-server/src/main/webui/public/img/tudelft-icon.png
index a7a2d56a..a7a2d56a 100644
--- a/opendc-web/opendc-web-ui/public/img/tudelft-icon.png
+++ b/opendc-web/opendc-web-server/src/main/webui/public/img/tudelft-icon.png
Binary files differ
diff --git a/opendc-web/opendc-web-ui/public/manifest.json b/opendc-web/opendc-web-server/src/main/webui/public/manifest.json
index adb82218..adb82218 100644
--- a/opendc-web/opendc-web-ui/public/manifest.json
+++ b/opendc-web/opendc-web-server/src/main/webui/public/manifest.json
diff --git a/opendc-web/opendc-web-ui/public/robots.txt b/opendc-web/opendc-web-server/src/main/webui/public/robots.txt
index 1c6094ce..1c6094ce 100644
--- a/opendc-web/opendc-web-ui/public/robots.txt
+++ b/opendc-web/opendc-web-server/src/main/webui/public/robots.txt
diff --git a/opendc-web/opendc-web-ui/src/redux/actions/interaction-level.js b/opendc-web/opendc-web-server/src/main/webui/redux/actions/interaction-level.js
index 8381eeef..8381eeef 100644
--- a/opendc-web/opendc-web-ui/src/redux/actions/interaction-level.js
+++ b/opendc-web/opendc-web-server/src/main/webui/redux/actions/interaction-level.js
diff --git a/opendc-web/opendc-web-ui/src/redux/actions/topology/building.js b/opendc-web/opendc-web-server/src/main/webui/redux/actions/topology/building.js
index c12417b9..c12417b9 100644
--- a/opendc-web/opendc-web-ui/src/redux/actions/topology/building.js
+++ b/opendc-web/opendc-web-server/src/main/webui/redux/actions/topology/building.js
diff --git a/opendc-web/opendc-web-ui/src/redux/actions/topology/index.js b/opendc-web/opendc-web-server/src/main/webui/redux/actions/topology/index.js
index d48af37a..d48af37a 100644
--- a/opendc-web/opendc-web-ui/src/redux/actions/topology/index.js
+++ b/opendc-web/opendc-web-server/src/main/webui/redux/actions/topology/index.js
diff --git a/opendc-web/opendc-web-ui/src/redux/actions/topology/machine.js b/opendc-web/opendc-web-server/src/main/webui/redux/actions/topology/machine.js
index 93320884..93320884 100644
--- a/opendc-web/opendc-web-ui/src/redux/actions/topology/machine.js
+++ b/opendc-web/opendc-web-server/src/main/webui/redux/actions/topology/machine.js
diff --git a/opendc-web/opendc-web-ui/src/redux/actions/topology/rack.js b/opendc-web/opendc-web-server/src/main/webui/redux/actions/topology/rack.js
index 1f65952a..1f65952a 100644
--- a/opendc-web/opendc-web-ui/src/redux/actions/topology/rack.js
+++ b/opendc-web/opendc-web-server/src/main/webui/redux/actions/topology/rack.js
diff --git a/opendc-web/opendc-web-ui/src/redux/actions/topology/room.js b/opendc-web/opendc-web-server/src/main/webui/redux/actions/topology/room.js
index 14cc126c..14cc126c 100644
--- a/opendc-web/opendc-web-ui/src/redux/actions/topology/room.js
+++ b/opendc-web/opendc-web-server/src/main/webui/redux/actions/topology/room.js
diff --git a/opendc-web/opendc-web-ui/src/redux/index.js b/opendc-web/opendc-web-server/src/main/webui/redux/index.js
index 53cd9144..53cd9144 100644
--- a/opendc-web/opendc-web-ui/src/redux/index.js
+++ b/opendc-web/opendc-web-server/src/main/webui/redux/index.js
diff --git a/opendc-web/opendc-web-ui/src/redux/reducers/construction-mode.js b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/construction-mode.js
index d0aac5ae..d0aac5ae 100644
--- a/opendc-web/opendc-web-ui/src/redux/reducers/construction-mode.js
+++ b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/construction-mode.js
diff --git a/opendc-web/opendc-web-ui/src/redux/reducers/index.js b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/index.js
index 7ffb1211..7ffb1211 100644
--- a/opendc-web/opendc-web-ui/src/redux/reducers/index.js
+++ b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/index.js
diff --git a/opendc-web/opendc-web-ui/src/redux/reducers/interaction-level.js b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/interaction-level.js
index b30c68b9..b30c68b9 100644
--- a/opendc-web/opendc-web-ui/src/redux/reducers/interaction-level.js
+++ b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/interaction-level.js
diff --git a/opendc-web/opendc-web-ui/src/redux/reducers/topology/index.js b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/index.js
index 2c849387..2c849387 100644
--- a/opendc-web/opendc-web-ui/src/redux/reducers/topology/index.js
+++ b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/index.js
diff --git a/opendc-web/opendc-web-ui/src/redux/reducers/topology/machine.js b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/machine.js
index 1789257b..1789257b 100644
--- a/opendc-web/opendc-web-ui/src/redux/reducers/topology/machine.js
+++ b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/machine.js
diff --git a/opendc-web/opendc-web-ui/src/redux/reducers/topology/rack.js b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/rack.js
index ca79348a..ca79348a 100644
--- a/opendc-web/opendc-web-ui/src/redux/reducers/topology/rack.js
+++ b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/rack.js
diff --git a/opendc-web/opendc-web-ui/src/redux/reducers/topology/room.js b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/room.js
index c05c8bfa..c05c8bfa 100644
--- a/opendc-web/opendc-web-ui/src/redux/reducers/topology/room.js
+++ b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/room.js
diff --git a/opendc-web/opendc-web-ui/src/redux/reducers/topology/tile.js b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/tile.js
index 24c0e20c..24c0e20c 100644
--- a/opendc-web/opendc-web-ui/src/redux/reducers/topology/tile.js
+++ b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/tile.js
diff --git a/opendc-web/opendc-web-ui/src/redux/reducers/topology/topology.js b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/topology.js
index dff0a69e..dff0a69e 100644
--- a/opendc-web/opendc-web-ui/src/redux/reducers/topology/topology.js
+++ b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/topology.js
diff --git a/opendc-web/opendc-web-ui/src/redux/sagas/index.js b/opendc-web/opendc-web-server/src/main/webui/redux/sagas/index.js
index 0fabdb6d..0fabdb6d 100644
--- a/opendc-web/opendc-web-ui/src/redux/sagas/index.js
+++ b/opendc-web/opendc-web-server/src/main/webui/redux/sagas/index.js
diff --git a/opendc-web/opendc-web-ui/src/redux/sagas/topology.js b/opendc-web/opendc-web-server/src/main/webui/redux/sagas/topology.js
index 15147bcf..15147bcf 100644
--- a/opendc-web/opendc-web-ui/src/redux/sagas/topology.js
+++ b/opendc-web/opendc-web-server/src/main/webui/redux/sagas/topology.js
diff --git a/opendc-web/opendc-web-ui/src/shapes.js b/opendc-web/opendc-web-server/src/main/webui/shapes.js
index 50b82361..50b82361 100644
--- a/opendc-web/opendc-web-ui/src/shapes.js
+++ b/opendc-web/opendc-web-server/src/main/webui/shapes.js
diff --git a/opendc-web/opendc-web-ui/src/style/index.css b/opendc-web/opendc-web-server/src/main/webui/style/index.css
index 7b7103a4..7b7103a4 100644
--- a/opendc-web/opendc-web-ui/src/style/index.css
+++ b/opendc-web/opendc-web-server/src/main/webui/style/index.css
diff --git a/opendc-web/opendc-web-ui/src/util/authorizations.js b/opendc-web/opendc-web-server/src/main/webui/util/authorizations.js
index 6cb08ba8..6cb08ba8 100644
--- a/opendc-web/opendc-web-ui/src/util/authorizations.js
+++ b/opendc-web/opendc-web-server/src/main/webui/util/authorizations.js
diff --git a/opendc-web/opendc-web-ui/src/util/available-metrics.js b/opendc-web/opendc-web-server/src/main/webui/util/available-metrics.js
index fda6cd4d..fda6cd4d 100644
--- a/opendc-web/opendc-web-ui/src/util/available-metrics.js
+++ b/opendc-web/opendc-web-server/src/main/webui/util/available-metrics.js
diff --git a/opendc-web/opendc-web-ui/src/util/colors.js b/opendc-web/opendc-web-server/src/main/webui/util/colors.js
index 34468503..34468503 100644
--- a/opendc-web/opendc-web-ui/src/util/colors.js
+++ b/opendc-web/opendc-web-server/src/main/webui/util/colors.js
diff --git a/opendc-web/opendc-web-ui/src/util/date-time.js b/opendc-web/opendc-web-server/src/main/webui/util/date-time.js
index 7e2f6623..7e2f6623 100644
--- a/opendc-web/opendc-web-ui/src/util/date-time.js
+++ b/opendc-web/opendc-web-server/src/main/webui/util/date-time.js
diff --git a/opendc-web/opendc-web-ui/src/util/date-time.test.js b/opendc-web/opendc-web-server/src/main/webui/util/date-time.test.js
index 431e39f7..431e39f7 100644
--- a/opendc-web/opendc-web-ui/src/util/date-time.test.js
+++ b/opendc-web/opendc-web-server/src/main/webui/util/date-time.test.js
diff --git a/opendc-web/opendc-web-ui/src/util/effect-ref.js b/opendc-web/opendc-web-server/src/main/webui/util/effect-ref.js
index 78528585..78528585 100644
--- a/opendc-web/opendc-web-ui/src/util/effect-ref.js
+++ b/opendc-web/opendc-web-server/src/main/webui/util/effect-ref.js
diff --git a/opendc-web/opendc-web-ui/src/util/tile-calculations.js b/opendc-web/opendc-web-server/src/main/webui/util/tile-calculations.js
index 374ca48c..374ca48c 100644
--- a/opendc-web/opendc-web-ui/src/util/tile-calculations.js
+++ b/opendc-web/opendc-web-server/src/main/webui/util/tile-calculations.js
diff --git a/opendc-web/opendc-web-ui/src/util/topology-schema.js b/opendc-web/opendc-web-server/src/main/webui/util/topology-schema.js
index ff672dd6..ff672dd6 100644
--- a/opendc-web/opendc-web-ui/src/util/topology-schema.js
+++ b/opendc-web/opendc-web-server/src/main/webui/util/topology-schema.js
diff --git a/opendc-web/opendc-web-ui/src/util/unit-specifications.js b/opendc-web/opendc-web-server/src/main/webui/util/unit-specifications.js
index 3e3671cd..3e3671cd 100644
--- a/opendc-web/opendc-web-ui/src/util/unit-specifications.js
+++ b/opendc-web/opendc-web-server/src/main/webui/util/unit-specifications.js
diff --git a/opendc-web/opendc-web-server/src/test/java/org/opendc/web/server/service/UserAccountingServiceTest.java b/opendc-web/opendc-web-server/src/test/java/org/opendc/web/server/service/UserAccountingServiceTest.java
index 91e3eb66..f4a8c9d6 100644
--- a/opendc-web/opendc-web-server/src/test/java/org/opendc/web/server/service/UserAccountingServiceTest.java
+++ b/opendc-web/opendc-web-server/src/test/java/org/opendc/web/server/service/UserAccountingServiceTest.java
@@ -68,8 +68,8 @@ public class UserAccountingServiceTest {
var accounting = service.getAccounting(userId);
- assertTrue(accounting.getPeriodEnd().isAfter(LocalDate.now()));
- assertEquals(0, accounting.getSimulationTime());
+ assertTrue(accounting.periodEnd().isAfter(LocalDate.now()));
+ assertEquals(0, accounting.simulationTime());
}
@Test
@@ -85,9 +85,9 @@ public class UserAccountingServiceTest {
var accounting = service.getAccounting(userId);
assertAll(
- () -> assertEquals(periodEnd, accounting.getPeriodEnd()),
- () -> assertEquals(32, accounting.getSimulationTime()),
- () -> assertEquals(3600, accounting.getSimulationTimeBudget()));
+ () -> assertEquals(periodEnd, accounting.periodEnd()),
+ () -> assertEquals(32, accounting.simulationTime()),
+ () -> assertEquals(3600, accounting.simulationTimeBudget()));
}
@Test
diff --git a/opendc-web/opendc-web-ui-quarkus-deployment/src/main/java/org/opendc/web/ui/deployment/OpenDCUiProcessor.java b/opendc-web/opendc-web-ui-quarkus-deployment/src/main/java/org/opendc/web/ui/deployment/OpenDCUiProcessor.java
deleted file mode 100644
index 5733e0db..00000000
--- a/opendc-web/opendc-web-ui-quarkus-deployment/src/main/java/org/opendc/web/ui/deployment/OpenDCUiProcessor.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * Copyright (c) 2022 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.web.ui.deployment;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import io.quarkus.deployment.annotations.BuildProducer;
-import io.quarkus.deployment.annotations.BuildStep;
-import io.quarkus.deployment.annotations.ExecutionTime;
-import io.quarkus.deployment.annotations.Record;
-import io.quarkus.deployment.builditem.FeatureBuildItem;
-import io.quarkus.deployment.builditem.ShutdownContextBuildItem;
-import io.quarkus.deployment.pkg.builditem.CurateOutcomeBuildItem;
-import io.quarkus.maven.dependency.GACT;
-import io.quarkus.maven.dependency.ResolvedDependency;
-import io.quarkus.paths.PathVisit;
-import io.quarkus.vertx.http.deployment.HttpRootPathBuildItem;
-import io.quarkus.vertx.http.deployment.RouteBuildItem;
-import io.quarkus.vertx.http.deployment.webjar.WebJarBuildItem;
-import io.quarkus.vertx.http.deployment.webjar.WebJarResourcesFilter;
-import io.quarkus.vertx.http.deployment.webjar.WebJarResultsBuildItem;
-import io.vertx.core.Handler;
-import io.vertx.ext.web.RoutingContext;
-import java.io.*;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.function.BooleanSupplier;
-import java.util.function.Function;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import org.opendc.web.ui.runtime.OpenDCUiRecorder;
-import org.opendc.web.ui.runtime.OpenDCUiRuntimeConfig;
-
-/**
- * Build processor for the OpenDC web UI Quarkus extension.
- */
-public class OpenDCUiProcessor {
-
- private static final String FEATURE = "opendc-ui";
- private static final GACT OPENDC_UI_WEBJAR_ARTIFACT_KEY = new GACT("org.opendc.web", "opendc-web-ui", null, "jar");
- private static final String OPENDC_UI_WEBJAR_STATIC_RESOURCES_PATH = "META-INF/resources/opendc-web-ui";
- private static final Pattern PATH_PARAM_PATTERN = Pattern.compile("\\[(\\w+)]");
-
- private final ObjectMapper objectMapper = new ObjectMapper();
-
- /**
- * Provide the {@link FeatureBuildItem} for this Quarkus extension.
- */
- @BuildStep(onlyIf = IsIncluded.class)
- public FeatureBuildItem feature() {
- return new FeatureBuildItem(FEATURE);
- }
-
- /**
- * Build the WebJar that is used to serve the Next.js resources.
- */
- @BuildStep(onlyIf = IsIncluded.class)
- public WebJarBuildItem buildWebJar(OpenDCUiConfig config) {
- return WebJarBuildItem.builder()
- .artifactKey(OPENDC_UI_WEBJAR_ARTIFACT_KEY)
- .root(OPENDC_UI_WEBJAR_STATIC_RESOURCES_PATH)
- .onlyCopyNonArtifactFiles(false)
- .useDefaultQuarkusBranding(false)
- .filter(new InsertVariablesResourcesFilter(config))
- .build();
- }
-
- /**
- * Build the Next.js routes based on the route manifest generated by it.
- */
- @BuildStep(onlyIf = IsIncluded.class)
- public OpenDCUiRoutingBuildItem buildRoutes(CurateOutcomeBuildItem curateOutcomeBuildItem) throws IOException {
- ResolvedDependency dependency = getAppArtifact(curateOutcomeBuildItem, OPENDC_UI_WEBJAR_ARTIFACT_KEY);
- PathVisit visit = dependency
- .getContentTree()
- .apply(OPENDC_UI_WEBJAR_STATIC_RESOURCES_PATH + "/routes-manifest.json", v -> v);
-
- if (visit == null) {
- throw new FileNotFoundException("Cannot find routes-manifest.json");
- }
-
- JsonNode routeManifest = objectMapper.readTree(visit.getUrl());
-
- var pages = new ArrayList<OpenDCUiRoutingBuildItem.Page>();
- for (Iterator<JsonNode> it = routeManifest.get("staticRoutes").elements(); it.hasNext(); ) {
- JsonNode route = it.next();
-
- String page = route.get("page").asText();
-
- // Static routes do not have any path parameters
- pages.add(new OpenDCUiRoutingBuildItem.Page(page, page));
- }
-
- for (Iterator<JsonNode> it = routeManifest.get("dynamicRoutes").elements(); it.hasNext(); ) {
- JsonNode route = it.next();
-
- String page = route.get("page").asText();
- String path = PATH_PARAM_PATTERN.matcher(page).replaceAll(r -> ":" + r.group(1));
-
- pages.add(new OpenDCUiRoutingBuildItem.Page(path, page));
- }
-
- var redirects = new ArrayList<OpenDCUiRoutingBuildItem.Redirect>();
- for (Iterator<JsonNode> it = routeManifest.get("redirects").elements(); it.hasNext(); ) {
- JsonNode redirect = it.next();
- if (redirect.has("internal")) {
- continue;
- }
-
- int statusCode = redirect.get("statusCode").asInt();
- String path = redirect.get("source").asText();
- String destination = redirect.get("destination").asText();
-
- if (path.isEmpty()) {
- path = "/";
- }
-
- redirects.add(new OpenDCUiRoutingBuildItem.Redirect(path, destination, statusCode));
- }
-
- var custom404 = routeManifest.get("pages404").asBoolean();
- return new OpenDCUiRoutingBuildItem(pages, redirects, custom404);
- }
-
- /**
- * Register the HTTP handles for the OpenDC web UI.
- */
- @BuildStep(onlyIf = IsIncluded.class)
- @Record(ExecutionTime.RUNTIME_INIT)
- public void registerOpenDCUiHandler(
- OpenDCUiRecorder recorder,
- BuildProducer<RouteBuildItem> routes,
- HttpRootPathBuildItem httpRootPathBuildItem,
- WebJarResultsBuildItem webJarResultsBuildItem,
- OpenDCUiRoutingBuildItem openDCUiBuildItem,
- OpenDCUiRuntimeConfig runtimeConfig,
- ShutdownContextBuildItem shutdownContext) {
-
- WebJarResultsBuildItem.WebJarResult result =
- webJarResultsBuildItem.byArtifactKey(OPENDC_UI_WEBJAR_ARTIFACT_KEY);
- if (result == null) {
- return;
- }
-
- String basePath = httpRootPathBuildItem.getRootPath();
- String finalDestination = result.getFinalDestination();
-
- /* Construct dynamic routes */
- for (var redirect : openDCUiBuildItem.getRedirects()) {
- String destination =
- basePath.equals("/") ? redirect.getDestination() : basePath + redirect.getDestination();
-
- routes.produce(httpRootPathBuildItem
- .routeBuilder()
- .route(basePath + redirect.getPath())
- .handler(recorder.redirectHandler(destination, redirect.getStatusCode(), runtimeConfig))
- .build());
- }
-
- for (var page : openDCUiBuildItem.getPages()) {
- routes.produce(httpRootPathBuildItem
- .routeBuilder()
- .route(basePath + page.getPath())
- .handler(recorder.pageHandler(finalDestination, page.getName(), runtimeConfig))
- .build());
- }
-
- /* Construct static routes */
- Handler<RoutingContext> staticHandler = recorder.staticHandler(
- finalDestination, basePath, result.getWebRootConfigurations(), runtimeConfig, shutdownContext);
-
- routes.produce(httpRootPathBuildItem
- .routeBuilder()
- .route("*")
- .handler(staticHandler)
- .build());
- }
-
- /**
- * A {@link WebJarResourcesFilter} that instantiates the variables in the web jar resource.
- */
- private static class InsertVariablesResourcesFilter implements WebJarResourcesFilter {
-
- private static final String HTML = ".html";
- private static final String CSS = ".css";
- private static final String JS = ".js";
-
- private final OpenDCUiConfig config;
-
- public InsertVariablesResourcesFilter(OpenDCUiConfig config) {
- this.config = config;
- }
-
- @Override
- public FilterResult apply(String fileName, InputStream stream) throws IOException {
- if (stream == null) {
- return new FilterResult(null, false);
- }
-
- // Allow replacement of variables in HTML, CSS, and JavaScript files
- if (fileName.endsWith(HTML) || fileName.endsWith(CSS) || fileName.endsWith(JS)) {
- byte[] oldContentBytes = stream.readAllBytes();
- String oldContents = new String(oldContentBytes);
- String contents = substituteVariables(oldContents, this::substitute);
-
- boolean changed = contents.length() != oldContents.length() || !contents.equals(oldContents);
- if (changed) {
- return new FilterResult(new ByteArrayInputStream(contents.getBytes()), true);
- } else {
- return new FilterResult(new ByteArrayInputStream(oldContentBytes), false);
- }
- }
-
- return new FilterResult(stream, false);
- }
-
- private String substitute(String var) {
- switch (var) {
- case "NEXT_PUBLIC_API_BASE_URL":
- return config.apiBaseUrl;
- case "NEXT_PUBLIC_SENTRY_DSN":
- return config.sentryDsn.orElse("");
- case "NEXT_PUBLIC_AUTH0_DOMAIN":
- return config.auth.domain.orElse("");
- case "NEXT_PUBLIC_AUTH0_CLIENT_ID":
- return config.auth.clientId.orElse("");
- case "NEXT_PUBLIC_AUTH0_AUDIENCE":
- return config.auth.audience.orElse("");
- default:
- return null;
- }
- }
-
- /**
- * Pattern to match variables in the OpenDC web UI sources specified using the following format: "%%VAR_NAME%%".
- * <p>
- * Be aware that to properly handle Next.js base path, we need to also match a possible forward slash in front
- * of the variable.
- */
- private static final Pattern PATTERN = Pattern.compile("%%(\\w+)%%");
-
- /**
- * Helper method to substitute variables in the OpenDC web UI.
- */
- private static String substituteVariables(String contents, Function<String, String> substitute) {
- Matcher m = PATTERN.matcher(contents);
- StringBuilder sb = new StringBuilder();
-
- while (m.find()) {
- String group = m.group(1);
- String val = substitute.apply(group);
- m.appendReplacement(sb, val != null ? val : group);
- }
-
- m.appendTail(sb);
- return sb.toString();
- }
- }
-
- /**
- * A {@link BooleanSupplier} to determine if the OpenDC web UI extension should be included.
- */
- private static class IsIncluded implements BooleanSupplier {
- OpenDCUiConfig config;
-
- @Override
- public boolean getAsBoolean() {
- return config.include;
- }
- }
-
- private static ResolvedDependency getAppArtifact(CurateOutcomeBuildItem curateOutcomeBuildItem, GACT artifactKey) {
- for (ResolvedDependency dep :
- curateOutcomeBuildItem.getApplicationModel().getDependencies()) {
- if (dep.getKey().equals(artifactKey)) {
- return dep;
- }
- }
- throw new RuntimeException("Could not find artifact " + artifactKey + " among the application dependencies");
- }
-}
diff --git a/opendc-web/opendc-web-ui-quarkus/src/main/java/org/opendc/web/ui/runtime/OpenDCUiRecorder.java b/opendc-web/opendc-web-ui-quarkus/src/main/java/org/opendc/web/ui/runtime/OpenDCUiRecorder.java
deleted file mode 100644
index 03fedd4f..00000000
--- a/opendc-web/opendc-web-ui-quarkus/src/main/java/org/opendc/web/ui/runtime/OpenDCUiRecorder.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (c) 2022 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.web.ui.runtime;
-
-import io.quarkus.runtime.ShutdownContext;
-import io.quarkus.runtime.annotations.Recorder;
-import io.quarkus.vertx.http.runtime.devmode.FileSystemStaticHandler;
-import io.quarkus.vertx.http.runtime.webjar.WebJarNotFoundHandler;
-import io.quarkus.vertx.http.runtime.webjar.WebJarStaticHandler;
-import io.vertx.core.Handler;
-import io.vertx.ext.web.RoutingContext;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * Helper class for serving the OpenDC web interface.
- */
-@Recorder
-public class OpenDCUiRecorder {
- /**
- * Construct a {@link Handler} for serving a page of the OpenDC web interface.
- */
- public Handler<RoutingContext> pageHandler(
- String finalDestination, String page, OpenDCUiRuntimeConfig runtimeConfig) {
- if (runtimeConfig.enable) {
- String pageDirectory = finalDestination + "/pages";
- return (event) -> {
- event.response().setStatusCode(200).sendFile(pageDirectory + page + ".html");
- };
- }
-
- return new WebJarNotFoundHandler();
- }
-
- /**
- * Construct a {@link Handler} for handling redirects in the OpenDC web interface.
- */
- public Handler<RoutingContext> redirectHandler(
- String destination, int statusCode, OpenDCUiRuntimeConfig runtimeConfig) {
- if (runtimeConfig.enable) {
- return (event) -> {
- String query = event.request().query();
- String fullDestination = query != null ? destination + "?" + query : destination;
-
- event.response()
- .setStatusCode(statusCode)
- .putHeader("Location", fullDestination)
- .end();
- };
- }
-
- return new WebJarNotFoundHandler();
- }
-
- /**
- * Construct a {@link Handler} for serving the static files of the OpenDC web interface.
- */
- public Handler<RoutingContext> staticHandler(
- String finalDestination,
- String path,
- List<FileSystemStaticHandler.StaticWebRootConfiguration> webRootConfigurations,
- OpenDCUiRuntimeConfig runtimeConfig,
- ShutdownContext shutdownContext) {
- if (runtimeConfig.enable) {
- var augmentedWebRootConfigurations = webRootConfigurations.stream()
- .map(c -> new FileSystemStaticHandler.StaticWebRootConfiguration(
- c.getFileSystem(), c.getWebRoot().isEmpty() ? "static" : c.getWebRoot() + "/static"))
- .collect(Collectors.toList());
-
- WebJarStaticHandler handler =
- new WebJarStaticHandler(finalDestination + "/static", path, augmentedWebRootConfigurations);
- shutdownContext.addShutdownTask(new ShutdownContext.CloseRunnable(handler));
- return handler;
- }
-
- return new WebJarNotFoundHandler();
- }
-}
diff --git a/opendc-web/opendc-web-ui-quarkus/src/main/java/org/opendc/web/ui/runtime/OpenDCUiRuntimeConfig.java b/opendc-web/opendc-web-ui-quarkus/src/main/java/org/opendc/web/ui/runtime/OpenDCUiRuntimeConfig.java
deleted file mode 100644
index 8ae3b6a2..00000000
--- a/opendc-web/opendc-web-ui-quarkus/src/main/java/org/opendc/web/ui/runtime/OpenDCUiRuntimeConfig.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (c) 2022 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.web.ui.runtime;
-
-import io.quarkus.runtime.annotations.ConfigItem;
-import io.quarkus.runtime.annotations.ConfigPhase;
-import io.quarkus.runtime.annotations.ConfigRoot;
-
-/**
- * Configuration for the OpenDC web UI.
- */
-@ConfigRoot(phase = ConfigPhase.RUN_TIME, name = "opendc-ui")
-public class OpenDCUiRuntimeConfig {
- /**
- * Flag to indicate whether the web interface should be served by the OpenDC API server.
- */
- @ConfigItem(defaultValue = "true")
- public boolean enable;
-}
diff --git a/opendc-web/opendc-web-ui/build.gradle.kts b/opendc-web/opendc-web-ui/build.gradle.kts
deleted file mode 100644
index 777098d4..00000000
--- a/opendc-web/opendc-web-ui/build.gradle.kts
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-import com.github.gradle.node.npm.task.NpmTask
-
-description = "Web interface for OpenDC"
-
-plugins {
- `java-conventions`
- id("com.github.node-gradle.node")
-}
-
-sourceSets {
- main {
- java.srcDir("src")
- }
- test {
- java.srcDir("test")
- }
-}
-
-node {
- download.set(true)
- version.set(libs.versions.node.get())
-}
-
-val formatTask =
- tasks.register<NpmTask>("prettierFormat") {
- group = "formatting"
- description = "Use Prettier to format the JavaScript codebase"
-
- args.set(listOf("run", "format"))
- dependsOn(tasks.npmInstall)
- inputs.dir("src")
- inputs.files("package.json", "next.config.js", ".prettierrc.yaml")
- outputs.upToDateWhen { true }
- }
-
-val lintTask =
- tasks.register<NpmTask>("nextLint") {
- group = "verification"
- description = "Use ESLint to check for problems"
-
- args.set(listOf("run", "lint"))
- dependsOn(tasks.npmInstall)
- inputs.dir("src")
- inputs.files("package.json", "next.config.js", ".eslintrc")
- outputs.upToDateWhen { true }
- }
-
-tasks.register<NpmTask>("nextDev") {
- group = "build"
- description = "Run the Next.js project in development mode"
-
- args.set(listOf("run", "dev"))
- dependsOn(tasks.npmInstall)
- inputs.dir(project.fileTree("src"))
- inputs.dir("node_modules")
- inputs.files("package.json", "next.config.js")
- outputs.upToDateWhen { true }
-}
-
-val buildTask =
- tasks.register<NpmTask>("nextBuild") {
- group = "build"
- description = "Build the Next.js project"
-
- args.set(listOf("run", "build"))
-
- val env =
- listOf(
- "NEXT_PUBLIC_API_BASE_URL",
- "NEXT_PUBLIC_SENTRY_DSN",
- "NEXT_PUBLIC_AUTH0_DOMAIN",
- "NEXT_PUBLIC_AUTH0_CLIENT_ID",
- "NEXT_PUBLIC_AUTH0_AUDIENCE",
- )
- for (envvar in env) {
- environment.put(envvar, "%%$envvar%%")
- }
-
- dependsOn(tasks.npmInstall)
- inputs.dir(project.fileTree("src"))
- inputs.dir("node_modules")
- inputs.files("package.json", "next.config.js")
- outputs.dir(layout.buildDirectory.dir("next"))
- }
-
-tasks.register<NpmTask>("nextStart") {
- group = "build"
- description = "Build the Next.js project"
-
- args.set(listOf("run", "start"))
-
- dependsOn(buildTask)
- dependsOn(tasks.npmInstall)
-
- inputs.dir(project.fileTree("src"))
- inputs.dir("node_modules")
- inputs.files("package.json", "next.config.js")
- outputs.upToDateWhen { true }
-}
-
-tasks.processResources {
- dependsOn(buildTask)
- inputs.dir(project.fileTree("public"))
-
- from(layout.buildDirectory.dir("next")) {
- include("routes-manifest.json")
- into("META-INF/resources/${project.name}")
- }
-
- from(layout.buildDirectory.dir("next/static")) {
- into("META-INF/resources/${project.name}/static/_next/static")
- }
-
- from(layout.buildDirectory.dir("next/server/pages")) {
- include("**/*.html")
- into("META-INF/resources/${project.name}/pages")
- }
-
- from(project.fileTree("public")) {
- into("META-INF/resources/${project.name}/static")
- }
-}
diff --git a/opendc-web/opendc-web-ui/scripts/envsubst.sh b/opendc-web/opendc-web-ui/scripts/envsubst.sh
deleted file mode 100755
index afc976ed..00000000
--- a/opendc-web/opendc-web-ui/scripts/envsubst.sh
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/sh
-
-set -e
-
-auto_envsubst() {
- input_path="build/next.template"
- output_path="build/next"
-
- cp -r "$input_path" "$output_path"
- find "$output_path" -type f -name '*.js' -exec perl -pi -e 's/%%(NEXT_PUBLIC_[_A-Z0-9]+)%%/$ENV{$1}/g' {} \;
-}
-
-auto_envsubst
-exit 0