diff --git a/.agent/agent.yaml b/.agent/agent.yaml
new file mode 100644
index 00000000000..d77b7e7ce3c
--- /dev/null
+++ b/.agent/agent.yaml
@@ -0,0 +1,68 @@
+# ============================================================================
+# Antigravity Agent Configuration
+# ============================================================================
+# This file defines which rules the agent must follow and which tools
+# it may use when modifying this repository.
+# ============================================================================
+
+version: 1
+
+# ----------------------------------------------------------------------------
+# Rule ingestion
+# ----------------------------------------------------------------------------
+rules:
+ include:
+ - rules/formatting.md
+
+ # Enforcement level for loaded rules.
+ # Values depend on Antigravity build; common ones: strict | hard | blocking.
+ enforcement: strict
+
+# ----------------------------------------------------------------------------
+# System instructions appended to the agent prompt
+# ----------------------------------------------------------------------------
+system_prompt_append: |
+ You are working in a C++ / Qt codebase.
+ Before creating or modifying any C++ source or header files:
+
+ 1. Read and follow .agent/rules/formatting.md.
+ 2. Insert the mandatory file header template for new files.
+ 3. Run clang-format using the repository root .clang-format file.
+ 4. Do not reflow license headers or separator banners.
+ 5. Avoid formatting-only diffs unless required.
+
+# ----------------------------------------------------------------------------
+# Tooling permissions
+# ----------------------------------------------------------------------------
+tools:
+ enabled:
+ - clang-format
+ - git
+ - shell
+
+# ----------------------------------------------------------------------------
+# Formatting automation (optional but recommended)
+# ----------------------------------------------------------------------------
+formatting:
+ auto_run: clang-format
+ config: .clang-format
+
+# ----------------------------------------------------------------------------
+# Language / project hints
+# ----------------------------------------------------------------------------
+project:
+ languages:
+ - cpp
+ - cxx
+ - h
+ - hpp
+
+ frameworks:
+ - qt
+
+# ----------------------------------------------------------------------------
+# Safety rails for autonomous edits
+# ----------------------------------------------------------------------------
+policies:
+ avoid_large_formatting_only_commits: true
+ require_rules_compliance: true
diff --git a/.agent/rules/formatting.md b/.agent/rules/formatting.md
new file mode 100644
index 00000000000..3ca1c509575
--- /dev/null
+++ b/.agent/rules/formatting.md
@@ -0,0 +1,213 @@
+# Formatting & Code Style Rules (C++ / Qt / MNE-CPP)
+
+These rules define the canonical formatting for all C++ code in this repository.
+Agents must follow them strictly.
+
+---
+
+## Source of Truth
+
+- Use **clang-format** for all C++ formatting.
+- The canonical configuration is the repository root `.clang-format` file.
+- Do not invent or drift from the configured style.
+
+---
+
+## How to Format
+
+- Before submitting changes that touch C++ code, run clang-format on modified files.
+- Prefer formatting only changed regions when possible to avoid noisy diffs.
+- Recommended commands:
+ - `clang-format -i `
+ - `git clang-format`
+
+---
+
+## Non-Negotiable Style Decisions
+
+(as enforced by `.clang-format`)
+
+- Indentation: **4 spaces**, no tabs.
+- Braces: attached (`class Foo {`).
+- Namespace contents are not extra-indented.
+- Access specifiers (`public:` etc.) aligned with class indentation.
+- No alignment of consecutive assignments or declarations.
+- Constructor initializer lists:
+ - Colon on its own line.
+ - One initializer per line.
+ - No continuation indentation.
+- Do **not** auto-sort includes.
+- Do not reflow comments or license blocks.
+
+---
+
+## Known Formatter Limitations
+
+- clang-format cannot preserve a space before empty function parentheses:
+
+Foo ()
+
+
+Expect normalization to:
+
+Foo()
+
+
+- Do not manually fight the formatter unless explicitly instructed.
+
+---
+
+## Include Handling
+
+- Preserve include section headers:
+
+//=============================================================================================================
+// QT INCLUDES
+//=============================================================================================================
+
+
+- Maintain manual grouping.
+- Keep ordering stable unless functionally required.
+
+---
+
+## Comment & Banner Rules
+
+- Separator lines must remain unchanged:
+
+//=============================================================================================================
+
+
+- Do not wrap or shorten.
+- Do not reflow Doxygen or license blocks.
+
+---
+
+# File Header Template (MANDATORY)
+
+All new `.h` and `.cpp` files MUST begin with this exact structure.
+
+---
+
+## Canonical Header Pattern
+
+```cpp
+//=============================================================================================================
+/**
+* @file
+* @author
+* @since
+* @date
+*
+* @section LICENSE
+*
+* Copyright (C) , . All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without modification, are permitted provided that
+* the following conditions are met:
+* * Redistributions of source code must retain the above copyright notice, this list of conditions and the
+* following disclaimer.
+* * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
+* the following disclaimer in the documentation and/or other materials provided with the distribution.
+* * Neither the name of MNE-CPP authors nor the names of its contributors may be used
+* to endorse or promote products derived from this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+* POSSIBILITY OF SUCH DAMAGE.
+*
+*
+* @brief .
+*
+*/
+Header Rules
+The separator must be exactly:
+
+//=============================================================================================================
+Replace placeholders only — never change structure.
+
+Do not compress or rewrite license text.
+
+This header comes before includes, namespaces, or pragmas.
+
+Canonical Examples
+These examples show the expected output shape after formatting.
+
+Header Layout
+#ifndef MAINSPLASHSCREEN_H
+#define MAINSPLASHSCREEN_H
+
+//=============================================================================================================
+// QT INCLUDES
+//=============================================================================================================
+
+#include
+#include
+
+namespace MNESCAN
+{
+
+class MainSplashScreen : public QSplashScreen
+{
+ Q_OBJECT
+
+public:
+ typedef QSharedPointer SPtr;
+ typedef QSharedPointer ConstSPtr;
+
+ MainSplashScreen();
+ explicit MainSplashScreen(const QPixmap & pixmap);
+ MainSplashScreen(const QPixmap & pixmap, Qt::WindowFlags f);
+
+ virtual ~MainSplashScreen();
+};
+
+} // NAMESPACE
+
+#endif // MAINSPLASHSCREEN_H
+Constructor Definitions
+MainSplashScreen::MainSplashScreen()
+: MainSplashScreen(QPixmap())
+{
+}
+
+MainSplashScreen::MainSplashScreen(const QPixmap & pixmap)
+: MainSplashScreen(pixmap, Qt::Widget)
+{
+}
+
+MainSplashScreen::MainSplashScreen(const QPixmap & pixmap, Qt::WindowFlags f)
+: QSplashScreen(pixmap, f)
+{
+}
+Destructor
+MainSplashScreen::~MainSplashScreen()
+{
+ // ToDo cleanup work
+}
+Enforcement Philosophy
+Prefer mechanical formatting over manual tweaks.
+
+Avoid formatting-only commits unless required.
+
+When touching legacy code, reformat only the modified regions.
+
+If output deviates from these examples, treat it as an error.
+
+
+---
+
+If you want, the next logical step is a **`.agent/rules/file-structure.md`** covering:
+
+- include guard naming,
+- header/implementation pairing,
+- namespace rules,
+- directory layout,
+- Qt macro placement,
+
+which would make agents nearly indistinguishable from a human contributor in this repo.
\ No newline at end of file
diff --git a/.clang-format b/.clang-format
new file mode 100644
index 00000000000..c215fc2d73f
--- /dev/null
+++ b/.clang-format
@@ -0,0 +1,78 @@
+# .clang-format (Qt-Creator-ish / MNE-CPP-ish)
+Language: Cpp
+
+# --- Indentation / tabs ---
+IndentWidth: 4
+TabWidth: 4
+UseTab: Never
+
+# --- Braces / blocks ---
+BreakBeforeBraces: Attach # class {, function {, namespace { on same line
+IndentBraces: false
+BraceWrapping:
+ AfterClass: false
+ AfterControlStatement: false
+ AfterEnum: false
+ AfterFunction: false
+ AfterNamespace: false
+ AfterStruct: false
+ AfterUnion: false
+ BeforeCatch: false
+ BeforeElse: false
+ SplitEmptyFunction: false
+ SplitEmptyRecord: false
+ SplitEmptyNamespace: false
+
+# --- Namespaces ---
+NamespaceIndentation: None
+CompactNamespaces: false
+
+# --- Access specifiers ---
+IndentAccessModifiers: false
+AccessModifierOffset: 0
+
+# --- switch/case ---
+IndentCaseLabels: false
+
+# --- Alignment ---
+AlignConsecutiveAssignments: false
+AlignConsecutiveDeclarations: false
+AlignOperands: DontAlign
+AlignTrailingComments: false
+
+# --- Spacing ---
+# NOTE: clang-format cannot enforce a space before the parentheses in function
+# declarations/definitions like: MainSplashScreen::MainSplashScreen ()
+# That part would require a separate tool (e.g., clang-tidy custom check) or manual.
+SpaceBeforeParens: ControlStatements # if (x), while (x), for (x)
+SpacesInParentheses: false
+SpacesInSquareBrackets: false
+SpaceInEmptyParentheses: false
+
+# Pointer/reference spacing: match "const QPixmap & pixmap"
+PointerAlignment: Left # affects '*' placement (Type* var)
+ReferenceAlignment: Left # puts '&' with type, not variable
+SpaceAroundPointerQualifiers: Default
+
+# --- Constructor initializer lists (your style) ---
+BreakConstructorInitializers: BeforeColon
+ConstructorInitializerIndentWidth: 0
+ContinuationIndentWidth: 0
+PackConstructorInitializers: Never
+ConstructorInitializerAllOnOneLineOrOnePerLine: true
+# results in:
+# Foo::Foo()
+# : Bar(...)
+# {
+# }
+
+# --- Line breaking / wrapping ---
+ColumnLimit: 0 # do not wrap (keeps your long license lines)
+ReflowComments: false # do not reflow Doxygen/license blocks
+CommentPragmas: '^//={5,}.*$' # treat your "====" separators as pragmas (helps keep them intact)
+SortIncludes: false
+
+# --- Short statements ---
+AllowShortIfStatementsOnASingleLine: Never
+AllowShortLoopsOnASingleLine: false
+AllowShortFunctionsOnASingleLine: None
diff --git a/.github/workflows/buildqtbinaries.yml b/.github/workflows/buildqtbinaries.yml
index 028ad2f2986..befcee8946d 100644
--- a/.github/workflows/buildqtbinaries.yml
+++ b/.github/workflows/buildqtbinaries.yml
@@ -1,6 +1,7 @@
name: BuildQtBinaries
on:
+ workflow_dispatch:
push:
branches:
# Change this to the branch name which you are developing on to trigger the workflow
@@ -8,113 +9,128 @@ on:
jobs:
GenerateLinuxStaticBinaries:
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-24.04
steps:
- name: Clone repository
uses: actions/checkout@v3
- - name: Install OpenGL
+ - name: Install dependencies
run: |
- sudo apt-get install build-essential libgl1-mesa-dev
+ sudo apt-get update -q
+ sudo apt-get install -q build-essential libgl1-mesa-dev libvulkan-dev ninja-build
- name: Compile static Qt version
run: |
- # Clone Qt5 repo
+ # Clone Qt6 repo
cd ..
- git clone https://code.qt.io/qt/qt5.git -b 5.15.2
+ git clone https://code.qt.io/qt/qt5.git -b v6.10.2
cd qt5
- ./init-repository -f --module-subset=qtbase,qtcharts,qtsvg,qt3d
+ ./init-repository -f --module-subset=qtbase,qtsvg,qtshadertools
# Create shadow build folder
cd ..
- mkdir qt5_shadow
- cd qt5_shadow
- # Configure Qt5
- ../qt5/configure -static -release -prefix "../Qt5_binaries" -skip webengine -nomake tools -nomake tests -nomake examples -no-dbus -no-ssl -no-pch -opensource -confirm-license -bundled-xcb-xinput -qt-libpng -qt-pcre
- make module-qtbase module-qtsvg module-qtcharts module-qt3d -j4
- make install -j4
+ mkdir qt6_shadow
+ cd qt6_shadow
+ # Configure Qt6
+ ../qt5/configure -static -release -prefix "../Qt6_binaries" -skip webengine -nomake tools -nomake tests -nomake examples -no-dbus -no-ssl -no-pch -opensource -confirm-license -qt-libpng -qt-pcre -- -DCMAKE_BUILD_TYPE=Release
+ cmake --build . --parallel $(nproc)
+ cmake --install .
- name: Package binaries
run: |
- # Create archive of the pre-built Qt binaries
- tar cfvz qt5_5152_static_binaries_linux.tar.gz ../Qt5_binaries/.
- - uses: actions/upload-artifact@v1
+ tar cfvz qt6_6102_static_binaries_linux.tar.gz -C ../Qt6_binaries .
+ - uses: actions/upload-artifact@v4
with:
- name: qt5_5152_static_binaries_linux.tar.gz
- path: qt5_5152_static_binaries_linux.tar.gz
+ name: qt6_6102_static_binaries_linux.tar.gz
+ path: qt6_6102_static_binaries_linux.tar.gz
+ - name: Create qt_binaries release and upload
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ gh release create qt_binaries --title "Static Qt Binaries" --notes "Pre-built static Qt 6.10.2 binaries for CI" 2>/dev/null || true
+ gh release upload qt_binaries qt6_6102_static_binaries_linux.tar.gz --clobber
GenerateMacOSStaticBinaries:
- runs-on: macos-latest
+ runs-on: macos-26
steps:
- name: Clone repository
uses: actions/checkout@v3
+ - name: Install dependencies
+ run: |
+ brew install ninja
- name: Compile static Qt version
run: |
- # Clone Qt5 repo
+ # Clone Qt6 repo
cd ..
- git clone https://code.qt.io/qt/qt5.git -b 5.15.2
+ git clone https://code.qt.io/qt/qt5.git -b v6.10.2
cd qt5
- ./init-repository -f --module-subset=qtbase,qtcharts,qtsvg,qt3d
+ ./init-repository -f --module-subset=qtbase,qtsvg,qtshadertools
# Create shadow build folder
cd ..
- mkdir qt5_shadow
- cd qt5_shadow
- # Configure Qt5
- ../qt5/configure -static -release -prefix "../Qt5_binaries" -skip webengine -nomake tools -nomake tests -nomake examples -no-dbus -no-ssl -no-pch -opensource -confirm-license
- make module-qtbase module-qtsvg module-qtcharts module-qt3d -j4
- make install -j4
+ mkdir qt6_shadow
+ cd qt6_shadow
+ # Configure Qt6
+ ../qt5/configure -static -release -prefix "../Qt6_binaries" -skip webengine -nomake tools -nomake tests -nomake examples -no-dbus -no-ssl -no-pch -opensource -confirm-license -- -DCMAKE_BUILD_TYPE=Release
+ cmake --build . --parallel $(sysctl -n hw.ncpu)
+ cmake --install .
- name: Package binaries
run: |
- # Create archive of the pre-built Qt binaries
- tar cfvz qt5_5152_static_binaries_macos.tar.gz ../Qt5_binaries/.
- - uses: actions/upload-artifact@v1
+ tar cfvz qt6_6102_static_binaries_macos.tar.gz -C ../Qt6_binaries .
+ - uses: actions/upload-artifact@v4
with:
- name: qt5_5152_static_binaries_macos.tar.gz
- path: qt5_5152_static_binaries_macos.tar.gz
+ name: qt6_6102_static_binaries_macos.tar.gz
+ path: qt6_6102_static_binaries_macos.tar.gz
+ - name: Upload to qt_binaries release
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ gh release create qt_binaries --title "Static Qt Binaries" --notes "Pre-built static Qt 6.10.2 binaries for CI" 2>/dev/null || true
+ gh release upload qt_binaries qt6_6102_static_binaries_macos.tar.gz --clobber
GenerateWinStaticBinaries:
- runs-on: windows-2019
+ runs-on: windows-2025
steps:
- name: Clone repository
uses: actions/checkout@v3
- - name: Install Python 3.7 version
- uses: actions/setup-python@v4
+ - name: Install Python 3.10 version
+ uses: actions/setup-python@v5
with:
- python-version: '3.7'
+ python-version: '3.10'
architecture: 'x64'
- - name: Install jom
+ - name: Install ninja
run: |
- Invoke-WebRequest https://www.dropbox.com/s/gbf8sdx8wqxcrnd/jom.zip?dl=1 -OutFile .\jom.zip
- expand-archive -path "jom.zip"
- echo "D:\a\mne-cpp\mne-cpp\jom" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
+ choco install ninja
- name: Compile static Qt version
run: |
- # Clone Qt5 repo
+ # Clone Qt6 repo
cd ..
- git clone https://code.qt.io/qt/qt5.git -b 5.15.2
- cd qt5
- perl init-repository -f --module-subset=qtbase,qtcharts,qtsvg,qt3d
+ git clone https://code.qt.io/qt/qt5.git -b v6.10.2
# Create shadow build folder
- cd ..
- mkdir qt5_shadow
- cd qt5_shadow
+ mkdir qt6_shadow
+ cd qt6_shadow
# Setup the compiler
- cmd.exe /c "call `"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat`" && set > %temp%\vcvars.txt"
+ cmd.exe /c "call `"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat`" && set > %temp%\vcvars.txt"
Get-Content "$env:temp\vcvars.txt" | Foreach-Object { if ($_ -match "^(.*?)=(.*)$") { Set-Content "env:\$($matches[1])" $matches[2] } }
- # Configure Qt5
- ..\qt5\configure.bat -release -static -no-pch -optimize-size -opengl desktop -platform win32-msvc -prefix "..\Qt5_binaries" -skip webengine -nomake tools -nomake tests -nomake examples -opensource -confirm-license
- jom -j4
- nmake install
+ # Configure Qt6 (use -init-submodules instead of init-repository which requires /bin/sh)
+ ..\qt5\configure.bat -init-submodules -submodules qtbase,qtsvg,qtshadertools -release -static -no-pch -optimize-size -opengl desktop -platform win32-msvc -prefix "..\Qt6_binaries" -skip webengine -nomake tools -nomake tests -nomake examples -opensource -confirm-license
+ cmake --build . --parallel $env:NUMBER_OF_PROCESSORS
+ cmake --install .
- name: Package binaries
run: |
- # Create archive of the pre-built Qt binaries
- 7z a qt5_5152_static_binaries_win.zip ..\Qt5_binaries
- - uses: actions/upload-artifact@v1
+ cd ..\Qt6_binaries
+ 7z a ..\mne-cpp\qt6_6102_static_binaries_win.zip .
+ - uses: actions/upload-artifact@v4
with:
- name: qt5_5152_static_binaries_win.zip
- path: qt5_5152_static_binaries_win.zip
+ name: qt6_6102_static_binaries_win.zip
+ path: qt6_6102_static_binaries_win.zip
+ - name: Upload to qt_binaries release
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ gh release create qt_binaries --title "Static Qt Binaries" --notes "Pre-built static Qt 6.10.2 binaries for CI" 2>$null
+ gh release upload qt_binaries qt6_6102_static_binaries_win.zip --clobber
GenerateWasmBinaries:
- runs-on: ubuntu-latest
+ runs-on: ubuntu-24.04
steps:
- name: Clone repository
@@ -122,33 +138,50 @@ jobs:
- name: Setup emscripten compiler
run: |
cd ..
- # Get the emsdk repo
git clone https://github.com/emscripten-core/emsdk.git
- # Enter that directory and pull
cd emsdk
git pull
- # Download and install the latest SDK tools.
- ./emsdk install 1.39.7
+ ./emsdk install 4.0.7
+ ./emsdk activate 4.0.7
+ - name: Install dependencies
+ run: |
+ sudo apt-get update -q
+ sudo apt-get install -q build-essential libgl1-mesa-dev libvulkan-dev ninja-build
+ - name: Build host Qt (needed for cross-compilation)
+ run: |
+ cd ..
+ # Clone Qt6 repo
+ git clone https://code.qt.io/qt/qt5.git -b v6.10.2
+ cd qt5
+ ./init-repository -f --module-subset=qtbase,qtsvg,qtshadertools
+ # Build minimal host Qt
+ cd ..
+ mkdir qt6_host_build
+ cd qt6_host_build
+ ../qt5/configure -release -prefix "$PWD/../Qt6_host" -skip webengine -nomake tools -nomake tests -nomake examples -no-dbus -no-ssl -no-pch -opensource -confirm-license -- -DCMAKE_BUILD_TYPE=Release
+ cmake --build . --parallel $(nproc)
+ cmake --install .
- name: Compile wasm Qt version
run: |
cd ..
- # Make the "latest" emscripten SDK "active" for the current user.
- ./emsdk/emsdk activate 1.39.7
- # Activate PATH and other environment variables in the current terminal
source ./emsdk/emsdk_env.sh
- # Clone Qt5 repo
- git clone https://code.qt.io/qt/qt5.git -b 5.15.2
- cd qt5
- ./init-repository -f --module-subset=qtbase,qtcharts,qtsvg
- # Configure Qt5
- ./configure -xplatform wasm-emscripten -feature-thread -skip webengine -nomake tests -nomake examples -no-dbus -no-ssl -no-pch -opensource -confirm-license -prefix "$PWD/../Qt5_binaries"
- make module-qtbase module-qtsvg module-qtcharts -j4
- make install -j4
+ # Create shadow build folder
+ mkdir qt6_shadow
+ cd qt6_shadow
+ # Configure Qt6 for wasm (use the host Qt we just built)
+ ../qt5/configure -qt-host-path "$PWD/../Qt6_host" -xplatform wasm-emscripten -feature-thread -skip webengine -nomake tests -nomake examples -no-dbus -no-ssl -no-pch -opensource -confirm-license -prefix "$PWD/../Qt6_binaries" -- -DCMAKE_BUILD_TYPE=Release
+ cmake --build . --parallel $(nproc)
+ cmake --install .
- name: Package binaries
run: |
- # Create archive of the pre-built Qt binaries
- tar cfvz qt5_5152_static_binaries_wasm.tar.gz ../Qt5_binaries/.
- - uses: actions/upload-artifact@v1
+ tar cfvz qt6_6102_static_binaries_wasm.tar.gz -C ../Qt6_binaries .
+ - uses: actions/upload-artifact@v4
with:
- name: qt5_5152_static_binaries_wasm.tar.gz
- path: qt5_5152_static_binaries_wasm.tar.gz
+ name: qt6_6102_static_binaries_wasm.tar.gz
+ path: qt6_6102_static_binaries_wasm.tar.gz
+ - name: Upload to qt_binaries release
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ gh release create qt_binaries --title "Static Qt Binaries" --notes "Pre-built static Qt 6.10.2 binaries for CI" 2>/dev/null || true
+ gh release upload qt_binaries qt6_6102_static_binaries_wasm.tar.gz --clobber
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
new file mode 100644
index 00000000000..a7d489722e1
--- /dev/null
+++ b/.github/workflows/codeql.yml
@@ -0,0 +1,62 @@
+name: "CodeQL"
+
+on:
+ push:
+ branches: [ "main", "v2.0-dev" ]
+ pull_request:
+ # The branches below must be a subset of the branches above
+ branches: [ "main" ]
+ schedule:
+ - cron: '28 15 * * 1'
+
+jobs:
+ analyze:
+ name: Analyze
+ runs-on: ubuntu-24.04
+ permissions:
+ actions: read
+ contents: read
+ security-events: write
+
+ strategy:
+ fail-fast: false
+ matrix:
+ language: [ 'cpp' ]
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v3
+
+ - name: Install Python 3.10
+ uses: actions/setup-python@v5
+ with:
+ python-version: '3.10'
+
+ - name: Install Qt
+ uses: jurplel/install-qt-action@v3
+ with:
+ version: 6.10.2
+ modules: qtshadertools
+
+ # Initialize CodeQL tools for scanning.
+ - name: Initialize CodeQL
+ uses: github/codeql-action/init@v4
+ with:
+ languages: ${{ matrix.language }}
+ # If you wish to specify custom queries, you can do so here or in a config file.
+ # By default, queries listed here will override any specified in a config file.
+ # Prefix the list here with "+" to use these queries and those in the config file.
+
+ # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
+ # queries: security-extended,security-and-quality
+
+ # Build MNE-CPP
+ - name: Configure and compile MNE-CPP
+ run: |
+ cmake -B build -S . -DCMAKE_BUILD_TYPE=Release
+ cmake --build build
+
+ - name: Perform CodeQL Analysis
+ uses: github/codeql-action/analyze@v4
+ with:
+ category: "/language:${{ matrix.language }}"
diff --git a/.github/workflows/coverity.yml b/.github/workflows/coverity.yml
index d2a736e3e6f..243b5298bc4 100644
--- a/.github/workflows/coverity.yml
+++ b/.github/workflows/coverity.yml
@@ -5,20 +5,20 @@ on:
jobs:
ScanLinux:
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-24.04
steps:
- name: Clone repository
uses: actions/checkout@v3
- - name: Install Python 3.7 version
- uses: actions/setup-python@v4
+ - name: Install Python 3.10 version
+ uses: actions/setup-python@v5
with:
- python-version: '3.7'
+ python-version: '3.10'
architecture: 'x64'
- name: Install Qt
uses: jurplel/install-qt-action@v3
with:
- version: 5.15.2
- modules: qtcharts
+ version: 6.10.2
+ modules: qtshadertools
- name: Coverity scripts
run: |
./tools/coverity_scan.sh "$COVTOKEN"
diff --git a/.github/workflows/pullrequest.yml b/.github/workflows/pullrequest.yml
index 6d65be22b51..fe9385630d9 100644
--- a/.github/workflows/pullrequest.yml
+++ b/.github/workflows/pullrequest.yml
@@ -3,7 +3,7 @@ name: PullRequest
on:
pull_request:
branches:
- - main
+ - v2.0-dev
jobs:
MinQtDynamic:
@@ -13,66 +13,30 @@ jobs:
fail-fast: false
max-parallel: 3
matrix:
- qt: [5.10.1]
- os: [ubuntu-20.04, macos-11, windows-2019]
+ qt: [6.10.2]
+ os: [ubuntu-24.04, macos-26, windows-2025]
steps:
- name: Clone repository
uses: actions/checkout@v3
- - name: Install Python 3.7 version
- uses: actions/setup-python@v4
+ - name: Install Python 3.10 version
+ uses: actions/setup-python@v5
with:
- python-version: '3.7'
- architecture: 'x64'
- - name: Install BrainFlow and LSL submodules
- run: |
- git submodule update --init src/applications/mne_scan/plugins/brainflowboard/brainflow
- git submodule update --init src/applications/mne_scan/plugins/lsladapter/liblsl
+ python-version: '3.10'
+ architecture: ${{ matrix.os == 'macos-26' && 'arm64' || 'x64' }}
- name: Install Qt (Linux|MacOS)
- if: (matrix.os == 'ubuntu-20.04') || (matrix.os == 'macos-11')
+ if: (matrix.os == 'ubuntu-24.04') || (matrix.os == 'macos-26')
uses: jurplel/install-qt-action@v3
with:
version: ${{ matrix.qt }}
- modules: qtcharts
+ modules: qtshadertools
- name: Install Qt (Windows)
- if: matrix.os == 'windows-2019'
+ if: matrix.os == 'windows-2025'
uses: jurplel/install-qt-action@v3
with:
version: ${{ matrix.qt }}
- arch: win64_msvc2017_64
- modules: qtcharts
- - name: Compile BrainFlow submodule (Windows)
- if: matrix.os == 'windows-2019'
- run: |
- cd src\applications\mne_scan\plugins\brainflowboard\brainflow
- mkdir build
- cd build
- cmake -G "Visual Studio 16 2019" -A x64 -DMSVC_RUNTIME=dynamic -DCMAKE_SYSTEM_VERSION=8.1 -DCMAKE_INSTALL_PREFIX="$env:GITHUB_WORKSPACE\applications\mne_scan\plugins\brainflowboard\brainflow\installed" ..
- cmake --build . --target install --config Release
- - name: Compile BrainFlow submodule (Linux|MacOS)
- if: (matrix.os == 'ubuntu-20.04') || (matrix.os == 'macos-11')
- run: |
- cd src/applications/mne_scan/plugins/brainflowboard/brainflow
- mkdir build
- cd build
- cmake -DCMAKE_INSTALL_PREFIX=../installed -DCMAKE_BUILD_TYPE=Release ..
- cmake --build .
- - name: Compile LSL submodule (Windows)
- if: matrix.os == 'windows-2019'
- run: |
- cd src\applications\mne_scan\plugins\lsladapter\liblsl
- mkdir build
- cd build
- cmake .. -G "Visual Studio 16 2019" -A x64
- cmake --build . --config Release --target install
- - name: Compile LSL submodule (Linux|MacOS)
- if: (matrix.os == 'ubuntu-20.04') || (matrix.os == 'macos-11')
- run: |
- cd src/applications/mne_scan/plugins/lsladapter/liblsl
- mkdir build
- cd build
- cmake ..
- cmake --build .
+ arch: win64_msvc2022_64
+ modules: qtshadertools
- name: Configure and compile MNE-CPP
run: |
./tools/build_project.bat all
@@ -87,66 +51,30 @@ jobs:
fail-fast: false
max-parallel: 3
matrix:
- qt: [5.15.2]
- os: [ubuntu-latest, macos-11, windows-2019]
+ qt: [6.10.2]
+ os: [ubuntu-24.04, macos-26, windows-2025]
steps:
- name: Clone repository
uses: actions/checkout@v3
- - name: Install Python 3.7 version
- uses: actions/setup-python@v4
+ - name: Install Python 3.10 version
+ uses: actions/setup-python@v5
with:
- python-version: '3.7'
- architecture: 'x64'
- - name: Install BrainFlow and LSL submodules
- run: |
- git submodule update --init src/applications/mne_scan/plugins/brainflowboard/brainflow
- git submodule update --init src/applications/mne_scan/plugins/lsladapter/liblsl
+ python-version: '3.10'
+ architecture: ${{ matrix.os == 'macos-26' && 'arm64' || 'x64' }}
- name: Install Qt (Linux|MacOS)
- if: (matrix.os == 'ubuntu-latest') || (matrix.os == 'macos-11')
+ if: (matrix.os == 'ubuntu-24.04') || (matrix.os == 'macos-26')
uses: jurplel/install-qt-action@v3
with:
version: ${{ matrix.qt }}
- modules: qtcharts
+ modules: qtshadertools
- name: Install Qt (Windows)
- if: matrix.os == 'windows-2019'
+ if: matrix.os == 'windows-2025'
uses: jurplel/install-qt-action@v3
with:
version: ${{ matrix.qt }}
- arch: win64_msvc2019_64
- modules: qtcharts
- - name: Compile BrainFlow submodule (Windows)
- if: matrix.os == 'windows-2019'
- run: |
- cd src\applications\mne_scan\plugins\brainflowboard\brainflow
- mkdir build
- cd build
- cmake -G "Visual Studio 16 2019" -A x64 -DMSVC_RUNTIME=dynamic -DCMAKE_SYSTEM_VERSION=8.1 -DCMAKE_INSTALL_PREFIX="$env:GITHUB_WORKSPACE\applications\mne_scan\plugins\brainflowboard\brainflow\installed" ..
- cmake --build . --target install --config Release
- - name: Compile BrainFlow submodule (Linux|MacOS)
- if: (matrix.os == 'ubuntu-latest') || (matrix.os == 'macos-11')
- run: |
- cd src/applications/mne_scan/plugins/brainflowboard/brainflow
- mkdir build
- cd build
- cmake -DCMAKE_INSTALL_PREFIX=../installed -DCMAKE_BUILD_TYPE=Release ..
- cmake --build .
- - name: Compile LSL submodule (Windows)
- if: matrix.os == 'windows-2019'
- run: |
- cd src\applications\mne_scan\plugins\lsladapter\liblsl
- mkdir build
- cd build
- cmake .. -G "Visual Studio 16 2019" -A x64
- cmake --build . --config Release --target install
- - name: Compile LSL submodule (Linux|MacOS)
- if: (matrix.os == 'ubuntu-latest') || (matrix.os == 'macos-11')
- run: |
- cd src/applications/mne_scan/plugins/lsladapter/liblsl
- mkdir build
- cd build
- cmake ..
- cmake --build .
+ arch: win64_msvc2022_64
+ modules: qtshadertools
- name: Configure and compile MNE-CPP
run: |
./tools/build_project.bat all
@@ -154,65 +82,65 @@ jobs:
run: |
./tools/deploy.bat dynamic pack
- QtStatic:
- runs-on: ${{ matrix.os }}
-
- strategy:
- fail-fast: false
- max-parallel: 3
- matrix:
- os: [ubuntu-20.04, macos-11, windows-2019]
-
- steps:
- - name: Clone repository
- uses: actions/checkout@v3
- - name: Install Python 3.7 version
- uses: actions/setup-python@v4
- with:
- python-version: '3.7'
- architecture: 'x64'
- - name: Install OpenGL (Linux)
- if: matrix.os == 'ubuntu-20.04'
- run: |
- sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
- sudo apt-get update -q
- sudo apt-get install build-essential libgl1-mesa-dev libicu55
- - name: Install Qt (Linux)
- if: matrix.os == 'ubuntu-20.04'
- run: |
- # Download the pre-built static version of Qt, which was created with the generateBinaries.yml workflow
- wget -O qt5_5152_static_binaries_linux.tar.gz https://www.dropbox.com/s/tje7jp6tsn2dxdd/qt5_5152_static_binaries_linux.tar.gz?dl=0
- mkdir ../Qt5_binaries
- tar xvzf qt5_5152_static_binaries_linux.tar.gz -C ../ -P
- - name: Install Qt (MacOS)
- if: matrix.os == 'macos-11'
- run: |
- # Download the pre-built static version of Qt, which was created with the generateBinaries.yml workflow
- wget -O qt5_5152_static_binaries_macos.tar.gz https://www.dropbox.com/s/ccigarxk40wlxq0/qt5_5152_static_binaries_macos.tar.gz?dl=1
- tar xvzf qt5_5152_static_binaries_macos.tar.gz -P
- - name: Install Qt (Windows)
- if: matrix.os == 'windows-2019'
- run: |
- # Download the pre-built static version of Qt, which was created with the generateBinaries.yml workflow
- Invoke-WebRequest https://www.dropbox.com/s/47s49smjg499gnm/qt5_5152_static_binaries_win.zip?dl=1 -OutFile .\qt5_5152_static_binaries_win.zip
- expand-archive -path "qt5_5152_static_binaries_win.zip" -destinationpath "..\"
- - name: Configure and compile MNE-CPP (Linux|MacOS)
- if: (matrix.os == 'ubuntu-20.04') || (matrix.os == 'macos-11')
- run: |
- export QT_DIR="$(pwd)/../Qt5_binaries/lib/cmake/Qt5"
- export Qt5_DIR="$(pwd)/../Qt5_binaries/lib/cmake/Qt5"
- ./tools/build_project.bat static all
- - name: Configure and compile MNE-CPP (Windows)
- if: matrix.os == 'windows-2019'
- run: |
- cmd.exe /c "call `"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat`" && set > %temp%\vcvars.txt"
- Get-Content "$env:temp\vcvars.txt" | Foreach-Object { if ($_ -match "^(.*?)=(.*)$") { Set-Content "env:\$($matches[1])" $matches[2] } }
- $env:QT_DIR += "$PWD\..\Qt5_binaries\lib\cmake\Qt5"
- $env:Qt5_DIR += "$PWD\..\Qt5_binaries\lib\cmake\Qt5"
- ./tools/build_project.bat static all
- - name: Deploy binaries
- run: |
- ./tools/deploy.bat static pack
+# QtStatic:
+# runs-on: ${{ matrix.os }}
+#
+# strategy:
+# fail-fast: false
+# max-parallel: 3
+# matrix:
+# os: [ubuntu-20.04, macos-11, windows-2019]
+#
+# steps:
+# - name: Clone repository
+# uses: actions/checkout@v3
+# - name: Install Python 3.7 version
+# uses: actions/setup-python@v4
+# with:
+# python-version: '3.7'
+# architecture: 'x64'
+# - name: Install OpenGL (Linux)
+# if: matrix.os == 'ubuntu-20.04'
+# run: |
+# sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
+# sudo apt-get update -q
+# sudo apt-get install build-essential libgl1-mesa-dev libicu55
+# - name: Install Qt (Linux)
+# if: matrix.os == 'ubuntu-20.04'
+# run: |
+# # Download the pre-built static version of Qt, which was created with the generateBinaries.yml workflow
+# wget -O qt5_5152_static_binaries_linux.tar.gz https://www.dropbox.com/s/tje7jp6tsn2dxdd/qt5_5152_static_binaries_linux.tar.gz?dl=0
+# mkdir ../Qt5_binaries
+# tar xvzf qt5_5152_static_binaries_linux.tar.gz -C ../ -P
+# - name: Install Qt (MacOS)
+# if: matrix.os == 'macos-11'
+# run: |
+# # Download the pre-built static version of Qt, which was created with the generateBinaries.yml workflow
+# wget -O qt5_5152_static_binaries_macos.tar.gz https://www.dropbox.com/s/ccigarxk40wlxq0/qt5_5152_static_binaries_macos.tar.gz?dl=1
+# tar xvzf qt5_5152_static_binaries_macos.tar.gz -P
+# - name: Install Qt (Windows)
+# if: matrix.os == 'windows-2019'
+# run: |
+# # Download the pre-built static version of Qt, which was created with the generateBinaries.yml workflow
+# Invoke-WebRequest https://www.dropbox.com/s/47s49smjg499gnm/qt5_5152_static_binaries_win.zip?dl=1 -OutFile .\qt5_5152_static_binaries_win.zip
+# expand-archive -path "qt5_5152_static_binaries_win.zip" -destinationpath "..\"
+# - name: Configure and compile MNE-CPP (Linux|MacOS)
+# if: (matrix.os == 'ubuntu-20.04') || (matrix.os == 'macos-11')
+# run: |
+# export QT_DIR="$(pwd)/../Qt5_binaries/lib/cmake/Qt5"
+# export Qt5_DIR="$(pwd)/../Qt5_binaries/lib/cmake/Qt5"
+# ./tools/build_project.bat static all
+# - name: Configure and compile MNE-CPP (Windows)
+# if: matrix.os == 'windows-2019'
+# run: |
+# cmd.exe /c "call `"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat`" && set > %temp%\vcvars.txt"
+# Get-Content "$env:temp\vcvars.txt" | Foreach-Object { if ($_ -match "^(.*?)=(.*)$") { Set-Content "env:\$($matches[1])" $matches[2] } }
+# $env:QT_DIR += "$PWD\..\Qt5_binaries\lib\cmake\Qt5"
+# $env:Qt5_DIR += "$PWD\..\Qt5_binaries\lib\cmake\Qt5"
+# ./tools/build_project.bat static all
+# - name: Deploy binaries
+# run: |
+# ./tools/deploy.bat static pack
Tests:
runs-on: ${{ matrix.os }}
@@ -221,67 +149,94 @@ jobs:
fail-fast: false
max-parallel: 3
matrix:
- os: [ubuntu-20.04, macos-11, windows-2019]
+ os: [ubuntu-24.04, macos-26, windows-2025]
steps:
- name: Clone repository
uses: actions/checkout@v3
- name: Clone mne-cpp test data
run: git clone https://github.com/mne-tools/mne-cpp-test-data.git resources/data/mne-cpp-test-data
- - name: Install Python 3.7 version
- uses: actions/setup-python@v4
+ - name: Install Python 3.10 version
+ uses: actions/setup-python@v5
with:
- python-version: '3.7'
- architecture: 'x64'
- - name: Install Codecov
- if: matrix.os == 'ubuntu-20.04'
- run: |
- curl -Os https://uploader.codecov.io/latest/linux/codecov
- chmod +x codecov
- echo "${pwd}" >> $GITHUB_PATH
+ python-version: '3.10'
+ architecture: ${{ matrix.os == 'macos-26' && 'arm64' || 'x64' }}
- name: Install Qt (Linux|MacOS)
- if: (matrix.os == 'ubuntu-20.04') || (matrix.os == 'macos-11')
+ if: (matrix.os == 'ubuntu-24.04') || (matrix.os == 'macos-26')
uses: jurplel/install-qt-action@v3
with:
- version: 5.15.2
- modules: qtcharts
+ version: 6.10.2
+ modules: qtshadertools
- name: Install Qt (Windows)
- if: matrix.os == 'windows-2019'
+ if: matrix.os == 'windows-2025'
uses: jurplel/install-qt-action@v3
with:
- version: 5.15.2
- arch: win64_msvc2019_64
- modules: qtcharts
- - name: Configure and compile MNE-CPP
- if: (matrix.os == 'macos-11') || (matrix.os == 'windows-2019')
- run: |
- ./tools/build_project.bat all
- - name: Configure and compile MNE-CPP
- if: matrix.os == 'ubuntu-20.04'
+ version: 6.10.2
+ arch: win64_msvc2022_64
+ modules: qtshadertools
+ - name: Install MNE-Python
+ run: |
+ pip install --upgrade pip
+ pip install mne numpy scipy
+ - name: Cache MNE sample data
+ id: cache-mne-data
+ uses: actions/cache@v4
+ with:
+ path: ~/mne_data/MNE-sample-data
+ key: mne-sample-data-v1
+ - name: Download MNE sample data
+ if: steps.cache-mne-data.outputs.cache-hit != 'true'
+ run: |
+ python -c "import mne; mne.datasets.sample.data_path()"
+ - name: Configure and compile MNE-CPP (Linux)
+ if: matrix.os == 'ubuntu-24.04'
+ run: |
+ cmake -B build -S . -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=ON -DWITH_CODE_COV=ON
+ cmake --build build
+ - name: Configure and compile MNE-CPP (MacOS)
+ if: matrix.os == 'macos-26'
+ run: |
+ cmake -B build -S . -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=ON
+ cmake --build build
+ - name: Configure and compile MNE-CPP (Windows)
+ if: matrix.os == 'windows-2025'
run: |
- ./tools/build_project.bat coverage all
+ # Setup VS compiler
+ cmd.exe /c "call `"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat`" && set > %temp%\vcvars.txt"
+ Get-Content "$env:temp\vcvars.txt" | Foreach-Object { if ($_ -match "^(.*?)=(.*)$") { Set-Content "env:\$($matches[1])" $matches[2] } }
+ cmake -B build -S . -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=ON
+ cmake --build build --config Release
- name: Run tests (Linux)
- if: matrix.os == 'ubuntu-20.04'
+ if: matrix.os == 'ubuntu-24.04'
env:
- CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
QTEST_FUNCTION_TIMEOUT: 900000
+ QT_QPA_PLATFORM: offscreen
+ MNE_DATA: ~/mne_data
run: |
./tools/test_all.bat verbose withCoverage
+ - name: Upload coverage to Codecov
+ if: matrix.os == 'ubuntu-24.04'
+ uses: codecov/codecov-action@v4
+ with:
+ token: ${{ secrets.CODECOV_TOKEN }}
- name: Run tests (MacOS)
- if: matrix.os == 'macos-11'
+ if: matrix.os == 'macos-26'
env:
QTEST_FUNCTION_TIMEOUT: 900000
+ QT_QPA_PLATFORM: offscreen
+ MNE_DATA: ~/mne_data
run: |
- ./tools/test_all.bat verbose
+ ./tools/test_all.bat Release verbose
- name: Run tests (Windows)
- if: matrix.os == 'windows-2019'
+ if: matrix.os == 'windows-2025'
env:
QTEST_FUNCTION_TIMEOUT: 900000
+ MNE_DATA: ~/mne_data
run: |
./tools/test_all.bat Release verbose
Doxygen:
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-latest
steps:
- name: Clone repository
diff --git a/.github/workflows/release-installer.yml b/.github/workflows/release-installer.yml
new file mode 100644
index 00000000000..440b9ab92d7
--- /dev/null
+++ b/.github/workflows/release-installer.yml
@@ -0,0 +1,661 @@
+name: Release Installer
+
+# This workflow builds platform-specific installers using the Qt Installer
+# Framework (QIF). It is called by release.yml AFTER the Linux, macOS, and
+# Windows release builds have completed successfully, and downloads the
+# already-uploaded release archives from GitHub Releases.
+
+on:
+ workflow_call:
+
+env:
+ # Qt Installer Framework version
+ QIF_VERSION: "4.7"
+ QIF_TOOL_ID: "qt.tools.ifw.47"
+ MNE_CPP_VERSION: "2.0.0"
+
+jobs:
+ # =========================================================================
+ # Linux Installer (.run)
+ # =========================================================================
+ LinuxInstaller:
+ runs-on: ubuntu-24.04
+
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@v3
+
+ - name: Install Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: '3.10'
+
+ - name: Install Qt Installer Framework
+ run: |
+ sudo apt-get update -qq
+ sudo apt-get install -y -qq \
+ libxkbcommon-x11-0 \
+ libxcb-icccm4 \
+ libxcb-image0 \
+ libxcb-keysyms1 \
+ libxcb-randr0 \
+ libxcb-render-util0 \
+ libxcb-shape0 \
+ libxcb-xinerama0 \
+ libxcb-xkb1 \
+ libxcb-cursor0
+ pip install aqtinstall
+ aqt install-tool linux desktop tools_ifw ${{ env.QIF_TOOL_ID }} --outputdir $RUNNER_TOOL_CACHE/Qt
+ echo "$RUNNER_TOOL_CACHE/Qt/Tools/QtInstallerFramework/${{ env.QIF_VERSION }}/bin" >> $GITHUB_PATH
+
+ - name: Determine release tag
+ id: tag
+ run: |
+ if [[ "$GITHUB_REF" == refs/tags/* ]]; then
+ echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
+ echo "asset_prefix=mne-cpp-${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
+ else
+ echo "tag=dev_build" >> $GITHUB_OUTPUT
+ echo "asset_prefix=mne-cpp-v2.0-dev" >> $GITHUB_OUTPUT
+ fi
+
+ - name: Download dynamic release from GitHub Releases
+ env:
+ GH_TOKEN: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }}
+ run: |
+ ASSET="${{ steps.tag.outputs.asset_prefix }}-linux-dynamic-x86_64.tar.gz"
+ echo "Downloading ${ASSET} from release ${{ steps.tag.outputs.tag }}..."
+ gh release download "${{ steps.tag.outputs.tag }}" -p "${ASSET}" -D /tmp
+ echo "RELEASE_ARCHIVE=/tmp/${ASSET}" >> $GITHUB_ENV
+
+ - name: Stage release into QIF package layout
+ run: |
+ STAGING="tools/packaging/installer/packages"
+
+ # CLI tools (QCoreApplication-based, no GUI dependencies)
+ CLI_APPS="mne_anonymize mne_edf2fiff mne_show_fiff mne_compute_raw_inverse mne_forward_solution mne_setup_mri mne_surf2bem mne_setup_forward_model mne_watershed_bem mne_flash_bem mne_rt_server mne_dipole_fit"
+
+ # GUI applications (QApplication-based, require display)
+ GUI_APPS="mne_scan mne_analyze mne_browse mne_inspect"
+
+ # --- Extract full archive to temp ---
+ EXTRACT_DIR="$(mktemp -d)"
+ tar xf "$RELEASE_ARCHIVE" -C "$EXTRACT_DIR" 2>/dev/null || true
+ # Find the actual content root
+ CONTENT_DIR="$EXTRACT_DIR"
+ if ls "$EXTRACT_DIR"/mne-cpp*/ 1>/dev/null 2>&1; then
+ CONTENT_DIR="$(ls -d "$EXTRACT_DIR"/mne-cpp*/ | head -1)"
+ fi
+
+ # --- CLI Tools → org.mnecpp.applications.cli ---
+ CLI_DATA="${STAGING}/org.mnecpp.applications.cli/data"
+ mkdir -p "${CLI_DATA}/bin"
+ for app in $CLI_APPS; do
+ if [ -f "$CONTENT_DIR/bin/$app" ]; then
+ cp "$CONTENT_DIR/bin/$app" "${CLI_DATA}/bin/"
+ fi
+ done
+
+ # --- GUI Apps → org.mnecpp.applications.gui ---
+ GUI_DATA="${STAGING}/org.mnecpp.applications.gui/data"
+ mkdir -p "${GUI_DATA}/bin"
+ for app in $GUI_APPS; do
+ if [ -f "$CONTENT_DIR/bin/$app" ]; then
+ cp "$CONTENT_DIR/bin/$app" "${GUI_DATA}/bin/"
+ elif [ -d "$CONTENT_DIR/bin/${app}.app" ]; then
+ cp -r "$CONTENT_DIR/bin/${app}.app" "${GUI_DATA}/bin/"
+ fi
+ done
+
+ # --- All apps also in the legacy parent component (backward compat) ---
+ APP_DATA="${STAGING}/org.mnecpp.applications/data"
+ mkdir -p "${APP_DATA}/bin"
+ if [ -d "$CONTENT_DIR/bin" ]; then
+ cp -r "$CONTENT_DIR/bin/"* "${APP_DATA}/bin/" 2>/dev/null || true
+ fi
+
+ # Runtime — lib/
+ RT_DATA="${STAGING}/org.mnecpp.runtime/data"
+ mkdir -p "${RT_DATA}/lib"
+ if [ -d "$CONTENT_DIR/lib" ]; then
+ cp -r "$CONTENT_DIR/lib/"* "${RT_DATA}/lib/" 2>/dev/null || true
+ fi
+
+ # SDK — include/ + lib/cmake/
+ SDK_DATA="${STAGING}/org.mnecpp.sdk/data"
+ mkdir -p "${SDK_DATA}/include"
+ # Release archives don't ship headers; copy them from the source tree.
+ for lib_dir in src/libraries/*/; do
+ lib_name=$(basename "$lib_dir")
+ [ "$lib_name" = "CMakeLists.txt" ] && continue
+ find "$lib_dir" -name '*.h' | while read hdr; do
+ rel="${hdr#src/libraries/}"
+ dest_dir="${SDK_DATA}/include/$(dirname "$rel")"
+ mkdir -p "$dest_dir"
+ cp "$hdr" "$dest_dir/"
+ done
+ done
+ if [ -d "$CONTENT_DIR/include" ]; then
+ cp -r "$CONTENT_DIR/include/"* "${SDK_DATA}/include/" 2>/dev/null || true
+ fi
+ if [ -d "$CONTENT_DIR/lib/cmake" ]; then
+ mkdir -p "${SDK_DATA}/lib"
+ cp -r "$CONTENT_DIR/lib/cmake" "${SDK_DATA}/lib/" 2>/dev/null || true
+ fi
+
+ # Scripts (sample data / mne-python / path config)
+ for comp in org.mnecpp.sampledata org.mnecpp.mnepython org.mnecpp.pathconfig; do
+ mkdir -p "${STAGING}/${comp}/data/scripts"
+ done
+ cp tools/packaging/scripts/download_sample_data.sh "${STAGING}/org.mnecpp.sampledata/data/scripts/"
+ cp tools/packaging/scripts/download_sample_data.bat "${STAGING}/org.mnecpp.sampledata/data/scripts/"
+ cp tools/packaging/scripts/install_mne_python.sh "${STAGING}/org.mnecpp.mnepython/data/scripts/"
+ cp tools/packaging/scripts/install_mne_python.bat "${STAGING}/org.mnecpp.mnepython/data/scripts/"
+ cp tools/packaging/scripts/configure_environment.sh "${STAGING}/org.mnecpp.pathconfig/data/scripts/"
+ cp tools/packaging/scripts/configure_environment.bat "${STAGING}/org.mnecpp.pathconfig/data/scripts/"
+
+ # Clean up temp
+ rm -rf "$EXTRACT_DIR"
+
+ echo "Staged package layout:"
+ find tools/packaging/installer -type f | head -80
+
+ - name: Build installer with binarycreator
+ run: |
+ binarycreator \
+ --offline-only \
+ -c tools/packaging/installer/config/config.xml \
+ -p tools/packaging/installer/packages \
+ MNE-CPP-${{ env.MNE_CPP_VERSION }}-Linux.run
+
+ ls -lh MNE-CPP-*.run
+
+ - name: Deploy installer (stable release)
+ if: startsWith(github.ref, 'refs/tags/')
+ uses: svenstaro/upload-release-action@v2
+ with:
+ repo_token: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }}
+ file: MNE-CPP-*-Linux.run
+ file_glob: true
+ asset_name: mne-cpp-${{ github.ref_name }}-linux-installer-x86_64.run
+ tag: ${{ github.ref }}
+ overwrite: true
+
+ - name: Deploy installer (dev release)
+ if: endsWith(github.ref, 'v2.0-dev') == true
+ uses: svenstaro/upload-release-action@v2
+ with:
+ repo_token: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }}
+ file: MNE-CPP-*-Linux.run
+ file_glob: true
+ asset_name: mne-cpp-v2.0-dev-linux-installer-x86_64.run
+ tag: dev_build
+ overwrite: true
+
+ # =========================================================================
+ # macOS Installer (.dmg)
+ # =========================================================================
+ MacOSInstaller:
+ runs-on: macos-26
+
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@v3
+
+ - name: Install Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: '3.10'
+ architecture: 'arm64'
+
+ - name: Install Qt Installer Framework
+ run: |
+ pip install aqtinstall
+ aqt install-tool mac desktop tools_ifw ${{ env.QIF_TOOL_ID }} --outputdir $RUNNER_TOOL_CACHE/Qt
+ echo "$RUNNER_TOOL_CACHE/Qt/Tools/QtInstallerFramework/${{ env.QIF_VERSION }}/bin" >> $GITHUB_PATH
+
+ - name: Determine release tag
+ id: tag
+ run: |
+ if [[ "$GITHUB_REF" == refs/tags/* ]]; then
+ echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
+ echo "asset_prefix=mne-cpp-${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
+ else
+ echo "tag=dev_build" >> $GITHUB_OUTPUT
+ echo "asset_prefix=mne-cpp-v2.0-dev" >> $GITHUB_OUTPUT
+ fi
+
+ - name: Download dynamic release from GitHub Releases
+ env:
+ GH_TOKEN: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }}
+ run: |
+ ASSET="${{ steps.tag.outputs.asset_prefix }}-macos-dynamic-arm64.tar.gz"
+ echo "Downloading ${ASSET} from release ${{ steps.tag.outputs.tag }}..."
+ gh release download "${{ steps.tag.outputs.tag }}" -p "${ASSET}" -D /tmp
+ echo "RELEASE_ARCHIVE=/tmp/${ASSET}" >> $GITHUB_ENV
+
+ - name: Stage release into QIF package layout
+ run: |
+ STAGING="tools/packaging/installer/packages"
+
+ # CLI tools (QCoreApplication-based, no GUI dependencies)
+ CLI_APPS="mne_anonymize mne_edf2fiff mne_show_fiff mne_compute_raw_inverse mne_forward_solution mne_setup_mri mne_surf2bem mne_setup_forward_model mne_watershed_bem mne_flash_bem mne_rt_server mne_dipole_fit"
+
+ # GUI applications (QApplication-based, require display)
+ GUI_APPS="mne_scan mne_analyze mne_browse mne_inspect"
+
+ # --- Extract full archive to temp ---
+ EXTRACT_DIR="$(mktemp -d)"
+ tar xf "$RELEASE_ARCHIVE" -C "$EXTRACT_DIR" 2>/dev/null || true
+ CONTENT_DIR="$EXTRACT_DIR"
+ if ls "$EXTRACT_DIR"/mne-cpp*/ 1>/dev/null 2>&1; then
+ CONTENT_DIR="$(ls -d "$EXTRACT_DIR"/mne-cpp*/ | head -1)"
+ fi
+
+ # --- CLI Tools → org.mnecpp.applications.cli ---
+ CLI_DATA="${STAGING}/org.mnecpp.applications.cli/data"
+ mkdir -p "${CLI_DATA}/bin"
+ for app in $CLI_APPS; do
+ # macOS: plain binary or .app bundle
+ if [ -f "$CONTENT_DIR/bin/$app" ]; then
+ cp "$CONTENT_DIR/bin/$app" "${CLI_DATA}/bin/"
+ elif [ -d "$CONTENT_DIR/bin/${app}.app" ]; then
+ cp -r "$CONTENT_DIR/bin/${app}.app" "${CLI_DATA}/bin/"
+ fi
+ done
+
+ # --- GUI Apps → org.mnecpp.applications.gui ---
+ GUI_DATA="${STAGING}/org.mnecpp.applications.gui/data"
+ mkdir -p "${GUI_DATA}/bin"
+ for app in $GUI_APPS; do
+ if [ -d "$CONTENT_DIR/bin/${app}.app" ]; then
+ cp -r "$CONTENT_DIR/bin/${app}.app" "${GUI_DATA}/bin/"
+ elif [ -f "$CONTENT_DIR/bin/$app" ]; then
+ cp "$CONTENT_DIR/bin/$app" "${GUI_DATA}/bin/"
+ fi
+ done
+
+ # --- Legacy parent component (backward compat) ---
+ APP_DATA="${STAGING}/org.mnecpp.applications/data"
+ mkdir -p "${APP_DATA}/bin"
+ if [ -d "$CONTENT_DIR/bin" ]; then
+ cp -r "$CONTENT_DIR/bin/"* "${APP_DATA}/bin/" 2>/dev/null || true
+ fi
+
+ # Runtime — lib/
+ RT_DATA="${STAGING}/org.mnecpp.runtime/data"
+ mkdir -p "${RT_DATA}/lib"
+ if [ -d "$CONTENT_DIR/lib" ]; then
+ cp -r "$CONTENT_DIR/lib/"* "${RT_DATA}/lib/" 2>/dev/null || true
+ fi
+
+ # SDK — include/ + lib/cmake/
+ SDK_DATA="${STAGING}/org.mnecpp.sdk/data"
+ mkdir -p "${SDK_DATA}/include"
+ # Release archives don't ship headers; copy from the source tree.
+ for lib_dir in src/libraries/*/; do
+ lib_name=$(basename "$lib_dir")
+ [ "$lib_name" = "CMakeLists.txt" ] && continue
+ find "$lib_dir" -name '*.h' | while read hdr; do
+ rel="${hdr#src/libraries/}"
+ dest_dir="${SDK_DATA}/include/$(dirname "$rel")"
+ mkdir -p "$dest_dir"
+ cp "$hdr" "$dest_dir/"
+ done
+ done
+ if [ -d "$CONTENT_DIR/include" ]; then
+ cp -r "$CONTENT_DIR/include/"* "${SDK_DATA}/include/" 2>/dev/null || true
+ fi
+ if [ -d "$CONTENT_DIR/lib/cmake" ]; then
+ mkdir -p "${SDK_DATA}/lib"
+ cp -r "$CONTENT_DIR/lib/cmake" "${SDK_DATA}/lib/" 2>/dev/null || true
+ fi
+
+ # Scripts
+ for comp in org.mnecpp.sampledata org.mnecpp.mnepython org.mnecpp.pathconfig; do
+ mkdir -p "${STAGING}/${comp}/data/scripts"
+ done
+ cp tools/packaging/scripts/download_sample_data.sh "${STAGING}/org.mnecpp.sampledata/data/scripts/"
+ cp tools/packaging/scripts/download_sample_data.bat "${STAGING}/org.mnecpp.sampledata/data/scripts/"
+ cp tools/packaging/scripts/install_mne_python.sh "${STAGING}/org.mnecpp.mnepython/data/scripts/"
+ cp tools/packaging/scripts/install_mne_python.bat "${STAGING}/org.mnecpp.mnepython/data/scripts/"
+ cp tools/packaging/scripts/configure_environment.sh "${STAGING}/org.mnecpp.pathconfig/data/scripts/"
+ cp tools/packaging/scripts/configure_environment.bat "${STAGING}/org.mnecpp.pathconfig/data/scripts/"
+
+ # Clean up temp
+ rm -rf "$EXTRACT_DIR"
+
+ # -----------------------------------------------------------------
+ # Code Signing & Notarization
+ # -----------------------------------------------------------------
+ # Required repository secrets:
+ # APPLE_DEVELOPER_ID_P12 – Base64-encoded .p12 certificate
+ # (Developer ID Application)
+ # APPLE_DEVELOPER_ID_PASSWORD – Password for the .p12 file
+ # APPLE_TEAM_ID – 10-char Apple Team ID
+ # APPLE_ID – Apple ID email for notarytool
+ # APPLE_APP_PASSWORD – App-specific password for notarytool
+ # -----------------------------------------------------------------
+
+ - name: Import Apple Developer ID certificate
+ if: env.APPLE_DEVELOPER_ID_P12 != ''
+ env:
+ APPLE_DEVELOPER_ID_P12: ${{ secrets.APPLE_DEVELOPER_ID_P12 }}
+ APPLE_DEVELOPER_ID_PASSWORD: ${{ secrets.APPLE_DEVELOPER_ID_PASSWORD }}
+ run: |
+ # Create a temporary keychain
+ KEYCHAIN_PATH="$RUNNER_TEMP/signing.keychain-db"
+ KEYCHAIN_PASSWORD="$(openssl rand -hex 16)"
+
+ security create-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH"
+ security set-keychain-settings -lut 21600 "$KEYCHAIN_PATH"
+ security unlock-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH"
+
+ # Import the certificate
+ echo "$APPLE_DEVELOPER_ID_P12" | base64 --decode > "$RUNNER_TEMP/certificate.p12"
+ security import "$RUNNER_TEMP/certificate.p12" \
+ -k "$KEYCHAIN_PATH" \
+ -P "$APPLE_DEVELOPER_ID_PASSWORD" \
+ -T /usr/bin/codesign \
+ -T /usr/bin/productsign
+
+ security set-key-partition-list -S apple-tool:,apple:,codesign: \
+ -s -k "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH"
+
+ # Add to search list
+ security list-keychains -d user -s "$KEYCHAIN_PATH" $(security list-keychains -d user | tr -d '"')
+
+ # Extract the signing identity
+ IDENTITY=$(security find-identity -v -p codesigning "$KEYCHAIN_PATH" | head -1 | awk -F'"' '{print $2}')
+ echo "CODESIGN_IDENTITY=$IDENTITY" >> $GITHUB_ENV
+ echo "KEYCHAIN_PATH=$KEYCHAIN_PATH" >> $GITHUB_ENV
+ echo "Signing identity: $IDENTITY"
+
+ - name: Codesign staged binaries
+ if: env.CODESIGN_IDENTITY != ''
+ run: |
+ STAGING="tools/packaging/installer/packages"
+ OPTS="--force --options runtime --timestamp"
+
+ echo "=== Signing shared libraries ==="
+ find "$STAGING" -name "*.dylib" -exec \
+ codesign $OPTS --sign "$CODESIGN_IDENTITY" {} \;
+
+ echo "=== Signing frameworks ==="
+ find "$STAGING" -name "*.framework" -type d | while read fw; do
+ codesign $OPTS --deep --sign "$CODESIGN_IDENTITY" "$fw"
+ done
+
+ echo "=== Signing CLI binaries ==="
+ CLI_DATA="$STAGING/org.mnecpp.applications.cli/data/bin"
+ if [ -d "$CLI_DATA" ]; then
+ find "$CLI_DATA" -type f -perm +111 ! -name "*.dylib" -exec \
+ codesign $OPTS --sign "$CODESIGN_IDENTITY" {} \;
+ fi
+
+ echo "=== Signing GUI .app bundles ==="
+ GUI_DATA="$STAGING/org.mnecpp.applications.gui/data/bin"
+ if [ -d "$GUI_DATA" ]; then
+ find "$GUI_DATA" -name "*.app" -type d | while read app; do
+ codesign $OPTS --deep --sign "$CODESIGN_IDENTITY" "$app"
+ done
+ fi
+
+ echo "=== Verifying signatures ==="
+ find "$STAGING" \( -name "*.app" -o -name "*.dylib" \) | head -5 | while read f; do
+ codesign --verify --verbose "$f" && echo " OK: $f" || echo " FAIL: $f"
+ done
+
+ - name: Build installer with binarycreator
+ run: |
+ binarycreator \
+ --offline-only \
+ -c tools/packaging/installer/config/config.xml \
+ -p tools/packaging/installer/packages \
+ MNE-CPP-${{ env.MNE_CPP_VERSION }}-Darwin
+
+ - name: Codesign installer app
+ if: env.CODESIGN_IDENTITY != ''
+ run: |
+ codesign --force --deep --options runtime --timestamp \
+ --sign "$CODESIGN_IDENTITY" \
+ "MNE-CPP-${{ env.MNE_CPP_VERSION }}-Darwin.app"
+ codesign --verify --verbose "MNE-CPP-${{ env.MNE_CPP_VERSION }}-Darwin.app"
+
+ - name: Create DMG
+ run: |
+ hdiutil create \
+ -volname "MNE-CPP ${{ env.MNE_CPP_VERSION }}" \
+ -srcfolder "MNE-CPP-${{ env.MNE_CPP_VERSION }}-Darwin.app" \
+ -ov -format UDZO \
+ "MNE-CPP-${{ env.MNE_CPP_VERSION }}-Darwin.dmg"
+ ls -lh MNE-CPP-*-Darwin.dmg
+
+ - name: Codesign DMG
+ if: env.CODESIGN_IDENTITY != ''
+ run: |
+ codesign --force --timestamp \
+ --sign "$CODESIGN_IDENTITY" \
+ "MNE-CPP-${{ env.MNE_CPP_VERSION }}-Darwin.dmg"
+ codesign --verify --verbose "MNE-CPP-${{ env.MNE_CPP_VERSION }}-Darwin.dmg"
+
+ - name: Notarize DMG
+ if: env.CODESIGN_IDENTITY != ''
+ env:
+ APPLE_ID: ${{ secrets.APPLE_ID }}
+ APPLE_APP_PASSWORD: ${{ secrets.APPLE_APP_PASSWORD }}
+ APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
+ run: |
+ echo "Submitting DMG to Apple notary service..."
+ xcrun notarytool submit \
+ "MNE-CPP-${{ env.MNE_CPP_VERSION }}-Darwin.dmg" \
+ --apple-id "$APPLE_ID" \
+ --password "$APPLE_APP_PASSWORD" \
+ --team-id "$APPLE_TEAM_ID" \
+ --wait \
+ --timeout 30m
+
+ echo "Stapling notarization ticket to DMG..."
+ xcrun stapler staple "MNE-CPP-${{ env.MNE_CPP_VERSION }}-Darwin.dmg"
+
+ echo "Verifying notarization..."
+ spctl --assess --type open --context context:primary-signature \
+ "MNE-CPP-${{ env.MNE_CPP_VERSION }}-Darwin.dmg" \
+ && echo "Notarization verified successfully" \
+ || echo "Warning: spctl check returned non-zero (may be expected on CI)"
+
+ - name: Cleanup keychain
+ if: always() && env.KEYCHAIN_PATH != ''
+ run: |
+ security delete-keychain "$KEYCHAIN_PATH" 2>/dev/null || true
+
+ - name: Deploy installer (stable release)
+ if: startsWith(github.ref, 'refs/tags/')
+ uses: svenstaro/upload-release-action@v2
+ with:
+ repo_token: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }}
+ file: MNE-CPP-*-Darwin.dmg
+ file_glob: true
+ asset_name: mne-cpp-${{ github.ref_name }}-macos-installer-arm64.dmg
+ tag: ${{ github.ref }}
+ overwrite: true
+
+ - name: Deploy installer (dev release)
+ if: endsWith(github.ref, 'v2.0-dev') == true
+ uses: svenstaro/upload-release-action@v2
+ with:
+ repo_token: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }}
+ file: MNE-CPP-*-Darwin.dmg
+ file_glob: true
+ asset_name: mne-cpp-v2.0-dev-macos-installer-arm64.dmg
+ tag: dev_build
+ overwrite: true
+
+ # =========================================================================
+ # Windows Installer (.exe)
+ # =========================================================================
+ WindowsInstaller:
+ runs-on: windows-2025
+
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@v3
+
+ - name: Install Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: '3.10'
+ architecture: 'x64'
+
+ - name: Install Qt Installer Framework
+ run: |
+ pip install aqtinstall
+ aqt install-tool windows desktop tools_ifw ${{ env.QIF_TOOL_ID }} --outputdir $env:RUNNER_TOOL_CACHE/Qt
+ echo "$env:RUNNER_TOOL_CACHE/Qt/Tools/QtInstallerFramework/${{ env.QIF_VERSION }}/bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
+
+ - name: Determine release tag
+ id: tag
+ shell: bash
+ run: |
+ if [[ "$GITHUB_REF" == refs/tags/* ]]; then
+ echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
+ echo "asset_prefix=mne-cpp-${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
+ else
+ echo "tag=dev_build" >> $GITHUB_OUTPUT
+ echo "asset_prefix=mne-cpp-v2.0-dev" >> $GITHUB_OUTPUT
+ fi
+
+ - name: Download dynamic release from GitHub Releases
+ env:
+ GH_TOKEN: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }}
+ shell: bash
+ run: |
+ ASSET="${{ steps.tag.outputs.asset_prefix }}-windows-dynamic-x86_64.zip"
+ echo "Downloading ${ASSET} from release ${{ steps.tag.outputs.tag }}..."
+ gh release download "${{ steps.tag.outputs.tag }}" -p "${ASSET}" -D "$RUNNER_TEMP"
+ echo "RELEASE_ARCHIVE=${RUNNER_TEMP}/${ASSET}" >> $GITHUB_ENV
+
+ - name: Stage release into QIF package layout
+ shell: bash
+ run: |
+ STAGING="tools/packaging/installer/packages"
+
+ # CLI tools (QCoreApplication-based, no GUI dependencies)
+ CLI_APPS="mne_anonymize mne_edf2fiff mne_show_fiff mne_compute_raw_inverse mne_forward_solution mne_setup_mri mne_surf2bem mne_setup_forward_model mne_watershed_bem mne_flash_bem mne_rt_server mne_dipole_fit"
+
+ # GUI applications (QApplication-based, require display)
+ GUI_APPS="mne_scan mne_analyze mne_browse mne_inspect"
+
+ # Extract the full archive to a temp location first
+ EXTRACT_DIR="$RUNNER_TEMP/mne-cpp-extracted"
+ mkdir -p "$EXTRACT_DIR"
+ 7z x "$RELEASE_ARCHIVE" -o"$EXTRACT_DIR" -y
+
+ # Find the actual root (may be inside a subfolder)
+ CONTENT_DIR="$EXTRACT_DIR"
+ if [ -d "$EXTRACT_DIR"/mne-cpp* ]; then
+ CONTENT_DIR=$(ls -d "$EXTRACT_DIR"/mne-cpp* | head -1)
+ fi
+
+ # --- CLI Tools → org.mnecpp.applications.cli ---
+ CLI_DATA="${STAGING}/org.mnecpp.applications.cli/data"
+ mkdir -p "${CLI_DATA}/bin"
+ for app in $CLI_APPS; do
+ if [ -f "$CONTENT_DIR/bin/${app}.exe" ]; then
+ cp "$CONTENT_DIR/bin/${app}.exe" "${CLI_DATA}/bin/"
+ elif [ -f "$CONTENT_DIR/bin/$app" ]; then
+ cp "$CONTENT_DIR/bin/$app" "${CLI_DATA}/bin/"
+ fi
+ done
+
+ # --- GUI Apps → org.mnecpp.applications.gui ---
+ GUI_DATA="${STAGING}/org.mnecpp.applications.gui/data"
+ mkdir -p "${GUI_DATA}/bin"
+ for app in $GUI_APPS; do
+ if [ -f "$CONTENT_DIR/bin/${app}.exe" ]; then
+ cp "$CONTENT_DIR/bin/${app}.exe" "${GUI_DATA}/bin/"
+ elif [ -f "$CONTENT_DIR/bin/$app" ]; then
+ cp "$CONTENT_DIR/bin/$app" "${GUI_DATA}/bin/"
+ fi
+ done
+
+ # --- Legacy parent component (backward compat) ---
+ APP_DATA="${STAGING}/org.mnecpp.applications/data"
+ mkdir -p "${APP_DATA}/bin"
+ if [ -d "$CONTENT_DIR/bin" ]; then
+ cp -r "$CONTENT_DIR/bin/"* "${APP_DATA}/bin/" 2>/dev/null || true
+ fi
+
+ # Runtime — lib/ and bin/*.dll
+ RT_DATA="${STAGING}/org.mnecpp.runtime/data"
+ mkdir -p "${RT_DATA}/lib" "${RT_DATA}/bin"
+ if [ -d "$CONTENT_DIR/lib" ]; then
+ cp -r "$CONTENT_DIR/lib/"* "${RT_DATA}/lib/" 2>/dev/null || true
+ fi
+ # Copy DLLs to runtime bin/ (Windows needs DLLs alongside exes or on PATH)
+ find "$CONTENT_DIR/bin" -name "*.dll" -exec cp {} "${RT_DATA}/bin/" \; 2>/dev/null || true
+
+ # SDK — include/ + lib/cmake/
+ SDK_DATA="${STAGING}/org.mnecpp.sdk/data"
+ mkdir -p "${SDK_DATA}/include"
+ # Release archives don't ship headers; copy from the source tree.
+ for lib_dir in src/libraries/*/; do
+ lib_name=$(basename "$lib_dir")
+ [ "$lib_name" = "CMakeLists.txt" ] && continue
+ find "$lib_dir" -name '*.h' | while read hdr; do
+ rel="${hdr#src/libraries/}"
+ dest_dir="${SDK_DATA}/include/$(dirname "$rel")"
+ mkdir -p "$dest_dir"
+ cp "$hdr" "$dest_dir/"
+ done
+ done
+ if [ -d "$CONTENT_DIR/include" ]; then
+ cp -r "$CONTENT_DIR/include/"* "${SDK_DATA}/include/" 2>/dev/null || true
+ fi
+ if [ -d "$CONTENT_DIR/lib/cmake" ]; then
+ mkdir -p "${SDK_DATA}/lib"
+ cp -r "$CONTENT_DIR/lib/cmake" "${SDK_DATA}/lib/" 2>/dev/null || true
+ fi
+
+ # Scripts
+ for comp in org.mnecpp.sampledata org.mnecpp.mnepython org.mnecpp.pathconfig; do
+ mkdir -p "${STAGING}/${comp}/data/scripts"
+ done
+ cp tools/packaging/scripts/download_sample_data.sh "${STAGING}/org.mnecpp.sampledata/data/scripts/"
+ cp tools/packaging/scripts/download_sample_data.bat "${STAGING}/org.mnecpp.sampledata/data/scripts/"
+ cp tools/packaging/scripts/install_mne_python.sh "${STAGING}/org.mnecpp.mnepython/data/scripts/"
+ cp tools/packaging/scripts/install_mne_python.bat "${STAGING}/org.mnecpp.mnepython/data/scripts/"
+ cp tools/packaging/scripts/configure_environment.sh "${STAGING}/org.mnecpp.pathconfig/data/scripts/"
+ cp tools/packaging/scripts/configure_environment.bat "${STAGING}/org.mnecpp.pathconfig/data/scripts/"
+
+ - name: Build installer with binarycreator
+ run: |
+ binarycreator `
+ --offline-only `
+ -c tools/packaging/installer/config/config.xml `
+ -p tools/packaging/installer/packages `
+ MNE-CPP-${{ env.MNE_CPP_VERSION }}-win64.exe
+
+ Get-ChildItem MNE-CPP-*-win64.exe
+
+ - name: Deploy installer (stable release)
+ if: startsWith(github.ref, 'refs/tags/')
+ uses: svenstaro/upload-release-action@v2
+ with:
+ repo_token: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }}
+ file: MNE-CPP-*-win64.exe
+ file_glob: true
+ asset_name: mne-cpp-${{ github.ref_name }}-windows-installer-x86_64.exe
+ tag: ${{ github.ref }}
+ overwrite: true
+
+ - name: Deploy installer (dev release)
+ if: endsWith(github.ref, 'v2.0-dev') == true
+ uses: svenstaro/upload-release-action@v2
+ with:
+ repo_token: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }}
+ file: MNE-CPP-*-win64.exe
+ file_glob: true
+ asset_name: mne-cpp-v2.0-dev-windows-installer-x86_64.exe
+ tag: dev_build
+ overwrite: true
diff --git a/.github/workflows/release-linux.yml b/.github/workflows/release-linux.yml
new file mode 100644
index 00000000000..57b123b644e
--- /dev/null
+++ b/.github/workflows/release-linux.yml
@@ -0,0 +1,117 @@
+name: Release Linux
+
+on:
+ workflow_call:
+
+jobs:
+ LinuxDynamic:
+ runs-on: ubuntu-24.04
+
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@v3
+ - name: Install Python 3.10 version
+ uses: actions/setup-python@v5
+ with:
+ python-version: '3.10'
+ architecture: 'x64'
+ - name: Install Qt
+ uses: jurplel/install-qt-action@v3
+ with:
+ version: 6.10.2
+ modules: qtshadertools
+ - name: Configure and compile MNE-CPP
+ run: |
+ ./tools/build_project.bat
+ - name: Deploy binaries
+ run: |
+ ./tools/deploy.bat dynamic pack
+ - name: Deploy binaries with stable release on Github
+ if: startsWith(github.ref, 'refs/tags/')
+ uses: svenstaro/upload-release-action@v2
+ with:
+ repo_token: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }}
+ file: mne-cpp-linux-dynamic-x86_64.tar.gz
+ asset_name: mne-cpp-${{ github.ref_name }}-linux-dynamic-x86_64.tar.gz
+ tag: ${{ github.ref }}
+ overwrite: true
+ - name: Deploy binaries with dev release on Github
+ if: endsWith(github.ref, 'v2.0-dev') == true
+ uses: svenstaro/upload-release-action@v2
+ with:
+ repo_token: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }}
+ file: mne-cpp-linux-dynamic-x86_64.tar.gz
+ asset_name: mne-cpp-v2.0-dev-linux-dynamic-x86_64.tar.gz
+ tag: dev_build
+ overwrite: true
+
+
+ LinuxStatic:
+ runs-on: ubuntu-24.04
+
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@v3
+ - name: Install Python 3.10 version
+ uses: actions/setup-python@v5
+ with:
+ python-version: '3.10'
+ architecture: 'x64'
+ - name: Install dependencies
+ run: |
+ sudo apt-get update -q
+ sudo apt-get install -q build-essential libgl1-mesa-dev libvulkan-dev ninja-build
+ - name: Cache static Qt binaries
+ id: cache-qt-static
+ uses: actions/cache@v4
+ with:
+ path: ../Qt6_static
+ key: qt-6.10.2-static-linux-x86_64
+ - name: Download pre-built static Qt
+ id: download-qt-static
+ if: steps.cache-qt-static.outputs.cache-hit != 'true'
+ continue-on-error: true
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ gh release download qt_binaries -p "qt6_6102_static_binaries_linux.tar.gz" -D /tmp
+ mkdir -p ../Qt6_static
+ tar xfz /tmp/qt6_6102_static_binaries_linux.tar.gz -C ../Qt6_static
+ - name: Build static Qt from source
+ if: steps.cache-qt-static.outputs.cache-hit != 'true' && steps.download-qt-static.outcome != 'success'
+ run: |
+ cd ..
+ git clone https://code.qt.io/qt/qt5.git -b v6.10.2
+ cd qt5
+ ./init-repository -f --module-subset=qtbase,qtsvg,qtshadertools
+ cd ..
+ mkdir qt6_shadow
+ cd qt6_shadow
+ ../qt5/configure -static -release -prefix "$GITHUB_WORKSPACE/../Qt6_static" -skip webengine -nomake tools -nomake tests -nomake examples -no-dbus -no-ssl -no-pch -opensource -confirm-license -qt-libpng -qt-pcre -- -DCMAKE_BUILD_TYPE=Release
+ cmake --build . --parallel $(nproc)
+ cmake --install .
+ - name: Configure and compile MNE-CPP (static)
+ run: |
+ export CMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/../Qt6_static
+ ./tools/build_project.bat static
+ - name: Deploy binaries
+ run: |
+ ./tools/deploy.bat static pack
+ - name: Deploy binaries with stable release on Github
+ if: startsWith(github.ref, 'refs/tags/')
+ uses: svenstaro/upload-release-action@v2
+ with:
+ repo_token: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }}
+ file: mne-cpp-linux-static-x86_64.tar.gz
+ asset_name: mne-cpp-${{ github.ref_name }}-linux-static-x86_64.tar.gz
+ tag: ${{ github.ref }}
+ overwrite: true
+ - name: Deploy binaries with dev release on Github
+ if: endsWith(github.ref, 'v2.0-dev') == true
+ uses: svenstaro/upload-release-action@v2
+ with:
+ repo_token: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }}
+ file: mne-cpp-linux-static-x86_64.tar.gz
+ asset_name: mne-cpp-v2.0-dev-linux-static-x86_64.tar.gz
+ tag: dev_build
+ overwrite: true
diff --git a/.github/workflows/release-macos.yml b/.github/workflows/release-macos.yml
new file mode 100644
index 00000000000..8f9bc74e35b
--- /dev/null
+++ b/.github/workflows/release-macos.yml
@@ -0,0 +1,116 @@
+name: Release macOS
+
+on:
+ workflow_call:
+
+jobs:
+ MacOSDynamic:
+ runs-on: macos-26
+
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@v3
+ - name: Install Python 3.10 version
+ uses: actions/setup-python@v5
+ with:
+ python-version: '3.10'
+ architecture: 'arm64'
+ - name: Install Qt
+ uses: jurplel/install-qt-action@v3
+ with:
+ version: 6.10.2
+ modules: qtshadertools
+ - name: Configure and compile MNE-CPP
+ run: |
+ ./tools/build_project.bat
+ - name: Deploy binaries (MacOS)
+ run: |
+ ./tools/deploy.bat dynamic pack
+ - name: Deploy binaries with stable release on Github
+ if: startsWith(github.ref, 'refs/tags/')
+ uses: svenstaro/upload-release-action@v2
+ with:
+ repo_token: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }}
+ file: mne-cpp-macos-dynamic-arm64.tar.gz
+ asset_name: mne-cpp-${{ github.ref_name }}-macos-dynamic-arm64.tar.gz
+ tag: ${{ github.ref }}
+ overwrite: true
+ - name: Deploy binaries with dev release on Github
+ if: endsWith(github.ref, 'v2.0-dev') == true
+ uses: svenstaro/upload-release-action@v2
+ with:
+ repo_token: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }}
+ file: mne-cpp-macos-dynamic-arm64.tar.gz
+ asset_name: mne-cpp-v2.0-dev-macos-dynamic-arm64.tar.gz
+ tag: dev_build
+ overwrite: true
+
+
+ MacOSStatic:
+ runs-on: macos-26
+
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@v3
+ - name: Install Python 3.10 version
+ uses: actions/setup-python@v5
+ with:
+ python-version: '3.10'
+ architecture: 'arm64'
+ - name: Install dependencies
+ run: |
+ brew install ninja
+ - name: Cache static Qt binaries
+ id: cache-qt-static
+ uses: actions/cache@v4
+ with:
+ path: ../Qt6_static
+ key: qt-6.10.2-static-macos-arm64
+ - name: Download pre-built static Qt
+ id: download-qt-static
+ if: steps.cache-qt-static.outputs.cache-hit != 'true'
+ continue-on-error: true
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ gh release download qt_binaries -p "qt6_6102_static_binaries_macos.tar.gz" -D /tmp
+ mkdir -p ../Qt6_static
+ tar xfz /tmp/qt6_6102_static_binaries_macos.tar.gz -C ../Qt6_static
+ - name: Build static Qt from source
+ if: steps.cache-qt-static.outputs.cache-hit != 'true' && steps.download-qt-static.outcome != 'success'
+ run: |
+ cd ..
+ git clone https://code.qt.io/qt/qt5.git -b v6.10.2
+ cd qt5
+ ./init-repository -f --module-subset=qtbase,qtsvg,qtshadertools
+ cd ..
+ mkdir qt6_shadow
+ cd qt6_shadow
+ ../qt5/configure -static -release -prefix "$GITHUB_WORKSPACE/../Qt6_static" -skip webengine -nomake tools -nomake tests -nomake examples -no-dbus -no-ssl -no-pch -opensource -confirm-license -- -DCMAKE_BUILD_TYPE=Release
+ cmake --build . --parallel $(sysctl -n hw.ncpu)
+ cmake --install .
+ - name: Configure and compile MNE-CPP (static)
+ run: |
+ export CMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/../Qt6_static
+ ./tools/build_project.bat static
+ - name: Deploy binaries (MacOS)
+ run: |
+ ./tools/deploy.bat static pack
+ - name: Deploy binaries with stable release on Github
+ if: startsWith(github.ref, 'refs/tags/')
+ uses: svenstaro/upload-release-action@v2
+ with:
+ repo_token: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }}
+ file: mne-cpp-macos-static-arm64.tar.gz
+ asset_name: mne-cpp-${{ github.ref_name }}-macos-static-arm64.tar.gz
+ tag: ${{ github.ref }}
+ overwrite: true
+ - name: Deploy binaries with dev release on Github
+ if: endsWith(github.ref, 'v2.0-dev') == true
+ uses: svenstaro/upload-release-action@v2
+ with:
+ repo_token: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }}
+ file: mne-cpp-macos-static-arm64.tar.gz
+ asset_name: mne-cpp-v2.0-dev-macos-static-arm64.tar.gz
+ tag: dev_build
+ overwrite: true
diff --git a/.github/workflows/release-windows.yml b/.github/workflows/release-windows.yml
new file mode 100644
index 00000000000..5159f0416ea
--- /dev/null
+++ b/.github/workflows/release-windows.yml
@@ -0,0 +1,120 @@
+name: Release Windows
+
+on:
+ workflow_call:
+
+jobs:
+ WinDynamic:
+ runs-on: windows-2025
+
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@v3
+ - name: Install Python 3.10 version
+ uses: actions/setup-python@v5
+ with:
+ python-version: '3.10'
+ architecture: 'x64'
+ - name: Install Qt
+ uses: jurplel/install-qt-action@v3
+ with:
+ version: 6.10.2
+ arch: win64_msvc2022_64
+ modules: qtshadertools
+ - name: Configure and compile MNE-CPP
+ run: |
+ cmd.exe /c "call `"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat`" && set > %temp%\vcvars.txt"
+ Get-Content "$env:temp\vcvars.txt" | Foreach-Object { if ($_ -match "^(.*?)=(.*)$") { Set-Content "env:\$($matches[1])" $matches[2] } }
+ ./tools/build_project.bat
+ - name: Deploy binaries (Windows)
+ run: |
+ ./tools/deploy.bat dynamic pack
+ - name: Deploy binaries with stable release on Github
+ if: startsWith(github.ref, 'refs/tags/')
+ uses: svenstaro/upload-release-action@v2
+ with:
+ repo_token: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }}
+ file: mne-cpp-windows-dynamic-x86_64.zip
+ asset_name: mne-cpp-${{ github.ref_name }}-windows-dynamic-x86_64.zip
+ tag: ${{ github.ref }}
+ overwrite: true
+ - name: Deploy binaries with dev release on Github
+ if: endsWith(github.ref, 'v2.0-dev') == true
+ uses: svenstaro/upload-release-action@v2
+ with:
+ repo_token: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }}
+ file: mne-cpp-windows-dynamic-x86_64.zip
+ asset_name: mne-cpp-v2.0-dev-windows-dynamic-x86_64.zip
+ tag: dev_build
+ overwrite: true
+
+
+ WinStatic:
+ runs-on: windows-2025
+
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@v3
+ - name: Install Python 3.10 version
+ uses: actions/setup-python@v5
+ with:
+ python-version: '3.10'
+ architecture: 'x64'
+ - name: Install ninja
+ run: |
+ choco install ninja
+ - name: Cache static Qt binaries
+ id: cache-qt-static
+ uses: actions/cache@v4
+ with:
+ path: ..\Qt6_static
+ key: qt-6.10.2-static-windows-x86_64
+ - name: Download pre-built static Qt
+ id: download-qt-static
+ if: steps.cache-qt-static.outputs.cache-hit != 'true'
+ continue-on-error: true
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ gh release download qt_binaries -p "qt6_6102_static_binaries_win.zip" -D $env:TEMP
+ mkdir ..\Qt6_static -Force
+ 7z x "$env:TEMP\qt6_6102_static_binaries_win.zip" -o"..\Qt6_static" -y
+ - name: Build static Qt from source
+ if: steps.cache-qt-static.outputs.cache-hit != 'true' && steps.download-qt-static.outcome != 'success'
+ run: |
+ cd ..
+ git clone https://code.qt.io/qt/qt5.git -b v6.10.2
+ mkdir qt6_shadow
+ cd qt6_shadow
+ cmd.exe /c "call `"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat`" && set > %temp%\vcvars.txt"
+ Get-Content "$env:temp\vcvars.txt" | Foreach-Object { if ($_ -match "^(.*?)=(.*)$") { Set-Content "env:\$($matches[1])" $matches[2] } }
+ ..\qt5\configure.bat -release -static -no-pch -optimize-size -opengl desktop -platform win32-msvc -prefix "$env:GITHUB_WORKSPACE\..\Qt6_static" -skip webengine -nomake tools -nomake tests -nomake examples -opensource -confirm-license -init-submodules -submodules qtbase,qtsvg,qtshadertools
+ cmake --build . --parallel $env:NUMBER_OF_PROCESSORS
+ cmake --install .
+ - name: Configure and compile MNE-CPP (static)
+ run: |
+ cmd.exe /c "call `"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat`" && set > %temp%\vcvars.txt"
+ Get-Content "$env:temp\vcvars.txt" | Foreach-Object { if ($_ -match "^(.*?)=(.*)$") { Set-Content "env:\$($matches[1])" $matches[2] } }
+ $env:CMAKE_PREFIX_PATH = "$env:GITHUB_WORKSPACE\..\Qt6_static"
+ ./tools/build_project.bat static
+ - name: Deploy binaries (Windows)
+ run: |
+ ./tools/deploy.bat static pack
+ - name: Deploy binaries with stable release on Github
+ if: startsWith(github.ref, 'refs/tags/')
+ uses: svenstaro/upload-release-action@v2
+ with:
+ repo_token: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }}
+ file: mne-cpp-windows-static-x86_64.zip
+ asset_name: mne-cpp-${{ github.ref_name }}-windows-static-x86_64.zip
+ tag: ${{ github.ref }}
+ overwrite: true
+ - name: Deploy binaries with dev release on Github
+ if: endsWith(github.ref, 'v2.0-dev') == true
+ uses: svenstaro/upload-release-action@v2
+ with:
+ repo_token: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }}
+ file: mne-cpp-windows-static-x86_64.zip
+ asset_name: mne-cpp-v2.0-dev-windows-static-x86_64.zip
+ tag: dev_build
+ overwrite: true
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index f3710cca71d..78ca5c7ec14 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -1,468 +1,114 @@
-name: Linux|MacOS|Win|WASM
+name: Release
on:
push:
tags:
- v0.*
branches:
- - main
+ - v2.0-dev
jobs:
CreateRelease:
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-24.04
steps:
- name: Clone repository
uses: actions/checkout@v3
- name: Create new branch with the tag's name (stable release only)
- if: endsWith(github.ref, 'main') == false
+ if: endsWith(github.ref, 'v2.0-dev') == false
run: |
currentVersionPatch=`echo ${GITHUB_REF#refs/tags/} | cut -d. -f3`
# Only branch off if we have a new minor version bump, which will always result in the patch version to be 0
if [[ "$currentVersionPatch" == 0 ]]; then
echo Branching off $currentVersionPatch
# Setup Git
- git config --global user.email lorenzesch@hotmail.com
- git config --global user.name LorenzE
+ git config --global user.email christoph.dinh@mne-cpp.org
+ git config --global user.name chdinh
# Create new branch named after the new version tag
git checkout -b ${GITHUB_REF#refs/tags/}
git push origin refs/heads/${GITHUB_REF#refs/tags/}
fi
- - name: Setup Github credentials (dev release only)
- if: endsWith(github.ref, 'main') == true
- uses: fusion-engineering/setup-git-credentials@v2
- with:
- credentials: ${{secrets.GIT_CREDENTIALS}}
- name: Update dev_build tag and release (dev release only)
- if: endsWith(github.ref, 'main') == true
+ if: endsWith(github.ref, 'v2.0-dev') == true
+ timeout-minutes: 5
env:
- GITHUB_USER: LorenzE
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- run: |
- git config --global user.email lorenzesch@hotmail.com
- git config --global user.name $GITHUB_USER
- # Delete current dev_build release remotely.
- # Must be done before deleting the remote tag associated with the dev_build release.
- # This prevents a draft release to be left over after we delete the tag remotely.
- hub release delete dev_build
- # Delete current tag remotely
- git push origin :refs/tags/dev_build
+ GH_TOKEN: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }}
+ run: |
+ set -x # Enable debug output
+
+ git config --global user.email christoph.dinh@mne-cpp.org
+ git config --global user.name chdinh
+
+ # Configure git to use token
+ git remote set-url origin https://x-access-token:${GH_TOKEN}@github.com/${{ github.repository }}
+
+ # Delete current dev_build release remotely (if it exists)
+ echo "Attempting to delete existing dev_build release..."
+ if gh release view dev_build > /dev/null 2>&1; then
+ gh release delete dev_build --yes --cleanup-tag
+ echo "Existing release deleted."
+ else
+ echo "No existing dev_build release found, skipping deletion."
+ fi
+
+ # Delete current tag remotely (if it exists)
+ echo "Attempting to delete existing dev_build tag..."
+ git push origin :refs/tags/dev_build 2>/dev/null || echo "Tag did not exist remotely, continuing."
+
# Change dev_build tag to point to newest commit
git tag dev_build -f -a -m "Development Builds"
+
# Send the new tag
- git push -f --tag
- # Create new dev_build release
- hub release create -m "Development Builds" dev_build --prerelease
+ git push origin dev_build -f
+
+ # Create new dev_build release (use --target to avoid tag propagation race)
+ echo "Creating new dev_build release..."
+ gh release create dev_build --prerelease --title "Development Builds" --notes "Development Builds" --target ${{ github.sha }}
+ echo "Release created successfully."
- LinuxStatic:
- runs-on: ubuntu-20.04
+ # Platform-specific build workflows (run in parallel)
+ Linux:
needs: CreateRelease
+ uses: ./.github/workflows/release-linux.yml
+ secrets: inherit
- steps:
- - name: Clone repository
- uses: actions/checkout@v3
- - name: Install OpenGL
- run: |
- sudo apt-get update -q
- sudo apt-get install build-essential libgl1-mesa-dev
- - name: Install Qt
- run: |
- # Download the pre-built static version of Qt, which was created with the buildqtbinaries.yml workflow
- wget -O qt5_5152_static_binaries_linux.tar.gz https://www.dropbox.com/s/tje7jp6tsn2dxdd/qt5_5152_static_binaries_linux.tar.gz?dl=0
- mkdir ../Qt5_binaries
- tar xvzf qt5_5152_static_binaries_linux.tar.gz -C ../ -P
- # Uncomment this if you want to build Qt statically in this workflow
- # - name: Compile static Qt version
- # run: |
- # # Clone Qt5 repo
- # cd ..
- # git clone https://code.qt.io/qt/qt5.git -b 5.15.2
- # cd qt5
- # ./init-repository -f --module-subset=qtbase,qtcharts,qtsvg,qt3d
- # # Create shadow build folder
- # cd ..
- # mkdir qt5_shadow
- # cd qt5_shadow
- # # Configure Qt5
- # ../qt5/configure -static -release -prefix "../Qt5_binaries" -skip webengine -nomake tools -nomake tests -nomake examples -no-dbus -no-ssl -no-pch -opensource -confirm-license
- # cmake --build build
- # cmake --build build
- - name: Configure and compile MNE-CPP
- run: |
- export QT_DIR="$(pwd)/../Qt5_binaries/lib/cmake/Qt5"
- export Qt5_DIR="$(pwd)/../Qt5_binaries/lib/cmake/Qt5"
- ./tools/build_project.bat static
- - name: Deploy binaries
- run: |
- ./tools/deploy.bat static pack
- - name: Deploy binaries with stable release on Github
- if: endsWith(github.ref, 'main') == false
- uses: svenstaro/upload-release-action@v1-release
- with:
- repo_token: ${{ secrets.GITHUB_TOKEN }}
- file: mne-cpp-linux-static-x86_64.tar.gz
- asset_name: mne-cpp-linux-static-x86_64.tar.gz
- tag: ${{ github.ref }}
- overwrite: true
- - name: Deploy binaries with dev release on Github
- if: endsWith(github.ref, 'main') == true
- uses: svenstaro/upload-release-action@v1-release
- with:
- repo_token: ${{ secrets.GITHUB_TOKEN }}
- file: mne-cpp-linux-static-x86_64.tar.gz
- asset_name: mne-cpp-linux-static-x86_64.tar.gz
- tag: dev_build
- overwrite: true
-
- MacOSStatic:
- runs-on: macos-latest
+ MacOS:
needs: CreateRelease
+ uses: ./.github/workflows/release-macos.yml
+ secrets: inherit
- steps:
- - name: Clone repository
- uses: actions/checkout@v3
- - name: Install Qt
- run: |
- # Download the pre-built static version of Qt, which was created with the buildqtbinaries.yml workflow
- wget -O qt5_5152_static_binaries_macos.tar.gz https://www.dropbox.com/s/ccigarxk40wlxq0/qt5_5152_static_binaries_macos.tar.gz?dl=1
- tar xzf qt5_5152_static_binaries_macos.tar.gz -P
- # Uncomment this if you want to build Qt statically in this workflow
- # - name: Compile static Qt version
- # run: |
- # # Clone Qt5 repo
- # cd ..
- # git clone https://code.qt.io/qt/qt5.git -b 5.15.2
- # cd qt5
- # ./init-repository -f --module-subset=qtbase,qtcharts,qtsvg,qt3d
- # # Create shadow build folder
- # cd ..
- # mkdir qt5_shadow
- # cd qt5_shadow
- # # Configure Qt5
- # ../qt5/configure -static -release -prefix "../Qt5_binaries" -skip webengine -nomake tools -nomake tests -nomake examples -no-dbus -no-ssl -no-pch -opensource -confirm-license
- # cmake --build build
- # cmake --build build
- - name: Configure and compile MNE-CPP
- run: |
- export QT_DIR="$(pwd)/../Qt5_binaries/lib/cmake/Qt5"
- export Qt5_DIR="$(pwd)/../Qt5_binaries/lib/cmake/Qt5"
- ./tools/build_project.bat static
- - name: Deploy binaries
- run: |
- ./tools/deploy.bat static pack
- - name: Deploy binaries with stable release on Github
- if: endsWith(github.ref, 'main') == false
- uses: svenstaro/upload-release-action@v1-release
- with:
- repo_token: ${{ secrets.GITHUB_TOKEN }}
- file: mne-cpp-macos-static-x86_64.tar.gz
- asset_name: mne-cpp-macos-static-x86_64.tar.gz
- tag: ${{ github.ref }}
- overwrite: true
- - name: Deploy binaries with dev release on Github
- if: endsWith(github.ref, 'main') == true
- uses: svenstaro/upload-release-action@v1-release
- with:
- repo_token: ${{ secrets.GITHUB_TOKEN }}
- file: mne-cpp-macos-static-x86_64.tar.gz
- asset_name: mne-cpp-macos-static-x86_64.tar.gz
- tag: dev_build
- overwrite: true
-
- WinStatic:
- runs-on: windows-2019
+ Windows:
needs: CreateRelease
+ uses: ./.github/workflows/release-windows.yml
+ secrets: inherit
- steps:
- - name: Clone repository
- uses: actions/checkout@v3
- - name: Install Python 3.7 version
- uses: actions/setup-python@v4
- with:
- python-version: '3.7'
- architecture: 'x64'
- - name: Install Qt
- run: |
- # Download the pre-built static version of Qt, which was created with the buildqtbinaries.yml workflow
- Invoke-WebRequest https://www.dropbox.com/s/47s49smjg499gnm/qt5_5152_static_binaries_win.zip?dl=1 -OutFile .\qt5_5152_static_binaries_win.zip
- expand-archive -path "qt5_5152_static_binaries_win.zip" -destinationpath "..\"
- # Uncomment this if you want to build Qt statically in this workflow
- # - name: Compile static Qt version
- # run: |
- # # Clone Qt5 repo
- # cd ..
- # git clone https://code.qt.io/qt/qt5.git -b 5.15.2
- # cd qt5
- # perl init-repository -f --module-subset=qtbase,qtcharts,qtsvg,qt3d
- # # Create shadow build folder
- # cd ..
- # mkdir qt5_shadow
- # cd qt5_shadow
- # # Setup the compiler
- # cmd.exe /c "call `"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat`" && set > %temp%\vcvars.txt"
- # Get-Content "$env:temp\vcvars.txt" | Foreach-Object { if ($_ -match "^(.*?)=(.*)$") { Set-Content "env:\$($matches[1])" $matches[2] } }
- # # Configure Qt5
- # ..\qt5\configure.bat -release -static -no-pch -optimize-size -opengl desktop -platform win32-msvc -prefix "..\Qt5_binaries" -skip webengine -nomake tools -nomake tests -nomake examples -opensource -confirm-license
- # cmake --build build
- # nmake install
- - name: Configure and compile MNE-CPP
- run: |
- cmd.exe /c "call `"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat`" && set > %temp%\vcvars.txt"
- Get-Content "$env:temp\vcvars.txt" | Foreach-Object { if ($_ -match "^(.*?)=(.*)$") { Set-Content "env:\$($matches[1])" $matches[2] } }
- $env:QT_DIR += "$PWD\..\Qt5_binaries\lib\cmake\Qt5"
- $env:Qt5_DIR += "$PWD\..\Qt5_binaries\lib\cmake\Qt5"
- ./tools/build_project.bat static
- - name: Deploy binaries
- run: |
- ./tools/deploy.bat static pack
- - name: Deploy binaries with stable release on Github
- if: endsWith(github.ref, 'main') == false
- uses: svenstaro/upload-release-action@v1-release
- with:
- repo_token: ${{ secrets.GITHUB_TOKEN }}
- file: mne-cpp-windows-static-x86_64.zip
- asset_name: mne-cpp-windows-static-x86_64.zip
- tag: ${{ github.ref }}
- overwrite: true
- - name: Deploy binaries with dev release on Github
- if: endsWith(github.ref, 'main') == true
- uses: svenstaro/upload-release-action@v1-release
- with:
- repo_token: ${{ secrets.GITHUB_TOKEN }}
- file: mne-cpp-windows-static-x86_64.zip
- asset_name: mne-cpp-windows-static-x86_64.zip
- tag: dev_build
- overwrite: true
-
- LinuxDynamic:
- runs-on: ubuntu-20.04
-
- steps:
- - name: Clone repository
- uses: actions/checkout@v3
- - name: Install Python 3.7 version
- uses: actions/setup-python@v4
- with:
- python-version: '3.7'
- architecture: 'x64'
- - name: Install BrainFlow and LSL submodules
- run: |
- git submodule update --init src/applications/mne_scan/plugins/brainflowboard/brainflow
- git submodule update --init src/applications/mne_scan/plugins/lsladapter/liblsl
- - name: Install Qt
- uses: jurplel/install-qt-action@v3
- with:
- version: 5.15.2
- modules: qtcharts
- - name: Compile BrainFlow submodule
- run: |
- cd src/applications/mne_scan/plugins/brainflowboard/brainflow
- mkdir build
- cd build
- cmake -DCMAKE_INSTALL_PREFIX=../installed -DCMAKE_BUILD_TYPE=Release ..
- cmake --build .
- - name: Compile LSL submodule
- run: |
- cd src/applications/mne_scan/plugins/lsladapter/liblsl
- mkdir build
- cd build
- cmake ..
- cmake --build .
- - name: Configure and compile MNE-CPP
- run: |
- ./tools/build_project.bat
- - name: Deploy binaries
- run: |
- ./tools/deploy.bat dynamic pack
- - name: Deploy binaries with stable release on Github
- if: endsWith(github.ref, 'main') == false
- uses: svenstaro/upload-release-action@v1-release
- with:
- repo_token: ${{ secrets.GITHUB_TOKEN }}
- file: mne-cpp-linux-dynamic-x86_64.tar.gz
- asset_name: mne-cpp-linux-dynamic-x86_64.tar.gz
- tag: ${{ github.ref }}
- overwrite: true
- - name: Deploy binaries with dev release on Github
- if: endsWith(github.ref, 'main') == true
- uses: svenstaro/upload-release-action@v1-release
- with:
- repo_token: ${{ secrets.GITHUB_TOKEN }}
- file: mne-cpp-linux-dynamic-x86_64.tar.gz
- asset_name: mne-cpp-linux-dynamic-x86_64.tar.gz
- tag: dev_build
- overwrite: true
-
- MacOSDynamic:
- runs-on: macos-latest
-
- steps:
- - name: Clone repository
- uses: actions/checkout@v3
- - name: Install Python 3.7 version
- uses: actions/setup-python@v4
- with:
- python-version: '3.7'
- architecture: 'x64'
- - name: Install BrainFlow and LSL submodules
- run: |
- git submodule update --init src/applications/mne_scan/plugins/brainflowboard/brainflow
- git submodule update --init src/applications/mne_scan/plugins/lsladapter/liblsl
- - name: Install Qt
- uses: jurplel/install-qt-action@v3
- with:
- version: 5.14.2
- modules: qtcharts
- - name: Compile BrainFlow submodule
- run: |
- cd src/applications/mne_scan/plugins/brainflowboard/brainflow
- mkdir build
- cd build
- cmake -DCMAKE_INSTALL_PREFIX=../installed -DCMAKE_BUILD_TYPE=Release ..
- cmake --build .
- - name: Compile LSL submodule
- run: |
- cd src/applications/mne_scan/plugins/lsladapter/liblsl
- mkdir build
- cd build
- cmake ..
- cmake --build .
- - name: Configure and compile MNE-CPP
- run: |
- ./tools/build_project.bat
- - name: Deploy binaries (MacOS)
- run: |
- ./tools/deploy.bat dynamic pack
- - name: Deploy binaries with stable release on Github
- if: endsWith(github.ref, 'main') == false
- uses: svenstaro/upload-release-action@v1-release
- with:
- repo_token: ${{ secrets.GITHUB_TOKEN }}
- file: mne-cpp-macos-dynamic-x86_64.tar.gz
- asset_name: mne-cpp-macos-dynamic-x86_64.tar.gz
- tag: ${{ github.ref }}
- overwrite: true
- - name: Deploy binaries with dev release on Github
- if: endsWith(github.ref, 'main') == true
- uses: svenstaro/upload-release-action@v1-release
- with:
- repo_token: ${{ secrets.GITHUB_TOKEN }}
- file: mne-cpp-macos-dynamic-x86_64.tar.gz
- asset_name: mne-cpp-macos-dynamic-x86_64.tar.gz
- tag: dev_build
- overwrite: true
-
- WinDynamic:
- runs-on: windows-2019
-
- steps:
- - name: Clone repository
- uses: actions/checkout@v3
- - name: Install Python 3.7 version
- uses: actions/setup-python@v4
- with:
- python-version: '3.7'
- architecture: 'x64'
- - name: Install BrainFlow and LSL submodules
- run: |
- git submodule update --init src/applications/mne_scan/plugins/brainflowboard/brainflow
- git submodule update --init src/applications/mne_scan/plugins/lsladapter/liblsl
- - name: Install Qt
- uses: jurplel/install-qt-action@v3
- with:
- version: 5.15.2
- arch: win64_msvc2019_64
- modules: qtcharts
- - name: Compile BrainFlow submodule
- run: |
- cd src\applications\mne_scan\plugins\brainflowboard\brainflow
- mkdir build
- cd build
- cmake -G "Visual Studio 16 2019" -A x64 -DMSVC_RUNTIME=dynamic -DCMAKE_SYSTEM_VERSION=8.1 -DCMAKE_INSTALL_PREFIX="$env:GITHUB_WORKSPACE\applications\mne_scan\plugins\brainflowboard\brainflow\installed" ..
- cmake --build . --target install --config Release
- - name: Compile LSL submodule
- run: |
- cd src\applications\mne_scan\plugins\lsladapter\liblsl
- mkdir build
- cd build
- cmake .. -G "Visual Studio 16 2019" -A x64
- cmake --build . --config Release --target install
- - name: Configure and compile MNE-CPP
- run: |
- cmd.exe /c "call `"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat`" && set > %temp%\vcvars.txt"
- Get-Content "$env:temp\vcvars.txt" | Foreach-Object { if ($_ -match "^(.*?)=(.*)$") { Set-Content "env:\$($matches[1])" $matches[2] } }
- ./tools/build_project.bat
- - name: Deploy binaries (Windows)
- run: |
- ./tools/deploy.bat dynamic pack
- - name: Deploy binaries with stable release on Github
- if: endsWith(github.ref, 'main') == false
- uses: svenstaro/upload-release-action@v1-release
- with:
- repo_token: ${{ secrets.GITHUB_TOKEN }}
- file: mne-cpp-windows-dynamic-x86_64.zip
- asset_name: mne-cpp-windows-dynamic-x86_64.zip
- tag: ${{ github.ref }}
- overwrite: true
- - name: Deploy binaries with dev release on Github
- if: endsWith(github.ref, 'main') == true
- uses: svenstaro/upload-release-action@v1-release
- with:
- repo_token: ${{ secrets.GITHUB_TOKEN }}
- file: mne-cpp-windows-dynamic-x86_64.zip
- asset_name: mne-cpp-windows-dynamic-x86_64.zip
- tag: dev_build
- overwrite: true
-
- Tests:
- # Only run for dev releases
- if: endsWith(github.ref, 'main') == true
- runs-on: ubuntu-20.04
- needs: CreateRelease
-
- steps:
- - name: Clone repository
- uses: actions/checkout@v3
- - name: Clone mne-cpp test data
- run: git clone https://github.com/mne-tools/mne-cpp-test-data.git resources/data/mne-cpp-test-data
- - name: Install Python 3.7 version
- uses: actions/setup-python@v4
- with:
- python-version: '3.7'
- architecture: 'x64'
- - name: Install Codecov
- run: |
- sudo pip install codecov
- - name: Install Qt
- uses: jurplel/install-qt-action@v3
- with:
- version: 5.15.2
- modules: qtcharts
- - name: Configure and compile MNE-CPP
- run: |
- ./tools/build_project.bat coverage all
- - name: Run tests and upload results to Codecov
- env:
- CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
- QTEST_FUNCTION_TIMEOUT: 900000
- run: |
- ./tools/test_all.bat verbose withCoverage
+ # Build installers AFTER all platform releases have been uploaded.
+ # Downloads the release archives from GitHub Releases and packages them
+ # with the Qt Installer Framework.
+ Installer:
+ needs: [Linux, MacOS, Windows]
+ uses: ./.github/workflows/release-installer.yml
+ secrets: inherit
+ # Cross-platform jobs (Tests are handled by testci.yml)
Doxygen:
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-24.04
needs: CreateRelease
steps:
- name: Clone repository
uses: actions/checkout@v3
- - name: Install Qt Dev Tools, Doxygen and Graphviz
+ - name: Install Qt Dev Tools, Doxygen 1.16.1 and Graphviz
run: |
sudo apt-get update -qq
- sudo apt-get install -qq qttools5-dev-tools doxygen graphviz
+ sudo apt-get install -qq qttools5-dev-tools graphviz
+ wget -q https://github.com/doxygen/doxygen/releases/download/Release_1_16_1/doxygen-1.16.1.linux.bin.tar.gz
+ tar xzf doxygen-1.16.1.linux.bin.tar.gz
+ sudo install -m 755 doxygen-1.16.1/bin/doxygen /usr/local/bin/doxygen
- name: Run Doxygen and package result
run: |
git fetch --all
- git checkout origin/main
+ git checkout origin/v2.0-dev
cd doc/doxygen
doxygen mne-cpp_doxyfile
- name: Setup Github credentials
@@ -470,125 +116,199 @@ jobs:
with:
credentials: ${{secrets.GIT_CREDENTIALS}}
- name: Deploy qch docu data base with stable release on Github
- if: endsWith(github.ref, 'main') == false
- uses: svenstaro/upload-release-action@v1-release
+ if: startsWith(github.ref, 'refs/tags/')
+ uses: svenstaro/upload-release-action@v2
with:
- repo_token: ${{ secrets.GITHUB_TOKEN }}
+ repo_token: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }}
file: doc/doxygen/qt-creator_doc/mne-cpp.qch
- asset_name: mne-cpp-doc-qtcreator.qch
+ asset_name: mne-cpp-${{ github.ref_name }}-doc-qtcreator.qch
tag: ${{ github.ref }}
overwrite: true
- name: Deploy qch docu data base with dev release on Github
- uses: svenstaro/upload-release-action@v1-release
+ if: endsWith(github.ref, 'v2.0-dev') == true
+ uses: svenstaro/upload-release-action@v2
with:
- repo_token: ${{ secrets.GITHUB_TOKEN }}
+ repo_token: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }}
file: doc/doxygen/qt-creator_doc/mne-cpp.qch
- asset_name: mne-cpp-doc-qtcreator.qch
+ asset_name: mne-cpp-v2.0-dev-doc-qtcreator.qch
tag: dev_build
overwrite: true
- name: Update documentation at Github pages
+ env:
+ GIT_CREDENTIALS: ${{ secrets.GIT_CREDENTIALS }}
run: |
cd doc/doxygen
- git config --global user.email lorenzesch@hotmail.com
- git config --global user.name LorenzE
- git clone -b gh-pages https://github.com/mne-cpp/doxygen-api gh-pages
+ git config --global user.email christoph.dinh@mne-cpp.org
+ git config --global user.name chdinh
+ git clone -b gh-pages "https://${GIT_CREDENTIALS}@github.com/mne-cpp/doxygen-api" gh-pages
cd gh-pages
# Remove all files first
git rm * -r
- git commit --amend -a -m 'Update docu' --allow-empty
+ git commit --amend --reset-author -a -m 'Update docu' --allow-empty
touch .nojekyll
# Copy doxygen files
cp -r ../html/* .
# Add all new files, commit and push
git add *
git add .nojekyll
- git commit --amend -a -m 'Update docu'
+ git commit --amend --reset-author -a -m 'Update docu'
git push -f --all
gh-pages:
# Only run for dev releases
- if: endsWith(github.ref, 'main') == true
- runs-on: ubuntu-latest
+ if: endsWith(github.ref, 'v2.0-dev') == true
+ runs-on: ubuntu-24.04
needs: CreateRelease
-
+
steps:
- name: Clone repository
uses: actions/checkout@v3
+ with:
+ submodules: recursive
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '20'
+ cache: 'npm'
+ cache-dependency-path: doc/website/package-lock.json
+ - name: Build Docusaurus site
+ run: |
+ cd doc/website
+ npm ci
+ npm run build
- name: Setup Github credentials
uses: fusion-engineering/setup-git-credentials@v2
with:
credentials: ${{secrets.GIT_CREDENTIALS}}
- - name: Clone doc/gh-pages into gh-pages branch
+ - name: Deploy to mne-cpp.github.io
+ env:
+ GIT_CREDENTIALS: ${{ secrets.GIT_CREDENTIALS }}
run: |
- git config --global user.email lorenzesch@hotmail.com
- git config --global user.name LorenzE
- git clone -b main --single-branch https://github.com/mne-cpp/mne-cpp.github.io.git
+ git config --global user.email christoph.dinh@mne-cpp.org
+ git config --global user.name chdinh
+ # Clone using credentials embedded in URL
+ git clone -b main --single-branch "https://${GIT_CREDENTIALS}@github.com/mne-cpp/mne-cpp.github.io.git"
cd mne-cpp.github.io
# Remove all files first
git rm * -r
- git commit --amend -a -m 'Update docu' --allow-empty
+ git commit --amend --reset-author -a -m 'Update docu' --allow-empty
cd ..
- cp -RT doc/gh-pages mne-cpp.github.io
+ # Copy the Docusaurus build output
+ cp -RT doc/website/build mne-cpp.github.io
cd mne-cpp.github.io
git add .
- git commit --amend -a -m 'Update docu'
+ git commit --amend --reset-author -a -m 'Update docu'
git push -f --all
WebAssembly:
# Only run for dev releases
- if: endsWith(github.ref, 'main') == true
- runs-on: ubuntu-latest
+ if: endsWith(github.ref, 'v2.0-dev') == true
+ runs-on: ubuntu-24.04
needs: CreateRelease
steps:
- name: Clone repository
uses: actions/checkout@v3
- - name: Install Qt Desktop
- uses: jurplel/install-qt-action@v3
- with:
- aqtversion: '==3.1.*'
- py7zrversion: '>=0.20.2'
- version: '6.5.0'
- host: 'linux'
- target: 'desktop'
- arch: 'gcc_64'
- modules: 'qtcharts'
- - name: Install Qt WASM
- uses: jurplel/install-qt-action@v3
- with:
- aqtversion: '==3.1.*'
- py7zrversion: '>=0.20.2'
- version: '6.5.0'
- host: 'linux'
- target: 'desktop'
- arch: 'wasm_multithread'
- modules: 'qtcharts'
- - name: Setup and build WASM
+ - name: Install dependencies
run: |
- ./tools/wasm.sh --emsdk 3.1.25
+ sudo apt-get update -qq
+ sudo apt-get install -qq build-essential libgl1-mesa-dev ninja-build
+ - name: Setup Emscripten
+ run: |
+ cd ..
+ git clone https://github.com/emscripten-core/emsdk.git
+ cd emsdk
+ ./emsdk install 4.0.7
+ ./emsdk activate 4.0.7
+ - name: Download pre-built WASM Qt binaries
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ gh release download qt_binaries -p 'qt6_6102_static_binaries_wasm.tar.gz' -D /tmp
+ mkdir -p ${{ runner.tool_cache }}/Qt/6.10.2/wasm_multithread
+ tar xf /tmp/qt6_6102_static_binaries_wasm.tar.gz -C ${{ runner.tool_cache }}/Qt/6.10.2/wasm_multithread
+ echo "Qt6_DIR=${{ runner.tool_cache }}/Qt/6.10.2" >> $GITHUB_ENV
+ - name: Download host Qt binaries for cross-compilation
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ gh release download qt_binaries -p 'qt6_6102_static_binaries_linux.tar.gz' -D /tmp
+ mkdir -p ${{ runner.tool_cache }}/Qt/6.10.2/gcc_64
+ tar xf /tmp/qt6_6102_static_binaries_linux.tar.gz -C ${{ runner.tool_cache }}/Qt/6.10.2/gcc_64
+ - name: Build WASM
+ run: |
+ source ../emsdk/emsdk_env.sh
+ ./tools/wasm.sh --emsdk 4.0.7
+ - name: Prepare WASM artifacts
+ run: |
+ # Delete folders which we do not want to ship
+ rm -rf out/wasm/apps/mne_analyze_plugins
+ rm -rf resources/data
+ # Replace logo
+ cp resources/design/logos/qtlogo.svg out/wasm/apps/qtlogo.svg
+ if [ -d "out/wasm/examples" ]; then
+ cp resources/design/logos/qtlogo.svg out/wasm/examples/qtlogo.svg
+ fi
+ - name: Package WASM build as tar.gz
+ run: |
+ tar cfz mne-cpp-wasm.tar.gz -C out/wasm .
+ - name: Deploy WASM tar.gz with dev release on Github
+ uses: svenstaro/upload-release-action@v2
+ with:
+ repo_token: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }}
+ file: mne-cpp-wasm.tar.gz
+ asset_name: mne-cpp-v2.0-dev-wasm.tar.gz
+ tag: dev_build
+ overwrite: true
- name: Setup Github credentials
uses: fusion-engineering/setup-git-credentials@v2
with:
credentials: ${{secrets.GIT_CREDENTIALS}}
- - name: Clone and update mne-cpp/wasm:gh-pages
+ - name: Clone and update mne-cpp/wasm repository
+ env:
+ GIT_CREDENTIALS: ${{ secrets.GIT_CREDENTIALS }}
run: |
- # Delete folders which we do not want to ship
- rm -r out/wasm/apps/mne_analyze_plugins
- rm -r resources/data
- # Replace logo
- cp -RT resources/design/logos/qtlogo.svg bin/qtlogo.svg
- # Clone repo and update with new wasm versions
- git config --global user.email lorenzesch@hotmail.com
- git config --global user.name LorenzE
- git clone -b gh-pages --single-branch https://github.com/mne-cpp/wasm.git
- cd wasm
- # Remove all files first
- git rm * -r
- git commit --amend -a -m 'Update wasm builds' --allow-empty
- # Copy wasm files
- cd ..
- cp -RT out/wasm/apps wasm
- cd wasm
+ git config --global user.email christoph.dinh@mne-cpp.org
+ git config --global user.name chdinh
+ git clone "https://${GIT_CREDENTIALS}@github.com/mne-cpp/wasm.git" wasm-repo
+ cd wasm-repo
+
+ # --- Update gh-pages branch ---
+ if git rev-parse --verify origin/gh-pages > /dev/null 2>&1; then
+ git checkout gh-pages
+ else
+ git checkout --orphan gh-pages
+ fi
+ git rm -rf --ignore-unmatch .
+ git clean -f -d
+ git commit --allow-empty -m 'Update wasm builds'
+ # Copy apps to root
+ cp -RT ../out/wasm/apps .
+ # Copy examples to examples/ subdirectory
+ if [ -d "../out/wasm/examples" ]; then
+ mkdir -p examples
+ cp -RT ../out/wasm/examples examples
+ fi
git add .
- git commit --amend -a -m 'Update wasm builds'
- git push -f --all
+ git commit --amend --reset-author -m 'Update wasm builds'
+ git push -f origin gh-pages
+
+ # --- Update main branch ---
+ if git rev-parse --verify origin/main > /dev/null 2>&1; then
+ git checkout main
+ else
+ git checkout --orphan main
+ fi
+ git rm -rf --ignore-unmatch .
+ git clean -f -d
+ git commit --allow-empty -m 'Update wasm builds'
+ # Copy apps to root
+ cp -RT ../out/wasm/apps .
+ # Copy examples to examples/ subdirectory
+ if [ -d "../out/wasm/examples" ]; then
+ mkdir -p examples
+ cp -RT ../out/wasm/examples examples
+ fi
+ git add .
+ git commit --amend --reset-author -m 'Update wasm builds'
+ git push -f origin main
diff --git a/.github/workflows/testci.yml b/.github/workflows/testci.yml
deleted file mode 100644
index b3cc16e5215..00000000000
--- a/.github/workflows/testci.yml
+++ /dev/null
@@ -1,325 +0,0 @@
-name: TestCI
-
-on:
- push:
- branches:
- - testci
-
-jobs:
- MinQtDynamic:
- runs-on: ${{ matrix.os }}
-
- strategy:
- fail-fast: false
- max-parallel: 3
- matrix:
- qt: [5.10.1]
- os: [ubuntu-20.04, macos-latest, windows-2019]
-
- steps:
- - name: Clone repository
- uses: actions/checkout@v3
- - name: Install Python 3.7 version
- uses: actions/setup-python@v4
- with:
- python-version: '3.7'
- architecture: 'x64'
- - name: Install BrainFlow and LSL submodules
- run: |
- git submodule update --init applications/mne_scan/plugins/brainflowboard/brainflow
- git submodule update --init applications/mne_scan/plugins/lsladapter/liblsl
- - name: Install Qt (Linux|MacOS)
- if: (matrix.os == 'ubuntu-20.04') || (matrix.os == 'macos-latest')
- uses: jurplel/install-qt-action@v3
- with:
- version: ${{ matrix.qt }}
- modules: qtcharts
- - name: Install Qt (Windows)
- if: matrix.os == 'windows-2019'
- uses: jurplel/install-qt-action@v3
- with:
- version: ${{ matrix.qt }}
- arch: win64_msvc2017_64
- modules: qtcharts
- - name: Compile BrainFlow submodule (Windows)
- if: matrix.os == 'windows-2019'
- run: |
- cd applications\mne_scan\plugins\brainflowboard\brainflow
- mkdir build
- cd build
- cmake -G "Visual Studio 16 2019" -A x64 -DMSVC_RUNTIME=dynamic -DCMAKE_SYSTEM_VERSION=8.1 -DCMAKE_INSTALL_PREFIX="$env:GITHUB_WORKSPACE\applications\mne_scan\plugins\brainflowboard\brainflow\installed" ..
- cmake --build . --target install --config Release
- - name: Compile BrainFlow submodule (Linux|MacOS)
- if: (matrix.os == 'ubuntu-20.04') || (matrix.os == 'macos-latest')
- run: |
- cd applications/mne_scan/plugins/brainflowboard/brainflow
- mkdir build
- cd build
- cmake -DCMAKE_INSTALL_PREFIX=../installed -DCMAKE_BUILD_TYPE=Release ..
- make
- cmake --build build
- - name: Compile LSL submodule (Windows)
- if: matrix.os == 'windows-2019'
- run: |
- cd applications\mne_scan\plugins\lsladapter\liblsl
- mkdir build
- cd build
- cmake .. -G "Visual Studio 16 2019" -A x64
- cmake --build . --config Release --target install
- - name: Compile LSL submodule (Linux|MacOS)
- if: (matrix.os == 'ubuntu-20.04') || (matrix.os == 'macos-latest')
- run: |
- cd applications/mne_scan/plugins/lsladapter/liblsl
- mkdir build
- cd build
- cmake ..
- make
- cmake --build build
- - name: Configure and compile MNE-CPP (Linux|MacOS)
- if: (matrix.os == 'ubuntu-20.04') || (matrix.os == 'macos-latest')
- run: |
- cmake -B build -S . -DCMAKE_BUILD_TYPE=Release
- cmake --build build
- - name: Configure and compile MNE-CPP (Windows)
- if: matrix.os == 'windows-2019'
- run: |
- # Setup VS compiler
- cmd.exe /c "call `"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\vcvars64.bat`" && set > %temp%\vcvars.txt"
- Get-Content "$env:temp\vcvars.txt" | Foreach-Object { if ($_ -match "^(.*?)=(.*)$") { Set-Content "env:\$($matches[1])" $matches[2] } }
- cmake -B build -S . -DCMAKE_BUILD_TYPE=Release
- cmake --build build
- - name: Deploy binaries
- run: |
- ./tools/deploy.bat dynamic pack
-
- MaxQtDynamic:
- runs-on: ${{ matrix.os }}
-
- strategy:
- fail-fast: false
- max-parallel: 3
- matrix:
- qt: [5.15.2]
- os: [ubuntu-20.04, macos-latest, windows-2019]
-
- steps:
- - name: Clone repository
- uses: actions/checkout@v3
- - name: Install Python 3.7 version
- uses: actions/setup-python@v4
- with:
- python-version: '3.7'
- architecture: 'x64'
- - name: Install BrainFlow and LSL submodules
- run: |
- git submodule update --init applications/mne_scan/plugins/brainflowboard/brainflow
- git submodule update --init applications/mne_scan/plugins/lsladapter/liblsl
- - name: Install Qt (Linux|MacOS)
- if: (matrix.os == 'ubuntu-20.04') || (matrix.os == 'macos-latest')
- uses: jurplel/install-qt-action@v3
- with:
- version: ${{ matrix.qt }}
- modules: qtcharts
- - name: Install Qt (Windows)
- if: matrix.os == 'windows-2019'
- uses: jurplel/install-qt-action@v3
- with:
- version: ${{ matrix.qt }}
- arch: win64_msvc2019_64
- modules: qtcharts
- - name: Compile BrainFlow submodule (Windows)
- if: matrix.os == 'windows-2019'
- run: |
- cd applications\mne_scan\plugins\brainflowboard\brainflow
- mkdir build
- cd build
- cmake -G "Visual Studio 16 2019" -A x64 -DMSVC_RUNTIME=dynamic -DCMAKE_SYSTEM_VERSION=8.1 -DCMAKE_INSTALL_PREFIX="$env:GITHUB_WORKSPACE\applications\mne_scan\plugins\brainflowboard\brainflow\installed" ..
- cmake --build . --target install --config Release
- - name: Compile BrainFlow submodule (Linux|MacOS)
- if: (matrix.os == 'ubuntu-20.04') || (matrix.os == 'macos-latest')
- run: |
- cd applications/mne_scan/plugins/brainflowboard/brainflow
- mkdir build
- cd build
- cmake -DCMAKE_INSTALL_PREFIX=../installed -DCMAKE_BUILD_TYPE=Release ..
- cmake --build build
- cmake --build build
- - name: Compile LSL submodule (Windows)
- if: matrix.os == 'windows-2019'
- run: |
- cd applications\mne_scan\plugins\lsladapter\liblsl
- mkdir build
- cd build
- cmake .. -G "Visual Studio 16 2019" -A x64
- cmake --build . --config Release --target install
- - name: Compile LSL submodule (Linux|MacOS)
- if: (matrix.os == 'ubuntu-20.04') || (matrix.os == 'macos-latest')
- run: |
- cd applications/mne_scan/plugins/lsladapter/liblsl
- mkdir build
- cd build
- cmake ..
- make
- cmake --build build
- - name: Configure and compile MNE-CPP (Linux|MacOS)
- if: (matrix.os == 'ubuntu-20.04') || (matrix.os == 'macos-latest')
- run: |
- cmake -B build -S . -DCMAKE_BUILD_TYPE=Release
- cmake --build build
- - name: Configure and compile MNE-CPP (Windows)
- if: matrix.os == 'windows-2019'
- run: |
- # Setup VS compiler
- cmd.exe /c "call `"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat`" && set > %temp%\vcvars.txt"
- Get-Content "$env:temp\vcvars.txt" | Foreach-Object { if ($_ -match "^(.*?)=(.*)$") { Set-Content "env:\$($matches[1])" $matches[2] } }
- cmake -B build -S . -DCMAKE_BUILD_TYPE=Release
- cmake --build build
- - name: Deploy binaries
- run: |
- ./tools/deploy.bat dynamic pack
-
- QtStatic:
- runs-on: ${{ matrix.os }}
-
- strategy:
- fail-fast: false
- max-parallel: 3
- matrix:
- os: [ubuntu-20.04, macos-latest, windows-2019]
-
- steps:
- - name: Clone repository
- uses: actions/checkout@v3
- - name: Install Python 3.7 version
- uses: actions/setup-python@v4
- with:
- python-version: '3.7'
- architecture: 'x64'
- - name: Install OpenGL (Linux)
- if: matrix.os == 'ubuntu-20.04'
- run: |
- sudo apt-get update -q
- sudo apt-get install build-essential libgl1-mesa-dev
- - name: Install Qt (Linux)
- if: matrix.os == 'ubuntu-20.04'
- run: |
- # Download the pre-built static version of Qt, which was created with the generateBinaries.yml workflow
- wget -O qt5_5152_static_binaries_linux.tar.gz https://www.dropbox.com/s/tje7jp6tsn2dxdd/qt5_5152_static_binaries_linux.tar.gz?dl=0
- mkdir ../Qt5_binaries
- tar xvzf qt5_5152_static_binaries_linux.tar.gz -C ../ -P
- - name: Install Qt (MacOS)
- if: matrix.os == 'macos-latest'
- run: |
- # Download the pre-built static version of Qt, which was created with the generateBinaries.yml workflow
- wget -O qt5_5152_static_binaries_macos.tar.gz https://www.dropbox.com/s/2hfv7q38k528tfz/qt5_5152_static_binaries_macos.tar.gz?dl=1
- tar xvzf qt5_5152_static_binaries_macos.tar.gz -P
- - name: Install Qt (Windows)
- if: matrix.os == 'windows-2019'
- run: |
- # Download the pre-built static version of Qt, which was created with the generateBinaries.yml workflow
- Invoke-WebRequest https://www.dropbox.com/s/z745z290s9pknih/qt5_5152_static_binaries_win.zip?dl=1 -OutFile .\qt5_5152_static_binaries_win.zip
- expand-archive -path "qt5_5152_static_binaries_win.zip" -destinationpath "..\"
- - name: Configure and compile MNE-CPP (Linux|MacOS)
- if: (matrix.os == 'ubuntu-20.04') || (matrix.os == 'macos-latest')
- run: |
- ../Qt5_binaries/bin/cmake -B build -S . -DCMAKE_BUILD_TYPE=Release
- cmake --build build
- - name: Configure and compile MNE-CPP (Windows)
- if: matrix.os == 'windows-2019'
- run: |
- # Setup VS compiler
- cmd.exe /c "call `"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat`" && set > %temp%\vcvars.txt"
- Get-Content "$env:temp\vcvars.txt" | Foreach-Object { if ($_ -match "^(.*?)=(.*)$") { Set-Content "env:\$($matches[1])" $matches[2] } }
- ..\Qt5_binaries\bin\cmake -B build -S . -DCMAKE_BUILD_TYPE=Release
- cmake --build build
- - name: Deploy binaries
- run: |
- ./tools/deploy.bat static pack
-
- Tests:
- runs-on: ${{ matrix.os }}
-
- strategy:
- fail-fast: false
- max-parallel: 3
- matrix:
- os: [ubuntu-20.04, macos-latest, windows-2019]
-
- steps:
- - name: Clone repository
- uses: actions/checkout@v3
- - name: Clone mne-cpp test data
- run: git clone https://github.com/mne-tools/mne-cpp-test-data.git resources/data/mne-cpp-test-data
- - name: Install Python 3.7 version
- uses: actions/setup-python@v4
- with:
- python-version: '3.7'
- architecture: 'x64'
- - name: Install Codecov
- if: matrix.os == 'ubuntu-20.04'
- run: |
- sudo pip install codecov
- - name: Install Qt (Linux|MacOS)
- if: (matrix.os == 'ubuntu-20.04') || (matrix.os == 'macos-latest')
- uses: jurplel/install-qt-action@v3
- with:
- version: 5.15.0
- modules: qtcharts
- - name: Install Qt (Windows)
- if: matrix.os == 'windows-2019'
- uses: jurplel/install-qt-action@v3
- with:
- version: 5.15.2
- arch: win64_msvc2019_64
- modules: qtcharts
- - name: Configure and compile MNE-CPP (Linux)
- if: matrix.os == 'ubuntu-20.04'
- run: |
- cmake -B build -S . -DCMAKE_BUILD_TYPE=Release
- cmake --build build
- - name: Configure and compile MNE-CPP (MacOS)
- if: matrix.os == 'macos-latest'
- run: |
- cmake -B build -S . -DCMAKE_BUILD_TYPE=Release
- cmake --build build
- - name: Configure and compile MNE-CPP (Windows)
- if: matrix.os == 'windows-2019'
- run: |
- # Setup VS compiler
- cmd.exe /c "call `"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat`" && set > %temp%\vcvars.txt"
- Get-Content "$env:temp\vcvars.txt" | Foreach-Object { if ($_ -match "^(.*?)=(.*)$") { Set-Content "env:\$($matches[1])" $matches[2] } }
- cmake -B build -S . -DCMAKE_BUILD_TYPE=Release
- cmake --build build
- - name: Run tests (Linux)
- if: matrix.os == 'ubuntu-20.04'
- env:
- CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
- QTEST_FUNCTION_TIMEOUT: 900000
- run: |
- ./tools/test_all.bat verbose withCoverage
- - name: Run tests (MacOS)
- if: matrix.os == 'macos-latest'
- env:
- QTEST_FUNCTION_TIMEOUT: 900000
- run: |
- ./tools/test_all.bat Release verbose
- - name: Run tests (Windows)
- if: matrix.os == 'windows-2019'
- env:
- QTEST_FUNCTION_TIMEOUT: 900000
- run: |
- ./tools/test_all.bat Release verbose
- Doxygen:
- runs-on: ubuntu-20.04
-
- steps:
- - name: Clone repository
- uses: actions/checkout@v3
- - name: Install Qt Dev Tools, Doxygen and Graphviz
- run: |
- sudo apt-get update -q
- sudo apt-get install -q qttools5-dev-tools doxygen graphviz
- - name: Run Doxygen and package result
- run: |
- cd doc/doxygen
- doxygen mne-cpp_doxyfile
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
new file mode 100644
index 00000000000..63dba0f962a
--- /dev/null
+++ b/.github/workflows/tests.yml
@@ -0,0 +1,211 @@
+name: Tests
+
+on:
+ push:
+ branches:
+ - v2.0-dev
+
+jobs:
+ MinQtDynamic:
+ runs-on: ${{ matrix.os }}
+
+ strategy:
+ fail-fast: false
+ max-parallel: 3
+ matrix:
+ qt: [6.10.0]
+ os: [ubuntu-24.04, macos-26, windows-2025]
+
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@v3
+ - name: Install Python 3.10 version
+ uses: actions/setup-python@v5
+ with:
+ python-version: '3.10'
+ architecture: ${{ matrix.os == 'macos-26' && 'arm64' || 'x64' }}
+ - name: Install Qt (Linux|MacOS)
+ if: (matrix.os == 'ubuntu-24.04') || (matrix.os == 'macos-26')
+ uses: jurplel/install-qt-action@v3
+ with:
+ version: ${{ matrix.qt }}
+ modules: qtshadertools
+ - name: Install Qt (Windows)
+ if: matrix.os == 'windows-2025'
+ uses: jurplel/install-qt-action@v3
+ with:
+ version: ${{ matrix.qt }}
+ arch: win64_msvc2022_64
+ modules: qtshadertools
+ - name: Configure and compile MNE-CPP (Linux|MacOS)
+ if: (matrix.os == 'ubuntu-24.04') || (matrix.os == 'macos-26')
+ run: |
+ cmake -B build -S . -DCMAKE_BUILD_TYPE=Release
+ cmake --build build
+ - name: Configure and compile MNE-CPP (Windows)
+ if: matrix.os == 'windows-2025'
+ run: |
+ # Setup VS compiler
+ cmd.exe /c "call `"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat`" && set > %temp%\vcvars.txt"
+ Get-Content "$env:temp\vcvars.txt" | Foreach-Object { if ($_ -match "^(.*?)=(.*)$") { Set-Content "env:\$($matches[1])" $matches[2] } }
+ cmake -B build -S . -DCMAKE_BUILD_TYPE=Release
+ cmake --build build --config Release
+ - name: Deploy binaries
+ run: |
+ ./tools/deploy.bat dynamic pack
+
+ MaxQtDynamic:
+ runs-on: ${{ matrix.os }}
+
+ strategy:
+ fail-fast: false
+ max-parallel: 3
+ matrix:
+ qt: [6.10.2]
+ os: [ubuntu-24.04, macos-26, windows-2025]
+
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@v3
+ - name: Install Python 3.10 version
+ uses: actions/setup-python@v5
+ with:
+ python-version: '3.10'
+ architecture: ${{ matrix.os == 'macos-26' && 'arm64' || 'x64' }}
+ - name: Install Qt (Linux|MacOS)
+ if: (matrix.os == 'ubuntu-24.04') || (matrix.os == 'macos-26')
+ uses: jurplel/install-qt-action@v3
+ with:
+ version: ${{ matrix.qt }}
+ modules: qtshadertools
+ - name: Install Qt (Windows)
+ if: matrix.os == 'windows-2025'
+ uses: jurplel/install-qt-action@v3
+ with:
+ version: ${{ matrix.qt }}
+ arch: win64_msvc2022_64
+ modules: qtshadertools
+ - name: Configure and compile MNE-CPP (Linux|MacOS)
+ if: (matrix.os == 'ubuntu-24.04') || (matrix.os == 'macos-26')
+ run: |
+ cmake -B build -S . -DCMAKE_BUILD_TYPE=Release
+ cmake --build build
+ - name: Configure and compile MNE-CPP (Windows)
+ if: matrix.os == 'windows-2025'
+ run: |
+ # Setup VS compiler
+ cmd.exe /c "call `"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat`" && set > %temp%\vcvars.txt"
+ Get-Content "$env:temp\vcvars.txt" | Foreach-Object { if ($_ -match "^(.*?)=(.*)$") { Set-Content "env:\$($matches[1])" $matches[2] } }
+ cmake -B build -S . -DCMAKE_BUILD_TYPE=Release
+ cmake --build build --config Release
+ - name: Deploy binaries
+ run: |
+ ./tools/deploy.bat dynamic pack
+
+ Tests:
+ runs-on: ${{ matrix.os }}
+
+ strategy:
+ fail-fast: false
+ max-parallel: 3
+ matrix:
+ os: [ubuntu-24.04, macos-26, windows-2025]
+
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@v3
+ - name: Clone mne-cpp test data
+ run: git clone https://github.com/mne-tools/mne-cpp-test-data.git resources/data/mne-cpp-test-data
+ - name: Install Python 3.10 version
+ uses: actions/setup-python@v5
+ with:
+ python-version: '3.10'
+ architecture: ${{ matrix.os == 'macos-26' && 'arm64' || 'x64' }}
+ - name: Install Qt (Linux|MacOS)
+ if: (matrix.os == 'ubuntu-24.04') || (matrix.os == 'macos-26')
+ uses: jurplel/install-qt-action@v3
+ with:
+ version: 6.10.2
+ modules: qtshadertools
+ - name: Install Qt (Windows)
+ if: matrix.os == 'windows-2025'
+ uses: jurplel/install-qt-action@v3
+ with:
+ version: 6.10.2
+ arch: win64_msvc2022_64
+ modules: qtshadertools
+ - name: Install MNE-Python
+ run: |
+ pip install --upgrade pip
+ pip install mne numpy scipy
+ - name: Cache MNE sample data
+ id: cache-mne-data
+ uses: actions/cache@v4
+ with:
+ path: ~/mne_data/MNE-sample-data
+ key: mne-sample-data-v1
+ - name: Download MNE sample data
+ if: steps.cache-mne-data.outputs.cache-hit != 'true'
+ run: |
+ python -c "import mne; mne.datasets.sample.data_path()"
+ - name: Configure and compile MNE-CPP (Linux)
+ if: matrix.os == 'ubuntu-24.04'
+ run: |
+ cmake -B build -S . -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=ON -DWITH_CODE_COV=ON
+ cmake --build build
+ - name: Configure and compile MNE-CPP (MacOS)
+ if: matrix.os == 'macos-26'
+ run: |
+ cmake -B build -S . -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=ON
+ cmake --build build
+ - name: Configure and compile MNE-CPP (Windows)
+ if: matrix.os == 'windows-2025'
+ run: |
+ # Setup VS compiler
+ cmd.exe /c "call `"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat`" && set > %temp%\vcvars.txt"
+ Get-Content "$env:temp\vcvars.txt" | Foreach-Object { if ($_ -match "^(.*?)=(.*)$") { Set-Content "env:\$($matches[1])" $matches[2] } }
+ cmake -B build -S . -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=ON
+ cmake --build build --config Release
+ - name: Run tests (Linux)
+ if: matrix.os == 'ubuntu-24.04'
+ env:
+ QTEST_FUNCTION_TIMEOUT: 900000
+ QT_QPA_PLATFORM: offscreen
+ MNE_DATA: ~/mne_data
+ run: |
+ ./tools/test_all.bat verbose withCoverage
+ - name: Upload coverage to Codecov
+ if: matrix.os == 'ubuntu-24.04'
+ uses: codecov/codecov-action@v4
+ with:
+ token: ${{ secrets.CODECOV_TOKEN }}
+ - name: Run tests (MacOS)
+ if: matrix.os == 'macos-26'
+ env:
+ QTEST_FUNCTION_TIMEOUT: 900000
+ QT_QPA_PLATFORM: offscreen
+ MNE_DATA: ~/mne_data
+ run: |
+ ./tools/test_all.bat Release verbose
+ - name: Run tests (Windows)
+ if: matrix.os == 'windows-2025'
+ env:
+ QTEST_FUNCTION_TIMEOUT: 900000
+ MNE_DATA: ~/mne_data
+ run: |
+ ./tools/test_all.bat Release verbose
+
+ Doxygen:
+ runs-on: ubuntu-24.04
+
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@v3
+ - name: Install Qt Dev Tools, Doxygen and Graphviz
+ run: |
+ sudo apt-get update -q
+ sudo apt-get install -q qttools5-dev-tools doxygen graphviz
+ - name: Run Doxygen and package result
+ run: |
+ cd doc/doxygen
+ doxygen mne-cpp_doxyfile
diff --git a/.github/workflows/wasmtest.yml b/.github/workflows/wasmtest.yml
index e4a5c283cfb..c8c9e075d0f 100644
--- a/.github/workflows/wasmtest.yml
+++ b/.github/workflows/wasmtest.yml
@@ -3,34 +3,93 @@ name: WasmTest
on:
push:
branches:
- # Change this to the branch name you make changes to the documentation on
- wasm
jobs:
WasmTest:
- runs-on: ubuntu-latest
+ runs-on: ubuntu-24.04
steps:
- name: Clone repository
uses: actions/checkout@v3
- - name: Setup and build WASM
+ - name: Install dependencies
+ run: |
+ sudo apt-get update -qq
+ sudo apt-get install -qq build-essential libgl1-mesa-dev ninja-build
+ - name: Setup Emscripten
run: |
cd ..
- ./mne-cpp/tools/wasm.sh --source https://github.com/mne-tools/mne-cpp.git --qt 5.15 --emsdk 3.1.20
+ git clone https://github.com/emscripten-core/emsdk.git
+ cd emsdk
+ ./emsdk install 4.0.7
+ ./emsdk activate 4.0.7
+ - name: Download pre-built WASM Qt binaries
+ id: download-qt-wasm
+ continue-on-error: true
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ gh release download qt_binaries -p 'qt6_6102_static_binaries_wasm.tar.gz' -D /tmp
+ - name: Trigger BuildQtBinaries and wait
+ if: steps.download-qt-wasm.outcome != 'success'
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ echo "WASM Qt binaries not found, triggering BuildQtBinaries workflow..."
+ gh workflow run buildqtbinaries.yml
+ # Wait for the run to appear
+ sleep 10
+ # Get the latest run ID for BuildQtBinaries
+ RUN_ID=$(gh run list -w BuildQtBinaries -L 1 --json databaseId -q '.[0].databaseId')
+ echo "Waiting for BuildQtBinaries run $RUN_ID to complete..."
+ gh run watch "$RUN_ID" --interval 30
+ # Retry download
+ echo "Retrying download..."
+ gh release download qt_binaries -p 'qt6_6102_static_binaries_wasm.tar.gz' -D /tmp
+ - name: Extract WASM Qt binaries
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ mkdir -p ${{ runner.tool_cache }}/Qt/6.10.2/wasm_multithread
+ tar xf /tmp/qt6_6102_static_binaries_wasm.tar.gz -C ${{ runner.tool_cache }}/Qt/6.10.2/wasm_multithread
+ echo "Qt6_DIR=${{ runner.tool_cache }}/Qt/6.10.2" >> $GITHUB_ENV
+ - name: Download host Qt binaries for cross-compilation
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ gh release download qt_binaries -p 'qt6_6102_static_binaries_linux.tar.gz' -D /tmp
+ mkdir -p ${{ runner.tool_cache }}/Qt/6.10.2/gcc_64
+ tar xf /tmp/qt6_6102_static_binaries_linux.tar.gz -C ${{ runner.tool_cache }}/Qt/6.10.2/gcc_64
+ - name: Build WASM
+ run: |
+ source ../emsdk/emsdk_env.sh
+ ./tools/wasm.sh --emsdk 4.0.7
+ - name: Prepare WASM artifacts
+ run: |
+ # Delete folders which we do not want to ship
+ rm -rf out/wasm/apps/mne_analyze_plugins
+ rm -rf resources/data
+ # Replace logo
+ cp resources/design/logos/qtlogo.svg out/wasm/apps/qtlogo.svg
+ if [ -d "out/wasm/examples" ]; then
+ cp resources/design/logos/qtlogo.svg out/wasm/examples/qtlogo.svg
+ fi
- name: Setup Github credentials
uses: fusion-engineering/setup-git-credentials@v2
with:
credentials: ${{secrets.GIT_CREDENTIALS_WASM_TEST}}
- - name: Update gh-pages branch with new wasm version
+ - name: Update gh-pages and main branches with new wasm version
run: |
# Setup git credentials
- git config --global user.email dev@dev.com
- git config --global user.name dev
+ git config --global user.email christoph.dinh@mne-cpp.org
+ git config --global user.name chdinh
# Save the wasm files first
- cp -RT out/Release/ ../bin
- # Replace logo
- cp -RT resources/design/logos/qtlogo.svg ../bin/qtlogo.svg
- # Checkout the gh-pages branch
+ cp -RT out/wasm/apps ../bin
+ if [ -d "out/wasm/examples" ]; then
+ cp -RT out/wasm/examples ../bin_examples
+ fi
+
+ # --- Update gh-pages branch ---
git fetch origin gh-pages
git checkout --track origin/gh-pages
# Clean and remove all files first
@@ -39,6 +98,24 @@ jobs:
git commit --amend -a -m 'Update wasm' --allow-empty
# Add the saved wasm files
cp -RT ../bin .
+ if [ -d "../bin_examples" ]; then
+ mkdir -p examples
+ cp -RT ../bin_examples examples
+ fi
git add --all
git commit --amend -a -m 'Update wasm'
- git push origin gh-pages -f
\ No newline at end of file
+ git push origin gh-pages -f
+
+ # --- Update main branch ---
+ git checkout main 2>/dev/null || git checkout -b main
+ git clean -f -d
+ git rm -rf --ignore-unmatch .
+ git commit --allow-empty -m 'Update wasm'
+ cp -RT ../bin .
+ if [ -d "../bin_examples" ]; then
+ mkdir -p examples
+ cp -RT ../bin_examples examples
+ fi
+ git add --all
+ git commit --amend -m 'Update wasm'
+ git push -f origin main
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index bcfb6110f26..911f8e3cf59 100644
--- a/.gitignore
+++ b/.gitignore
@@ -70,6 +70,10 @@ compile_commands.json
# Generated docu Docker files
/_site
+# Generated Doxygen output
+doc/doxygen/html/
+doc/doxygen/qt-creator_doc/
+
/build*
/out*
/resources/data*
diff --git a/.gitmodules b/.gitmodules
index d1d54f61d0e..083f5dcd14e 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -2,11 +2,3 @@
path = resources/data/mne-cpp-test-data
url = https://github.com/mne-tools/mne-cpp-test-data.git
branch = master
-[submodule "src/applications/mne_scan/plugins/lsladapter/liblsl"]
- path = src/applications/mne_scan/plugins/lsladapter/liblsl
- url = https://github.com/sccn/liblsl.git
- branch = master
-[submodule "src/applications/mne_scan/plugins/brainflowboard/brainflow"]
- path = src/applications/mne_scan/plugins/brainflowboard/brainflow
- url = https://github.com/brainflow-dev/brainflow
- branch = master
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 00000000000..738958a6d50
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,5 @@
+cmake_minimum_required(VERSION 3.15)
+
+# Root entry point for IDEs; keep the real project definition in src
+# so existing paths that rely on PROJECT_SOURCE_DIR remain unchanged.
+add_subdirectory(src)
diff --git a/LICENSE b/LICENSE
index d58f7819e31..64203e84707 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
BSD 3-Clause License
-Copyright (c) 2011-2021, authors of MNE-CPP. All rights reserved.
+Copyright (c) 2011-2026, authors of MNE-CPP. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
diff --git a/README.md b/README.md
index 58bb601db79..aa69ed3351a 100644
--- a/README.md
+++ b/README.md
@@ -2,12 +2,18 @@
-
-
+
+
+
+
+
+
+
+
@@ -25,14 +31,19 @@ Build from source
`tools/build_project.bat` builds the project for Windows, Linux, and MacOS.
+For IDE discovery and manual builds, configure from the repository root:
+
+`cmake -S . -B build`
+
For more in depth information on how to compile the project, please follow the [build guide](https://mne-cpp.github.io/pages/development/buildguide.html). The minimum requirements to build MNE-CPP are:
* Compiler
- * Windows - [MSVC 2015](https://visualstudio.microsoft.com/vs/older-downloads/) or later
- * Linux - [GCC 5.3.1](https://gcc.gnu.org/releases.html) or later
- * MacOS - [Clang 3.5](https://developer.apple.com/xcode/) or later
+ * Windows - [MSVC 2022](https://visualstudio.microsoft.com/vs/) or later
+ * Linux - [GCC 13](https://gcc.gnu.org/releases.html) or later
+ * MacOS - [Clang 14](https://developer.apple.com/xcode/) or later
* External dependencies
- * [Qt 5.10](https://www.qt.io/) or later
+ * [Qt 6.10](https://www.qt.io/) or later
+ * [Python 3.10](https://www.python.org/) or later
Releases
--------
@@ -54,7 +65,7 @@ License
MNE-CPP is **BSD-licenced** (3 clause):
- Copyright (c) 2011-2021, authors of MNE-CPP. All rights reserved.
+ Copyright (c) 2011-2026, authors of MNE-CPP. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
diff --git a/codecov.yml b/codecov.yml
index 9e80fcc30a8..218bc8e311f 100644
--- a/codecov.yml
+++ b/codecov.yml
@@ -1,5 +1,6 @@
codecov:
require_ci_to_pass: yes
+ branch: v2.0-dev
coverage:
precision: 2
@@ -30,4 +31,6 @@ comment:
require_changes: no
ignore:
- - "include/.*" # ignore folders and all its contents
+ - "src/external/**" # third-party libraries (e.g. Eigen)
+ - "src/examples/**" # example code is not part of coverage
+ - "src/testframes/**" # test harnesses themselves
diff --git a/doc/doxygen/DoxygenLayout.xml b/doc/doxygen/DoxygenLayout.xml
index 891275c3119..33fe46af7b8 100644
--- a/doc/doxygen/DoxygenLayout.xml
+++ b/doc/doxygen/DoxygenLayout.xml
@@ -2,6 +2,7 @@
+
@@ -19,7 +20,6 @@
-
diff --git a/doc/doxygen/MNE-CPP_Logo.svg b/doc/doxygen/MNE-CPP_Logo.svg
new file mode 100644
index 00000000000..36627fe9587
--- /dev/null
+++ b/doc/doxygen/MNE-CPP_Logo.svg
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/doxygen/MNE-CPP_Logo_Dark.svg b/doc/doxygen/MNE-CPP_Logo_Dark.svg
new file mode 100644
index 00000000000..1449b673081
--- /dev/null
+++ b/doc/doxygen/MNE-CPP_Logo_Dark.svg
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/doxygen/about.md b/doc/doxygen/about.md
deleted file mode 100644
index 581d94a92c3..00000000000
--- a/doc/doxygen/about.md
+++ /dev/null
@@ -1,6 +0,0 @@
-About {#mainpage}
-=================
-
-For more information on MNE-CPP please visit https://mne-cpp.github.io/.
-
-A guide on how to integrate this documentation into the QtCreator can be found [here](https://mne-cpp.github.io/pages/contribute/conv_style.html).
diff --git a/doc/doxygen/doxygen-awesome/VERSION b/doc/doxygen/doxygen-awesome/VERSION
new file mode 100644
index 00000000000..3bd1283bd1f
--- /dev/null
+++ b/doc/doxygen/doxygen-awesome/VERSION
@@ -0,0 +1,2 @@
+doxygen-awesome-css v2.4.1
+Source: https://github.com/jothepro/doxygen-awesome-css
diff --git a/doc/doxygen/doxygen-awesome/doxygen-awesome-darkmode-toggle.js b/doc/doxygen/doxygen-awesome/doxygen-awesome-darkmode-toggle.js
new file mode 100644
index 00000000000..5bd8c3ab36b
--- /dev/null
+++ b/doc/doxygen/doxygen-awesome/doxygen-awesome-darkmode-toggle.js
@@ -0,0 +1,138 @@
+// SPDX-License-Identifier: MIT
+/**
+
+Doxygen Awesome
+https://github.com/jothepro/doxygen-awesome-css
+
+Copyright (c) 2021 - 2025 jothepro
+Modified: 3-state toggle (light → dark → system) to match Docusaurus
+
+*/
+
+class DoxygenAwesomeDarkModeToggle extends HTMLElement {
+ // SVG icons – same as Docusaurus (Google Material Icons, Apache 2.0)
+ static lightModeIcon = ` `
+ static darkModeIcon = ` `
+ static systemModeIcon = ` `
+
+ static colorModeKey = "doxygen-color-mode"
+ // Possible stored values: "light", "dark", null (= system)
+
+ static _staticConstructor = function () {
+ DoxygenAwesomeDarkModeToggle.applyColorMode()
+ window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
+ DoxygenAwesomeDarkModeToggle.applyColorMode()
+ })
+ document.addEventListener("visibilitychange", () => {
+ if (document.visibilityState === 'visible') {
+ DoxygenAwesomeDarkModeToggle.applyColorMode()
+ }
+ });
+ }()
+
+ /**
+ * @returns "light", "dark", or null (system)
+ */
+ static get colorMode() {
+ const stored = localStorage.getItem(DoxygenAwesomeDarkModeToggle.colorModeKey)
+ if (stored === "light" || stored === "dark") return stored
+ return null // system
+ }
+
+ static set colorMode(mode) {
+ if (mode === "light" || mode === "dark") {
+ localStorage.setItem(DoxygenAwesomeDarkModeToggle.colorModeKey, mode)
+ } else {
+ localStorage.removeItem(DoxygenAwesomeDarkModeToggle.colorModeKey)
+ }
+ DoxygenAwesomeDarkModeToggle.applyColorMode()
+ }
+
+ static get systemPreference() {
+ return window.matchMedia('(prefers-color-scheme: dark)').matches
+ }
+
+ static get effectiveDarkMode() {
+ const mode = DoxygenAwesomeDarkModeToggle.colorMode
+ if (mode === "dark") return true
+ if (mode === "light") return false
+ return DoxygenAwesomeDarkModeToggle.systemPreference
+ }
+
+ static applyColorMode() {
+ const dark = DoxygenAwesomeDarkModeToggle.effectiveDarkMode
+ DoxygenAwesomeDarkModeToggle.darkModeEnabled = dark
+ if (dark) {
+ document.documentElement.classList.add("dark-mode")
+ document.documentElement.classList.remove("light-mode")
+ } else {
+ document.documentElement.classList.remove("dark-mode")
+ document.documentElement.classList.add("light-mode")
+ }
+ }
+
+ /**
+ * Cycle: light → dark → system → light → …
+ * (same order as Docusaurus)
+ */
+ static getNextColorMode(current) {
+ switch (current) {
+ case null: return "light"
+ case "light": return "dark"
+ case "dark": return null
+ default: return "light"
+ }
+ }
+
+ static init() {
+ $(function () {
+ $(document).ready(function () {
+ const toggleButton = document.createElement('doxygen-awesome-dark-mode-toggle')
+ toggleButton.updateIcon()
+
+ window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
+ toggleButton.updateIcon()
+ })
+ document.addEventListener("visibilitychange", () => {
+ if (document.visibilityState === 'visible') {
+ toggleButton.updateIcon()
+ }
+ });
+
+ $(document).ready(function () {
+ document.getElementById("MSearchBox").parentNode.appendChild(toggleButton)
+ })
+ $(window).resize(function () {
+ document.getElementById("MSearchBox").parentNode.appendChild(toggleButton)
+ })
+ })
+ })
+ }
+
+ constructor() {
+ super();
+ this.onclick = this.toggleDarkMode
+ }
+
+ toggleDarkMode() {
+ const next = DoxygenAwesomeDarkModeToggle.getNextColorMode(DoxygenAwesomeDarkModeToggle.colorMode)
+ DoxygenAwesomeDarkModeToggle.colorMode = next
+ this.updateIcon()
+ }
+
+ updateIcon() {
+ const mode = DoxygenAwesomeDarkModeToggle.colorMode
+ if (mode === "light") {
+ this.innerHTML = DoxygenAwesomeDarkModeToggle.lightModeIcon
+ this.title = "Light mode – click to switch to dark mode"
+ } else if (mode === "dark") {
+ this.innerHTML = DoxygenAwesomeDarkModeToggle.darkModeIcon
+ this.title = "Dark mode – click to switch to system mode"
+ } else {
+ this.innerHTML = DoxygenAwesomeDarkModeToggle.systemModeIcon
+ this.title = "System mode – click to switch to light mode"
+ }
+ }
+}
+
+customElements.define("doxygen-awesome-dark-mode-toggle", DoxygenAwesomeDarkModeToggle);
diff --git a/doc/doxygen/doxygen-awesome/doxygen-awesome-fragment-copy-button.js b/doc/doxygen/doxygen-awesome/doxygen-awesome-fragment-copy-button.js
new file mode 100644
index 00000000000..e0994dcab52
--- /dev/null
+++ b/doc/doxygen/doxygen-awesome/doxygen-awesome-fragment-copy-button.js
@@ -0,0 +1,66 @@
+// SPDX-License-Identifier: MIT
+/**
+
+Doxygen Awesome
+https://github.com/jothepro/doxygen-awesome-css
+
+Copyright (c) 2022 - 2025 jothepro
+
+*/
+
+class DoxygenAwesomeFragmentCopyButton extends HTMLElement {
+ constructor() {
+ super();
+ this.onclick=this.copyContent
+ }
+ static title = "Copy to clipboard"
+ static copyIcon = ` `
+ static successIcon = ` `
+ static successDuration = 980
+ static init() {
+ $(function() {
+ $(document).ready(function() {
+ if(navigator.clipboard) {
+ const fragments = document.getElementsByClassName("fragment")
+ for(const fragment of fragments) {
+ const fragmentWrapper = document.createElement("div")
+ fragmentWrapper.className = "doxygen-awesome-fragment-wrapper"
+ const fragmentCopyButton = document.createElement("doxygen-awesome-fragment-copy-button")
+ fragmentCopyButton.innerHTML = DoxygenAwesomeFragmentCopyButton.copyIcon
+ fragmentCopyButton.title = DoxygenAwesomeFragmentCopyButton.title
+
+ fragment.parentNode.replaceChild(fragmentWrapper, fragment)
+ fragmentWrapper.appendChild(fragment)
+ fragmentWrapper.appendChild(fragmentCopyButton)
+
+ }
+ }
+ })
+ })
+ }
+
+
+ copyContent() {
+ const content = this.previousSibling.cloneNode(true)
+ // filter out line number from file listings
+ content.querySelectorAll(".lineno, .ttc").forEach((node) => {
+ node.remove()
+ })
+ let textContent = content.textContent
+ // remove trailing newlines that appear in file listings
+ let numberOfTrailingNewlines = 0
+ while(textContent.charAt(textContent.length - (numberOfTrailingNewlines + 1)) == '\n') {
+ numberOfTrailingNewlines++;
+ }
+ textContent = textContent.substring(0, textContent.length - numberOfTrailingNewlines)
+ navigator.clipboard.writeText(textContent);
+ this.classList.add("success")
+ this.innerHTML = DoxygenAwesomeFragmentCopyButton.successIcon
+ window.setTimeout(() => {
+ this.classList.remove("success")
+ this.innerHTML = DoxygenAwesomeFragmentCopyButton.copyIcon
+ }, DoxygenAwesomeFragmentCopyButton.successDuration);
+ }
+}
+
+customElements.define("doxygen-awesome-fragment-copy-button", DoxygenAwesomeFragmentCopyButton)
diff --git a/doc/doxygen/doxygen-awesome/doxygen-awesome-interactive-toc.js b/doc/doxygen/doxygen-awesome/doxygen-awesome-interactive-toc.js
new file mode 100644
index 00000000000..70d23b70283
--- /dev/null
+++ b/doc/doxygen/doxygen-awesome/doxygen-awesome-interactive-toc.js
@@ -0,0 +1,72 @@
+// SPDX-License-Identifier: MIT
+/**
+
+Doxygen Awesome
+https://github.com/jothepro/doxygen-awesome-css
+
+Copyright (c) 2022 - 2025 jothepro
+
+*/
+
+class DoxygenAwesomeInteractiveToc {
+ static topOffset = 38
+ static hideMobileMenu = true
+ static headers = []
+
+ static init() {
+ window.addEventListener("load", () => {
+ let toc = document.querySelector(".contents > .toc")
+ if(toc) {
+ toc.classList.add("interactive")
+ if(!DoxygenAwesomeInteractiveToc.hideMobileMenu) {
+ toc.classList.add("open")
+ }
+ document.querySelector(".contents > .toc > h3")?.addEventListener("click", () => {
+ if(toc.classList.contains("open")) {
+ toc.classList.remove("open")
+ } else {
+ toc.classList.add("open")
+ }
+ })
+
+ document.querySelectorAll(".contents > .toc > ul a").forEach((node) => {
+ let id = node.getAttribute("href").substring(1)
+ DoxygenAwesomeInteractiveToc.headers.push({
+ node: node,
+ headerNode: document.getElementById(id)
+ })
+
+ document.getElementById("doc-content")?.addEventListener("scroll",this.throttle(DoxygenAwesomeInteractiveToc.update, 100))
+ })
+ DoxygenAwesomeInteractiveToc.update()
+ }
+ })
+ }
+
+ static update() {
+ let active = DoxygenAwesomeInteractiveToc.headers[0]?.node
+ DoxygenAwesomeInteractiveToc.headers.forEach((header) => {
+ let position = header.headerNode.getBoundingClientRect().top
+ header.node.classList.remove("active")
+ header.node.classList.remove("aboveActive")
+ if(position < DoxygenAwesomeInteractiveToc.topOffset) {
+ active = header.node
+ active?.classList.add("aboveActive")
+ }
+ })
+ active?.classList.add("active")
+ active?.classList.remove("aboveActive")
+ }
+
+ static throttle(func, delay) {
+ let lastCall = 0;
+ return function (...args) {
+ const now = new Date().getTime();
+ if (now - lastCall < delay) {
+ return;
+ }
+ lastCall = now;
+ return setTimeout(() => {func(...args)}, delay);
+ };
+ }
+}
diff --git a/doc/doxygen/doxygen-awesome/doxygen-awesome-paragraph-link.js b/doc/doxygen/doxygen-awesome/doxygen-awesome-paragraph-link.js
new file mode 100644
index 00000000000..1c4c227e766
--- /dev/null
+++ b/doc/doxygen/doxygen-awesome/doxygen-awesome-paragraph-link.js
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: MIT
+/**
+
+Doxygen Awesome
+https://github.com/jothepro/doxygen-awesome-css
+
+Copyright (c) 2022 - 2025 jothepro
+
+*/
+
+class DoxygenAwesomeParagraphLink {
+ // Icon from https://fonts.google.com/icons
+ // Licensed under the Apache 2.0 license:
+ // https://www.apache.org/licenses/LICENSE-2.0.html
+ static icon = ` `
+ static title = "Permanent Link"
+ static init() {
+ $(function() {
+ $(document).ready(function() {
+ document.querySelectorAll(".contents a.anchor[id], .contents .groupheader > a[id]").forEach((node) => {
+ let anchorlink = document.createElement("a")
+ anchorlink.setAttribute("href", `#${node.getAttribute("id")}`)
+ anchorlink.setAttribute("title", DoxygenAwesomeParagraphLink.title)
+ anchorlink.classList.add("anchorlink")
+ node.classList.add("anchor")
+ anchorlink.innerHTML = DoxygenAwesomeParagraphLink.icon
+ node.parentElement.appendChild(anchorlink)
+ })
+ })
+ })
+ }
+}
diff --git a/doc/doxygen/doxygen-awesome/doxygen-awesome-sidebar-only-darkmode-toggle.css b/doc/doxygen/doxygen-awesome/doxygen-awesome-sidebar-only-darkmode-toggle.css
new file mode 100644
index 00000000000..2ab5c768a45
--- /dev/null
+++ b/doc/doxygen/doxygen-awesome/doxygen-awesome-sidebar-only-darkmode-toggle.css
@@ -0,0 +1,20 @@
+/* SPDX-License-Identifier: MIT */
+/**
+
+Doxygen Awesome
+https://github.com/jothepro/doxygen-awesome-css
+
+Copyright (c) 2021 - 2025 jothepro
+
+*/
+
+@media screen and (min-width: 768px) {
+
+ #MSearchBox {
+ width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - var(--searchbar-height) - 1px);
+ }
+
+ #MSearchField {
+ width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - 66px - var(--searchbar-height));
+ }
+}
diff --git a/doc/doxygen/doxygen-awesome/doxygen-awesome-sidebar-only.css b/doc/doxygen/doxygen-awesome/doxygen-awesome-sidebar-only.css
new file mode 100644
index 00000000000..f7c644d6e26
--- /dev/null
+++ b/doc/doxygen/doxygen-awesome/doxygen-awesome-sidebar-only.css
@@ -0,0 +1,105 @@
+/* SPDX-License-Identifier: MIT */
+/**
+
+Doxygen Awesome
+https://github.com/jothepro/doxygen-awesome-css
+
+Copyright (c) 2021 - 2025 jothepro
+
+ */
+
+html {
+ /* side nav width. MUST be = `TREEVIEW_WIDTH`.
+ * Make sure it is wide enough to contain the page title (logo + title + version)
+ */
+ --side-nav-fixed-width: 335px;
+ --menu-display: none;
+
+ --top-height: 120px;
+ --toc-sticky-top: -25px;
+ --toc-max-height: calc(100vh - 2 * var(--spacing-medium) - 25px);
+}
+
+#projectname {
+ white-space: nowrap;
+}
+
+
+@media screen and (min-width: 768px) {
+ html {
+ --searchbar-background: var(--page-background-color);
+ }
+
+ #side-nav {
+ min-width: var(--side-nav-fixed-width);
+ max-width: var(--side-nav-fixed-width);
+ top: var(--top-height);
+ overflow: visible;
+ }
+
+ #nav-tree, #side-nav {
+ height: calc(100vh - var(--top-height)) !important;
+ }
+
+ #top {
+ display: block;
+ border-bottom: none;
+ height: var(--top-height);
+ margin-bottom: calc(0px - var(--top-height));
+ max-width: var(--side-nav-fixed-width);
+ overflow: hidden;
+ background: var(--side-nav-background);
+ }
+
+ #main-nav {
+ float: left;
+ padding-right: 0;
+ }
+
+ .ui-resizable-handle {
+ display: none;
+ }
+
+ .ui-resizable-e {
+ width: 0;
+ }
+
+ #nav-path {
+ position: fixed;
+ right: 0;
+ left: calc(var(--side-nav-fixed-width) + 1px);
+ bottom: 0;
+ width: auto;
+ }
+
+ #doc-content {
+ height: calc(100vh - 31px) !important;
+ padding-bottom: calc(3 * var(--spacing-large));
+ padding-top: calc(var(--top-height) - 80px);
+ box-sizing: border-box;
+ margin-left: var(--side-nav-fixed-width) !important;
+ }
+
+ #MSearchBox {
+ width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)));
+ }
+
+ #MSearchField {
+ width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - 65px);
+ }
+
+ #MSearchResultsWindow {
+ left: var(--spacing-medium) !important;
+ right: auto;
+ }
+
+ #nav-sync {
+ bottom: 4px;
+ right: auto;
+ left: 300px;
+ width: 35px;
+ top: auto !important;
+ user-select: none;
+ position: fixed
+ }
+}
diff --git a/doc/doxygen/doxygen-awesome/doxygen-awesome-tabs.js b/doc/doxygen/doxygen-awesome/doxygen-awesome-tabs.js
new file mode 100644
index 00000000000..9e8d3af2ffd
--- /dev/null
+++ b/doc/doxygen/doxygen-awesome/doxygen-awesome-tabs.js
@@ -0,0 +1,71 @@
+// SPDX-License-Identifier: MIT
+/**
+
+Doxygen Awesome
+https://github.com/jothepro/doxygen-awesome-css
+
+Copyright (c) 2023 - 2025 jothepro
+
+*/
+
+class DoxygenAwesomeTabs {
+
+ static init() {
+ window.addEventListener("load", () => {
+ document.querySelectorAll(".tabbed:not(:empty)").forEach((tabbed, tabbedIndex) => {
+ let tabLinkList = []
+ tabbed.querySelectorAll(":scope > ul > li").forEach((tab, tabIndex) => {
+ tab.id = "tab_" + tabbedIndex + "_" + tabIndex
+ let header = tab.querySelector(".tab-title")
+ let tabLink = document.createElement("button")
+ tabLink.classList.add("tab-button")
+ tabLink.appendChild(header)
+ header.title = header.textContent
+ tabLink.addEventListener("click", () => {
+ tabbed.querySelectorAll(":scope > ul > li").forEach((tab) => {
+ tab.classList.remove("selected")
+ })
+ tabLinkList.forEach((tabLink) => {
+ tabLink.classList.remove("active")
+ })
+ tab.classList.add("selected")
+ tabLink.classList.add("active")
+ })
+ tabLinkList.push(tabLink)
+ if(tabIndex == 0) {
+ tab.classList.add("selected")
+ tabLink.classList.add("active")
+ }
+ })
+ let tabsOverview = document.createElement("div")
+ tabsOverview.classList.add("tabs-overview")
+ let tabsOverviewContainer = document.createElement("div")
+ tabsOverviewContainer.classList.add("tabs-overview-container")
+ tabLinkList.forEach((tabLink) => {
+ tabsOverview.appendChild(tabLink)
+ })
+ tabsOverviewContainer.appendChild(tabsOverview)
+ tabbed.before(tabsOverviewContainer)
+
+ function resize() {
+ let maxTabHeight = 0
+ tabbed.querySelectorAll(":scope > ul > li").forEach((tab, tabIndex) => {
+ let visibility = tab.style.display
+ tab.style.display = "block"
+ maxTabHeight = Math.max(tab.offsetHeight, maxTabHeight)
+ tab.style.display = visibility
+ })
+ tabbed.style.height = `${maxTabHeight + 10}px`
+ }
+
+ resize()
+ new ResizeObserver(resize).observe(tabbed)
+ })
+ })
+
+ }
+
+ static resize(tabbed) {
+
+ }
+}
\ No newline at end of file
diff --git a/doc/doxygen/doxygen-awesome/doxygen-awesome.css b/doc/doxygen/doxygen-awesome/doxygen-awesome.css
new file mode 100644
index 00000000000..f992c232957
--- /dev/null
+++ b/doc/doxygen/doxygen-awesome/doxygen-awesome.css
@@ -0,0 +1,3020 @@
+/* SPDX-License-Identifier: MIT */
+/**
+
+Doxygen Awesome
+https://github.com/jothepro/doxygen-awesome-css
+
+Copyright (c) 2021 - 2025 jothepro
+
+*/
+
+html {
+ /* primary theme color. This will affect the entire websites color scheme: links, arrows, labels, ... */
+ --primary-color: #1779c4;
+ --primary-dark-color: #335c80;
+ --primary-light-color: #70b1e9;
+ --on-primary-color: #ffffff;
+
+ --link-color: var(--primary-color);
+
+ /* page base colors */
+ --page-background-color: #ffffff;
+ --page-foreground-color: #2f4153;
+ --page-secondary-foreground-color: #6f7e8e;
+
+ /* color for all separators on the website: hr, borders, ... */
+ --separator-color: #dedede;
+
+ /* border radius for all rounded components. Will affect many components, like dropdowns, memitems, codeblocks, ... */
+ --border-radius-large: 10px;
+ --border-radius-small: 5px;
+ --border-radius-medium: 8px;
+
+ /* default spacings. Most components reference these values for spacing, to provide uniform spacing on the page. */
+ --spacing-small: 5px;
+ --spacing-medium: 10px;
+ --spacing-large: 16px;
+ --spacing-xlarge: 20px;
+
+ /* default box shadow used for raising an element above the normal content. Used in dropdowns, search result, ... */
+ --box-shadow: 0 2px 8px 0 rgba(0,0,0,.075);
+
+ --odd-color: rgba(0,0,0,.028);
+
+ /* font-families. will affect all text on the website
+ * font-family: the normal font for text, headlines, menus
+ * font-family-monospace: used for preformatted text in memtitle, code, fragments
+ */
+ --font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;
+ --font-family-monospace: ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;
+
+ /* font sizes */
+ --page-font-size: 15.6px;
+ --navigation-font-size: 14.4px;
+ --toc-font-size: 13.4px;
+ --code-font-size: 14px; /* affects code, fragment */
+ --title-font-size: 22px;
+
+ /* content text properties. These only affect the page content, not the navigation or any other ui elements */
+ --content-line-height: 27px;
+ /* The content is centered and constraint in it's width. To make the content fill the whole page, set the variable to auto.*/
+ --content-maxwidth: 1050px;
+ --table-line-height: 24px;
+ --toc-sticky-top: var(--spacing-medium);
+ --toc-width: 200px;
+ --toc-max-height: calc(100vh - 2 * var(--spacing-medium) - 85px);
+
+ /* colors for various content boxes: @warning, @note, @deprecated @bug */
+ --warning-color: #faf3d8;
+ --warning-color-dark: #f3a600;
+ --warning-color-darker: #5f4204;
+ --note-color: #e4f3ff;
+ --note-color-dark: #1879C4;
+ --note-color-darker: #274a5c;
+ --todo-color: #e4dafd;
+ --todo-color-dark: #5b2bdd;
+ --todo-color-darker: #2a0d72;
+ --deprecated-color: #ecf0f3;
+ --deprecated-color-dark: #5b6269;
+ --deprecated-color-darker: #43454a;
+ --bug-color: #f8d1cc;
+ --bug-color-dark: #b61825;
+ --bug-color-darker: #75070f;
+ --invariant-color: #d8f1e3;
+ --invariant-color-dark: #44b86f;
+ --invariant-color-darker: #265532;
+
+ /* blockquote colors */
+ --blockquote-background: #f8f9fa;
+ --blockquote-foreground: #636568;
+
+ /* table colors */
+ --tablehead-background: #f1f1f1;
+ --tablehead-foreground: var(--page-foreground-color);
+
+ /* menu-display: block | none
+ * Visibility of the top navigation on screens >= 768px. On smaller screen the menu is always visible.
+ * `GENERATE_TREEVIEW` MUST be enabled!
+ */
+ --menu-display: block;
+
+ --menu-focus-foreground: var(--on-primary-color);
+ --menu-focus-background: var(--primary-color);
+ --menu-selected-background: rgba(0,0,0,.05);
+
+
+ --header-background: var(--page-background-color);
+ --header-foreground: var(--page-foreground-color);
+
+ /* searchbar colors */
+ --searchbar-background: var(--side-nav-background);
+ --searchbar-foreground: var(--page-foreground-color);
+
+ /* searchbar size
+ * (`searchbar-width` is only applied on screens >= 768px.
+ * on smaller screens the searchbar will always fill the entire screen width) */
+ --searchbar-height: 33px;
+ --searchbar-width: 210px;
+ --searchbar-border-radius: var(--searchbar-height);
+
+ /* code block colors */
+ --code-background: #f5f5f5;
+ --code-foreground: var(--page-foreground-color);
+
+ /* fragment colors */
+ --fragment-background: #F8F9FA;
+ --fragment-foreground: #37474F;
+ --fragment-keyword: #bb6bb2;
+ --fragment-keywordtype: #8258b3;
+ --fragment-keywordflow: #d67c3b;
+ --fragment-token: #438a59;
+ --fragment-comment: #969696;
+ --fragment-link: #5383d6;
+ --fragment-preprocessor: #46aaa5;
+ --fragment-linenumber-color: #797979;
+ --fragment-linenumber-background: #f4f4f5;
+ --fragment-linenumber-border: #e3e5e7;
+ --fragment-lineheight: 20px;
+
+ /* sidebar navigation (treeview) colors */
+ --side-nav-background: #fbfbfb;
+ --side-nav-foreground: var(--page-foreground-color);
+ --side-nav-arrow-opacity: 0;
+ --side-nav-arrow-hover-opacity: 0.9;
+
+ --toc-background: var(--side-nav-background);
+ --toc-foreground: var(--side-nav-foreground);
+
+ /* height of an item in any tree / collapsible table */
+ --tree-item-height: 30px;
+
+ --memname-font-size: var(--code-font-size);
+ --memtitle-font-size: 18px;
+
+ --webkit-scrollbar-size: 7px;
+ --webkit-scrollbar-padding: 4px;
+ --webkit-scrollbar-color: var(--separator-color);
+
+ --animation-duration: .12s
+}
+
+@media screen and (max-width: 767px) {
+ html {
+ --page-font-size: 16px;
+ --navigation-font-size: 16px;
+ --toc-font-size: 15px;
+ --code-font-size: 15px; /* affects code, fragment */
+ --title-font-size: 22px;
+ }
+}
+
+@media (prefers-color-scheme: dark) {
+ html:not(.light-mode) {
+ color-scheme: dark;
+
+ --primary-color: #1982d2;
+ --primary-dark-color: #86a9c4;
+ --primary-light-color: #4779ac;
+
+ --box-shadow: 0 2px 8px 0 rgba(0,0,0,.35);
+
+ --odd-color: rgba(100,100,100,.06);
+
+ --menu-selected-background: rgba(0,0,0,.4);
+
+ --page-background-color: #1C1D1F;
+ --page-foreground-color: #d2dbde;
+ --page-secondary-foreground-color: #859399;
+ --separator-color: #38393b;
+ --side-nav-background: #252628;
+
+ --code-background: #2a2c2f;
+
+ --tablehead-background: #2a2c2f;
+
+ --blockquote-background: #222325;
+ --blockquote-foreground: #7e8c92;
+
+ --warning-color: #3b2e04;
+ --warning-color-dark: #f1b602;
+ --warning-color-darker: #ceb670;
+ --note-color: #163750;
+ --note-color-dark: #1982D2;
+ --note-color-darker: #dcf0fa;
+ --todo-color: #2a2536;
+ --todo-color-dark: #7661b3;
+ --todo-color-darker: #ae9ed6;
+ --deprecated-color: #2e323b;
+ --deprecated-color-dark: #738396;
+ --deprecated-color-darker: #abb0bd;
+ --bug-color: #2e1917;
+ --bug-color-dark: #ad2617;
+ --bug-color-darker: #f5b1aa;
+ --invariant-color: #303a35;
+ --invariant-color-dark: #76ce96;
+ --invariant-color-darker: #cceed5;
+
+ --fragment-background: #282c34;
+ --fragment-foreground: #dbe4eb;
+ --fragment-keyword: #cc99cd;
+ --fragment-keywordtype: #ab99cd;
+ --fragment-keywordflow: #e08000;
+ --fragment-token: #7ec699;
+ --fragment-comment: #999999;
+ --fragment-link: #98c0e3;
+ --fragment-preprocessor: #65cabe;
+ --fragment-linenumber-color: #cccccc;
+ --fragment-linenumber-background: #35393c;
+ --fragment-linenumber-border: #1f1f1f;
+ }
+}
+
+/* dark mode variables are defined twice, to support both the dark-mode without and with doxygen-awesome-darkmode-toggle.js */
+html.dark-mode {
+ color-scheme: dark;
+
+ --primary-color: #1982d2;
+ --primary-dark-color: #86a9c4;
+ --primary-light-color: #4779ac;
+
+ --box-shadow: 0 2px 8px 0 rgba(0,0,0,.30);
+
+ --odd-color: rgba(100,100,100,.06);
+
+ --menu-selected-background: rgba(0,0,0,.4);
+
+ --page-background-color: #1C1D1F;
+ --page-foreground-color: #d2dbde;
+ --page-secondary-foreground-color: #859399;
+ --separator-color: #38393b;
+ --side-nav-background: #252628;
+
+ --code-background: #2a2c2f;
+
+ --tablehead-background: #2a2c2f;
+
+ --blockquote-background: #222325;
+ --blockquote-foreground: #7e8c92;
+
+ --warning-color: #3b2e04;
+ --warning-color-dark: #f1b602;
+ --warning-color-darker: #ceb670;
+ --note-color: #163750;
+ --note-color-dark: #1982D2;
+ --note-color-darker: #dcf0fa;
+ --todo-color: #2a2536;
+ --todo-color-dark: #7661b3;
+ --todo-color-darker: #ae9ed6;
+ --deprecated-color: #2e323b;
+ --deprecated-color-dark: #738396;
+ --deprecated-color-darker: #abb0bd;
+ --bug-color: #2e1917;
+ --bug-color-dark: #ad2617;
+ --bug-color-darker: #f5b1aa;
+ --invariant-color: #303a35;
+ --invariant-color-dark: #76ce96;
+ --invariant-color-darker: #cceed5;
+
+ --fragment-background: #282c34;
+ --fragment-foreground: #dbe4eb;
+ --fragment-keyword: #cc99cd;
+ --fragment-keywordtype: #ab99cd;
+ --fragment-keywordflow: #e08000;
+ --fragment-token: #7ec699;
+ --fragment-comment: #999999;
+ --fragment-link: #98c0e3;
+ --fragment-preprocessor: #65cabe;
+ --fragment-linenumber-color: #cccccc;
+ --fragment-linenumber-background: #35393c;
+ --fragment-linenumber-border: #1f1f1f;
+}
+
+body {
+ color: var(--page-foreground-color);
+ background-color: var(--page-background-color);
+ font-size: var(--page-font-size);
+}
+
+body, table, div, p, dl, #nav-tree .label, #nav-tree a, .title,
+.sm-dox a, .sm-dox a:hover, .sm-dox a:focus, #projectname,
+.SelectItem, #MSearchField, .navpath li.navelem a,
+.navpath li.navelem a:hover, p.reference, p.definition, div.toc li, div.toc h3,
+#page-nav ul.page-outline li a {
+ font-family: var(--font-family);
+}
+
+h1, h2, h3, h4, h5 {
+ margin-top: 1em;
+ font-weight: 600;
+ line-height: initial;
+}
+
+p, div, table, dl, p.reference, p.definition {
+ font-size: var(--page-font-size);
+}
+
+p.reference, p.definition {
+ color: var(--page-secondary-foreground-color);
+}
+
+a:link, a:visited, a:hover, a:focus, a:active {
+ color: var(--link-color) !important;
+ font-weight: 500;
+ background: none;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+a.anchor {
+ scroll-margin-top: var(--spacing-large);
+ display: block;
+}
+
+/*
+ Title and top navigation
+ */
+
+#top {
+ background: var(--header-background);
+ border-bottom: 1px solid var(--separator-color);
+ position: relative;
+ z-index: 99;
+}
+
+@media screen and (min-width: 768px) {
+ #top {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: space-between;
+ align-items: center;
+ }
+}
+
+#main-nav {
+ flex-grow: 5;
+ padding: var(--spacing-small) var(--spacing-medium);
+ border-bottom: 0;
+}
+
+#titlearea {
+ width: auto;
+ padding: var(--spacing-medium) var(--spacing-large);
+ background: none;
+ color: var(--header-foreground);
+ border-bottom: none;
+}
+
+@media screen and (max-width: 767px) {
+ #titlearea {
+ padding-bottom: var(--spacing-small);
+ }
+}
+
+#titlearea table tbody tr {
+ height: auto !important;
+}
+
+#projectname {
+ font-size: var(--title-font-size);
+ font-weight: 600;
+}
+
+#projectnumber {
+ font-family: inherit;
+ font-size: 60%;
+}
+
+#projectbrief {
+ font-family: inherit;
+ font-size: 80%;
+}
+
+#projectlogo {
+ vertical-align: middle;
+}
+
+#projectlogo img {
+ max-height: calc(var(--title-font-size) * 2);
+ margin-right: var(--spacing-small);
+}
+
+.sm-dox, .tabs, .tabs2, .tabs3 {
+ background: none;
+ padding: 0;
+}
+
+.tabs, .tabs2, .tabs3 {
+ border-bottom: 1px solid var(--separator-color);
+ margin-bottom: -1px;
+}
+
+.main-menu-btn-icon, .main-menu-btn-icon:before, .main-menu-btn-icon:after {
+ background: var(--page-secondary-foreground-color);
+}
+
+@media screen and (max-width: 767px) {
+ .sm-dox a span.sub-arrow {
+ background: var(--code-background);
+ }
+
+ #main-menu a.has-submenu span.sub-arrow {
+ color: var(--page-secondary-foreground-color);
+ border-radius: var(--border-radius-medium);
+ }
+
+ #main-menu a.has-submenu:hover span.sub-arrow {
+ color: var(--page-foreground-color);
+ }
+}
+
+@media screen and (min-width: 768px) {
+ .sm-dox li, .tablist li {
+ display: var(--menu-display);
+ }
+
+ .sm-dox a span.sub-arrow {
+ top: 15px;
+ right: 10px;
+ box-sizing: content-box;
+ padding: 0;
+ margin: 0;
+ display: inline-block;
+ width: 5px;
+ height: 5px;
+ transform: rotate(45deg);
+ border-width: 0;
+ border-right: 2px solid var(--header-foreground);
+ border-bottom: 2px solid var(--header-foreground);
+ background: none;
+ }
+
+ .sm-dox a:hover span.sub-arrow {
+ border-color: var(--menu-focus-foreground);
+ background: none;
+ }
+
+ .sm-dox ul a span.sub-arrow {
+ transform: rotate(-45deg);
+ border-width: 0;
+ border-right: 2px solid var(--header-foreground);
+ border-bottom: 2px solid var(--header-foreground);
+ }
+
+ .sm-dox ul a:hover span.sub-arrow {
+ border-color: var(--menu-focus-foreground);
+ background: none;
+ }
+}
+
+.sm-dox ul {
+ background: var(--page-background-color);
+ box-shadow: var(--box-shadow);
+ border: 1px solid var(--separator-color);
+ border-radius: var(--border-radius-medium) !important;
+ padding: var(--spacing-small);
+ animation: ease-out 150ms slideInMenu;
+}
+
+@keyframes slideInMenu {
+ from {
+ opacity: 0;
+ transform: translate(0px, -2px);
+ }
+
+ to {
+ opacity: 1;
+ transform: translate(0px, 0px);
+ }
+}
+
+.sm-dox ul a {
+ color: var(--page-foreground-color) !important;
+ background: none;
+ font-size: var(--navigation-font-size);
+}
+
+.sm-dox>li>ul:after {
+ border-bottom-color: var(--page-background-color) !important;
+}
+
+.sm-dox>li>ul:before {
+ border-bottom-color: var(--separator-color) !important;
+}
+
+.sm-dox ul a:hover, .sm-dox ul a:active, .sm-dox ul a:focus {
+ font-size: var(--navigation-font-size) !important;
+ color: var(--menu-focus-foreground) !important;
+ text-shadow: none;
+ background-color: var(--menu-focus-background);
+ border-radius: var(--border-radius-small) !important;
+}
+
+.sm-dox a, .sm-dox a:focus, .tablist li, .tablist li a, .tablist li.current a {
+ text-shadow: none;
+ background: transparent;
+ background-image: none !important;
+ color: var(--header-foreground) !important;
+ font-weight: normal;
+ font-size: var(--navigation-font-size);
+ border-radius: var(--border-radius-small) !important;
+}
+
+.sm-dox a:focus {
+ outline: auto;
+}
+
+.sm-dox a:hover, .sm-dox a:active, .tablist li a:hover {
+ text-shadow: none;
+ font-weight: normal;
+ background: var(--menu-focus-background);
+ color: var(--menu-focus-foreground) !important;
+ border-radius: var(--border-radius-small) !important;
+ font-size: var(--navigation-font-size);
+}
+
+.tablist li.current {
+ border-radius: var(--border-radius-small);
+ background: var(--menu-selected-background);
+}
+
+.tablist li {
+ margin: var(--spacing-small) 0 var(--spacing-small) var(--spacing-small);
+}
+
+.tablist a {
+ padding: 0 var(--spacing-large);
+}
+
+
+/*
+ Search box
+ */
+
+#MSearchBox {
+ height: var(--searchbar-height);
+ background: var(--searchbar-background);
+ border-radius: var(--searchbar-border-radius);
+ border: 1px solid var(--separator-color);
+ overflow: hidden;
+ width: var(--searchbar-width);
+ position: relative;
+ box-shadow: none;
+ display: block;
+ margin-top: 0;
+ margin-right: 0;
+}
+
+@media (min-width: 768px) {
+ .sm-dox li {
+ padding: 0;
+ }
+}
+
+/* until Doxygen 1.9.4 */
+.left img#MSearchSelect {
+ left: 0;
+ user-select: none;
+ padding-left: 8px;
+}
+
+/* Doxygen 1.9.5 */
+.left span#MSearchSelect {
+ left: 0;
+ user-select: none;
+ margin-left: 8px;
+ padding: 0;
+}
+
+.left #MSearchSelect[src$=".png"] {
+ padding-left: 0
+}
+
+/* Doxygen 1.14.0 */
+.search-icon::before {
+ background: none;
+ top: 5px;
+}
+
+.search-icon::after {
+ background: none;
+ top: 12px;
+}
+
+.SelectionMark {
+ user-select: none;
+}
+
+.tabs .left #MSearchSelect {
+ padding-left: 0;
+}
+
+.tabs #MSearchBox {
+ position: absolute;
+ right: var(--spacing-medium);
+}
+
+@media screen and (max-width: 767px) {
+ .tabs #MSearchBox {
+ position: relative;
+ right: 0;
+ margin-left: var(--spacing-medium);
+ margin-top: 0;
+ }
+}
+
+#MSearchSelectWindow, #MSearchResultsWindow {
+ z-index: 9999;
+}
+
+#MSearchBox.MSearchBoxActive {
+ border-color: var(--primary-color);
+ box-shadow: inset 0 0 0 1px var(--primary-color);
+}
+
+#main-menu > li:last-child {
+ margin-right: 0;
+}
+
+@media screen and (max-width: 767px) {
+ #main-menu > li:last-child {
+ height: 50px;
+ }
+}
+
+#MSearchField {
+ font-size: var(--navigation-font-size);
+ height: calc(var(--searchbar-height) - 2px);
+ background: transparent;
+ width: calc(var(--searchbar-width) - 64px);
+}
+
+.MSearchBoxActive #MSearchField {
+ color: var(--searchbar-foreground);
+}
+
+#MSearchSelect {
+ top: calc(calc(var(--searchbar-height) / 2) - 11px);
+}
+
+#MSearchBox span.left, #MSearchBox span.right {
+ background: none;
+ background-image: none;
+}
+
+#MSearchBox span.right {
+ padding-top: calc(calc(var(--searchbar-height) / 2) - 12px);
+ position: absolute;
+ right: var(--spacing-small);
+}
+
+.tabs #MSearchBox span.right {
+ top: calc(calc(var(--searchbar-height) / 2) - 12px);
+}
+
+@keyframes slideInSearchResults {
+ from {
+ opacity: 0;
+ transform: translate(0, 15px);
+ }
+
+ to {
+ opacity: 1;
+ transform: translate(0, 20px);
+ }
+}
+
+#MSearchResultsWindow {
+ left: auto !important;
+ right: var(--spacing-medium);
+ border-radius: var(--border-radius-large);
+ border: 1px solid var(--separator-color);
+ transform: translate(0, 20px);
+ box-shadow: var(--box-shadow);
+ animation: ease-out 280ms slideInSearchResults;
+ background: var(--page-background-color);
+}
+
+iframe#MSearchResults {
+ margin: 4px;
+}
+
+iframe {
+ color-scheme: normal;
+}
+
+@media (prefers-color-scheme: dark) {
+ html:not(.light-mode) iframe#MSearchResults {
+ filter: invert() hue-rotate(180deg);
+ }
+}
+
+html.dark-mode iframe#MSearchResults {
+ filter: invert() hue-rotate(180deg);
+}
+
+#MSearchResults .SRPage {
+ background-color: transparent;
+}
+
+#MSearchResults .SRPage .SREntry {
+ font-size: 10pt;
+ padding: var(--spacing-small) var(--spacing-medium);
+}
+
+#MSearchSelectWindow {
+ border: 1px solid var(--separator-color);
+ border-radius: var(--border-radius-medium);
+ box-shadow: var(--box-shadow);
+ background: var(--page-background-color);
+ padding-top: var(--spacing-small);
+ padding-bottom: var(--spacing-small);
+}
+
+#MSearchSelectWindow a.SelectItem {
+ font-size: var(--navigation-font-size);
+ line-height: var(--content-line-height);
+ margin: 0 var(--spacing-small);
+ border-radius: var(--border-radius-small);
+ color: var(--page-foreground-color) !important;
+ font-weight: normal;
+}
+
+#MSearchSelectWindow a.SelectItem:hover {
+ background: var(--menu-focus-background);
+ color: var(--menu-focus-foreground) !important;
+}
+
+@media screen and (max-width: 767px) {
+ #MSearchBox {
+ margin-top: var(--spacing-medium);
+ margin-bottom: var(--spacing-medium);
+ width: calc(100vw - 30px);
+ }
+
+ #main-menu > li:last-child {
+ float: none !important;
+ }
+
+ #MSearchField {
+ width: calc(100vw - 110px);
+ }
+
+ @keyframes slideInSearchResultsMobile {
+ from {
+ opacity: 0;
+ transform: translate(0, 15px);
+ }
+
+ to {
+ opacity: 1;
+ transform: translate(0, 20px);
+ }
+ }
+
+ #MSearchResultsWindow {
+ left: var(--spacing-medium) !important;
+ right: var(--spacing-medium);
+ overflow: auto;
+ transform: translate(0, 20px);
+ animation: ease-out 280ms slideInSearchResultsMobile;
+ width: auto !important;
+ }
+
+ /*
+ * Overwrites for fixing the searchbox on mobile in doxygen 1.9.2
+ */
+ label.main-menu-btn ~ #searchBoxPos1 {
+ top: 3px !important;
+ right: 6px !important;
+ left: 45px;
+ display: flex;
+ }
+
+ label.main-menu-btn ~ #searchBoxPos1 > #MSearchBox {
+ margin-top: 0;
+ margin-bottom: 0;
+ flex-grow: 2;
+ float: left;
+ }
+}
+
+/*
+ Tree view
+ */
+
+#side-nav {
+ min-width: 8px;
+ max-width: 50vw;
+}
+
+
+#nav-tree, #top {
+ border-right: 1px solid var(--separator-color);
+}
+
+@media screen and (max-width: 767px) {
+ #side-nav {
+ display: none;
+ }
+
+ #doc-content {
+ margin-left: 0 !important;
+ }
+
+ #top {
+ border-right: none;
+ }
+}
+
+#nav-tree {
+ background: var(--side-nav-background);
+ margin-right: -1px;
+ padding: 0;
+}
+
+#nav-tree .label {
+ font-size: var(--navigation-font-size);
+ line-height: var(--tree-item-height);
+}
+
+#nav-tree span.label a:hover {
+ background: none;
+}
+
+#nav-tree .item {
+ height: var(--tree-item-height);
+ line-height: var(--tree-item-height);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ margin: 0;
+ padding: 0;
+}
+
+#nav-tree-contents {
+ margin: 0;
+}
+
+#main-menu > li:last-child {
+ height: auto;
+}
+
+#nav-tree .item > a:focus {
+ outline: none;
+}
+
+#nav-sync {
+ bottom: var(--spacing-medium);
+ right: var(--spacing-medium) !important;
+ top: auto !important;
+ user-select: none;
+}
+
+div.nav-sync-icon {
+ border: 1px solid var(--separator-color);
+ border-radius: var(--border-radius-medium);
+ background: var(--page-background-color);
+ width: 30px;
+ height: 20px;
+}
+
+div.nav-sync-icon:hover {
+ background: var(--page-background-color);
+}
+
+span.sync-icon-left, div.nav-sync-icon:hover span.sync-icon-left {
+ border-left: 2px solid var(--primary-color);
+ border-top: 2px solid var(--primary-color);
+ top: 5px;
+ left: 6px;
+}
+span.sync-icon-right, div.nav-sync-icon:hover span.sync-icon-right {
+ border-right: 2px solid var(--primary-color);
+ border-bottom: 2px solid var(--primary-color);
+ top: 5px;
+ left: initial;
+ right: 6px;
+}
+
+div.nav-sync-icon.active::after, div.nav-sync-icon.active:hover::after {
+ border-top: 2px solid var(--primary-color);
+ top: 9px;
+ left: 6px;
+ width: 19px;
+}
+
+#nav-tree .selected {
+ text-shadow: none;
+ background-image: none;
+ background-color: transparent;
+ position: relative;
+ color: var(--primary-color) !important;
+ font-weight: 500;
+}
+
+#nav-tree .selected::after {
+ content: "";
+ position: absolute;
+ top: 1px;
+ bottom: 1px;
+ left: 0;
+ width: 4px;
+ border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0;
+ background: var(--primary-color);
+}
+
+
+#nav-tree a {
+ color: var(--side-nav-foreground) !important;
+ font-weight: normal;
+}
+
+#nav-tree a:focus {
+ outline-style: auto;
+}
+
+#nav-tree .arrow {
+ opacity: var(--side-nav-arrow-opacity);
+ background: none;
+}
+
+#nav-tree span.arrowhead {
+ margin: 0 0 1px 2px;
+}
+
+span.arrowhead {
+ border-color: var(--primary-light-color);
+}
+
+.selected span.arrowhead {
+ border-color: var(--primary-color);
+}
+
+#nav-tree-contents > ul > li:first-child > div > a {
+ opacity: 0;
+ pointer-events: none;
+}
+
+.contents .arrow {
+ color: inherit;
+ cursor: pointer;
+ font-size: 45%;
+ vertical-align: middle;
+ margin-right: 2px;
+ font-family: serif;
+ height: auto;
+ padding-bottom: 4px;
+}
+
+#nav-tree div.item:hover .arrow, #nav-tree a:focus .arrow {
+ opacity: var(--side-nav-arrow-hover-opacity);
+}
+
+#nav-tree .selected a {
+ color: var(--primary-color) !important;
+ font-weight: bolder;
+ font-weight: 600;
+}
+
+.ui-resizable-e {
+ background: none;
+}
+
+.ui-resizable-e:hover {
+ background: var(--separator-color);
+}
+
+/*
+ Contents
+ */
+
+div.header {
+ border-bottom: 1px solid var(--separator-color);
+ background: none;
+ background-image: none;
+}
+
+@media screen and (min-width: 1000px) {
+ #doc-content > div > div.contents,
+ .PageDoc > div.contents {
+ display: flex;
+ flex-direction: row-reverse;
+ flex-wrap: nowrap;
+ align-items: flex-start;
+ }
+
+ div.contents .textblock {
+ min-width: 200px;
+ flex-grow: 1;
+ }
+}
+
+div.contents, div.header .title, div.header .summary {
+ max-width: var(--content-maxwidth);
+}
+
+div.contents, div.header .title {
+ line-height: initial;
+ margin: calc(var(--spacing-medium) + .2em) auto var(--spacing-medium) auto;
+}
+
+div.header .summary {
+ margin: var(--spacing-medium) auto 0 auto;
+}
+
+div.headertitle {
+ padding: 0;
+}
+
+div.header .title {
+ font-weight: 600;
+ font-size: 225%;
+ padding: var(--spacing-medium) var(--spacing-xlarge);
+ word-break: break-word;
+}
+
+div.header .summary {
+ width: auto;
+ display: block;
+ float: none;
+ padding: 0 var(--spacing-large);
+}
+
+td.memSeparator {
+ border-color: var(--separator-color);
+}
+
+span.mlabel {
+ background: var(--primary-color);
+ color: var(--on-primary-color);
+ border: none;
+ padding: 4px 9px;
+ border-radius: var(--border-radius-large);
+ margin-right: var(--spacing-medium);
+}
+
+span.mlabel:last-of-type {
+ margin-right: 2px;
+}
+
+div.contents {
+ padding: 0 var(--spacing-xlarge);
+}
+
+div.contents p, div.contents li {
+ line-height: var(--content-line-height);
+}
+
+div.contents div.dyncontent {
+ margin: var(--spacing-medium) 0;
+}
+
+@media screen and (max-width: 767px) {
+ div.contents {
+ padding: 0 var(--spacing-large);
+ }
+
+ div.header .title {
+ padding: var(--spacing-medium) var(--spacing-large);
+ }
+}
+
+@media (prefers-color-scheme: dark) {
+ html:not(.light-mode) div.contents div.dyncontent img,
+ html:not(.light-mode) div.contents center img,
+ html:not(.light-mode) div.contents > table img,
+ html:not(.light-mode) div.contents div.dyncontent iframe,
+ html:not(.light-mode) div.contents center iframe,
+ html:not(.light-mode) div.contents table iframe,
+ html:not(.light-mode) div.contents .dotgraph iframe {
+ filter: brightness(89%) hue-rotate(180deg) invert();
+ }
+}
+
+html.dark-mode div.contents div.dyncontent img,
+html.dark-mode div.contents center img,
+html.dark-mode div.contents > table img,
+html.dark-mode div.contents div.dyncontent iframe,
+html.dark-mode div.contents center iframe,
+html.dark-mode div.contents table iframe,
+html.dark-mode div.contents .dotgraph iframe
+ {
+ filter: brightness(89%) hue-rotate(180deg) invert();
+}
+
+td h2.groupheader, h2.groupheader {
+ border-bottom: 0px;
+ color: var(--page-foreground-color);
+ box-shadow:
+ 100px 0 var(--page-background-color),
+ -100px 0 var(--page-background-color),
+ 100px 0.75px var(--separator-color),
+ -100px 0.75px var(--separator-color),
+ 500px 0 var(--page-background-color),
+ -500px 0 var(--page-background-color),
+ 500px 0.75px var(--separator-color),
+ -500px 0.75px var(--separator-color),
+ 900px 0 var(--page-background-color),
+ -900px 0 var(--page-background-color),
+ 900px 0.75px var(--separator-color),
+ -900px 0.75px var(--separator-color),
+ 1400px 0 var(--page-background-color),
+ -1400px 0 var(--page-background-color),
+ 1400px 0.75px var(--separator-color),
+ -1400px 0.75px var(--separator-color),
+ 1900px 0 var(--page-background-color),
+ -1900px 0 var(--page-background-color),
+ 1900px 0.75px var(--separator-color),
+ -1900px 0.75px var(--separator-color);
+}
+
+blockquote {
+ margin: 0 var(--spacing-medium) 0 var(--spacing-medium);
+ padding: var(--spacing-small) var(--spacing-large);
+ background: var(--blockquote-background);
+ color: var(--blockquote-foreground);
+ border-left: 0;
+ overflow: visible;
+ border-radius: var(--border-radius-medium);
+ overflow: visible;
+ position: relative;
+}
+
+blockquote::before, blockquote::after {
+ font-weight: bold;
+ font-family: serif;
+ font-size: 360%;
+ opacity: .15;
+ position: absolute;
+}
+
+blockquote::before {
+ content: "“";
+ left: -10px;
+ top: 4px;
+}
+
+blockquote::after {
+ content: "”";
+ right: -8px;
+ bottom: -25px;
+}
+
+blockquote p {
+ margin: var(--spacing-small) 0 var(--spacing-medium) 0;
+}
+.paramname, .paramname em {
+ font-weight: 600;
+ color: var(--primary-dark-color);
+}
+
+.paramname > code {
+ border: 0;
+}
+
+table.params .paramname {
+ font-weight: 600;
+ font-family: var(--font-family-monospace);
+ font-size: var(--code-font-size);
+ padding-right: var(--spacing-small);
+ line-height: var(--table-line-height);
+}
+
+h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow {
+ text-shadow: 0 0 15px var(--primary-light-color);
+}
+
+.alphachar a {
+ color: var(--page-foreground-color);
+}
+
+.dotgraph {
+ max-width: 100%;
+ overflow-x: scroll;
+}
+
+.dotgraph .caption {
+ position: sticky;
+ left: 0;
+}
+
+/* Wrap Graphviz graphs with the `interactive_dotgraph` class if `INTERACTIVE_SVG = YES` */
+.interactive_dotgraph .dotgraph iframe {
+ max-width: 100%;
+}
+
+/*
+ Table of Contents
+ */
+
+div.contents .toc {
+ max-height: var(--toc-max-height);
+ min-width: var(--toc-width);
+ border: 0;
+ border-left: 1px solid var(--separator-color);
+ border-radius: 0;
+ background-color: var(--page-background-color);
+ box-shadow: none;
+ position: sticky;
+ top: var(--toc-sticky-top);
+ padding: 0 var(--spacing-large);
+ margin: var(--spacing-small) 0 var(--spacing-large) var(--spacing-large);
+}
+
+div.toc h3 {
+ color: var(--toc-foreground);
+ font-size: var(--navigation-font-size);
+ margin: var(--spacing-large) 0 var(--spacing-medium) 0;
+}
+
+div.toc li {
+ padding: 0;
+ background: none;
+ line-height: var(--toc-font-size);
+ margin: var(--toc-font-size) 0 0 0;
+}
+
+div.toc li::before {
+ display: none;
+}
+
+div.toc ul {
+ margin-top: 0
+}
+
+div.toc li a {
+ font-size: var(--toc-font-size);
+ color: var(--page-foreground-color) !important;
+ text-decoration: none;
+}
+
+div.toc li a:hover, div.toc li a.active {
+ color: var(--primary-color) !important;
+}
+
+div.toc li a.aboveActive {
+ color: var(--page-secondary-foreground-color) !important;
+}
+
+
+@media screen and (max-width: 999px) {
+ div.contents .toc {
+ max-height: 45vh;
+ float: none;
+ width: auto;
+ margin: 0 0 var(--spacing-medium) 0;
+ position: relative;
+ top: 0;
+ position: relative;
+ border: 1px solid var(--separator-color);
+ border-radius: var(--border-radius-medium);
+ background-color: var(--toc-background);
+ box-shadow: var(--box-shadow);
+ }
+
+ div.contents .toc.interactive {
+ max-height: calc(var(--navigation-font-size) + 2 * var(--spacing-large));
+ overflow: hidden;
+ }
+
+ div.contents .toc > h3 {
+ -webkit-tap-highlight-color: transparent;
+ cursor: pointer;
+ position: sticky;
+ top: 0;
+ background-color: var(--toc-background);
+ margin: 0;
+ padding: var(--spacing-large) 0;
+ display: block;
+ }
+
+ div.contents .toc.interactive > h3::before {
+ content: "";
+ width: 0;
+ height: 0;
+ border-left: 4px solid transparent;
+ border-right: 4px solid transparent;
+ border-top: 5px solid var(--primary-color);
+ display: inline-block;
+ margin-right: var(--spacing-small);
+ margin-bottom: calc(var(--navigation-font-size) / 4);
+ transform: rotate(-90deg);
+ transition: transform var(--animation-duration) ease-out;
+ }
+
+ div.contents .toc.interactive.open > h3::before {
+ transform: rotate(0deg);
+ }
+
+ div.contents .toc.interactive.open {
+ max-height: 45vh;
+ overflow: auto;
+ transition: max-height 0.2s ease-in-out;
+ }
+
+ div.contents .toc a, div.contents .toc a.active {
+ color: var(--primary-color) !important;
+ }
+
+ div.contents .toc a:hover {
+ text-decoration: underline;
+ }
+}
+
+/*
+ Page Outline (Doxygen >= 1.14.0)
+*/
+
+#page-nav {
+ background: var(--page-background-color);
+ border-left: 1px solid var(--separator-color);
+}
+
+#page-nav #page-nav-resize-handle {
+ background: var(--separator-color);
+}
+
+#page-nav #page-nav-resize-handle::after {
+ border-left: 1px solid var(--primary-color);
+ border-right: 1px solid var(--primary-color);
+}
+
+#page-nav #page-nav-tree #page-nav-contents {
+ top: var(--spacing-large);
+}
+
+#page-nav ul.page-outline {
+ margin: 0;
+ padding: 0;
+}
+
+#page-nav ul.page-outline li a {
+ font-size: var(--toc-font-size) !important;
+ color: var(--page-secondary-foreground-color) !important;
+ display: inline-block;
+ line-height: calc(2 * var(--toc-font-size));
+}
+
+#page-nav ul.page-outline li a a.anchorlink {
+ display: none;
+}
+
+#page-nav ul.page-outline li.vis ~ * a {
+ color: var(--page-foreground-color) !important;
+}
+
+#page-nav ul.page-outline li.vis:not(.vis ~ .vis) a, #page-nav ul.page-outline li a:hover {
+ color: var(--primary-color) !important;
+}
+
+#page-nav ul.page-outline .vis {
+ background: var(--page-background-color);
+ position: relative;
+}
+
+#page-nav ul.page-outline .vis::after {
+ content: "";
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ width: 4px;
+ background: var(--page-secondary-foreground-color);
+}
+
+#page-nav ul.page-outline .vis:not(.vis ~ .vis)::after {
+ top: 1px;
+ border-top-right-radius: var(--border-radius-small);
+}
+
+#page-nav ul.page-outline .vis:not(:has(~ .vis))::after {
+ bottom: 1px;
+ border-bottom-right-radius: var(--border-radius-small);
+}
+
+
+#page-nav ul.page-outline .arrow {
+ display: inline-block;
+}
+
+#page-nav ul.page-outline .arrow span {
+ display: none;
+}
+
+@media screen and (max-width: 767px) {
+ #container {
+ grid-template-columns: initial !important;
+ }
+
+ #page-nav {
+ display: none;
+ }
+}
+
+/*
+ Code & Fragments
+ */
+
+code, div.fragment, pre.fragment, span.tt {
+ border: 1px solid var(--separator-color);
+ overflow: hidden;
+}
+
+code, span.tt {
+ display: inline;
+ background: var(--code-background);
+ color: var(--code-foreground);
+ padding: 2px 6px;
+ border-radius: var(--border-radius-small);
+}
+
+div.fragment, pre.fragment {
+ border-radius: var(--border-radius-medium);
+ margin: var(--spacing-medium) 0;
+ padding: calc(var(--spacing-large) - (var(--spacing-large) / 6)) var(--spacing-large);
+ background: var(--fragment-background);
+ color: var(--fragment-foreground);
+ overflow-x: auto;
+}
+
+@media screen and (max-width: 767px) {
+ div.fragment, pre.fragment {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ border-right: 0;
+ }
+
+ .contents > div.fragment,
+ .textblock > div.fragment,
+ .textblock > pre.fragment,
+ .textblock > .tabbed > ul > li > div.fragment,
+ .textblock > .tabbed > ul > li > pre.fragment,
+ .contents > .doxygen-awesome-fragment-wrapper > div.fragment,
+ .textblock > .doxygen-awesome-fragment-wrapper > div.fragment,
+ .textblock > .doxygen-awesome-fragment-wrapper > pre.fragment,
+ .textblock > .tabbed > ul > li > .doxygen-awesome-fragment-wrapper > div.fragment,
+ .textblock > .tabbed > ul > li > .doxygen-awesome-fragment-wrapper > pre.fragment {
+ margin: var(--spacing-medium) calc(0px - var(--spacing-large));
+ border-radius: 0;
+ border-left: 0;
+ }
+
+ .textblock li > .fragment,
+ .textblock li > .doxygen-awesome-fragment-wrapper > .fragment {
+ margin: var(--spacing-medium) calc(0px - var(--spacing-large));
+ }
+
+ .memdoc li > .fragment,
+ .memdoc li > .doxygen-awesome-fragment-wrapper > .fragment {
+ margin: var(--spacing-medium) calc(0px - var(--spacing-medium));
+ }
+
+ .textblock ul, .memdoc ul {
+ overflow: initial;
+ }
+
+ .memdoc > div.fragment,
+ .memdoc > pre.fragment,
+ dl dd > div.fragment,
+ dl dd pre.fragment,
+ .memdoc > .doxygen-awesome-fragment-wrapper > div.fragment,
+ .memdoc > .doxygen-awesome-fragment-wrapper > pre.fragment,
+ dl dd > .doxygen-awesome-fragment-wrapper > div.fragment,
+ dl dd .doxygen-awesome-fragment-wrapper > pre.fragment {
+ margin: var(--spacing-medium) calc(0px - var(--spacing-medium));
+ border-radius: 0;
+ border-left: 0;
+ }
+}
+
+code, code a, pre.fragment, div.fragment, div.fragment .line, div.fragment span, div.fragment .line a, div.fragment .line span, span.tt {
+ font-family: var(--font-family-monospace);
+ font-size: var(--code-font-size) !important;
+}
+
+div.line:after {
+ margin-right: var(--spacing-medium);
+}
+
+div.fragment .line, pre.fragment {
+ white-space: pre;
+ word-wrap: initial;
+ line-height: var(--fragment-lineheight);
+}
+
+div.fragment span.keyword {
+ color: var(--fragment-keyword);
+}
+
+div.fragment span.keywordtype {
+ color: var(--fragment-keywordtype);
+}
+
+div.fragment span.keywordflow {
+ color: var(--fragment-keywordflow);
+}
+
+div.fragment span.stringliteral {
+ color: var(--fragment-token)
+}
+
+div.fragment span.comment {
+ color: var(--fragment-comment);
+}
+
+div.fragment a.code {
+ color: var(--fragment-link) !important;
+}
+
+div.fragment span.preprocessor {
+ color: var(--fragment-preprocessor);
+}
+
+div.fragment span.lineno {
+ display: inline-block;
+ width: 27px;
+ border-right: none;
+ background: var(--fragment-linenumber-background);
+ color: var(--fragment-linenumber-color);
+}
+
+div.fragment span.lineno a {
+ background: none;
+ color: var(--fragment-link) !important;
+}
+
+div.fragment > .line:first-child .lineno {
+ box-shadow: -999999px 0px 0 999999px var(--fragment-linenumber-background), -999998px 0px 0 999999px var(--fragment-linenumber-border);
+ background-color: var(--fragment-linenumber-background) !important;
+}
+
+div.line {
+ border-radius: var(--border-radius-small);
+}
+
+div.line.glow {
+ background-color: var(--primary-light-color);
+ box-shadow: none;
+}
+
+/*
+ dl warning, attention, note, deprecated, bug, ...
+ */
+
+dl {
+ line-height: calc(1.65 * var(--page-font-size));
+}
+
+dl.bug dt a, dl.deprecated dt a, dl.todo dt a {
+ font-weight: bold !important;
+}
+
+dl.warning, dl.attention, dl.note, dl.deprecated, dl.bug, dl.invariant, dl.pre, dl.post, dl.todo, dl.remark {
+ padding: var(--spacing-medium);
+ margin: var(--spacing-medium) 0;
+ color: var(--page-background-color);
+ overflow: hidden;
+ margin-left: 0;
+ border-radius: var(--border-radius-small);
+}
+
+dl.section dd {
+ margin-bottom: 2px;
+}
+
+dl.warning, dl.attention {
+ background: var(--warning-color);
+ border-left: 8px solid var(--warning-color-dark);
+ color: var(--warning-color-darker);
+}
+
+dl.warning dt, dl.attention dt {
+ color: var(--warning-color-dark);
+}
+
+dl.note, dl.remark {
+ background: var(--note-color);
+ border-left: 8px solid var(--note-color-dark);
+ color: var(--note-color-darker);
+}
+
+dl.note dt, dl.remark dt {
+ color: var(--note-color-dark);
+}
+
+dl.todo {
+ background: var(--todo-color);
+ border-left: 8px solid var(--todo-color-dark);
+ color: var(--todo-color-darker);
+}
+
+dl.todo dt a {
+ color: var(--todo-color-dark) !important;
+}
+
+dl.bug dt a {
+ color: var(--todo-color-dark) !important;
+}
+
+dl.bug {
+ background: var(--bug-color);
+ border-left: 8px solid var(--bug-color-dark);
+ color: var(--bug-color-darker);
+}
+
+dl.bug dt a {
+ color: var(--bug-color-dark) !important;
+}
+
+dl.deprecated {
+ background: var(--deprecated-color);
+ border-left: 8px solid var(--deprecated-color-dark);
+ color: var(--deprecated-color-darker);
+}
+
+dl.deprecated dt a {
+ color: var(--deprecated-color-dark) !important;
+}
+
+dl.section dd, dl.bug dd, dl.deprecated dd, dl.todo dd {
+ margin-inline-start: 0px;
+}
+
+dl.invariant, dl.pre, dl.post {
+ background: var(--invariant-color);
+ border-left: 8px solid var(--invariant-color-dark);
+ color: var(--invariant-color-darker);
+}
+
+dl.invariant dt, dl.pre dt, dl.post dt {
+ color: var(--invariant-color-dark);
+}
+
+/*
+ memitem
+ */
+
+div.memdoc, div.memproto, h2.memtitle {
+ box-shadow: none;
+ background-image: none;
+ border: none;
+}
+
+div.memdoc {
+ padding: 0 var(--spacing-medium);
+ background: var(--page-background-color);
+}
+
+h2.memtitle, div.memitem {
+ border: 1px solid var(--separator-color);
+ box-shadow: var(--box-shadow);
+}
+
+h2.memtitle {
+ box-shadow: 0px var(--spacing-medium) 0 -1px var(--fragment-background), var(--box-shadow);
+}
+
+div.memitem {
+ transition: none;
+}
+
+div.memproto, h2.memtitle {
+ background: var(--fragment-background);
+}
+
+h2.memtitle {
+ font-weight: 500;
+ font-size: var(--memtitle-font-size);
+ font-family: var(--font-family-monospace);
+ border-bottom: none;
+ border-top-left-radius: var(--border-radius-medium);
+ border-top-right-radius: var(--border-radius-medium);
+ word-break: break-all;
+ position: relative;
+}
+
+h2.memtitle:after {
+ content: "";
+ display: block;
+ background: var(--fragment-background);
+ height: var(--spacing-medium);
+ bottom: calc(0px - var(--spacing-medium));
+ left: 0;
+ right: -14px;
+ position: absolute;
+ border-top-right-radius: var(--border-radius-medium);
+}
+
+h2.memtitle > span.permalink {
+ font-size: inherit;
+}
+
+h2.memtitle > span.permalink > a {
+ text-decoration: none;
+ padding-left: 3px;
+ margin-right: -4px;
+ user-select: none;
+ display: inline-block;
+ margin-top: -6px;
+}
+
+h2.memtitle > span.permalink > a:hover {
+ color: var(--primary-dark-color) !important;
+}
+
+a:target + h2.memtitle, a:target + h2.memtitle + div.memitem {
+ border-color: var(--primary-light-color);
+}
+
+div.memitem {
+ border-top-right-radius: var(--border-radius-medium);
+ border-bottom-right-radius: var(--border-radius-medium);
+ border-bottom-left-radius: var(--border-radius-medium);
+ border-top-left-radius: 0;
+ overflow: hidden;
+ display: block !important;
+}
+
+div.memdoc {
+ border-radius: 0;
+}
+
+div.memproto {
+ border-radius: 0 var(--border-radius-small) 0 0;
+ overflow: auto;
+ border-bottom: 1px solid var(--separator-color);
+ padding: var(--spacing-medium);
+ margin-bottom: -1px;
+}
+
+div.memtitle {
+ border-top-right-radius: var(--border-radius-medium);
+ border-top-left-radius: var(--border-radius-medium);
+}
+
+div.memproto table.memname {
+ font-family: var(--font-family-monospace);
+ color: var(--page-foreground-color);
+ font-size: var(--memname-font-size);
+ text-shadow: none;
+}
+
+div.memproto div.memtemplate {
+ font-family: var(--font-family-monospace);
+ color: var(--primary-dark-color);
+ font-size: var(--memname-font-size);
+ margin-left: 2px;
+ text-shadow: none;
+}
+
+table.mlabels, table.mlabels > tbody {
+ display: block;
+}
+
+td.mlabels-left {
+ width: auto;
+}
+
+td.mlabels-right {
+ margin-top: 3px;
+ position: sticky;
+ left: 0;
+}
+
+table.mlabels > tbody > tr:first-child {
+ display: flex;
+ justify-content: space-between;
+ flex-wrap: wrap;
+}
+
+.memname, .memitem span.mlabels {
+ margin: 0
+}
+
+/*
+ reflist
+ */
+
+dl.reflist {
+ box-shadow: var(--box-shadow);
+ border-radius: var(--border-radius-medium);
+ border: 1px solid var(--separator-color);
+ overflow: hidden;
+ padding: 0;
+}
+
+
+dl.reflist dt, dl.reflist dd {
+ box-shadow: none;
+ text-shadow: none;
+ background-image: none;
+ border: none;
+ padding: 12px;
+}
+
+
+dl.reflist dt {
+ font-weight: 500;
+ border-radius: 0;
+ background: var(--code-background);
+ border-bottom: 1px solid var(--separator-color);
+ color: var(--page-foreground-color)
+}
+
+
+dl.reflist dd {
+ background: none;
+}
+
+/*
+ Table
+ */
+
+.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname),
+.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody {
+ display: inline-block;
+ max-width: 100%;
+}
+
+.contents > table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname):not(.classindex) {
+ margin-left: calc(0px - var(--spacing-large));
+ margin-right: calc(0px - var(--spacing-large));
+ max-width: calc(100% + 2 * var(--spacing-large));
+}
+
+table.fieldtable,
+table.markdownTable tbody,
+table.doxtable tbody {
+ border: none;
+ margin: var(--spacing-medium) 0;
+ box-shadow: 0 0 0 1px var(--separator-color);
+ border-radius: var(--border-radius-small);
+}
+
+table.markdownTable, table.doxtable, table.fieldtable {
+ padding: 1px;
+}
+
+table.doxtable caption {
+ display: block;
+}
+
+table.fieldtable {
+ border-collapse: collapse;
+ width: 100%;
+}
+
+th.markdownTableHeadLeft,
+th.markdownTableHeadRight,
+th.markdownTableHeadCenter,
+th.markdownTableHeadNone,
+table.doxtable th {
+ background: var(--tablehead-background);
+ color: var(--tablehead-foreground);
+ font-weight: 600;
+ font-size: var(--page-font-size);
+}
+
+th.markdownTableHeadLeft:first-child,
+th.markdownTableHeadRight:first-child,
+th.markdownTableHeadCenter:first-child,
+th.markdownTableHeadNone:first-child,
+table.doxtable tr th:first-child {
+ border-top-left-radius: var(--border-radius-small);
+}
+
+th.markdownTableHeadLeft:last-child,
+th.markdownTableHeadRight:last-child,
+th.markdownTableHeadCenter:last-child,
+th.markdownTableHeadNone:last-child,
+table.doxtable tr th:last-child {
+ border-top-right-radius: var(--border-radius-small);
+}
+
+table.markdownTable td,
+table.markdownTable th,
+table.fieldtable td,
+table.fieldtable th,
+table.doxtable td,
+table.doxtable th {
+ border: 1px solid var(--separator-color);
+ padding: var(--spacing-small) var(--spacing-medium);
+}
+
+table.markdownTable td:last-child,
+table.markdownTable th:last-child,
+table.fieldtable td:last-child,
+table.fieldtable th:last-child,
+table.doxtable td:last-child,
+table.doxtable th:last-child {
+ border-right: none;
+}
+
+table.markdownTable td:first-child,
+table.markdownTable th:first-child,
+table.fieldtable td:first-child,
+table.fieldtable th:first-child,
+table.doxtable td:first-child,
+table.doxtable th:first-child {
+ border-left: none;
+}
+
+table.markdownTable tr:first-child td,
+table.markdownTable tr:first-child th,
+table.fieldtable tr:first-child td,
+table.fieldtable tr:first-child th,
+table.doxtable tr:first-child td,
+table.doxtable tr:first-child th {
+ border-top: none;
+}
+
+table.markdownTable tr:last-child td,
+table.markdownTable tr:last-child th,
+table.fieldtable tr:last-child td,
+table.fieldtable tr:last-child th,
+table.doxtable tr:last-child td,
+table.doxtable tr:last-child th {
+ border-bottom: none;
+}
+
+table.markdownTable tr, table.doxtable tr {
+ border-bottom: 1px solid var(--separator-color);
+}
+
+table.markdownTable tr:last-child, table.doxtable tr:last-child {
+ border-bottom: none;
+}
+
+.full_width_table table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) {
+ display: block;
+}
+
+.full_width_table table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody {
+ display: table;
+ width: 100%;
+}
+
+table.fieldtable th {
+ font-size: var(--page-font-size);
+ font-weight: 600;
+ background-image: none;
+ background-color: var(--tablehead-background);
+ color: var(--tablehead-foreground);
+}
+
+table.fieldtable td.fieldtype, .fieldtable td.fieldname, .fieldtable td.fieldinit, .fieldtable td.fielddoc, .fieldtable th {
+ border-bottom: 1px solid var(--separator-color);
+ border-right: 1px solid var(--separator-color);
+}
+
+table.fieldtable tr:last-child td:first-child {
+ border-bottom-left-radius: var(--border-radius-small);
+}
+
+table.fieldtable tr:last-child td:last-child {
+ border-bottom-right-radius: var(--border-radius-small);
+}
+
+.memberdecls td.glow, .fieldtable tr.glow {
+ background-color: var(--primary-light-color);
+ box-shadow: none;
+}
+
+table.memberdecls {
+ display: block;
+ -webkit-tap-highlight-color: transparent;
+}
+
+table.memberdecls tr[class^='memitem'] {
+ font-family: var(--font-family-monospace);
+ font-size: var(--code-font-size);
+}
+
+table.memberdecls tr[class^='memitem'] .memTemplParams {
+ font-family: var(--font-family-monospace);
+ font-size: var(--code-font-size);
+ color: var(--primary-dark-color);
+ white-space: normal;
+}
+
+table.memberdecls tr.heading + tr[class^='memitem'] td.memItemLeft,
+table.memberdecls tr.heading + tr[class^='memitem'] td.memItemRight,
+table.memberdecls td.memItemLeft,
+table.memberdecls td.memItemRight,
+table.memberdecls .memTemplItemLeft,
+table.memberdecls .memTemplItemRight,
+table.memberdecls .memTemplParams {
+ transition: none;
+ padding-top: var(--spacing-small);
+ padding-bottom: var(--spacing-small);
+ border-top: 1px solid var(--separator-color);
+ border-bottom: 1px solid var(--separator-color);
+ background-color: var(--fragment-background);
+}
+
+@media screen and (min-width: 768px) {
+
+ tr.heading + tr[class^='memitem'] td.memItemRight, tr.groupHeader + tr[class^='memitem'] td.memItemRight, tr.inherit_header + tr[class^='memitem'] td.memItemRight {
+ border-top-right-radius: var(--border-radius-small);
+ }
+
+ table.memberdecls tr:last-child td.memItemRight, table.memberdecls tr:last-child td.mdescRight, table.memberdecls tr[class^='memitem']:has(+ tr.groupHeader) td.memItemRight, table.memberdecls tr[class^='memitem']:has(+ tr.inherit_header) td.memItemRight, table.memberdecls tr[class^='memdesc']:has(+ tr.groupHeader) td.mdescRight, table.memberdecls tr[class^='memdesc']:has(+ tr.inherit_header) td.mdescRight {
+ border-bottom-right-radius: var(--border-radius-small);
+ }
+
+ table.memberdecls tr:last-child td.memItemLeft, table.memberdecls tr:last-child td.mdescLeft, table.memberdecls tr[class^='memitem']:has(+ tr.groupHeader) td.memItemLeft, table.memberdecls tr[class^='memitem']:has(+ tr.inherit_header) td.memItemLeft, table.memberdecls tr[class^='memdesc']:has(+ tr.groupHeader) td.mdescLeft, table.memberdecls tr[class^='memdesc']:has(+ tr.inherit_header) td.mdescLeft {
+ border-bottom-left-radius: var(--border-radius-small);
+ }
+
+ tr.heading + tr[class^='memitem'] td.memItemLeft, tr.groupHeader + tr[class^='memitem'] td.memItemLeft, tr.inherit_header + tr[class^='memitem'] td.memItemLeft {
+ border-top-left-radius: var(--border-radius-small);
+ }
+
+}
+
+table.memname td.memname {
+ font-size: var(--memname-font-size);
+}
+
+table.memberdecls .memTemplItemLeft,
+table.memberdecls .template .memItemLeft,
+table.memberdecls .memTemplItemRight,
+table.memberdecls .template .memItemRight {
+ padding-top: 2px;
+}
+
+table.memberdecls .memTemplParams {
+ border-bottom: 0;
+ border-left: 1px solid var(--separator-color);
+ border-right: 1px solid var(--separator-color);
+ border-radius: var(--border-radius-small) var(--border-radius-small) 0 0;
+ padding-bottom: var(--spacing-small);
+}
+
+table.memberdecls .memTemplItemLeft, table.memberdecls .template .memItemLeft {
+ border-radius: 0 0 0 var(--border-radius-small);
+ border-left: 1px solid var(--separator-color);
+ border-top: 0;
+}
+
+table.memberdecls .memTemplItemRight, table.memberdecls .template .memItemRight {
+ border-radius: 0 0 var(--border-radius-small) 0;
+ border-right: 1px solid var(--separator-color);
+ padding-left: 0;
+ border-top: 0;
+}
+
+table.memberdecls .memItemLeft {
+ border-radius: var(--border-radius-small) 0 0 var(--border-radius-small);
+ border-left: 1px solid var(--separator-color);
+ padding-left: var(--spacing-medium);
+ padding-right: 0;
+}
+
+table.memberdecls .memItemRight {
+ border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0;
+ border-right: 1px solid var(--separator-color);
+ padding-right: var(--spacing-medium);
+ padding-left: 0;
+
+}
+
+table.memberdecls .mdescLeft, table.memberdecls .mdescRight {
+ background: none;
+ color: var(--page-foreground-color);
+ padding: var(--spacing-small) 0;
+ border: 0;
+}
+
+table.memberdecls [class^="memdesc"] {
+ box-shadow: none;
+}
+
+
+table.memberdecls .memItemLeft,
+table.memberdecls .memTemplItemLeft {
+ padding-right: var(--spacing-medium);
+}
+
+table.memberdecls .memSeparator {
+ background: var(--page-background-color);
+ height: var(--spacing-large);
+ border: 0;
+ transition: none;
+}
+
+table.memberdecls .groupheader {
+ margin-bottom: var(--spacing-large);
+}
+
+table.memberdecls .inherit_header td {
+ padding: 0 0 var(--spacing-medium) 0;
+ text-indent: -12px;
+ color: var(--page-secondary-foreground-color);
+}
+
+table.memberdecls span.dynarrow {
+ left: 10px;
+}
+
+table.memberdecls img[src="closed.png"],
+table.memberdecls img[src="open.png"],
+div.dynheader img[src="open.png"],
+div.dynheader img[src="closed.png"] {
+ width: 0;
+ height: 0;
+ border-left: 4px solid transparent;
+ border-right: 4px solid transparent;
+ border-top: 5px solid var(--primary-color);
+ margin-top: 8px;
+ display: block;
+ float: left;
+ margin-left: -10px;
+ transition: transform var(--animation-duration) ease-out;
+}
+
+tr.heading + tr[class^='memitem'] td.memItemLeft, tr.groupHeader + tr[class^='memitem'] td.memItemLeft, tr.inherit_header + tr[class^='memitem'] td.memItemLeft, tr.heading + tr[class^='memitem'] td.memItemRight, tr.groupHeader + tr[class^='memitem'] td.memItemRight, tr.inherit_header + tr[class^='memitem'] td.memItemRight {
+ border-top: 1px solid var(--separator-color);
+}
+
+table.memberdecls img {
+ margin-right: 10px;
+}
+
+table.memberdecls img[src="closed.png"],
+div.dynheader img[src="closed.png"] {
+ transform: rotate(-90deg);
+
+}
+
+.compoundTemplParams {
+ font-family: var(--font-family-monospace);
+ color: var(--primary-dark-color);
+ font-size: var(--code-font-size);
+}
+
+@media screen and (max-width: 767px) {
+
+ table.memberdecls .memItemLeft,
+ table.memberdecls .memItemRight,
+ table.memberdecls .mdescLeft,
+ table.memberdecls .mdescRight,
+ table.memberdecls .memTemplItemLeft,
+ table.memberdecls .memTemplItemRight,
+ table.memberdecls .memTemplParams,
+ table.memberdecls .template .memItemLeft,
+ table.memberdecls .template .memItemRight,
+ table.memberdecls .template .memParams {
+ display: block;
+ text-align: left;
+ padding-left: var(--spacing-large);
+ margin: 0 calc(0px - var(--spacing-large)) 0 calc(0px - var(--spacing-large));
+ border-right: none;
+ border-left: none;
+ border-radius: 0;
+ white-space: normal;
+ }
+
+ table.memberdecls .memItemLeft,
+ table.memberdecls .mdescLeft,
+ table.memberdecls .memTemplItemLeft,
+ table.memberdecls .template .memItemLeft {
+ border-bottom: 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ table.memberdecls .memTemplItemLeft,
+ table.memberdecls .template .memItemLeft {
+ padding-top: 0;
+ }
+
+ table.memberdecls .mdescLeft {
+ margin-bottom: calc(0px - var(--page-font-size));
+ }
+
+ table.memberdecls .memItemRight,
+ table.memberdecls .mdescRight,
+ table.memberdecls .memTemplItemRight,
+ table.memberdecls .template .memItemRight {
+ border-top: 0 !important;
+ padding-top: 0 !important;
+ padding-right: var(--spacing-large);
+ padding-bottom: var(--spacing-medium);
+ overflow-x: auto;
+ }
+
+ table.memberdecls tr[class^='memitem']:not(.inherit) {
+ display: block;
+ width: calc(100vw - 2 * var(--spacing-large));
+ }
+
+ table.memberdecls .mdescRight {
+ color: var(--page-foreground-color);
+ }
+
+ table.memberdecls tr.inherit {
+ visibility: hidden;
+ }
+
+ table.memberdecls tr[style="display: table-row;"] {
+ display: block !important;
+ visibility: visible;
+ width: calc(100vw - 2 * var(--spacing-large));
+ animation: fade .5s;
+ }
+
+ @keyframes fade {
+ 0% {
+ opacity: 0;
+ max-height: 0;
+ }
+
+ 100% {
+ opacity: 1;
+ max-height: 200px;
+ }
+ }
+
+ tr.heading + tr[class^='memitem'] td.memItemRight, tr.groupHeader + tr[class^='memitem'] td.memItemRight, tr.inherit_header + tr[class^='memitem'] td.memItemRight {
+ border-top-right-radius: 0;
+ }
+
+ table.memberdecls tr:last-child td.memItemRight, table.memberdecls tr:last-child td.mdescRight, table.memberdecls tr[class^='memitem']:has(+ tr.groupHeader) td.memItemRight, table.memberdecls tr[class^='memitem']:has(+ tr.inherit_header) td.memItemRight, table.memberdecls tr[class^='memdesc']:has(+ tr.groupHeader) td.mdescRight, table.memberdecls tr[class^='memdesc']:has(+ tr.inherit_header) td.mdescRight {
+ border-bottom-right-radius: 0;
+ }
+
+ table.memberdecls tr:last-child td.memItemLeft, table.memberdecls tr:last-child td.mdescLeft, table.memberdecls tr[class^='memitem']:has(+ tr.groupHeader) td.memItemLeft, table.memberdecls tr[class^='memitem']:has(+ tr.inherit_header) td.memItemLeft, table.memberdecls tr[class^='memdesc']:has(+ tr.groupHeader) td.mdescLeft, table.memberdecls tr[class^='memdesc']:has(+ tr.inherit_header) td.mdescLeft {
+ border-bottom-left-radius: 0;
+ }
+
+ tr.heading + tr[class^='memitem'] td.memItemLeft, tr.groupHeader + tr[class^='memitem'] td.memItemLeft, tr.inherit_header + tr[class^='memitem'] td.memItemLeft {
+ border-top-left-radius: 0;
+ }
+}
+
+
+/*
+ Horizontal Rule
+ */
+
+hr {
+ margin-top: var(--spacing-large);
+ margin-bottom: var(--spacing-large);
+ height: 1px;
+ background-color: var(--separator-color);
+ border: 0;
+}
+
+.contents hr {
+ box-shadow: 100px 0 var(--separator-color),
+ -100px 0 var(--separator-color),
+ 500px 0 var(--separator-color),
+ -500px 0 var(--separator-color),
+ 900px 0 var(--separator-color),
+ -900px 0 var(--separator-color),
+ 1400px 0 var(--separator-color),
+ -1400px 0 var(--separator-color),
+ 1900px 0 var(--separator-color),
+ -1900px 0 var(--separator-color);
+}
+
+.contents img, .contents .center, .contents center, .contents div.image object {
+ max-width: 100%;
+ overflow: auto;
+}
+
+@media screen and (max-width: 767px) {
+ .contents .dyncontent > .center, .contents > center {
+ margin-left: calc(0px - var(--spacing-large));
+ margin-right: calc(0px - var(--spacing-large));
+ max-width: calc(100% + 2 * var(--spacing-large));
+ }
+}
+
+/*
+ Directories
+ */
+div.directory {
+ border-top: 1px solid var(--separator-color);
+ border-bottom: 1px solid var(--separator-color);
+ width: auto;
+}
+
+table.directory {
+ font-family: var(--font-family);
+ font-size: var(--page-font-size);
+ font-weight: normal;
+ width: 100%;
+}
+
+table.directory td.entry, table.directory td.desc {
+ padding: calc(var(--spacing-small) / 2) var(--spacing-small);
+ line-height: var(--table-line-height);
+}
+
+table.directory tr.even td:last-child {
+ border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0;
+}
+
+table.directory tr.even td:first-child {
+ border-radius: var(--border-radius-small) 0 0 var(--border-radius-small);
+}
+
+table.directory tr.even:last-child td:last-child {
+ border-radius: 0 var(--border-radius-small) 0 0;
+}
+
+table.directory tr.even:last-child td:first-child {
+ border-radius: var(--border-radius-small) 0 0 0;
+}
+
+table.directory td.desc {
+ min-width: 250px;
+}
+
+table.directory tr.even {
+ background-color: var(--odd-color);
+}
+
+table.directory tr.odd {
+ background-color: transparent;
+}
+
+.icona {
+ width: auto;
+ height: auto;
+ margin: 0 var(--spacing-small);
+}
+
+.icon {
+ background: var(--primary-color);
+ border-radius: var(--border-radius-small);
+ font-size: var(--page-font-size);
+ padding: calc(var(--page-font-size) / 5);
+ line-height: var(--page-font-size);
+ transform: scale(0.8);
+ height: auto;
+ width: var(--page-font-size);
+ user-select: none;
+}
+
+.iconfopen, .icondoc, .iconfclosed {
+ background-position: center;
+ margin-bottom: 0;
+ height: var(--table-line-height);
+}
+
+.icondoc {
+ filter: saturate(0.2);
+}
+
+@media screen and (max-width: 767px) {
+ div.directory {
+ margin-left: calc(0px - var(--spacing-large));
+ margin-right: calc(0px - var(--spacing-large));
+ }
+}
+
+@media (prefers-color-scheme: dark) {
+ html:not(.light-mode) .iconfopen, html:not(.light-mode) .iconfclosed {
+ filter: hue-rotate(180deg) invert();
+ }
+}
+
+html.dark-mode .iconfopen, html.dark-mode .iconfclosed {
+ filter: hue-rotate(180deg) invert();
+}
+
+/*
+ Class list
+ */
+
+.classindex dl.odd {
+ background: var(--odd-color);
+ border-radius: var(--border-radius-small);
+}
+
+.classindex dl.even {
+ background-color: transparent;
+}
+
+/*
+ Class Index Doxygen 1.8
+*/
+
+table.classindex {
+ margin-left: 0;
+ margin-right: 0;
+ width: 100%;
+}
+
+table.classindex table div.ah {
+ background-image: none;
+ background-color: initial;
+ border-color: var(--separator-color);
+ color: var(--page-foreground-color);
+ box-shadow: var(--box-shadow);
+ border-radius: var(--border-radius-large);
+ padding: var(--spacing-small);
+}
+
+div.qindex {
+ background-color: var(--odd-color);
+ border-radius: var(--border-radius-small);
+ border: 1px solid var(--separator-color);
+ padding: var(--spacing-small) 0;
+}
+
+/*
+ Footer and nav-path
+ */
+
+#nav-path {
+ width: 100%;
+}
+
+#nav-path ul {
+ background-image: none;
+ background: var(--page-background-color);
+ border: none;
+ border-top: 1px solid var(--separator-color);
+ border-bottom: 0;
+ font-size: var(--navigation-font-size);
+}
+
+img.footer {
+ width: 60px;
+}
+
+.navpath li.footer {
+ color: var(--page-secondary-foreground-color);
+}
+
+address.footer {
+ color: var(--page-secondary-foreground-color);
+ margin-bottom: var(--spacing-large);
+}
+
+#nav-path li.navelem {
+ background-image: none;
+ display: flex;
+ align-items: center;
+}
+
+.navpath li.navelem a {
+ text-shadow: none;
+ display: inline-block;
+ color: var(--primary-color) !important;
+}
+
+.navpath li.navelem a:hover {
+ text-shadow: none;
+}
+
+.navpath li.navelem b {
+ color: var(--primary-dark-color);
+ font-weight: 500;
+}
+
+li.navelem {
+ padding: 0;
+ margin-left: -8px;
+}
+
+li.navelem:first-child {
+ margin-left: var(--spacing-large);
+}
+
+li.navelem:first-child:before {
+ display: none;
+}
+
+#nav-path ul {
+ padding-left: 0;
+}
+
+#nav-path li.navelem:has(.el):after {
+ content: '';
+ border: 5px solid var(--page-background-color);
+ border-bottom-color: transparent;
+ border-right-color: transparent;
+ border-top-color: transparent;
+ transform: translateY(-1px) scaleY(4.2);
+ z-index: 10;
+ margin-left: 6px;
+}
+
+#nav-path li.navelem:not(:has(.el)):after {
+ background: var(--page-background-color);
+ box-shadow: 1px -1px 0 1px var(--separator-color);
+ border-radius: 0 var(--border-radius-medium) 0 50px;
+}
+
+#nav-path li.navelem:not(:has(.el)) {
+ margin-left: 0;
+}
+
+#nav-path li.navelem:not(:has(.el)):hover, #nav-path li.navelem:not(:has(.el)):hover:after {
+ background-color: var(--separator-color);
+}
+
+#nav-path li.navelem:has(.el):before {
+ content: '';
+ border: 5px solid var(--separator-color);
+ border-bottom-color: transparent;
+ border-right-color: transparent;
+ border-top-color: transparent;
+ transform: translateY(-1px) scaleY(3.2);
+ margin-right: var(--spacing-small);
+}
+
+.navpath li.navelem a:hover {
+ color: var(--primary-color);
+}
+
+/*
+ Scrollbars for Webkit
+*/
+
+#nav-tree::-webkit-scrollbar,
+div.fragment::-webkit-scrollbar,
+pre.fragment::-webkit-scrollbar,
+div.memproto::-webkit-scrollbar,
+.contents center::-webkit-scrollbar,
+.contents .center::-webkit-scrollbar,
+.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar,
+div.contents .toc::-webkit-scrollbar,
+.contents .dotgraph::-webkit-scrollbar,
+.contents .tabs-overview-container::-webkit-scrollbar {
+ background: transparent;
+ width: calc(var(--webkit-scrollbar-size) + var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding));
+ height: calc(var(--webkit-scrollbar-size) + var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding));
+}
+
+#nav-tree::-webkit-scrollbar-thumb,
+div.fragment::-webkit-scrollbar-thumb,
+pre.fragment::-webkit-scrollbar-thumb,
+div.memproto::-webkit-scrollbar-thumb,
+.contents center::-webkit-scrollbar-thumb,
+.contents .center::-webkit-scrollbar-thumb,
+.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar-thumb,
+div.contents .toc::-webkit-scrollbar-thumb,
+.contents .dotgraph::-webkit-scrollbar-thumb,
+.contents .tabs-overview-container::-webkit-scrollbar-thumb {
+ background-color: transparent;
+ border: var(--webkit-scrollbar-padding) solid transparent;
+ border-radius: calc(var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding));
+ background-clip: padding-box;
+}
+
+#nav-tree:hover::-webkit-scrollbar-thumb,
+div.fragment:hover::-webkit-scrollbar-thumb,
+pre.fragment:hover::-webkit-scrollbar-thumb,
+div.memproto:hover::-webkit-scrollbar-thumb,
+.contents center:hover::-webkit-scrollbar-thumb,
+.contents .center:hover::-webkit-scrollbar-thumb,
+.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody:hover::-webkit-scrollbar-thumb,
+div.contents .toc:hover::-webkit-scrollbar-thumb,
+.contents .dotgraph:hover::-webkit-scrollbar-thumb,
+.contents .tabs-overview-container:hover::-webkit-scrollbar-thumb {
+ background-color: var(--webkit-scrollbar-color);
+}
+
+#nav-tree::-webkit-scrollbar-track,
+div.fragment::-webkit-scrollbar-track,
+pre.fragment::-webkit-scrollbar-track,
+div.memproto::-webkit-scrollbar-track,
+.contents center::-webkit-scrollbar-track,
+.contents .center::-webkit-scrollbar-track,
+.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar-track,
+div.contents .toc::-webkit-scrollbar-track,
+.contents .dotgraph::-webkit-scrollbar-track,
+.contents .tabs-overview-container::-webkit-scrollbar-track {
+ background: transparent;
+}
+
+#nav-tree::-webkit-scrollbar-corner {
+ background-color: var(--side-nav-background);
+}
+
+#nav-tree,
+div.fragment,
+pre.fragment,
+div.memproto,
+.contents center,
+.contents .center,
+.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody,
+div.contents .toc {
+ overflow-x: auto;
+ overflow-x: overlay;
+}
+
+#nav-tree {
+ overflow-x: auto;
+ overflow-y: auto;
+ overflow-y: overlay;
+}
+
+/*
+ Scrollbars for Firefox
+*/
+
+#nav-tree,
+div.fragment,
+pre.fragment,
+div.memproto,
+.contents center,
+.contents .center,
+.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody,
+div.contents .toc,
+.contents .dotgraph,
+.contents .tabs-overview-container {
+ scrollbar-width: thin;
+}
+
+/*
+ Optional Dark mode toggle button
+*/
+
+doxygen-awesome-dark-mode-toggle {
+ display: inline-block;
+ margin: 0 0 0 var(--spacing-small);
+ padding: 0;
+ width: var(--searchbar-height);
+ height: var(--searchbar-height);
+ background: none;
+ border: none;
+ border-radius: var(--searchbar-border-radius);
+ vertical-align: middle;
+ text-align: center;
+ line-height: var(--searchbar-height);
+ font-size: 22px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ user-select: none;
+ cursor: pointer;
+}
+
+doxygen-awesome-dark-mode-toggle > svg {
+ transition: transform var(--animation-duration) ease-in-out;
+}
+
+doxygen-awesome-dark-mode-toggle:active > svg {
+ transform: scale(.5);
+}
+
+doxygen-awesome-dark-mode-toggle:hover {
+ background-color: rgba(0,0,0,.03);
+}
+
+html.dark-mode doxygen-awesome-dark-mode-toggle:hover {
+ background-color: rgba(0,0,0,.18);
+}
+
+/*
+ Optional fragment copy button
+*/
+.doxygen-awesome-fragment-wrapper {
+ position: relative;
+}
+
+doxygen-awesome-fragment-copy-button {
+ opacity: 0;
+ background: var(--fragment-background);
+ width: 28px;
+ height: 28px;
+ position: absolute;
+ right: calc(var(--spacing-large) - (var(--spacing-large) / 2.5));
+ top: calc(var(--spacing-large) - (var(--spacing-large) / 2.5));
+ border: 1px solid var(--fragment-foreground);
+ cursor: pointer;
+ border-radius: var(--border-radius-small);
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.doxygen-awesome-fragment-wrapper:hover doxygen-awesome-fragment-copy-button, doxygen-awesome-fragment-copy-button.success {
+ opacity: .28;
+}
+
+doxygen-awesome-fragment-copy-button:hover, doxygen-awesome-fragment-copy-button.success {
+ opacity: 1 !important;
+}
+
+doxygen-awesome-fragment-copy-button:active:not([class~=success]) svg {
+ transform: scale(.91);
+}
+
+doxygen-awesome-fragment-copy-button svg {
+ fill: var(--fragment-foreground);
+ width: 18px;
+ height: 18px;
+}
+
+doxygen-awesome-fragment-copy-button.success svg {
+ fill: rgb(14, 168, 14);
+}
+
+doxygen-awesome-fragment-copy-button.success {
+ border-color: rgb(14, 168, 14);
+}
+
+@media screen and (max-width: 767px) {
+ .textblock > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button,
+ .textblock li > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button,
+ .memdoc li > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button,
+ .memdoc > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button,
+ dl dd > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button {
+ right: 0;
+ }
+}
+
+/*
+ Optional paragraph link button
+*/
+
+a.anchorlink {
+ font-size: 90%;
+ margin-left: var(--spacing-small);
+ color: var(--page-foreground-color) !important;
+ text-decoration: none;
+ opacity: .15;
+ display: none;
+ transition: opacity var(--animation-duration) ease-in-out, color var(--animation-duration) ease-in-out;
+}
+
+a.anchorlink svg {
+ fill: var(--page-foreground-color);
+}
+
+h3 a.anchorlink svg, h4 a.anchorlink svg {
+ margin-bottom: -3px;
+ margin-top: -4px;
+}
+
+a.anchorlink:hover {
+ opacity: .45;
+}
+
+h2:hover a.anchorlink, h1:hover a.anchorlink, h3:hover a.anchorlink, h4:hover a.anchorlink {
+ display: inline-block;
+}
+
+/*
+ Optional tab feature
+*/
+
+.tabbed > ul {
+ padding-inline-start: 0px;
+ margin: 0;
+ padding: var(--spacing-small) 0;
+}
+
+.tabbed > ul > li {
+ display: none;
+}
+
+.tabbed > ul > li.selected {
+ display: block;
+}
+
+.tabs-overview-container {
+ overflow-x: auto;
+ display: block;
+ overflow-y: visible;
+}
+
+.tabs-overview {
+ border-bottom: 1px solid var(--separator-color);
+ display: flex;
+ flex-direction: row;
+}
+
+@media screen and (max-width: 767px) {
+ .tabs-overview-container {
+ margin: 0 calc(0px - var(--spacing-large));
+ }
+ .tabs-overview {
+ padding: 0 var(--spacing-large)
+ }
+}
+
+.tabs-overview button.tab-button {
+ color: var(--page-foreground-color);
+ margin: 0;
+ border: none;
+ background: transparent;
+ padding: calc(var(--spacing-large) / 2) 0;
+ display: inline-block;
+ font-size: var(--page-font-size);
+ cursor: pointer;
+ box-shadow: 0 1px 0 0 var(--separator-color);
+ position: relative;
+
+ -webkit-tap-highlight-color: transparent;
+}
+
+.tabs-overview button.tab-button .tab-title::before {
+ display: block;
+ content: attr(title);
+ font-weight: 600;
+ height: 0;
+ overflow: hidden;
+ visibility: hidden;
+}
+
+.tabs-overview button.tab-button .tab-title {
+ float: left;
+ white-space: nowrap;
+ font-weight: normal;
+ font-family: var(--font-family);
+ padding: calc(var(--spacing-large) / 2) var(--spacing-large);
+ border-radius: var(--border-radius-medium);
+ transition: background-color var(--animation-duration) ease-in-out, font-weight var(--animation-duration) ease-in-out;
+}
+
+.tabs-overview button.tab-button:not(:last-child) .tab-title {
+ box-shadow: 8px 0 0 -7px var(--separator-color);
+}
+
+.tabs-overview button.tab-button:hover .tab-title {
+ background: var(--separator-color);
+ box-shadow: none;
+}
+
+.tabs-overview button.tab-button.active .tab-title {
+ font-weight: 600;
+}
+
+.tabs-overview button.tab-button::after {
+ content: '';
+ display: block;
+ position: absolute;
+ left: 0;
+ bottom: 0;
+ right: 0;
+ height: 0;
+ width: 0%;
+ margin: 0 auto;
+ border-radius: var(--border-radius-small) var(--border-radius-small) 0 0;
+ background-color: var(--primary-color);
+ transition: width var(--animation-duration) ease-in-out, height var(--animation-duration) ease-in-out;
+}
+
+.tabs-overview button.tab-button.active::after {
+ width: 100%;
+ box-sizing: border-box;
+ height: 3px;
+}
+
+
+/*
+ Navigation Buttons
+*/
+
+.section_buttons:not(:empty) {
+ margin-top: calc(var(--spacing-large) * 3);
+}
+
+.section_buttons table.markdownTable {
+ display: block;
+ width: 100%;
+}
+
+.section_buttons table.markdownTable tbody {
+ display: table !important;
+ width: 100%;
+ box-shadow: none;
+ border-spacing: 10px;
+}
+
+.section_buttons table.markdownTable td {
+ padding: 0;
+}
+
+.section_buttons table.markdownTable th {
+ display: none;
+}
+
+.section_buttons table.markdownTable tr.markdownTableHead {
+ border: none;
+}
+
+.section_buttons tr th, .section_buttons tr td {
+ background: none;
+ border: none;
+ padding: var(--spacing-large) 0 var(--spacing-small);
+}
+
+.section_buttons a {
+ display: inline-block;
+ border: 1px solid var(--separator-color);
+ border-radius: var(--border-radius-medium);
+ color: var(--page-secondary-foreground-color) !important;
+ text-decoration: none;
+ transition: color var(--animation-duration) ease-in-out, background-color var(--animation-duration) ease-in-out;
+}
+
+.section_buttons a:hover {
+ color: var(--page-foreground-color) !important;
+ background-color: var(--odd-color);
+}
+
+.section_buttons tr td.markdownTableBodyLeft a {
+ padding: var(--spacing-medium) var(--spacing-large) var(--spacing-medium) calc(var(--spacing-large) / 2);
+}
+
+.section_buttons tr td.markdownTableBodyRight a {
+ padding: var(--spacing-medium) calc(var(--spacing-large) / 2) var(--spacing-medium) var(--spacing-large);
+}
+
+.section_buttons tr td.markdownTableBodyLeft a::before,
+.section_buttons tr td.markdownTableBodyRight a::after {
+ color: var(--page-secondary-foreground-color) !important;
+ display: inline-block;
+ transition: color .08s ease-in-out, transform .09s ease-in-out;
+}
+
+.section_buttons tr td.markdownTableBodyLeft a::before {
+ content: '〈';
+ padding-right: var(--spacing-large);
+}
+
+
+.section_buttons tr td.markdownTableBodyRight a::after {
+ content: '〉';
+ padding-left: var(--spacing-large);
+}
+
+
+.section_buttons tr td.markdownTableBodyLeft a:hover::before {
+ color: var(--page-foreground-color) !important;
+ transform: translateX(-3px);
+}
+
+.section_buttons tr td.markdownTableBodyRight a:hover::after {
+ color: var(--page-foreground-color) !important;
+ transform: translateX(3px);
+}
+
+@media screen and (max-width: 450px) {
+ .section_buttons a {
+ width: 100%;
+ box-sizing: border-box;
+ }
+
+ .section_buttons tr td:nth-of-type(1).markdownTableBodyLeft a {
+ border-radius: var(--border-radius-medium) 0 0 var(--border-radius-medium);
+ border-right: none;
+ }
+
+ .section_buttons tr td:nth-of-type(2).markdownTableBodyRight a {
+ border-radius: 0 var(--border-radius-medium) var(--border-radius-medium) 0;
+ }
+}
+
+/*
+ Bordered image
+*/
+
+html.dark-mode .darkmode_inverted_image img, /* < doxygen 1.9.3 */
+html.dark-mode .darkmode_inverted_image object[type="image/svg+xml"] /* doxygen 1.9.3 */ {
+ filter: brightness(89%) hue-rotate(180deg) invert();
+}
+
+.bordered_image {
+ border-radius: var(--border-radius-small);
+ border: 1px solid var(--separator-color);
+ display: inline-block;
+ overflow: hidden;
+}
+
+.bordered_image:empty {
+ border: none;
+}
+
+html.dark-mode .bordered_image img, /* < doxygen 1.9.3 */
+html.dark-mode .bordered_image object[type="image/svg+xml"] /* doxygen 1.9.3 */ {
+ border-radius: var(--border-radius-small);
+}
+
+/*
+ Button
+*/
+
+.primary-button {
+ display: inline-block;
+ cursor: pointer;
+ background: var(--primary-color);
+ color: var(--page-background-color) !important;
+ border-radius: var(--border-radius-medium);
+ padding: var(--spacing-small) var(--spacing-medium);
+ text-decoration: none;
+}
+
+.primary-button:hover {
+ background: var(--primary-dark-color);
+}
\ No newline at end of file
diff --git a/doc/doxygen/doxygen-custom.css b/doc/doxygen/doxygen-custom.css
new file mode 100644
index 00000000000..36229885ad9
--- /dev/null
+++ b/doc/doxygen/doxygen-custom.css
@@ -0,0 +1,228 @@
+/*
+ * Custom Doxygen overrides to match the MNE-CPP Docusaurus navbar.
+ * Height ≈ 3.75rem (60px), system-ui font stack, semibold (500) nav links.
+ */
+
+/* ── Font & variable overrides ─────────────────────────────────── */
+html {
+ --font-family: system-ui, -apple-system, Segoe UI, Roboto, Ubuntu,
+ Cantarell, Noto Sans, sans-serif, BlinkMacSystemFont, "Segoe UI",
+ Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
+ "Segoe UI Symbol";
+ --navigation-font-size: 1rem;
+ /* 16px – matches Docusaurus navbar (--ifm-font-size-base: 100%) */
+ --title-font-size: 1.25rem;
+ /* 20px – keeps logo area compact */
+}
+
+/* ── Top bar: match Docusaurus 3.75rem (60px) height ───────────── */
+#top {
+ min-height: 3.75rem;
+}
+
+#titlearea {
+ padding: 0.25rem 1rem;
+}
+
+#titlearea table tbody tr {
+ height: auto !important;
+}
+
+#projectlogo img {
+ max-height: 2rem;
+ /* 32px – matches Docusaurus navbar logo */
+ margin-right: 0.5rem;
+}
+
+/* ── Dark / light mode logo switching ──────────────────────────── */
+#projectlogo .logo-dark {
+ display: none;
+}
+
+html.dark-mode #projectlogo .logo-light {
+ display: none;
+}
+
+html.dark-mode #projectlogo .logo-dark {
+ display: inline;
+}
+
+#projectname {
+ font-size: var(--title-font-size);
+ font-weight: 600;
+ line-height: 1.25;
+}
+
+#projectnumber {
+ display: none;
+}
+
+/* ── Version badge (doxygen-awesome blue accent) ──────────────── */
+.version-badge {
+ font-size: 0.75rem;
+ font-weight: 500;
+ padding: 0.15rem 0.55rem;
+ border-radius: 12px;
+ background: rgba(23, 121, 196, 0.1);
+ border: 1px solid rgba(23, 121, 196, 0.25);
+ color: var(--primary-color);
+ letter-spacing: 0.03em;
+ margin-right: 0.5rem;
+ display: inline-flex;
+ align-items: center;
+ vertical-align: middle;
+ white-space: nowrap;
+}
+
+html.dark-mode .version-badge {
+ background: rgba(25, 130, 210, 0.12);
+ border-color: rgba(25, 130, 210, 0.25);
+ color: var(--primary-color);
+}
+
+/* ── Navigation links: Docusaurus-style semibold ───────────────── */
+.sm-dox a,
+.sm-dox a:hover,
+.sm-dox a:focus,
+.tablist li,
+.tablist li a,
+.tablist li.current a {
+ font-family: var(--font-family) !important;
+ font-weight: 500 !important;
+ font-size: var(--navigation-font-size) !important;
+ letter-spacing: 0.01em;
+}
+
+/* Active / current tab – subtle bottom highlight like Docusaurus */
+.tablist li.current a {
+ border-bottom: 2px solid var(--primary-color);
+ border-radius: 0 !important;
+}
+
+/* ── Tab bar spacing to match Docusaurus padding ───────────────── */
+.tabs,
+.tabs2,
+.tabs3 {
+ padding: 0 1rem;
+}
+
+.tablist li {
+ padding: 0.375rem 0.75rem;
+}
+
+.sm-dox>li>a {
+ padding: 0.5rem 0.75rem !important;
+}
+
+#main-nav {
+ padding: 0.25rem 1rem;
+ display: flex;
+ align-items: center;
+}
+
+/* ── Vertically center & right-align search, toggle, GitHub ────── */
+
+/* The nav menu list takes available space, search etc. pushed right */
+#main-menu {
+ flex: 1;
+ display: flex !important;
+ align-items: center;
+ flex-wrap: wrap;
+}
+
+/* The search position item pushes to far right via margin-left:auto */
+#searchBoxPos2 {
+ margin-left: auto !important;
+ float: none !important;
+ display: flex !important;
+ align-items: center;
+ gap: 0.375rem;
+}
+
+/* Search box – pushed to outer right via flex order */
+.tabs #MSearchBox,
+#MSearchBox {
+ display: inline-flex !important;
+ align-items: center;
+ vertical-align: middle;
+ position: relative !important;
+ right: auto !important;
+ order: 100;
+ margin-left: 0.5rem !important;
+}
+
+/* Center text vertically inside search input */
+#MSearchField {
+ line-height: var(--searchbar-height) !important;
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ box-sizing: border-box;
+}
+
+/* Dark mode toggle & GitHub link: vertical centering */
+doxygen-awesome-dark-mode-toggle,
+.github-link {
+ vertical-align: middle;
+ display: inline-flex !important;
+ align-items: center;
+ justify-content: center;
+}
+
+/* ── Hide dropdown arrows (sub-arrows) ─────────────────────────── */
+.sm-dox a span.sub-arrow,
+.sm-dox ul a span.sub-arrow {
+ display: none !important;
+}
+
+/* ── GitHub link in header (matches Docusaurus style) ──────────── */
+.github-link {
+ display: inline-flex !important;
+ align-items: center;
+ justify-content: center;
+ width: auto;
+ height: auto;
+ margin-left: 0.5rem;
+ border-radius: var(--border-radius-small, 4px);
+ vertical-align: middle;
+ cursor: pointer;
+ transition: opacity 0.2s;
+ flex-shrink: 0;
+}
+
+.github-link:hover {
+ opacity: 0.7;
+ text-decoration: none !important;
+ background: none !important;
+ color: inherit !important;
+}
+
+.github-link svg {
+ width: 24px !important;
+ height: 24px !important;
+ min-width: 24px;
+ min-height: 24px;
+ fill: var(--header-foreground);
+ flex-shrink: 0;
+}
+
+/* ── Dark mode toggle: match Docusaurus look ───────────────────── */
+doxygen-awesome-dark-mode-toggle {
+ width: 2rem !important;
+ height: 2rem !important;
+ font-size: 20px !important;
+ border-radius: 50% !important;
+ transition: background var(--animation-duration) ease-in-out;
+}
+
+doxygen-awesome-dark-mode-toggle:hover {
+ background-color: rgba(0, 0, 0, 0.1) !important;
+}
+
+html.dark-mode doxygen-awesome-dark-mode-toggle:hover {
+ background-color: rgba(255, 255, 255, 0.1) !important;
+}
+
+doxygen-awesome-dark-mode-toggle>svg {
+ width: 24px;
+ height: 24px;
+}
\ No newline at end of file
diff --git a/doc/doxygen/header.html b/doc/doxygen/header.html
new file mode 100644
index 00000000000..a8875a9c47b
--- /dev/null
+++ b/doc/doxygen/header.html
@@ -0,0 +1,162 @@
+
+
+
+
+
+
+
+
+
+
+ $projectname: $title
+
+ $title
+
+
+
+
+
+
+
+
+
+
+
+
+ $treeview
+ $search
+ $mathjax
+ $darkmode
+
+ $extrastylesheet
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ v$projectnumber
+
+
+ $projectbrief
+
+
+
+
+
+ $projectbrief
+
+
+
+
+
+
+ $searchbox
+
+
+
+
+
+
+
+ $searchbox
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/doc/doxygen/mne-cpp_doxyfile b/doc/doxygen/mne-cpp_doxyfile
index 177b59ab87e..2bb7f0fc5c3 100644
--- a/doc/doxygen/mne-cpp_doxyfile
+++ b/doc/doxygen/mne-cpp_doxyfile
@@ -1,7 +1,7 @@
-# Doxyfile 1.8.11
+# Doxyfile 1.16.1
# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project.
+# Doxygen (www.doxygen.org) for a project.
#
# All text after a double hash (##) is considered a comment and is placed in
# front of the TAG it is preceding.
@@ -12,16 +12,26 @@
# For lists, items can also be appended using:
# TAG += value [value, ...]
# Values that contain spaces should be placed between quotes (\" \").
+#
+# Note:
+#
+# Use Doxygen to compare the used configuration file with the template
+# configuration file:
+# doxygen -x [configFile]
+# Use Doxygen to compare the used configuration file with the template
+# configuration file without replacing the environment variables or CMake type
+# replacement variables:
+# doxygen -x_noenv [configFile]
#---------------------------------------------------------------------------
# Project related configuration options
#---------------------------------------------------------------------------
-# This tag specifies the encoding used for all characters in the config file
-# that follow. The default is UTF-8 which is also the encoding used for all text
-# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
-# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
-# for the list of possible encodings.
+# This tag specifies the encoding used for all characters in the configuration
+# file that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# https://www.gnu.org/software/libiconv/ for the list of possible encodings.
# The default value is: UTF-8.
DOXYFILE_ENCODING = UTF-8
@@ -38,39 +48,57 @@ PROJECT_NAME = MNE-CPP
# could be handy for archiving the generated documentation or if some version
# control system is used.
-PROJECT_NUMBER = 0.1.9
+PROJECT_NUMBER = 2.0.0
# Using the PROJECT_BRIEF tag one can provide an optional one line description
-# for a project that appears at the top of each page and should give viewer a
+# for a project that appears at the top of each page and should give viewers a
# quick idea about the purpose of the project. Keep the description short.
-PROJECT_BRIEF = "A Framework for Electrophysiology"
+PROJECT_BRIEF =
# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
# in the documentation. The maximum height of the logo should not exceed 55
# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
# the logo to the output directory.
-PROJECT_LOGO = MNE-CPP_Doxygen_Logo.svg
+PROJECT_LOGO = MNE-CPP_Logo.svg
+
+# With the PROJECT_ICON tag one can specify an icon that is included in the tabs
+# when the HTML document is shown. Doxygen will copy the logo to the output
+# directory.
+
+PROJECT_ICON =
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
# into which the generated documentation will be written. If a relative path is
-# entered, it will be relative to the location where doxygen was started. If
+# entered, it will be relative to the location where Doxygen was started. If
# left blank the current directory will be used.
OUTPUT_DIRECTORY =
-# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
-# directories (in 2 levels) under the output directory of each output format and
-# will distribute the generated files over these directories. Enabling this
-# option can be useful when feeding doxygen a huge amount of source files, where
-# putting all generated files in the same directory would otherwise causes
-# performance problems for the file system.
+# If the CREATE_SUBDIRS tag is set to YES then Doxygen will create up to 4096
+# sub-directories (in 2 levels) under the output directory of each output format
+# and will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding Doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise cause
+# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to
+# control the number of sub-directories.
# The default value is: NO.
CREATE_SUBDIRS = NO
-# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# Controls the number of sub-directories that will be created when
+# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every
+# level increment doubles the number of directories, resulting in 4096
+# directories at level 8 which is the default and also the maximum value. The
+# sub-directories are organized in 2 levels, the first level always has a fixed
+# number of 16 directories.
+# Minimum value: 0, maximum value: 8, default value: 8.
+# This tag requires that the tag CREATE_SUBDIRS is set to YES.
+
+CREATE_SUBDIRS_LEVEL = 8
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, Doxygen will allow non-ASCII
# characters to appear in the names of generated files. If set to NO, non-ASCII
# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
# U+3044.
@@ -79,28 +107,28 @@ CREATE_SUBDIRS = NO
ALLOW_UNICODE_NAMES = NO
# The OUTPUT_LANGUAGE tag is used to specify the language in which all
-# documentation generated by doxygen is written. Doxygen will use this
+# documentation generated by Doxygen is written. Doxygen will use this
# information to generate all constant output in the proper language.
-# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
-# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
-# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
-# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
-# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
-# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
-# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
-# Ukrainian and Vietnamese.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian,
+# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English
+# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek,
+# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with
+# English messages), Korean, Korean-en (Korean with English messages), Latvian,
+# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese,
+# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish,
+# Swedish, Turkish, Ukrainian and Vietnamese.
# The default value is: English.
OUTPUT_LANGUAGE = English
-# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# If the BRIEF_MEMBER_DESC tag is set to YES, Doxygen will include brief member
# descriptions after the members that are listed in the file and class
# documentation (similar to Javadoc). Set to NO to disable this.
# The default value is: YES.
BRIEF_MEMBER_DESC = YES
-# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# If the REPEAT_BRIEF tag is set to YES, Doxygen will prepend the brief
# description of a member or function before the detailed description
#
# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
@@ -131,13 +159,13 @@ ABBREVIATE_BRIEF = "The $name class" \
the
# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
-# doxygen will generate a detailed section even if there is only a brief
+# Doxygen will generate a detailed section even if there is only a brief
# description.
# The default value is: NO.
ALWAYS_DETAILED_SEC = NO
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# If the INLINE_INHERITED_MEMB tag is set to YES, Doxygen will show all
# inherited members of a class in the documentation of that class as if those
# members were ordinary class members. Constructors, destructors and assignment
# operators of the base classes will not be shown.
@@ -145,7 +173,7 @@ ALWAYS_DETAILED_SEC = NO
INLINE_INHERITED_MEMB = NO
-# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# If the FULL_PATH_NAMES tag is set to YES, Doxygen will prepend the full path
# before files name in the file list and in the header files. If set to NO the
# shortest path that makes the file name unique will be used
# The default value is: YES.
@@ -155,11 +183,11 @@ FULL_PATH_NAMES = YES
# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
# Stripping is only done if one of the specified strings matches the left-hand
# part of the path. The tag can be used to show relative paths in the file list.
-# If left blank the directory from which doxygen is run is used as the path to
+# If left blank the directory from which Doxygen is run is used as the path to
# strip.
#
# Note that you can specify absolute paths here, but also relative paths, which
-# will be relative from the directory where doxygen is started.
+# will be relative from the directory where Doxygen is started.
# This tag requires that the tag FULL_PATH_NAMES is set to YES.
STRIP_FROM_PATH = /home/runner/work/mne-cpp/mne-cpp
@@ -173,31 +201,42 @@ STRIP_FROM_PATH = /home/runner/work/mne-cpp/mne-cpp
STRIP_FROM_INC_PATH =
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
-# less readable) file names. This can be useful is your file systems doesn't
+# If the SHORT_NAMES tag is set to YES, Doxygen will generate much shorter (but
+# less readable) file names. This can be useful if your file system doesn't
# support long names like on DOS, Mac, or CD-ROM.
# The default value is: NO.
SHORT_NAMES = YES
-# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
-# first line (until the first dot) of a Javadoc-style comment as the brief
-# description. If set to NO, the Javadoc-style will behave just like regular Qt-
-# style comments (thus requiring an explicit @brief command for a brief
-# description.)
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen will interpret the
+# first line (until the first dot, question mark or exclamation mark) of a
+# Javadoc-style comment as the brief description. If set to NO, the Javadoc-
+# style will behave just like regular Qt-style comments (thus requiring an
+# explicit @brief command for a brief description.)
# The default value is: NO.
JAVADOC_AUTOBRIEF = NO
-# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
-# line (until the first dot) of a Qt-style comment as the brief description. If
-# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
-# requiring an explicit \brief command for a brief description.)
+# If the JAVADOC_BANNER tag is set to YES then Doxygen will interpret a line
+# such as
+# /***************
+# as being the beginning of a Javadoc-style comment "banner". If set to NO, the
+# Javadoc-style will behave just like regular comments and it will not be
+# interpreted by Doxygen.
+# The default value is: NO.
+
+JAVADOC_BANNER = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will interpret the first
+# line (until the first dot, question mark or exclamation mark) of a Qt-style
+# comment as the brief description. If set to NO, the Qt-style will behave just
+# like regular Qt-style comments (thus requiring an explicit \brief command for
+# a brief description.)
# The default value is: NO.
QT_AUTOBRIEF = NO
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen treat a
# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
# a brief description. This used to be the default behavior. The new default is
# to treat a multi-line C++ comment block as a detailed description. Set this
@@ -209,13 +248,21 @@ QT_AUTOBRIEF = NO
MULTILINE_CPP_IS_BRIEF = NO
+# By default Python docstrings are displayed as preformatted text and Doxygen's
+# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the
+# Doxygen's special commands can be used and the contents of the docstring
+# documentation blocks is shown as Doxygen documentation.
+# The default value is: YES.
+
+PYTHON_DOCSTRING = YES
+
# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
# documentation from any documented member that it re-implements.
# The default value is: YES.
INHERIT_DOCS = YES
-# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then Doxygen will produce a new
# page for each member. If set to NO, the documentation of a member will be part
# of the file/class/namespace that contains it.
# The default value is: NO.
@@ -232,20 +279,19 @@ TAB_SIZE = 4
# the documentation. An alias has the form:
# name=value
# For example adding
-# "sideeffect=@par Side Effects:\n"
+# "sideeffect=@par Side Effects:^^"
# will allow you to put the command \sideeffect (or @sideeffect) in the
# documentation, which will result in a user-defined paragraph with heading
-# "Side Effects:". You can put \n's in the value part of an alias to insert
-# newlines.
+# "Side Effects:". Note that you cannot put \n's in the value part of an alias
+# to insert newlines (in the resulting output). You can put ^^ in the value part
+# of an alias to insert a newline as if a physical newline was in the original
+# file. When you need a literal { or } or , in the value part of an alias you
+# have to escape them by means of a backslash (\), this can lead to conflicts
+# with the commands \{ and \} for these it is advised to use the version @{ and
+# @} or use a double escape (\\{ and \\})
ALIASES =
-# This tag can be used to specify a number of word-keyword mappings (TCL only).
-# A mapping has the form "name=value". For example adding "class=itcl::class"
-# will allow you to use the command class in the itcl::class meaning.
-
-TCL_SUBST =
-
# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
# only. Doxygen will then generate output that is more tailored for C. For
# instance, some of the names that are used will be different. The list of all
@@ -274,49 +320,104 @@ OPTIMIZE_FOR_FORTRAN = NO
OPTIMIZE_OUTPUT_VHDL = NO
+# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice
+# sources only. Doxygen will then generate output that is more tailored for that
+# language. For instance, namespaces will be presented as modules, types will be
+# separated into more groups, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_SLICE = NO
+
# Doxygen selects the parser to use depending on the extension of the files it
# parses. With this tag you can assign which parser to use for a given
# extension. Doxygen has a built-in mapping, but you can override or extend it
# using this tag. The format is ext=language, where ext is a file extension, and
-# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
-# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
-# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
-# Fortran. In the later case the parser tries to guess whether the code is fixed
-# or free formatted code, this is the default for Fortran type files), VHDL. For
-# instance to make doxygen treat .inc files as Fortran files (default is PHP),
-# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+# language is one of the parsers supported by Doxygen: IDL, Java, JavaScript,
+# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice,
+# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
+# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser
+# tries to guess whether the code is fixed or free formatted code, this is the
+# default for Fortran type files). For instance to make Doxygen treat .inc files
+# as Fortran files (default is PHP), and .f files as C (default is Fortran),
+# use: inc=Fortran f=C.
#
# Note: For files without extension you can use no_extension as a placeholder.
#
# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
-# the files are not read by doxygen.
+# the files are not read by Doxygen. When specifying no_extension you should add
+# * to the FILE_PATTERNS.
+#
+# Note see also the list of default file extension mappings.
EXTENSION_MAPPING =
-# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# If the MARKDOWN_SUPPORT tag is enabled then Doxygen pre-processes all comments
# according to the Markdown format, which allows for more readable
-# documentation. See http://daringfireball.net/projects/markdown/ for details.
-# The output of markdown processing is further processed by doxygen, so you can
-# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# documentation. See https://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by Doxygen, so you can
+# mix Doxygen, HTML, and XML commands with Markdown formatting. Disable only in
# case of backward compatibilities issues.
# The default value is: YES.
MARKDOWN_SUPPORT = YES
-# When enabled doxygen tries to link words that correspond to documented
+# If the MARKDOWN_STRICT tag is enabled then Doxygen treats text in comments as
+# Markdown formatted also in cases where Doxygen's native markup format
+# conflicts with that of Markdown. This is only relevant in cases where
+# backticks are used. Doxygen's native markup style allows a single quote to end
+# a text fragment started with a backtick and then treat it as a piece of quoted
+# text, whereas in Markdown such text fragment is treated as verbatim and only
+# ends when a second matching backtick is found. Also, Doxygen's native markup
+# format requires double quotes to be escaped when they appear in a backtick
+# section, whereas this is not needed for Markdown.
+# The default value is: YES.
+# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
+
+MARKDOWN_STRICT = YES
+
+# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
+# to that level are automatically included in the table of contents, even if
+# they do not have an id attribute.
+# Note: This feature currently applies only to Markdown headings.
+# Minimum value: 0, maximum value: 99, default value: 6.
+# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
+
+TOC_INCLUDE_HEADINGS = 6
+
+# The MARKDOWN_ID_STYLE tag can be used to specify the algorithm used to
+# generate identifiers for the Markdown headings. Note: Every identifier is
+# unique.
+# Possible values are: DOXYGEN use a fixed 'autotoc_md' string followed by a
+# sequence number starting at 0 and GITHUB use the lower case version of title
+# with any whitespace replaced by '-' and punctuation characters removed.
+# The default value is: DOXYGEN.
+# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
+
+MARKDOWN_ID_STYLE = DOXYGEN
+
+# When enabled Doxygen tries to link words that correspond to documented
# classes, or namespaces to their corresponding documentation. Such a link can
# be prevented in individual cases by putting a % sign in front of the word or
-# globally by setting AUTOLINK_SUPPORT to NO.
+# globally by setting AUTOLINK_SUPPORT to NO. Words listed in the
+# AUTOLINK_IGNORE_WORDS tag are excluded from automatic linking.
# The default value is: YES.
AUTOLINK_SUPPORT = YES
+# This tag specifies a list of words that, when matching the start of a word in
+# the documentation, will suppress auto links generation, if it is enabled via
+# AUTOLINK_SUPPORT. This list does not affect links explicitly created using #
+# or the \link or \ref commands.
+# This tag requires that the tag AUTOLINK_SUPPORT is set to YES.
+
+AUTOLINK_IGNORE_WORDS =
+
# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
# to include (a tag file for) the STL sources as input, then you should set this
-# tag to YES in order to let doxygen match functions declarations and
+# tag to YES in order to let Doxygen match functions declarations and
# definitions whose arguments contain STL classes (e.g. func(std::string);
-# versus func(std::string) {}). This also make the inheritance and collaboration
-# diagrams that involve STL classes more complete and accurate.
+# versus func(std::string) {}). This also makes the inheritance and
+# collaboration diagrams that involve STL classes more complete and accurate.
# The default value is: NO.
BUILTIN_STL_SUPPORT = NO
@@ -328,16 +429,16 @@ BUILTIN_STL_SUPPORT = NO
CPP_CLI_SUPPORT = NO
# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
-# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
-# will parse them like normal C++ but will assume all classes use public instead
-# of private inheritance when no explicit protection keyword is present.
+# https://www.riverbankcomputing.com/software) sources only. Doxygen will parse
+# them like normal C++ but will assume all classes use public instead of private
+# inheritance when no explicit protection keyword is present.
# The default value is: NO.
SIP_SUPPORT = NO
# For Microsoft's IDL there are propget and propput attributes to indicate
# getter and setter methods for a property. Setting this option to YES will make
-# doxygen to replace the get and set methods by a property in the documentation.
+# Doxygen to replace the get and set methods by a property in the documentation.
# This will only work if the methods are indeed getting or setting a simple
# type. If this is not the case, or you want to show the methods anyway, you
# should set this option to NO.
@@ -346,7 +447,7 @@ SIP_SUPPORT = NO
IDL_PROPERTY_SUPPORT = YES
# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
-# tag is set to YES then doxygen will reuse the documentation of the first
+# tag is set to YES then Doxygen will reuse the documentation of the first
# member in the group (if any) for the other members of the group. By default
# all members of a group must be documented explicitly.
# The default value is: NO.
@@ -404,21 +505,42 @@ TYPEDEF_HIDES_STRUCT = NO
# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
# cache is used to resolve symbols given their name and scope. Since this can be
# an expensive process and often the same symbol appears multiple times in the
-# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
-# doxygen will become slower. If the cache is too large, memory is wasted. The
+# code, Doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# Doxygen will become slower. If the cache is too large, memory is wasted. The
# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
-# symbols. At the end of a run doxygen will report the cache usage and suggest
+# symbols. At the end of a run Doxygen will report the cache usage and suggest
# the optimal cache size from a speed point of view.
# Minimum value: 0, maximum value: 9, default value: 0.
LOOKUP_CACHE_SIZE = 0
+# The NUM_PROC_THREADS specifies the number of threads Doxygen is allowed to use
+# during processing. When set to 0 Doxygen will based this on the number of
+# cores available in the system. You can set it explicitly to a value larger
+# than 0 to get more control over the balance between CPU load and processing
+# speed. At this moment only the input processing can be done using multiple
+# threads. Since this is still an experimental feature the default is set to 1,
+# which effectively disables parallel processing. Please report any issues you
+# encounter. Generating dot graphs in parallel is controlled by the
+# DOT_NUM_THREADS setting.
+# Minimum value: 0, maximum value: 512, default value: 1.
+
+NUM_PROC_THREADS = 1
+
+# If the TIMESTAMP tag is set different from NO then each generated page will
+# contain the date or date and time when the page was generated. Setting this to
+# NO can help when comparing the output of multiple runs.
+# Possible values are: YES, NO, DATETIME and DATE.
+# The default value is: NO.
+
+TIMESTAMP = YES
+
#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------
-# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# If the EXTRACT_ALL tag is set to YES, Doxygen will assume all entities in
# documentation are documented, even if no documentation was available. Private
# class members and static file members will be hidden unless the
# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
@@ -426,7 +548,7 @@ LOOKUP_CACHE_SIZE = 0
# normally produced when WARNINGS is set to YES.
# The default value is: NO.
-EXTRACT_ALL = NO
+EXTRACT_ALL = YES
# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
# be included in the documentation.
@@ -434,6 +556,12 @@ EXTRACT_ALL = NO
EXTRACT_PRIVATE = NO
+# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual
+# methods of a class will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIV_VIRTUAL = NO
+
# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
# scope will be included in the documentation.
# The default value is: NO.
@@ -471,7 +599,14 @@ EXTRACT_LOCAL_METHODS = NO
EXTRACT_ANON_NSPACES = NO
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# If this flag is set to YES, the name of an unnamed parameter in a declaration
+# will be determined by the corresponding definition. By default unnamed
+# parameters remain unnamed in the output.
+# The default value is: YES.
+
+RESOLVE_UNNAMED_PARAMS = YES
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
# undocumented members inside documented classes or files. If set to NO these
# members will be included in the various overviews, but no documentation
# section is generated. This option has no effect if EXTRACT_ALL is enabled.
@@ -479,22 +614,31 @@ EXTRACT_ANON_NSPACES = NO
HIDE_UNDOC_MEMBERS = NO
-# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
# undocumented classes that are normally visible in the class hierarchy. If set
# to NO, these classes will be included in the various overviews. This option
-# has no effect if EXTRACT_ALL is enabled.
+# will also hide undocumented C++ concepts if enabled. This option has no effect
+# if EXTRACT_ALL is enabled.
# The default value is: NO.
HIDE_UNDOC_CLASSES = NO
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
-# (class|struct|union) declarations. If set to NO, these declarations will be
-# included in the documentation.
+# If the HIDE_UNDOC_NAMESPACES tag is set to YES, Doxygen will hide all
+# undocumented namespaces that are normally visible in the namespace hierarchy.
+# If set to NO, these namespaces will be included in the various overviews. This
+# option has no effect if EXTRACT_ALL is enabled.
+# The default value is: YES.
+
+HIDE_UNDOC_NAMESPACES = YES
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all friend
+# declarations. If set to NO, these declarations will be included in the
+# documentation.
# The default value is: NO.
HIDE_FRIEND_COMPOUNDS = NO
-# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
# documentation blocks found inside the body of a function. If set to NO, these
# blocks will be appended to the function's detailed documentation block.
# The default value is: NO.
@@ -508,30 +652,44 @@ HIDE_IN_BODY_DOCS = NO
INTERNAL_DOCS = NO
-# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
-# names in lower-case letters. If set to YES, upper-case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
-# and Mac users are advised to set this option to NO.
-# The default value is: system dependent.
+# With the correct setting of option CASE_SENSE_NAMES Doxygen will better be
+# able to match the capabilities of the underlying filesystem. In case the
+# filesystem is case sensitive (i.e. it supports files in the same directory
+# whose names only differ in casing), the option must be set to YES to properly
+# deal with such files in case they appear in the input. For filesystems that
+# are not case sensitive the option should be set to NO to properly deal with
+# output files written for symbols that only differ in casing, such as for two
+# classes, one named CLASS and the other named Class, and to also support
+# references to files without having to specify the exact matching casing. On
+# Windows (including Cygwin) and macOS, users should typically set this option
+# to NO, whereas on Linux or other Unix flavors it should typically be set to
+# YES.
+# Possible values are: SYSTEM, NO and YES.
+# The default value is: SYSTEM.
CASE_SENSE_NAMES = NO
-# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# If the HIDE_SCOPE_NAMES tag is set to NO then Doxygen will show members with
# their full class and namespace scopes in the documentation. If set to YES, the
# scope will be hidden.
# The default value is: NO.
HIDE_SCOPE_NAMES = NO
-# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then Doxygen will
# append additional text to a page's title, such as Class Reference. If set to
# YES the compound reference will be hidden.
# The default value is: NO.
HIDE_COMPOUND_REFERENCE= NO
-# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class
+# will show which file needs to be included to use the class.
+# The default value is: YES.
+
+SHOW_HEADERFILE = YES
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then Doxygen will put a list of
# the files that are included by a file in the documentation of that file.
# The default value is: YES.
@@ -544,7 +702,7 @@ SHOW_INCLUDE_FILES = YES
SHOW_GROUPED_MEMB_INC = NO
-# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen will list include
# files with double quotes in the documentation rather than with sharp brackets.
# The default value is: NO.
@@ -556,14 +714,14 @@ FORCE_LOCAL_INCLUDES = NO
INLINE_INFO = YES
-# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# If the SORT_MEMBER_DOCS tag is set to YES then Doxygen will sort the
# (detailed) documentation of file and class members alphabetically by member
# name. If set to NO, the members will appear in declaration order.
# The default value is: YES.
SORT_MEMBER_DOCS = YES
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# If the SORT_BRIEF_DOCS tag is set to YES then Doxygen will sort the brief
# descriptions of file, namespace and class members alphabetically by member
# name. If set to NO, the members will appear in declaration order. Note that
# this will also influence the order of the classes in the class list.
@@ -571,7 +729,7 @@ SORT_MEMBER_DOCS = YES
SORT_BRIEF_DOCS = NO
-# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then Doxygen will sort the
# (brief and detailed) documentation of class members so that constructors and
# destructors are listed first. If set to NO the constructors will appear in the
# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
@@ -583,7 +741,7 @@ SORT_BRIEF_DOCS = NO
SORT_MEMBERS_CTORS_1ST = NO
-# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# If the SORT_GROUP_NAMES tag is set to YES then Doxygen will sort the hierarchy
# of group names into alphabetical order. If set to NO the group names will
# appear in their defined order.
# The default value is: NO.
@@ -600,11 +758,11 @@ SORT_GROUP_NAMES = NO
SORT_BY_SCOPE_NAME = NO
-# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# If the STRICT_PROTO_MATCHING option is enabled and Doxygen fails to do proper
# type resolution of all parameters of a function it will reject a match between
# the prototype and the implementation of a member function even if there is
# only one candidate or it is obvious which candidate to choose by doing a
-# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# simple string match. By disabling STRICT_PROTO_MATCHING Doxygen will still
# accept a match between prototype and implementation in such cases.
# The default value is: NO.
@@ -635,6 +793,27 @@ GENERATE_BUGLIST = YES
GENERATE_DEPRECATEDLIST= YES
+# The GENERATE_REQUIREMENTS tag can be used to enable (YES) or disable (NO) the
+# requirements page. When enabled, this page is automatically created when at
+# least one comment block with a \requirement command appears in the input.
+# The default value is: YES.
+
+GENERATE_REQUIREMENTS = YES
+
+# The REQ_TRACEABILITY_INFO tag controls if traceability information is shown on
+# the requirements page (only relevant when using \requirement comment blocks).
+# The setting NO will disable the traceablility information altogether. The
+# setting UNSATISFIED_ONLY will show a list of requirements that are missing a
+# satisfies relation (through the command: \satisfies). Similarly the setting
+# UNVERIFIED_ONLY will show a list of requirements that are missing a verifies
+# relation (through the command: \verifies). Setting the tag to YES (the
+# default) will show both lists if applicable.
+# Possible values are: YES, NO, UNSATISFIED_ONLY and UNVERIFIED_ONLY.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_REQUIREMENTS is set to YES.
+
+REQ_TRACEABILITY_INFO = YES
+
# The ENABLED_SECTIONS tag can be used to enable conditional documentation
# sections, marked by \if
... \endif and \cond
# ... \endcond blocks.
@@ -674,24 +853,25 @@ SHOW_FILES = YES
SHOW_NAMESPACES = YES
# The FILE_VERSION_FILTER tag can be used to specify a program or script that
-# doxygen should invoke to get the current version for each file (typically from
+# Doxygen should invoke to get the current version for each file (typically from
# the version control system). Doxygen will invoke the program by executing (via
# popen()) the command command input-file, where command is the value of the
# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
-# by doxygen. Whatever the program writes to standard output is used as the file
+# by Doxygen. Whatever the program writes to standard output is used as the file
# version. For an example see the documentation.
FILE_VERSION_FILTER =
# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
-# by doxygen. The layout file controls the global structure of the generated
+# by Doxygen. The layout file controls the global structure of the generated
# output files in an output format independent way. To create the layout file
-# that represents doxygen's defaults, run doxygen with the -l option. You can
+# that represents Doxygen's defaults, run Doxygen with the -l option. You can
# optionally specify a file name after the option, if omitted DoxygenLayout.xml
-# will be used as the name of the layout file.
+# will be used as the name of the layout file. See also section "Changing the
+# layout of pages" for information.
#
-# Note that if you run doxygen from a directory containing a file called
-# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# Note that if you run Doxygen from a directory containing a file called
+# DoxygenLayout.xml, Doxygen will parse it automatically even if the LAYOUT_FILE
# tag is left empty.
LAYOUT_FILE = DoxygenLayout.xml
@@ -699,26 +879,42 @@ LAYOUT_FILE = DoxygenLayout.xml
# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
# the reference definitions. This must be a list of .bib files. The .bib
# extension is automatically appended if omitted. This requires the bibtex tool
-# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info.
# For LaTeX the style of the bibliography can be controlled using
# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
# search path. See also \cite for info how to create references.
CITE_BIB_FILES =
+# The EXTERNAL_TOOL_PATH tag can be used to extend the search path (PATH
+# environment variable) so that external tools such as latex and gs can be
+# found.
+# Note: Directories specified with EXTERNAL_TOOL_PATH are added in front of the
+# path already specified by the PATH variable, and are added in the order
+# specified.
+# Note: This option is particularly useful for macOS version 14 (Sonoma) and
+# higher, when running Doxygen from Doxywizard, because in this case any user-
+# defined changes to the PATH are ignored. A typical example on macOS is to set
+# EXTERNAL_TOOL_PATH = /Library/TeX/texbin /usr/local/bin
+# together with the standard path, the full search path used by doxygen when
+# launching external tools will then become
+# PATH=/Library/TeX/texbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
+
+EXTERNAL_TOOL_PATH =
+
#---------------------------------------------------------------------------
# Configuration options related to warning and progress messages
#---------------------------------------------------------------------------
# The QUIET tag can be used to turn on/off the messages that are generated to
-# standard output by doxygen. If QUIET is set to YES this implies that the
+# standard output by Doxygen. If QUIET is set to YES this implies that the
# messages are off.
# The default value is: NO.
QUIET = YES
# The WARNINGS tag can be used to turn on/off the warning messages that are
-# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# generated to standard error (stderr) by Doxygen. If WARNINGS is set to YES
# this implies that the warnings are on.
#
# Tip: Turn warnings on while writing the documentation.
@@ -726,48 +922,97 @@ QUIET = YES
WARNINGS = NO
-# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then Doxygen will generate
# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
# will automatically be disabled.
# The default value is: YES.
WARN_IF_UNDOCUMENTED = YES
-# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
-# potential errors in the documentation, such as not documenting some parameters
-# in a documented function, or documenting parameters that don't exist or using
-# markup commands wrongly.
+# If the WARN_IF_DOC_ERROR tag is set to YES, Doxygen will generate warnings for
+# potential errors in the documentation, such as documenting some parameters in
+# a documented function twice, or documenting parameters that don't exist or
+# using markup commands wrongly.
# The default value is: YES.
WARN_IF_DOC_ERROR = YES
+# If WARN_IF_INCOMPLETE_DOC is set to YES, Doxygen will warn about incomplete
+# function parameter documentation. If set to NO, Doxygen will accept that some
+# parameters have no documentation without warning.
+# The default value is: YES.
+
+WARN_IF_INCOMPLETE_DOC = YES
+
# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
# are documented, but have no documentation for their parameters or return
-# value. If set to NO, doxygen will only warn about wrong or incomplete
-# parameter documentation, but not about the absence of documentation.
+# value. If set to NO, Doxygen will only warn about wrong parameter
+# documentation, but not about the absence of documentation. If EXTRACT_ALL is
+# set to YES then this flag will automatically be disabled. See also
+# WARN_IF_INCOMPLETE_DOC
# The default value is: NO.
WARN_NO_PARAMDOC = NO
-# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
-# a warning is encountered.
+# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, Doxygen will warn about
+# undocumented enumeration values. If set to NO, Doxygen will accept
+# undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: NO.
+
+WARN_IF_UNDOC_ENUM_VAL = NO
+
+# If WARN_LAYOUT_FILE option is set to YES, Doxygen will warn about issues found
+# while parsing the user defined layout file, such as missing or wrong elements.
+# See also LAYOUT_FILE for details. If set to NO, problems with the layout file
+# will be suppressed.
+# The default value is: YES.
+
+WARN_LAYOUT_FILE = YES
+
+# If the WARN_AS_ERROR tag is set to YES then Doxygen will immediately stop when
+# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS
+# then Doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but
+# at the end of the Doxygen process Doxygen will return with a non-zero status.
+# If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS_PRINT then Doxygen behaves
+# like FAIL_ON_WARNINGS but in case no WARN_LOGFILE is defined Doxygen will not
+# write the warning messages in between other messages but write them at the end
+# of a run, in case a WARN_LOGFILE is defined the warning messages will be
+# besides being in the defined file also be shown at the end of a run, unless
+# the WARN_LOGFILE is defined as - i.e. standard output (stdout) in that case
+# the behavior will remain as with the setting FAIL_ON_WARNINGS.
+# Possible values are: NO, YES, FAIL_ON_WARNINGS and FAIL_ON_WARNINGS_PRINT.
# The default value is: NO.
WARN_AS_ERROR = NO
-# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# The WARN_FORMAT tag determines the format of the warning messages that Doxygen
# can produce. The string should contain the $file, $line, and $text tags, which
# will be replaced by the file and line number from which the warning originated
# and the warning text. Optionally the format may contain $version, which will
# be replaced by the version of the file (if it could be obtained via
# FILE_VERSION_FILTER)
+# See also: WARN_LINE_FORMAT
# The default value is: $file:$line: $text.
WARN_FORMAT = "$file:$line: $text"
+# In the $text part of the WARN_FORMAT command it is possible that a reference
+# to a more specific place is given. To make it easier to jump to this place
+# (outside of Doxygen) the user can define a custom "cut" / "paste" string.
+# Example:
+# WARN_LINE_FORMAT = "'vi $file +$line'"
+# See also: WARN_FORMAT
+# The default value is: at line $line of file $file.
+
+WARN_LINE_FORMAT = "at line $line of file $file"
+
# The WARN_LOGFILE tag can be used to specify a file to which warning and error
# messages should be written. If left blank the output is written to standard
-# error (stderr).
+# error (stderr). In case the file specified cannot be opened for writing the
+# warning and error messages are written to standard error. When as file - is
+# specified the warning and error messages are written to standard output
+# (stdout).
WARN_LOGFILE =
@@ -782,30 +1027,45 @@ WARN_LOGFILE =
# Note: If this tag is empty the current directory is searched.
INPUT = ../../src/libraries \
- about.md \
+ overview.md
# This tag can be used to specify the character encoding of the source files
-# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# that Doxygen parses. Internally Doxygen uses the UTF-8 encoding. Doxygen uses
# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
-# documentation (see: http://www.gnu.org/software/libiconv) for the list of
-# possible encodings.
+# documentation (see:
+# https://www.gnu.org/software/libiconv/) for the list of possible encodings.
+# See also: INPUT_FILE_ENCODING
# The default value is: UTF-8.
INPUT_ENCODING = UTF-8
+# This tag can be used to specify the character encoding of the source files
+# that Doxygen parses. The INPUT_FILE_ENCODING tag can be used to specify
+# character encoding on a per file pattern basis. Doxygen will compare the file
+# name with each pattern and apply the encoding instead of the default
+# INPUT_ENCODING if there is a match. The character encodings are a list of the
+# form: pattern=encoding (like *.php=ISO-8859-1).
+# See also: INPUT_ENCODING for further information on supported encodings.
+
+INPUT_FILE_ENCODING =
+
# If the value of the INPUT tag contains directories, you can use the
# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
# *.h) to filter out the source-files in the directories.
#
# Note that for custom extensions or not directly supported extensions you also
# need to set EXTENSION_MAPPING for the extension otherwise the files are not
-# read by doxygen.
+# read by Doxygen.
+#
+# Note the list of default checked file patterns might differ from the list of
+# default file extension mappings.
#
-# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
-# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
-# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
-# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f, *.for, *.tcl,
-# *.vhd, *.vhdl, *.ucf, *.qsf, *.as and *.js.
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cxxm,
+# *.cpp, *.cppm, *.ccm, *.c++, *.c++m, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl,
+# *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php,
+# *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be
+# provided as Doxygen C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08,
+# *.f18, *.f, *.for, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice.
FILE_PATTERNS = *.c \
*.cc \
@@ -852,11 +1112,11 @@ RECURSIVE = YES
# excluded from the INPUT source files. This way you can easily exclude a
# subdirectory from a directory tree whose root is specified with the INPUT tag.
#
-# Note that relative paths are relative to the directory from which doxygen is
+# Note that relative paths are relative to the directory from which Doxygen is
# run.
-EXCLUDE += ../../libraries/fiff/c/fiff_types_mne-c.h \
- ../../libraries/mne/c/mne_types_mne-c.h
+EXCLUDE = ../../libraries/fiff/c/fiff_types_mne-c.h \
+ ../../libraries/mne/c/mne_types_mne-c.h
# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
# directories that are symbolic links (a Unix file system feature) are excluded
@@ -878,12 +1138,11 @@ EXCLUDE_PATTERNS =
# (namespaces, classes, functions, etc.) that should be excluded from the
# output. The symbol name can be a fully qualified name, a word, or if the
# wildcard * is used, a substring. Examples: ANamespace, AClass,
-# AClass::ANamespace, ANamespace::*Test
-#
-# Note that the wildcards are matched against the file with absolute path, so to
-# exclude all test directories use the pattern */test/*
+# ANamespace::AClass, ANamespace::*Test
-EXCLUDE_SYMBOLS =
+EXCLUDE_SYMBOLS = std \
+ std::* \
+ Ui
# The EXAMPLE_PATH tag can be used to specify one or more files or directories
# that contain example code fragments that are included (see the \include
@@ -911,7 +1170,7 @@ EXAMPLE_RECURSIVE = NO
IMAGE_PATH =
-# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# The INPUT_FILTER tag can be used to specify a program that Doxygen should
# invoke to filter for each input file. Doxygen will invoke the filter program
# by executing (via popen()) the command:
#
@@ -926,9 +1185,14 @@ IMAGE_PATH =
# code is scanned, but not when the output code is generated. If lines are added
# or removed, the anchors will not be placed correctly.
#
+# Note that Doxygen will use the data processed and written to standard output
+# for further processing, therefore nothing else, like debug statements or used
+# commands (so in case of a Windows batch file always use @echo OFF), should be
+# written to standard output.
+#
# Note that for custom extensions or not directly supported extensions you also
# need to set EXTENSION_MAPPING for the extension otherwise the files are not
-# properly processed by doxygen.
+# properly processed by Doxygen.
INPUT_FILTER =
@@ -941,7 +1205,7 @@ INPUT_FILTER =
#
# Note that for custom extensions or not directly supported extensions you also
# need to set EXTENSION_MAPPING for the extension otherwise the files are not
-# properly processed by doxygen.
+# properly processed by Doxygen.
FILTER_PATTERNS =
@@ -963,10 +1227,28 @@ FILTER_SOURCE_PATTERNS =
# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
# is part of the input, its contents will be placed on the main page
# (index.html). This can be useful if you have a project on for instance GitHub
-# and want to reuse the introduction page also for the doxygen output.
+# and want to reuse the introduction page also for the Doxygen output.
USE_MDFILE_AS_MAINPAGE =
+# If the IMPLICIT_DIR_DOCS tag is set to YES, any README.md file found in sub-
+# directories of the project's root, is used as the documentation for that sub-
+# directory, except when the README.md starts with a \dir, \page or \mainpage
+# command. If set to NO, the README.md file needs to start with an explicit \dir
+# command in order to be used as directory documentation.
+# The default value is: YES.
+
+IMPLICIT_DIR_DOCS = YES
+
+# The Fortran standard specifies that for fixed formatted Fortran code all
+# characters from position 72 are to be considered as comment. A common
+# extension is to allow longer lines before the automatic comment starts. The
+# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can
+# be processed before the automatic comment starts.
+# Minimum value: 7, maximum value: 10000, default value: 72.
+
+FORTRAN_COMMENT_AFTER = 72
+
#---------------------------------------------------------------------------
# Configuration options related to source browsing
#---------------------------------------------------------------------------
@@ -981,12 +1263,13 @@ USE_MDFILE_AS_MAINPAGE =
SOURCE_BROWSER = YES
# Setting the INLINE_SOURCES tag to YES will include the body of functions,
-# classes and enums directly into the documentation.
+# multi-line macros, enums or list initialized variables directly into the
+# documentation.
# The default value is: NO.
INLINE_SOURCES = NO
-# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct Doxygen to hide any
# special comment blocks from generated source code fragments. Normal C, C++ and
# Fortran comments will always remain visible.
# The default value is: YES.
@@ -994,7 +1277,7 @@ INLINE_SOURCES = NO
STRIP_CODE_COMMENTS = YES
# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
-# function all documented functions referencing it will be listed.
+# entity all documented functions referencing it will be listed.
# The default value is: NO.
REFERENCED_BY_RELATION = NO
@@ -1024,28 +1307,28 @@ REFERENCES_LINK_SOURCE = YES
SOURCE_TOOLTIPS = YES
# If the USE_HTAGS tag is set to YES then the references to source code will
-# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# point to the HTML generated by the htags(1) tool instead of Doxygen built-in
# source browser. The htags tool is part of GNU's global source tagging system
-# (see http://www.gnu.org/software/global/global.html). You will need version
+# (see https://www.gnu.org/software/global/global.html). You will need version
# 4.8.6 or higher.
#
# To use it do the following:
# - Install the latest version of global
-# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file
# - Make sure the INPUT points to the root of the source tree
# - Run doxygen as normal
#
# Doxygen will invoke htags (and that will in turn invoke gtags), so these
# tools must be available from the command line (i.e. in the search path).
#
-# The result: instead of the source browser generated by doxygen, the links to
+# The result: instead of the source browser generated by Doxygen, the links to
# source code will now point to the output of htags.
# The default value is: NO.
# This tag requires that the tag SOURCE_BROWSER is set to YES.
USE_HTAGS = NO
-# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# If the VERBATIM_HEADERS tag is set the YES then Doxygen will generate a
# verbatim copy of the header file for each class for which an include is
# specified. Set to NO to disable this.
# See also: Section \class.
@@ -1053,25 +1336,6 @@ USE_HTAGS = NO
VERBATIM_HEADERS = YES
-# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
-# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
-# cost of reduced performance. This can be particularly helpful with template
-# rich C++ code for which doxygen's built-in parser lacks the necessary type
-# information.
-# Note: The availability of this option depends on whether or not doxygen was
-# generated with the -Duse-libclang=ON option for CMake.
-# The default value is: NO.
-
-CLANG_ASSISTED_PARSING = NO
-
-# If clang assisted parsing is enabled you can provide the compiler with command
-# line options that you would normally use when invoking the compiler. Note that
-# the include paths will already be set by doxygen for the files and directories
-# specified with INPUT and INCLUDE_PATH.
-# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
-
-CLANG_OPTIONS =
-
#---------------------------------------------------------------------------
# Configuration options related to the alphabetical class index
#---------------------------------------------------------------------------
@@ -1083,17 +1347,11 @@ CLANG_OPTIONS =
ALPHABETICAL_INDEX = YES
-# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
-# which the alphabetical index list will be split.
-# Minimum value: 1, maximum value: 20, default value: 5.
-# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
-
-COLS_IN_ALPHA_INDEX = 5
-
-# In case all classes in a project start with a common prefix, all classes will
-# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
-# can be used to specify a prefix (or a list of prefixes) that should be ignored
-# while generating the index headers.
+# The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes)
+# that should be ignored while generating the index headers. The IGNORE_PREFIX
+# tag works for classes, function and member names. The entity will be placed in
+# the alphabetical list under the first letter of the entity name that remains
+# after removing the prefix.
# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
IGNORE_PREFIX =
@@ -1102,7 +1360,7 @@ IGNORE_PREFIX =
# Configuration options related to the HTML output
#---------------------------------------------------------------------------
-# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# If the GENERATE_HTML tag is set to YES, Doxygen will generate HTML output
# The default value is: YES.
GENERATE_HTML = YES
@@ -1123,40 +1381,40 @@ HTML_OUTPUT = html
HTML_FILE_EXTENSION = .html
# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
-# each generated HTML page. If the tag is left blank doxygen will generate a
+# each generated HTML page. If the tag is left blank Doxygen will generate a
# standard header.
#
# To get valid HTML the header file that includes any scripts and style sheets
-# that doxygen needs, which is dependent on the configuration options used (e.g.
+# that Doxygen needs, which is dependent on the configuration options used (e.g.
# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
# default header using
# doxygen -w html new_header.html new_footer.html new_stylesheet.css
# YourConfigFile
# and then modify the file new_header.html. See also section "Doxygen usage"
-# for information on how to generate the default header that doxygen normally
+# for information on how to generate the default header that Doxygen normally
# uses.
# Note: The header is subject to change so you typically have to regenerate the
-# default header when upgrading to a newer version of doxygen. For a description
+# default header when upgrading to a newer version of Doxygen. For a description
# of the possible markers and block names see the documentation.
# This tag requires that the tag GENERATE_HTML is set to YES.
-HTML_HEADER =
+HTML_HEADER = header.html
# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
-# generated HTML page. If the tag is left blank doxygen will generate a standard
+# generated HTML page. If the tag is left blank Doxygen will generate a standard
# footer. See HTML_HEADER for more information on how to generate a default
# footer and what special commands can be used inside the footer. See also
# section "Doxygen usage" for information on how to generate the default footer
-# that doxygen normally uses.
+# that Doxygen normally uses.
# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_FOOTER =
# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
# sheet that is used by each HTML page. It can be used to fine-tune the look of
-# the HTML output. If left blank doxygen will generate a default style sheet.
+# the HTML output. If left blank Doxygen will generate a default style sheet.
# See also section "Doxygen usage" for information on how to generate the style
-# sheet that doxygen normally uses.
+# sheet that Doxygen normally uses.
# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
# it is more robust and this tag (HTML_STYLESHEET) will in the future become
# obsolete.
@@ -1166,16 +1424,22 @@ HTML_STYLESHEET =
# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
# cascading style sheets that are included after the standard style sheets
-# created by doxygen. Using this option one can overrule certain style aspects.
+# created by Doxygen. Using this option one can overrule certain style aspects.
# This is preferred over using HTML_STYLESHEET since it does not replace the
# standard style sheet and is therefore more robust against future updates.
# Doxygen will copy the style sheet files to the output directory.
# Note: The order of the extra style sheet files is of importance (e.g. the last
# style sheet in the list overrules the setting of the previous ones in the
-# list). For an example see the documentation.
+# list).
+# Note: Since the styling of scrollbars can currently not be overruled in
+# Webkit/Chromium, the styling will be left out of the default doxygen.css if
+# one or more extra stylesheets have been specified. So if scrollbar
+# customization is desired it has to be added explicitly. For an example see the
+# documentation.
# This tag requires that the tag GENERATE_HTML is set to YES.
-HTML_EXTRA_STYLESHEET =
+HTML_EXTRA_STYLESHEET = doxygen-awesome/doxygen-awesome.css \
+ doxygen-custom.css
# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
# other source files which should be copied to the HTML output directory. Note
@@ -1185,12 +1449,30 @@ HTML_EXTRA_STYLESHEET =
# files will be copied as-is; there are no commands or markers available.
# This tag requires that the tag GENERATE_HTML is set to YES.
-HTML_EXTRA_FILES =
+HTML_EXTRA_FILES = doxygen-awesome/doxygen-awesome-darkmode-toggle.js \
+ doxygen-awesome/doxygen-awesome-fragment-copy-button.js \
+ doxygen-awesome/doxygen-awesome-paragraph-link.js \
+ doxygen-awesome/doxygen-awesome-interactive-toc.js \
+ doxygen-awesome/doxygen-awesome-tabs.js \
+ MNE-CPP_Logo_Dark.svg
+
+# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output
+# should be rendered with a dark or light theme.
+# Possible values are: LIGHT always generates light mode output, DARK always
+# generates dark mode output, AUTO_LIGHT automatically sets the mode according
+# to the user preference, uses light mode if no preference is set (the default),
+# AUTO_DARK automatically sets the mode according to the user preference, uses
+# dark mode if no preference is set and TOGGLE allows a user to switch between
+# light and dark mode via a button.
+# The default value is: AUTO_LIGHT.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE = LIGHT
# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
# will adjust the colors in the style sheet and background images according to
-# this color. Hue is specified as an angle on a colorwheel, see
-# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# this color. Hue is specified as an angle on a color-wheel, see
+# https://en.wikipedia.org/wiki/Hue for more information. For instance the value
# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
# purple, and 360 is red again.
# Minimum value: 0, maximum value: 359, default value: 220.
@@ -1199,7 +1481,7 @@ HTML_EXTRA_FILES =
HTML_COLORSTYLE_HUE = 220
# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
-# in the HTML output. For a value of 0 the output will use grayscales only. A
+# in the HTML output. For a value of 0 the output will use gray-scales only. A
# value of 255 will produce the most vivid colors.
# Minimum value: 0, maximum value: 255, default value: 100.
# This tag requires that the tag GENERATE_HTML is set to YES.
@@ -1217,14 +1499,16 @@ HTML_COLORSTYLE_SAT = 100
HTML_COLORSTYLE_GAMMA = 80
-# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
-# page will contain the date and time when the page was generated. Setting this
-# to YES can help to show when doxygen was last run and thus if the
-# documentation is up to date.
-# The default value is: NO.
+# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
+# documentation will contain a main index with vertical navigation menus that
+# are dynamically created via JavaScript. If disabled, the navigation index will
+# consists of multiple levels of tabs that are statically embedded in every HTML
+# page. Disable this option to support browsers that do not have JavaScript,
+# like the Qt help browser.
+# The default value is: YES.
# This tag requires that the tag GENERATE_HTML is set to YES.
-HTML_TIMESTAMP = YES
+HTML_DYNAMIC_MENUS = YES
# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
# documentation will contain sections that can be hidden and shown after the
@@ -1234,6 +1518,33 @@ HTML_TIMESTAMP = YES
HTML_DYNAMIC_SECTIONS = NO
+# If the HTML_CODE_FOLDING tag is set to YES then classes and functions can be
+# dynamically folded and expanded in the generated HTML source code.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_CODE_FOLDING = YES
+
+# If the HTML_COPY_CLIPBOARD tag is set to YES then Doxygen will show an icon in
+# the top right corner of code and text fragments that allows the user to copy
+# its content to the clipboard. Note this only works if supported by the browser
+# and the web page is served via a secure context (see:
+# https://www.w3.org/TR/secure-contexts/), i.e. using the https: or file:
+# protocol.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COPY_CLIPBOARD = YES
+
+# Doxygen stores a couple of settings persistently in the browser (via e.g.
+# cookies). By default these settings apply to all HTML pages generated by
+# Doxygen across all projects. The HTML_PROJECT_COOKIE tag can be used to store
+# the settings under a project specific key, such that the user preferences will
+# be stored separately.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_PROJECT_COOKIE =
+
# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
# shown in the various tree structured indices initially; the user can expand
# and collapse entries dynamically later on. Doxygen will expand the tree to
@@ -1249,13 +1560,14 @@ HTML_INDEX_NUM_ENTRIES = 100
# If the GENERATE_DOCSET tag is set to YES, additional index files will be
# generated that can be used as input for Apple's Xcode 3 integrated development
-# environment (see: http://developer.apple.com/tools/xcode/), introduced with
-# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
-# Makefile in the HTML output directory. Running make will produce the docset in
-# that directory and running make install will install the docset in
+# environment (see:
+# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To
+# create a documentation set, Doxygen will generate a Makefile in the HTML
+# output directory. Running make will produce the docset in that directory and
+# running make install will install the docset in
# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
-# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
-# for more information.
+# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy
+# genXcode/_index.html for more information.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.
@@ -1269,6 +1581,13 @@ GENERATE_DOCSET = NO
DOCSET_FEEDNAME = "Doxygen generated docs"
+# This tag determines the URL of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDURL =
+
# This tag specifies a string that should uniquely identify the documentation
# set bundle. This should be a reverse domain-name style string, e.g.
# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
@@ -1291,14 +1610,18 @@ DOCSET_PUBLISHER_ID = org.doxygen.Publisher
DOCSET_PUBLISHER_NAME = Publisher
-# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# If the GENERATE_HTMLHELP tag is set to YES then Doxygen generates three
# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
-# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
-# Windows.
+# on Windows. In the beginning of 2021 Microsoft took the original page, with
+# a.o. the download links, offline (the HTML help workshop was already many
+# years in maintenance mode). You can download the HTML help workshop from the
+# web archives at Installation executable (see:
+# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo
+# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe).
#
# The HTML Help Workshop contains a compiler that can convert all HTML output
-# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# generated by Doxygen into a single compiled HTML file (.chm). Compiled HTML
# files are now used as the Windows 98 help format, and will replace the old
# Windows help format (.hlp) on all Windows platforms in the future. Compressed
# HTML files also contain an index, a table of contents, and you can search for
@@ -1318,14 +1641,14 @@ CHM_FILE =
# The HHC_LOCATION tag can be used to specify the location (absolute path
# including file name) of the HTML help compiler (hhc.exe). If non-empty,
-# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# Doxygen will try to run the HTML help compiler on the generated index.hhp.
# The file has to be specified with full path.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
HHC_LOCATION =
# The GENERATE_CHI flag controls if a separate .chi index file is generated
-# (YES) or that it should be included in the master .chm file (NO).
+# (YES) or that it should be included in the main .chm file (NO).
# The default value is: NO.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
@@ -1352,6 +1675,16 @@ BINARY_TOC = NO
TOC_EXPAND = NO
+# The SITEMAP_URL tag is used to specify the full URL of the place where the
+# generated documentation will be placed on the server by the user during the
+# deployment of the documentation. The generated sitemap is called sitemap.xml
+# and placed on the directory specified by HTML_OUTPUT. In case no SITEMAP_URL
+# is specified no sitemap is generated. For information about the sitemap
+# protocol see https://www.sitemaps.org
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SITEMAP_URL =
+
# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
@@ -1370,7 +1703,8 @@ QCH_FILE = ../qt-creator_doc/mne-cpp.qch
# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
# Project output. For more information please see Qt Help Project / Namespace
-# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace).
# The default value is: org.doxygen.Project.
# This tag requires that the tag GENERATE_QHP is set to YES.
@@ -1378,8 +1712,8 @@ QHP_NAMESPACE = org.martinos.mne-cpp.01
# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
# Help Project output. For more information please see Qt Help Project / Virtual
-# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
-# folders).
+# Folders (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders).
# The default value is: doc.
# This tag requires that the tag GENERATE_QHP is set to YES.
@@ -1387,30 +1721,30 @@ QHP_VIRTUAL_FOLDER = mne-cpp
# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
# filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
-# filters).
+# Filters (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
# This tag requires that the tag GENERATE_QHP is set to YES.
QHP_CUST_FILTER_NAME =
# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
# custom filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
-# filters).
+# Filters (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
# This tag requires that the tag GENERATE_QHP is set to YES.
QHP_CUST_FILTER_ATTRS =
# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
# project's filter section matches. Qt Help Project / Filter Attributes (see:
-# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes).
# This tag requires that the tag GENERATE_QHP is set to YES.
QHP_SECT_FILTER_ATTRS =
-# The QHG_LOCATION tag can be used to specify the location of Qt's
-# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
-# generated .qhp file.
+# The QHG_LOCATION tag can be used to specify the location (absolute path
+# including file name) of Qt's qhelpgenerator. If non-empty Doxygen will try to
+# run qhelpgenerator on the generated .qhp file.
# This tag requires that the tag GENERATE_QHP is set to YES.
QHG_LOCATION = /usr/lib/x86_64-linux-gnu/qt5/bin/qhelpgenerator
@@ -1453,18 +1787,39 @@ DISABLE_INDEX = NO
# to work a browser that supports JavaScript, DHTML, CSS and frames is required
# (i.e. any modern browser). Windows users are probably better off using the
# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
-# further fine-tune the look of the index. As an example, the default style
-# sheet generated by doxygen has an example that shows how to put an image at
-# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
-# the same information as the tab index, you could consider setting
-# DISABLE_INDEX to YES when enabling this option.
-# The default value is: NO.
+# further fine tune the look of the index (see "Fine-tuning the output"). As an
+# example, the default style sheet generated by Doxygen has an example that
+# shows how to put an image at the root of the tree instead of the PROJECT_NAME.
+# Since the tree basically has more details information than the tab index, you
+# could consider setting DISABLE_INDEX to YES when enabling this option.
+# The default value is: YES.
# This tag requires that the tag GENERATE_HTML is set to YES.
GENERATE_TREEVIEW = NO
+# When GENERATE_TREEVIEW is set to YES, the PAGE_OUTLINE_PANEL option determines
+# if an additional navigation panel is shown at the right hand side of the
+# screen, displaying an outline of the contents of the main page, similar to
+# e.g. https://developer.android.com/reference If GENERATE_TREEVIEW is set to
+# NO, this option has no effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+PAGE_OUTLINE_PANEL = YES
+
+# When GENERATE_TREEVIEW is set to YES, the FULL_SIDEBAR option determines if
+# the side bar is limited to only the treeview area (value NO) or if it should
+# extend to the full height of the window (value YES). Setting this to YES gives
+# a layout similar to e.g. https://docs.readthedocs.io with more room for
+# contents, but less room for the project logo, title, and description. If
+# GENERATE_TREEVIEW is set to NO, this option has no effect.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FULL_SIDEBAR = NO
+
# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
-# doxygen will group on one line in the generated HTML documentation.
+# Doxygen will group on one line in the generated HTML documentation.
#
# Note that a value of 0 will completely suppress the enum values from appearing
# in the overview section.
@@ -1473,42 +1828,61 @@ GENERATE_TREEVIEW = NO
ENUM_VALUES_PER_LINE = 4
+# When the SHOW_ENUM_VALUES tag is set doxygen will show the specified
+# enumeration values besides the enumeration mnemonics.
+# The default value is: NO.
+
+SHOW_ENUM_VALUES = NO
+
# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
# to set the initial width (in pixels) of the frame in which the tree is shown.
# Minimum value: 0, maximum value: 1500, default value: 250.
# This tag requires that the tag GENERATE_HTML is set to YES.
-TREEVIEW_WIDTH = 250
+TREEVIEW_WIDTH = 335
-# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# If the EXT_LINKS_IN_WINDOW option is set to YES, Doxygen will open links to
# external symbols imported via tag files in a separate window.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.
EXT_LINKS_IN_WINDOW = NO
+# If the OBFUSCATE_EMAILS tag is set to YES, Doxygen will obfuscate email
+# addresses.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+OBFUSCATE_EMAILS = YES
+
+# If the HTML_FORMULA_FORMAT option is set to svg, Doxygen will use the pdf2svg
+# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see
+# https://inkscape.org) to generate formulas as SVG images instead of PNGs for
+# the HTML output. These images will generally look nicer at scaled resolutions.
+# Possible values are: png (the default) and svg (looks nicer but requires the
+# pdf2svg or inkscape tool).
+# The default value is: png.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FORMULA_FORMAT = png
+
# Use this tag to change the font size of LaTeX formulas included as images in
# the HTML documentation. When you change the font size after a successful
-# doxygen run you need to manually remove any form_*.png images from the HTML
+# Doxygen run you need to manually remove any form_*.png images from the HTML
# output directory to force them to be regenerated.
# Minimum value: 8, maximum value: 50, default value: 10.
# This tag requires that the tag GENERATE_HTML is set to YES.
FORMULA_FONTSIZE = 10
-# Use the FORMULA_TRANPARENT tag to determine whether or not the images
-# generated for formulas are transparent PNGs. Transparent PNGs are not
-# supported properly for IE 6.0, but are supported on all modern browsers.
-#
-# Note that when changing this option you need to delete any form_*.png files in
-# the HTML output directory before the changes have effect.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_HTML is set to YES.
+# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands
+# to create new LaTeX commands to be used in formulas as building blocks. See
+# the section "Including formulas" for details.
-FORMULA_TRANSPARENT = YES
+FORMULA_MACROFILE =
# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
-# http://www.mathjax.org) which uses client side Javascript for the rendering
+# https://www.mathjax.org) which uses client side JavaScript for the rendering
# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
# installed or if you want to formulas look prettier in the HTML output. When
# enabled you may also need to install MathJax separately and configure the path
@@ -1518,50 +1892,90 @@ FORMULA_TRANSPARENT = YES
USE_MATHJAX = NO
+# With MATHJAX_VERSION it is possible to specify the MathJax version to be used.
+# Note that the different versions of MathJax have different requirements with
+# regards to the different settings, so it is possible that also other MathJax
+# settings have to be changed when switching between the different MathJax
+# versions.
+# Possible values are: MathJax_2, MathJax_3 and MathJax_4.
+# The default value is: MathJax_2.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_VERSION = MathJax_2
+
# When MathJax is enabled you can set the default output format to be used for
-# the MathJax output. See the MathJax site (see:
-# http://docs.mathjax.org/en/latest/output.html) for more details.
+# the MathJax output. For more details about the output format see MathJax
+# version 2 (see:
+# https://docs.mathjax.org/en/v2.7/output.html), MathJax version 3 (see:
+# https://docs.mathjax.org/en/v3.2/output/index.html) and MathJax version 4
+# (see:
+# https://docs.mathjax.org/en/v4.0/output/index.htm).
# Possible values are: HTML-CSS (which is slower, but has the best
-# compatibility), NativeMML (i.e. MathML) and SVG.
+# compatibility. This is the name for Mathjax version 2, for MathJax version 3
+# this will be translated into chtml), NativeMML (i.e. MathML. Only supported
+# for MathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This
+# is the name for Mathjax version 3, for MathJax version 2 this will be
+# translated into HTML-CSS) and SVG.
# The default value is: HTML-CSS.
# This tag requires that the tag USE_MATHJAX is set to YES.
MATHJAX_FORMAT = HTML-CSS
# When MathJax is enabled you need to specify the location relative to the HTML
-# output directory using the MATHJAX_RELPATH option. The destination directory
-# should contain the MathJax.js script. For instance, if the mathjax directory
-# is located at the same level as the HTML output directory, then
-# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
-# Content Delivery Network so you can quickly see the result without installing
-# MathJax. However, it is strongly recommended to install a local copy of
-# MathJax from http://www.mathjax.org before deployment.
-# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# output directory using the MATHJAX_RELPATH option. For Mathjax version 2 the
+# destination directory should contain the MathJax.js script. For instance, if
+# the mathjax directory is located at the same level as the HTML output
+# directory, then MATHJAX_RELPATH should be ../mathjax.s For Mathjax versions 3
+# and 4 the destination directory should contain the tex-.js script
+# (where is either chtml or svg). The default value points to the
+# MathJax Content Delivery Network so you can quickly see the result without
+# installing MathJax. However, it is strongly recommended to install a local
+# copy of MathJax from https://www.mathjax.org before deployment. The default
+# value is:
+# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2
+# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3
+# - in case of MathJax version 4: https://cdn.jsdelivr.net/npm/mathjax@4
# This tag requires that the tag USE_MATHJAX is set to YES.
MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
# extension names that should be enabled during MathJax rendering. For example
+# for MathJax version 2 (see https://docs.mathjax.org/en/v2.7/tex.html):
# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# For example for MathJax version 3 (see
+# https://docs.mathjax.org/en/v3.2/input/tex/extensions/):
+# MATHJAX_EXTENSIONS = ams
+# For example for MathJax version 4 (see
+# https://docs.mathjax.org/en/v4.0/input/tex/extensions/):
+# MATHJAX_EXTENSIONS = units
+# Note that for Mathjax version 4 quite a few extensions are already
+# automatically loaded. To disable a package in Mathjax version 4 one can use
+# the package name prepended with a minus sign (- like MATHJAX_EXTENSIONS +=
+# -textmacros)
# This tag requires that the tag USE_MATHJAX is set to YES.
MATHJAX_EXTENSIONS =
-# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
-# of code that will be used on startup of the MathJax code. See the MathJax site
-# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
-# example see the documentation.
+# The MATHJAX_CODEFILE tag can be used to specify a file with JavaScript pieces
+# of code that will be used on startup of the MathJax code. See the Mathjax site
+# for more details:
+# - MathJax version 2 (see:
+# https://docs.mathjax.org/en/v2.7/)
+# - MathJax version 3 (see:
+# https://docs.mathjax.org/en/v3.2/)
+# - MathJax version 4 (see:
+# https://docs.mathjax.org/en/v4.0/) For an example see the documentation.
# This tag requires that the tag USE_MATHJAX is set to YES.
MATHJAX_CODEFILE =
-# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
-# the HTML output. The underlying search engine uses javascript and DHTML and
+# When the SEARCHENGINE tag is enabled Doxygen will generate a search box for
+# the HTML output. The underlying search engine uses JavaScript and DHTML and
# should work on any modern browser. Note that when using HTML help
# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
# there is already a search function so this one should typically be disabled.
-# For large projects the javascript based search engine can be slow, then
+# For large projects the JavaScript based search engine can be slow, then
# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
# search using the keyboard; to jump to the search box use + S
# (what the is depends on the OS and browser, but it is typically
@@ -1578,9 +1992,9 @@ MATHJAX_CODEFILE =
SEARCHENGINE = YES
# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
-# implemented using a web server instead of a web client using Javascript. There
+# implemented using a web server instead of a web client using JavaScript. There
# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
-# setting. When disabled, doxygen will generate a PHP script for searching and
+# setting. When disabled, Doxygen will generate a PHP script for searching and
# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
# and searching needs to be provided by external tools. See the section
# "External Indexing and Searching" for details.
@@ -1589,7 +2003,7 @@ SEARCHENGINE = YES
SERVER_BASED_SEARCH = NO
-# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# When EXTERNAL_SEARCH tag is enabled Doxygen will no longer generate the PHP
# script for searching. Instead the search results are written to an XML file
# which needs to be processed by an external indexer. Doxygen will invoke an
# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
@@ -1597,7 +2011,8 @@ SERVER_BASED_SEARCH = NO
#
# Doxygen ships with an example indexer (doxyindexer) and search engine
# (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: http://xapian.org/).
+# Xapian (see:
+# https://xapian.org/).
#
# See the section "External Indexing and Searching" for details.
# The default value is: NO.
@@ -1610,8 +2025,9 @@ EXTERNAL_SEARCH = NO
#
# Doxygen ships with an example indexer (doxyindexer) and search engine
# (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: http://xapian.org/). See the section "External Indexing and
-# Searching" for details.
+# Xapian (see:
+# https://xapian.org/). See the section "External Indexing and Searching" for
+# details.
# This tag requires that the tag SEARCHENGINE is set to YES.
SEARCHENGINE_URL =
@@ -1632,7 +2048,7 @@ SEARCHDATA_FILE = searchdata.xml
EXTERNAL_SEARCH_ID =
-# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through Doxygen
# projects other than the one defined by this configuration file, but that are
# all added to the same external search index. Each project needs to have a
# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
@@ -1646,7 +2062,7 @@ EXTRA_SEARCH_MAPPINGS =
# Configuration options related to the LaTeX output
#---------------------------------------------------------------------------
-# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# If the GENERATE_LATEX tag is set to YES, Doxygen will generate LaTeX output.
# The default value is: YES.
GENERATE_LATEX = NO
@@ -1662,22 +2078,36 @@ LATEX_OUTPUT = latex
# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
# invoked.
#
-# Note that when enabling USE_PDFLATEX this option is only used for generating
-# bitmaps for formulas in the HTML output, but not in the Makefile that is
-# written to the output directory.
-# The default file is: latex.
+# Note that when not enabling USE_PDFLATEX the default is latex when enabling
+# USE_PDFLATEX the default is pdflatex and when in the later case latex is
+# chosen this is overwritten by pdflatex. For specific output languages the
+# default can have been set differently, this depends on the implementation of
+# the output language.
# This tag requires that the tag GENERATE_LATEX is set to YES.
LATEX_CMD_NAME = latex
# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
# index for LaTeX.
+# Note: This tag is used in the Makefile / make.bat.
+# See also: LATEX_MAKEINDEX_CMD for the part in the generated output file
+# (.tex).
# The default file is: makeindex.
# This tag requires that the tag GENERATE_LATEX is set to YES.
MAKEINDEX_CMD_NAME = makeindex
-# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
+# The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to
+# generate index for LaTeX. In case there is no backslash (\) as first character
+# it will be automatically added in the LaTeX code.
+# Note: This tag is used in the generated output file (.tex).
+# See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat.
+# The default value is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_MAKEINDEX_CMD = makeindex
+
+# If the COMPACT_LATEX tag is set to YES, Doxygen generates more compact LaTeX
# documents. This may be useful for small projects and may help to save some
# trees in general.
# The default value is: NO.
@@ -1706,36 +2136,38 @@ PAPER_TYPE = a4
EXTRA_PACKAGES =
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
-# generated LaTeX document. The header should contain everything until the first
-# chapter. If it is left blank doxygen will generate a standard header. See
-# section "Doxygen usage" for information on how to let doxygen write the
-# default header to a separate file.
+# The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for
+# the generated LaTeX document. The header should contain everything until the
+# first chapter. If it is left blank Doxygen will generate a standard header. It
+# is highly recommended to start with a default header using
+# doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty
+# and then modify the file new_header.tex. See also section "Doxygen usage" for
+# information on how to generate the default header that Doxygen normally uses.
#
-# Note: Only use a user-defined header if you know what you are doing! The
-# following commands have a special meaning inside the header: $title,
-# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
-# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
-# string, for the replacement values of the other commands the user is referred
-# to HTML_HEADER.
+# Note: Only use a user-defined header if you know what you are doing!
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of Doxygen. The following
+# commands have a special meaning inside the header (and footer): For a
+# description of the possible markers and block names see the documentation.
# This tag requires that the tag GENERATE_LATEX is set to YES.
LATEX_HEADER =
-# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
-# generated LaTeX document. The footer should contain everything after the last
-# chapter. If it is left blank doxygen will generate a standard footer. See
+# The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for
+# the generated LaTeX document. The footer should contain everything after the
+# last chapter. If it is left blank Doxygen will generate a standard footer. See
# LATEX_HEADER for more information on how to generate a default footer and what
-# special commands can be used inside the footer.
-#
-# Note: Only use a user-defined footer if you know what you are doing!
+# special commands can be used inside the footer. See also section "Doxygen
+# usage" for information on how to generate the default footer that Doxygen
+# normally uses. Note: Only use a user-defined footer if you know what you are
+# doing!
# This tag requires that the tag GENERATE_LATEX is set to YES.
LATEX_FOOTER =
# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
# LaTeX style sheets that are included after the standard style sheets created
-# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# by Doxygen. Using this option one can overrule certain style aspects. Doxygen
# will copy the style sheet files to the output directory.
# Note: The order of the extra style sheet files is of importance (e.g. the last
# style sheet in the list overrules the setting of the previous ones in the
@@ -1761,61 +2193,59 @@ LATEX_EXTRA_FILES =
PDF_HYPERLINKS = YES
-# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
-# the PDF file directly from the LaTeX files. Set this option to YES, to get a
-# higher quality PDF documentation.
+# If the USE_PDFLATEX tag is set to YES, Doxygen will use the engine as
+# specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX
+# files. Set this option to YES, to get a higher quality PDF documentation.
+#
+# See also section LATEX_CMD_NAME for selecting the engine.
# The default value is: YES.
# This tag requires that the tag GENERATE_LATEX is set to YES.
USE_PDFLATEX = YES
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
-# command to the generated LaTeX files. This will instruct LaTeX to keep running
-# if errors occur, instead of asking the user for help. This option is also used
-# when generating formulas in HTML.
+# The LATEX_BATCHMODE tag signals the behavior of LaTeX in case of an error.
+# Possible values are: NO same as ERROR_STOP, YES same as BATCH, BATCH In batch
+# mode nothing is printed on the terminal, errors are scrolled as if is
+# hit at every error; missing files that TeX tries to input or request from
+# keyboard input (\read on a not open input stream) cause the job to abort,
+# NON_STOP In nonstop mode the diagnostic message will appear on the terminal,
+# but there is no possibility of user interaction just like in batch mode,
+# SCROLL In scroll mode, TeX will stop only for missing files to input or if
+# keyboard input is necessary and ERROR_STOP In errorstop mode, TeX will stop at
+# each error, asking for user intervention.
# The default value is: NO.
# This tag requires that the tag GENERATE_LATEX is set to YES.
LATEX_BATCHMODE = NO
-# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# If the LATEX_HIDE_INDICES tag is set to YES then Doxygen will not include the
# index chapters (such as File Index, Compound Index, etc.) in the output.
# The default value is: NO.
# This tag requires that the tag GENERATE_LATEX is set to YES.
LATEX_HIDE_INDICES = NO
-# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
-# code with syntax highlighting in the LaTeX output.
-#
-# Note that which sources are shown also depends on other settings such as
-# SOURCE_BROWSER.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_SOURCE_CODE = NO
-
# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
# bibliography, e.g. plainnat, or ieeetr. See
-# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
-# The default value is: plain.
+# https://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plainnat.
# This tag requires that the tag GENERATE_LATEX is set to YES.
LATEX_BIB_STYLE = plain
-# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
-# page will contain the date and time when the page was generated. Setting this
-# to NO can help when comparing the output of multiple runs.
-# The default value is: NO.
+# The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute)
+# path from which the emoji images will be read. If a relative path is entered,
+# it will be relative to the LATEX_OUTPUT directory. If left blank the
+# LATEX_OUTPUT directory will be used.
# This tag requires that the tag GENERATE_LATEX is set to YES.
-LATEX_TIMESTAMP = NO
+LATEX_EMOJI_DIRECTORY =
#---------------------------------------------------------------------------
# Configuration options related to the RTF output
#---------------------------------------------------------------------------
-# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
+# If the GENERATE_RTF tag is set to YES, Doxygen will generate RTF output. The
# RTF output is optimized for Word 97 and may not look too pretty with other RTF
# readers/editors.
# The default value is: NO.
@@ -1830,7 +2260,7 @@ GENERATE_RTF = NO
RTF_OUTPUT = rtf
-# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
+# If the COMPACT_RTF tag is set to YES, Doxygen generates more compact RTF
# documents. This may be useful for small projects and may help to save some
# trees in general.
# The default value is: NO.
@@ -1850,38 +2280,36 @@ COMPACT_RTF = NO
RTF_HYPERLINKS = NO
-# Load stylesheet definitions from file. Syntax is similar to doxygen's config
-# file, i.e. a series of assignments. You only have to provide replacements,
-# missing definitions are set to their default value.
+# Load stylesheet definitions from file. Syntax is similar to Doxygen's
+# configuration file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
#
# See also section "Doxygen usage" for information on how to generate the
-# default style sheet that doxygen normally uses.
+# default style sheet that Doxygen normally uses.
# This tag requires that the tag GENERATE_RTF is set to YES.
RTF_STYLESHEET_FILE =
# Set optional variables used in the generation of an RTF document. Syntax is
-# similar to doxygen's config file. A template extensions file can be generated
-# using doxygen -e rtf extensionFile.
+# similar to Doxygen's configuration file. A template extensions file can be
+# generated using doxygen -e rtf extensionFile.
# This tag requires that the tag GENERATE_RTF is set to YES.
RTF_EXTENSIONS_FILE =
-# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
-# with syntax highlighting in the RTF output.
-#
-# Note that which sources are shown also depends on other settings such as
-# SOURCE_BROWSER.
-# The default value is: NO.
+# The RTF_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the RTF_OUTPUT output directory.
+# Note that the files will be copied as-is; there are no commands or markers
+# available.
# This tag requires that the tag GENERATE_RTF is set to YES.
-RTF_SOURCE_CODE = NO
+RTF_EXTRA_FILES =
#---------------------------------------------------------------------------
# Configuration options related to the man page output
#---------------------------------------------------------------------------
-# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# If the GENERATE_MAN tag is set to YES, Doxygen will generate man pages for
# classes and files.
# The default value is: NO.
@@ -1912,7 +2340,7 @@ MAN_EXTENSION = .3
MAN_SUBDIR =
-# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output, then it
# will generate one additional man file for each entity documented in the real
# man page(s). These additional files only source the real man page, but without
# them the man command would be unable to find the correct page.
@@ -1925,7 +2353,7 @@ MAN_LINKS = NO
# Configuration options related to the XML output
#---------------------------------------------------------------------------
-# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
+# If the GENERATE_XML tag is set to YES, Doxygen will generate an XML file that
# captures the structure of the code including all documentation.
# The default value is: NO.
@@ -1939,7 +2367,7 @@ GENERATE_XML = NO
XML_OUTPUT = xml
-# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# If the XML_PROGRAMLISTING tag is set to YES, Doxygen will dump the program
# listings (including syntax highlighting and cross-referencing information) to
# the XML output. Note that enabling this will significantly increase the size
# of the XML output.
@@ -1948,11 +2376,18 @@ XML_OUTPUT = xml
XML_PROGRAMLISTING = YES
+# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, Doxygen will include
+# namespace members in file scope as well, matching the HTML output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_NS_MEMB_FILE_SCOPE = NO
+
#---------------------------------------------------------------------------
# Configuration options related to the DOCBOOK output
#---------------------------------------------------------------------------
-# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
+# If the GENERATE_DOCBOOK tag is set to YES, Doxygen will generate Docbook files
# that can be used to generate PDF.
# The default value is: NO.
@@ -1966,32 +2401,49 @@ GENERATE_DOCBOOK = NO
DOCBOOK_OUTPUT = docbook
-# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
-# program listings (including syntax highlighting and cross-referencing
-# information) to the DOCBOOK output. Note that enabling this will significantly
-# increase the size of the DOCBOOK output.
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, Doxygen will generate an
+# AutoGen Definitions (see https://autogen.sourceforge.net/) file that captures
+# the structure of the code including all documentation. Note that this feature
+# is still experimental and incomplete at the moment.
# The default value is: NO.
-# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
-DOCBOOK_PROGRAMLISTING = NO
+GENERATE_AUTOGEN_DEF = NO
#---------------------------------------------------------------------------
-# Configuration options for the AutoGen Definitions output
+# Configuration options related to Sqlite3 output
#---------------------------------------------------------------------------
-# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
-# AutoGen Definitions (see http://autogen.sf.net) file that captures the
-# structure of the code including all documentation. Note that this feature is
-# still experimental and incomplete at the moment.
+# If the GENERATE_SQLITE3 tag is set to YES Doxygen will generate a Sqlite3
+# database with symbols found by Doxygen stored in tables.
# The default value is: NO.
-GENERATE_AUTOGEN_DEF = NO
+GENERATE_SQLITE3 = NO
+
+# The SQLITE3_OUTPUT tag is used to specify where the Sqlite3 database will be
+# put. If a relative path is entered the value of OUTPUT_DIRECTORY will be put
+# in front of it.
+# The default directory is: sqlite3.
+# This tag requires that the tag GENERATE_SQLITE3 is set to YES.
+
+SQLITE3_OUTPUT = sqlite3
+
+# The SQLITE3_RECREATE_DB tag is set to YES, the existing doxygen_sqlite3.db
+# database file will be recreated with each Doxygen run. If set to NO, Doxygen
+# will warn if a database file is already found and not modify it.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_SQLITE3 is set to YES.
+
+SQLITE3_RECREATE_DB = YES
#---------------------------------------------------------------------------
# Configuration options related to the Perl module output
#---------------------------------------------------------------------------
-# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# If the GENERATE_PERLMOD tag is set to YES, Doxygen will generate a Perl module
# file that captures the structure of the code including all documentation.
#
# Note that this feature is still experimental and incomplete at the moment.
@@ -1999,7 +2451,7 @@ GENERATE_AUTOGEN_DEF = NO
GENERATE_PERLMOD = NO
-# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# If the PERLMOD_LATEX tag is set to YES, Doxygen will generate the necessary
# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
# output from the Perl module output.
# The default value is: NO.
@@ -2029,20 +2481,20 @@ PERLMOD_MAKEVAR_PREFIX =
# Configuration options related to the preprocessor
#---------------------------------------------------------------------------
-# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# If the ENABLE_PREPROCESSING tag is set to YES, Doxygen will evaluate all
# C-preprocessor directives found in the sources and include files.
# The default value is: YES.
ENABLE_PREPROCESSING = YES
-# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# If the MACRO_EXPANSION tag is set to YES, Doxygen will expand all macro names
# in the source code. If set to NO, only conditional compilation will be
# performed. Macro expansion can be done in a controlled way by setting
# EXPAND_ONLY_PREDEF to YES.
# The default value is: NO.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-MACRO_EXPANSION = NO
+MACRO_EXPANSION = YES
# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
# the macro expansion is limited to the macros specified with the PREDEFINED and
@@ -2050,7 +2502,7 @@ MACRO_EXPANSION = NO
# The default value is: NO.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-EXPAND_ONLY_PREDEF = NO
+EXPAND_ONLY_PREDEF = YES
# If the SEARCH_INCLUDES tag is set to YES, the include files in the
# INCLUDE_PATH will be searched if a #include is found.
@@ -2061,7 +2513,8 @@ SEARCH_INCLUDES = YES
# The INCLUDE_PATH tag can be used to specify one or more directories that
# contain include files that are not input files but should be processed by the
-# preprocessor.
+# preprocessor. Note that the INCLUDE_PATH is not recursive, so the setting of
+# RECURSIVE has no effect here.
# This tag requires that the tag SEARCH_INCLUDES is set to YES.
INCLUDE_PATH =
@@ -2082,7 +2535,25 @@ INCLUDE_FILE_PATTERNS =
# recursively expanded use the := operator instead of the = operator.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-PREDEFINED =
+PREDEFINED = COMMUNICATIONSHARED_EXPORT= \
+ CONNECTIVITYSHARED_EXPORT= \
+ DISP3DRHISHARED_EXPORT= \
+ DISPSHARED_EXPORT= \
+ EVENTS_EXPORT= \
+ FIFFSHARED_EXPORT= \
+ FSSHARED_EXPORT= \
+ FWDSHARED_EXPORT= \
+ INVERSESHARED_EXPORT= \
+ LSLSHARED_EXPORT= \
+ MNESHARED_EXPORT= \
+ MRISHARED_EXPORT= \
+ RTPROCESINGSHARED_EXPORT= \
+ UTILSSHARED_EXPORT= \
+ Q_DECL_EXPORT= \
+ Q_DECL_IMPORT= \
+ Q_OBJECT= \
+ Q_NULLPTR=nullptr \
+ STATICBUILD
# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
# tag can be used to specify a list of macro names that should be expanded. The
@@ -2093,7 +2564,7 @@ PREDEFINED =
EXPAND_AS_DEFINED =
-# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# If the SKIP_FUNCTION_MACROS tag is set to YES then Doxygen's preprocessor will
# remove all references to function-like macros that are alone on a line, have
# an all uppercase name, and do not end with a semicolon. Such function macros
# are typically used for boiler-plate code, and will confuse the parser if not
@@ -2117,26 +2588,26 @@ SKIP_FUNCTION_MACROS = YES
# section "Linking to external documentation" for more information about the use
# of tag files.
# Note: Each tag file must have a unique name (where the name does NOT include
-# the path). If a tag file is not located in the directory in which doxygen is
+# the path). If a tag file is not located in the directory in which Doxygen is
# run, you must also specify the path to the tagfile here.
TAGFILES =
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# When a file name is specified after GENERATE_TAGFILE, Doxygen will create a
# tag file that is based on the input files it reads. See section "Linking to
# external documentation" for more information about the usage of tag files.
GENERATE_TAGFILE =
-# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
-# the class index. If set to NO, only the inherited external classes will be
-# listed.
+# If the ALLEXTERNALS tag is set to YES, all external classes and namespaces
+# will be listed in the class and namespace index. If set to NO, only the
+# inherited external classes will be listed.
# The default value is: NO.
ALLEXTERNALS = NO
# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
-# in the modules index. If set to NO, only the current project's groups will be
+# in the topic index. If set to NO, only the current project's groups will be
# listed.
# The default value is: YES.
@@ -2149,115 +2620,112 @@ EXTERNAL_GROUPS = YES
EXTERNAL_PAGES = YES
-# The PERL_PATH should be the absolute path and name of the perl script
-# interpreter (i.e. the result of 'which perl').
-# The default file (with absolute path) is: /usr/bin/perl.
-
-PERL_PATH = /usr/bin/perl
-
#---------------------------------------------------------------------------
-# Configuration options related to the dot tool
+# Configuration options related to diagram generator tools
#---------------------------------------------------------------------------
-# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
-# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
-# NO turns the diagrams off. Note that this option also works with HAVE_DOT
-# disabled, but it is recommended to install and use dot, since it yields more
-# powerful graphs.
-# The default value is: YES.
-
-CLASS_DIAGRAMS = NO
-
-# You can define message sequence charts within doxygen comments using the \msc
-# command. Doxygen will then run the mscgen tool (see:
-# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
-# documentation. The MSCGEN_PATH tag allows you to specify the directory where
-# the mscgen tool resides. If left empty the tool is assumed to be found in the
-# default search path.
-
-MSCGEN_PATH =
-
-# You can include diagrams made with dia in doxygen documentation. Doxygen will
-# then run dia to produce the diagram and insert it in the documentation. The
-# DIA_PATH tag allows you to specify the directory where the dia binary resides.
-# If left empty dia is assumed to be found in the default search path.
-
-DIA_PATH =
-
# If set to YES the inheritance and collaboration graphs will hide inheritance
# and usage relations if the target is undocumented or is not a class.
# The default value is: YES.
HIDE_UNDOC_RELATIONS = YES
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# If you set the HAVE_DOT tag to YES then Doxygen will assume the dot tool is
# available from the path. This tool is part of Graphviz (see:
-# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# https://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
# Bell Labs. The other options in this section have no effect if this option is
# set to NO
# The default value is: NO.
HAVE_DOT = YES
-# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
-# to run in parallel. When set to 0 doxygen will base this on the number of
+# The DOT_NUM_THREADS specifies the number of dot invocations Doxygen is allowed
+# to run in parallel. When set to 0 Doxygen will base this on the number of
# processors available in the system. You can set it explicitly to a value
# larger than 0 to get control over the balance between CPU load and processing
# speed.
-# Minimum value: 0, maximum value: 32, default value: 0.
+# Minimum value: 0, maximum value: 512, default value: 0.
# This tag requires that the tag HAVE_DOT is set to YES.
DOT_NUM_THREADS = 0
-# When you want a differently looking font in the dot files that doxygen
-# generates you can specify the font name using DOT_FONTNAME. You need to make
-# sure dot is able to find the font, which can be done by putting it in a
-# standard location or by setting the DOTFONTPATH environment variable or by
-# setting DOT_FONTPATH to the directory containing the font.
-# The default value is: Helvetica.
+# DOT_COMMON_ATTR is common attributes for nodes, edges and labels of
+# subgraphs. When you want a differently looking font in the dot files that
+# Doxygen generates you can specify fontname, fontcolor and fontsize attributes.
+# For details please see Node,
+# Edge and Graph Attributes specification You need to make sure dot is able
+# to find the font, which can be done by putting it in a standard location or by
+# setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the
+# directory containing the font. Default graphviz fontsize is 14.
+# The default value is: fontname=Helvetica,fontsize=10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10"
+
+# DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can
+# add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. Complete documentation about
+# arrows shapes.
+# The default value is: labelfontname=Helvetica,labelfontsize=10.
# This tag requires that the tag HAVE_DOT is set to YES.
-DOT_FONTNAME = Helvetica
+DOT_EDGE_ATTR = "labelfontname=Helvetica,labelfontsize=10"
-# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
-# dot graphs.
-# Minimum value: 4, maximum value: 24, default value: 10.
+# DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes
+# around nodes set 'shape=plain' or 'shape=plaintext' Shapes specification
+# The default value is: shape=box,height=0.2,width=0.4.
# This tag requires that the tag HAVE_DOT is set to YES.
-DOT_FONTSIZE = 10
+DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4"
-# By default doxygen will tell dot to use the default font as specified with
-# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
-# the path where dot can find it using this tag.
+# You can set the path where dot can find font specified with fontname in
+# DOT_COMMON_ATTR and others dot attributes.
# This tag requires that the tag HAVE_DOT is set to YES.
DOT_FONTPATH =
-# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
-# each documented class showing the direct and indirect inheritance relations.
-# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# If the CLASS_GRAPH tag is set to YES or GRAPH or BUILTIN then Doxygen will
+# generate a graph for each documented class showing the direct and indirect
+# inheritance relations. In case the CLASS_GRAPH tag is set to YES or GRAPH and
+# HAVE_DOT is enabled as well, then dot will be used to draw the graph. In case
+# the CLASS_GRAPH tag is set to YES and HAVE_DOT is disabled or if the
+# CLASS_GRAPH tag is set to BUILTIN, then the built-in generator will be used.
+# If the CLASS_GRAPH tag is set to TEXT the direct and indirect inheritance
+# relations will be shown as texts / links. Explicit enabling an inheritance
+# graph or choosing a different representation for an inheritance graph of a
+# specific class, can be accomplished by means of the command \inheritancegraph.
+# Disabling an inheritance graph can be accomplished by means of the command
+# \hideinheritancegraph.
+# Possible values are: NO, YES, TEXT, GRAPH and BUILTIN.
# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
CLASS_GRAPH = YES
-# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# If the COLLABORATION_GRAPH tag is set to YES then Doxygen will generate a
# graph for each documented class showing the direct and indirect implementation
# dependencies (inheritance, containment, and class references variables) of the
-# class with other documented classes.
+# class with other documented classes. Explicit enabling a collaboration graph,
+# when COLLABORATION_GRAPH is set to NO, can be accomplished by means of the
+# command \collaborationgraph. Disabling a collaboration graph can be
+# accomplished by means of the command \hidecollaborationgraph.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
COLLABORATION_GRAPH = NO
-# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
-# groups, showing the direct groups dependencies.
+# If the GROUP_GRAPHS tag is set to YES then Doxygen will generate a graph for
+# groups, showing the direct groups dependencies. Explicit enabling a group
+# dependency graph, when GROUP_GRAPHS is set to NO, can be accomplished by means
+# of the command \groupgraph. Disabling a directory graph can be accomplished by
+# means of the command \hidegroupgraph. See also the chapter Grouping in the
+# manual.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
GROUP_GRAPHS = YES
-# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
+# If the UML_LOOK tag is set to YES, Doxygen will generate inheritance and
# collaboration diagrams in a style similar to the OMG's Unified Modeling
# Language.
# The default value is: NO.
@@ -2274,10 +2742,41 @@ UML_LOOK = YES
# but if the number exceeds 15, the total amount of fields shown is limited to
# 10.
# Minimum value: 0, maximum value: 100, default value: 10.
-# This tag requires that the tag HAVE_DOT is set to YES.
+# This tag requires that the tag UML_LOOK is set to YES.
UML_LIMIT_NUM_FIELDS = 10
+# If the UML_LOOK tag is enabled, field labels are shown along the edge between
+# two class nodes. If there are many fields and many nodes the graph may become
+# too cluttered. The UML_MAX_EDGE_LABELS threshold limits the number of items to
+# make the size more manageable. Set this to 0 for no limit.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag UML_LOOK is set to YES.
+
+UML_MAX_EDGE_LABELS = 10
+
+# If the DOT_UML_DETAILS tag is set to NO, Doxygen will show attributes and
+# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS
+# tag is set to YES, Doxygen will add type and arguments for attributes and
+# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, Doxygen
+# will not generate fields with class member information in the UML graphs. The
+# class diagrams will look similar to the default class diagrams but using UML
+# notation for the relationships.
+# Possible values are: NO, YES and NONE.
+# The default value is: NO.
+# This tag requires that the tag UML_LOOK is set to YES.
+
+DOT_UML_DETAILS = NO
+
+# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters
+# to display on a single line. If the actual line length exceeds this threshold
+# significantly it will be wrapped across multiple lines. Some heuristics are
+# applied to avoid ugly line breaks.
+# Minimum value: 0, maximum value: 1000, default value: 17.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_WRAP_THRESHOLD = 17
+
# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
# collaboration graphs will show the relations between templates and their
# instances.
@@ -2287,24 +2786,29 @@ UML_LIMIT_NUM_FIELDS = 10
TEMPLATE_RELATIONS = NO
# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
-# YES then doxygen will generate a graph for each documented file showing the
+# YES then Doxygen will generate a graph for each documented file showing the
# direct and indirect include dependencies of the file with other documented
-# files.
+# files. Explicit enabling an include graph, when INCLUDE_GRAPH is is set to NO,
+# can be accomplished by means of the command \includegraph. Disabling an
+# include graph can be accomplished by means of the command \hideincludegraph.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
INCLUDE_GRAPH = YES
# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
-# set to YES then doxygen will generate a graph for each documented file showing
+# set to YES then Doxygen will generate a graph for each documented file showing
# the direct and indirect include dependencies of the file with other documented
-# files.
+# files. Explicit enabling an included by graph, when INCLUDED_BY_GRAPH is set
+# to NO, can be accomplished by means of the command \includedbygraph. Disabling
+# an included by graph can be accomplished by means of the command
+# \hideincludedbygraph.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
INCLUDED_BY_GRAPH = YES
-# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# If the CALL_GRAPH tag is set to YES then Doxygen will generate a call
# dependency graph for every global function or class method.
#
# Note that enabling this option will significantly increase the time of a run.
@@ -2316,7 +2820,7 @@ INCLUDED_BY_GRAPH = YES
CALL_GRAPH = NO
-# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# If the CALLER_GRAPH tag is set to YES then Doxygen will generate a caller
# dependency graph for every global function or class method.
#
# Note that enabling this option will significantly increase the time of a run.
@@ -2328,44 +2832,59 @@ CALL_GRAPH = NO
CALLER_GRAPH = NO
-# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# If the GRAPHICAL_HIERARCHY tag is set to YES then Doxygen will graphical
# hierarchy of all classes instead of a textual one.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
GRAPHICAL_HIERARCHY = YES
-# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# If the DIRECTORY_GRAPH tag is set to YES then Doxygen will show the
# dependencies a directory has on other directories in a graphical way. The
# dependency relations are determined by the #include relations between the
-# files in the directories.
+# files in the directories. Explicit enabling a directory graph, when
+# DIRECTORY_GRAPH is set to NO, can be accomplished by means of the command
+# \directorygraph. Disabling a directory graph can be accomplished by means of
+# the command \hidedirectorygraph.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
DIRECTORY_GRAPH = YES
+# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels
+# of child directories generated in directory dependency graphs by dot.
+# Minimum value: 1, maximum value: 25, default value: 1.
+# This tag requires that the tag DIRECTORY_GRAPH is set to YES.
+
+DIR_GRAPH_MAX_DEPTH = 1
+
# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
# generated by dot. For an explanation of the image formats see the section
# output formats in the documentation of the dot tool (Graphviz (see:
-# http://www.graphviz.org/)).
-# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
-# to make the SVG files visible in IE 9+ (other browsers do not have this
-# requirement).
+# https://www.graphviz.org/)).
+#
+# Note the formats svg:cairo and svg:cairo:cairo cannot be used in combination
+# with INTERACTIVE_SVG (the INTERACTIVE_SVG will be set to NO).
# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
-# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
-# png:gdiplus:gdiplus.
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus,
+# png:gdiplus:gdiplus, svg:cairo, svg:cairo:cairo, svg:svg, svg:svg:core,
+# gif:cairo, gif:cairo:gd, gif:cairo:gdiplus, gif:gdiplus, gif:gdiplus:gdiplus,
+# gif:gd, gif:gd:gd, jpg:cairo, jpg:cairo:gd, jpg:cairo:gdiplus, jpg:gd,
+# jpg:gd:gd, jpg:gdiplus and jpg:gdiplus:gdiplus.
# The default value is: png.
# This tag requires that the tag HAVE_DOT is set to YES.
DOT_IMAGE_FORMAT = png
-# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
-# enable generation of interactive SVG images that allow zooming and panning.
+# If DOT_IMAGE_FORMAT is set to svg or svg:svg or svg:svg:core, then this option
+# can be set to YES to enable generation of interactive SVG images that allow
+# zooming and panning.
#
# Note that this requires a modern browser other than Internet Explorer. Tested
# and working are Firefox, Chrome, Safari, and Opera.
-# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
-# the SVG files visible. Older versions of IE do not have SVG support.
+#
+# Note This option will be automatically disabled when DOT_IMAGE_FORMAT is set
+# to svg:cairo or svg:cairo:cairo.
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.
@@ -2384,11 +2903,12 @@ DOT_PATH =
DOTFILE_DIRS =
-# The MSCFILE_DIRS tag can be used to specify one or more directories that
-# contain msc files that are included in the documentation (see the \mscfile
-# command).
+# You can include diagrams made with dia in Doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
-MSCFILE_DIRS =
+DIA_PATH =
# The DIAFILE_DIRS tag can be used to specify one or more directories that
# contain dia files that are included in the documentation (see the \diafile
@@ -2396,23 +2916,34 @@ MSCFILE_DIRS =
DIAFILE_DIRS =
-# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
-# path where java can find the plantuml.jar file. If left blank, it is assumed
-# PlantUML is not used or called during a preprocessing step. Doxygen will
-# generate a warning when it encounters a \startuml command in this case and
-# will not generate output for the diagram.
+# When using PlantUML, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file or to the filename of jar file
+# to be used. If left blank, it is assumed PlantUML is not used or called during
+# a preprocessing step. Doxygen will generate a warning when it encounters a
+# \startuml command in this case and will not generate output for the diagram.
PLANTUML_JAR_PATH =
-# When using plantuml, the specified paths are searched for files specified by
-# the !include statement in a plantuml block.
+# When using PlantUML, the PLANTUML_CFG_FILE tag can be used to specify a
+# configuration file for PlantUML.
+
+PLANTUML_CFG_FILE =
+
+# When using PlantUML, the specified paths are searched for files specified by
+# the !include statement in a PlantUML block.
PLANTUML_INCLUDE_PATH =
+# The PLANTUMLFILE_DIRS tag can be used to specify one or more directories that
+# contain PlantUml files that are included in the documentation (see the
+# \plantumlfile command).
+
+PLANTUMLFILE_DIRS =
+
# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
# that will be shown in the graph. If the number of nodes in a graph becomes
-# larger than this value, doxygen will truncate the graph, which is visualized
-# by representing a node as a red box. Note that doxygen if the number of direct
+# larger than this value, Doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that if the number of direct
# children of the root node in a graph is already larger than
# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
@@ -2433,18 +2964,6 @@ DOT_GRAPH_MAX_NODES = 50
MAX_DOT_GRAPH_DEPTH = 0
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
-# background. This is disabled by default, because dot on Windows does not seem
-# to support this out of the box.
-#
-# Warning: Depending on the platform used, enabling this option may lead to
-# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
-# read).
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_TRANSPARENT = NO
-
# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
# files in one run (i.e. multiple -o and -T options on the command line). This
# makes dot run faster, but since only newer versions of dot (>1.8.10) support
@@ -2454,17 +2973,37 @@ DOT_TRANSPARENT = NO
DOT_MULTI_TARGETS = NO
-# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# If the GENERATE_LEGEND tag is set to YES Doxygen will generate a legend page
# explaining the meaning of the various boxes and arrows in the dot generated
# graphs.
+# Note: This tag requires that UML_LOOK isn't set, i.e. the Doxygen internal
+# graphical representation for inheritance and collaboration diagrams is used.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
GENERATE_LEGEND = YES
-# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# If the DOT_CLEANUP tag is set to YES, Doxygen will remove the intermediate
# files that are used to generate the various graphs.
+#
+# Note: This setting is not only used for dot files but also for msc temporary
+# files.
# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
DOT_CLEANUP = YES
+
+# You can define message sequence charts within Doxygen comments using the \msc
+# command. If the MSCGEN_TOOL tag is left empty (the default), then Doxygen will
+# use a built-in version of mscgen tool to produce the charts. Alternatively,
+# the MSCGEN_TOOL tag can also specify the name an external tool. For instance,
+# specifying prog as the value, Doxygen will call the tool as prog -T
+# -o . The external tool should support
+# output file formats "png", "eps", "svg", and "ismap".
+
+MSCGEN_TOOL =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS =
diff --git a/doc/doxygen/overview.md b/doc/doxygen/overview.md
new file mode 100644
index 00000000000..571f68087e4
--- /dev/null
+++ b/doc/doxygen/overview.md
@@ -0,0 +1,21 @@
+Overview {#mainpage}
+====================
+
+**MNE-CPP — The C++ framework for real-time functional brain imaging**
+
+MNE-CPP provides a cross-platform library for MEG/EEG data processing, visualization, and real-time brain imaging. This Doxygen site documents the public C++ API of all MNE-CPP libraries.
+
+## API Reference
+
+- **[Namespace List](namespaces.html)** — All namespaces with brief descriptions
+- **[Class List](annotated.html)** — Annotated list of all classes, structs, and unions
+- **[Class Index](classes.html)** — Alphabetical class index
+- **[Class Hierarchy](hierarchy.html)** — Inheritance hierarchy
+- **[Class Members](functions.html)** — Index of all class members (functions, variables, typedefs, enums)
+- **[Namespace Members](namespacemembers.html)** — Index of all namespace members
+- **[File List](files.html)** — List of all documented source files
+
+## Links
+
+- **Website:** https://mne-cpp.github.io/
+- **Source Code:** https://github.com/mne-cpp/mne-cpp
diff --git a/doc/gh-pages/feature_catalogue.md b/doc/gh-pages/feature_catalogue.md
index 420a821a391..ae126fc35e6 100644
--- a/doc/gh-pages/feature_catalogue.md
+++ b/doc/gh-pages/feature_catalogue.md
@@ -9,7 +9,7 @@ nav_order: 6
### MNE Scan
-* Connect to the following hardware devices and receive data in real-time: MEGIN MEG (via Fieldtrip Buffer), BabyMEG, Natus, BrainAmp, EegoSports, gUSBAmp, TMSI EEG Refa, BrainFlow, LSL.
+* Connect to the following hardware devices and receive data in real-time: MEGIN MEG (via Fieldtrip Buffer), BabyMEG, Natus, BrainAmp, EegoSports, gUSBAmp, TMSI EEG Refa, LSL.
* Stream pre-recorded FIFF data and pipe the data to subsequent connected processing steps.
diff --git a/doc/gh-pages/pages/development/buildguide_cmake.md b/doc/gh-pages/pages/development/buildguide_cmake.md
index 127ff3ea541..e4738d58e34 100644
--- a/doc/gh-pages/pages/development/buildguide_cmake.md
+++ b/doc/gh-pages/pages/development/buildguide_cmake.md
@@ -83,7 +83,7 @@ For more build options and how to set them, run:
Alternatively, you can manually run:
```
-cmake -B build -S src -DCMAKE_BUILD_TYPE=Release
+cmake -B build -S . -DCMAKE_BUILD_TYPE=Release
cmake --build build
```
diff --git a/doc/gh-pages/pages/documentation/scan_brainflow.md b/doc/gh-pages/pages/documentation/scan_brainflow.md
deleted file mode 100644
index 222c6dab6d9..00000000000
--- a/doc/gh-pages/pages/documentation/scan_brainflow.md
+++ /dev/null
@@ -1,45 +0,0 @@
----
-title: BrainFlow
-parent: MNE Scan
-grand_parent: Documentation
-nav_order: 10
----
-# BrainFlow
-
-The BrainFlow plugin adds data acquisition for several EEG amplifiers to MNE Scan. For more information about the BrainFlow project please see:
-
-* [BrainFlow Docs](https://brainflow.readthedocs.io/en/stable/){:target="_blank" rel="noopener"}
-* [BrainFlow Repo](https://github.com/Andrey1994/brainflow){:target="_blank" rel="noopener"}
-
-## Compilation of the BrainFlow Submodule
-
-Make sure that you have brainflow git submodule by typing:
-
-```
-git submodule update --init applications/mne_scan/plugins/brainflowboard/brainflow
-```
-
-Build it as a regular Cmake project. For MSVC you need to ensure that you use exactly the same Cmake generator as for MNE-CPP. Also, you need to specify `MSVC_RUNTIME` as dynamic (default is static) and set the `-DCMAKE_INSTALL_PREFIX=..\installed` flag. For compilation with MSVC 2015 on a 64bit system do:
-
-```
-cd mne-cpp\applications\mne_scan\plugins\brainflowboard\brainflow\
-mkdir build
-cd build
-cmake -G "Visual Studio 14 2015 Win64" -DMSVC_RUNTIME=dynamic -DCMAKE_SYSTEM_VERSION=8.1 -DCMAKE_INSTALL_PREFIX="..\\installed" ..
-cmake --build . --target install --config Release
-```
-
-For a MSVC 2017 build you need to use `Visual Studio 15 2017 Win64` instead.
-
-## Compilation of the BrainFlowBoard Plugin in MNE Scan
-
-* After the steps above make sure that you use the `MNECPP_CONFIG` flag `withBrainFlow`. You can also set the flag manually in the [mne-cpp.pri file](https://github.com/mne-tools/mne-cpp/blob/main/mne-cpp.pri#L135){:target="_blank" rel="noopener"}.
-* Build MNE Scan.
-* BrainFlow has several dynamic libraries and a JSON file which must be in your search path before you run MNE Scan. You need to copypaste all dynamic libraries and the brainflow_boards.json file to your executable folder `mne-cpp\out\Release\apps\` from `mne-cpp\applications\mne_scan\plugins\brainflowboard\brainflow\installed\lib`.
-
-## BrainFlowBoard Plugin GUI
-
-* You need to provide all inputs required for the selected board and click `Submit Params and Prepare Session` button. For information about inputs in BraiFlowBoard plugin widget use this [table](https://brainflow.readthedocs.io/en/stable/SupportedBoards.html).
-* You can now start data streaming using the play button.
-* If you need to change board or other parameters click `Release Session` button and create a new one.
-* [Optional] if you need to send a config command to a board, open setting widget and enter a config command.
diff --git a/doc/gh-pages/pages/documentation/scan_lsl.md b/doc/gh-pages/pages/documentation/scan_lsl.md
index 2b7b759a5ad..96f1e274a27 100644
--- a/doc/gh-pages/pages/documentation/scan_lsl.md
+++ b/doc/gh-pages/pages/documentation/scan_lsl.md
@@ -6,34 +6,24 @@ nav_order: 12
---
# Lab Streaming Layer (LSL)
-This plugin adds support for LSL data streams to MNE Scan. For more information about the LSL project please see:
+This plugin adds support for LSL data streams to MNE Scan. MNE-CPP includes a self-contained LSL library under `src/libraries/lsl` that implements the core LSL protocol (stream discovery via UDP multicast, data transport via TCP), eliminating the need for any external dependency.
-* [LSL on Github](https://github.com/sccn/labstreaminglayer){:target="_blank" rel="noopener"}
-* [Building the LSL library from source](https://labstreaminglayer.readthedocs.io/dev/lib_dev.html#building-liblsl){:target="_blank" rel="noopener"}
-
-## Compilation of the LSL Submodule
+For more information about the original LSL project please see:
-Make sure that you have the LSL git submodule by typing:
+* [LSL on Github](https://github.com/sccn/labstreaminglayer){:target="_blank" rel="noopener"}
-```
-git submodule update --init applications\mne_scan\plugins\lsladapter\liblsl
-```
+## Building the LSL Plugin
-Build it as a regular Cmake project. For MSVC you need to ensure that you use exactly the same Cmake generator as for MNE-CPP. For compilation with MSVC 2015 on a 64bit system do:
+The LSL plugin is built by default. Configure the project as usual:
```
-cd mne-cpp\applications\mne_scan\plugins\lsladapter\liblsl\
-mkdir build
-cd build
-cmake .. -G "Visual Studio 14 2015 Win64"
-cmake --build . --config Release --target install
+cmake -B build -S .
+cmake --build build
```
-For a MSVC 2017 build you need to use `Visual Studio 15 2017 Win64` instead.
+No external submodule or library is required — the built-in `mne_lsl` library provides all necessary LSL functionality.
## LSL Plugin Setup
-* After the steps above make sure that you use the `MNECPP_CONFIG` flag `withLsl`. You can also set the flag manually in the [mne-cpp.pri file](https://github.com/mne-tools/mne-cpp/blob/main/mne-cpp.pri#L135){:target="_blank" rel="noopener"}.
* Build MNE Scan.
-* LSL has a dynamic library which must be in your search path before you run MNE Scan. You need to copy `lsl.dll` from `mne-cpp\applications\mne_scan\plugins\lsladapter\liblsl\install\bin` to your executable folder `mne-cpp\out\Release\apps`.
-* Start MNE Scan
+* Start MNE Scan — the LSL adapter plugin will be available in the sensor plugins list.
diff --git a/doc/website/.gitignore b/doc/website/.gitignore
new file mode 100644
index 00000000000..a640cd91e99
--- /dev/null
+++ b/doc/website/.gitignore
@@ -0,0 +1,12 @@
+# Dependencies
+node_modules/
+
+# Build output
+build/
+
+# Docusaurus cache
+.docusaurus/
+
+# Misc
+.DS_Store
+*.log
diff --git a/doc/website/docs/cite.mdx b/doc/website/docs/cite.mdx
new file mode 100644
index 00000000000..1c470325061
--- /dev/null
+++ b/doc/website/docs/cite.mdx
@@ -0,0 +1,33 @@
+---
+title: "How to Cite"
+sidebar_label: "How to Cite"
+sidebar_position: 4
+---
+
+# How to Cite MNE-CPP
+
+[](https://doi.org/10.5281/zenodo.593102)
+
+If you use MNE-CPP in your research, we would appreciate if you cite the following:
+
+| |
+|---|
+| Dinh, C.; Esch, L.; Knobl, D.; Klüber, V.; Henfling, M.; Tjen, R.; Kiesel, J.; Sun, L.; Schlembach, F.; Lew, S.; Kunze, T.; Arndt, F.; Pieloth, C.; Eichhorst, L.; Doshi, C.; Polo, F.; Kay, B.; Hornberger, E.; Strohmeier, D.; Luessi, M.; Jas, M.; Larson, E.; Eiselt, M.; Okada, Y.; Haueisen, J.; Hämäläinen, M. S.: MNE-CPP. Zenodo. [DOI: 10.5281/zenodo.593102](https://doi.org/10.5281/zenodo.593102) |
+
+We also recommend citing the MNE software overview:
+
+| |
+|---|
+| Esch, L.; Dinh, C.; Larson, E.; Engemann, D.; Jas, M.; Khan, S.; Gramfort, A.; Hämäläinen, M.S.: MNE: Software for Acquiring, Processing and Visualizing MEG/EEG Data. Magnetoencephalography: From Signals to Dynamic Cortical Networks. 2nd Edition. Springer (2019), [DOI: 10.1007/978-3-319-62657-4_59-1](https://link.springer.com/referenceworkentry/10.1007%2F978-3-319-62657-4_59-1) |
+
+If your work involves MNE Scan, please also consider citing:
+
+| |
+|---|
+| Esch, L.; Sun, L.; Klüber, V.; Lew, S.; Baumgarten, D.; Grant, P. E.; Okada, Y.; Haueisen, J.; Hamalainen, M.S.; Dinh, C.: MNE Scan: Software for Real-Time Processing of Electrophysiological Data. Journal of Neuroscience Methods (2018), [DOI: 10.1016/j.jneumeth.2018.03.020](https://www.sciencedirect.com/science/article/pii/S0165027018300979) |
+
+For specific methods such as RTC-MNE, please cite the relevant method paper as well:
+
+| |
+|---|
+| Dinh, C.; Strohmeier, D.; Luessi, M.; Güllmar, D.; Baumgarten, D.; Haueisen, J.; Hämäläinen, M.S.: Real-Time MEG Source Localization using Regional Clustering. Brain Topography (2015), [DOI: 10.1007/s10548-015-0431-9](https://link.springer.com/article/10.1007/s10548-017-0586-7) |
diff --git a/doc/website/docs/development/analyze-datamodel.mdx b/doc/website/docs/development/analyze-datamodel.mdx
new file mode 100644
index 00000000000..a998d28b115
--- /dev/null
+++ b/doc/website/docs/development/analyze-datamodel.mdx
@@ -0,0 +1,268 @@
+---
+title: Creating a new data model
+sidebar_label: Data Model
+---
+
+# Creating a New Data Model
+
+MNE Analyze uses the [Model/View](https://doc.qt.io/qt-6/model-view-programming.html) architecture from Qt to separate data storage from presentation. All data — FIFF files, annotations, averages — is represented as a **model** that views can display. This guide explains how to create a new data model for a custom data type.
+
+## Architecture Overview
+
+```
+┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
+│ Data Loader │────►│ Data Manager │────►│ Views │
+│ (loads files) │ │ (stores models) │ │ (display models) │
+└──────────────────┘ └──────────────────┘ └──────────────────┘
+ │
+ ┌──────▼──────┐
+ │ AbstractModel│
+ │ (your new │
+ │ subclass) │
+ └─────────────┘
+```
+
+All data models inherit from `AbstractModel`, which itself extends `QAbstractItemModel`. The `DataLoader` reads files from disk and creates model instances, while the `DataManager` (via `AnalyzeData`) stores and manages them. Plugins access models through the event system.
+
+## Subclassing AbstractModel
+
+`AbstractModel` is located at `applications/mne_analyze/libs/anShared/Model/abstractmodel.h`. Since it extends `QAbstractItemModel`, you must implement all pure virtual functions from both classes.
+
+### Pure Virtual Functions
+
+#### `getType()`
+Returns the type identifier for your model. Add a new entry to the `MODEL_TYPE` enum in `applications/mne_analyze/libs/anShared/Utils/types.h`:
+
+```cpp
+enum MODEL_TYPE {
+ ANSHAREDLIB_FIFFRAW_MODEL,
+ ANSHAREDLIB_ANNOTATION_MODEL,
+ ANSHAREDLIB_AVERAGING_MODEL,
+ ANSHAREDLIB_MYDATA_MODEL, // ← add your type here
+};
+```
+
+Then implement:
+```cpp
+MODEL_TYPE MyDataModel::getType() const
+{
+ return MODEL_TYPE::ANSHAREDLIB_MYDATA_MODEL;
+}
+```
+
+#### `data()`
+Returns data for a given model index and role. This is the primary function that views call to retrieve displayable content:
+
+```cpp
+QVariant MyDataModel::data(const QModelIndex& index, int role) const
+{
+ if (!index.isValid())
+ return QVariant();
+
+ if (role == Qt::DisplayRole) {
+ // Return data based on row and column
+ return m_data.at(index.row()).at(index.column());
+ }
+
+ return QVariant();
+}
+```
+
+#### `flags()`
+Returns item flags (selectable, editable, enabled, etc.):
+
+```cpp
+Qt::ItemFlags MyDataModel::flags(const QModelIndex& index) const
+{
+ if (!index.isValid())
+ return Qt::NoItemFlags;
+
+ return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
+}
+```
+
+#### `index()`
+Creates and returns a `QModelIndex` for the given row, column, and parent:
+
+```cpp
+QModelIndex MyDataModel::index(int row, int column, const QModelIndex& parent) const
+{
+ Q_UNUSED(parent)
+ if (row < 0 || row >= rowCount() || column < 0 || column >= columnCount())
+ return QModelIndex();
+
+ return createIndex(row, column);
+}
+```
+
+#### `parent()`
+Returns the parent index. For flat (non-hierarchical) models, return an empty index:
+
+```cpp
+QModelIndex MyDataModel::parent(const QModelIndex& index) const
+{
+ Q_UNUSED(index)
+ return QModelIndex();
+}
+```
+
+#### `rowCount()`
+Returns the number of rows. The meaning depends on your data — for example, the `FiffRawViewModel` returns the number of channels:
+
+```cpp
+int MyDataModel::rowCount(const QModelIndex& parent) const
+{
+ Q_UNUSED(parent)
+ return m_data.size();
+}
+```
+
+#### `columnCount()`
+Returns the number of columns:
+
+```cpp
+int MyDataModel::columnCount(const QModelIndex& parent) const
+{
+ Q_UNUSED(parent)
+ return m_iNumColumns;
+}
+```
+
+### Optional: `saveToFile()`
+
+If your model supports saving data back to disk, override `saveToFile()` from `AbstractModel`:
+
+```cpp
+bool MyDataModel::saveToFile(const QString& sPath)
+{
+ QFile file(sPath);
+ if (!file.open(QIODevice::WriteOnly)) {
+ qWarning() << "[MyDataModel::saveToFile] Could not open" << sPath;
+ return false;
+ }
+ // Write your data format
+ // ...
+ return true;
+}
+```
+
+## Registering with the Data Loader and Data Manager
+
+### Loading from Files
+
+To allow users to load your data type from a file:
+
+1. In `DataLoader::loadFilePath()`, add support for your file extension so that the file dialog recognizes it.
+2. In the load handler, create a new instance of your model and pass it to the data manager.
+
+### Adding Models Programmatically
+
+To create a model from within a plugin (e.g., computed results rather than files):
+
+1. In `AnalyzeData.h`, extend `addModel()` to handle your `MODEL_TYPE`.
+2. Specify the data type your model corresponds to — see `bidsviewmodel.h` for the available types, or add a new one.
+
+### Saving to Files
+
+To support saving, ensure your file extension is included in `DataLoader::onSaveFilePressed()`, and implement `saveToFile()` in your model.
+
+## Complete Minimal Example
+
+```cpp
+// mydatamodel.h
+#pragma once
+
+#include "../Utils/types.h"
+#include "abstractmodel.h"
+
+class MyDataModel : public ANSHAREDLIB::AbstractModel
+{
+ Q_OBJECT
+
+public:
+ MyDataModel(const QList& data, QObject* parent = nullptr);
+
+ // AbstractModel
+ MODEL_TYPE getType() const override;
+
+ // QAbstractItemModel
+ QVariant data(const QModelIndex& index, int role) const override;
+ Qt::ItemFlags flags(const QModelIndex& index) const override;
+ QModelIndex index(int row, int col, const QModelIndex& parent = QModelIndex()) const override;
+ QModelIndex parent(const QModelIndex& index) const override;
+ int rowCount(const QModelIndex& parent = QModelIndex()) const override;
+ int columnCount(const QModelIndex& parent = QModelIndex()) const override;
+
+private:
+ QList m_data;
+};
+```
+
+```cpp
+// mydatamodel.cpp
+#include "mydatamodel.h"
+
+MyDataModel::MyDataModel(const QList& data, QObject* parent)
+ : AbstractModel(parent)
+ , m_data(data)
+{
+}
+
+MODEL_TYPE MyDataModel::getType() const
+{
+ return MODEL_TYPE::ANSHAREDLIB_MYDATA_MODEL;
+}
+
+QVariant MyDataModel::data(const QModelIndex& index, int role) const
+{
+ if (!index.isValid() || role != Qt::DisplayRole)
+ return QVariant();
+
+ return m_data.at(index.row()).at(index.column());
+}
+
+Qt::ItemFlags MyDataModel::flags(const QModelIndex& index) const
+{
+ return index.isValid() ? (Qt::ItemIsEnabled | Qt::ItemIsSelectable) : Qt::NoItemFlags;
+}
+
+QModelIndex MyDataModel::index(int row, int col, const QModelIndex& parent) const
+{
+ Q_UNUSED(parent)
+ return createIndex(row, col);
+}
+
+QModelIndex MyDataModel::parent(const QModelIndex& index) const
+{
+ Q_UNUSED(index)
+ return QModelIndex();
+}
+
+int MyDataModel::rowCount(const QModelIndex& parent) const
+{
+ Q_UNUSED(parent)
+ return m_data.size();
+}
+
+int MyDataModel::columnCount(const QModelIndex& parent) const
+{
+ Q_UNUSED(parent)
+ return m_data.isEmpty() ? 0 : m_data.first().size();
+}
+```
+
+## Using Your Model in a Plugin
+
+Once registered, your plugin can create and display the model:
+
+```cpp
+// In your plugin's handleEvent() or a load function:
+QList data = parseMyFile(sFilePath);
+auto pModel = QSharedPointer::create(data);
+
+// Notify MNE Analyze about the new model via the event system
+QVariant varModel = QVariant::fromValue(pModel);
+m_pCommu->publishEvent(EVENT_TYPE::NEW_MODEL_AVAILABLE, varModel);
+```
+
+Views that are subscribed to `NEW_MODEL_AVAILABLE` will then receive and display the model.
diff --git a/doc/website/docs/development/analyze-event.mdx b/doc/website/docs/development/analyze-event.mdx
new file mode 100644
index 00000000000..b1dfead7dcb
--- /dev/null
+++ b/doc/website/docs/development/analyze-event.mdx
@@ -0,0 +1,89 @@
+---
+title: Event System
+sidebar_label: Event System
+---
+
+# Event System
+
+This guide covers the event system used in MNE Analyze for inter-plugin communication, not to be confused with the Event Manager plugin.
+
+## Overview
+
+In addition to the Qt Framework's signal/slot system, MNE Analyze uses a dedicated event system for all communication between plugins. This event system is integrated into all plugins through the `AbstractPlugin` interface, allowing every plugin to send and receive events. The event manager runs on a separate thread, cycling through a buffer and delivering queued events to subscribed plugins.
+
+## Events
+
+Events can be used to send data, trigger things, or both. As an example: `SELECTED_MODEL_CHANGED`, one of the most widely used event types, which is triggered by the selection of a new item in the Data Manager, contains a `QSharedPointer>`, a pointer to the selected data item; while `TRIGGER_REDRAW`, used for making the Signal Viewer update, contains no data.
+
+All event types are declared in `applications/mne_analyze/libs/anShared/Utils/types.h` in the `EVENT_TYPE` enum. To add a new event type, simply add an entry to this enum. Events should ideally serve a single purpose and always send and expect the same type of data, if any.
+
+## Sending Events
+
+Events are sent using the `Communicator` class (`applications/mne_analyze/libs/anShared/Management/communicator.h`) via its `publishEvent()` method. When sending an event you pass an event type and, optionally, data wrapped in a [QVariant](https://doc.qt.io/qt-6/qvariant.html). Below is a code snippet of the Filtering plugin broadcasting an event with data:
+
+```cpp
+void Filtering::setFilterChannelType(const QString& sType)
+{
+ QVariant data;
+ data.setValue(sType);
+ m_pCommu->publishEvent(EVENT_TYPE::FILTER_CHANNEL_TYPE_CHANGED, data);
+}
+```
+
+The string `sType` is stored in the `QVariant` via `setValue()` before being passed along with the event.
+
+## Receiving Events
+
+To receive events of a certain type, a plugin must subscribe to that type. This is done in the plugin's implementation of `getEventSubscriptions()` by returning a vector of all the event types the plugin is interested in. Below is a code snippet of the Averaging plugin subscribing to events:
+
+```cpp
+QVector Averaging::getEventSubscriptions(void) const
+{
+ QVector temp;
+ temp.push_back(SELECTED_MODEL_CHANGED);
+ temp.push_back(FILTER_ACTIVE_CHANGED);
+ temp.push_back(FILTER_DESIGN_CHANGED);
+ temp.push_back(EVENT_GROUPS_UPDATED);
+ temp.push_back(CHANNEL_SELECTION_ITEMS);
+ temp.push_back(SCALING_MAP_CHANGED);
+ temp.push_back(VIEW_SETTINGS_CHANGED);
+
+ return temp;
+}
+```
+
+Once subscribed, plugins handle incoming events via `handleEvent()`. Below is how the AnnotationManager plugin handles its events:
+
+```cpp
+void AnnotationManager::handleEvent(QSharedPointer e)
+{
+ switch (e->getType()) {
+ case EVENT_TYPE::NEW_ANNOTATION_ADDED:
+ emit newAnnotationAvailable(e->getData().toInt());
+ onTriggerRedraw();
+ break;
+ case EVENT_TYPE::SELECTED_MODEL_CHANGED:
+ onModelChanged(e->getData().value >());
+ break;
+ default:
+ qWarning() << "[AnnotationManager::handleEvent] Received an Event that is not handled by switch cases.";
+ }
+}
+```
+
+## Best Practices
+
+- **Delegate to helper functions.** Unless the handling code is very short, move the logic into a dedicated method for readability. See the `onModelChanged()` pattern used in plugins that receive `SELECTED_MODEL_CHANGED`.
+- **One purpose per event.** Each event type should carry a consistent data payload and serve a single, well-defined purpose.
+- **Document your events.** When introducing a new `EVENT_TYPE`, add a brief comment in `types.h` describing what data it carries and which plugins produce/consume it.
+
+## Common Event Types
+
+| Event | Data Payload | Typical Use |
+|-------|-------------|-------------|
+| `SELECTED_MODEL_CHANGED` | `QSharedPointer` | A new item was selected in the Data Manager |
+| `FILTER_ACTIVE_CHANGED` | `bool` | Filter was toggled on/off |
+| `FILTER_DESIGN_CHANGED` | Filter parameters | Filter settings were modified |
+| `TRIGGER_REDRAW` | *(none)* | Request views to repaint |
+| `SCALING_MAP_CHANGED` | Scaling map | Channel scaling was updated |
+| `NEW_ANNOTATION_ADDED` | `int` (annotation index) | A new annotation was created |
diff --git a/doc/website/docs/development/analyze-plugin.mdx b/doc/website/docs/development/analyze-plugin.mdx
new file mode 100644
index 00000000000..b4b99243f3f
--- /dev/null
+++ b/doc/website/docs/development/analyze-plugin.mdx
@@ -0,0 +1,169 @@
+---
+title: Creating a new plugin
+sidebar_label: Creating a Plugin
+---
+
+# Creating a New Plugin
+
+This guide explains how to create a new MNE Analyze plugin, including implementing the required virtual functions, setting up GUI elements, and integrating with the event system.
+
+## Overview
+
+All MNE Analyze plugins inherit from `AbstractPlugin` (`applications/mne_analyze/libs/anShared/Plugins/abstractplugin.h`). Unlike MNE Scan, MNE Analyze does not differentiate between plugin types.
+
+Plugins are loaded at runtime from `bin/mne_analyze_plugins`. Once loaded, MNE Analyze retrieves each plugin's menus, controls, and views and displays them to the user. Currently each plugin returns at most one of each GUI element.
+
+For implementation details, see:
+- `analyzecore.cpp` → `initPluginManager()` — how plugins are discovered and loaded
+- `mainwindow.cpp` constructor — how GUI elements are assembled
+
+## Sample Plugin
+
+A sample plugin with no functionality is included in `applications/mne_analyze/plugins/sampleplugin`. To create a new plugin, duplicate that folder and replace all instances of `SamplePlugin` with your plugin name. See the checklist at the end of this guide for details that are easy to miss.
+
+## Deriving from AbstractPlugin
+
+AbstractPlugin has a number of pure virtual functions that need to be defined by any new plugin. Among them are functions for getting the view, control, and menu GUI items for the plugin, as well subscribing to and receiving events from the event manager.
+
+### clone()
+
+Returns an instance of the plugin. This is not a copy. Most of the existing plugins do something like this:
+
+```cpp
+return QSharedPointer(new Averaging);
+```
+
+### init()
+
+Initializes the plugin. This gets called after all the plugins get loaded into the Plugin Manager. Any startup actions that need to be done before the user begins interacting with the plugin, such as allocating memory or initializing parameters, can be done here.
+
+### unload()
+
+Closes the plugin. Gets called when the plugins are being shutdown when the main window is closed. Any shutdown actions that need to be performed before the program shuts down can be done here.
+
+### getName()
+
+Returns the plugin name, this will be used to set the plugin title on any views, controls, and menu items the plugin has.
+
+### getMenu()
+
+Returns menu items to be added to the top dropdown menu bar. If the plugin does not need a menu, return a `Q_NULLPTR` (null pointer) instead.
+
+Create a menu object to return, and populate it with relevant actions. Below is a section of the data loader plugin as an example:
+
+```cpp
+QMenu* pMenuFile = new QMenu(tr("File"));
+
+QAction* pActionLoad = new QAction(tr("Open"));
+pActionLoad->setStatusTip(tr("Load a data file"));
+connect(pActionLoad, &QAction::triggered,
+ this, &DataLoader::onLoadFilePressed);
+```
+
+If the name of the menu matches an existing one, the new actions will be added to that existing menu, otherwise a new one will be created.
+
+### getControl()
+
+Returns a `QDockWidget*` containing the control GUI elements of the plugin. If the plugin does not need controls, return a `Q_NULLPTR` (null pointer) instead. Here we also set the allowed docking areas and the tab name that appears when the plugin is docked.
+
+The controls are set by adding any `QWidget` to the `QDockWidget` that needs to be returned. Below is an example with a single widget, the tab name set to the plugin name, docked on the left or right sides of the window:
+
+```cpp
+QDockWidget* pControlDock = new QDockWidget(getName());
+pControlDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
+pControlDock->setObjectName(getName());
+
+QPushButton* pSingleButton = new QPushButton("Compute");
+pControlDock->setWidget(pSingleButton);
+```
+
+This is useful if the control widget is already created. If instead the control widget needs to be created or multiple widgets need to be added, a layout can be used:
+
+```cpp
+QDockWidget* pControlDock = new QDockWidget(getName());
+pControlDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
+pControlDock->setObjectName(getName());
+
+QScrollArea* wrappedScrollArea = new QScrollArea(pControlDock);
+QVBoxLayout* pLayout = new QVBoxLayout;
+pControlDock->setWidget(wrappedScrollArea);
+
+QPushButton* pFirstButton = new QPushButton("Compute");
+QPushButton* pSecondButton = new QPushButton("Clear");
+
+pLayout->addWidget(pFirstButton);
+pLayout->addWidget(pSecondButton);
+```
+
+Many control widgets are already implemented in the Disp library and can be reused here.
+
+To influence the ordering of your plugin's controls in the "Control" drop-down menu, modify the `m_iOrder` variable. The default is 0; higher values place the controls higher in the menu. Negative values force controls to appear lower.
+
+### getView()
+
+Returns a `QWidget*` with the view GUI element of the plugin. If the plugin does not need a view, return a `Q_NULLPTR` (null pointer) instead.
+
+In all cases in MNE Analyze the view is created elsewhere and returned here as an instance. Many view widgets are already implemented in the Disp library and can be reused.
+
+### getEventSubscriptions()
+
+Returns a `QVector` with the events the plugin is subscribed to. If the plugin does not care about incoming events, return an empty `QVector`. See example below:
+
+```cpp
+QVector temp;
+temp.push_back(SELECTED_MODEL_CHANGED);
+temp.push_back(FILTER_ACTIVE_CHANGED);
+temp.push_back(FILTER_DESIGN_CHANGED);
+```
+
+### handleEvent()
+
+Receives event `e` that the plugin is subscribed to. Typically this is handled by a switch-case for each subscribed event:
+
+```cpp
+switch (e->getType()) {
+ case EVENT_TYPE::SELECTED_MODEL_CHANGED:
+ // do something
+ break;
+ case FILTER_ACTIVE_CHANGED:
+ // do something
+ break;
+ case FILTER_DESIGN_CHANGED:
+ // do something
+ break;
+ default:
+ qWarning() << "[Averaging::handleEvent] Received an Event that is not handled by switch cases.";
+}
+```
+
+## Views and Controls
+
+Existing views and controls live in the Disp library and can be reused when building your plugin's GUI. Custom widgets can be created with Qt Designer (`.ui` files). All views and controls subclass `AbstractView`.
+
+### Using the Event System
+
+Events are how MNE Analyze plugins communicate. Subscribe to events to receive notifications about loaded data, selected items, or scaling changes. Send events to broadcast data or trigger actions in other plugins. See the [Event System](analyze-event.mdx) page for details.
+
+### Setting and Clearing Data
+
+Data is displayed using views that present the contents of models, following Qt's [Model/View](https://doc.qt.io/qt-6/model-view-programming.html) architecture.
+
+## Static Building
+
+When building statically, MNE Analyze needs to be told about the plugins at build time. To do this, the plugins are included with `Q_IMPORT_PLUGIN` in `applications/mne_analyze/mne_analyze/main.cpp` under the `#ifdef STATICBUILD` macro. The CMake configuration handles the rest of the static build setup automatically.
+
+## Checklist
+
+Before submitting your plugin as a pull request, verify:
+
+- [ ] Plugin added to the `CMakeLists.txt` in the plugins directory
+- [ ] Plugin's own `CMakeLists.txt` has correct target name, source files, and linked libraries
+- [ ] Plugin has a `*_global.h` file with export macros
+- [ ] All `AbstractPlugin` virtual functions are implemented
+- [ ] `Q_IMPORT_PLUGIN` added in `main.cpp` for static builds
+- [ ] Plugin compiles and loads successfully in MNE Analyze
+
+## Useful References
+
+- [Qt Layout Management](https://doc.qt.io/qt-6/layout.html)
+- [Basics of User Interface Design](https://www.usability.gov/what-and-why/user-interface-design.html)
diff --git a/doc/website/docs/development/analyze.mdx b/doc/website/docs/development/analyze.mdx
new file mode 100644
index 00000000000..2a0b77fbf6d
--- /dev/null
+++ b/doc/website/docs/development/analyze.mdx
@@ -0,0 +1,25 @@
+---
+title: MNE Analyze
+sidebar_label: MNE Analyze
+---
+
+# MNE Analyze Development
+
+MNE Analyze is MNE-CPP's offline data analysis and visualization application. All functionality — data loading, filtering, averaging, visualization, source localization — is implemented as **plugins** that communicate through a dedicated **event system**.
+
+Unlike MNE Scan, MNE Analyze does not differentiate between plugin types. Every plugin inherits from `AbstractPlugin` and can provide menus, control panels, and views that are assembled into the main window at runtime. Data is managed through Qt's [Model/View](https://doc.qt.io/qt-6/model-view-programming.html) architecture, with custom models inheriting from `AbstractModel`.
+
+## Guides
+
+- **[Creating a Plugin](analyze-plugin.mdx)** — Full walkthrough for implementing a new plugin, including GUI elements (menus, controls, views), event subscriptions, and static build setup.
+- **[Event System](analyze-event.mdx)** — How plugins send and receive events via the `Communicator` class, with subscription patterns and a reference table of common event types.
+- **[Data Model](analyze-datamodel.mdx)** — How to create a new data model for custom data types, including subclassing `AbstractModel`, registering with the data manager, and a complete minimal example.
+
+## Key Concepts
+
+| Concept | Description |
+|---------|-------------|
+| **Event system** | Decoupled inter-plugin communication running on a dedicated thread |
+| **AbstractPlugin** | Single base class for all MNE Analyze plugins |
+| **Model/View** | Qt pattern separating data storage (`AbstractModel`) from presentation |
+| **Sample plugin** | Empty plugin template at `applications/mne_analyze/plugins/sampleplugin` |
diff --git a/doc/website/docs/development/api-connectivity.mdx b/doc/website/docs/development/api-connectivity.mdx
new file mode 100644
index 00000000000..342b8ec0e2e
--- /dev/null
+++ b/doc/website/docs/development/api-connectivity.mdx
@@ -0,0 +1,87 @@
+---
+title: Connectivity
+sidebar_label: Connectivity
+---
+
+# Connectivity
+
+The Connectivity library (`CONNECTIVITYLIB`) computes functional connectivity metrics, stores the resulting networks, and provides graph-theoretic utilities. It is implemented in pure C++ with real-time capability in mind and imposes no modality-specific constraints — the same API works for MEG, EEG, and source-level data.
+
+## Architecture
+
+The library is organized into three groups of classes:
+
+| Group | Key Classes | Role |
+|-------|-------------|------|
+| **API** | `Connectivity`, `ConnectivitySettings` | User-facing entry point — configure inputs, select metrics, launch computation |
+| **Metrics** | One class per metric (e.g., `ConnectivityPLI`) | Implement the spectral/statistical estimator for each measure |
+| **Network containers** | `Network`, `NetworkNode`, `NetworkEdge` | Store and query the resulting connectivity graph |
+
+### Data Flow
+
+```mermaid
+flowchart LR
+ A[ConnectivitySettings] --> B[Connectivity::calculate]
+ B --> C1[Metric 1]
+ B --> C2[Metric 2]
+ C1 --> D[Network]
+ C2 --> D
+ D --> E[NetworkNode / NetworkEdge]
+```
+
+1. The user populates a `ConnectivitySettings` object with trial data, node positions, desired metrics, and sampling frequency.
+2. `Connectivity::calculate()` dispatches each requested metric to its dedicated class.
+3. Results are returned as one `Network` per metric, containing `NetworkNode` and `NetworkEdge` objects.
+
+`NetworkEdge` instances are stored as smart pointers, which keeps memory usage manageable for large, fully connected graphs. `Network` also exposes functions for distance-matrix computation, basic graph measures, and weight-based thresholding.
+
+### Trial-Based Computation
+
+Connectivity is computed **across trials**, not across time. This design targets evoked-response experiments where data are segmented into stimulus-locked epochs. For resting-state recordings (no stimulus), the continuous data can be split into equally sized blocks and treated as pseudo-trials — a standard approach in resting-state connectivity studies.
+
+:::note
+Time-resolved (sample-by-sample) connectivity is not currently supported. Use the trial-based approach for spontaneous data.
+:::
+
+## Usage
+
+The example below computes all-to-all Phase Lag Index (PLI) and Imaginary Coherence from MEG gradiometer epochs:
+
+```cpp
+// Prepare input data
+FiffRawData raw("sample_audvis_raw.fif");
+RowVectorXi picks = raw.info.pick_types("grad");
+Eigen::MatrixXi events;
+MNE::read_events("sample_audvis_raw-eve.fif", events);
+
+// Read epochs: -100 ms to 400 ms relative to event type 3
+MNEEpochDataList data;
+data = MNEEpochDataList::readEpochs(raw, events, -0.1, 0.4, 3, picks);
+
+// Configure connectivity
+ConnectivitySettings settings;
+settings.setNodePositions(raw.info, picks);
+settings.setConnectivityMethods(QStringList() << "pli" << "imagcohy");
+settings.setSamplingFrequency(raw.info.sfreq);
+for (MNEEpochData::SPtr pItem : data)
+ settings.append(pItem->epoch);
+
+// Compute — returns one Network per metric
+QList networks = Connectivity::calculate(settings);
+```
+
+Source-level connectivity works identically — pass source-localized signals instead of sensor-level data.
+
+## Supported Metrics
+
+| Metric | Keyword | Domain |
+|--------|---------|--------|
+| Correlation | `cor` | Time |
+| Cross-Correlation | `xcor` | Time |
+| Coherence | `coh` | Frequency |
+| Imaginary Coherence | `imagcohy` | Frequency |
+| Phase Locking Value | `plv` | Phase |
+| Phase Lag Index | `pli` | Phase |
+| Weighted Phase Lag Index | `wpli` | Phase |
+| Unbiased Squared Phase Lag Index | `uspli` | Phase |
+| Debiased Squared Weighted Phase Lag Index | `dswpli` | Phase |
diff --git a/doc/website/docs/development/api-disp3d.mdx b/doc/website/docs/development/api-disp3d.mdx
new file mode 100644
index 00000000000..6dbaacfb433
--- /dev/null
+++ b/doc/website/docs/development/api-disp3d.mdx
@@ -0,0 +1,250 @@
+---
+title: Disp3D (RHI)
+sidebar_label: Disp3D (RHI)
+---
+
+# Disp3D — RHI-Based 3D Visualization
+
+Starting with MNE-CPP v2.0, the 3D visualization library has been rebuilt on top of Qt's **Rendering Hardware Interface (RHI)**. The library is now called `disp3D_rhi` (namespace `DISP3DRHILIB`). Unlike the previous Qt3D-based implementation, the RHI backend talks directly to the platform's native graphics API — Metal on macOS, Vulkan on Linux, Direct3D 11/12 on Windows, or OpenGL as a fallback — giving MNE-CPP a thinner, more portable rendering stack.
+
+:::info Why RHI?
+Qt3D provided a high-level scene-graph but added significant abstraction overhead. With RHI, the library manages its own render pipeline, vertex buffers, and shader programs directly, resulting in lower latency, smaller binary size, and better control over GPU resource lifetime — all critical for real-time neuroimaging visualization.
+:::
+
+## Architecture Overview
+
+The library follows a clean separation of concerns inspired by several well-known software patterns:
+
+- **Model–View separation** — The `BrainTreeModel` (a `QStandardItemModel`) owns all scene data and metadata. `BrainView` reads the model to decide *what* to show; `BrainRenderer` decides *how* to draw it. Neither the model nor the renderer know about each other directly — `BrainView` acts as the mediator.
+- **Retained-mode rendering** — Renderable objects (`BrainSurface`, `DipoleObject`, `NetworkObject`, `SourceEstimateOverlay`) each own their GPU resources (vertex buffers, index buffers, instance buffers, uniform buffers). They create these resources once on initialization and only update the data that changes per frame (e.g., vertex colors for a new time sample). This avoids per-frame allocation and keeps draw calls cheap.
+- **Strategy pattern for shaders** — The `BrainRenderer` maintains a set of pre-compiled shader pipelines (`Standard`, `Holographic`, `Anatomical`, `Dipole`, `XRay`, `ShowNormals`). Switching visual style is a pipeline swap, not a recompilation.
+- **Observer / worker pattern** — Real-time data (sensor streams, source estimates) flows through dedicated `QObject`-based workers running on background threads. Workers emit signals carrying per-vertex color arrays, which `BrainView` applies to the appropriate renderable before the next draw call. This keeps the render thread free from heavy computation.
+- **Composition over inheritance** — Rather than deep inheritance hierarchies (as in the old Qt3D design where every renderable was a `QEntity` subclass), the RHI design composes independent objects: a `BrainSurface` is *not* a widget or an entity — it is a plain C++ object that knows how to upload geometry and draw itself when asked.
+
+```mermaid
+classDiagram
+ class ViewLayer {
+ BrainView
+ MultiViewLayout
+ }
+
+ class RenderEngine {
+ BrainRenderer
+ GLSL Shaders
+ }
+
+ class RenderableObjects {
+ BrainSurface
+ DipoleObject
+ NetworkObject
+ SourceEstimateOverlay
+ }
+
+ class DataModel {
+ BrainTreeModel
+ Surface / BEM / Digitizer
+ Dipole / Network / SourceSpace
+ }
+
+ class Input {
+ CameraController
+ RayPicker
+ }
+
+ class Core {
+ RenderTypes
+ ViewState
+ DataLoader
+ }
+
+ class SceneManagers {
+ SensorFieldMapper
+ SourceEstimateManager
+ RtSensorStreamManager
+ }
+
+ class BackgroundWorkers {
+ RtSensorDataWorker
+ RtSensorInterpolationMatWorker
+ RtSourceDataWorker
+ StcLoadingWorker
+ }
+
+ ViewLayer --> RenderEngine : drives
+ RenderEngine --> RenderableObjects : draws
+ ViewLayer --> DataModel : reads
+ ViewLayer --> Input : delegates
+ ViewLayer --> SceneManagers : coordinates
+ SceneManagers --> BackgroundWorkers : dispatches
+```
+
+### Key Differences from the Qt3D Implementation
+
+| Aspect | Qt3D (v1.x) | RHI (v2.0) |
+|--------|-------------|------------|
+| **Widget base** | Custom `QWidget` + `QSurface3DFormat` | `QRhiWidget` |
+| **Render control** | Qt3D framegraph / scenegraph | Direct `QRhi` pipeline + command buffer |
+| **Shader language** | GLSL via Qt3D materials | GLSL compiled per-backend by Qt RHI |
+| **Data model** | `Data3DTreeModel` + `Renderable3DEntity` → `QEntity` | `BrainTreeModel` + `BrainSurface` / `DipoleObject` / `NetworkObject` |
+| **Multi-view** | Not built-in | `MultiViewLayout` with 1–4 panes |
+| **Instanced rendering** | `GeometryMultiplier` | Native QRhi instance buffers |
+| **Vertex picking** | Not implemented | `RayPicker` with CPU ray–triangle intersection |
+| **Graphics backends** | OpenGL only | Metal, Vulkan, D3D 11/12, OpenGL |
+
+## Module Breakdown
+
+### View Layer
+
+The view layer implements the **Mediator pattern** — `BrainView` sits between user input, the data model, and the renderer, coordinating their interactions without letting them reference each other directly.
+
+- **`BrainView`** — The top-level widget, inheriting from `QRhiWidget` (Qt's portable RHI surface widget). On each frame, Qt calls `BrainView::render()`, which assembles a `SceneData` struct containing the current MVP matrix, camera position, light direction, and overlay mode, then hands it to `BrainRenderer` for drawing. `BrainView` also handles all mouse/keyboard events and dispatches them to the `CameraController` (for orbit/zoom/pan) or `RayPicker` (for vertex selection). It supports two modes: `SingleView` with an interactive orbiting camera, and `MultiView` with up to four fixed-angle viewports (e.g., top, left, front, free).
+- **`MultiViewLayout`** — A pure-geometry helper with no widget dependencies. It stores fractional split positions and computes viewport rectangles, splitter hit-testing, and minimum pane sizes. `BrainView` queries this class for the pixel rectangles of each pane before issuing scissored draw calls. The layout supports 1, 2, 3, or 4 panes with draggable separators.
+
+### Render Engine
+
+The render engine is where the **Strategy pattern** is most visible. `BrainRenderer` holds a map of pre-compiled `QRhiGraphicsPipeline` objects — one per `ShaderMode` — and selects the appropriate pipeline at draw time.
+
+- **`BrainRenderer`** — The low-level workhorse. It creates and caches `QRhiGraphicsPipeline` objects, manages shared uniform buffers (for the scene-wide MVP and lighting data), and iterates over all visible renderables to issue draw calls. Each renderable provides its own vertex/index/instance buffers; `BrainRenderer` simply binds them and calls `drawIndexed()` or `draw()`. The renderer is stateless between frames — all per-frame data arrives via the `SceneData` struct, making it easy to render the same scene from multiple camera angles (multi-view).
+- **GLSL Shaders** — Six shader programs, each consisting of a `.vert` and `.frag` file. Qt's RHI layer compiles these at load time into the native shading language of the active backend (Metal Shading Language, SPIR-V for Vulkan, HLSL for D3D, or GLSL for OpenGL). The shaders receive per-vertex attributes (position, normal, packed ABGR color, packed ABGR annotation color) and a uniform block with the scene data. The `overlayMode` uniform controls which color channel the fragment shader samples — surface, annotation, scientific colormap, or source estimate.
+
+| Shader | Visual Style |
+|--------|-------------|
+| `standard` | Phong lighting (default) |
+| `holographic` | Two-sided holographic effect |
+| `anatomical` | Curvature-based coloring |
+| `dipole` | Dipole cone rendering |
+| `xray` | Semi-transparent x-ray |
+| `shownormals` | Surface-normal visualization |
+
+### Renderable Objects
+
+Renderables follow the **Self-Contained Resource** pattern — each object manages the full lifecycle of its GPU resources (creation, update, destruction) and exposes a uniform interface (`initResources()`, `updateResources()`, `draw()`) that `BrainRenderer` calls. This keeps the renderer agnostic about data types.
+
+| Class | Purpose | GPU Resources |
+|-------|---------|---------------|
+| `BrainSurface` | Cortical or BEM mesh with per-vertex curvature, annotation, and STC color channels | Vertex buffer (`VertexData`: pos, normal, ABGR base, ABGR annotation), index buffer, uniform buffer |
+| `DipoleObject` | Equivalent current dipoles rendered as instanced cones pointing in the moment direction | Shared cone geometry + per-instance transform/color buffer |
+| `NetworkObject` | Connectivity graph — nodes as instanced spheres (diameter ∝ degree), edges as instanced cylinders (diameter and color ∝ weight) | Shared sphere/cylinder geometry + per-instance transform/color buffers |
+| `SourceEstimateOverlay` | Per-vertex STC amplitude overlay streamed onto a `BrainSurface` | Updates the host surface's vertex color channel in-place |
+
+The `VertexData` struct deserves special mention. It packs four attributes into a compact interleaved layout:
+
+```cpp
+struct VertexData {
+ QVector3D pos; // vertex position
+ QVector3D norm; // vertex normal
+ uint32_t color; // curvature / base color (ABGR packed)
+ uint32_t colorAnnotation; // annotation region color (ABGR packed)
+};
+```
+
+Colors are stored as packed `uint32_t` values (`packABGR()`) rather than `QVector4D` floats, halving the per-vertex color footprint — a meaningful saving for high-resolution cortical meshes with 160 000+ vertices.
+
+### Data Model
+
+The data model applies the **Composite pattern** via Qt's `QStandardItemModel` tree structure. Every scene object is represented as a tree item; parent items group children logically (subject → hemisphere → surface, or subject → measurement → network). The tree can be displayed in a `QTreeView` to give users interactive visibility toggles, color pickers, and threshold sliders without any custom widget work.
+
+Crucially, tree items in the RHI design are **not** renderables. In the old Qt3D design, `Renderable3DEntity` *was* a `QEntity` — the data model and the scenegraph were one and the same. In the RHI design, tree items are pure data/metadata containers. `BrainView` reads the model to decide which `BrainSurface`, `DipoleObject`, or `NetworkObject` instances should be visible, then passes them to `BrainRenderer`. This separation makes it straightforward to render the same data in multiple viewports with different visibility profiles.
+
+| Tree Item | Data Source |
+|-----------|-----------|
+| `SurfaceTreeItem` | FreeSurfer surface + annotation |
+| `BemTreeItem` | BEM compartment surface |
+| `DigitizerTreeItem` / `DigitizerSetTreeItem` | HPI, fiducials, head-shape points |
+| `DipoleTreeItem` | `ECDSet` |
+| `NetworkTreeItem` | `Network` from the Connectivity library |
+| `SourceSpaceTreeItem` | `MNESourceSpace` |
+
+### Core
+
+The core module provides shared types and state that every other module depends on, without pulling in heavy Qt or QRhi headers.
+
+- **`RenderTypes`** — A lightweight header-only file defining `ShaderMode` and `VisualizationMode` enums and the `packABGR()` utility. It deliberately avoids any QRhi includes, so public API headers can use these enums without leaking GPU implementation details to downstream consumers.
+- **`ViewState`** — Captures all per-viewport settings: camera orientation, lighting parameters, and a `ViewVisibilityProfile` struct with independent boolean toggles for each data layer (LH, RH, BEM head, BEM outer skull, BEM inner skull, MEG sensors, etc.). Each viewport in a multi-view layout carries its own `ViewState`, enabling pane-specific views of the same dataset.
+- **`DataLoader`** — Centralized utilities for loading FreeSurfer surfaces, annotations, and BEM data into the model and creating the corresponding renderables.
+
+### Input
+
+Input handling is decoupled from the widget, following the **Strategy pattern** — `BrainView` delegates input interpretation to specialized objects rather than handling it in monolithic `mousePressEvent` overrides.
+
+- **`CameraController`** — A widget-independent camera that takes mouse delta values and produces a `CameraResult` struct (projection, view, and model matrices, plus camera position and up vector). It supports orbiting around a focus point, dolly zoom, and panning. Because it has no widget dependency, it can compute matrices for any viewport rectangle, which is how multi-view rendering works — `BrainView` calls `CameraController` once per pane with different viewport sizes.
+- **`RayPicker`** — Performs CPU-side ray–triangle intersection testing against all visible `BrainSurface` meshes. Given a mouse position and viewport rectangle, it unprojects a ray and walks the triangle list of each surface to find the closest intersection. The result is a `PickResult` carrying the hit point, surface key, vertex index, distance, and (if available) the FreeSurfer annotation region name and label ID. Dipole picking is also supported.
+
+### Scene Managers
+
+Scene managers encapsulate domain-specific logic that would otherwise bloat `BrainView`. Each manager owns the lifecycle of its workers and the mapping between raw data and renderable updates.
+
+- **`SensorFieldMapper`** — Computes and caches the sparse interpolation matrix that maps sensor-level data (MEG channels or EEG electrodes) onto a scalp or helmet surface mesh. When new samples arrive, it multiplies the data vector by the interpolation matrix to produce per-vertex color values.
+- **`SourceEstimateManager`** — Handles loading and streaming of MNE source estimates (STC files or real-time data). It manages the interpolation from source-space vertices to the high-resolution cortical surface mesh and drives the `SourceEstimateOverlay`.
+- **`RtSensorStreamManager`** — Lifecycle manager for `RtSensorDataController`. It encapsulates the start/stop/configure cycle of real-time sensor streaming, keeping `BrainView` clean. Internally it manages `RtSensorDataWorker` and `RtSensorInterpolationMatWorker` on background threads.
+
+### Background Workers
+
+Workers implement the **Producer–Consumer pattern** on Qt's thread infrastructure. Each worker lives on a dedicated `QThread` and communicates with the main/render thread via queued signal–slot connections. This guarantees that heavy computation (interpolation matrix construction, per-vertex color mapping) never blocks the render loop.
+
+| Worker | Role |
+|--------|------|
+| `RtSensorDataWorker` | Receives raw sensor samples, applies the interpolation matrix, and emits per-vertex color arrays ready for GPU upload |
+| `RtSensorInterpolationMatWorker` | Builds the sparse interpolation matrix mapping sensor positions to surface vertices (recomputed when sensor geometry changes) |
+| `RtSourceDataWorker` | Streams source-estimate samples and computes per-vertex STC colors |
+| `RtSourceInterpolationMatWorker` | Builds the source-space interpolation matrix |
+| `StcLoadingWorker` | Asynchronous STC file I/O — loads large `.stc` files without blocking the UI |
+
+## Usage
+
+### Quick Start — Visualizing a Brain Surface
+
+```cpp
+#include
+#include
+#include
+#include
+
+// Create view and model
+BrainView *view = new BrainView();
+BrainTreeModel *model = new BrainTreeModel();
+view->setModel(model);
+
+// Load FreeSurfer surfaces
+FSLIB::Surface surfLh("sample", 0, "inflated", subjectsDir);
+FSLIB::Surface surfRh("sample", 1, "inflated", subjectsDir);
+model->addSurface("sample", "lh", "inflated", surfLh);
+model->addSurface("sample", "rh", "inflated", surfRh);
+
+// Load annotations
+FSLIB::Annotation annotLh("sample", 0, "aparc", subjectsDir);
+model->addAnnotation("sample", "lh", annotLh);
+
+view->show();
+```
+
+### Adding a Connectivity Network
+
+```cpp
+#include
+#include
+
+// After computing connectivity (see Connectivity library docs)
+QList networks = Connectivity::calculate(settings);
+model->addNetwork(networks.first(), "PLI");
+```
+
+## Shader Modes and Visualization Modes
+
+The renderer supports multiple shader pipelines (`ShaderMode`) and surface overlay modes (`VisualizationMode`):
+
+| ShaderMode | Effect |
+|------------|--------|
+| `Standard` | Default Phong shading |
+| `Holographic` | Two-sided holographic effect |
+| `Anatomical` | Curvature-based coloring |
+| `Dipole` | Dipole cone rendering |
+| `XRay` | Semi-transparent x-ray effect |
+| `ShowNormals` | Surface normals as color |
+
+| VisualizationMode | Vertex Color Source |
+|-------------------|-------------------|
+| `ModeSurface` | Curvature-derived gray tones |
+| `ModeAnnotation` | Atlas / parcellation region colors |
+| `ModeScientific` | Scientific colormap |
+| `ModeSourceEstimate` | STC amplitude overlay |
diff --git a/doc/website/docs/development/api.mdx b/doc/website/docs/development/api.mdx
new file mode 100644
index 00000000000..766f34d1c4c
--- /dev/null
+++ b/doc/website/docs/development/api.mdx
@@ -0,0 +1,54 @@
+---
+title: Library API
+sidebar_label: Library API
+---
+
+# MNE-CPP Library API
+
+MNE-CPP provides a modular set of cross-platform C++ libraries built on [Qt](https://www.qt.io/) and [Eigen](http://eigen.tuxfamily.org/). All MNE-CPP applications — MNE Scan, MNE Analyze, MNE Anonymize, and the command-line tools — are built solely on these libraries, so any functionality available in an application can also be used programmatically.
+
+The libraries are organized in layers: low-level I/O and math utilities at the bottom, domain-specific processing in the middle, and visualization at the top.
+
+## Library Overview
+
+### Core Libraries
+
+| Library | Namespace | Purpose |
+|---------|-----------|---------|
+| **Utils** | `UTILSLIB` | Math routines (`MNEMath`), spectral analysis (FFT, CSD, PSD), spectrogram, TPS surface warping, sphere fitting, simplex solver, K-Means clustering, I/O helpers, `CircularBuffer`, application logger |
+| **Fs** | `FSLIB` | Load and save FreeSurfer surfaces and annotations |
+| **Fiff** | `FIFFLIB` | Read and write FIFF (Functional Imaging File Format) files |
+| **Mne** | `MNELIB` | Core data structures matching MNE-C: `ForwardSolution`, `InverseOperator`, `SourceEstimate`, `SourceSpace`, `BemSurface`, `EpochData`, and more |
+
+### Processing Libraries
+
+| Library | Namespace | Purpose |
+|---------|-----------|---------|
+| **Fwd** | `FWDLIB` | Forward solution computation from FreeSurfer reconstructions for MEG/EEG source localization |
+| **Inverse** | `INVERSELIB` | Source localization: MNE estimation, single dipole fitting, HPI coil fitting, RAP-MUSIC (with optional GPU/CUDA) |
+| **RtProcessing** | `RTPROCESSINGLIB` | Real-time processing: averaging, filtering, ICP, trigger detection, SPHARA; asynchronous workers for connectivity, HPI fitting, inverse computation, and noise estimation |
+| **Connectivity** | `CONNECTIVITYLIB` | Functional connectivity metrics (Correlation, Cross-Correlation, Coherence, Imaginary Coherence, PLV, PLI, WPLI, and variants) with network storage, graph measures, and thresholding |
+| **Communication** | `COMMUNICATIONLIB` | Client/command interface for communicating with `mne_rt_server` |
+
+### Visualization Libraries
+
+| Library | Namespace | Purpose |
+|---------|-----------|---------|
+| **Disp** | `DISPLIB` | 2D plot types (bar, graph, imagesc, lineplot, spline, tfplot) and ready-to-use `QWidget`-based viewers with GUI controls |
+| **Disp3D (RHI)** | `DISP3DRHILIB` | RHI-based 3D visualization: cortical surfaces, connectivity networks, digitizers, BEM models, source estimates, dipoles — supports Metal, Vulkan, D3D, and OpenGL backends |
+
+For in-depth guides on specific libraries, see the [Connectivity](api-connectivity.mdx) and [Disp3D (RHI)](api-disp3d.mdx) pages.
+
+## API Reference (Doxygen)
+
+The full auto-generated API documentation is available at the [API Reference](https://mne-cpp.github.io/doxygen-api/). Use these entry points to navigate:
+
+| Section | Description |
+|---|---|
+| [Namespace List](https://mne-cpp.github.io/doxygen-api/namespaces.html) | All namespaces with brief descriptions — one per library |
+| [Class List](https://mne-cpp.github.io/doxygen-api/annotated.html) | Alphabetical list of all classes, structs, and unions |
+| [Class Index](https://mne-cpp.github.io/doxygen-api/classes.html) | Compact alphabetical class index for quick lookup |
+| [Class Hierarchy](https://mne-cpp.github.io/doxygen-api/hierarchy.html) | Inheritance tree showing parent-child relationships |
+| [Class Members](https://mne-cpp.github.io/doxygen-api/functions.html) | Index of all documented class members |
+| [Namespace Members](https://mne-cpp.github.io/doxygen-api/namespacemembers.html) | All symbols declared at namespace scope |
+| [File List](https://mne-cpp.github.io/doxygen-api/files.html) | Source and header files with directory structure |
diff --git a/doc/website/docs/development/buildguide-cmake.mdx b/doc/website/docs/development/buildguide-cmake.mdx
new file mode 100644
index 00000000000..8d7c72764be
--- /dev/null
+++ b/doc/website/docs/development/buildguide-cmake.mdx
@@ -0,0 +1,153 @@
+---
+title: Build from Source
+sidebar_label: Build from Source
+---
+
+# Build from Source
+
+MNE-CPP uses **CMake** as its build system and requires **C++20** and **Qt 6**. This guide walks through compiling MNE-CPP from source on Windows, Linux, and macOS.
+
+## Prerequisites
+
+### CMake
+
+[CMake](https://cmake.org/download/) **3.15 or higher** is required.
+
+### Compiler
+
+MNE-CPP requires a compiler with **C++20 support**. The following compilers are tested in CI:
+
+| Windows | Linux | macOS |
+|---------|-------|-------|
+| [MSVC 2022](https://visualstudio.microsoft.com/vs/community/) (Visual Studio 2022 Community or higher. During installation select the **Desktop development with C++** workload.) | GCC 13+ (ships with Ubuntu 24.04) | Apple Clang via [Xcode](https://developer.apple.com/xcode/) (ships with macOS) |
+
+### Qt 6
+
+Qt 6 is the only external dependency. **Qt 5 is no longer supported.**
+
+1. Download and run the [Qt Online Installer](https://www.qt.io/download-qt-installer).
+2. Install **Qt 6.5 or higher** (CI currently tests with Qt 6.10.x) to a path without spaces. During installation, select:
+ - The compiler target for your platform (e.g., `MSVC 2022 64-bit`, `Desktop gcc 64-bit`, or `macOS`)
+ - **Qt Shader Tools** (required)
+3. After installation, add the Qt `bin` folder to your `PATH`:
+ - **Windows:** e.g. `C:\Qt\6.10.2\msvc2022_64\bin`
+ - **Linux:** e.g. `$HOME/Qt/6.10.2/gcc_64/bin` — also add the `lib` folder to `LD_LIBRARY_PATH`
+ - **macOS:** e.g. `$HOME/Qt/6.10.2/macos/bin` — also add the `lib` folder to `DYLD_LIBRARY_PATH`
+
+## Get the Source Code
+
+Fork [MNE-CPP's main repository](https://github.com/mne-tools/mne-cpp) to your own GitHub account. For a detailed guide on how to fork a repository, see the [GitHub documentation](https://help.github.com/en/github/getting-started-with-github/fork-a-repo).
+
+Clone the fork to your local machine:
+
+```bash
+git clone https://github.com//mne-cpp.git
+```
+
+Set up a remote pointing to the upstream repository:
+
+```bash
+git remote add upstream https://github.com/mne-tools/mne-cpp.git
+```
+
+To update to the latest changes:
+
+```bash
+git fetch --all
+git rebase upstream/v2.0-dev
+```
+
+## Compile the Source Code
+
+### Via Command Line
+
+Navigate to the `mne-cpp` root folder. We provide a cross-platform build script that automatically detects your platform, finds Qt, configures CMake, and builds:
+
+```bash
+./tools/build_project.bat
+```
+
+Common options:
+
+| Option | Description |
+|--------|-------------|
+| `help` | Show all available options |
+| `all` | Build everything (apps, examples, and tests) |
+| `static` | Build with static linking |
+| `Debug` | Build in Debug mode (default is Release) |
+| `clean` | Remove previous build before building |
+| `qt ` | Use a custom Qt installation path |
+
+Example — build everything in Release mode:
+```bash
+./tools/build_project.bat all
+```
+
+Alternatively, you can invoke CMake directly:
+
+```bash
+cmake -B build -S . -DCMAKE_BUILD_TYPE=Release
+cmake --build build --parallel $(nproc)
+```
+
+On **Windows** with MSVC, first activate the compiler environment, then build:
+
+```powershell
+# Open a Developer Command Prompt for VS 2022, or run:
+cmd.exe /c "call ""C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat"" && set > %temp%\vcvars.txt"
+
+cmake -B build -S . -DCMAKE_BUILD_TYPE=Release
+cmake --build build --config Release --parallel %NUMBER_OF_PROCESSORS%
+```
+
+#### CMake Options
+
+| Option | Default | Description |
+|--------|---------|-------------|
+| `BUILD_SHARED_LIBS` | `ON` | Build shared (dynamic) libraries |
+| `BUILD_APPLICATIONS` | `ON` | Build GUI applications |
+| `BUILD_EXAMPLES` | `ON` | Build example programs |
+| `BUILD_TESTS` | `OFF` | Build unit tests |
+| `BUILD_ALL` | `OFF` | Enable apps, examples, and tests |
+| `WASM` | `OFF` | Configure for WebAssembly (see [WebAssembly](wasm.mdx)) |
+| `NO_OPENGL` | `OFF` | Disable QOpenGLWidget support |
+
+### Via Qt Creator
+
+1. Open Qt Creator and select **File > Open File or Project**. Navigate to the `mne-cpp` root folder and select the top-level `CMakeLists.txt`.
+2. When prompted, select a kit with your Qt 6 installation — e.g. `Desktop Qt 6.10.2 MSVC2022 64bit`.
+3. Select **Release** mode in the lower-left corner.
+4. In the Projects pane, right-click the top-level `mne_cpp` target and select **Run CMake**.
+5. Right-click again and select **Build** (this may take some time).
+6. Once complete, built binaries are located in `mne-cpp/out/Release`.
+
+### Running Applications
+
+From **Qt Creator**, use the Run button in the lower-left toolbar. From the **command line**, navigate to `out/Release/apps` and run the desired application, e.g.:
+
+```bash
+./mne_scan
+```
+
+## Test the Build
+
+To verify your build, download the [MNE-Sample-Data-Set](https://osf.io/86qa2/download) and extract it to `mne-cpp/out/Release/resources/MNE-sample-data`. Then run one of the examples, e.g. `ex_disp_3D`. If the build is correct, a window with a 3D brain visualization and source localization result will appear.
+
+To build and run the unit tests:
+
+```bash
+./tools/build_project.bat all
+cd build/Release
+ctest --output-on-failure
+```
+
+## Deploy Qt Dependencies
+
+To run compiled applications outside of Qt Creator (e.g. from the terminal or file manager), Qt runtime libraries must be bundled. MNE-CPP provides a cross-platform deployment script:
+
+```bash
+./tools/deploy.bat dynamic pack # dynamic linking (recommended for development)
+./tools/deploy.bat static pack # static linking
+```
+
+The dynamically linked version is recommended for development. For more details, see the [Deployment](ci-deployment.mdx) page.
diff --git a/doc/website/docs/development/ci-deployment.mdx b/doc/website/docs/development/ci-deployment.mdx
new file mode 100644
index 00000000000..7515539f4e1
--- /dev/null
+++ b/doc/website/docs/development/ci-deployment.mdx
@@ -0,0 +1,66 @@
+---
+title: Deployment
+sidebar_label: Deployment
+---
+
+# Deployment
+
+This page explains how MNE-CPP handles deployment on Windows, Linux, and macOS. Deployment bundles the required Qt runtime libraries with the compiled applications so they can run outside of a development environment.
+
+## Build Rules
+
+All MNE-CPP libraries are built to the `mne-cpp/lib` folder. All applications, test, and examples are built to the `mne-cpp/out/Release` folder.
+
+## Dependency Solving
+MNE-CPP depends on [Qt](https://www.qt.io/) and [Eigen](http://eigen.tuxfamily.org/index.php?title=Main_Page). Eigen, as a lightweight template library, [is included in the MNE-CPP repository by default](https://github.com/mne-tools/mne-cpp/tree/main/include/3rdParty/eigen3) and does not need further dependency solving. For Qt dependencies we use Qt specific deployment tools (`windeployqt`, `linuxdeployqt`, `macdeployqt`).
+
+### Windows
+
+The `WinDynamic` workflow in [release.yml](https://github.com/mne-tools/mne-cpp/blob/main/.github/workflows/release.yml) excludes examples and tests. MNE-CPP libraries are copied to both `mne-cpp/lib` and `mne-cpp/out/Release`.
+
+Dependency resolution uses `windeployqt` (maintained by Qt), called from [deploy.bat](https://github.com/mne-tools/mne-cpp/blob/main/tools/deploy.bat) with `dynamic` as the first argument. It runs against:
+- The MNE Scan `.exe` (covers all application-level Qt modules)
+- The Disp3D `.dll` (the highest-level library, linking all needed Qt modules)
+
+Afterward, Qt and system libraries reside in `mne-cpp/out/Release`. The test data folder is deleted, and the output is compressed to a `.zip` file and uploaded as a release asset.
+
+### Linux
+
+The `LinuxDynamic` workflow in [release.yml](https://github.com/mne-tools/mne-cpp/blob/main/.github/workflows/release.yml) excludes examples and tests. CMake configures the `RPATH` to link against libraries in `mne-cpp/lib`.
+
+Dependency resolution uses [linuxdeployqt](https://github.com/probonopd/linuxdeployqt), called from the deployment script under `tools/deployment`.
+
+The test data folder is deleted, and the folders `out/Release/apps`, `out/Release/lib`, `out/Release/plugins`, and `out/Release/translations` are compressed to a `.tar.gz` file and uploaded as a release asset.
+
+### macOS
+
+The `MacOSDynamic` workflow in [release.yml](https://github.com/mne-tools/mne-cpp/blob/main/.github/workflows/release.yml) excludes examples and tests. All applications are built as `.app` bundles.
+
+Dependency resolution uses `macdeployqt` (maintained by Qt). MNE-CPP libraries are manually copied to each app's `Contents/Frameworks` folder, and resources and plugin folders are copied to the corresponding `.app` directories.
+
+Before packaging, standalone plugin folders (`mne_scan_plugins`, `mne_analyze_plugins`, `mne_rt_server_plugins`) and the `resources` symlink are deleted. The `out/Release` folder is compressed to a `.tar.gz` file and uploaded as a release asset.
+
+## Static Builds
+
+The information above corresponds to deploying the dynamically built version of MNE-CPP. In case of static deployment the process differs slightly. See the deployment scripts in `tools/deployment`.
+
+## Deployment Scripts
+
+The deployment scripts live in `tools/deployment`. Platform-specific scripts (`deploy.bat` for Windows, `deploy.sh` for Linux/macOS) handle dependency resolution and packaging.
+
+Each script accepts two arguments:
+
+1. **Linkage type**: `dynamic` (default) or `static`.
+2. **Packaging**: Pass `pack` as the second argument to generate a compressed archive (`.zip` or `.tar.gz`) containing all binaries and required libraries.
+
+During development, running the deployment script with just the `dynamic` argument is useful to resolve Qt dependencies for a particular MNE-CPP application without creating a full package.
+
+Example:
+
+```bash
+# Resolve Qt dependencies for development (no archive)
+./tools/deploy.bat dynamic
+
+# Create a distributable archive
+./tools/deploy.bat dynamic pack
+```
diff --git a/doc/website/docs/development/ci-ghactions.mdx b/doc/website/docs/development/ci-ghactions.mdx
new file mode 100644
index 00000000000..d651e75285d
--- /dev/null
+++ b/doc/website/docs/development/ci-ghactions.mdx
@@ -0,0 +1,107 @@
+---
+title: Github Actions
+sidebar_label: Github Actions
+---
+
+# Github Actions
+
+MNE-CPP uses [GitHub Actions](https://docs.github.com/en/actions) for all continuous integration (CI) work. GitHub Actions operates on repository events — pushes, pull requests, releases, and timers — which trigger **workflows** defined as YAML files in `.github/workflows/`. Each workflow contains one or more **jobs**, and each job runs a series of **steps** on a fresh virtual machine (runner). You can read more about the terminology in the [GitHub Actions documentation](https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions).
+
+## Workflow Overview
+
+The following table summarizes every CI workflow in MNE-CPP:
+
+| Event type | Workflow Name | Workflow Script | Effect |
+| ---------- | ------------- | --------------- | ------ |
+| Pull Requests | `PullRequest` | [pullrequest.yml](https://github.com/mne-tools/mne-cpp/blob/main/.github/workflows/pullrequest.yml) | Triggers checks to run on the PR code.|
+| Pushes/Merges to `main` | `Linux|MacOS|Win|WASM` | [release.yml](https://github.com/mne-tools/mne-cpp/blob/main/.github/workflows/release.yml) | Triggers the Development Release binaries to be updated with the most recently pushed changes. This workflow basically follows the idea of nightly builds. |
+| Publishing a new release with tag syntax `v0.x.y` | `Linux|MacOS|Win|WASM` | [release.yml](https://github.com/mne-tools/mne-cpp/blob/main/.github/workflows/release.yml) | Triggers stable release processing steps described in more detail [here](ci-releasecycle.mdx). |
+| Pushes to the `docu` branch | `DocuTest` | [docutest.yml](https://github.com/mne-tools/mne-cpp/blob/main/.github/workflows/docutest.yml) | Creates a new version of the documentation website and makes them accessible via the repository's `gh-pages` branch. |
+| Pushes to the `wasm` branch | `WasmTest` | [wasmtest.yml](https://github.com/mne-tools/mne-cpp/blob/main/.github/workflows/wasmtest.yml) | Creates new versions of the WebAssembly capable MNE-CPP applications and makes them accessible via the repository's `gh-pages` branch. |
+| Pushes to the `testci` branch | `TestCI` | [testci.yml](https://github.com/mne-tools/mne-cpp/blob/main/.github/workflows/testci.yml) | Triggers checks to run cross-platform build setups and tests without the need to create a Github PR. |
+| Timer runs out | `Coverity` | [coverity.yml](https://github.com/mne-tools/mne-cpp/blob/main/.github/workflows/coverity.yml) | Triggers every two days to run [Coverity](https://scan.coverity.com/projects/mne-tools-mne-cpp) static code analysis tools. |
+| Pushes to the `generateqt` branch | `BuildQtBinaries` | [buildqtbinaries.yml](https://github.com/mne-tools/mne-cpp/blob/main/.github/workflows/buildqtbinaries.yml) | Triggers builds of all needed Qt versions and makes them accesible as [artifacts via the Github Actions interface](https://help.github.com/en/actions/configuring-and-managing-workflows/persisting-workflow-data-using-artifacts). |
+
+## How the Pull Request Workflow Works
+
+When a contributor opens or updates a pull request, `pullrequest.yml` runs a build-and-test matrix across all supported platforms. The workflow typically:
+
+1. **Checks out** the PR branch.
+2. **Installs Qt** using a cached Qt installation or the `aqtinstall` action.
+3. **Configures CMake** with `BUILD_TESTS=ON` so that unit tests are included.
+4. **Builds** the entire project in Release mode.
+5. **Runs CTest** to execute all unit tests and reports pass/fail status back to the pull request.
+
+The PR cannot be merged until all matrix jobs pass. This ensures that every change is validated on Windows, Linux, and macOS before it reaches the `main` branch.
+
+## How the Release Workflow Works
+
+`release.yml` is the most complex workflow. It is triggered by two different events:
+
+- **Pushes to `main`** — produces a *development release* (nightly build). Dynamically linked binaries are built for all three desktop platforms and uploaded to the `DevBuilds` release on GitHub.
+- **Publishing a tagged release (`v0.x.y`)** — produces a *stable release*. Both dynamically and statically linked binaries are built, deployment scripts bundle Qt dependencies, and the resulting archives are uploaded as release assets.
+
+Each platform job follows the same high-level pattern: install Qt, configure CMake, build, deploy (bundle Qt libraries), package into an archive, and upload.
+
+## Testing CI Without a Pull Request
+
+The `testci` branch provides a convenient way to run the full CI matrix without opening a pull request. Push your changes to the `testci` branch on your fork:
+
+```bash
+git push origin :testci -f
+```
+
+Then check the **Actions** tab in your fork's GitHub page. This is especially useful for debugging platform-specific build failures before submitting a PR.
+
+## Workflow File Structure
+
+All workflow YAML files live in `.github/workflows/` and follow a common structure:
+
+```yaml
+name: WorkflowName
+
+on:
+ push:
+ branches: [main]
+ pull_request:
+ branches: [main]
+
+jobs:
+ build:
+ runs-on: ${{ matrix.os }}
+ strategy:
+ matrix:
+ os: [ubuntu-latest, macos-latest, windows-latest]
+ steps:
+ - uses: actions/checkout@v4
+ - name: Install Qt
+ # ...
+ - name: Configure
+ run: cmake -B build -S . -DCMAKE_BUILD_TYPE=Release
+ - name: Build
+ run: cmake --build build --parallel
+ - name: Test
+ run: cd build && ctest --output-on-failure
+```
+
+Key elements include the **trigger** (`on:`), the **matrix strategy** for cross-platform builds, and the **steps** that install dependencies, compile, test, and optionally deploy.
+
+## Secrets and Environment Variables
+
+Some workflows require GitHub repository secrets (configured in **Settings → Secrets and variables → Actions**):
+
+| Secret | Used by | Purpose |
+|--------|---------|---------|
+| `GITHUB_TOKEN` | All release workflows | Automatically provided; used to upload release assets |
+| `COVERITY_TOKEN` | `coverity.yml` | Authentication token for Coverity Scan |
+
+## Adding or Modifying a Workflow
+
+To add a new workflow:
+
+1. Create a new `.yml` file in `.github/workflows/`.
+2. Define the trigger event (`on:`) — push, pull_request, schedule, or workflow_dispatch.
+3. Define one or more jobs with the appropriate runner (`runs-on:`) and steps.
+4. Test the workflow by pushing to a feature branch or using `workflow_dispatch`.
+
+To modify an existing workflow, edit the corresponding `.yml` file and push the change. If the modification affects the PR workflow, open a PR to see the results immediately.
diff --git a/doc/website/docs/development/ci-releasecycle.mdx b/doc/website/docs/development/ci-releasecycle.mdx
new file mode 100644
index 00000000000..fff7c061053
--- /dev/null
+++ b/doc/website/docs/development/ci-releasecycle.mdx
@@ -0,0 +1,102 @@
+---
+title: Release Guide
+sidebar_label: Release Guide
+---
+
+# Release Guide
+
+This page describes the complete process for creating a new MNE-CPP release, from preparation through publication.
+
+## Versioning Scheme
+
+MNE-CPP follows [Semantic Versioning](https://semver.org/) with the tag syntax `v..`:
+
+| Component | When to increment | Example |
+|-----------|-------------------|---------|
+| **Major** | Breaking API changes or major architectural redesign | `v1.0.0` → `v2.0.0` |
+| **Minor** | New features, new plugins, significant enhancements | `v0.1.0` → `v0.2.0` |
+| **Patch** | Bug fixes, documentation corrections, small improvements | `v0.1.0` → `v0.1.1` |
+
+## Branch Strategy
+
+New development takes place on the `main` branch. When a new **minor** release is created (e.g., going from `v0.1.x` to `v0.2.0`), a release branch named `v0.x.y` is automatically created from `main`. This branch receives only critical bug-fix back-ports and serves as the stable base for patch releases.
+
+```
+main ──────●──────●──────●──────●──────●───► (ongoing development)
+ \ \
+ v0.1.0 v0.2.0 (release branches)
+ \ \
+ v0.1.1 ··· (patch releases)
+```
+
+## Release Steps
+
+Once the developers have rough consensus that `main` is ready for a new release, the following steps are performed:
+
+### 1. Increment Version Numbers (Manual)
+
+Update the version string in these files:
+
+- **[CMakeLists.txt](https://github.com/mne-tools/mne-cpp/blob/main/CMakeLists.txt)** — the top-level project version (`project(mne_cpp VERSION 0.x.y)`)
+- **[mne-cpp_doxyfile](https://github.com/mne-tools/mne-cpp/blob/main/doc/doxygen/mne-cpp_doxyfile)** — the Doxygen `PROJECT_NUMBER` field
+
+### 2. Update Application Version Info (Manual)
+
+Bump the version constants in each application's `info.h`:
+
+- [MNE Scan info.h](https://github.com/mne-tools/mne-cpp/blob/main/applications/mne_scan/mne_scan/info.h)
+- [MNE Analyze info.h](https://github.com/mne-tools/mne-cpp/blob/main/applications/mne_analyze/mne_analyze/info.h)
+
+### 3. Update the Release Table on the Website (Manual)
+
+Add the new version to the documentation website's download / release page so users can find it.
+
+### 4. Prepare the Changelog (Manual)
+
+The changelog for the release being prepared is maintained on the [GitHub Wiki (Changelog-WIP)](https://github.com/mne-tools/mne-cpp/wiki/Changelog-WIP). To generate contributor statistics since the last release:
+
+```bash
+git shortlog -s -n main --no-merges --since=""
+```
+
+Move the work-in-progress changelog entries into the release notes.
+
+### 5. Create the GitHub Release (Manual)
+
+Go to the [GitHub Releases page](https://github.com/mne-tools/mne-cpp/releases) and create a new release:
+
+- **Tag**: `v0.x.y` (create the tag on `main`)
+- **Title**: `v0.x.y`
+- **Description**: Paste the changelog prepared in step 4
+
+### 6. CI Creates a Release Branch (Automated)
+
+The [release.yml](https://github.com/mne-tools/mne-cpp/blob/main/.github/workflows/release.yml) workflow detects the new tag and:
+
+- Creates a branch named `v0.x.y` from `main` (only for **minor** or **major** version bumps, e.g., `v0.1.0` → `v0.2.0`)
+- Skips branch creation for patch releases, since the branch already exists
+
+### 7. CI Builds and Uploads Binaries (Automated)
+
+The same `release.yml` workflow:
+
+- Builds **dynamically linked** binaries for Windows, Linux, and macOS
+- Builds **statically linked** binaries for all platforms
+- Runs the deployment scripts (`tools/deploy.bat` / `tools/deploy.sh`) to bundle Qt dependencies
+- Packages the output into `.zip` (Windows) or `.tar.gz` (Linux/macOS) archives
+- Uploads the archives as release assets to the GitHub release created in step 5
+
+### 8. Protect the New Branch (Manual)
+
+For minor or major version bumps, add branch protection rules for the newly created `v0.x.y` branch via the GitHub web interface (**Settings → Branches → Add rule**):
+
+- Require pull request reviews before merging
+- Require status checks to pass
+
+## Post-Release
+
+After the release is published:
+
+- Verify that the release assets (binaries) are downloadable and functional
+- Announce the release on relevant channels (mailing lists, website news, etc.)
+- Clear the work-in-progress changelog on the [GitHub Wiki](https://github.com/mne-tools/mne-cpp/wiki/Changelog-WIP) for the next development cycle
diff --git a/doc/website/docs/development/ci.mdx b/doc/website/docs/development/ci.mdx
new file mode 100644
index 00000000000..cf5634dea28
--- /dev/null
+++ b/doc/website/docs/development/ci.mdx
@@ -0,0 +1,30 @@
+---
+title: Continuous Integration
+sidebar_label: Continuous Integration
+---
+
+# Continuous Integration
+
+Every change to MNE-CPP is automatically built, tested, and — for releases — packaged across **Windows, Linux, and macOS** before it reaches users. The CI system runs on [GitHub Actions](https://docs.github.com/en/actions) and is triggered by pull requests, pushes to `main`, tagged releases, and dedicated test branches.
+
+Pull requests cannot be merged until all platform jobs pass. Development builds (nightly) are published on every push to `main`; stable release binaries are created when a version tag (`v0.x.y`) is published.
+
+## Guides
+
+- **[GitHub Actions](ci-ghactions.mdx)** — Workflow overview, the pull-request and release pipelines, secrets, and how to add or modify workflows.
+- **[Unit Testing](writingtest.mdx)** — How to write and run unit tests using Qt Test, including test structure, reference data, and naming conventions.
+- **[Deployment](ci-deployment.mdx)** — How Qt dependencies are bundled on each platform using `windeployqt`, `linuxdeployqt`, and `macdeployqt`.
+- **[Release Guide](ci-releasecycle.mdx)** — The step-by-step process for creating a new stable release, from version bumps to automated binary uploads.
+
+## At a Glance
+
+| Branch / Event | Workflow | What Happens |
+|----------------|----------|--------------|
+| Pull request | `pullrequest.yml` | Build + test on all platforms |
+| Push to `main` | `release.yml` | Development release (nightly binaries) |
+| Tag `v0.x.y` | `release.yml` | Stable release with static + dynamic binaries |
+| Push to `testci` | `testci.yml` | Full CI matrix without opening a PR |
+| Push to `wasm` | `wasmtest.yml` | WebAssembly build deployed to GitHub Pages |
+| Push to `docu` | `docutest.yml` | Documentation website rebuilt and published |
+
+Contributors should follow the [contribution workflow](contr-guide.mdx) to ensure their changes pass all CI checks before requesting a review.
diff --git a/doc/website/docs/development/contr-docuimprovements.mdx b/doc/website/docs/development/contr-docuimprovements.mdx
new file mode 100644
index 00000000000..d0ac931a779
--- /dev/null
+++ b/doc/website/docs/development/contr-docuimprovements.mdx
@@ -0,0 +1,56 @@
+---
+title: Contributing to the Website
+sidebar_label: Contributing to the Website
+---
+
+# Contributing to the Website
+
+This page shows you how to contribute to MNE-CPP's documentation website. As with other code contributions, you will need to fork MNE-CPP's repository on GitHub and then submit a pull request.
+
+The documentation website is built with [Docusaurus](https://docusaurus.io/) and lives inside the repository at `doc/website/`. Content pages are written in MDX (`.mdx` files) and can be found in `doc/website/docs/`.
+
+## Local Development
+
+### Prerequisites
+
+Make sure you have [Node.js](https://nodejs.org/) (v18 or later) installed.
+
+### Install Dependencies
+
+```bash
+cd doc/website
+npm install
+```
+
+### Start a Local Development Server
+
+```bash
+npx docusaurus start
+```
+
+This launches a local server (typically at `http://localhost:3000/`) with hot-reload — any changes you save to `.md` or configuration files will be reflected in the browser immediately.
+
+### Build for Production
+
+To verify your changes produce a clean production build:
+
+```bash
+npx docusaurus build
+```
+
+The build will catch broken links and other issues. Fix any errors before submitting your pull request.
+
+### Serve the Production Build
+
+```bash
+npx docusaurus serve
+```
+
+## Making Changes
+
+1. Create a feature branch from `main`.
+2. Navigate to `doc/website/docs/` and edit or add `.mdx` files.
+3. If you add a new page, register it in `doc/website/sidebars.ts`.
+4. Preview your changes locally with `npx docusaurus start`.
+5. Run `npx docusaurus build` to verify there are no broken links.
+6. Commit, push, and open a pull request.
diff --git a/doc/website/docs/development/contr-git.mdx b/doc/website/docs/development/contr-git.mdx
new file mode 100644
index 00000000000..3866a82f055
--- /dev/null
+++ b/doc/website/docs/development/contr-git.mdx
@@ -0,0 +1,85 @@
+---
+title: Git Workflow
+sidebar_label: Git Workflow
+---
+
+# Git Workflow
+
+This page gives a concise overview of the Git commands used in the MNE-CPP development workflow. For a deeper introduction, see this [Git tutorial video](https://www.youtube.com/watch?v=DtLrWCFaG0A&feature=youtu.be). For the full contribution process — from forking to pull request — see the [Contribution Guide](contr-guide.mdx).
+
+## Initial Setup
+
+As described in the [Build from Source](buildguide-cmake.mdx) guide, start by cloning your fork and adding the upstream remote:
+
+```bash
+git clone https://github.com//mne-cpp.git
+git remote add upstream https://github.com/mne-tools/mne-cpp.git
+git fetch --all
+git rebase upstream/main
+```
+
+## Daily Workflow
+
+The general workflow is covered by the following steps:
+
+- Create a new branch from `main`:
+
+```bash
+git checkout -b main
+```
+
+- Get the latest changes and [rebase](https://www.atlassian.com/git/tutorials/rewriting-history/git-rebase):
+
+```bash
+git fetch upstream
+git rebase upstream/main
+```
+
+- Solve [merge conflicts](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/resolving-a-merge-conflict-using-the-command-line), if they occur.
+
+- Make your changes and check the status:
+
+```bash
+git status
+```
+
+- Add unstaged changes (shown in red) to prepare the next commit:
+
+```bash
+git add
+# or add all changes:
+git add --all
+```
+
+- Commit the staged files (shown in green) with a meaningful message following our [commit policy](contr-style.mdx):
+
+```bash
+git commit -m "FIX: meaningful commit message"
+# or commit all tracked changes:
+git commit --all
+```
+
+- If you make small changes related to the previous commit, amend them:
+
+```bash
+git commit -m "FIX: meaningful commit message" --amend
+```
+
+- Push your changes to origin (your fork on GitHub). Note that a force push (`-f`) may be necessary after a rebase:
+
+```bash
+git push origin
+# or force push after rebase:
+git push origin -f
+```
+
+## Useful Commands
+
+| Command | Purpose |
+|---------|--------|
+| `git log --oneline -20` | Show the last 20 commits in compact form |
+| `git diff` | Show unstaged changes |
+| `git diff --staged` | Show staged changes |
+| `git stash` / `git stash pop` | Temporarily shelve and restore changes |
+| `git branch -d ` | Delete a local branch after merging |
+| `git remote -v` | List configured remotes |
diff --git a/doc/website/docs/development/contr-guide.mdx b/doc/website/docs/development/contr-guide.mdx
new file mode 100644
index 00000000000..6269b454034
--- /dev/null
+++ b/doc/website/docs/development/contr-guide.mdx
@@ -0,0 +1,131 @@
+---
+title: Contribution Guide
+sidebar_label: Contribution Guide
+---
+
+# Contribution Guide
+
+MNE-CPP is an open-source project and is made better by contributions from our users. Whether you are fixing a bug, adding a new feature, or improving documentation, this guide walks you through the entire contribution workflow — from setting up your development environment to getting your code merged.
+
+## Prerequisites
+
+Before you begin, make sure you have:
+
+- A [GitHub account](https://github.com/join)
+- [Git](https://git-scm.com/) installed on your machine
+- A working MNE-CPP [build from source](buildguide-cmake.mdx) setup (CMake, C++20 compiler, Qt 6)
+- Familiarity with our [coding conventions](contr-style.mdx)
+
+## Step-by-Step Workflow
+
+### 1. Fork and Clone
+
+Fork [MNE-CPP's main repository](https://github.com/mne-tools/mne-cpp) to your own GitHub account, then clone it locally:
+
+```bash
+git clone https://github.com//mne-cpp.git
+cd mne-cpp
+git remote add upstream https://github.com/mne-tools/mne-cpp.git
+```
+
+### 2. Create a Feature Branch
+
+Always work on a dedicated branch — never commit directly to `main`:
+
+```bash
+git fetch upstream
+git checkout -b my-feature upstream/main
+```
+
+Choose a descriptive branch name, e.g., `fix-fiff-reader-crash` or `add-lsl-plugin`.
+
+### 3. Make Your Changes
+
+Implement your feature, bug fix, or documentation update. Follow the [coding conventions](contr-style.mdx) and make sure to:
+
+- Use meaningful commit messages with the appropriate prefix (`FIX:`, `ENH:`, `MAINT:`, `DOC:`)
+- Document new functions with Doxygen-style comments and the `@since` tag
+- Make atomic commits — each commit should be a single self-contained change
+
+### 4. Run Tests Locally
+
+Make sure your changes do not break existing functionality:
+
+```bash
+# Ensure the test data submodule is available
+git submodule update --init resources/data/mne-cpp-test-data
+
+# Build with tests enabled
+cmake -B build -S . -DBUILD_TESTS=ON -DCMAKE_BUILD_TYPE=Release
+cmake --build build --parallel
+
+# Run all tests
+cd build
+ctest --output-on-failure
+```
+
+If you added new functionality, write unit tests for it. See [Writing Tests](writingtest.mdx) for guidance.
+
+### 5. Test on CI Without a Pull Request
+
+Before opening a formal PR, you can validate your changes across all platforms by pushing to the `testci` branch on your fork:
+
+```bash
+git push origin my-feature:testci -f
+```
+
+Check the **Actions** tab on your forked repository's GitHub page. Fix any platform-specific failures before proceeding.
+
+### 6. Push to Your Fork
+
+Once local tests pass, push your feature branch:
+
+```bash
+git push origin my-feature
+```
+
+### 7. Open a Pull Request
+
+Go to your fork on GitHub and create a pull request:
+
+1. Click **New pull request** next to the branch selector.
+2. Set the **base repository** to `mne-tools/mne-cpp` and the **base branch** to `main`.
+3. Set the **compare branch** to your feature branch.
+4. Give the PR a descriptive title using the commit prefix convention (e.g., `ENH: Add LSL acquisition plugin`).
+5. In the description, explain what your changes do, why they are needed, and how to test them.
+
+For a detailed overview of how to make a pull request, see the [guide on the official GitHub website](https://git-scm.com/book/en/v2/GitHub-Contributing-to-a-Project).
+
+### 8. Code Review and Iteration
+
+After you create the pull request:
+
+- The [CI pipeline](ci.mdx) will automatically run builds and tests on all platforms.
+- MNE-CPP maintainers will review your code and may request changes.
+- Address review comments by making additional commits on your feature branch and pushing them — they are automatically added to the existing PR. There is no need to create a new pull request.
+- Once all CI checks pass and the reviewers approve, your code will be merged.
+
+### 9. Clean Up
+
+After your PR is merged, you can delete the feature branch:
+
+```bash
+git checkout main
+git branch -d my-feature
+git push origin --delete my-feature
+```
+
+Keep your fork's `main` branch up to date:
+
+```bash
+git fetch upstream
+git rebase upstream/main
+git push origin main
+```
+
+## Tips for a Smooth Review
+
+- **Keep PRs focused.** A PR that does one thing well is easier to review than one that mixes features, refactoring, and bug fixes.
+- **Write tests.** PRs with tests are reviewed faster and merged with more confidence.
+- **Respond promptly.** Address reviewer feedback within a few days to keep momentum.
+- **Ask questions.** If you are unsure about an approach, open a draft PR or start a discussion — maintainers are happy to help.
diff --git a/doc/website/docs/development/contr-mnetracer.mdx b/doc/website/docs/development/contr-mnetracer.mdx
new file mode 100644
index 00000000000..e92fbb356bd
--- /dev/null
+++ b/doc/website/docs/development/contr-mnetracer.mdx
@@ -0,0 +1,89 @@
+---
+title: MNE Tracer
+sidebar_label: MNE Tracer
+---
+
+# MNE Tracer
+
+> *It is very hard to improve what you cannot measure.*
+
+During development it is common to have to decide between two (or more) different but equivalent implementations. We value improving code maintainability and coherence on top of achieving efficient implementations. But it is not uncommon to find situations where two solutions seem equally valid. Being able to understand the performance implications of each option helps make informed decisions and learn through the process. MNE Tracer was designed for exactly these situations — it is a code tracing tool that records when specified methods are executed.
+
+MNE Tracer writes a JSON file where each traced function call is recorded as an event. The format is compatible with Google Chrome’s built-in tracer (`chrome://tracing`) and with QtCreator’s tracer plugin. To visualize your trace, open Chrome, navigate to `chrome://tracing`, and load the generated JSON file.
+
+
+
+## Adding MNE Tracer to Your Code
+
+There are three steps to integrate MNE Tracer:
+
+1. **Link the Utils library.** The tracing functionality lives in the Utils library (`src/libraries/utils`). If you are using the standard MNE-CPP build setup, Utils is linked by default. Verify that it is listed in your target’s `CMakeLists.txt`.
+
+2. **Define the `TRACE` macro.** You can do this by passing `-DTRACE=ON` to CMake or by adding `#define TRACE` before including the MNE Tracer header:
+
+```bash
+cmake -B build -S . -DTRACE=ON
+```
+
+3. **Include the header.** Add `#include ` to the files you want to trace. A convenient approach is to include it in your project’s `*_global.h` header, which is typically included by every source file in the project.
+
+With the Utils library linked, the `TRACE` macro defined, and the header included, MNE Tracer is ready to use.
+## Using MNE Tracer
+
+### Enabling and Disabling the Tracer
+
+Before recording any function calls, initialize the tracer output file with `MNE_TRACER_ENABLE(filename.json)`. The file name can describe the particular test you are running. The file is saved in the same directory as your application binary.
+
+After this call, every function marked as traceable will be recorded. When you are done tracing, close and finalize the output file with `MNE_TRACER_DISABLE`. No tracing occurs after this point.
+
+For example, in an application’s `main()` function:
+
+```cpp
+int main(int argc, char *argv[])
+{
+ MNE_TRACER_ENABLE(filename.json)
+
+ //... your application starts here
+ //... you can trace specific function calls
+ //... at this point by adding the
+ //... macro MNE_TRACE() to your code.
+
+ MNE_TRACER_DISABLE
+
+ return returnValue;
+}
+```
+
+### Specifying Which Functions to Trace
+
+In a typical C++ application, many generic function calls occur to execute a specific piece of code. To focus on only the functions you care about, add the `MNE_TRACE()` macro as the first line after the opening brace of each function you want to trace:
+
+```cpp
+void ImportantClass::importantMethod(int a)
+{
+ MNE_TRACE()
+ //...the method continues here
+ //...
+}
+```
+### Automatically Tracing All Methods in a Class
+
+If you want to trace every method in a class without manually adding `MNE_TRACE()` to each one, use the provided Python helper script at `tools/mnetracer.py`:
+
+- **Add** the `MNE_TRACE()` macro to every method:
+
+```bash
+python tools/mnetracer.py file= mode=add
+```
+
+- **Remove** only the automatically added macros (manually placed `MNE_TRACE()` calls are preserved):
+
+```bash
+python tools/mnetracer.py file= mode=delete
+```
+
+- **Remove all** `MNE_TRACE()` occurrences, including manually placed ones:
+
+```bash
+python tools/mnetracer.py file= mode=deleteAll
+```
diff --git a/doc/website/docs/development/contr-style.mdx b/doc/website/docs/development/contr-style.mdx
new file mode 100644
index 00000000000..a485f12a0cd
--- /dev/null
+++ b/doc/website/docs/development/contr-style.mdx
@@ -0,0 +1,117 @@
+---
+title: Coding Conventions
+sidebar_label: Coding Conventions
+---
+
+# Coding Conventions
+
+## Naming
+
+Please make use of the following coding conventions when contributing to MNE-CPP:
+
+|Object|Rule|
+| --------------- | ------------------- |
+|Namespace |`MYNAMESPACE` |
+|Classes |`MyClass` |
+|Member functions |`myFunction` |
+|Member variables |`m_typeMeaningfulName` |
+|Local variables |`typeMeaningfulName` |
+
+## Readability and Documentation
+
+Use meaningful variable names and type indicators. Avoid complex as well as condensed expressions. For example:
+
+```cpp
+int iNumChs = 306;
+QString sChName = "MEG0000";
+void loadTxtFile(const QString& sPath);
+```
+
+In general, try to make your code match the surrounding style — indentation, line breaks, etc. Use Doxygen-style comments to document your code (see [example](https://github.com/mne-tools/mne-cpp/blob/main/libraries/connectivity/network/network.h)). When introducing new functions, include the `@since` tag with the current version. Always align function parameters in `.h` and `.cpp` files:
+
+```cpp
+//=========================================================================================================
+/**
+ * Constructs a FileLoader object.
+ *
+ * @param[in] iOpenMode The open mode. 0=ReadWrite, 1=WriteOnly, 1=ReadOnly
+ * @param[in] bSkipEmptyLines Whether to skip empty lines.
+ * @param[in] sCommentIdentifier String to identify comments. Default is empty which
+ * results in comments being read as normal lines.
+ * @since 0.1.1
+ */
+FileLoader(int iOpenMode,
+ bool bSkipEmptyLines,
+ const QString& sCommentIdentifier = "");
+```
+
+## MNE-CPP Class Templates
+
+MNE-CPP provides class templates under `resources/wizards/mnecpp/` that follow the project's coding conventions. These templates can help you quickly scaffold new classes that are consistent with the existing codebase.
+
+### Using with QtCreator
+
+If you use QtCreator as your IDE, you can install these templates as wizards:
+
+1. Copy the `resources/wizards/mnecpp` folder to your QtCreator wizard directory. The location varies by OS — see the [Qt documentation](https://doc.qt.io/qtcreator/creator-project-wizards.html) for details.
+2. Restart QtCreator.
+3. The MNE-CPP category will appear in the new file/class wizard.
+
+## Command Line Outputs
+
+Every output should start with `[]`. Please make use of `qDebug()` during development and `qInfo()` for general user information. `qWarning()` should be used to alert about unusual situations that do not lead to a termination of the application. `qCritical()` should only be used if an error was caught that will lead to the application being terminated. For example:
+
+```cpp
+void FileLoader::loadTxtFile(const QString& sPath)
+{
+ qInfo() << "[FileLoader::loadTxtFile] Working on file" << sPath;
+
+ if(!sPath.contains(".txt")) {
+ qWarning() << "[FileLoader::loadTxtFile] The file does not end with .txt."
+ }
+
+ QFile file(sPath);
+ if (!file.open(QIODevice::ReadOnly)) {
+ qCritical() << "[FileLoader::loadTxtFile] Unable to open file."
+ return;
+ }
+ // ...
+}
+```
+
+| **Please note:** Eigen objects (`MatrixXd`, `VectorXd`, etc.) can only be plotted via `std::cout`.|
+
+## Commit Policy
+
+A good commit should follow:
+
+ * If you add new functions/classes, ensure everything is documented properly.
+ * All code should follow the Coding Conventions & Style.
+ * Write new unit tests for the bugs you fixed or functionality you added.
+ * Commit often! In particular: Make atomic commits. This means that each commit should contain exactly one self-contained change - do not mix unrelated changes, and do not create inconsistent states. Never "hide" unrelated fixes in bigger commits.
+ * Write descriptive commit messages. Make them self-contained, so people do not have to research the historical context to make sense of them.
+ * And most importantly: use your brain :)
+
+For better readability, we introduced conventions for PR naming and commit messages. This gives a first impression about the content of a commit and improves the commit history's readability. Please use the following identifiers:
+
+| Short | Meaning |
+|-------|-----------------------------------------------|
+| FIX | bug fix |
+| ENH | enhancement (new features, etc.) |
+| MAINT | maintenance commit (refactoring, typos, style fixes, etc.) |
+| DOC | documentation |
+
+The following examples show how such commit messages could look like:
+```
+FIX: fix namespace error
+ENH: add cHPI in Neuromag Plugin
+MAINT: improved GitHubAction workflow for Linux deployment
+DOC: add documentation for new amplifier in MNE Scan
+```
+
+## MNE-CPP Documentation in QtCreator
+
+You can integrate MNE-CPP's API documentation into QtCreator's Help mode (F1):
+
+ * Download the `mne-cpp-doc-qtcreator.qch` file from the [MNE-CPP releases page](https://github.com/mne-tools/mne-cpp/releases).
+ * In QtCreator, go to **Tools → Options → Help → Documentation → Add** and select the `.qch` file.
diff --git a/doc/website/docs/development/contribute.mdx b/doc/website/docs/development/contribute.mdx
new file mode 100644
index 00000000000..ea64e06d15d
--- /dev/null
+++ b/doc/website/docs/development/contribute.mdx
@@ -0,0 +1,36 @@
+---
+title: Contribute
+sidebar_label: Contribute
+---
+
+# Contribute
+
+MNE-CPP is an open-source project and welcomes contributions of all kinds — code, documentation, bug reports, and feature requests. Whether you are fixing a typo or adding a new acquisition plugin, the workflow is the same: fork, branch, implement, test, and open a pull request.
+
+All code contributions are reviewed by maintainers and validated by the [CI pipeline](ci.mdx) across Windows, Linux, and macOS before merging.
+
+## Guides
+
+- **[Contribution Guide](contr-guide.mdx)** — The complete workflow from fork to merged pull request, including branching, testing on CI, and code review.
+- **[Coding Conventions](contr-style.mdx)** — Naming rules, documentation style (Doxygen), commit message prefixes, and class templates.
+- **[Git Workflow](contr-git.mdx)** — Day-to-day Git commands for branching, rebasing, and pushing to your fork.
+- **[Documentation](contr-docuimprovements.mdx)** — How to edit or add pages to this Docusaurus website.
+- **[MNE Tracer](contr-mnetracer.mdx)** — A built-in profiling tool for measuring function execution times.
+
+## Quick Start
+
+```bash
+# 1. Fork on GitHub, then clone
+git clone https://github.com//mne-cpp.git && cd mne-cpp
+git remote add upstream https://github.com/mne-tools/mne-cpp.git
+
+# 2. Create a feature branch
+git checkout -b my-feature upstream/main
+
+# 3. Build, make changes, run tests
+cmake -B build -S . -DBUILD_TESTS=ON && cmake --build build --parallel
+cd build && ctest --output-on-failure
+
+# 4. Push and open a pull request
+git push origin my-feature
+```
diff --git a/doc/website/docs/development/scan-acq.mdx b/doc/website/docs/development/scan-acq.mdx
new file mode 100644
index 00000000000..cff77759e32
--- /dev/null
+++ b/doc/website/docs/development/scan-acq.mdx
@@ -0,0 +1,102 @@
+---
+title: Acquisition plugins in MNE Scan
+sidebar_label: Acquisition Plugins
+---
+
+# Acquisition Plugins in MNE Scan
+
+Acquisition plugins (also called sensor plugins) are the entry point for all data in MNE Scan. They interface with hardware devices or data sources — EEG amplifiers, MEG systems, file readers, or simulated signals — and stream data into the real-time processing pipeline.
+
+## Three-Tier Architecture
+
+All acquisition plugins follow a consistent three-tier architecture that separates concerns between the MNE Scan framework, the data acquisition logic, and the hardware driver:
+
+| Tier | Class Role | Responsibilities |
+|------|-----------|------------------|
+| **Plugin** (top) | Main plugin class, inherits from `AbstractSensor` | Communicates with MNE Scan; manages the GUI (setup widget, toolbar buttons); creates and owns the Producer |
+| **Producer** (middle) | Data acquisition controller | Manages the acquisition thread; pulls data from the Driver and pushes it into ring buffers; bridges Plugin ↔ Driver |
+| **Driver** (bottom) | Hardware/device interface | Directly communicates with the device SDK or API; handles device initialization, parameter configuration, and raw sample retrieval |
+
+This separation means that the Plugin and Producer classes are structurally similar across all acquisition plugins — only the Driver class changes significantly depending on the hardware.
+
+```
+┌─────────────────────────────────┐
+│ MNE Scan │
+│ (plugin pipeline framework) │
+└──────────┬──────────────────────┘
+ │ ← AbstractSensor interface
+┌──────────▼──────────────────────┐
+│ Plugin Class │
+│ (e.g. GUSBamp, BabyMEG, │
+│ FiffSimulator, LSLAdapter) │
+│ • GUI setup widget │
+│ • Start/stop acquisition │
+│ • Output connectors │
+└──────────┬──────────────────────┘
+ │
+┌──────────▼──────────────────────┐
+│ Producer Class │
+│ (e.g. GUSBampProducer) │
+│ • Runs acquisition thread │
+│ • Ring buffer management │
+│ • Calls driver for samples │
+└──────────┬──────────────────────┘
+ │
+┌──────────▼──────────────────────┐
+│ Driver Class │
+│ (e.g. GUSBampDriver) │
+│ • Device SDK calls │
+│ • Parameter configuration │
+│ • Raw sample retrieval │
+└──────────┬──────────────────────┘
+ │
+ ┌─────▼─────┐
+ │ Hardware │
+ │ Device │
+ └───────────┘
+```
+
+## Example: gUSBamp EEG Driver
+
+The gUSBamp plugin illustrates this pattern:
+
+
+
+The left side shows the MNE Scan boundary; the right side shows the hardware device. The three classes mediate between them:
+
+* **gUSBamp** — main plugin class; communicates with MNE Scan and manages the GUI.
+* **gUSBampproducer** — controls the acquisition thread and bridges the plugin with the driver.
+* **gUSBampdriver** — communicates directly with the gUSBamp amplifier hardware.
+
+## Data Flow
+
+All three classes are constructed sequentially during plugin initialization, setting up default parameters. Once initialized, the plugin waits for a start command or parameter changes from the GUI.
+
+### Starting Acquisition
+
+Starting acquisition triggers a chain: the Plugin starts the Producer, and the Producer starts the Driver. The Driver initializes the hardware and begins sampling. Both the Plugin and Producer run internal threads that pull data from the class below and push it upward via **ring buffers** (`CircularBuffer`), creating a continuous data stream into MNE Scan.
+
+### Stopping Acquisition
+
+When stopping the acquisition, both threads are interrupted by setting the `m_bIsRunning` flag to `false`, and the Driver class puts the device into standby mode. The ring buffers are flushed and reset.
+
+## Key Base Classes
+
+| Class | Location | Purpose |
+|-------|----------|---------|
+| `AbstractSensor` | `src/applications/mne_scan/libs/scShared/` | Base class for all acquisition plugins |
+| `CircularBuffer` | `src/libraries/utils/` | Lock-free ring buffer for inter-thread data transfer |
+| `PluginOutputData` | `src/applications/mne_scan/libs/scShared/` | Typed output connector that passes data to downstream plugins |
+
+## Implementing a New Acquisition Plugin
+
+To create a new acquisition plugin:
+
+1. **Copy** an existing plugin folder (e.g., `dummytoolbox` or `fiffsimulator`) as a template.
+2. **Create three classes**: `MyPlugin` (inherits `AbstractSensor`), `MyPluginProducer`, and `MyPluginDriver`.
+3. **Implement the Driver** to interface with your device's SDK — initialize the device, configure parameters, and read raw samples.
+4. **Implement the Producer** to run the acquisition loop in a separate thread, pulling samples from the Driver and pushing them into a `CircularBuffer`.
+5. **Implement the Plugin** to set up the GUI, create output connectors, and manage the start/stop lifecycle.
+6. **Register** the plugin in the parent `CMakeLists.txt` and, for static builds, in `main.cpp` via `Q_IMPORT_PLUGIN`.
+
+See [Creating a Plugin](scan-plugin.mdx) for the general plugin scaffolding guide.
diff --git a/doc/website/docs/development/scan-plugin.mdx b/doc/website/docs/development/scan-plugin.mdx
new file mode 100644
index 00000000000..d3aa41ea243
--- /dev/null
+++ b/doc/website/docs/development/scan-plugin.mdx
@@ -0,0 +1,180 @@
+---
+title: Creating a new plugin
+sidebar_label: Creating a Plugin
+---
+
+# Creating a New Plugin
+
+MNE Scan's functionality is extended through plugins. Each plugin is a shared library that is loaded at runtime. This guide shows how to create a new MNE Scan plugin, from scaffolding to integration.
+
+## Plugin Categories
+
+MNE Scan distinguishes between three plugin categories, each with a corresponding abstract base class in `src/applications/mne_scan/libs/scShared/`:
+
+| Category | Base Class | Purpose | Examples |
+|----------|-----------|---------|----------|
+| **Sensor** (acquisition) | `AbstractSensor` | Provides data from hardware devices or simulations | FiffSimulator, BabyMEG, LSLAdapter |
+| **Algorithm** (processing) | `AbstractAlgorithm` | Applies real-time processing to the data stream | Filtering, Averaging, SourceLocalization |
+| **IO** (output) | `AbstractIOPlugin` | Writes data to disk or forwards it to other systems | FileWriter |
+
+Your new plugin must inherit from one of these base classes depending on its role in the pipeline.
+
+## Getting Started with the DummyToolbox
+
+The easiest way to create a new plugin is to start from the **DummyToolbox** template:
+
+1. Copy the `dummytoolbox` folder under `src/applications/mne_scan/plugins/dummytoolbox`.
+2. Rename the folder and all files to match your new plugin name.
+3. In all source files, replace `DummyToolbox` / `dummytoolbox` with your plugin name.
+4. Update the `CMakeLists.txt` inside your new plugin folder with the correct target name and source files.
+5. Register your plugin in the parent `src/applications/mne_scan/plugins/CMakeLists.txt` by adding an `add_subdirectory()` call for your plugin folder.
+
+The DummyToolbox source can also be viewed on [GitHub](https://github.com/mne-tools/mne-cpp/tree/main/src/applications/mne_scan/plugins/dummytoolbox).
+
+## Plugin Structure
+
+A typical MNE Scan plugin consists of:
+
+| File | Purpose |
+|------|---------|
+| `myplugin.h / .cpp` | Main plugin class — inherits from the appropriate abstract base class |
+| `myplugin_global.h` | Shared export/import macros (`Q_DECL_EXPORT` / `Q_DECL_IMPORT`) |
+| `myplugin.json` | Plugin metadata (name, version) |
+| `CMakeLists.txt` | Build configuration |
+| `FormFiles/` | Optional Qt Designer `.ui` files for the plugin GUI |
+
+## Key Virtual Functions
+
+Every plugin must implement the following virtual functions from its base class:
+
+### `clone()`
+Returns a new instance of the plugin (not a copy). Used by the plugin manager during loading:
+```cpp
+QSharedPointer MyPlugin::clone() const
+{
+ return QSharedPointer(new MyPlugin);
+}
+```
+
+### `init()`
+Called after all plugins are loaded into the Plugin Manager. Use it to allocate resources, initialize parameters, and set up internal data structures:
+```cpp
+void MyPlugin::init()
+{
+ m_pOutput = PluginOutputData::create(this, "MyPlugin Out", "MyPlugin output data");
+ m_outputConnectors.append(m_pOutput);
+}
+```
+
+### `unload()`
+Called when the application shuts down. Release resources and clean up here.
+
+### `getName()`
+Returns the plugin name as it appears in the MNE Scan GUI:
+```cpp
+QString MyPlugin::getName() const
+{
+ return "My Plugin";
+}
+```
+
+### `setupWidget()`
+Returns a `QWidget*` that serves as the plugin's configuration dialog. The user opens this from the plugin toolbar. Return `nullptr` if no setup is needed.
+
+### `run()`
+The main processing loop. This function runs in a separate thread. For an **algorithm plugin**, it typically reads data from an input connector, processes it, and writes results to an output connector:
+```cpp
+void MyPlugin::run()
+{
+ while(!isInterruptionRequested()) {
+ // Wait for new data
+ Eigen::MatrixXd matData = m_pInput->getValue();
+
+ // Process data
+ Eigen::MatrixXd matResult = processData(matData);
+
+ // Send to output
+ m_pOutput->measurementData()->setValue(matResult);
+ }
+}
+```
+
+## Connectors: Input and Output
+
+Plugins communicate through **connectors**. Input connectors receive data from upstream plugins; output connectors send data downstream.
+
+```cpp
+// In init(): create an output connector
+m_pOutput = PluginOutputData::create(this, "Out", "Output data");
+m_outputConnectors.append(m_pOutput);
+
+// In init(): create an input connector
+m_pInput = PluginInputData::create(this, "In", "Input data");
+m_inputConnectors.append(m_pInput);
+```
+
+MNE Scan's pipeline GUI allows the user to wire connectors between plugins by drawing connections.
+
+## CMakeLists.txt
+
+A minimal `CMakeLists.txt` for a plugin:
+
+```cmake
+set(TARGET_NAME myplugin)
+
+add_library(${TARGET_NAME} SHARED
+ myplugin.h
+ myplugin.cpp
+ myplugin_global.h
+)
+
+target_link_libraries(${TARGET_NAME}
+ PRIVATE
+ scShared
+ mne_utils
+ mne_fiff
+ Qt6::Core
+ Qt6::Widgets
+)
+
+# Install the plugin to the runtime plugins directory
+install(TARGETS ${TARGET_NAME}
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/mne_scan_plugins
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}/mne_scan_plugins
+)
+```
+
+## Static Building
+
+When building statically, MNE Scan needs to be told about plugins at compile time. Add a `Q_IMPORT_PLUGIN` macro in `src/applications/mne_scan/mne_scan/main.cpp` under the `#ifdef STATICBUILD` guard:
+
+```cpp
+#ifdef STATICBUILD
+Q_IMPORT_PLUGIN(MyPlugin)
+#endif
+```
+
+The CMake configuration handles the rest of the static build setup automatically.
+
+## Building and Testing
+
+After adding your plugin, rebuild MNE-CPP with CMake:
+
+```bash
+cmake -B build -S . -DCMAKE_BUILD_TYPE=Release
+cmake --build build --target myplugin --parallel
+```
+
+The compiled plugin library will be placed in the output directory where MNE Scan discovers it at runtime. Launch MNE Scan and verify that your plugin appears in the plugin toolbar.
+
+## Checklist
+
+Before submitting your plugin as a pull request, verify:
+
+- [ ] Plugin folder added under `src/applications/mne_scan/plugins/`
+- [ ] `add_subdirectory()` added to the parent `CMakeLists.txt`
+- [ ] Plugin has a `*_global.h` file with export macros
+- [ ] All virtual functions from the base class are implemented
+- [ ] `Q_IMPORT_PLUGIN` added for static builds
+- [ ] Plugin compiles and loads successfully in MNE Scan
+- [ ] Unit tests written for any processing logic (see [Writing Tests](writingtest.mdx))
diff --git a/doc/website/docs/development/scan.mdx b/doc/website/docs/development/scan.mdx
new file mode 100644
index 00000000000..8637f204e8d
--- /dev/null
+++ b/doc/website/docs/development/scan.mdx
@@ -0,0 +1,24 @@
+---
+title: MNE Scan
+sidebar_label: MNE Scan
+---
+
+# MNE Scan Development
+
+MNE Scan is MNE-CPP's real-time data acquisition and processing application. It is built around a **plugin pipeline** — data flows from acquisition plugins (hardware drivers, file readers, simulators) through processing plugins (filtering, averaging, source localization) to output plugins (file writers, network senders).
+
+Plugins are loaded as shared libraries at runtime. Each plugin inherits from one of three abstract base classes (`AbstractSensor`, `AbstractAlgorithm`, or `AbstractIOPlugin`) and communicates through typed input/output connectors that the user wires together in the GUI.
+
+## Guides
+
+- **[Acquisition Plugins](scan-acq.mdx)** — The three-tier architecture (Plugin → Producer → Driver) used by all sensor plugins, with the gUSBamp EEG driver as a worked example.
+- **[Creating a Plugin](scan-plugin.mdx)** — Step-by-step guide to building a new MNE Scan plugin using the DummyToolbox template, including CMake setup, virtual functions, connectors, and static build integration.
+
+## Key Concepts
+
+| Concept | Description |
+|---------|-------------|
+| **Connectors** | Typed input/output channels that link plugins in the pipeline |
+| **Ring buffers** | Lock-free `CircularBuffer` instances used for inter-thread data transfer |
+| **Plugin categories** | Sensor (acquisition), Algorithm (processing), IO (output) |
+| **Static builds** | Plugins registered via `Q_IMPORT_PLUGIN` for single-binary deployment |
diff --git a/doc/website/docs/development/wasm-buildguide.mdx b/doc/website/docs/development/wasm-buildguide.mdx
new file mode 100644
index 00000000000..1eb7f156c09
--- /dev/null
+++ b/doc/website/docs/development/wasm-buildguide.mdx
@@ -0,0 +1,136 @@
+---
+title: Build Guide
+sidebar_label: Build Guide
+---
+
+# WebAssembly Build Guide
+
+This guide shows you how to build MNE-CPP for WebAssembly (Wasm). MNE-CPP uses **multi-threaded** Wasm by default and provides a build script that handles Emscripten setup, CMake configuration, and compilation.
+
+## Prerequisites
+
+### Qt 6 for WebAssembly
+
+You need a Qt 6 installation that includes the **WebAssembly (multi-threaded)** target. Install it via the [Qt Online Installer](https://www.qt.io/download-qt-installer) — select both a desktop target (e.g. `Desktop gcc 64-bit` on Linux or `macOS` on Mac) and the `WebAssembly (multi-threaded)` target. CI currently uses **Qt 6.10.2**.
+
+A desktop (host) Qt is required alongside the Wasm Qt because Qt's cross-compilation needs a host toolchain to build code generators and other tools.
+
+### Emscripten SDK
+
+The build script can automatically download and set up the Emscripten SDK for you. If you prefer to install it manually, see [emscripten.org](https://emscripten.org/docs/getting_started/downloads.html). CI currently uses **emsdk 4.0.7**.
+
+### System Dependencies
+
+On **Linux**, install the following packages:
+
+```bash
+sudo apt-get install build-essential libgl1-mesa-dev ninja-build
+```
+
+On **macOS**, install Ninja:
+
+```bash
+brew install ninja
+```
+
+### CMake
+
+[CMake](https://cmake.org/download/) **3.15 or higher** is required.
+
+## Build with the Provided Script
+
+MNE-CPP provides a Wasm build script at `tools/wasm.sh`. From the repository root:
+
+```bash
+# Set Qt6_DIR to the folder containing wasm_multithread/ and your host Qt (gcc_64/ or macos/)
+export Qt6_DIR=$HOME/Qt/6.10.2
+
+./tools/wasm.sh
+```
+
+The script will:
+1. Clone and activate the Emscripten SDK (version 4.0.7 by default)
+2. Auto-detect the host Qt path from `Qt6_DIR`
+3. Run `qt-cmake` with `-DWASM=ON`
+4. Build MNE-CPP for WebAssembly
+
+Build output is placed in `out/wasm/`.
+
+### Script Options
+
+| Option | Description |
+|--------|-------------|
+| `--emsdk `, `-e` | Set the Emscripten version (default: 4.0.7) |
+| `--qt `, `-q` | Set the Qt installation path manually |
+| `--qt-host ` | Set the host Qt path for cross-compilation |
+| `--no-log` | Skip writing `build_info.txt` |
+| `--help`, `-h` | Show help |
+
+Example with explicit paths:
+
+```bash
+./tools/wasm.sh --emsdk 4.0.7 --qt $HOME/Qt/6.10.2 --qt-host $HOME/Qt/6.10.2/gcc_64
+```
+
+## Build Manually
+
+If you prefer to run the steps yourself:
+
+```bash
+# 1. Set up Emscripten
+git clone https://github.com/emscripten-core/emsdk.git
+cd emsdk
+./emsdk install 4.0.7
+./emsdk activate 4.0.7
+source ./emsdk_env.sh
+cd ..
+
+# 2. Configure and build
+$HOME/Qt/6.10.2/wasm_multithread/bin/qt-cmake \
+ -DQT_HOST_PATH=$HOME/Qt/6.10.2/gcc_64 \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DWASM=ON \
+ -S src \
+ -B build/wasm
+
+cmake --build build/wasm --parallel $(nproc)
+```
+
+Adjust `QT_HOST_PATH` to `gcc_64` (Linux) or `macos` (macOS) as appropriate.
+
+## Run an Application
+
+Navigate to the build output directory and start a local web server:
+
+```bash
+cd out/wasm/apps
+python3 -m http.server
+```
+
+Open a Chromium-based browser or Firefox and visit:
+
+```
+http://localhost:8000/mne_analyze.html
+```
+
+:::caution Cross-Origin Headers
+Multi-threaded Wasm requires the server to send the `Cross-Origin-Opener-Policy: same-origin` and `Cross-Origin-Embedder-Policy: require-corp` headers. Python's simple HTTP server does **not** send these by default. For testing, use a tool like [user-agent-cors](https://www.npmjs.com/package/user-agent-cors) or configure your server accordingly. See the [Qt for WebAssembly documentation](https://doc.qt.io/qt-6/wasm.html) for details.
+:::
+
+## Live Demo
+
+Live Wasm builds are available at:
+
+[https://mne-cpp.github.io/wasm/mne_analyze.html](https://mne-cpp.github.io/wasm/mne_analyze.html)
+
+## Notes
+
+- Chromium-based browsers and Firefox provide the best compatibility.
+- Qt3D / QOpenGLWidget is not supported in WebAssembly builds (`-DNO_OPENGL` is implied by `-DWASM=ON`).
+- The Wasm build always uses **static linking** (`BUILD_SHARED_LIBS=OFF`).
+
+## References
+
+- [Qt for WebAssembly](https://doc.qt.io/qt-6/wasm.html)
+- [Emscripten documentation](https://emscripten.org/docs/)
+- [Qt for WebAssembly wiki](https://wiki.qt.io/Qt_for_WebAssembly)
diff --git a/doc/website/docs/development/wasm-testing.mdx b/doc/website/docs/development/wasm-testing.mdx
new file mode 100644
index 00000000000..e93fa06af78
--- /dev/null
+++ b/doc/website/docs/development/wasm-testing.mdx
@@ -0,0 +1,74 @@
+---
+title: Testing via CI
+sidebar_label: Testing via CI
+---
+
+# Testing via CI
+
+MNE-CPP provides a GitHub Actions workflow (`wasmtest.yml`) that builds the project for WebAssembly and deploys the result to your fork's `gh-pages` branch. This page explains how to set it up.
+
+## Prerequisites
+
+### Set Up the `gh-pages` Branch
+
+If your fork does not already have a `gh-pages` branch, create one:
+
+```bash
+git checkout --orphan gh-pages
+git rm -rf .
+touch README.md
+git add README.md
+git commit -m 'initial gh-pages commit'
+git push origin gh-pages
+```
+
+Then enable GitHub Pages in your fork: **Settings > Pages > Source > Deploy from a branch** and select `gh-pages`.
+
+### Create a Personal Access Token
+
+Create a [personal access token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token) with **repo** scope.
+
+### Add the Repository Secret
+
+In your fork go to **Settings > Secrets and variables > Actions** and create a new secret named `GIT_CREDENTIALS_WASM_TEST` with the value:
+
+```
+https://:@github.com/
+```
+
+## Trigger the Workflow
+
+The `wasmtest.yml` workflow is triggered by pushes to the `wasm` branch. Create this branch (or use an existing one) and push:
+
+```bash
+git checkout -b wasm
+# make your changes
+git push origin wasm
+```
+
+This will start a GitHub Actions run that:
+
+1. Sets up **Emscripten 4.0.7** and downloads pre-built **Qt 6.10.2** static Wasm binaries (or triggers a build of those binaries if they don't yet exist).
+2. Downloads host Qt binaries (Linux) needed for cross-compilation.
+3. Builds MNE-CPP for WebAssembly using `./tools/wasm.sh --emsdk 4.0.7`.
+4. Pushes the resulting Wasm artifacts to both the `gh-pages` and `main` branches of your fork.
+
+:::note Build Times
+Building Qt and MNE-CPP for WebAssembly takes significant time on CI runners. Pre-built Qt binaries are cached to speed up subsequent builds.
+:::
+
+## View the Result
+
+Once the workflow completes, visit:
+
+```
+https://.github.io/mne-cpp/mne_analyze.html
+```
+
+It may take a few minutes (or a browser refresh) for GitHub Pages to update.
+
+## References
+
+- [GitHub Actions documentation](https://docs.github.com/en/actions)
+- [GitHub Pages documentation](https://docs.github.com/en/pages)
+- [WebAssembly Build Guide](wasm-buildguide.mdx)
diff --git a/doc/website/docs/development/wasm.mdx b/doc/website/docs/development/wasm.mdx
new file mode 100644
index 00000000000..6393c92294e
--- /dev/null
+++ b/doc/website/docs/development/wasm.mdx
@@ -0,0 +1,25 @@
+---
+title: WebAssembly
+sidebar_label: WebAssembly
+---
+
+# WebAssembly
+
+MNE-CPP can be compiled to [WebAssembly (Wasm)](https://webassembly.org/), enabling MNE Analyze and other applications to run directly in a web browser — no installation, no platform-specific binaries. Users simply open a URL to start working with their data.
+
+The Wasm build uses the [Emscripten](https://emscripten.org/) toolchain together with Qt's WebAssembly target, configured through CMake. MNE-CPP targets **multi-threaded** Wasm by default, which requires Chromium-based browsers or Firefox and specific HTTP headers (`Cross-Origin-Opener-Policy`, `Cross-Origin-Embedder-Policy`).
+
+:::tip Live Demo
+Try MNE Analyze in your browser right now: [mne-cpp.github.io/wasm/mne_analyze.html](https://mne-cpp.github.io/wasm/mne_analyze.html)
+:::
+
+## Guides
+
+- **[Build Guide](wasm-buildguide.mdx)** — How to set up Emscripten and build MNE-CPP for WebAssembly, including both scripted and manual build workflows.
+- **[Testing via CI](wasm-testing.mdx)** — How to deploy and test Wasm builds using GitHub Actions and GitHub Pages.
+
+## Limitations
+
+- Qt3D / `QOpenGLWidget` is not supported in WebAssembly builds — 3D visualization is excluded.
+- The Wasm build always uses **static linking** (`BUILD_SHARED_LIBS=OFF`).
+- File I/O operates through the browser's virtual file system rather than native disk access.
diff --git a/doc/website/docs/development/writingtest.mdx b/doc/website/docs/development/writingtest.mdx
new file mode 100644
index 00000000000..3b4cd3b2a48
--- /dev/null
+++ b/doc/website/docs/development/writingtest.mdx
@@ -0,0 +1,86 @@
+---
+title: Writing a Unit Test
+sidebar_label: Writing a Unit Test
+---
+
+# Writing a Unit Test
+
+MNE-CPP requires unit tests for all new functionality. The focus is on functional testing rather than 100% code coverage. Writing tests helps you fully understand what your code does and ensures the CI pipeline catches regressions early — a failing test is the first indicator that a change broke something.
+
+## What and How to Test
+
+Every new function should be tested. Consider the use case, determine how to validate the output, and — where possible — compare results against a reference implementation (e.g., MNE-Python, MNE-C, or MNE-Matlab). Once you have reference results, proceed with the steps below.
+
+## Creating a new Test
+
+A good starting point is to look at existing tests under `src/testframes/`. You can duplicate an existing test directory (e.g., `test_fiff_rwr`) and adapt it for your new test. Make sure to:
+
+1. Rename the directory and source files to match your test name.
+2. Update the `CMakeLists.txt` inside the new test directory.
+3. Register the new test in the parent `src/testframes/CMakeLists.txt` via `add_subdirectory()`.
+
+## Structuring the Test
+
+Always keep our [Coding Conventions](contr-style.mdx) in mind. Consider taking a look at already available tests to get started. First, you create a class named after your test: `TestName`. The following code snippet shows an example for a test. The `slots` define the functions to execute your test logic in `initTestCase()` and compare the output to reference values, e.g., `compareValue()`. You can also declare threshold values as private variables that indicate the maximum allowed difference when comparing. An example can be found [here](https://github.com/mne-tools/mne-cpp/blob/main/testframes/test_fiff_rwr/test_fiff_rwr.cpp).
+
+```cpp
+class TestFiffRWR: public QObject
+{
+ Q_OBJECT
+
+public:
+ TestFiffRWR();
+
+private slots:
+ void initTestCase();
+ void compareValue();
+ void cleanupTestCase();
+
+private:
+ // some variables and error thresholds
+ double dEpsilon;
+ Eigen::MatrixXd mFirstInData;
+ Eigen::MatrixXd mSecondInData;
+};
+```
+
+### initTestCase()
+
+Here you execute and declare everything that is necessary for setting up your test. You generate and load all values in a variable that can be compared to later. If you want to load external calculated data in e.g. `.txt` files you can use:
+
+```cpp
+Eigen::MatrixXd mDataFromFile;
+UTILSLIB::IOUtils::read_eigen_matrix(mDataFromFile, QCoreApplication::applicationDirPath() + "../resources/data/mne-cpp-test-data/Result/.txt");
+```
+
+All files you use, have to be added to [mne-cpp-test-data](https://github.com/mne-tools/mne-cpp-test-data). In case you need to add new data open a Pull Request to this repository. The files you use should be as small as possible. If you need a .fif file, have a look at the already existing data first.
+
+### compareValue()
+
+```cpp
+void TestFiffRWR::compareValue()
+{
+ // compare your data here, think about usefull metrics
+ Eigen::MatrixXd mDataDiff = mFirstInData - mSecondInData;
+ QVERIFY( mDataDiff.sum() < dEpsilon );
+}
+```
+
+Here you compare the output of your function to the reference data. `QVERIFY` performs the assertion. Choose meaningful metrics and thresholds for your comparison. Use a separate compare function for each value you test — don't combine unrelated comparisons.
+
+### Possible Error Message
+
+It might be possible that the last line of the test shows an error in your editor. Don't worry about this, once you have built the test project, the error will disappear.
+
+```cpp
+#include "test_fiff_rwr.moc"
+```
+
+### Naming Conventions
+
+Please follow the following naming conventions when naming your test project and class:
+
+|Object|Rule|
+| --------------- | ------------------- |
+| Project name |`test_something_meaningful`|
+| Class name |`TestSomethingMeaningful` |
diff --git a/doc/website/docs/manual/analyze-annotationmanager.mdx b/doc/website/docs/manual/analyze-annotationmanager.mdx
new file mode 100644
index 00000000000..ae53227800b
--- /dev/null
+++ b/doc/website/docs/manual/analyze-annotationmanager.mdx
@@ -0,0 +1,39 @@
+---
+title: Event Manager
+sidebar_label: Event Manager
+---
+## Event Manager
+
+The event manager is used to create, display, and save events. Events in MNE Analyze are sorted into event groups, each with an associated name, type, and color. Events and event groups can either be manually added or detected from stim channels of the currently loaded file.
+
+
+
+### Adding Events Manually
+
+To add an event group, select a name and press `Create`. Select a color when prompted.
+
+
+
+To add an event, right click on the data plot in the spot you wish to add, and select the `Add Event` option. The event will be added to the currently selected group.
+
+Alternatively, hit the `E` key to add an event to where the signal viewer cursor is currently located.
+
+
+
+### Adding Events from Stim
+
+Click the `Load from Stim Channels` button to bring up the Trigger Detection widget.
+
+
+
+Select the channel from which to load events, and a threshold for detecting triggers.
+
+Press `Detect Triggers` to load in events. This may take a few seconds depending on how many events are being loaded.
+
+### Managing and Viewing Events
+
+Event groups will be added to the left side of the event table. The right side will display the events in the currently selected event group. Event groups can be recolored or deleted by right clicking them and selecting the corresponding action. To rename groups, double click them and input a new name.
+
+The display of events can also be narrowed or broadened. Select multiple groups buy holding `Ctrl` when clicking through groups, or use `Shift` to select a range of groups. Checking `Show selected events only` will make only the currently selected events display in the Signal Viewer, use `Ctrl` and `Shift` to select multiple events as well.
+
+To save the events currently showing on the right side of the table to an `.eve` file, press `Save Events`.
diff --git a/doc/website/docs/manual/analyze-average.mdx b/doc/website/docs/manual/analyze-average.mdx
new file mode 100644
index 00000000000..74645608b24
--- /dev/null
+++ b/doc/website/docs/manual/analyze-average.mdx
@@ -0,0 +1,19 @@
+---
+title: Averaging
+sidebar_label: Averaging
+---
+# Averaging
+
+The averaging plugin lets you compute averages based on events.
+
+
+
+You can select from any of the existing event groups, or use your current event selection.
+
+
+
+Use the `Parameters` tab to input your desired settings and hit the `COMPUTE` button. Prestimulus, poststimulus, and baseline min/max are all relative to the events. `Drop Rejected` will discard data points with artifacts"
+
+You can control which channels to display using the Channel Selection plugin, which lets you select from presets or choose your own selection.
+
+Computed averages will be displayed in the [Data Manager](analyze-datamanager.mdx), where you can switch between them.
diff --git a/doc/website/docs/manual/analyze-channelselect.mdx b/doc/website/docs/manual/analyze-channelselect.mdx
new file mode 100644
index 00000000000..e8ac56a67be
--- /dev/null
+++ b/doc/website/docs/manual/analyze-channelselect.mdx
@@ -0,0 +1,16 @@
+---
+title: Channel Selection
+sidebar_label: Channel Selection
+---
+# Channel Selection
+
+This plugin lets you select which channels will be visible in the views of MNE Analyze.
+
+
+
+Using the Channel Selection View, you can manually select which channels will be displayed, by either clicking individual channels or dragging a selection box around them.
+For this to work correctly, make sure the correct layout is chosen in the dropdown at the top of the controls, so that the view corresponds to the channels in the acquisition device used.
+
+
+
+From the controls you can select from premade selection groups, or define your own. You can also load and save selection groups, with more provided in `resources/general/selectionGroups`. You can then select which views the channel selection will be applied to using the checkboxes at the bottom.
diff --git a/doc/website/docs/manual/analyze-coregistration.mdx b/doc/website/docs/manual/analyze-coregistration.mdx
new file mode 100644
index 00000000000..c114f1ebdf2
--- /dev/null
+++ b/doc/website/docs/manual/analyze-coregistration.mdx
@@ -0,0 +1,61 @@
+---
+title: Co-Registration
+sidebar_label: Co-Registration
+---
+# Co-Registration
+
+This plugin lets you co-register your subject's BEM-files with a digitizer set observed previous to the measurement. The plugin uses fiducial alignment as an initial fit and improves the result with the Iterative-Closest-Point (ICP) algorithm. You can also use pre-defined fiducials or an existing transformation.
+
+The following sections will show you how to use the plugin and introduce good practice.
+
+
+
+## Prerequisites
+
+To perform Co-Registration, you need at least the following data:
+
+- The Bem-Surface of your subject
+- The recorded digitizers.
+
+Optional:
+
+- File with fiducials to skip the picking
+- File containing an existing transformation to skip the co-registration procedure.
+
+## Setup
+
+1. Choose to show the Co-Registration and 3DView Plugin.
+2. Load the BEM file of your choise via the [Data Loader](analyze-datamanager.mdx). Go to `Files` -> `Load` -> choose the Bem.
+
+## Co-Registration Plugin
+
+### Load and Store
+
+
+First, you should select the BEM you want to use for co-registration in `MRI Subject`. Once done, the head surface should be visualized within the 3DView. Further, you can choose if you want to
+
+1. load or
+2. pick fiducials.
+
+If you enable `Pick Fiducials from View`, you can choose the cardinal points for co-registration. Make sure that the location fits with the location you digitized on your subject. To pick the fiducials, make sure to open the 3DView (Toolbar: `View`->`3D View`). You can now pick the fiducials by clicking on the surface within the 3D View. The coordinates for the current selected Fiducial will be displayed. For further information and conventions on fiducials, refer to this [guide](https://neuroimage.usc.edu/brainstorm/CoordinateSystems?highlight=%28auricular%29). Once picked, you can store the fiducials to avoid picking in future sessions.
+
+You can also use `Load Transformation` to load a previously observed transformation to avoid performing Co-Registration again. With `Store Transformation`, you can also store the observed transformation to file for future sessions.
+
+### Fit
+
+
+On this tab, you can change the settings for the actual co-registration. In `Digitizer Options`, you can select the weights for different kinds of digitized points, which type (EEG, HPI and HSP) you want to use, and the maximum allowed distance from a point to the surface should be.
+
+In `Fitting Options`, you can specify the maximum number of iterations for the ICP algorithm and the convergence limit. Once exceeded, the ICP terminates. With `Fit Fiducials`, a first alignment will be executed. This will be used as an initial starting point for the ICP algorithm, started with `Fit ICP`, which might take a while.
+
+### Adjustment
+
+
+
+Here you can further adjust the results. You have three options for additional scaling
+
+- `None`: no scaling applied
+- `Uniform`: Same scaling on all axes
+- `3-Axis`: Independent scaling for each axis.
+
+Further, you can adjust the translation and rotation around x-,y- and z-Axis.
diff --git a/doc/website/docs/manual/analyze-dataloader.mdx b/doc/website/docs/manual/analyze-dataloader.mdx
new file mode 100644
index 00000000000..5eaaa9300e9
--- /dev/null
+++ b/doc/website/docs/manual/analyze-dataloader.mdx
@@ -0,0 +1,11 @@
+---
+title: Data Loader
+sidebar_label: Data Loader
+---
+# Data Loader
+
+The data loader can be accessed from the `File` menu on the top left, as seen in the image below. From there you can load and save `.fif` files.
+
+
+
+As files get loaded they are added to the [Data Manager](analyze-datamanager.mdx). Currently the data loader supports loading raw `.fif` files.
diff --git a/doc/website/docs/manual/analyze-datamanager.mdx b/doc/website/docs/manual/analyze-datamanager.mdx
new file mode 100644
index 00000000000..f1388e2cdb9
--- /dev/null
+++ b/doc/website/docs/manual/analyze-datamanager.mdx
@@ -0,0 +1,17 @@
+---
+title: Data Manager
+sidebar_label: Data Manager
+---
+# Data Manager
+
+The Data Manager keeps track of and organizes files data in MNE Analyze.
+
+
+
+Any data loaded from files, or generated within the application will appear here. The organization follows [BIDS](https://bids.neuroimaging.io/) formatting, separating data into subjects and sessions. Any data derived from other data will appear as sub item, like events or averages that correspond to a file.
+
+
+
+Items can be removed by right clicking and selecting `Remove`, and can be moved into other available sessions or subjects.
+
+You can select between .fif files and events to pick which one to display in the [Data Viewer](analyze-rawdataviewer.mdx), and averages to pick which will be displayed in [Averaging](analyze-average.mdx).
diff --git a/doc/website/docs/manual/analyze-dipolefit.mdx b/doc/website/docs/manual/analyze-dipolefit.mdx
new file mode 100644
index 00000000000..159a87481de
--- /dev/null
+++ b/doc/website/docs/manual/analyze-dipolefit.mdx
@@ -0,0 +1,19 @@
+---
+title: Dipole Fit
+sidebar_label: Dipole Fit
+---
+# Dipole Fit
+
+The dipole fit lets you perform dipole fitting from raw or average fiff files. Use the GUI controls to input desired parameters and select models to use.
+
+
+
+Select which measurement file to use from the dropdown. Any loaded file raw or average file will be added here for selection.
+
+
+
+Use the `File` menu on the top left of MNE Analyze to load in any additional models, like BEM, MRI, or Noise, which are also added to their corresponding dropdowns and can be selected.
+
+
+
+Use the text field at the bottom to input a name for your fit. A recommended name will be generated based on your selected parameters. Once calculated, the new fit will be added to the data manager
diff --git a/doc/website/docs/manual/analyze-filter.mdx b/doc/website/docs/manual/analyze-filter.mdx
new file mode 100644
index 00000000000..e2f852aebf8
--- /dev/null
+++ b/doc/website/docs/manual/analyze-filter.mdx
@@ -0,0 +1,17 @@
+---
+title: Filtering
+sidebar_label: Filtering
+---
+# Filtering
+
+The filter plugin lets you select the parameters for filtering the data in the signal viewer. For a basic filter, just input the range of frequencies you want to let you filter pass and select `Activate filter`. The data displayed in the signal viewer will reflect your filter settings, which can be changed in real time.
+
+
+
+With MNE Analyze in Research mode, you also have the option to design their filter with the `Advanced filter design` button.
+
+
+
+Here you have more options about the types of filters and filter parameters, and are given a preview of your filter design.
+
+
diff --git a/doc/website/docs/manual/analyze-rawdataviewer.mdx b/doc/website/docs/manual/analyze-rawdataviewer.mdx
new file mode 100644
index 00000000000..0ff566f21ec
--- /dev/null
+++ b/doc/website/docs/manual/analyze-rawdataviewer.mdx
@@ -0,0 +1,16 @@
+---
+title: Signal Viewer
+sidebar_label: Signal Viewer
+---
+# Signal Viewer
+
+The signal viewer handles the plotting and displaying of the currently selected data file.
+
+
+The file name and parameters are displayed on the bottom, as well as current filter parameters and status.
+
+Click on the viewer to move the signal viewer cursor to that time point. The cursor can be used to temporarily mark something, or as a location to add events to.
+
+To control scaling and view parameters, use the [Settings](analyze-scaling.mdx) plugin.
+
+The viewer also plots events, controlled by the [Events](analyze-annotationmanager.mdx) plugin.
diff --git a/doc/website/docs/manual/analyze-realtime.mdx b/doc/website/docs/manual/analyze-realtime.mdx
new file mode 100644
index 00000000000..cb98a2a3b4c
--- /dev/null
+++ b/doc/website/docs/manual/analyze-realtime.mdx
@@ -0,0 +1,33 @@
+---
+title: MNE Analyze in Real-time
+sidebar_label: MNE Analyze in Real-time
+---
+
+# MNE Analyze in Real-time
+
+MNE Analyze is able to listen in to MNE Scan's real-time capabilities and display data on demand.
+
+## Setup
+
+Make sure MNE Scan and MNE Analyze are running from the same directory. Setting up MNE Scan and MNE Analyze can be done in any order.
+
+### MNE Scan
+
+ * Add the 'Write To File' plugin to the plugin scene and connect it to the source of the data.
+ * Check the 'Link with MNE Analyze' checkbox.
+
+ 
+
+### MNE Analyze
+
+ * From the `File` menu, select `Open MNE Scan Session`
+
+ 
+
+## Using in realtime
+
+ * Start MNE Scan recording. You should see an MNE Analyze button next to a blinking recording button.
+
+ 
+
+ * Click the MNE Analyze Button to open the recording up until the present in MNE Analyze.
diff --git a/doc/website/docs/manual/analyze-scaling.mdx b/doc/website/docs/manual/analyze-scaling.mdx
new file mode 100644
index 00000000000..f4e70dae577
--- /dev/null
+++ b/doc/website/docs/manual/analyze-scaling.mdx
@@ -0,0 +1,23 @@
+---
+title: Settings
+sidebar_label: Settings
+---
+#Settings
+
+This plugin controls the scaling and view settings for all of the views in MNE Analyze.
+
+
+
+Use the sliders in the Scaling tab to select scaling parameters for the different channel types.
+
+
+
+Use the Controls tab to select view settings.
+
+
+
+Use the checkboxes to control which views to control with the sliders.
+
+
+
+Use the controls in the 3D tab to control the parameters of the 3D View.
diff --git a/doc/website/docs/manual/analyze.mdx b/doc/website/docs/manual/analyze.mdx
new file mode 100644
index 00000000000..39c36bc195b
--- /dev/null
+++ b/doc/website/docs/manual/analyze.mdx
@@ -0,0 +1,52 @@
+---
+title: MNE Analyze
+sidebar_label: MNE Analyze
+---
+# MNE Analyze
+
+:::caution Under Development
+MNE Analyze is currently being ported to MNE-CPP and is not yet feature-complete compared to the original MNE-C `mne_analyze` application.
+:::
+
+MNE Analyze is a GUI application for comprehensive sensor- and source-level analysis of pre-recorded MEG/EEG data. It provides tools for data visualization, preprocessing, source localization, and interactive exploration of results. It currently supports the `.fif` (FIFF) file format.
+
+
+
+MNE Analyze offers a completely modular work area, with plugins and viewers that can stack, snap to sides, or act as separate windows.
+
+
+
+It also has two user modes, **Clinical** and **Research**, and two view styles, **Default** and **Dark**. These can be selected from the `Appearance` menu.
+
+## Plugin Architecture
+
+MNE Analyze uses a plugin-based architecture. The following plugins are currently available:
+
+| Plugin | Description |
+|---|---|
+| **Data Loader** | Loading FIFF data files |
+| **Data Manager** | Managing loaded datasets |
+| **Raw Data Viewer** | Browsing raw time-series data |
+| **Annotation Manager** | Event marking and annotation |
+| **Averaging** | Computing evoked responses |
+| **Filtering** | Data filtering |
+| **Channel Selection** | Selecting channel subsets |
+| **Co-registration** | MEG/MRI coordinate alignment |
+| **Scaling** | Signal amplitude scaling |
+| **Dipole Fit** | Interactive dipole fitting |
+| **Real-time** | Connection to real-time data streams |
+
+## Planned Features
+
+The original MNE-C `mne_analyze` provided extensive functionality that is planned for future MNE-CPP releases:
+
+- Full 3D visualization of source estimates on cortical surfaces
+- Interactive ROI (Region of Interest) definition
+- Time-frequency analysis displays
+- Connectivity visualization
+- Movie generation of source activity
+- Surface morphing and group analysis visualization
+
+## Plugin Guides
+
+Below are detailed guides for each MNE Analyze plugin.
diff --git a/doc/website/docs/manual/anonymize.mdx b/doc/website/docs/manual/anonymize.mdx
new file mode 100644
index 00000000000..1bfdb70853c
--- /dev/null
+++ b/doc/website/docs/manual/anonymize.mdx
@@ -0,0 +1,157 @@
+---
+title: MNE Anonymize
+sidebar_label: MNE Anonymize
+---
+# MNE Anonymize
+
+This page describes the application MNE Anonymize, i.e. `mne_anonymize`. This application substitutes different **Personal Health Information** (PHI) and **Personal Identifiable Information** (PII) fields from a [FIFF (Functional Imaging File Format)](https://bids-specification.readthedocs.io/en/stable/99-appendices/06-meg-file-formats.html) file (*.fif*), with other values.
+
+
+
+##### De-identifying vs Anonymizing
+PHI or PII can be substituted with default or user-specified values. This way, it is up to the user to have the output file, either anonymized or de-identified. The difference is that a de-identified file can be **re-identified** back while an anonymized one cannot.
+
+For instance, a field included as PHI could be the **measurment date and time** (see the following paragraph for more information). With MNE Anonymize application, the measurement date and time inside a FiFF file can be either substituted with a default date or it can be modified by a number of days offset. This way, you could de-identify this field in each file within a database of FIFF files and you could then distribute the files for research purposes. At any given time, knowing the number of days to offset the measurement date, a file can be **re-identified**. (Note. This is just an example, typically *.fif* files carry a lot more protected information apart from the measurement date).
+
+## GUI Mode
+
+MNE Anonymize binary file is named `mne_anonymize`. By default, the application is executed in GUI mode. However, if you want to run `mne_anonymize` in GUI mode but you still want to initialize some of the options through a command line call, you can allways do so through the actual command prompt. For example, if you execute `mne_anonymize --in example.fif -bdf` the GUI will start and the options in it will be already set accordingly. The application recognizes several command line options, see bellow.
+
+## Command line Mode
+
+MNE Anonymize can also be executed in command line mode. This is intended for users that might want to anonymize a considerable number of files. The following table shows all valid command line options.
+
+### Command line Options
+
+| Option | Description |
+|--------|-------------|
+|`-h --help`| Displays help on the command line.|
+|`--no-gui`| Command line version of the application.|
+|`--version`| Show the version of this appliation.|
+|`-i --in `| File to anonymize.|
+|`-o --out ` *optional*| Output file ``. As default '_anonymized.fif' is attached to the file name.|
+|`--verbose` *optional*| Prints out all the information about each specific anonymized field. Default: false |
+|`-s --silent` *optional*| Prints no output to the terminal, other than interaction with the user or execution errors. |
+|`-d --delete_input_file_after` *optional*| Delete input fiff file after anonymization. A confirmation message will be prompted to the user. Default: false |
+|`-f --avoid_delete_confirmation` *optional*| Avoid confirming the deletion of the input fiff file. Default: false|
+|`-b --brute` *optional*| Also anonymize subject's weight, height, sex and handedness, and project's ID, name, aim and comment. Default: false |
+|`--md --measurement_date ` *optional*| Specify the measurement date. Only when anonymizing a single file. Format: DDMMYYYY Default: 01012000. |
+|`--mdo --measurement_date_offset ` *optional*| Specify number of days to subtract to the measurement date. Only allowed when anonymizing a single file. Default: 0 |
+|`--sb --subject_birthday ` *optional*| Specify the subject's birthday date. Only allowed when anonymizing a single file. Format: DDMMYYYY. Default: 01012000 |
+|`--sbo --subject_birthday_offset ` *optional*| Specify number of days to subtract to the subject's birthday. Only allowed when anonymizing a single file. Default: 0 |
+|`--his ` *optional*| Specify a Subject's ID within the Hospital system. Only allowed when anonymizing a single file. Default: 'mne_anonymize' |
+|`--mne_environment` *optional*| Also anonymize information added to the fif file through MNE Toolbox, like Working Directory or Command used. Default: false |
+
+## Modified FIFF *tags*
+
+It is important to remark that tags will not be deleted. The information in the tag will be substituted by other information, either specified by the user or defined in the application by default. This utility modifies the following `tags` from the fiff file:
+
+| Tag | Description | Default Anonymization Value |
+|-----|-------------|-----------------------------|
+|`FIFF_FILE_ID`, `FIFF_BLOCK_ID`, `FIFF_PARENT_FILE_ID`, `FIFF_PARENT_BLOCK_ID`, `FIFF_REF_FILE_ID`, `FIFF_REF_BLOCK_ID`| The ID tag includes a measurement date and unique machine ID. The machine ID usually contains the hardware address of the primary LAN card. | 2000/01/01 and 00:00:00:00:00:00:00:00 |
+|`FIFF_MEAS_DATE`| The date of the measurement. | 2000/01/01 |
+|`FIFF_COMMENT` in the measurement block | Holds a (textual) description of the acquisition system. | 'mne_anonymize' |
+|`FIFF_EXPERIMENTER`| The experimenter's name. | 'mne_anonymize' |
+|`FIFF_SUBJ_ID`| The Subject ID. | 0 |
+|`FIFF_SUBJ_FIRST_NAME`| The first name of the subject. | 'mne_anonymize' |
+|`FIFF_SUBJ_MIDDLE_NAME`| The middle name of the subject. | 'mne' |
+|`FIFF_SUBJ_LAST_NAME`| The last name of the subject. | 'mne_anonymize' |
+|`FIFF_SUBJ_BIRTH_DAY`| The birthday of the subject. | 2000/01/01 |
+|`FIFF_SUBJ_SEX`| The sex of the subject. | 0 *brute mode only*|
+|`FIFF_SUBJ_HAND`| The handnes of the subject. | 0 *brute mode only*|
+|`FIFF_SUBJ_WEIGHT`| The weight of the subject. | 0 *brute mode only* |
+|`FIFF_SUBJ_HEIGHT`| The height of the subject. | 0 *brute mode only* |
+|`FIFF_SUBJ_COMMENT`| Comment about the subject. | 2000/01/01 |
+|`FIFF_SUBJ_HIS_ID`| The subject's ID used in the Hospital Information System.| 'mne_anonymize' |
+|`FIFF_PROJ_ID`| The project ID. | 0 *brute mode only* |
+|`FIFF_PROJ_NAME`| The project name. | 'mne_anonymize' *brute mode only* |
+|`FIFF_PROJ_AIM`| The project aim. | 'mne_anonymize' *brute mode only* |
+|`FIFF_PROJ_PERSONS`| Persons participating in the project. | 'mne_anonymize' |
+|`FIFF_PROJ_COMMENT`| Comment about the project | 'mne_anonymize' *brute mode only* |
+|`FIFF_MNE_ENV_WORKING_DIR` | Working directory where the file was created. | 'mne_anonymize' *mne_environment or brute mode only* |
+|`FIFF_MNE_ENV_COMMAND_LINE` | The command used to create the file. | 'mne_anonymize' *mne_environment or brute mode only* |
+
+| **Please note:** MNE Anonymize can also alter the measurement date or the subject's birthday date, by offsetting it some number of days before or after the date which is stored in the input file. |
+
+| **Please note:** MNE Anonymize substitutes the information in the `FIFF_SUBJ_HIS_ID` tag because some laboratories use that field to store other subject specific information. If the `--his` option is used on the command line, followed by some text, the `FIFF_SUBJ_HIS_ID` tag will be substituted with the text specified. |
+
+| **Please note:** In case the input fiff file contains MRI data, beware that a subject's face can be reconstructed from it. The current implementation of MNE Anonymize can not anonymize MRI data. |
+
+## Examples
+
+For all examples we will use MNE-CPP's sample data which can be found inside the project folder in `resources/data/MNE-sample-data/MEG/sample` folder. If you find that folder empty, please read `README.md` file inside `MNE-sample-data` folder.
+
+The easiest way to run `mne_anonymize` is by just running the application and using the GUI. Remember you can pre-initialize the options of the GUI through the command line call. If you want, you can allways use the command line mode, without GUI. For instance:
+
+For specifying an input file to anonymize:
+
+```
+mne_anonymize --no-gui --in ../resources/data/MNE-sample-data/MEG/sample/sample_audvis_raw.fif
+```
+
+If you are concerned with the space in your drive, you can delete the input file immediately after anonymization through the option `--delete_input_file`. By default, before file deletion the user will be prompted to confirm the deletion of the input file:
+
+```
+mne_anonymize --no-gui --in ../resources/data/MNE-sample-data/MEG/sample/sample_audvis_raw.fif --delete_input_file
+```
+
+You can avoid confirming the deletion with the flag `--avoid_delete_confirmation`:
+
+```
+mne_anonymize --no-gui --in ../resources/data/MNE-sample-data/MEG/sample/sample_audvis_raw.fif --delete_input_file --avoid_delete_confirmation
+```
+
+If you specify the input and the output files with the same name, by default the application will ask you to confirm deletion of the input file. You can also avoid the confirmation and force the deletion with the option `--avoid_delete_confirmation`.
+
+```
+mne_anonymize --no-gui --in ../resources/data/MNE-sample-data/MEG/sample/sample_audvis_raw.fif --out ../resources/data/MNE-sample-data/MEG/sample/sample_audvis_raw.fif --delete_input_file --avoid_delete_confirmation
+```
+
+In order to **substract** 35 days from all measurement dates, both in the ID and `FIFF_MEAS_DATE` tags, use:
+
+```
+mne_anonymize --in ../resources/data/MNE-sample-data/MEG/sample/sample_audvis_raw.fif --measurement_date_offset 35
+```
+
+Typical use with abbreviated options. This command will call `mne_anonymize`, specify the input file, set verbose mode and brute mode on. It will also set `delete_input_file` on, avoiding the deletion confirmation, and finally set the measurement date to be 35 days before the date registered in the file.
+
+```
+mne_anonymize -i ../resources/data/MNE-sample-data/MEG/sample/sample_audvis_raw.fif -vbdf --mdo 35
+```
+
+## Introduction to HIPAA law
+
+Fiff files may include Personal Health Information and Personal Identifyable information. The consequences of openly distributing this kind of protected information can be dire. Typically, the regulatory bodies in charge of these issues in each state or country will describe methods for deidentify and anonymize data. In the United States of America, the law related to this problem is the well-known HIPAA, issued by the US Department of Health and Human Services (HHS). This law mentions two main ways to know when it is OK to distribute a file with patient information in it [more info here](https://www.hhs.gov/hipaa/for-professionals/privacy/special-topics/de-identification/index.html).
+
+MNE Anonymize is designed to implement the "safe harbor" approach, by which if the data is stripped from the following info, it is then considered "safe":
+
+* Names
+* All geographic subdivisions smaller than a state, including street address, city, county, precinct, ZIP code, and their equivalent geocodes, except for the initial three digits of the ZIP code if, according to the current publicly available data from the Bureau of the Census:
+* All elements of dates (except year) for dates that are directly related to an individual, including birth date, admission date, discharge date, death date, and all ages over 89 and all elements of dates (including year) indicative of such age, except that such ages and elements may be aggregated into a single category of age 90 or older
+* Telephone numbers
+* Vehicle identifiers and serial numbers, including license plate numbers
+* Fax numbers
+* Device identifiers and serial numbers
+* Email addresses
+* Web Universal Resource Locators (URLs)
+* Social security numbers
+* Internet Protocol (IP) addresses
+* Medical record numbers
+* Biometric identifiers, including finger and voice prints
+* Health plan beneficiary numbers
+* Full-face photographs and any comparable images
+* Account numbers
+* Any other unique identifying number, characteristic, or code, except for specific codes/names assigned to a certain file which could allow to *re-identify* the file. For instance, a new research-oriented id# asigned to a specific subject. There are two requirements for this exception: (1) this new code/number must not be derived from the actual data, and (2) the actual relational table between each code and the protected information cannot be disclosed.
+* Certificate/license numbers
+
+Depending on the settings during acquisition the FIFF files may contain few or many of the previous fields, stored in plain text, i.e., in unencrypted form.
+
+## How is the File Modified
+
+An initial approach to deal with sensible information in a file would be to just delete it or maybe alter it "in-place", like other applications do. However, we think this is not a good idea. Firstly, some of these fields, like `Subject Name` or `Measuremenet date`, are needed and expected by other software packages, to simply delete them might cause some trouble later. Moreover, it doesn't seem to be a neat job to alter the actual information by *masking* it with a default character set, e.g., substituing the name `Peter` `C` `Smith` with `xxxxx` `x` `xxxxx`. Some of the fields of data in a FIFF file are quite long, and an individual subject might have a particularly long name. Therefore, a subject might not be properly de-identified or anonymized if we were to follow this route. But most importantly, we consider that the best way to modify the information in a FIFF file is to recompute completely the actual information and the structure it is stored in.
+
+Since the FIFF format implies a linked list of `tags` with information in them, MNE Anonymize will follow this list of tags from the begining until the end, while creating a new `tag` with *anonymized* or *de-identified* information wherever needed. This way, "hidden tags" or *unlinked* tags in the input file will not be copied to the output. The so-called `free list` of tags, will not be copied to the output anonymized file either. The tag directory will not be copied to the output file either. This implies that the actual final size of the output file will slightly differ from the input file.
+
+If a specific `tag` with PHI or PII infomation is not present in the FIFF file, `mne_anonymize` will not create it.
+
+MNE Anonymize does not modify the input file. Moreover, this application can even read from write-protected folders. The new/altered output information will be stored in a newly created FIFF file. However, depending on the options, after MNE Anonymize has processed a FIFF file, there might be no way to recover the original information. Use this application with caution.
diff --git a/doc/website/docs/manual/browse-raw.mdx b/doc/website/docs/manual/browse-raw.mdx
new file mode 100644
index 00000000000..10433a5d9b7
--- /dev/null
+++ b/doc/website/docs/manual/browse-raw.mdx
@@ -0,0 +1,35 @@
+---
+title: MNE Browse Raw
+sidebar_label: MNE Browse Raw
+sidebar_position: 13
+---
+
+# MNE Browse Raw
+
+:::caution Under Development
+MNE Browse is currently being ported to MNE-CPP and is not yet feature-complete compared to the original MNE-C `mne_browse_raw` application. The information below describes the planned functionality.
+:::
+
+## Overview
+
+`mne_browse` is a GUI application for browsing and visualizing raw MEG/EEG data stored in FIFF format. It provides interactive viewing of multi-channel time-series data with tools for navigation, scaling, filtering, and channel selection.
+
+## Planned Features
+
+- Interactive scrolling through raw MEG/EEG data
+- Adjustable time scale and amplitude scaling
+- Channel selection and grouping
+- Real-time filtering display
+- Bad channel marking
+- Event/trigger display
+- SSP projection toggling
+- Data annotation
+
+## Current Status
+
+The basic browsing functionality is available through the `mne_browse` application. For more comprehensive raw data browsing and analysis capabilities, consider using the **[MNE Analyze](analyze)** application or **[MNE Scan](scan)** for real-time data viewing.
+
+## See Also
+
+- [MNE Analyze](analyze) — For offline analysis including raw data viewing
+- [MNE Scan](scan) — For real-time data acquisition and browsing
diff --git a/doc/website/docs/manual/forward.mdx b/doc/website/docs/manual/forward.mdx
new file mode 100644
index 00000000000..c9639c4035d
--- /dev/null
+++ b/doc/website/docs/manual/forward.mdx
@@ -0,0 +1,274 @@
+---
+title: The Forward Solution
+sidebar_label: Forward Solution
+sidebar_position: 3
+---
+
+# The Forward Solution
+
+This page covers the definitions of different coordinate systems employed in MNE software and FreeSurfer, the details of the computation of the forward solutions, and the associated low-level utilities.
+
+## MEG/EEG and MRI Coordinate Systems
+
+The coordinate systems used in MNE software (and FreeSurfer) and their relationships are described below. Except for the *sensor coordinates*, all of the coordinate systems are Cartesian and have the "RAS" (Right-Anterior-Superior) orientation, i.e., the $x$ axis points to the right, the $y$ axis to the front, and the $z$ axis up.
+
+The following diagram shows the relationships between all coordinate systems and the transformations connecting them:
+
+```mermaid
+flowchart LR
+ subgraph sg1 ["MEG / EEG Domain "]
+ direction LR
+ SENSOR["Sensor coordinates "]
+ DEVICE["Device coordinates "]
+ HEAD["Head coordinates "]
+ SENSOR -->|"T_s₁ … T_sₙ"| DEVICE
+ DEVICE -->|"T₁"| HEAD
+ end
+
+ subgraph sg2 ["MRI Domain "]
+ direction LR
+ VOXEL["MRI Voxel coordinates "]
+ SRAS["Surface RAS = MRI coords "]
+ MNI["MNI Talairach coordinates "]
+ FSTAL["FreeSurfer Talairach coordinates "]
+ VOXEL -->|"T₃"| SRAS
+ SRAS -->|"T₄"| MNI
+ MNI -->|"T₋ / T₊"| FSTAL
+ end
+
+ HEAD -->|"T₂ "| SRAS
+
+ classDef meeg fill:#cce5ff,stroke:#2874a6,stroke-width:2px,color:#0c3c60,rx:8,ry:8
+ classDef mri fill:#d4edda,stroke:#28a745,stroke-width:2px,color:#155724,rx:8,ry:8
+
+ class SENSOR,DEVICE,HEAD meeg
+ class VOXEL,SRAS,MNI,FSTAL mri
+
+ style sg1 fill:#eaf2fb,stroke:#2874a6,stroke-width:2px,color:#0c3c60,rx:10,ry:10
+ style sg2 fill:#eaf7ed,stroke:#28a745,stroke-width:2px,color:#155724,rx:10,ry:10
+
+ linkStyle default stroke:#6c757d,stroke-width:1.5px
+ linkStyle 4 stroke:#d4a017,stroke-width:2.5px
+```
+
+*Figure: MEG/EEG and MRI coordinate systems and the transformations between them. $T_1$ (Device → Head) is determined during MEG acquisition via HPI coils. $T_2$ (Head → MRI) is established during coregistration. $T_3$ and $T_4$ are provided by FreeSurfer.*
+
+### Coordinate Systems Related to MEG/EEG Data
+
+**Head coordinates**
+
+This is a coordinate system defined with help of the fiducial landmarks (nasion and the two auricular points). In FIFF files, EEG electrode locations are given in this coordinate system. In addition, the head digitization data acquired in the beginning of an MEG, MEG/EEG, or EEG acquisition are expressed in head coordinates.
+
+**Device coordinates**
+
+This is a coordinate system tied to the MEG device. The relationship of the Device and Head coordinates is determined during an MEG measurement by feeding current to three to five head-position indicator (HPI) coils and by determining their locations with respect to the MEG sensor array from the magnetic fields they generate.
+
+**Sensor coordinates**
+
+Each MEG sensor has a local coordinate system defining the orientation and location of the sensor. With help of this coordinate system, the numerical integration data needed for the computation of the magnetic field can be expressed conveniently. The channel information data in the FIFF files contain the information to specify the coordinate transformation between the coordinates of each sensor and the MEG device coordinates.
+
+### Coordinate Systems Related to MRI Data
+
+**Surface RAS coordinates**
+
+The FreeSurfer surface data are expressed in this coordinate system. The origin of this coordinate system is at the center of the conformed FreeSurfer MRI volumes (usually 256 × 256 × 256 isotropic 1-mm³ voxels) and the axes are oriented along the axes of this volume. The BEM surface and the locations of the sources in the source space are usually expressed in this coordinate system in the FIFF files. In this manual, the *Surface RAS coordinates* are usually referred to as *MRI coordinates* unless there is need to specifically discuss the different MRI-related coordinate systems.
+
+**RAS coordinates**
+
+This coordinate system has axes identical to the Surface RAS coordinates but the location of the origin is different and defined by the original MRI data, i.e., the origin is in a scanner-dependent location. There is hardly any need to refer to this coordinate system explicitly in the analysis with the MNE software. However, since the Talairach coordinates are defined with respect to *RAS coordinates* rather than the *Surface RAS coordinates*, the RAS coordinate system is implicitly involved in the transformation between Surface RAS coordinates and the two *Talairach* coordinate systems.
+
+**MNI Talairach coordinates**
+
+The MNI Talairach coordinate system provides a standard brain space. This transformation is determined during the FreeSurfer reconstruction process. These coordinates are in MNI305 space.
+
+**FreeSurfer Talairach coordinates**
+
+The problem with the MNI Talairach coordinates is that the linear MNI Talairach transform does not match the brains completely to the Talairach brain. This is because the Talairach atlas brain is a rather odd shape, and as a result, it is difficult to match a standard brain to the atlas brain using an affine transform. As a result, the MNI brains are slightly larger (in particular higher, deeper and longer) than the Talairach brain. The differences are larger as you get further from the middle of the brain, towards the outside. The FreeSurfer Talairach coordinates mitigate this problem by adding an additional transformation, defined separately for negative and positive MNI Talairach $z$ coordinates. These two transformations, denoted by $T_-$ and $T_+$, are fixed as follows:
+
+$$
+T_{-} = \begin{bmatrix}
+0.99 & 0 & 0 & 0 \\
+0 & 0.9688 & 0.042 & 0 \\
+0 & -0.0485 & 0.839 & 0 \\
+0 & 0 & 0 & 1
+\end{bmatrix}
+$$
+
+$$
+T_{+} = \begin{bmatrix}
+0.99 & 0 & 0 & 0 \\
+0 & 0.9688 & 0.046 & 0 \\
+0 & -0.0485 & 0.9189 & 0 \\
+0 & 0 & 0 & 1
+\end{bmatrix}
+$$
+
+### Coordinate Transformations
+
+The different coordinate systems are related by coordinate transformations. Generally:
+
+$$
+\begin{bmatrix} x_2 \\ y_2 \\ z_2 \\ 1 \end{bmatrix} = T_{12} \begin{bmatrix} x_1 \\ y_1 \\ z_1 \\ 1 \end{bmatrix} = \begin{bmatrix} R_{11} & R_{12} & R_{13} & x_0 \\ R_{21} & R_{22} & R_{23} & y_0 \\ R_{31} & R_{32} & R_{33} & z_0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x_1 \\ y_1 \\ z_1 \\ 1 \end{bmatrix}
+$$
+
+where $x_k$, $y_k$, and $z_k$ are the location coordinates in two coordinate systems, $T_{12}$ is the coordinate transformation from coordinate system "1" to "2", $x_0$, $y_0$, and $z_0$ is the location of the origin of coordinate system "1" in coordinate system "2", and $R_{jk}$ are the elements of the rotation matrix relating the two coordinate systems.
+
+The following table shows where coordinate transformations are stored:
+
+| Transformation | FreeSurfer | MNE |
+|---|---|---|
+| $T_1$ (Device → Head) | Not present | Measurement data files, Forward solution files, Inverse operator files |
+| $T_{s_1} \dots T_{s_n}$ (Sensor → Device) | Not present | Channel information in files containing $T_1$ |
+| $T_2$ (Head → MRI) | Not present | MRI description files, `-trans.fif` files, Forward solution files, Inverse operator files |
+| $T_3$ (MRI voxel → Surface RAS) | `mri/*.mgz` files | Internal reading |
+| $T_4$ (Surface RAS → MNI Talairach) | `mri/transforms/talairach.xfm` | Internal reading |
+| $T_-$ and $T_+$ | Hardcoded in software | Hardcoded in software |
+
+:::note
+In FreeSurfer, MNE, as well as in Neuromag software an integer voxel coordinate corresponds to the location of the center of a voxel.
+:::
+
+## The Head and Device Coordinate Systems
+
+The MEG/EEG head coordinate system employed in the MNE software is a right-handed Cartesian coordinate system. The direction of the $x$ axis is from left to right, that of the $y$ axis to the front, and the $z$ axis thus points up.
+
+The $x$ axis of the head coordinate system passes through the two periauricular or preauricular points digitized before acquiring the data with positive direction to the right. The $y$ axis passes through the nasion and is normal to the $x$ axis. The $z$ axis points up according to the right-hand rule and is normal to the $xy$ plane.
+
+The origin of the MEG device coordinate system is device dependent. Its origin is located approximately at the center of a sphere which fits the occipital section of the MEG helmet best with $x$ axis going from left to right and $y$ axis pointing front. The $z$ axis is normal to the $xy$ plane with positive direction up.
+
+:::note
+The above definition is identical to that of the Neuromag MEG/EEG (head) coordinate system. However, in 4D Neuroimaging and CTF MEG systems the head coordinate frame definition is different. The origin of the coordinate system is at the midpoint of the left and right auricular points. The $x$ axis passes through the nasion and the origin with positive direction to the front. The $y$ axis is perpendicular to the $x$ axis and lies in the plane defined by the three fiducial landmarks, positive direction from right to left. The $z$ axis is normal to the plane of the landmarks, pointing up. Note that in this convention the auricular points are not necessarily located on the $y$ coordinate axis. The file conversion utilities take care of these idiosyncrasies and convert all coordinate information to the MNE software head coordinate frame.
+:::
+
+## Creating the Source Space
+
+### Surface-Based Source Space
+
+The FIFF format source space files containing the dipole locations and orientations are created from the FreeSurfer surface reconstructions.
+
+### Volumetric or Discrete Source Space
+
+In addition to source spaces confined to a surface, the MNE software provides support for three-dimensional source spaces bounded by a surface as well as source spaces comprised of discrete, arbitrarily located source points.
+
+## Creating the BEM Meshes
+
+### Topology Checks
+
+The following topology checks are performed during the creation of BEM models:
+
+- **Completeness**: The total solid angle subtended by all triangles from a point inside the triangulation is calculated. The result should be very close to $4\pi$. If the result is $-4\pi$ instead, the ordering of the triangle vertices may be incorrect and the `--swap` option should be specified.
+
+- **Correct ordering**: The surfaces are verified to be inside each other as expected by checking that the solid angles subtended by triangles of a surface $S_k$ at all vertices of another surface $S_p$ (which is supposed to be inside it) equals $4\pi$. Since the surface relations are transitive, it is enough to check that the outer skull surface is inside the skin surface and that the inner skull surface is inside the outer skull one.
+
+- **Extent**: If the extent of any triangulated volume is smaller than 50 mm, an error is reported. This may indicate that the vertex coordinates have been specified in meters instead of millimeters.
+
+## Coil Geometry Information
+
+### The Sensor Coordinate System
+
+The sensor coordinate system is completely characterized by the location of its origin and the direction cosines of three orthogonal unit vectors pointing to the directions of the x, y, and z axis. The measurement FIFF files list these data in MEG device coordinates. Transformation to the MEG head coordinate frame can be accomplished by applying the device-to-head coordinate transformation matrix available in the data files.
+
+If $r_0$ is a row vector for the origin of the local sensor coordinate system and $e_x$, $e_y$, and $e_z$ are the row vectors for the three orthogonal unit vectors, all given in device coordinates, a location of a point $r_C$ in sensor coordinates is transformed to device coordinates ($r_D$) by:
+
+$$
+[r_D\ 1] = [r_C\ 1] T_{CD}
+$$
+
+where
+
+$$
+T = \begin{bmatrix} e_x & 0 \\ e_y & 0 \\ e_z & 0 \\ r_{0D} & 1 \end{bmatrix}
+$$
+
+### Calculation of the Magnetic Field
+
+The forward calculation computes the signals detected by each MEG sensor for three orthogonal dipoles at each source space location. This requires specification of the conductor model, the location and orientation of the dipoles, and the location and orientation of each MEG sensor as well as its coil geometry.
+
+The output of each SQUID sensor is a weighted sum of the magnetic fluxes threading the loops comprising the detection coil. The output of the $k$-th MEG channel, $b_k$, can be approximated by:
+
+$$
+b_k = \sum_{p=1}^{N_k} w_{kp} B(r_{kp}) \cdot n_{kp}
+$$
+
+where $r_{kp}$ are a set of $N_k$ integration points covering the pickup coil loops of the sensor, $B(r_{kp})$ is the magnetic field due to the current sources calculated at $r_{kp}$, $n_{kp}$ are the coil normal directions at these points, and $w_{kp}$ are the weights associated to the integration points.
+
+There are three accuracy levels for the numerical integration:
+
+| Level | Description | Planar gradiometers | Magnetometers |
+|---|---|---|---|
+| Simple | Simplest description | — | — |
+| Normal (default) | Recommended accuracy | 2 points | 4 points |
+| Accurate | Highest accuracy | 8 points | 16 points |
+
+### Implemented Coil Geometries
+
+The coil types fall in two general categories:
+
+- **Axial gradiometers and planar gradiometers**
+- **Planar magnetometers**
+
+For axial sensors, the $z$ axis of the local coordinate system is parallel to the field component detected, i.e., normal to the coil plane. For planar sensors, the $z$ axis is likewise normal to the coil plane and the $x$ axis passes through the center points of the two coil loops.
+
+#### Normal Coil Descriptions
+
+| Id | Description | n | r/mm | w |
+|---|---|---|---|---|
+| 2 | Neuromag-122 planar gradiometer | 2 | (±8.1, 0, 0) | ±1/16.2mm |
+| 2000 | A point magnetometer | 1 | (0, 0, 0) | 1 |
+| 3012 | Vectorview type 1 planar gradiometer | 2 | (±8.4, 0, 0.3) | ±1/16.8mm |
+| 3013 | Vectorview type 2 planar gradiometer | 2 | (±8.4, 0, 0.3) | ±1/16.8mm |
+| 3022 | Vectorview type 1 magnetometer | 4 | (±6.45, ±6.45, 0.3) | 1/4 |
+| 3023 | Vectorview type 2 magnetometer | 4 | (±6.45, ±6.45, 0.3) | 1/4 |
+| 3024 | Vectorview type 3 magnetometer | 4 | (±5.25, ±5.25, 0.3) | 1/4 |
+| 4001 | Magnes WH magnetometer | 4 | (±5.75, ±5.75, 0.0) | 1/4 |
+| 4002 | Magnes WH 3600 axial gradiometer | 8 | (±4.5, ±4.5, 0.0) / (±4.5, ±4.5, 50.0) | 1/4 / -1/4 |
+| 5001 | CTF 275 axial gradiometer | 8 | (±4.5, ±4.5, 0.0) / (±4.5, ±4.5, 50.0) | 1/4 / -1/4 |
+
+:::note
+If a plus-minus sign occurs in several coordinates, all possible combinations have to be included.
+:::
+
+### The Coil Definition File
+
+The coil geometry information is stored in the text file `coil_def.dat`. In this file, any lines starting with the pound sign (#) are comments. A coil definition starts with a description line containing the following fields:
+
+- **class** — A number indicating the class of this coil
+- **id** — Coil ID value
+- **accuracy** — The coil representation accuracy (1 = simple, 2 = normal, 3 = accurate)
+- **np** — Number of integration points in this representation
+- **size/m** — The size of the coil (diameter for circular, side length for square)
+- **baseline/m** — The baseline of the coil (zero for magnetometers)
+- **description** — Short description of this kind of coil
+
+Each coil description line is followed by one or more integration point lines with seven numbers: weight, x/m, y/m, z/m, nx, ny, nz.
+
+## Computing the Forward Solution
+
+The `mne_forward_solution` command computes the forward solution for MEG and EEG source localization. See the [command-line reference](tools-forward-solution) for detailed usage.
+
+### Software Gradient Compensation
+
+CTF and 4D Neuroimaging data may have been subjected to noise cancellation employing the data from the reference sensor array. Even though these sensors are rather far away from the brain sources, `mne_forward_solution` takes them into account in the computations. If the data file has software gradient compensation activated, it computes the field at the reference sensors in addition to the main MEG sensor array and computes a compensated forward solution.
+
+## The EEG Sphere Model
+
+The default EEG sphere model has the following structure:
+
+| Layer | Relative outer radius | σ (S/m) |
+|---|---|---|
+| Head | 1.0 | 0.33 |
+| Skull | 0.97 | 0.04 |
+| CSF | 0.92 | 1.0 |
+| Brain | 0.90 | 0.33 |
+
+When the sphere model is employed, the computation of the EEG solution can be substantially accelerated by using approximation methods described by Mosher, Zhang, and Berg. The forward solution approximates the solution with three dipoles in a homogeneous sphere whose locations and amplitudes are determined by minimizing the cost function:
+
+$$
+S(r_1,\dotsc,r_m,\ \mu_1,\dotsc,\mu_m) = \int_{\text{scalp}} (V_{\text{true}} - V_{\text{approx}})\ dS
+$$
+
+where $r_1,\dotsc,r_m$ and $\mu_1,\dotsc,\mu_m$ are the locations and amplitudes of the approximating dipoles and $V_{\text{true}}$ and $V_{\text{approx}}$ are the potential distributions given by the true and approximative formulas, respectively.
+
+## Averaging Forward Solutions
+
+One possibility to make a grand average over several runs of an experiment is to average the data across runs and average the forward solutions accordingly. The averaging computes a weighted average of several forward solutions for both MEG and EEG. Usually the EEG forward solution is identical across runs because the electrode locations do not change.
diff --git a/doc/website/docs/manual/inspect.mdx b/doc/website/docs/manual/inspect.mdx
new file mode 100644
index 00000000000..4f444e579a7
--- /dev/null
+++ b/doc/website/docs/manual/inspect.mdx
@@ -0,0 +1,176 @@
+---
+title: MNE Inspect
+sidebar_label: MNE Inspect
+---
+
+# MNE Inspect
+
+
+
+
+
+MNE Inspect is a 3D brain visualization and source analysis application. It provides an interactive viewer for FreeSurfer-reconstructed cortical surfaces, BEM models, source estimates, sensor layouts, functional connectivity networks, and evoked sensor-field maps — all within a single, integrated GUI.
+
+
+
+## Getting Started
+
+Launch MNE Inspect from the command line:
+
+```bash
+mne_inspect [options]
+```
+
+The application opens with the default MNE sample dataset. You can specify your own data via command-line options (see below) or load files interactively through the GUI controls.
+
+## Command-Line Options
+
+| Option | Description | Default |
+|---|---|---|
+| `--subjectPath ` | Path to the FreeSurfer subjects directory | `/resources/data/MNE-sample-data/subjects` |
+| `--subject ` | Subject name | `sample` |
+| `--bem ` | BEM surface file (FIFF) | — |
+| `--trans ` | Head-to-MRI transformation file (FIFF) | — |
+| `--stc ` | Source estimate file (can be repeated for multiple STCs) | — |
+| `--digitizer ` | Digitizer / sensor layout file (FIFF) | — |
+| `--srcSpace ` | Source space or forward solution file (FIFF) | — |
+| `--atlas ` | Atlas annotation file (lh or rh; the sibling hemisphere is auto-detected) | — |
+| `--evoked ` | Evoked / average data file (FIFF) | — |
+
+### Example
+
+```bash
+mne_inspect \
+ --subjectPath /data/subjects \
+ --subject sample \
+ --stc /data/sample-stc-lh.stc \
+ --bem /data/subjects/sample/bem/sample-5120-bem.fif \
+ --trans /data/sample-trans.fif \
+ --atlas /data/subjects/sample/label/lh.aparc.annot
+```
+
+## Features
+
+### Cortical Surface Visualization
+
+- Load and display FreeSurfer-reconstructed surfaces (inflated, pial, white, sphere, etc.)
+- Switch between surfaces at runtime via the **Surface** combo box
+- Apply different shader modes for surface rendering
+- Toggle left and right hemisphere visibility independently
+
+### Atlas Overlays
+
+- Load FreeSurfer atlas annotations (e.g., `aparc`, `aparc.a2009s`)
+- Overlay parcellation regions on the cortical surface with color coding
+- Both hemispheres are loaded automatically when one is specified
+
+### BEM Models
+
+- Load and display the three BEM layers: inner skull, outer skull, and head surface
+- Toggle individual layers on or off
+- Separate shader control for BEM surfaces
+- Optional fixed-color mode for BEM rendering
+
+### Source Estimates (STC)
+
+- Load and visualize MNE/dSPM/sLORETA source estimate time courses
+- Animated playback with adjustable speed (0.25x – 4x)
+- Real-time accurate playback mode with fractional sample stepping
+- Configurable colormap (Hot, Hot Negative, Jet, Bone, Red-Blue, Cool-Warm)
+- Adjustable threshold controls (min, mid, max) for activation display
+- Timeline scrubbing via slider
+- Support for loading multiple STC datasets and switching between them
+
+### Sensor and Digitizer Visualization
+
+- Load sensor layouts and digitizer points from FIFF files
+- Toggle visibility by sensor type: MEG, EEG
+- Toggle digitizer point categories: cardinal, HPI, EEG, extra points
+- Apply head-to-MRI coordinate transformation in real time
+
+### Dipole Fitting Results
+
+- Load and display dipole fit results
+- Toggle dipole visibility
+
+### Source Space
+
+- Load and display source space points from a forward solution file
+- Toggle source space visibility
+
+### Functional Connectivity Networks
+
+- Visualize connectivity networks in 3D
+- Adjustable threshold slider to filter network edges by strength
+- Configurable network colormap
+
+### Evoked Data and Sensor-Field Mapping
+
+- Load evoked / averaged data files
+- Display MEG and EEG sensor-field interpolation on the scalp surface
+- Show contour lines for MEG and EEG fields
+- Visualize the MEG sensor helmet (convex hull or point cloud)
+- Timeline scrubbing synchronized with STC playback (optional)
+
+### Sensor-Field Streaming
+
+- Stream sensor data with configurable modality (MEG / EEG)
+- Adjustable averaging window
+- Loop mode for continuous playback
+- Configurable colormap for sensor-field display
+
+### Multi-Viewport
+
+- Support for multiple simultaneous 3D viewports (1–4)
+- Independent camera control per viewport
+- Camera presets (e.g., anterior, posterior, left, right, dorsal, ventral)
+- Per-viewport editing target selection
+
+## Usage
+
+The simplest way to get started is to launch MNE Inspect directly from the command line or by double-clicking the executable. When started without any arguments, the application opens with an empty scene and you can load data interactively through the GUI — use the toolbar buttons and file dialogs to add surfaces, overlays, sensors, or any other supported data type one at a time. You can also pass individual files via the [command-line options](#command-line-options) listed above to pre-load specific datasets on startup.
+
+For day-to-day work, however, you typically want to inspect a complete subject context at once — cortical surfaces together with BEM meshes, source estimates, sensor positions, coordinate transforms, and evoked data. Assembling all of those `--stc`, `--bem`, `--digitizer`, … flags by hand quickly becomes tedious. This is where the **convenience launch scripts** come in.
+
+### Quick Launch Scripts
+
+The source tree ships with ready-made scripts that launch MNE Inspect with **all** MNE sample-data files pre-loaded — surfaces, BEM, STC, digitizer, atlas, source space, evoked, and coordinate transform — so you can start exploring immediately without assembling a long command line.
+
+| Platform | Script |
+|----------|--------|
+| macOS / Linux | `src/applications/mne_inspect/run.sh` |
+| Windows | `src/applications/mne_inspect/run.bat` |
+
+#### What the Scripts Do
+
+1. **Locate the build** — resolve the `mne_inspect` executable relative to the script directory (supports both flat builds and macOS `.app` bundles).
+2. **Set data paths** — default to `~/mne_data/MNE-sample-data` (or `%USERPROFILE%\mne_data\MNE-sample-data` on Windows). Override by setting the `MNE_DATA_PATH` environment variable.
+3. **Auto-discover STC files** — scan the `processed/` subdirectory for all `*-lh.stc` files and pass each one via `--stc`. If no processed STCs exist, the script falls back to the original `sample_audvis-meg-eeg-lh.stc`.
+4. **Launch with full context** — the final command line includes `--subjectPath`, `--subject`, `--bem`, `--digitizer`, `--trans`, `--srcSpace`, `--atlas`, `--evoked`, and all discovered `--stc` arguments.
+
+#### Running the Scripts
+
+```bash
+# From the project root (macOS / Linux)
+./src/applications/mne_inspect/run.sh
+
+# Or point to a custom data location
+MNE_DATA_PATH=/data/my_mne_sample ./src/applications/mne_inspect/run.sh
+```
+
+```bat
+:: From the project root (Windows)
+src\applications\mne_inspect\run.bat
+
+:: Or with a custom data location
+set MNE_DATA_PATH=D:\data\my_mne_sample
+src\applications\mne_inspect\run.bat
+```
+
+:::tip
+The scripts are a good starting point for creating your own launch configurations. Copy one and adjust the paths to load your own subject, BEM, and STC files.
+:::
+
+## Dependencies
+
+MNE Inspect depends on the `mne_disp3D_rhi` library and is only built when this library is available. It also links against `mne_fs`, `mne_fiff`, `mne_fwd`, `mne_mne`, `mne_disp`, `mne_inverse`, `mne_utils`, and `mne_connectivity`.
diff --git a/doc/website/docs/manual/intro.mdx b/doc/website/docs/manual/intro.mdx
new file mode 100644
index 00000000000..da633ee073e
--- /dev/null
+++ b/doc/website/docs/manual/intro.mdx
@@ -0,0 +1,74 @@
+---
+title: Introduction
+sidebar_label: Introduction
+sidebar_position: 1
+---
+
+# MNE-CPP Manual
+
+## Overview
+
+MNE-CPP provides a comprehensive set of tools for preprocessing and averaging of MEG and EEG data and for constructing cortically-constrained minimum-norm estimates. The software is based on anatomical MRI processing, forward modelling, and source estimation methods. The anatomical MRI processing routines depend on tools provided by the [FreeSurfer](https://surfer.nmr.mgh.harvard.edu/) software.
+
+This manual gives an overview of the software modules included with MNE-CPP, describes a typical workflow for a novice user, and provides detailed information about the individual software modules.
+
+:::info Heritage
+MNE-CPP is a C++ port of the original MNE software suite created by Matti Hämäläinen at the Martinos Center for Biomedical Imaging. This manual is adapted from the original MNE Manual and the [MNE-Python documentation](https://mne.tools/), preserving the valuable background information and mathematical descriptions while documenting the C++ implementations available in MNE-CPP.
+:::
+
+## Software Components
+
+The MNE-CPP software suite includes the following main components:
+
+### GUI Applications
+
+| Application | Description |
+|---|---|
+| [**mne_scan**](scan) | Real-time acquisition and processing of MEG/EEG data with plugin-based architecture |
+| [**mne_analyze**](analyze) | Sensor- and source-level analysis of pre-recorded MEG/EEG data *(under development)* |
+| [**mne_anonymize**](anonymize) | Removes or modifies personal health information from FIFF files (GUI and CLI) |
+| [**mne_inspect**](inspect) | 3D brain visualization and source analysis |
+| [**mne_browse**](browse-raw) | Browsing and visualization of raw MEG/EEG FIFF data files *(under development)* |
+
+### Command-Line Tools
+
+| Tool | Description |
+|---|---|
+| [**mne_compute_raw_inverse**](tools-compute-raw-inverse) | Computes inverse solutions (MNE/dSPM/sLORETA) from raw or evoked data |
+| [**mne_dipole_fit**](tools-dipole-fit) | Performs electric current dipole fitting on MEG/EEG data |
+| [**mne_edf2fiff**](tools-edf2fiff) | Converts EDF (European Data Format) files to FIFF format |
+| [**mne_forward_solution**](tools-forward-solution) | Computes the MEG/EEG forward solution |
+| [**mne_show_fiff**](tools-show-fiff) | Lists the contents of a FIFF file |
+| [**mne_flash_bem**](tools-flash-bem) | Creates BEM surfaces using multi-echo FLASH MRI sequences |
+| [**mne_setup_forward_model**](tools-setup-forward-model) | Sets up the BEM for forward modeling |
+| [**mne_setup_mri**](tools-setup-mri) | Sets up FreeSurfer MRI data for MNE processing |
+| [**mne_surf2bem**](tools-surf2bem) | Converts FreeSurfer surfaces to BEM FIFF files |
+| [**mne_watershed_bem**](tools-watershed-bem) | Creates BEM surfaces using FreeSurfer's watershed algorithm |
+| [**mne_rt_server**](tools-rt-server) | Real-time FIFF data streaming server |
+
+## Prerequisites
+
+To make full use of the MNE-CPP software, you will need:
+
+- **FreeSurfer**: Required for anatomical MRI processing, cortical surface reconstruction, and the creation of BEM meshes. Available at [https://surfer.nmr.mgh.harvard.edu/](https://surfer.nmr.mgh.harvard.edu/).
+
+- **MEG/EEG Data**: Data in FIFF format (the native format of Neuromag/Elekta/MEGIN MEG systems). Data from other systems can be converted using appropriate tools (e.g., `mne_edf2fiff` for EDF data).
+
+- **Environment Variables**: Several MNE-CPP tools rely on the following environment variables:
+ - `SUBJECTS_DIR` — The directory containing FreeSurfer subject reconstructions
+ - `SUBJECT` — The name of the current subject
+ - `FREESURFER_HOME` — The FreeSurfer installation directory
+
+## Chapter Overview
+
+- **[The Typical MEG/EEG Workflow](workflow)** — A step-by-step guide through a typical analysis pipeline
+- **[The Forward Solution](forward)** — Coordinate systems, BEM models, and forward computation
+- **[The Minimum-Norm Estimates](inverse)** — Mathematical background of inverse estimation methods
+- **[Signal-Space Projection](ssp)** — The SSP method for noise rejection
+- **[Command-Line Tools Reference](tools-overview)** — Detailed reference for all command-line tools
+- **[MNE Browse Raw](browse-raw)** — The raw data browser application
+- **[MNE Analyze](analyze)** — The analysis and visualization application
+
+## Acknowledgments
+
+The development of the MNE software has been supported by the National Center for Research Resources (NCRR), the NIH (grants R01EB009048, R01EB006385, R01HD40712), and the U.S. Department of Energy. We are grateful to the MNE software users at the Martinos Center and other institutions for their collaboration and valuable feedback on the software and its documentation.
diff --git a/doc/website/docs/manual/inverse.mdx b/doc/website/docs/manual/inverse.mdx
new file mode 100644
index 00000000000..143b44b51c7
--- /dev/null
+++ b/doc/website/docs/manual/inverse.mdx
@@ -0,0 +1,277 @@
+---
+title: The Minimum-Norm Estimates
+sidebar_label: Inverse Estimation
+sidebar_position: 4
+---
+
+# The Minimum-Norm Estimates
+
+This section describes the mathematical details of the calculation of minimum-norm estimates. In the Bayesian sense, the ensuing current distribution is the maximum a posteriori (MAP) estimate under the following assumptions:
+
+- The viable locations of the currents are constrained to the cortex. Optionally, the current orientations can be fixed to be normal to the cortical mantle.
+- The amplitudes of the currents have a Gaussian prior distribution with a known source covariance matrix.
+- The measured data contain additive noise with a Gaussian distribution with a known covariance matrix. The noise is not correlated over time.
+
+## The Linear Inverse Operator
+
+The measured data in the source estimation procedure consists of MEG and EEG data, recorded on a total of $N$ channels. The task is to estimate a total of $Q$ strengths of sources located on the cortical mantle. If the number of source locations is $P$, $Q = P$ for fixed-orientation sources and $Q = 3P$ if the source orientations are unconstrained.
+
+The regularized linear inverse operator following from regularized maximal likelihood of the above probabilistic model is given by the $Q \times N$ matrix:
+
+$$
+M = R' G^\top (G R' G^\top + C)^{-1}
+$$
+
+where $G$ is the **gain matrix** relating the source strengths to the measured MEG/EEG data, $C$ is the **data noise-covariance matrix** and $R'$ is the **source covariance matrix**. The dimensions of these matrices are $N \times Q$, $N \times N$, and $Q \times Q$, respectively.
+
+The expected value of the current amplitudes at time $t$ is then given by $\hat{j}(t) = Mx(t)$, where $x(t)$ is a vector containing the measured MEG and EEG data values at time $t$.
+
+## Regularization
+
+The a priori variance of the currents is, in practice, unknown. We can express this by writing $R' = R / \lambda^2$, which yields the inverse operator:
+
+$$
+M = R G^\top (G R G^\top + \lambda^2 C)^{-1}
+$$
+
+where the unknown current amplitude is now interpreted in terms of the **regularization parameter** $\lambda^2$. Larger $\lambda^2$ values correspond to spatially smoother and weaker current amplitudes, whereas smaller $\lambda^2$ values lead to the opposite.
+
+We can arrive at the regularized linear inverse operator also by minimizing a cost function $S$ with respect to the estimated current $\hat{j}$ (given the measurement vector $x$ at any given time $t$) as:
+
+$$
+\min_{\hat{j}} \left\{ S \right\} = \min_{\hat{j}} \left\{ \tilde{e}^\top \tilde{e} + \lambda^2 \hat{j}^\top R^{-1} \hat{j} \right\} = \min_{\hat{j}} \left\{ (x - G\hat{j})^\top C^{-1} (x - G\hat{j}) + \lambda^2 \hat{j}^\top R^{-1} \hat{j} \right\}
+$$
+
+where the first term consists of the difference between the whitened measured data and those predicted by the model, while the second term is a weighted-norm of the current estimate. With increasing $\lambda^2$, the source term receives more weight and larger discrepancy between the measured and predicted data is tolerable.
+
+## Whitening and Scaling
+
+The MNE software employs data whitening so that a "whitened" inverse operator assumes the form:
+
+$$
+\tilde{M} = M C^{1/2} = R \tilde{G}^\top (\tilde{G} R \tilde{G}^\top + \lambda^2 I)^{-1}
+$$
+
+where
+
+$$
+\tilde{G} = C^{-1/2} G
+$$
+
+is the spatially whitened gain matrix.
+
+The expected current values are:
+
+$$
+\hat{j}(t) = Mx(t) = \tilde{M} \tilde{x}(t)
+$$
+
+where $\tilde{x}(t) = C^{-1/2} x(t)$ is the whitened measurement vector at time $t$.
+
+The spatial whitening operator $C^{-1/2}$ is obtained with the help of the eigenvalue decomposition $C = U_C \Lambda_C^2 U_C^\top$ as $C^{-1/2} = \Lambda_C^{-1} U_C^\top$.
+
+In the MNE software the noise-covariance matrix is stored as the one applying to raw data. To reflect the decrease of noise due to averaging, this matrix, $C_0$, is scaled by the number of averages, $L$, i.e., $C = C_0 / L$.
+
+:::note
+When EEG data are included, the gain matrix $G$ needs to be average referenced when computing the linear inverse operator $M$. This is incorporated during creation of the spatial whitening operator $C^{-1/2}$, which includes any projectors on the data. EEG data average reference (using a projector) is mandatory for source modeling.
+:::
+
+A convenient choice for the source-covariance matrix $R$ is such that $\text{trace}(\tilde{G} R \tilde{G}^\top) / \text{trace}(I) = 1$. With this choice we can approximate $\lambda^2 \sim 1/\text{SNR}^2$, where SNR is the (amplitude) signal-to-noise ratio of the whitened data.
+
+:::note
+The definition of the signal-to-noise ratio / $\lambda^2$ relationship given above works nicely for the whitened forward solution. In the un-whitened case scaling with the trace ratio $\text{trace}(GRG^\top) / \text{trace}(C)$ does not make sense, since the diagonal elements summed have, in general, different units of measure. For example, the MEG data are expressed in T or T/m whereas the unit of EEG is Volts.
+:::
+
+## Regularization of the Noise-Covariance Matrix
+
+Since a finite amount of data is usually available to compute an estimate of the noise-covariance matrix $C$, the smallest eigenvalues of its estimate are usually inaccurate and smaller than the true eigenvalues. Depending on the seriousness of this problem, the following quantities can be affected:
+
+- The model data predicted by the current estimate
+- Estimates of signal-to-noise ratios, which lead to estimates of the required regularization
+- The estimated current values
+- The noise-normalized estimates
+
+Fortunately, the latter two are least likely to be affected due to regularization of the estimates. However, in some cases especially the EEG part of the noise-covariance matrix estimate can be deficient, i.e., it may possess very small eigenvalues and thus regularization of the noise-covariance matrix is advisable.
+
+Historically, the MNE software accomplishes the regularization by replacing a noise-covariance matrix estimate $C$ with:
+
+$$
+C' = C + \sum_k \varepsilon_k \bar{\sigma}_k^2 I^{(k)}
+$$
+
+where the index $k$ goes across the different channel groups (MEG planar gradiometers, MEG axial gradiometers and magnetometers, and EEG), $\varepsilon_k$ are the corresponding regularization factors, $\bar{\sigma}_k$ are the average variances across the channel groups, and $I^{(k)}$ are diagonal matrices containing ones at the positions corresponding to the channels contained in each channel group.
+
+## Computation of the Solution
+
+The most straightforward approach to calculate the MNE is to employ the expression of the original or whitened inverse operator directly. However, for computational convenience we prefer to take another route, which employs the singular-value decomposition (SVD) of the matrix:
+
+$$
+A = \tilde{G} R^{1/2} = U \Lambda V^\top
+$$
+
+where the superscript $^{1/2}$ indicates a square root of $R$.
+
+Combining the SVD with the inverse equation, it is easy to show that:
+
+$$
+\tilde{M} = R^{1/2} V \Gamma U^\top
+$$
+
+where the elements of the diagonal matrix $\Gamma$ are:
+
+$$
+\gamma_k = \frac{\lambda_k}{\lambda_k^2 + \lambda^2}
+$$
+
+If we define $w(t) = U^\top \tilde{x}(t) = U^\top C^{-1/2} x(t)$, then the expected current is:
+
+$$
+\hat{j}(t) = R^{1/2} V \Gamma w(t) = \sum_k \bar{v}_k \gamma_k w_k(t)
+$$
+
+where $\bar{v}_k = R^{1/2} v_k$, with $v_k$ being the $k$-th column of $V$. The current estimate is thus a **weighted sum of the "weighted" eigenleads** $v_k$.
+
+## Noise Normalization
+
+Noise normalization serves three purposes:
+
+1. It converts the expected current value into a **dimensionless statistical test variable**. Thus the resulting time and location dependent values are often referred to as dynamic statistical parameter maps (dSPM).
+
+2. It **reduces the location bias** of the estimates. In particular, the tendency of the MNE to prefer superficial currents is eliminated.
+
+3. The **width of the point-spread function** becomes less dependent on the source location on the cortical mantle.
+
+In practice, noise normalization is implemented as a division by the square root of the estimated variance of each voxel. Using our "weighted eigenleads" definition in matrix form as $\bar{V} = R^{1/2} V$:
+
+### dSPM
+
+Noise-normalized linear estimates introduced by Dale et al. (1999) require division of the expected current amplitude by its variance. The variance computation uses:
+
+$$
+M C M^\top = \tilde{M} \tilde{M}^\top = \bar{V} \Gamma^2 \bar{V}^\top
+$$
+
+The variances for each source are thus:
+
+$$
+\sigma_k^2 = \gamma_k^2
+$$
+
+Under the standard conditions, the $t$-statistic values associated with fixed-orientation sources are proportional to $\sqrt{L}$ while the $F$-statistic employed with free-orientation sources is proportional to $L$.
+
+:::note
+The MNE software usually computes the *square roots* of the F-statistic to be displayed on the inflated cortical surfaces. These are also proportional to $\sqrt{L}$.
+:::
+
+### sLORETA
+
+sLORETA (Pascual-Marqui, 2002) estimates the current variances as the diagonal entries of the **resolution matrix**, which is the product of the inverse and forward operators:
+
+$$
+MG = \bar{V} \Gamma \Lambda \bar{V}^\top R^{-1}
+$$
+
+Because $R$ is diagonal and we only care about the diagonal entries, the variance estimates are:
+
+$$
+\sigma_k^2 = \gamma_k^2 \left(1 + \frac{\lambda_k^2}{\lambda^2}\right)
+$$
+
+### eLORETA
+
+While dSPM and sLORETA solve for noise normalization weights $\sigma_k^2$ that are applied to standard minimum-norm estimates $\hat{j}(t)$, eLORETA (Pascual-Marqui, 2011) instead solves for a **source covariance matrix** $R$ that achieves zero localization bias. For fixed-orientation solutions the resulting matrix $R$ will be a diagonal matrix, and for free-orientation solutions it will be a block-diagonal matrix with $3 \times 3$ blocks.
+
+The following system of equations is used to find the weights, $\forall i \in \{1, \ldots, P\}$:
+
+$$
+r_i = \left[ G_i^\top \left( GRG^\top + \lambda^2 C \right)^{-1} G_i \right]^{-1/2}
+$$
+
+An iterative algorithm finds the values for the weights $r_i$ that satisfy these equations:
+
+1. Initialize identity weights.
+2. Compute $N = \left( GRG^\top + \lambda^2 C \right)^{-1}$.
+3. Holding $N$ fixed, compute new weights $r_i = \left[ G_i^\top N G_i \right]^{-1/2}$.
+4. Using new weights, go to step (2) until convergence.
+
+Using the whitened substitution $\tilde{G} = C^{-1/2} G$, the computations can be performed entirely in the whitened space, avoiding the need to compute $N$ directly:
+
+$$
+r_i = \left[ \tilde{G}_i^\top \tilde{N} \tilde{G}_i \right]^{-1/2}
+$$
+
+## Predicted Data
+
+Under noiseless conditions the SNR is infinite and thus leads to $\lambda^2 = 0$ and the minimum-norm estimate explains the measured data perfectly. Under realistic conditions, however, $\lambda^2 > 0$ and there is a misfit between measured data and those predicted by the MNE. Comparison of the predicted data $\hat{x}(t)$ and measured data can give valuable insight on the correctness of the regularization applied.
+
+In the SVD approach:
+
+$$
+\hat{x}(t) = G\hat{j}(t) = C^{1/2} U \Pi w(t)
+$$
+
+where the diagonal matrix $\Pi$ has elements $\pi_k = \lambda_k \gamma_k$. The predicted data is thus expressed as the weighted sum of the "recolored eigenfields" in $C^{1/2} U$.
+
+## Cortical Patch Statistics
+
+If source space distance information was used during source space creation, the source space file will contain Cortical Patch Statistics (CPS) for each vertex of the cortical surface. The CPS provide information about the source space point closest to each vertex as well as the distance from the vertex to this source space point.
+
+Once these data are available, the following cortical patch statistics can be computed for each source location $d$:
+
+- The **average over the normals** at the vertices in a patch, $\bar{n}_d$
+- The **areas of the patches**, $A_d$
+- The **average deviation** of the vertex normals in a patch from their average, $\sigma_d$, given in degrees
+
+## Orientation Constraints
+
+The principal sources of MEG and EEG signals are generally believed to be postsynaptic currents in the cortical pyramidal neurons. Since the net primary current associated with these microscopic events is oriented normal to the cortical mantle, it is reasonable to use the cortical normal orientation as a constraint in source estimation.
+
+In addition to allowing completely free source orientations, the MNE software implements three orientation constraints based on the surface normal data:
+
+- **Fixed orientation**: Source orientation is rigidly fixed to the surface normal direction. If cortical patch statistics are available, the average normal over each patch $\bar{n}_d$ is used. Otherwise, the vertex normal at the source space location is employed.
+
+- **Fixed Loose Orientation Constraint (fLOC)**: A source coordinate system based on the local surface orientation at the source location is employed. The first two source components lie in the plane normal to the surface normal, and the third component is aligned with it. The variance of the tangential components is reduced by a configurable factor.
+
+- **Variable Loose Orientation Constraint (vLOC)**: Similar to fLOC except that the loose factor is multiplied by $\sigma_d$ (the angular deviation of normals within the patch).
+
+## Depth Weighting
+
+The minimum-norm estimates have a bias towards superficial currents. This tendency can be alleviated by adjusting the source covariance matrix $R$ to favor deeper source locations. In the depth weighting scheme, the elements of $R$ corresponding to the $p$-th source location are scaled by a factor:
+
+$$
+f_p = (g_{1p}^\top g_{1p} + g_{2p}^\top g_{2p} + g_{3p}^\top g_{3p})^{-\gamma}
+$$
+
+where $g_{1p}$, $g_{2p}$, and $g_{3p}$ are the three columns of $G$ corresponding to source location $p$ and $\gamma$ is the order of the depth weighting.
+
+## Effective Number of Averages
+
+It is often the case that the epoch to be analyzed is a linear combination over conditions rather than one of the original averages computed. The noise-covariance matrix computed is originally one corresponding to raw data. Therefore, it has to be scaled correctly to correspond to the actual or effective number of epochs in the condition to be analyzed. In general:
+
+$$
+C = C_0 / L_{\text{eff}}
+$$
+
+where $L_{\text{eff}}$ is the effective number of averages. To calculate $L_{\text{eff}}$ for an arbitrary linear combination of conditions $y(t) = \sum_{i=1}^{n} w_i x_i(t)$:
+
+$$
+1 / L_{\text{eff}} = \sum_{i=1}^{n} w_i^2 / L_i
+$$
+
+For a **weighted average**, where $w_i = L_i / \sum_{i=1}^n L_i$:
+
+$$
+L_{\text{eff}} = \sum_{i=1}^{n} L_i
+$$
+
+For a **difference** of two categories ($w_1 = 1$, $w_2 = -1$):
+
+$$
+L_{\text{eff}} = \frac{L_1 L_2}{L_1 + L_2}
+$$
+
+Generalizing, for any combination of sums and differences where $w_i = \pm 1$:
+
+$$
+1 / L_{\text{eff}} = \sum_{i=1}^{n} 1/L_i
+$$
diff --git a/doc/website/docs/manual/scan-brainamp.mdx b/doc/website/docs/manual/scan-brainamp.mdx
new file mode 100644
index 00000000000..403e35d0885
--- /dev/null
+++ b/doc/website/docs/manual/scan-brainamp.mdx
@@ -0,0 +1,27 @@
+---
+title: BrainAmp
+sidebar_label: BrainAmp
+---
+# BrainAmp
+
+This article describes the installation and usage of the BrainAMP EEG driver plugin for MNE Scan.
+
+## Building the BrainAMP EEG plugin
+
+In order to build the BrainAMP driver, at first, the header file `BrainAmpIoCtl.h` from the BrainAMP SDK has to be included into the mne-cpp project. These files can be found in the device's attached software library. They have to be copied to the BrainAMP driver repository which is to be found under:
+
+`\mne-cpp\applications\mne_scan\plugins\brainamp`
+
+In a second step, the plugin's source code has to be reintegrated into the mne-cpp project. Therefore, in the file :
+
+`\mne-cpp\applications\mne_scan\plugins\plugins.pro`
+
+the plugin's project `brainamp` has to be restored by deleting the `#` in front of the name in the Sensor section. After this is done, the MNE Scan project can be rebuilt.
+
+## Running the BrainAMP EEG plugin
+
+For running the BrainAMP EEG plugin, the according driver has to be installed to the operating system. The files can also be found on the device attached software, as well as a documentation which will guide the whole process. After that, the BrainAMP EEG plugin can be used in the MNE Scan environment, like shown in the following figure.
+
+
+
+Delivered sample frequency and block size can be set on the plugin's surface. Please mind the depicted information. After the settings are done, the acquisition can be started with the green `run` button.
diff --git a/doc/website/docs/manual/scan-eegosports.mdx b/doc/website/docs/manual/scan-eegosports.mdx
new file mode 100644
index 00000000000..facf4d8cb2c
--- /dev/null
+++ b/doc/website/docs/manual/scan-eegosports.mdx
@@ -0,0 +1,57 @@
+---
+title: EEGoSports
+sidebar_label: EEGoSports
+---
+# EEGoSports
+
+This page describes the installation and usage of the EEGoSports driver plugin for MNE Scan.
+
+## Building the EEGoSports Plugin
+
+In order to build the EEGoSports driver plugin, the `eemagine` folder from the SDK has to be added to the EEGoSports folder in the mne-cpp repository in a first step. This location can be found in the mne-cpp repository under:
+
+`\mne-cpp\applications\mne_scan\plugins\eegosports\`
+
+The `eemagine` folder includes another folder called `sdk` which holds the necessary header and source files like: `amplifier.h, buffer.h, channel.h, exceptions.h, factory.h, stream.h, version.h, wrapper.cpp` and `wrapper.h`.
+
+In a second step, the eegosports subproject has to be reintegrated into the mne-cpp project. This can be achieved by adding `MNECPP_CONFIG += withEego` in the `mne-cpp.pri` file.
+
+Now, the whole EEGoSports plugin can be rebuilt. MNE Scan will then contain the EEGoSports plugin in its Sensor plugin section.
+
+## Running the EEGoSports Plugin
+
+For a correct recognition of the EEGoSports device, the operating system compatible driver has to be installed with the delivered software. Furthermore the two files `eego-SDK.lib` and `eego-SDK.dll` from the driver's library have to be copied to the location:
+
+`\mne-cpp\out\Release\apps\`
+
+In a last step, for older SDK versions the license files which are delivered with the device have to be copied to
+
+`C:\Users\Username\Documents\Eego`
+
+The license files should be named like `EE225-020032-000001`.
+
+For recent versions of the SDK, this step is not necessary.
+
+After that, the device can be connected to the computer and be switched on and MNE Scan can be started. It is now possible to use the EEGoSports plugin in the MNE Scan environment. Via drag & drop the plugin can be added to the plugin box and connected to other processing items like shown in the following figure.
+
+
+
+The GUI of the EEGoSports EEG plugin allows the adjustment of sample frequency and block size. A FIFF-data-stream is now streamed to the real-time display and subsequenty connected plugins.
+
+Besides the electrode measurements, the FIFF-data-stream additionally contains one channel for the reference electrode, the trigger channel, and the sample count channel.
+
+## Impedance Measurements
+
+Selecting the symbol opens the widget for impedance measurements.
+
+
+
+To display the electrode positions, the correct electrode layout has to be loaded via `Load Layout`. This file has to be in the `ELC` format and must contain the electrode labels and positions in the order, in which they are transmitted to the amplifier (see amplifier/eeg cap documentation).
+
+At the end of the list of electrodes, the positions of reference and ground electrodes should be added with the labels `REF` and `GND`.
+
+Two options exist for the color coding of the impedance values:
+
+* For `Threshold`, green color indicates an impedance value below the selected threshold, yellow color an impedance value below double the selected thresold, orange color an impedance value below three times the selected threshold, and dark red color an even higher impedance value.
+
+* For `Colormap`, the electrodes impedances are color-coded following a `Jet` colormap with the maximum of the colormap at the selected value.
diff --git a/doc/website/docs/manual/scan-forward.mdx b/doc/website/docs/manual/scan-forward.mdx
new file mode 100644
index 00000000000..ff0b2a4eb83
--- /dev/null
+++ b/doc/website/docs/manual/scan-forward.mdx
@@ -0,0 +1,64 @@
+---
+title: Forward Solution Plugin
+sidebar_label: Forward Solution Plugin
+---
+# Forward Solution Plugin
+
+The forward solution plugin handles all forward computation tasks within MNE Scan. It can be used to compute the EEG and MEG forward solution, based on a BEM and source model. Further, it is possible to update the MEG forward solution to a new head position provided by the [HPI Fitting plugin](scan-headmonitoring.mdx).
+
+## Input
+
+The Forward Solution plugin takes data from following plugins:
+* Sensor Plugins: [FiffSimulator plugin](scan-prerecordeddata.mdx), [FieldTripBuffer plugin](scan-ftbuffer.mdx)
+* [HPI Fitting plugin](scan-headmonitoring.mdx)
+
+## Output
+
+The computed forward solution can be passed to the [Source Localization plugin](scan-sourceloc.mdx).
+
+## Setup
+
+1. Load the Forward Solution Plugin from the Algorithm Plugins available in MNE Scan
+
+
+
+2. To compute the forward solution within MNE Scan, some files and settings have to be loaded respectively set before the start of the measurement. They can be accessed by clicking on the Forward Solution plugin in the Plugin Scene.
+
+
+
+| **Please note:** The measurement file can be an arbitrary measurement file observed on the System of choice. It is only used to extract the system-specific compensator data.|
+
+If not specified, the BEM model defaults to a sphere model.
+
+## Forward Solution Computation
+
+Once the settings are specified, and the aspired pipeline is designed, the measurement can be started.
+
+3. Open the control widget.
+
+
+
+4. Navigate to the `Forward Solution` tab.
+
+
+
+| **Please note:** If connected to the HPI Fitting plugin, the Forward Solution control widget first appears after the first successful HPI fit.|
+
+5. Compute the forward solution by pressing `Compute Forward Solution`.
+
+6. To pass the forward solution to the Source Localization plugin, it is necessary to enable the checkbox `Cluster Forward Solution`.
+
+7. If connected to the HPI Fitting plugin, it is possible to activate `Enable head position update` to update the forward solution once the defined thresholds within the HPI Plugin are exceeded.
+
+| **Please note:** This is not yet real-time capable. The forward solution computation takes some seconds. Therefore it is wise to choose the thresholds not too small.|
+
+## Pipelines
+
+In the following picture, some examples for processing pipelines, including the Forward Solution plugins, are presented.
+
+
+
+The pipeline on the left represents an easy source localization pipeline, whereas the right one can be used to compensate head movements during the measurement. The current head position, estimated by the HPI Fitting plugin, is used to update and recompute the forward solution. For this pipeline, it is further necessary to filter out the cHPI data before averaging. For further guides on setting up the components see:
+
+* [HPI Fitting plugin](scan-headmonitoring.mdx)
+* [Source Localization plugin](scan-sourceloc.mdx).
diff --git a/doc/website/docs/manual/scan-ftbuffer.mdx b/doc/website/docs/manual/scan-ftbuffer.mdx
new file mode 100644
index 00000000000..958998f0343
--- /dev/null
+++ b/doc/website/docs/manual/scan-ftbuffer.mdx
@@ -0,0 +1,34 @@
+---
+title: FieldTrip Buffer
+sidebar_label: FieldTrip Buffer
+---
+
+# FieldTrip Buffer
+
+The plugin interface with a FieldTrip Buffer running at a given address. It does not implement the buffer itself, only a client. It is non-invasive, and does not even have access to the MEG device directly, only the data pushed to the buffer.
+
+## Running with Neuromag/Elekta/MEGIN
+
+1. Download FieldTrip `neuromag2ft`
+
+ Download the fieldtrip source code on your acquisition computer, either from their [website](http://www.fieldtriptoolbox.org/download/) or their [GitHub page](https://github.com/fieldtrip/fieldtrip). We are interested in the executable `neuromag2ft`, which will serve as both our buffer host and interface to push data to the buffer.
+
+2. Get `neuromag2ft` set up
+
+ We will need to be able to run `neuromag2ft` on the acquisition computer for the Neuromag. Depending on your system, you might have to build it locally. You can do so by running the makefile in `/realtime/src/acquisition/neuromag/` with the command `make`. If in doubt, follow the [documentation](http://www.fieldtriptoolbox.org/development/realtime/neuromag/) on the fieldtrip buffer website.
+
+3. Run `neuromag2ft`
+
+ Run `neuromag2ft` on the aquisition computer. `neuromag2ft` can be run with different parameters, but for this example we will be running it with all default settings. For more options, run it with the `--help` flag. Run the executable in `/realtime/src/acquisition/neuromag/bin/`. This should both create a buffer and start an interface with the neuromag. This buffer will, by default, be hosted on port `1972`.
+
+4. Start data collection
+
+ Start collecting data and ensure it is being sent into the buffer through `neuromag2ft`. It is important that `neuromag2ft` already be running before data collection starts, otherwise `neuromag2ft` will not work.
+
+5. Set up plugin in MNE Scan
+
+ Run MNE Scan and select the `FtBuffer` plugin from the toolbar on the left. Set the buffer address, which will be the IP address of your aquisition computer, and port, which by default is `1972`. Click the `Set` button. This sets the `Address` and `Port` fields, and attempts to acquire a sample fif file created by `neuromag2ft`.
+
+6. Receive data
+
+ In MNE Scan, click the green start button on the top left to start the plugin.
diff --git a/doc/website/docs/manual/scan-gusbamp.mdx b/doc/website/docs/manual/scan-gusbamp.mdx
new file mode 100644
index 00000000000..0bebb8eda2e
--- /dev/null
+++ b/doc/website/docs/manual/scan-gusbamp.mdx
@@ -0,0 +1,27 @@
+---
+title: GUSBAmp
+sidebar_label: GUSBAmp
+---
+# GUSBAmp
+
+This article describes the installation and usage of the gUSBamp EEG driver plugin for MNE Scan.
+
+## Building the gUSBamp EEG Plugin
+
+In order to build the gUSBamp driver, at first, the header file `gtec_gUSBamp.h` and the two library files `gUSBamp_x64.lib` and `gUSBamp_x86.lib` from the gUSBamp SDK have to be included into the mne-cpp project. These files can be found in the device's attached software library. They have to be copied to the gUSBamp driver repository which is to be found under:
+
+`\mne-cpp\applications\mne_scan\plugins\gusbamp`
+
+In a second step, the plugin's source code has to be reintegrated into the mne-cpp project. Therefore, in the file :
+
+`\mne-cpp\applications\mne_scan\plugins\plugins.pro`
+
+the plugin's project `gusbamp` has to be restored by deleting the `#` in front of the name in the Sensor section. After this is done, the MNE Scan project can be rebuilt.
+
+## Running the gUSBamp EEG Plugin
+
+For running the gUSBamp EEG plugin, the according driver has to be installed to the operating system. The files can also be found on the device attached software, as well as a documentation which will guide the whole process. After that, the gUSBamp EEG plugin can be used in the MNE Scan environment, like shown in the following figure.
+
+
+
+The connected devices and the sample frequency can be set via `set serials` and `sample rate`. Up to 3 more gUSBamp slaves can be connected to one gUSBamp master. Usually, all channels are selected by default. Under `Single Channel Select`, this can be changed by clicking on the desired selection. After the settings are done, the acquisition can be started with the green `Run` button.
diff --git a/doc/website/docs/manual/scan-headmonitoring.mdx b/doc/website/docs/manual/scan-headmonitoring.mdx
new file mode 100644
index 00000000000..1cac589e0a3
--- /dev/null
+++ b/doc/website/docs/manual/scan-headmonitoring.mdx
@@ -0,0 +1,84 @@
+---
+title: Real-time Head Monitoring
+sidebar_label: Real-time Head Monitoring
+---
+# Real-time Head Monitoring
+
+This guide shows how to enable and use real-time head monitoring during a MEG measurement. Currently, only Neuromag/Elekta/MEGIN devices are supported.
+
+## Prerequisites
+
+Before you can monitor head movements during a measurement, ensur eyou have the following things setup:
+
+1. Enable continuous HPI (cHPi) during your measurement.
+2. Make sure you have digitized the subjects head (fiducials, HPI coils and additional head points) and you have access to the data.
+
+## Setup
+
+Real-time head monitoring works in combination with sensor plugins, such as the `FiffSimulator` or `FieldTripBuffer`. The following steps guide you through setting up the real-time head monitoring in MNE Scan:
+
+1. Setup the data stream. You can either:
+ * Stream pre-recorded data via the [FiffSimulator plugin](scan-prerecordeddata.mdx).
+ * Stream data from a MEG device connected via the [FieldTripBuffer plugin](scan-ftbuffer.mdx).
+
+2. Add the HPI Fitting plugin to the plugin scene and connect your sensor plugin from step one to the HPI Plugin.
+
+
+
+3. Start the measurement via the Play button in the top left corner
+
+4. You can open and control the settings for the HPI fitting via the Quick Control View. Open it by pressing the `QUICK CTRL` button and follow the steps described in the next section.
+
+
+
+MNE Scan should now look like following picture. You have the plugin scene on the left, the 3D View in the upper part and the data stream in the lower part. The 3D View shows an average head model that is aligned and scaled to digitized landmarks like LPA, RPA, Nasion and HPI coils. The head moddel shows up after the first succesfull HPI fit.
+
+
+
+## The Quick Control View
+
+The Quick Control View can be used to choose between different tabs, where every tab correspondds to one plugin. In case of a basic HPI Fitting pipeline, there should be three tabs: FiffSimulator or FieldTripBuffer, HpI Fitting and 3D View.
+
+
+
+The HPI Fitting and 3D View tabs and their functionalities are described in the following:
+
+### The HPI Fitting Widget
+The control widget for the HPI Fitting plugin consist of three tabs: `Load Digitizer`, `Fitting` and `Head Movements`.
+
+
+
+#### Load Digitizer
+1. Click the button `Load Digitizers` and navigate to the subject's digitized data which is stored in `.fif` format.
+2. The display will show how many digitizers of each kind were loaded.
+
+3. Enter the HPI coil frequencies. You can add and remove frequencies.
+
+4. If you don't know how your coils and frequencies are ordered, do an initial frequency ordering by pressing `Order coil frequencies`.
+
+#### Fitting
+
+5. Choose if you want to use `Signal Space Projection` (`SSP`) or `Compensators` when performing the fit.
+
+6. Do an initial HPI fit or enable continuous HPI fitting. Make sure you have started the measuring pipeline via the play button first. After the first succesfull fit the average head should appear in the 3D View.
+7. The `Fitting errors` are shown in mm for each coil and as an average over all coils. The error is calculated as the distance between the estimated HPI coils and the digitized HPI positions.
+8. Choose a threshold that defines an acceptable error.
+
+#### Head Movements
+9. Choose a threshold that defines big head movements by rotation (degree) and movement (mm). Once exceeded, e.g., the forward solution recomputation is triggered.
+
+### The 3D View tab
+
+
+
+Here you can choose what elements you want to visualize in the monitoring section. These elements include:
+
+* Device > `VectorView` or `BabyMEG` features the helmet surfaces for different MEG devices.
+* Head > `Average`, `Tracked` and `Fitted` features the averaged head surface, digitized and aligned landmarks as well as the estimated HPI coil locations, respectivley.
+
+## Connections
+
+The HPI Fitting Plugin can be connected to following Plugins:
+
+* Input: [FiffSimulator plugin](scan-prerecordeddata.mdx), [FieldTripBuffer plugin](scan-ftbuffer.mdx).
+* Output: [Forward Solution plugin](scan-headmonitoring.mdx)
diff --git a/doc/website/docs/manual/scan-interfacewithanalyze.mdx b/doc/website/docs/manual/scan-interfacewithanalyze.mdx
new file mode 100644
index 00000000000..3ee6188187a
--- /dev/null
+++ b/doc/website/docs/manual/scan-interfacewithanalyze.mdx
@@ -0,0 +1,8 @@
+---
+title: Linking to MNE Analyze
+sidebar_label: Linking to MNE Analyze
+---
+
+# Linking with MNE Analyze
+
+MNE Scan can send clips of recording data to MNE Analyze in real time. Follow [this guide](analyze-realtime.mdx) to set it up.
diff --git a/doc/website/docs/manual/scan-lsl.mdx b/doc/website/docs/manual/scan-lsl.mdx
new file mode 100644
index 00000000000..81f420a9e9e
--- /dev/null
+++ b/doc/website/docs/manual/scan-lsl.mdx
@@ -0,0 +1,27 @@
+---
+title: LSL
+sidebar_label: LSL
+---
+# Lab Streaming Layer (LSL)
+
+This plugin adds support for LSL data streams to MNE Scan. MNE-CPP includes a self-contained LSL library under `src/libraries/lsl` that implements the core LSL protocol (stream discovery via UDP multicast, data transport via TCP), eliminating the need for any external dependency.
+
+For more information about the original LSL project please see:
+
+* [LSL on Github](https://github.com/sccn/labstreaminglayer)
+
+## Building the LSL Plugin
+
+The LSL plugin is built by default. Configure the project as usual:
+
+```
+cmake -B build -S .
+cmake --build build
+```
+
+No external submodule or library is required — the built-in `mne_lsl` library provides all necessary LSL functionality.
+
+## LSL Plugin Setup
+
+* Build MNE Scan.
+* Start MNE Scan — the LSL adapter plugin will be available in the sensor plugins list.
diff --git a/doc/website/docs/manual/scan-natus.mdx b/doc/website/docs/manual/scan-natus.mdx
new file mode 100644
index 00000000000..7123a3b440d
--- /dev/null
+++ b/doc/website/docs/manual/scan-natus.mdx
@@ -0,0 +1,14 @@
+---
+title: Natus
+sidebar_label: Natus
+---
+# Natus
+
+|**Please note:** We are working with the SDK v 8.4 so we are only able to connect to a Quantum system. These are typically used in phase 2 surgery of epilepsy.|
+
+Follow the steps below to connect to a Natus amplifier:
+
+* Select streaming machine. If not present add it to the SelectStreamingMachine Visual studio project and rebuild.
+* Start the startDataTransmit.bat .
+* Check if it connects and streams data based on the message in the left lower corner.
+* Start MNE Scan. Find out number of channels and sampling frequency. Start the Natus plugin.
diff --git a/doc/website/docs/manual/scan-prerecordeddata.mdx b/doc/website/docs/manual/scan-prerecordeddata.mdx
new file mode 100644
index 00000000000..f34354a6011
--- /dev/null
+++ b/doc/website/docs/manual/scan-prerecordeddata.mdx
@@ -0,0 +1,26 @@
+---
+title: Stream Pre-Recorded Data
+sidebar_label: Stream Pre-Recorded Data
+---
+# Stream Pre-Recorded Data
+
+Follow these steps to playback recorded data through the MNE Rt Server to MNE Scan.
+
+* Pass the path to the file you would like to stream via the `-f` or `--file` command line argument. For example: `mne_rt_server --file ../resources/data/MNE-sample-data/MEG/sample/ernoise_raw.fif`.
+* Alternativley, you can navigate and edit to the `FiffSimulation.cfg` file manually. Open the `mne-cpp\resources\mne_rt_server_plugins\FiffSimulation.cfg` with a text editor and insert the path and file name of the fif file which you want to stream. For example: `simFile = ../resources/data/MNE-sample-data/MEG/sample/ernoise_raw.fif`
+* Start the mne_rt_server `mne-cpp\out\Release\apps\mne_rt_server`
+* Start MNE Scan `mne-cpp\out\Release\apps\mne_scan`
+* Select the `FiffSimulator` plug-in and place it on the plug-in scene.
+
+
+
+* Click on the `FiffSimulator` plug-in and select the `Connection` tab. If you have started the `mne_rt_server` on your local machine, use IP `127.0.0.1` and press `Connect`. The status should change to `Connected`.
+* Click on the `FiffSimulator` plug-in and select the `Preferences` tab. We recommend to use the same block size as the sampling frequency. This way the data will be refreshed every second.
+
+
+
+* Press the green play button in the left upper corner.
+
+
+
+* If you click on the `FiffSimulator` plug-in you should now see the real-time data display.
diff --git a/doc/website/docs/manual/scan-sourceloc.mdx b/doc/website/docs/manual/scan-sourceloc.mdx
new file mode 100644
index 00000000000..1829a9689dd
--- /dev/null
+++ b/doc/website/docs/manual/scan-sourceloc.mdx
@@ -0,0 +1,49 @@
+---
+title: Real-time Source Localization
+sidebar_label: Real-time Source Localization
+---
+# Real-time Source Localization
+
+This tutorial will show how you can set up an acquisition and real-time source localization pipeline in MNE Scan.
+
+* Make sure you correctly setup the MNE Sample Data Set. On MacOS please make sure that you copied the MNE-Sample-data-set to mne_scan.app/Contents/MacOS/ as well.
+* Start mne_rt_server in your mne-cpp/out/Release folder.
+* Start mne_scan in your mne-cpp/out/Release folder.
+* Navigate to the "Sensor Plugins" and "Algorithm Plugins" buttons in the plugin window. Select and position the following plugins onto the plugin scene:
+ * Sensor Plugins - FiffSimulator
+ * Algorithm Plugins - Averaging
+ * Algorithm Plugins - Forward Solution
+ * Algorithm Plugins - Covariance
+ * Algorithm Plugins - MNE
+* Select the "Connection tool" in the plugin window. Connect the plugins as follows by left clicking on the start, holding and releasing above the target plugin.
+
+
+
+* Click on the Fiff Simulator plugin and press the "Connect" button.
+* Start the pipeline via the green "Play" button in the top left corner.
+
+Now that you should see the different views for each plugin displaying the incoming data, averages and so on.
+
+* Click on the Averaging plugin.
+ * Choose the correct trigger channel. For example STI014 when streaming the default file sample_audvis_raw.fif.
+ * Once the averages are starting to come in you can take a look at the averaged data in form of a butterfly and 2D layout plot.
+
+
+
+* Click on the Forward Solution plugin.
+ * Make sure that the "Cluster forward solution" box is checked.
+ * Press the "Compute Forward Solution" button.
+ * Wait until the "Status computation" label shows a green Finished. Computing the forward solution may take some time. However, this only has to be done once.
+
+
+
+* Once the forward solution was calculated, the source localization plugin controls should appear in the QuickControlView. Select the plugin.
+ * Choose the source localization method, trigger type and time point you want to visualize. If you set the time point outside the range of the computed average (e.g. 1000ms), the data will be streamed sample by sample.
+
+
+
+* You can change the 3D visualization setting by selecting the "3D View" plugin controls in the QuickControlView.
+ * If you prefer cortically constrained interpolation you can switch from "Annotation based" to "Interpolation based".
+ * The threshold of the plotted activation can be changed by clicking on the field with the three floating values. This will open a histogram based thresholding widget. Use the left, middle and right mouse buttons to set the threshold values.
+
+
diff --git a/doc/website/docs/manual/scan-tmsi.mdx b/doc/website/docs/manual/scan-tmsi.mdx
new file mode 100644
index 00000000000..fb4c4fb1257
--- /dev/null
+++ b/doc/website/docs/manual/scan-tmsi.mdx
@@ -0,0 +1,13 @@
+---
+title: TMSI
+sidebar_label: TMSI
+---
+# TMSI
+
+The TMSI plugin is only available on the Windows operating system; the TMSI SDK is only available for that platform. Currently the TMSI plugin is not available in the compiled binary releases of MNE-CPP. To get the plugin, it is necessary to build mne_scan from source while having the tmsi drivers installed (you need to make sure that the `TMSiSDK.dll` is present in `C:/Windows/System32/TMSiSDK.dll`.). Follow the instruction in the [build guide](../development/buildguide-cmake.mdx). If building with the command line script, add `tmsi` after the call, like so:
+
+```
+./tools/build_project.bat tmsi
+```
+
+If building in QtCreator or calling CMake manually, add `-DWITH_TMSI=ON` to your CMake step.
diff --git a/doc/website/docs/manual/scan.mdx b/doc/website/docs/manual/scan.mdx
new file mode 100644
index 00000000000..cccb62656a1
--- /dev/null
+++ b/doc/website/docs/manual/scan.mdx
@@ -0,0 +1,37 @@
+---
+title: MNE Scan
+sidebar_label: MNE Scan
+---
+# MNE Scan
+
+
+
+MNE Scan is MNE-CPP's real-time data acquisition and processing application. It uses a modular **plugin pipeline** where data flows from acquisition plugins through processing stages to output plugins. Users wire plugins together in a visual GUI, enabling flexible experiment setups without writing code.
+
+## Key Features
+
+- **Real-time acquisition** from MEG and EEG hardware (BabyMEG, Neuromag/Elekta/MEGIN, BrainAmp, gUSBamp, EEGoSports, TMSI, Natus) or via generic protocols (FieldTrip Buffer, Lab Streaming Layer)
+- **Signal processing** including real-time filtering, noise reduction (SSP/compensators), signal-space separation, and artifact rejection
+- **Real-time averaging** with configurable baseline correction and artifact thresholds
+- **Forward modeling** with on-the-fly BEM-based computation and optional HPI-driven head-position updates
+- **Source localization** using minimum-norm estimates (MNE), including real-time cortical source mapping with 3D visualization
+- **Head position monitoring** with continuous HPI coil fitting for MEG systems
+- **Neuronal connectivity** estimation in real time
+- **File recording** in FIFF format for offline analysis
+- **Pre-recorded data playback** via the FiffSimulator plugin for testing and development
+
+## Plugin Architecture
+
+MNE Scan plugins fall into three categories:
+
+| Category | Role | Examples |
+|----------|------|----------|
+| **Sensor** | Acquire data from hardware or network streams | FiffSimulator, BabyMEG, BrainAmp, LSL, FieldTrip Buffer |
+| **Algorithm** | Process data in the pipeline | Averaging, Covariance, Noise Reduction, Forward Solution, MNE, HPI |
+| **IO** | Output or store results | Write-to-File |
+
+Plugins are loaded as shared libraries at runtime and communicate through typed input/output connectors linked by lock-free ring buffers.
+
+## Guides
+
+Below are guides to get you started with MNE Scan.
diff --git a/doc/website/docs/manual/ssp.mdx b/doc/website/docs/manual/ssp.mdx
new file mode 100644
index 00000000000..73969ce2fbb
--- /dev/null
+++ b/doc/website/docs/manual/ssp.mdx
@@ -0,0 +1,89 @@
+---
+title: Signal-Space Projection
+sidebar_label: Signal-Space Projection
+sidebar_position: 5
+---
+
+# The Signal-Space Projection (SSP) Method
+
+The Signal-Space Projection (SSP) is one approach to rejection of external disturbances in software. This section presents the relevant mathematical details of this method.
+
+## General Concepts
+
+Unlike many other noise-cancellation approaches, SSP does not require additional reference sensors to record the disturbance fields. Instead, SSP relies on the fact that the magnetic field distributions generated by the sources in the brain have spatial distributions sufficiently different from those generated by external noise sources. Furthermore, it is implicitly assumed that the linear space spanned by the significant external noise patterns has a low dimension.
+
+Without loss of generality we can always decompose any $n$-channel measurement $b(t)$ into its signal and noise components as:
+
+$$
+b(t) = b_s(t) + b_n(t)
+$$
+
+Further, if we know that $b_n(t)$ is well characterized by a few field patterns $b_1 \ldots b_m$, we can express the disturbance as:
+
+$$
+b_n(t) = Uc_n(t) + e(t)
+$$
+
+where the columns of $U$ constitute an orthonormal basis for $b_1 \ldots b_m$, $c_n(t)$ is an $m$-component column vector, and the error term $e(t)$ is small and does not exhibit any consistent spatial distributions over time, i.e., $C_e = E\{ee^\top\} = I$.
+
+We call the column space of $U$ the **noise subspace**. The basic idea of SSP is that we can find a small basis set $b_1 \ldots b_m$ such that the conditions described above are satisfied. We can now construct the **orthogonal complement operator**:
+
+$$
+P_\perp = I - UU^\top
+$$
+
+and apply it to $b(t)$ yielding:
+
+$$
+b_s(t) \approx P_\perp b(t)
+$$
+
+since $P_\perp b_n(t) = P_\perp (Uc_n(t) + e(t)) \approx 0$ and $P_\perp b_s(t) \approx b_s(t)$.
+
+The projection operator $P_\perp$ is called the **signal-space projection operator** and generally provides considerable rejection of noise, suppressing external disturbances by a factor of 10 or more.
+
+### Effectiveness of SSP
+
+The effectiveness of SSP depends on two factors:
+
+1. **Complete noise characterization**: The basis set $b_1 \ldots b_m$ should be able to characterize the disturbance field patterns completely. If this requirement is not satisfied, some noise will leak through because $P_\perp b_n(t) \neq 0$.
+
+2. **Orthogonality to signal**: The angles between the noise subspace spanned by $b_1 \ldots b_m$ and the signal vectors $b_s(t)$ should be as close to $\pi/2$ as possible. If any of the brain signal vectors $b_s(t)$ is close to the noise subspace, not only the noise but also the signal will be attenuated by the application of $P_\perp$ and, consequently, there might be little gain in signal-to-noise ratio.
+
+:::important
+Since the signal-space projection modifies the signal vectors originating in the brain, it is necessary to apply the projection to the forward solution in the course of inverse computations.
+:::
+
+## Estimation of the Noise Subspace
+
+Application of SSP requires the estimation of the signal vectors $b_1 \ldots b_m$ constituting the noise subspace. The most common approach is to:
+
+1. Compute a **covariance matrix of empty room data**
+2. Compute its **eigenvalue decomposition**
+3. Employ the **eigenvectors corresponding to the highest eigenvalues** as basis for the noise subspace
+
+It is also customary to use a separate set of vectors for magnetometers and gradiometers in the Vectorview system.
+
+## EEG Average Electrode Reference
+
+The EEG average reference is the mean signal over all the sensors. It is typical in EEG analysis to subtract the average reference from all the sensor signals $b^1(t), \ldots, b^n(t)$:
+
+$$
+b^j_s(t) = b^j(t) - \frac{1}{n}\sum_k b^k(t)
+$$
+
+where the noise term $b^j_n(t)$ is given by:
+
+$$
+b^j_n(t) = \frac{1}{n}\sum_k b^k(t)
+$$
+
+Thus, the projector vector $P_\perp$ will be given by:
+
+$$
+P_\perp = \frac{1}{n}[1, 1, \ldots, 1]
+$$
+
+:::warning
+When applying SSP, the signal of interest can also be sometimes removed. Therefore, it's always a good idea to check how much the effect of interest is reduced by applying SSP. SSP might remove *both* the artifact and the signal of interest.
+:::
diff --git a/doc/website/docs/manual/tools-anonymize.mdx b/doc/website/docs/manual/tools-anonymize.mdx
new file mode 100644
index 00000000000..bb17cc29e3b
--- /dev/null
+++ b/doc/website/docs/manual/tools-anonymize.mdx
@@ -0,0 +1,94 @@
+---
+title: mne_anonymize
+sidebar_label: mne_anonymize
+sidebar_position: 11
+---
+
+# mne_anonymize
+
+## Overview
+
+`mne_anonymize` removes or modifies Personal Health Information (PHI) and Personal Identifiable Information (PII) from FIFF files. It can operate in both GUI and command-line modes.
+
+## Usage
+
+```bash
+mne_anonymize [options]
+```
+
+## Options
+
+| Option | Description |
+|---|---|
+| `--no-gui` | Run in command-line mode (no GUI) |
+| `--version` | Show version information |
+| `-i, --in ` | Input FIFF file to anonymize **(required)** |
+| `-o, --out ` | Output file (default: input file with `_anonymized.fif` suffix) |
+| `-v, --verbose` | Verbose output |
+| `-s, --silent` | Suppress all terminal output |
+| `-d, --delete_input_file_after` | Delete input file after successful anonymization |
+| `-f, --avoid_delete_confirmation` | Skip deletion confirmation dialog |
+| `-b, --brute` | Also anonymize weight, height, sex, handedness, and project data |
+| `--md, --measurement_date ` | Set measurement date to specified value |
+| `--mdo, --measurement_date_offset ` | Offset measurement date by N days |
+| `--sb, --subject_birthday ` | Set subject birthday to specified value |
+| `--sbo, --subject_birthday_offset ` | Offset subject birthday by N days |
+| `--his ` | Set Hospital Information System subject ID |
+| `--mne_environment` | Also anonymize MNE working directory and command line tags |
+
+## Description
+
+`mne_anonymize` is an essential tool for preparing MEG/EEG data for sharing while complying with data privacy regulations (e.g., HIPAA, GDPR). It modifies or removes the following information from FIFF files:
+
+### Standard Anonymization (default)
+
+- **Measurement date** — Replaced with a default date or user-specified value
+- **MAC address** — Removed
+- **Experimenter name** — Cleared
+- **Subject information** — Name, birthday, ID cleared
+- **MNE toolbox metadata** — Working directory and command history cleared
+
+### Brute Mode (`--brute` flag)
+
+In addition to the standard anonymization, brute mode also removes:
+
+- Subject weight and height
+- Subject sex and handedness
+- Project information (ID, name, aim, persons, comment)
+
+### Date Offsetting
+
+Instead of replacing dates with default values, you can use offset options to shift dates by a fixed number of days. This preserves temporal relationships (e.g., age at measurement) while anonymizing absolute dates:
+
+```bash
+# Shift all dates back by 365 days
+mne_anonymize --in data.fif --mdo -365 --sbo -365
+```
+
+## Examples
+
+Basic anonymization:
+
+```bash
+mne_anonymize --no-gui --in subject01_raw.fif
+```
+
+Full anonymization with specific output file:
+
+```bash
+mne_anonymize --no-gui --in subject01_raw.fif --out anon_raw.fif --brute
+```
+
+Anonymize with date offset (preserving age):
+
+```bash
+mne_anonymize --no-gui --in subject01_raw.fif \
+ --mdo -1000 --sbo -1000 --brute
+```
+
+Anonymize and delete original:
+
+```bash
+mne_anonymize --no-gui --in subject01_raw.fif \
+ --delete_input_file_after --avoid_delete_confirmation --brute
+```
diff --git a/doc/website/docs/manual/tools-compute-raw-inverse.mdx b/doc/website/docs/manual/tools-compute-raw-inverse.mdx
new file mode 100644
index 00000000000..81b2f6d3034
--- /dev/null
+++ b/doc/website/docs/manual/tools-compute-raw-inverse.mdx
@@ -0,0 +1,110 @@
+---
+title: mne_compute_raw_inverse
+sidebar_label: mne_compute_raw_inverse
+sidebar_position: 7
+---
+
+# mne_compute_raw_inverse
+
+## Overview
+
+`mne_compute_raw_inverse` computes inverse solutions (MNE, dSPM, or sLORETA) from raw or evoked FIFF data using a pre-computed inverse operator. It supports label-restricted source estimation and outputs results as STC files.
+
+This is a C++ port of the original MNE-C tool by Matti Hämäläinen.
+
+## Usage
+
+```bash
+mne_compute_raw_inverse [options]
+```
+
+## Options
+
+| Option | Description |
+|---|---|
+| `--in ` | Raw or evoked data input file **(required)** |
+| `--inv ` | Inverse operator file **(required)** |
+| `--snr ` | SNR value to use for regularization (default: 1.0) |
+| `--nave ` | Number of averages (default: 1 for raw, from data for evoked) |
+| `--set ` | Evoked data set number to process (default: process all) |
+| `--bmin ` | Baseline starting time in milliseconds |
+| `--bmax ` | Baseline ending time in milliseconds |
+| `--label ` | Label file to restrict processing to (can specify multiple) |
+| `--labeldir ` | Process all labels in directory, compute average waveform per label |
+| `--out ` | Output file name (needed when using `--labeldir`) |
+| `--picknormalcomp` | Pick current component normal to cortex only |
+| `--spm` | Use dSPM noise-normalization method |
+| `--sloreta` | Use sLORETA noise-normalization method |
+| `--mricoord` | Output source locations in MRI coordinates |
+| `--orignames` | Use original label file names in channel names |
+| `--align_z` | Align waveform signs using surface normal information |
+| `--labellist ` | Output label name list to specified file |
+
+## Description
+
+This tool applies a pre-computed inverse operator to MEG/EEG data to produce source estimates on the cortical surface. The inverse operator must be pre-computed and stored in a FIFF file.
+
+### Inverse Methods
+
+Three methods are available for computing the source estimates:
+
+- **MNE (default)** — Standard minimum-norm estimate. Provides current amplitude estimates in physical units (Am).
+
+- **dSPM** (`--spm` flag) — Dynamic Statistical Parametric Mapping. Produces noise-normalized estimates that are dimensionless statistical test variables. Reduces location bias compared to MNE.
+
+- **sLORETA** (`--sloreta` flag) — Standardized Low-Resolution Electromagnetic Tomography. Another noise normalization approach that uses the resolution matrix diagonal for variance estimation.
+
+For mathematical details on these methods, see [The Minimum-Norm Estimates](inverse).
+
+### Regularization (SNR)
+
+The `--snr` parameter controls the regularization of the inverse solution. The regularization parameter $\lambda^2$ is related to the SNR by $\lambda^2 \approx 1/\text{SNR}^2$.
+
+- **Higher SNR** → less regularization → noisier but potentially more detailed estimates
+- **Lower SNR** → more regularization → smoother estimates
+
+For averaged evoked data, typical SNR values are 1.0–3.0. The number of averages (`--nave`) is automatically taken into account.
+
+### Label-Based Analysis
+
+The `--label` option restricts the inverse computation to a specific cortical region defined by a FreeSurfer label file. Multiple labels can be specified. This is useful for ROI-based analyses.
+
+The `--labeldir` option processes all labels in a directory and computes the average source waveform for each label, which is useful for atlas-based analyses.
+
+### Output
+
+The output is written as STC (source estimate) files, which contain the estimated source activity at each source space location over time. These files can be visualized using `mne_inspect` or other MNE visualization tools.
+
+## Examples
+
+Compute dSPM source estimates from evoked data:
+
+```bash
+mne_compute_raw_inverse \
+ --in sample_audvis-ave.fif \
+ --inv sample_audvis-meg-oct6-inv.fif \
+ --snr 3.0 \
+ --spm
+```
+
+Compute MNE estimates restricted to a label:
+
+```bash
+mne_compute_raw_inverse \
+ --in sample_audvis-ave.fif \
+ --inv sample_audvis-meg-oct6-inv.fif \
+ --snr 2.0 \
+ --label auditory-lh.label \
+ --picknormalcomp
+```
+
+Process all labels in a directory:
+
+```bash
+mne_compute_raw_inverse \
+ --in sample_audvis-ave.fif \
+ --inv sample_audvis-meg-oct6-inv.fif \
+ --snr 3.0 --spm \
+ --labeldir labels/ \
+ --out label_timecourses
+```
diff --git a/doc/website/docs/manual/tools-dipole-fit.mdx b/doc/website/docs/manual/tools-dipole-fit.mdx
new file mode 100644
index 00000000000..04be87bddfd
--- /dev/null
+++ b/doc/website/docs/manual/tools-dipole-fit.mdx
@@ -0,0 +1,78 @@
+---
+title: mne_dipole_fit
+sidebar_label: mne_dipole_fit
+sidebar_position: 8
+---
+
+# mne_dipole_fit
+
+## Overview
+
+`mne_dipole_fit` performs electric current dipole fitting on MEG/EEG data. It computes dipole fits, saves results in `.dip` and `.bdip` formats, and can display results in a 3D brain viewer with BEM surfaces.
+
+This is a C++ port of the original MNE-C dipole fitting tool by Matti Hämäläinen.
+
+## Usage
+
+```bash
+mne_dipole_fit [options]
+```
+
+## Options
+
+The command-line options are defined by the `DipoleFitSettings` class. Key options include:
+
+| Option | Description |
+|---|---|
+| `--meas ` | Input measurement data file |
+| `--set ` | Data set number |
+| `--tmin ` | Start time for fitting (ms) |
+| `--tmax ` | End time for fitting (ms) |
+| `--tstep ` | Time step for fitting (ms) |
+| `--bem ` | BEM model file |
+| `--origin ` | Sphere model origin (mm) |
+| `--cov ` | Noise covariance matrix file |
+| `--mri ` | MRI-head coordinate transform file |
+| `--dip ` | Output dipole file |
+| `--bdip ` | Output binary dipole file |
+| `--meg` | Use MEG data |
+| `--eeg` | Use EEG data |
+| `--fixed` | Fixed dipole position |
+| `--accurate` | Use accurate coil descriptions |
+
+## Description
+
+Dipole fitting is a parametric source localization approach that models the neural activity as one or more equivalent current dipoles. At each time point, the algorithm finds the dipole location, orientation, and amplitude that best explain the measured MEG/EEG data.
+
+### Key Concepts
+
+- **Single dipole fit**: At each time point, a single equivalent current dipole is fitted to explain the data. This is appropriate when the brain activity of interest can be reasonably modeled as a focal source.
+
+- **BEM vs. sphere model**: The forward model used for fitting can be either a full BEM model or a simpler sphere model. The BEM model is generally more accurate.
+
+- **Noise covariance**: A noise-covariance matrix is used to whiten the data and weight the channels appropriately in the fitting procedure.
+
+### Output
+
+- **`.dip` file** — Human-readable text file with dipole parameters (time, position, orientation, amplitude, goodness-of-fit)
+- **`.bdip` file** — Binary format for efficient storage and loading
+
+### Goodness of Fit
+
+The goodness-of-fit (GOF) value indicates how well the fitted dipole explains the measured data. Values close to 100% indicate an excellent fit, while low values suggest that a single dipole model may not be appropriate.
+
+## Example
+
+Fit dipoles to evoked data using a BEM model:
+
+```bash
+mne_dipole_fit \
+ --meas sample_audvis-ave.fif \
+ --set 1 \
+ --tmin 50 --tmax 150 --tstep 1 \
+ --bem sample-5120-5120-5120-bem-sol.fif \
+ --mri sample-trans.fif \
+ --cov sample_audvis-cov.fif \
+ --meg \
+ --dip sample_audvis.dip
+```
diff --git a/doc/website/docs/manual/tools-edf2fiff.mdx b/doc/website/docs/manual/tools-edf2fiff.mdx
new file mode 100644
index 00000000000..74dac2314eb
--- /dev/null
+++ b/doc/website/docs/manual/tools-edf2fiff.mdx
@@ -0,0 +1,53 @@
+---
+title: mne_edf2fiff
+sidebar_label: mne_edf2fiff
+sidebar_position: 9
+---
+
+# mne_edf2fiff
+
+## Overview
+
+`mne_edf2fiff` converts EDF (European Data Format) files to FIFF format. It supports variable channel frequencies.
+
+## Usage
+
+```bash
+mne_edf2fiff [options]
+```
+
+## Options
+
+| Option | Description |
+|---|---|
+| `--fileIn ` | Input EDF file **(required)** |
+| `--fileOut ` | Output FIFF file (default: same name with `.fif` extension) |
+| `--scaleFactor ` | Raw value scaling factor (default: 1e6) |
+
+## Description
+
+The European Data Format (EDF) is a widely used standard for storing multi-channel electrophysiological signals. This tool converts EDF files to the FIFF format used by the MNE software suite.
+
+### Supported Features
+
+- Variable sampling frequencies across channels
+- Standard EDF header information is preserved in the FIFF output
+
+### Limitations
+
+- Interrupted recordings are **not** supported
+- EDF+ annotations are not converted
+
+## Example
+
+Convert an EDF file to FIFF:
+
+```bash
+mne_edf2fiff --fileIn recording.edf --fileOut recording.fif
+```
+
+With a custom scaling factor:
+
+```bash
+mne_edf2fiff --fileIn recording.edf --scaleFactor 1e3
+```
diff --git a/doc/website/docs/manual/tools-flash-bem.mdx b/doc/website/docs/manual/tools-flash-bem.mdx
new file mode 100644
index 00000000000..693870929a6
--- /dev/null
+++ b/doc/website/docs/manual/tools-flash-bem.mdx
@@ -0,0 +1,67 @@
+---
+title: mne_flash_bem
+sidebar_label: mne_flash_bem
+sidebar_position: 2
+---
+
+# mne_flash_bem
+
+## Overview
+
+`mne_flash_bem` creates BEM (Boundary Element Model) surfaces using multi-echo FLASH MRI sequences. It orchestrates FreeSurfer tools for DICOM conversion, parameter map fitting, flash volume synthesis, registration, and triangulation.
+
+This is a C++ port of the original MNE shell script by Matti Hämäläinen.
+
+## Usage
+
+```bash
+mne_flash_bem [options]
+```
+
+## Options
+
+| Option | Description |
+|---|---|
+| `--noflash30` | Only 5-degree flash data available; average flash-5 echoes instead of combining with flash-30 |
+| `--noconvert` | Skip DICOM-to-MGZ conversion step |
+| `--unwarp ` | Apply gradient distortion unwarping |
+| `--subject ` | Subject name. Overrides `SUBJECT` environment variable. |
+| `--subjects-dir ` | Subjects directory. Overrides `SUBJECTS_DIR` environment variable. |
+| `--flash-dir ` | Flash data directory (default: current working directory) |
+
+## Environment Variables
+
+| Variable | Description |
+|---|---|
+| `FREESURFER_HOME` | FreeSurfer installation directory (required) |
+| `SUBJECTS_DIR` | Directory containing FreeSurfer subject reconstructions |
+| `SUBJECT` | Current subject name |
+
+## Description
+
+The FLASH-based BEM surface creation typically provides better results than the watershed approach, especially for the skull surfaces. The method uses multi-echo FLASH MRI sequences acquired at different flip angles (typically 5° and 30°) to estimate tissue parameters and segment the head into different compartments.
+
+The processing pipeline includes:
+
+1. **DICOM conversion** — Converting raw DICOM images to FreeSurfer MGZ format
+2. **Parameter map fitting** — Computing parameter maps from multi-echo data
+3. **Flash volume synthesis** — Creating a synthetic volume from the parameter maps
+4. **Registration** — Aligning flash volumes with the FreeSurfer reconstruction
+5. **Triangulation** — Creating triangulated surfaces for each compartment
+
+The resulting surfaces (inner skull, outer skull, and outer skin) are stored in the subject's `bem/flash/` directory.
+
+## Example
+
+```bash
+export SUBJECTS_DIR=/path/to/subjects
+export SUBJECT=sample
+cd /path/to/flash/dicoms
+mne_flash_bem --subject sample
+```
+
+If only 5-degree flash data is available:
+
+```bash
+mne_flash_bem --noflash30 --subject sample
+```
diff --git a/doc/website/docs/manual/tools-forward-solution.mdx b/doc/website/docs/manual/tools-forward-solution.mdx
new file mode 100644
index 00000000000..96b39e26245
--- /dev/null
+++ b/doc/website/docs/manual/tools-forward-solution.mdx
@@ -0,0 +1,87 @@
+---
+title: mne_forward_solution
+sidebar_label: mne_forward_solution
+sidebar_position: 6
+---
+
+# mne_forward_solution
+
+## Overview
+
+`mne_forward_solution` computes the MEG/EEG forward solution for source localization. It calculates the magnetic fields and electric potentials at the measurement sensors and electrodes due to dipole sources located on the cortex or in a volume source space.
+
+This is a C++ port of the original MNE-C tool by Matti Hämäläinen.
+
+## Usage
+
+```bash
+mne_forward_solution [options]
+```
+
+## Options
+
+The command-line options are defined by the `ComputeFwdSettings` class and follow the standard MNE-C forward solution options. Key options include:
+
+| Option | Description |
+|---|---|
+| `--src ` | Source space file |
+| `--bem ` | BEM model file |
+| `--meas ` | Measurement data file (for sensor info) |
+| `--fwd ` | Output forward solution file |
+| `--trans ` | Head-MRI coordinate transform file |
+| `--meg` | Compute MEG forward solution |
+| `--eeg` | Compute EEG forward solution |
+| `--mindist ` | Minimum source-to-inner-skull distance (mm) |
+| `--accurate` | Use accurate coil geometry descriptions |
+| `--fixed` | Fixed source orientations (normal to cortex) |
+| `--all` | Compute for all source space points |
+
+## Description
+
+The forward solution is a critical component of the MEG/EEG source localization pipeline. It maps the relationship between source currents on the cortex (or in the volume) and the measured signals at the MEG sensors and EEG electrodes.
+
+### Prerequisites
+
+Before computing the forward solution, the following must be available:
+
+1. **Source space** — Created from FreeSurfer surface reconstruction
+2. **BEM model** — Created using `mne_watershed_bem` or `mne_flash_bem`, then set up with `mne_setup_forward_model`
+3. **Coordinate transformation** — The head-to-MRI transform stored in a `-trans.fif` file
+4. **Measurement info** — A FIFF file containing sensor locations and orientations
+
+### BEM vs. Sphere Model
+
+The forward solution can be computed using either:
+
+- **BEM (Boundary Element Model)** — More accurate, requires BEM surfaces
+- **Sphere model** — Simpler, uses concentric sphere approximation
+
+### Software Gradient Compensation
+
+For CTF and 4D Neuroimaging data that has been subjected to software gradient compensation, the forward solution automatically accounts for the reference sensor array and computes a compensated forward solution.
+
+## Example
+
+Compute a MEG forward solution:
+
+```bash
+mne_forward_solution \
+ --src sample-oct6-src.fif \
+ --bem sample-5120-5120-5120-bem-sol.fif \
+ --meas sample_audvis_raw.fif \
+ --trans sample-trans.fif \
+ --meg \
+ --fwd sample-meg-fwd.fif
+```
+
+Compute a combined MEG+EEG forward solution with accurate coil descriptions:
+
+```bash
+mne_forward_solution \
+ --src sample-oct6-src.fif \
+ --bem sample-5120-5120-5120-bem-sol.fif \
+ --meas sample_audvis_raw.fif \
+ --trans sample-trans.fif \
+ --meg --eeg --accurate \
+ --fwd sample-meg-eeg-fwd.fif
+```
diff --git a/doc/website/docs/manual/tools-overview.mdx b/doc/website/docs/manual/tools-overview.mdx
new file mode 100644
index 00000000000..73c08b6186c
--- /dev/null
+++ b/doc/website/docs/manual/tools-overview.mdx
@@ -0,0 +1,45 @@
+---
+title: Command-Line Tools Overview
+sidebar_label: Tools Overview
+sidebar_position: 6
+---
+
+# Command-Line Tools Reference
+
+MNE-CPP includes a comprehensive set of command-line tools for MEG/EEG data processing, BEM model creation, forward solution computation, and inverse estimation. These tools are C++ ports of the original MNE-C tools created by Matti Hämäläinen.
+
+## BEM Model Creation
+
+| Tool | Description |
+|---|---|
+| [mne_watershed_bem](tools-watershed-bem) | Creates BEM surfaces using FreeSurfer's watershed algorithm |
+| [mne_flash_bem](tools-flash-bem) | Creates BEM surfaces using multi-echo FLASH MRI sequences |
+| [mne_surf2bem](tools-surf2bem) | Converts FreeSurfer surfaces and ASCII triangle files into BEM FIFF files |
+| [mne_setup_forward_model](tools-setup-forward-model) | Sets up the BEM for forward modeling |
+
+## MRI Setup
+
+| Tool | Description |
+|---|---|
+| [mne_setup_mri](tools-setup-mri) | Sets up FreeSurfer MRI data for MNE processing |
+
+## Forward and Inverse Computation
+
+| Tool | Description |
+|---|---|
+| [mne_forward_solution](tools-forward-solution) | Computes the MEG/EEG forward solution |
+| [mne_compute_raw_inverse](tools-compute-raw-inverse) | Computes inverse solutions (MNE/dSPM/sLORETA) |
+| [mne_dipole_fit](tools-dipole-fit) | Performs electric current dipole fitting |
+
+## Data Conversion and Utilities
+
+| Tool | Description |
+|---|---|
+| [mne_edf2fiff](tools-edf2fiff) | Converts EDF files to FIFF format |
+| [mne_show_fiff](tools-show-fiff) | Lists the contents of a FIFF file |
+
+## Real-Time Streaming
+
+| Tool | Description |
+|---|---|
+| [mne_rt_server](tools-rt-server) | Real-time FIFF data streaming server |
diff --git a/doc/website/docs/manual/tools-rt-server.mdx b/doc/website/docs/manual/tools-rt-server.mdx
new file mode 100644
index 00000000000..8f1b2735300
--- /dev/null
+++ b/doc/website/docs/manual/tools-rt-server.mdx
@@ -0,0 +1,48 @@
+---
+title: mne_rt_server
+sidebar_label: mne_rt_server
+sidebar_position: 12
+---
+
+# mne_rt_server
+
+## Overview
+
+`mne_rt_server` is a real-time FIFF data streaming server. It manages connectors (plugins like FiffSimulator) and streams FIFF data to connected clients over a network.
+
+## Usage
+
+```bash
+mne_rt_server [options]
+```
+
+## Options
+
+| Option | Description |
+|---|---|
+| `-f, --file ` | FIFF file to stream via the FiffSimulator plugin |
+
+## Description
+
+`mne_rt_server` enables real-time streaming of FIFF-formatted MEG/EEG data over a network connection. It serves as the data source for real-time processing applications such as `mne_scan`.
+
+### Architecture
+
+The server uses a plugin-based connector architecture:
+
+- **FiffSimulator** — Streams pre-recorded FIFF files as if they were being acquired in real-time
+- Additional connectors can be loaded for different data sources
+
+### Use Cases
+
+- Testing real-time processing pipelines with pre-recorded data
+- Streaming data between networked computers
+- Providing a standardized interface for real-time data access
+
+## Example
+
+Start the server streaming a sample data file:
+
+```bash
+mne_rt_server --file sample_audvis_raw.fif
+```
diff --git a/doc/website/docs/manual/tools-setup-forward-model.mdx b/doc/website/docs/manual/tools-setup-forward-model.mdx
new file mode 100644
index 00000000000..f0b7d454d5b
--- /dev/null
+++ b/doc/website/docs/manual/tools-setup-forward-model.mdx
@@ -0,0 +1,84 @@
+---
+title: mne_setup_forward_model
+sidebar_label: mne_setup_forward_model
+sidebar_position: 4
+---
+
+# mne_setup_forward_model
+
+## Overview
+
+`mne_setup_forward_model` sets up the BEM for forward modeling. It reads triangulated surface files (inner skull, outer skull, scalp), creates a BEM geometry FIFF file with conductivity assignments, exports `.pnt` and `.surf` files, and optionally computes the BEM solution matrix.
+
+This is a C++ port of the original MNE shell script by Matti Hämäläinen.
+
+## Usage
+
+```bash
+mne_setup_forward_model [options]
+```
+
+## Options
+
+| Option | Description |
+|---|---|
+| `--subject ` | Subject name. Defaults to `SUBJECT` environment variable. |
+| `--subjects-dir ` | Subjects directory. Defaults to `SUBJECTS_DIR` environment variable. |
+| `--scalpc ` | Scalp conductivity in S/m (default: 0.3) |
+| `--skullc ` | Skull conductivity in S/m (default: 0.006) |
+| `--brainc ` | Brain conductivity in S/m (default: 0.3) |
+| `--model ` | BEM model name (auto-generated if omitted) |
+| `--homog` | Use a single-compartment (homogeneous) model |
+| `--surf` | Use FreeSurfer `.surf` files instead of ASCII `.tri` files |
+| `--ico ` | Downsample surfaces to icosahedron subdivision level (0–6) |
+| `--nosol` | Skip BEM solution preparation |
+| `--noswap` | Don't swap triangle winding order |
+| `--meters` | Coordinates are in meters (for ASCII `.tri` files) |
+| `--innershift ` | Shift inner skull surface outward by specified amount |
+| `--outershift ` | Shift outer skull surface outward by specified amount |
+| `--scalpshift ` | Shift scalp surface outward by specified amount |
+| `--overwrite` | Overwrite existing output files |
+
+## Description
+
+This tool is a critical step in the MEG/EEG source localization pipeline. It takes the triangulated BEM surfaces (created by `mne_watershed_bem` or `mne_flash_bem`) and sets up the boundary element model with appropriate conductivity values for each compartment.
+
+### Conductivity Values
+
+The default conductivity values are:
+
+| Compartment | Default (S/m) | Typical ratio |
+|---|---|---|
+| Scalp | 0.3 | 1 |
+| Brain | 0.3 | 1 |
+| Skull | 0.006 | 1/50 |
+
+The skull conductivity ratio has been a subject of considerable discussion in the literature. Recent publications report values ranging from 1:15 to 1:50 relative to brain/scalp conductivity.
+
+### Single-Compartment Model
+
+For MEG-only analyses, a single-compartment (homogeneous) BEM model using only the inner skull surface is often sufficient. Use the `--homog` flag for this:
+
+```bash
+mne_setup_forward_model --homog --subject sample
+```
+
+### Surface Shifting
+
+The `--innershift`, `--outershift`, and `--scalpshift` options allow shifting surfaces outward along their normals. This can be useful when surfaces are too close together or intersecting.
+
+## Example
+
+Set up a three-layer BEM model:
+
+```bash
+export SUBJECTS_DIR=/path/to/subjects
+mne_setup_forward_model --subject sample --surf --overwrite
+```
+
+Set up with custom conductivities:
+
+```bash
+mne_setup_forward_model --subject sample --surf \
+ --scalpc 0.33 --skullc 0.0132 --brainc 0.33
+```
diff --git a/doc/website/docs/manual/tools-setup-mri.mdx b/doc/website/docs/manual/tools-setup-mri.mdx
new file mode 100644
index 00000000000..883a4b7a296
--- /dev/null
+++ b/doc/website/docs/manual/tools-setup-mri.mdx
@@ -0,0 +1,52 @@
+---
+title: mne_setup_mri
+sidebar_label: mne_setup_mri
+sidebar_position: 5
+---
+
+# mne_setup_mri
+
+## Overview
+
+`mne_setup_mri` sets up FreeSurfer MRI data for MNE software by creating the Neuromag directory structure and converting FreeSurfer MRI volumes (COR files or `.mgz`/`.mgh`) into `COR.fif` FIFF files.
+
+This is a C++ port of the original MNE-C tools `mne_setup_mri` and `mne_make_cor_set` by Matti Hämäläinen.
+
+## Usage
+
+```bash
+mne_setup_mri [options]
+```
+
+## Options
+
+| Option | Description |
+|---|---|
+| `--subject ` | Subject name. Defaults to `SUBJECT` environment variable. |
+| `--subjects-dir ` | Subjects directory. Defaults to `SUBJECTS_DIR` environment variable. |
+| `--mri ` | MRI set name to process (can be specified multiple times; default: T1 brain) |
+| `--overwrite` | Overwrite existing data |
+| `--verbose` | Verbose output |
+
+## Description
+
+`mne_setup_mri` prepares FreeSurfer MRI data for use with MNE tools. It performs the following steps:
+
+1. Creates the required Neuromag-style directory structure within the subject's FreeSurfer directory
+2. Converts FreeSurfer MRI volumes (in COR or MGZ format) to FIFF format (`COR.fif`)
+3. Sets up the coordinate transformations needed for MNE processing
+
+This step should be performed after the FreeSurfer cortical reconstruction is complete and before computing the forward solution.
+
+## Example
+
+```bash
+export SUBJECTS_DIR=/path/to/subjects
+mne_setup_mri --subject sample --overwrite --verbose
+```
+
+Process a specific MRI set:
+
+```bash
+mne_setup_mri --subject sample --mri T1 --overwrite
+```
diff --git a/doc/website/docs/manual/tools-show-fiff.mdx b/doc/website/docs/manual/tools-show-fiff.mdx
new file mode 100644
index 00000000000..b92b485adf7
--- /dev/null
+++ b/doc/website/docs/manual/tools-show-fiff.mdx
@@ -0,0 +1,66 @@
+---
+title: mne_show_fiff
+sidebar_label: mne_show_fiff
+sidebar_position: 10
+---
+
+# mne_show_fiff
+
+## Overview
+
+`mne_show_fiff` lists the contents of a FIFF file to standard output, showing the block structure and tag information in a human-readable format.
+
+## Usage
+
+```bash
+mne_show_fiff [options]
+```
+
+## Options
+
+| Option | Description |
+|---|---|
+| `--in ` | Input FIFF file |
+| `--fif ` | Synonym for `--in` |
+| `--blocks` | Only list blocks (tree structure), omitting individual tags |
+| `--verbose` | Verbose output with detailed tag contents |
+| `--indent ` | Number of indentation spaces (default: 3 for terse, 0 for verbose) |
+| `--tag ` | Show information about specific tag numbers (can be specified multiple times) |
+| `--long` | Print long strings in full (normally truncated) |
+| `--help` | Print usage help |
+| `--version` | Print version information |
+
+## Description
+
+`mne_show_fiff` is a diagnostic utility for inspecting FIFF files. It uses FIFF tag definitions to produce human-readable output describing the file's contents, including:
+
+- **Block structure** — The hierarchical tree of data blocks
+- **Tag information** — Individual data elements with their types, sizes, and values
+- **Tag descriptions** — Human-readable names for standard FIFF tags
+
+### Use Cases
+
+- Verifying the contents of a FIFF file after conversion or processing
+- Debugging data pipeline issues
+- Understanding the structure of FIFF files
+- Checking whether specific data (e.g., projectors, bad channels, events) are present in a file
+
+## Examples
+
+List the block structure of a FIFF file:
+
+```bash
+mne_show_fiff --in sample_audvis_raw.fif --blocks
+```
+
+Show detailed contents:
+
+```bash
+mne_show_fiff --in sample_audvis_raw.fif --verbose
+```
+
+Inspect specific tags:
+
+```bash
+mne_show_fiff --in sample_audvis_raw.fif --tag 102 --tag 200
+```
diff --git a/doc/website/docs/manual/tools-surf2bem.mdx b/doc/website/docs/manual/tools-surf2bem.mdx
new file mode 100644
index 00000000000..03a4ab9542e
--- /dev/null
+++ b/doc/website/docs/manual/tools-surf2bem.mdx
@@ -0,0 +1,75 @@
+---
+title: mne_surf2bem
+sidebar_label: mne_surf2bem
+sidebar_position: 3
+---
+
+# mne_surf2bem
+
+## Overview
+
+`mne_surf2bem` converts FreeSurfer surfaces and/or ASCII triangle files into BEM FIFF files. It supports multiple surface inputs with separate IDs and conductivities, vertex shifting along normals, surface reordering, and topology checks.
+
+This is a C++ port of the original MNE-C tool by Matti Hämäläinen.
+
+## Usage
+
+```bash
+mne_surf2bem [options]
+```
+
+## Options
+
+| Option | Description |
+|---|---|
+| `--surf ` | Input FreeSurfer binary surface file |
+| `--tri ` | Input ASCII triangle file |
+| `--fif ` | Output FIFF BEM surface file |
+| `--id ` | BEM surface ID: 1 = brain, 3 = skull, 4 = head. Applies to the last `--surf` or `--tri` specified. |
+| `--swap` | Swap vertex winding order (for ASCII files) |
+| `--meters` | Coordinates are in meters (default: millimeters) |
+| `--coordf ` | Coordinate frame for ASCII vertices |
+| `--shift ` | Shift vertices along normals by specified amount (mm) |
+| `--ico ` | Downsample to icosahedron subdivision level (0–6) |
+| `--sigma ` | Compartment conductivity (S/m) |
+| `--force` | Load the surface despite topological defects |
+| `--check` | Perform topology and solid angle checks |
+| `--checkmore` | Also check skull/skin thicknesses |
+
+## Description
+
+`mne_surf2bem` is used to convert surfaces from FreeSurfer binary format or ASCII triangle format into the FIFF BEM format required by the MNE forward solution computation. Multiple surfaces can be combined into a single BEM file by specifying multiple `--surf` or `--tri` options with corresponding `--id` values.
+
+### Surface IDs
+
+| ID | Surface |
+|---|---|
+| 1 | Brain (inner skull) |
+| 3 | Skull (outer skull) |
+| 4 | Head (scalp) |
+
+### Topology Checks
+
+When `--check` is specified, the following checks are performed:
+
+- **Completeness** — The total solid angle subtended by all triangles should be close to $4\pi$
+- **Surface ordering** — Surfaces are verified to be properly nested (inner skull inside outer skull inside scalp)
+- **Extent** — Surface extent must be at least 50 mm (to detect meters/millimeters confusion)
+
+## Example
+
+Convert a FreeSurfer inner skull surface to BEM format:
+
+```bash
+mne_surf2bem --surf inner_skull.surf --id 1 --fif inner_skull-bem.fif --check
+```
+
+Create a three-layer BEM from FreeSurfer surfaces:
+
+```bash
+mne_surf2bem \
+ --surf inner_skull.surf --id 1 --sigma 0.3 \
+ --surf outer_skull.surf --id 3 --sigma 0.006 \
+ --surf outer_skin.surf --id 4 --sigma 0.3 \
+ --fif three-layer-bem.fif --check
+```
diff --git a/doc/website/docs/manual/tools-watershed-bem.mdx b/doc/website/docs/manual/tools-watershed-bem.mdx
new file mode 100644
index 00000000000..566ea3ae315
--- /dev/null
+++ b/doc/website/docs/manual/tools-watershed-bem.mdx
@@ -0,0 +1,59 @@
+---
+title: mne_watershed_bem
+sidebar_label: mne_watershed_bem
+sidebar_position: 1
+---
+
+# mne_watershed_bem
+
+## Overview
+
+`mne_watershed_bem` creates BEM (Boundary Element Model) surfaces using FreeSurfer's `mri_watershed` algorithm. It produces brain, inner skull, outer skull, and outer skin surfaces and writes the head surface as a FIFF BEM file.
+
+This is a C++ port of the original MNE shell script by Matti Hämäläinen.
+
+## Usage
+
+```bash
+mne_watershed_bem [options]
+```
+
+## Options
+
+| Option | Description |
+|---|---|
+| `--subject ` | Subject name. Defaults to the `SUBJECT` environment variable. |
+| `--subjects-dir ` | Subjects directory. Defaults to `SUBJECTS_DIR` environment variable. |
+| `--volume ` | MRI volume name (default: T1) |
+| `--overwrite` | Overwrite existing watershed files |
+| `--atlas` | Pass `--atlas` flag to `mri_watershed` |
+| `--gcaatlas` | Use subcortical atlas for `mri_watershed` |
+| `--preflood ` | Change preflood height for `mri_watershed` |
+| `--verbose` | Verbose output |
+
+## Environment Variables
+
+| Variable | Description |
+|---|---|
+| `FREESURFER_HOME` | FreeSurfer installation directory (required) |
+| `SUBJECTS_DIR` | Directory containing FreeSurfer subject reconstructions |
+| `SUBJECT` | Current subject name |
+
+## Description
+
+The watershed algorithm segments the MRI volume and creates the following triangulated surfaces:
+
+- **Brain surface** — The brain-CSF boundary
+- **Inner skull surface** — The inner surface of the skull
+- **Outer skull surface** — The outer surface of the skull
+- **Outer skin surface** — The outer surface of the head
+
+These surfaces are stored in the subject's `bem/watershed/` directory and are used by `mne_setup_forward_model` to create the BEM geometry needed for forward solution computation.
+
+## Example
+
+```bash
+export SUBJECTS_DIR=/path/to/subjects
+export SUBJECT=sample
+mne_watershed_bem --overwrite --verbose
+```
diff --git a/doc/website/docs/manual/workflow.mdx b/doc/website/docs/manual/workflow.mdx
new file mode 100644
index 00000000000..fd8eea61b7d
--- /dev/null
+++ b/doc/website/docs/manual/workflow.mdx
@@ -0,0 +1,289 @@
+---
+title: The Typical MEG/EEG Workflow
+sidebar_label: Workflow
+sidebar_position: 2
+---
+
+# The Typical MEG/EEG Workflow
+
+## Overview
+
+This section describes the typical MEG/EEG workflow — from raw data preprocessing through to source reconstruction — as originally outlined in the MNE-C manual cookbook (Hämäläinen, 2009). The workflow applies to both MNE-CPP command-line tools and the GUI applications.
+
+The following diagram shows the complete workflow of the MNE software. The MRI processing path (left) and the MEG/EEG data path (right) converge at the forward solution computation.
+
+```mermaid
+flowchart TD
+ subgraph MRI_PATH["MRI Processing"]
+ direction TB
+ MRI_RAW["MRI Data Raw anatomical "]
+ FS["Reconstructed MRI FreeSurfer "]
+ COR_T1["COR.fif (T1)mne_setup_mri "]
+ COR_BRAIN["COR.fif (brain)mne_setup_mri "]
+ SRC["Source Space mne_setup_source_space "]
+ COR_ALIGNED["COR-aligned.fif Coregistration "]
+ BEM_MESH["BEM Mesh mne_watershed_bem mne_flash_bem "]
+ BEM_MODEL["BEM Model mne_setup_forward_model "]
+
+ MRI_RAW --> FS
+ FS --> COR_T1
+ FS --> COR_BRAIN
+ FS --> SRC
+ COR_T1 --> COR_ALIGNED
+ COR_BRAIN --> BEM_MESH
+ BEM_MESH --> BEM_MODEL
+ end
+
+ subgraph MEG_PATH["MEG/EEG Processing"]
+ direction TB
+ MEG_RAW["MEG/EEG Data Raw recordings "]
+ FILTERED["Filtered & Averaged mne_browse_raw "]
+ NOISE["Noise Covariance Matrix "]
+
+ MEG_RAW --> FILTERED
+ MEG_RAW --> NOISE
+ end
+
+ FWD["Forward Solution mne_forward_solution "]
+ INV["Inverse Operator mne_inverse_operator "]
+ ANALYZE["Analyze & Visualize MNE Analyze "]
+ OUTPUT["Source Estimates stc / w files, movies "]
+
+ SRC --> FWD
+ BEM_MODEL --> FWD
+ COR_ALIGNED --> FWD
+ FILTERED --> FWD
+ NOISE --> INV
+
+ FWD --> INV
+ INV --> ANALYZE
+ FILTERED --> ANALYZE
+ ANALYZE --> OUTPUT
+
+ classDef mri fill:#d4edda,stroke:#28a745,stroke-width:2px,color:#155724,rx:8,ry:8
+ classDef meg fill:#cce5ff,stroke:#2874a6,stroke-width:2px,color:#0c3c60,rx:8,ry:8
+ classDef proc fill:#fff3cd,stroke:#d4a017,stroke-width:2px,color:#6b5900,rx:8,ry:8
+ classDef out fill:#f8d7da,stroke:#c0392b,stroke-width:2px,color:#721c24,rx:8,ry:8
+
+ class MRI_RAW,FS,COR_T1,COR_BRAIN,COR_ALIGNED,BEM_MESH,BEM_MODEL,SRC mri
+ class MEG_RAW,FILTERED,NOISE meg
+ class FWD,INV,ANALYZE proc
+ class OUTPUT out
+
+ style MRI_PATH fill:none,stroke:#28a745,stroke-width:1px,stroke-dasharray:5 5
+ style MEG_PATH fill:none,stroke:#2874a6,stroke-width:1px,stroke-dasharray:5 5
+
+ linkStyle default stroke:#6c757d,stroke-width:1.5px
+```
+
+*Figure: Workflow of the MNE software, adapted from the MNE-C manual (Hämäläinen, 2009). The MRI processing stages (green) are independent of the MEG/EEG data (blue) until the forward solution computation (yellow).*
+
+### Processing Stages at a Glance
+
+The main processing stages are:
+
+1. **Setting up the analysis environment** — Configure `SUBJECTS_DIR`, FreeSurfer paths, and the analysis directory structure.
+2. **Anatomical processing** — FreeSurfer reconstruction, source space creation, BEM mesh generation.
+3. **Preprocessing** — Bad channel marking, filtering, downsampling, artifact suppression (SSP/ICA).
+4. **Epoching and averaging** — Creating evoked responses from event-related data.
+5. **Forward modeling** — Coordinate frame alignment, BEM model setup, forward solution computation.
+6. **Inverse estimation** — Noise-covariance estimation, inverse operator construction.
+7. **Source analysis** — Applying the inverse operator, visualization, morphing, group analysis.
+
+:::tip
+Steps 1–2 depend only on anatomical (geometrical) information and remain identical across different MEG/EEG studies on the same subject. Once the FreeSurfer reconstruction and BEM setup are complete, they can be reused for all experiments with that subject.
+:::
+
+## Setting Up the Analysis Environment
+
+Before starting the data analysis:
+
+1. **Set `SUBJECTS_DIR`** — Set the environment variable `SUBJECTS_DIR` to the directory containing the anatomical MRI data (FreeSurfer subject directories). Optionally, set `SUBJECT` to the name of the current subject's MRI directory under `SUBJECTS_DIR`. With this setting you can avoid entering the `--subject` option common to many MNE programs and scripts.
+
+2. **Set up FreeSurfer** — Ensure the FreeSurfer environment is configured before using MNE software. The FreeSurfer and MNE software are complementary tools.
+
+3. **Create an analysis directory** — It is recommended to create a new directory for the MEG/EEG data processing. Raw data files should be linked (using `ln -s`) rather than copied. On-line averages can be either copied or linked.
+
+:::note
+In the following sections, files in the FreeSurfer directory hierarchy are usually referred to without specifying the leading directories. Thus, `bem/subject-src.fif` refers to `$SUBJECTS_DIR/$SUBJECT/bem/subject-src.fif`.
+:::
+
+## Preprocessing
+
+The following MEG and EEG data preprocessing steps are recommended:
+
+- Bad channels in the MEG and EEG data must be identified and marked.
+- The data has to be filtered to the desired passband.
+- Artifacts should be suppressed (e.g., using SSP or ICA).
+
+### Marking Bad Channels
+
+Sometimes some MEG or EEG channels are not functioning properly for various reasons. These channels should be excluded from analysis by marking them as bad.
+
+It is especially important to exclude flat channels (channels that do not show a signal at all) from the analysis, since their noise estimate will be unrealistically low and thus the current estimate calculations will give a strong weight to the zero signal on the flat channels, causing the estimates to essentially vanish. It is also important to exclude noisy channels because they can affect others when signal-space projections or EEG average electrode reference is employed. Noisy bad channels can also adversely affect averaging and noise-covariance matrix estimation by causing unnecessary rejections of epochs.
+
+**Recommended ways to identify bad channels:**
+
+- Observe the quality of data during data acquisition and make notes of observed malfunctioning channels to your measurement protocol sheet.
+- View the on-line averages and check the condition of the channels.
+- Compute preliminary off-line averages with artifact rejection, SSP/ICA, and EEG average electrode reference computation off and check the condition of the channels.
+- View raw data and identify bad channels visually.
+
+:::tip
+It is strongly recommended that bad channels are identified and marked in the original raw data files. If present in the raw data files, the bad channel selections will be automatically transferred to averaged files, noise-covariance matrices, forward solution files, and inverse operator decompositions.
+:::
+
+### Artifact Suppression
+
+#### Signal-Space Projection (SSP)
+
+The Signal-Space Projection (SSP) is one approach to rejection of external disturbances in software. Unlike many other noise-cancellation approaches, SSP does not require additional reference sensors to record the disturbance fields. Instead, SSP relies on the fact that the magnetic field distributions generated by the sources in the brain have spatial distributions sufficiently different from those generated by external noise sources. Furthermore, it is implicitly assumed that the linear space spanned by the significant external noise patterns has a low dimension.
+
+For a detailed mathematical description of the SSP method, see [Signal-Space Projection](ssp).
+
+#### Independent Component Analysis (ICA)
+
+Many MEG/EEG signals including biological artifacts reflect non-Gaussian processes. Therefore, PCA-based artifact rejection may perform worse at separating the signal from noise sources. ICA-based approaches provide an alternative method for separating neural activity from artifacts such as eye blinks, cardiac activity, and muscle artifacts.
+
+### Downsampling
+
+The minimum practical sampling frequency of the Vectorview system is 600 Hz. Lower sampling frequencies are allowed but result in elevated noise levels in the data. It is advisable to lowpass filter and downsample large raw data files — common in cognitive and patient studies — to speed up subsequent processing. This can be accomplished with `mne_browse_raw` or `mne_process_raw`.
+
+It is recommended that the original raw file is called `_raw.fif` and the downsampled version `_ds_raw.fif`.
+
+## Epoching and Evoked Data
+
+Epoching of raw data is done using events, which define a `t=0` for data segments. Event times stamped to the acquisition software can be extracted from the raw data file. The events array can then be modified, extended, or changed if necessary.
+
+Once epochs are constructed with appropriate rejection thresholds, they can be averaged to obtain evoked response data.
+
+:::note
+The rejection thresholds are defined in T/m for gradiometers, T for magnetometers, and V for EEG and EOG channels.
+:::
+
+### Rejection Using Annotations
+
+Bad segments of data can also be rejected by marking segments of raw data with annotations, providing an alternative to peak-to-peak threshold-based rejection.
+
+## Source Localization
+
+MNE makes extensive use of the FreeSurfer file structure for analysis. Before starting data analysis, set up the environment variable `SUBJECTS_DIR` to select the directory under which the anatomical MRI data are stored.
+
+### Anatomical Information
+
+#### Cortical Surface Reconstruction with FreeSurfer
+
+The first processing stage is the creation of various surface reconstructions with FreeSurfer. The recommended FreeSurfer workflow is summarized on the [FreeSurfer wiki](https://surfer.nmr.mgh.harvard.edu/fswiki/RecommendedReconstruction).
+
+#### Setting Up the Source Space
+
+This stage consists of:
+
+- Creating a suitable decimated dipole grid on the white matter surface.
+- Creating the source space file in FIFF format.
+
+The following table shows recommended subdivisions for the creation of source spaces. The approximate source spacing and corresponding surface area have been calculated assuming a 1000-cm² surface area per hemisphere.
+
+| Spacing | Sources per hemisphere | Source spacing (mm) | Surface area per source (mm²) |
+|---|---|---|---|
+| `oct5` | 1026 | 9.9 | 97 |
+| `ico4` | 2562 | 6.2 | 39 |
+| `oct6` | 4098 | 4.9 | 24 |
+| `ico5` | 10242 | 3.1 | 9.8 |
+
+### Creating the BEM Model Meshes
+
+Calculation of the forward solution using the boundary-element model (BEM) requires that the surfaces separating regions of different electrical conductivities are tessellated with suitable surface elements. The MNE BEM software employs triangular tessellations. Prerequisites for BEM calculations are the segmentation of the MRI data and the triangulation of the relevant surfaces.
+
+For **MEG computations**, a reasonably accurate solution can be obtained by using a single-compartment BEM assuming the shape of the intracranial volume.
+
+For **EEG**, the standard model contains the intracranial space, the skull, and the scalp.
+
+Two approaches are available in MNE-CPP:
+- **[mne_watershed_bem](tools-watershed-bem)** — Creates BEM surfaces using FreeSurfer's watershed algorithm
+- **[mne_flash_bem](tools-flash-bem)** — Creates BEM surfaces using multi-echo FLASH MRI sequences
+
+#### Head Surface Triangulation Files
+
+The segmentation algorithms produce either FreeSurfer surfaces or triangulation data in text. Before proceeding to the creation of the boundary element model, the following standard FreeSurfer surface files must be present:
+
+1. **inner_skull.surf** — Contains the inner skull triangulation
+2. **outer_skull.surf** — Contains the outer skull triangulation
+3. **outer_skin.surf** — Contains the head surface triangulation
+
+### Setting Up the BEM
+
+This stage sets up the subject-dependent data for computing the forward solutions using **[mne_setup_forward_model](tools-setup-forward-model)**.
+
+This step assigns the conductivity values to the BEM compartments:
+
+| Compartment | Default conductivity (S/m) |
+|---|---|
+| Scalp | 0.3 |
+| Skull | 0.006 |
+| Brain | 0.3 |
+
+The default skull conductivity ratio is 1:50 relative to scalp/brain. Recent publications report a range of skull conductivity ratios from 1:15 to 1:50. The MNE default ratio 1:50 is based on the typical values reported in the literature, since the approach is based on comparison of SEF/SEP measurements in a BEM model. The variability across publications may depend on individual variations but, more importantly, on the precision of the skull compartment segmentation.
+
+:::note
+To produce single layer BEM models use the `--homog` flag in `mne_setup_forward_model`. This is suitable for MEG-only analyses.
+:::
+
+After the BEM is set up, it is advisable to check that the BEM model meshes are correctly positioned.
+
+:::note
+Up to this point all processing stages depend on the anatomical (geometrical) information only and thus remain identical across different MEG studies.
+:::
+
+### Aligning Coordinate Frames
+
+The calculation of the forward solution requires knowledge of the relative location and orientation of the MEG/EEG and MRI coordinate systems (see [The Forward Solution — Coordinate Systems](forward#megeeg-and-mri-coordinate-systems)). The head coordinate frame is defined by identifying the fiducial landmark locations, making the origin and orientation of the head coordinate system slightly user dependent. As a result, it is safest to reestablish the definition of the coordinate transformation computation for each experimental session, i.e., each time when new head digitization data are employed.
+
+The coregistration is stored in a `-trans.fif` file.
+
+:::warning
+This step is important. If the alignment of the coordinate frames is inaccurate, all subsequent processing steps suffer from the error. Therefore, this step should be performed by the person in charge of the study or by a trained technician. Written or photographic documentation of the alignment points employed during the MEG/EEG acquisition can also be helpful.
+:::
+
+### Computing the Forward Solution
+
+After the MRI-MEG/EEG alignment has been set, the forward solution — the magnetic fields and electric potentials at the measurement sensors and electrodes due to dipole sources located on the cortex — can be calculated using **[mne_forward_solution](tools-forward-solution)**.
+
+### Computing the Noise-Covariance Matrix
+
+The MNE software employs an estimate of the noise-covariance matrix to weight the channels correctly in the calculations. The noise-covariance matrix provides information about field and potential patterns representing uninteresting noise sources of either human or environmental origin.
+
+The noise covariance matrix can be calculated in several ways:
+
+- **From epochs**: Employ the individual epochs during off-line averaging to calculate the full noise covariance matrix. This is the recommended approach for evoked responses.
+
+- **From empty room data**: Employ empty room data (collected without the subject) to calculate the full noise covariance matrix. This is recommended for analyzing ongoing spontaneous activity.
+
+- **From continuous raw data**: Employ a section of continuous raw data collected in the presence of the subject. This is the recommended approach for analyzing epileptic activity. The data should be free of technical artifacts and epileptic activity of interest. The length of the data segment should be at least 20 seconds.
+
+### Calculating the Inverse Operator
+
+The MNE software doesn't calculate the inverse operator explicitly but rather computes an SVD of a matrix composed of the noise-covariance matrix, the result of the forward calculation, and the source covariance matrix. This approach has the benefit that the regularization parameter (SNR) can be adjusted easily when the final source estimates or dSPMs are computed.
+
+For mathematical details, see [The Minimum-Norm Estimates](inverse).
+
+### Creating Source Estimates
+
+Once all the preprocessing steps described above have been completed, the inverse operator can be applied to the MEG and EEG data and the results can be viewed and stored in several ways:
+
+- The interactive analysis tool **[MNE Analyze](analyze)** can be used to explore the data and to produce quantitative analysis results, screen snapshots, and movies.
+
+- The command-line tool **[mne_compute_raw_inverse](tools-compute-raw-inverse)** can be used to produce files containing source estimates at selected ROIs. The input data file can be either a raw data or evoked response MEG/EEG file.
+
+- Source estimates are stored in **stc** (source time course) and **w** (snapshot) file formats for subsequent processing, morphing, and visualization.
+
+### Group Analyses
+
+Group analysis is facilitated by morphing source estimates to a common template brain (e.g., `fsaverage`). Subject-to-subject morphing enables cross-subject averaging and comparison of data among subjects. It is also possible to average the source estimates across subjects after morphing to a common surface space.
+
+## References
+
+- Esch, L., Dinh, C., Larson, E., Engemann, D., Jas, M., Khan, S., Gramfort, A., & Hämäläinen, M.S. (2019). MNE: Software for Acquiring, Processing and Visualizing MEG/EEG Data. *Magnetoencephalography: From Signals to Dynamic Cortical Networks*, 2nd Edition. Springer. DOI: [10.1007/978-3-319-62657-4_59-1](https://doi.org/10.1007/978-3-319-62657-4_59-1)
+- Hämäläinen, M.S. (2009). *MNE Software User's Guide*. Martinos Center for Biomedical Imaging, Massachusetts General Hospital.
+- Gramfort, A., Luessi, M., Larson, E., Engemann, D.A., Strohmeier, D., Brodbeck, C., Goj, R., Jas, M., Brooks, T., Parkkonen, L., & Hämäläinen, M. (2013). MEG and EEG data analysis with MNE-Python. *Frontiers in Neuroscience*, 7, 267. DOI: [10.3389/fnins.2013.00267](https://doi.org/10.3389/fnins.2013.00267)
+- Gramfort, A., Luessi, M., Larson, E., Engemann, D.A., Strohmeier, D., Brodbeck, C., Parkkonen, L., & Hämäläinen, M.S. (2014). MNE software for processing MEG and EEG data. *NeuroImage*, 86, 446–460. DOI: [10.1016/j.neuroimage.2013.10.027](https://doi.org/10.1016/j.neuroimage.2013.10.027)
diff --git a/doc/website/docs/overview.mdx b/doc/website/docs/overview.mdx
new file mode 100644
index 00000000000..e252f992b58
--- /dev/null
+++ b/doc/website/docs/overview.mdx
@@ -0,0 +1,131 @@
+---
+title: "Getting Started"
+sidebar_label: "Getting Started"
+sidebar_position: 1
+---
+
+# MNE-CPP
+
+[](https://doi.org/10.5281/zenodo.593102)
+
+MNE-CPP is an open-source, cross-platform C++ framework for real-time and offline processing of MEG, EEG, and related neurophysiological data. It is part of [The MNE Project](https://mne.tools/stable/index.html), a family of tools originating from Matti Hämäläinen's MNE-C software at the [Martinos Center for Biomedical Imaging](https://martinos.org/).
+
+**Related MNE projects:**
+
+- [MNE-Python](https://mne.tools/stable/index.html) — Python reimplementation with extended visualization and analysis
+- [MNE-MATLAB](https://mne.tools/stable/overview/matlab.html#mne-matlab) — MATLAB interface for MNE data structures
+- [MNE-C](http://www.nmr.mgh.harvard.edu/martinos/userInfo/data/MNE_register/index.php) — the original C implementation ([Manual](https://mne.tools/mne-c-manual/MNE-manual-2.7.3.pdf))
+
+## Applications
+
+| | |
+|---|---|
+|  | [**MNE Scan**](manual/scan) — Real-time acquisition and processing of MEG/EEG data. Plugin-based architecture supporting MEGIN, BabyMEG, BrainAmp, eegosports, gUSBAmp, TMSI, Natus, LSL, and FieldTrip Buffer. In active clinical use at Boston Children's Hospital. |
+|  | [**MNE Analyze**](manual/analyze) — Sensor- and source-level analysis GUI for pre-recorded data: raw browsing, filtering, averaging, co-registration, dipole fitting, and source localization. |
+|  | [**MNE Browse**](manual/browse-raw) — Interactive viewer for raw MEG/EEG data in FIFF format with multi-channel navigation, scaling, filtering, and channel selection. |
+|  | [**MNE Inspect**](manual/inspect) — Interactive 3D brain viewer for FreeSurfer surfaces, BEM models, source estimates, atlases, sensors, and functional connectivity networks. |
+| | [**MNE Anonymize**](manual/anonymize) — Removes or modifies personal health information (PHI/PII) from FIFF files. GUI and command-line modes. |
+
+In addition, MNE-CPP ships a set of [command-line tools](manual/tools-overview) for BEM model creation, forward/inverse computation, data conversion, and real-time streaming — all C++ ports of the original MNE-C utilities.
+
+## Libraries
+
+All applications are built on MNE-CPP's modular C++ libraries, which depend only on [Qt](https://www.qt.io/) and [Eigen](http://eigen.tuxfamily.org/). The libraries can be used independently to build custom neuroscience applications. See the [Library API documentation](development/api) for details.
+
+**License:** BSD 3-Clause. **Versioning:** [Semantic Versioning](https://semver.org/).
+
+## Getting Involved
+
+MNE-CPP is a community-driven project. Contributions are welcome — see the [contributor guide](development/contribute) to get started, or browse the [GitHub repository](https://github.com/mne-tools/mne-cpp).
+
+## Research Projects
+
+MNE-CPP has been developed and extended through several funded research projects:
+
+| Project | Duration | Funding | Description |
+|---------|----------|---------|-------------|
+| MNE-CE | 2017–2022 | NIH (1U01EB023820) | Device-independent, standardized software for real-time acquisition, control, and processing of electrophysiological data. |
+| OCE | 2018–2021 | DFG / FWF (397686322) | Online neuronal connectivity estimation and neurofeedback with transcranial magnetic stimulation (TMS). Real-time MEG/EEG connectivity methods. |
+| OSL | 2013–2015 | DFG (Ba 4858/1-1) | Online MEG source estimation using high-performance GPU computing. |
+| AWS Credits | 2018–2019 | AWS | Cloud computing support for MNE-CPP via the AWS Credits for Research Program. |
+| Azure Credits | 2016–2018 | Microsoft | Cloud computing support via the Microsoft Azure for Research program. |
+
+### Funding Organizations
+
+
+
+### Supporting Institutions
+
+
+
+## Contact
+
+For questions and feedback, reach out via the [MNE Forum](https://mne.discourse.group/) or [GitHub Issues](https://github.com/mne-tools/mne-cpp/issues). You can also contact the core team directly:
+
+| Name | Affiliation | Email |
+|---|---|---|
+| Christoph Dinh | [Carl Zeiss AG](https://www.zeiss.com/) | christoph.dinh@mne-cpp.org |
+| Lorenz Esch | [Boston Children's Hospital](http://www.childrenshospital.org/) | lorenz.esch@childrens.harvard.edu |
+| Gabriel Motta | | gabrielbenmotta@gmail.com |
+| Juan Garcia-Prieto | [MGH](https://www.massgeneral.org/) | jgarciaprieto@mgh.harvard.edu |
+| Matti S. Hämäläinen | [Martinos Center / MGH](https://martinos.org/) | msh@nmr.mgh.harvard.edu |
+| Yoshio Okada | [Boston Children's Hospital](http://www.childrenshospital.org/) | yoshio.okada@childrens.harvard.edu |
+| John C. Mosher | [UTHealth Houston](https://www.uth.edu/) | John.C.Mosher@uth.tmc.edu |
+| Jens Haueisen | [TU Ilmenau](https://www.tu-ilmenau.de/) | jens.haueisen@tu-ilmenau.de |
+| Daniel Baumgarten | [Universität Innsbruck](https://www.uibk.ac.at/) | daniel.baumgarten@uibk.ac.at |
+
+For a full list of contributors see the [GitHub contributors page](https://github.com/mne-tools/mne-cpp/graphs/contributors).
+
+## Legal Notice
+
+MNE-CPP is a community-driven open-source project with no commercial interest. The source code is released under the [BSD 3-Clause License](https://github.com/mne-tools/mne-cpp/blob/main/LICENSE).
diff --git a/doc/website/docs/publications.mdx b/doc/website/docs/publications.mdx
new file mode 100644
index 00000000000..7b5ff7163dc
--- /dev/null
+++ b/doc/website/docs/publications.mdx
@@ -0,0 +1,24 @@
+---
+title: "Publications"
+sidebar_label: "Publications"
+sidebar_position: 3
+---
+
+# List of Publications
+
+| |
+|---|
+| Dinh, C.; Samuelsson, J.G.; Hunold, A.; Hämäläinen, M.S.; Khan, S.: Contextual MEG and EEG Source Estimates Using Spatiotemporal LSTM Networks. Frontiers in Neuroscience (2021), [DOI: 10.3389/fnins.2021.552666](https://doi.org/10.3389/fnins.2021.552666) |
+| Dinh, C.; Samuelson, J.G.W.; Hunold, A.; Hämäläinen, M.S.; Khan, S.: Contextual Minimum-Norm Estimates (CMNE): A Deep documentationing Method for Source Estimation in Neuronal Networks. arXiv (2019), [ArXiv ID: 1909.02636](http://arxiv.org/abs/1909.02636) |
+| Esch, L.; Dinh, C.; Larson, E.; Engemann, D.; Jas, M.; Khan, S.; Gramfort, A.; Hämäläinen, M.S.: MNE: Software for Acquiring, Processing and Visualizing MEG/EEG Data. Magnetoencephalography: From Signals to Dynamic Cortical Networks. 2nd Edition. Springer (2019), [DOI: 10.1007/978-3-319-62657-4_59-1](https://link.springer.com/referenceworkentry/10.1007%2F978-3-319-62657-4_59-1) |
+| Esch, L.; Sun, L.; Klüber, V.; Lew, S.; Baumgarten, D.; Grant, P. E.; Okada, Y.; Haueisen, J.; Hamalainen, M.S.; Dinh, C.: MNE Scan: Software for Real-Time Processing of Electrophysiological Data. Journal of Neuroscience Methods (2018), [DOI: 10.1016/j.jneumeth.2018.03.020](https://www.sciencedirect.com/science/article/pii/S0165027018300979) |
+| Dinh, C.; Esch, L.; Rühle, J.; Bollmann, S.; Güllmar, D.; Baumgarten, D.; Hämäläinen, MS.; Haueisen, J.: Real-Time Clustered Multiple Signal Classification (RTC-MUSIC). Brain Topography (2017), [DOI: 10.1007/s10548-017-0586-7](https://link.springer.com/article/10.1007/s10548-017-0586-7) |
+| Sun, L.; Han, M.; Pratt, K.; Paulson, D.; Dinh, C.; Esch, L.; Okada, Y.; Hämäläinen, M.S.: Versatile synchronized real-time MEG hardware controller for large-scale fast data acquisition. Review of Scientific Instruments (2017), [DOI: 10.1063/1.4983080](https://aip.scitation.org/doi/abs/10.1063/1.4983080?journalCode=rsi) |
+| Okada, Y.; Hämäläinen, M.S.; Pratt, K.; Mascarenas, A.; Miller, P.; Han, M.; Robles, J.; Cavallini, A.; Power, B.; Sieng, K.; Sun, L.; Lew, S.; Doshi, C.; Ahtam, B.; Dinh, C.; Esch, L.; Grant, E.; Nummenmaa, A.; Paulson, D.: BabyMEG: A whole-head pediatric magnetoencephalography system for human brain development research. Review of Scientific Instruments (2016), [DOI: 10.1063/1.4962020](https://pubmed.ncbi.nlm.nih.gov/27782541/) |
+| Dinh, C.: Brain Monitoring: Real-Time Localization of Neuronal Activity. Book. Shaker (Aachen). 2015. isbn: 978-3-8440-3837-8. [DOI: 10.2370/9783844038378](http://www.shaker.eu/en/content/catalogue/index.asp?lang=en&ID=8&ISBN=978-3-8440-3837-8) |
+| Dinh, C.; Strohmeier, D.; Luessi, M.; Güllmar, D.; Baumgarten, D.; Haueisen, J.; Hämäläinen, M.S.: Real-Time MEG Source Localization using Regional Clustering. Brain Topography (2015), [DOI: 10.1007/s10548-015-0431-9](http://link.springer.com/article/10.1007%2Fs10548-015-0431-9) |
+| Dinh, C.; Luessi, M.; Sun, L.; Haueisen, J.; Hämäläinen, M.S.: MNE-X: MEG/EEG Real-Time Acquisition, Real-Time Processing, and Real-Time Source Localization Framework. Biomedizinische Technik (Berl.) (2013), 58, [DOI: 10.1515/bmt-2013-4184](https://www.degruyter.com/view/journals/bmte/58/SI-1-Track-G/article-000010151520134184.xml) |
+| Dinh, C.; Rühle, J.; Bollmann, S.; Haueisen, J.; Güllmar, D.: A GPU-accelerated Performance Optimized RAP-MUSIC Algorithm for Real-Time Source Localization. Biomedizinische Technik (Berl.) (2012), 57 [DOI: 10.1515/bmt-2012-4260](https://www.degruyter.com/view/journals/bmte/57/SI-1-Track-O/article-p808.xml) |
+| Dinh, C.; Strohmeier, D.; Haueisen, J.; Güllmar, D.: Brain Atlas based Region of Interest Selection for Real-Time Source Localization using K-Means Lead Field Clustering and RAP-MUSIC. Biomedizinische Technik (Berl.) (2012), 57 |
+| Dinh, C.; Bollmann, S.; Eichardt, R.; Baumgarten, D.; Haueisen, J.: A Performance-Optimized RAP-MUSIC-Algorithm for Online Source Localizations. OIPE (2010) |
+| Dinh, C.; Esch, L.; Sun, L.; Schlembach, F.; Lew, S.; Kunze, T.; Knobl, D.; Henfling, M; Pieloth, C.; Doshi, C.; Polo, F.; Strohmeier, D.; Luessi, M.; Okada, Y.; Haueisen, J.; Hämäläinen, M. S.: MNE-CPP v1.0.0-beta 3.0 Zenodo (2017). [DOI 10.5281/zenodo.439390](https://zenodo.org/record/439390) |
diff --git a/doc/website/docusaurus.config.ts b/doc/website/docusaurus.config.ts
new file mode 100644
index 00000000000..b73bfe1208d
--- /dev/null
+++ b/doc/website/docusaurus.config.ts
@@ -0,0 +1,159 @@
+import { themes as prismThemes } from 'prism-react-renderer';
+import type { Config } from '@docusaurus/types';
+import type * as Preset from '@docusaurus/preset-classic';
+import remarkMath from 'remark-math';
+import rehypeKatex from 'rehype-katex';
+
+const config: Config = {
+ title: 'MNE-CPP',
+ tagline: 'The C++ framework for real-time functional brain imaging.',
+ favicon: 'img/favicon.ico',
+
+ url: 'https://mne-cpp.github.io',
+ baseUrl: '/',
+
+ organizationName: 'mne-cpp',
+ projectName: 'mne-cpp.github.io',
+
+ onBrokenLinks: 'warn',
+ onBrokenMarkdownLinks: 'warn',
+
+ customFields: {
+ version: '2.0.0',
+ },
+
+ i18n: {
+ defaultLocale: 'en',
+ locales: ['en'],
+ },
+
+ presets: [
+ [
+ 'classic',
+ {
+ docs: {
+ sidebarPath: './sidebars.ts',
+ remarkPlugins: [remarkMath],
+ rehypePlugins: [rehypeKatex],
+ },
+ blog: false,
+ theme: {
+ customCss: './src/css/custom.css',
+ },
+ } satisfies Preset.Options,
+ ],
+ ],
+
+ themes: [
+ '@docusaurus/theme-mermaid',
+ [
+ '@easyops-cn/docusaurus-search-local',
+ {
+ hashed: true,
+ indexDocs: true,
+ indexBlog: false,
+ docsRouteBasePath: '/docs',
+ searchBarShortcutHint: true,
+ searchBarPosition: 'right',
+ },
+ ],
+ ],
+
+ markdown: {
+ format: 'mdx',
+ mermaid: true,
+ },
+
+ stylesheets: [
+ '/katex.min.css',
+ ],
+
+ themeConfig: {
+ image: 'img/mne-cpp-social-card.png',
+ colorMode: {
+ defaultMode: 'dark',
+ disableSwitch: false,
+ respectPrefersColorScheme: true,
+ },
+ navbar: {
+ title: '',
+ logo: {
+ alt: 'MNE-CPP Logo',
+ src: 'img/logo.svg',
+ srcDark: 'img/logo-dark.svg',
+ },
+ items: [
+ {
+ type: 'docSidebar',
+ sidebarId: 'docsSidebar',
+ position: 'left',
+ label: 'Documentation',
+ },
+ {
+ type: 'docSidebar',
+ sidebarId: 'developmentSidebar',
+ position: 'left',
+ label: 'Development',
+ },
+ {
+ href: 'https://mne-cpp.github.io/doxygen-api/',
+ label: 'API Reference',
+ position: 'left',
+ },
+ {
+ to: '/download',
+ label: 'Download',
+ position: 'left',
+ },
+ {
+ type: 'html',
+ position: 'right',
+ value: 'v2.0.0 ',
+ },
+ {
+ href: 'https://github.com/mne-tools/mne-cpp',
+ position: 'right',
+ className: 'header-github-link',
+ 'aria-label': 'GitHub repository',
+ },
+ ],
+ },
+ footer: {
+ style: 'dark',
+ links: [
+ {
+ title: 'Documentation',
+ items: [
+ { label: 'Getting Started', to: '/docs/overview' },
+ { label: 'Manual', to: '/docs/manual/intro' },
+ { label: 'Publications', to: '/docs/publications' },
+ ],
+ },
+ {
+ title: 'Development',
+ items: [
+ { label: 'Build from Source', to: '/docs/development/buildguide-cmake' },
+ { label: 'Contribute', to: '/docs/development/contribute' },
+ { label: 'API Reference', href: 'https://mne-cpp.github.io/doxygen-api/' },
+ ],
+ },
+ {
+ title: 'Community',
+ items: [
+ { label: 'GitHub', href: 'https://github.com/mne-tools/mne-cpp' },
+ { label: 'How to Cite', to: '/docs/cite' },
+ { label: 'Legal Notice', to: '/docs/overview#legal-notice' },
+ ],
+ },
+ ],
+ copyright: `Copyright © ${new Date().getFullYear()} MNE-CPP. Built with Docusaurus.`,
+ },
+ prism: {
+ theme: prismThemes.github,
+ darkTheme: prismThemes.dracula,
+ additionalLanguages: ['cpp', 'cmake', 'bash'],
+ },
+ } satisfies Preset.ThemeConfig,
+};
+
+export default config;
diff --git a/doc/website/package-lock.json b/doc/website/package-lock.json
new file mode 100644
index 00000000000..188ec70c846
--- /dev/null
+++ b/doc/website/package-lock.json
@@ -0,0 +1,20504 @@
+{
+ "name": "mne-cpp-website",
+ "version": "2.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "mne-cpp-website",
+ "version": "2.0.0",
+ "dependencies": {
+ "@docusaurus/core": "^3.7.0",
+ "@docusaurus/preset-classic": "^3.7.0",
+ "@docusaurus/theme-mermaid": "^3.9.2",
+ "@easyops-cn/docusaurus-search-local": "^0.55.0",
+ "@mdx-js/react": "^3.0.0",
+ "clsx": "^2.1.0",
+ "prism-react-renderer": "^2.3.0",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "rehype-katex": "^7.0.1",
+ "remark-math": "^6.0.0"
+ },
+ "devDependencies": {
+ "@docusaurus/module-type-aliases": "^3.7.0",
+ "@docusaurus/tsconfig": "^3.7.0",
+ "@docusaurus/types": "^3.7.0",
+ "typescript": "~5.6.0"
+ },
+ "engines": {
+ "node": ">=18.0"
+ }
+ },
+ "node_modules/@algolia/abtesting": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.15.0.tgz",
+ "integrity": "sha512-D1QZ8dQx5zC9yrxNao9ER9bojmmzUdL1i2P9waIRiwnZ5fI26YswcCd6VHR/Q4W3PASfVf2My4YQ2FhGGDewTQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.49.0",
+ "@algolia/requester-browser-xhr": "5.49.0",
+ "@algolia/requester-fetch": "5.49.0",
+ "@algolia/requester-node-http": "5.49.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/autocomplete-core": {
+ "version": "1.19.2",
+ "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.2.tgz",
+ "integrity": "sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/autocomplete-plugin-algolia-insights": "1.19.2",
+ "@algolia/autocomplete-shared": "1.19.2"
+ }
+ },
+ "node_modules/@algolia/autocomplete-plugin-algolia-insights": {
+ "version": "1.19.2",
+ "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.2.tgz",
+ "integrity": "sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/autocomplete-shared": "1.19.2"
+ },
+ "peerDependencies": {
+ "search-insights": ">= 1 < 3"
+ }
+ },
+ "node_modules/@algolia/autocomplete-shared": {
+ "version": "1.19.2",
+ "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz",
+ "integrity": "sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@algolia/client-search": ">= 4.9.1 < 6",
+ "algoliasearch": ">= 4.9.1 < 6"
+ }
+ },
+ "node_modules/@algolia/client-abtesting": {
+ "version": "5.49.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.49.0.tgz",
+ "integrity": "sha512-Q1MSRhh4Du9WeLIl1S9O+BDUMaL01uuQtmzCyEzOBtu1xBDr3wvqrTJtfEceEkA5/Nw1BdGSHa6sDT3xTAF90A==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.49.0",
+ "@algolia/requester-browser-xhr": "5.49.0",
+ "@algolia/requester-fetch": "5.49.0",
+ "@algolia/requester-node-http": "5.49.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-analytics": {
+ "version": "5.49.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.49.0.tgz",
+ "integrity": "sha512-v50elhC80oyQw+8o8BwM+VvPuOo36+3W8VCfR4hsHoafQtGbMtP63U5eNcUydbVsM0py3JLoBaL1yKBK4L01sg==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.49.0",
+ "@algolia/requester-browser-xhr": "5.49.0",
+ "@algolia/requester-fetch": "5.49.0",
+ "@algolia/requester-node-http": "5.49.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-common": {
+ "version": "5.49.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.49.0.tgz",
+ "integrity": "sha512-BDmVDtpDvymfLE5YQ2cPnfWJUVTDJqwpJa03Fsb7yJFJmbeKsUOGsnRkYsTbdzf0FfcvyvBB5zdcbrAIL249bg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-insights": {
+ "version": "5.49.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.49.0.tgz",
+ "integrity": "sha512-lDCXsnZDx7zQ5GzSi1EL3l07EbksjrdpMgixFRCdi2QqeBe42HIQJfPPqdWtwrAXjORRopsPx2z+gGYJP/79Uw==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.49.0",
+ "@algolia/requester-browser-xhr": "5.49.0",
+ "@algolia/requester-fetch": "5.49.0",
+ "@algolia/requester-node-http": "5.49.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-personalization": {
+ "version": "5.49.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.49.0.tgz",
+ "integrity": "sha512-5k/KB+DsnesNKvMUEwTKSzExOf5zYbiPg7DVO7g1Y/+bhMb3wmxp9RFwfqwPfmoRTjptqvwhR6a0593tWVkmAw==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.49.0",
+ "@algolia/requester-browser-xhr": "5.49.0",
+ "@algolia/requester-fetch": "5.49.0",
+ "@algolia/requester-node-http": "5.49.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-query-suggestions": {
+ "version": "5.49.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.49.0.tgz",
+ "integrity": "sha512-pjHNcrdjn7p3RQ5Ql1Baiwfdn9bkS+z4gqONJJP8kuZFqYP8Olthy4G7fl5bCB29UjdUj5EWlaElQKCtPluCtQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.49.0",
+ "@algolia/requester-browser-xhr": "5.49.0",
+ "@algolia/requester-fetch": "5.49.0",
+ "@algolia/requester-node-http": "5.49.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-search": {
+ "version": "5.49.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.49.0.tgz",
+ "integrity": "sha512-uGv2P3lcviuaZy8ZOAyN60cZdhOVyjXwaDC27a1qdp3Pb5Azn+lLSJwkHU4TNRpphHmIei9HZuUxwQroujdPjw==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.49.0",
+ "@algolia/requester-browser-xhr": "5.49.0",
+ "@algolia/requester-fetch": "5.49.0",
+ "@algolia/requester-node-http": "5.49.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/events": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz",
+ "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==",
+ "license": "MIT"
+ },
+ "node_modules/@algolia/ingestion": {
+ "version": "1.49.0",
+ "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.49.0.tgz",
+ "integrity": "sha512-sH10mftYlmvfGbvAgTtHYbCIstmNUdiAkX//0NAyBcJRB6NnZmNsdLxdFGbE8ZqlGXzoe0zcUIau+DxKpXtqCw==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.49.0",
+ "@algolia/requester-browser-xhr": "5.49.0",
+ "@algolia/requester-fetch": "5.49.0",
+ "@algolia/requester-node-http": "5.49.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/monitoring": {
+ "version": "1.49.0",
+ "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.49.0.tgz",
+ "integrity": "sha512-RqhGcVVxLpK+lA0GZKywlQIXsI704flc12nv/hOdrwiuk/Uyhxs46KLM4ngip7wutU+7t0PYZWiVayrqBPN/ZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.49.0",
+ "@algolia/requester-browser-xhr": "5.49.0",
+ "@algolia/requester-fetch": "5.49.0",
+ "@algolia/requester-node-http": "5.49.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/recommend": {
+ "version": "5.49.0",
+ "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.49.0.tgz",
+ "integrity": "sha512-kg8omGRvmIPhhqtUqSIpS3regFKWuoWh3WqyUhGk27N4T7q8I++8TsDYsV8vK7oBEzw706m2vUBtN5fw2fDjmw==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.49.0",
+ "@algolia/requester-browser-xhr": "5.49.0",
+ "@algolia/requester-fetch": "5.49.0",
+ "@algolia/requester-node-http": "5.49.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/requester-browser-xhr": {
+ "version": "5.49.0",
+ "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.49.0.tgz",
+ "integrity": "sha512-BaZ6NTI9VdSbDcsMucdKhTuFFxv6B+3dAZZBozX12fKopYsELh7dBLfZwm8evDCIicmNjIjobi4VNnNshrCSuw==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.49.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/requester-fetch": {
+ "version": "5.49.0",
+ "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.49.0.tgz",
+ "integrity": "sha512-2nxISxS5xO5DLAj6QzMImgJv6CqpZhJVkhcTFULESR/k4IpbkJTEHmViVTxw9MlrU8B5GfwHevFd7vKL3a7MXQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.49.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/requester-node-http": {
+ "version": "5.49.0",
+ "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.49.0.tgz",
+ "integrity": "sha512-S/B94C6piEUXGpN3y5ysmNKMEqdfNVAXYY+FxivEAV5IGJjbEuLZfT8zPPZUWGw9vh6lgP80Hye2G5aVBNIa8Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.49.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@antfu/install-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz",
+ "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==",
+ "license": "MIT",
+ "dependencies": {
+ "package-manager-detector": "^1.3.0",
+ "tinyexec": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
+ "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz",
+ "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz",
+ "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.0",
+ "@babel/generator": "^7.29.0",
+ "@babel/helper-compilation-targets": "^7.28.6",
+ "@babel/helper-module-transforms": "^7.28.6",
+ "@babel/helpers": "^7.28.6",
+ "@babel/parser": "^7.29.0",
+ "@babel/template": "^7.28.6",
+ "@babel/traverse": "^7.29.0",
+ "@babel/types": "^7.29.0",
+ "@jridgewell/remapping": "^2.3.5",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/core/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.29.1",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz",
+ "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.0",
+ "@babel/types": "^7.29.0",
+ "@jridgewell/gen-mapping": "^0.3.12",
+ "@jridgewell/trace-mapping": "^0.3.28",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.27.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz",
+ "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.27.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz",
+ "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.28.6",
+ "@babel/helper-validator-option": "^7.27.1",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz",
+ "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.3",
+ "@babel/helper-member-expression-to-functions": "^7.28.5",
+ "@babel/helper-optimise-call-expression": "^7.27.1",
+ "@babel/helper-replace-supers": "^7.28.6",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
+ "@babel/traverse": "^7.28.6",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz",
+ "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.3",
+ "regexpu-core": "^6.3.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-define-polyfill-provider": {
+ "version": "0.6.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.6.tgz",
+ "integrity": "sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "debug": "^4.4.3",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.22.11"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/helper-globals": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
+ "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz",
+ "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.28.5",
+ "@babel/types": "^7.28.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz",
+ "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.28.6",
+ "@babel/types": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz",
+ "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.28.6",
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "@babel/traverse": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz",
+ "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz",
+ "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-remap-async-to-generator": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz",
+ "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.1",
+ "@babel/helper-wrap-function": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz",
+ "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-member-expression-to-functions": "^7.28.5",
+ "@babel/helper-optimise-call-expression": "^7.27.1",
+ "@babel/traverse": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz",
+ "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
+ "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz",
+ "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.28.6",
+ "@babel/traverse": "^7.28.6",
+ "@babel/types": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz",
+ "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.28.6",
+ "@babel/types": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz",
+ "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.0"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz",
+ "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/traverse": "^7.28.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz",
+ "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz",
+ "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz",
+ "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
+ "@babel/plugin-transform-optional-chaining": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.13.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz",
+ "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "@babel/traverse": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.21.0-placeholder-for-preset-env.2",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
+ "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-dynamic-import": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+ "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-assertions": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz",
+ "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-attributes": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz",
+ "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz",
+ "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-typescript": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz",
+ "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
+ "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-arrow-functions": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz",
+ "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-generator-functions": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz",
+ "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "@babel/helper-remap-async-to-generator": "^7.27.1",
+ "@babel/traverse": "^7.29.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-to-generator": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz",
+ "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "@babel/helper-remap-async-to-generator": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz",
+ "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoping": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz",
+ "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-properties": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz",
+ "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-static-block": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz",
+ "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.12.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz",
+ "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.3",
+ "@babel/helper-compilation-targets": "^7.28.6",
+ "@babel/helper-globals": "^7.28.0",
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "@babel/helper-replace-supers": "^7.28.6",
+ "@babel/traverse": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-computed-properties": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz",
+ "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "@babel/template": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-destructuring": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz",
+ "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/traverse": "^7.28.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dotall-regex": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz",
+ "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.28.5",
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-keys": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz",
+ "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz",
+ "integrity": "sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.28.5",
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dynamic-import": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz",
+ "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-explicit-resource-management": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz",
+ "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "@babel/plugin-transform-destructuring": "^7.28.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz",
+ "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-export-namespace-from": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz",
+ "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-for-of": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz",
+ "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz",
+ "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-json-strings": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz",
+ "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-literals": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz",
+ "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-logical-assignment-operators": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz",
+ "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-member-expression-literals": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz",
+ "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-amd": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz",
+ "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-commonjs": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz",
+ "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-systemjs": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.0.tgz",
+ "integrity": "sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "@babel/traverse": "^7.29.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-umd": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz",
+ "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz",
+ "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.28.5",
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-new-target": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz",
+ "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz",
+ "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-numeric-separator": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz",
+ "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-rest-spread": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz",
+ "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "@babel/plugin-transform-destructuring": "^7.28.5",
+ "@babel/plugin-transform-parameters": "^7.27.7",
+ "@babel/traverse": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-super": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz",
+ "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-replace-supers": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-catch-binding": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz",
+ "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-chaining": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz",
+ "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-parameters": {
+ "version": "7.27.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz",
+ "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-methods": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz",
+ "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-property-in-object": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz",
+ "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.3",
+ "@babel/helper-create-class-features-plugin": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-property-literals": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz",
+ "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-constant-elements": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz",
+ "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-display-name": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz",
+ "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.28.6.tgz",
+ "integrity": "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.3",
+ "@babel/helper-module-imports": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "@babel/plugin-syntax-jsx": "^7.28.6",
+ "@babel/types": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-development": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz",
+ "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/plugin-transform-react-jsx": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-pure-annotations": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz",
+ "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regenerator": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz",
+ "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regexp-modifiers": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz",
+ "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.28.5",
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-reserved-words": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz",
+ "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-runtime": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz",
+ "integrity": "sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "babel-plugin-polyfill-corejs2": "^0.4.14",
+ "babel-plugin-polyfill-corejs3": "^0.13.0",
+ "babel-plugin-polyfill-regenerator": "^0.6.5",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-runtime/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/plugin-transform-shorthand-properties": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz",
+ "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-spread": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz",
+ "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-sticky-regex": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz",
+ "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-template-literals": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz",
+ "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typeof-symbol": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz",
+ "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typescript": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz",
+ "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.3",
+ "@babel/helper-create-class-features-plugin": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
+ "@babel/plugin-syntax-typescript": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-escapes": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz",
+ "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-property-regex": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz",
+ "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.28.5",
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-regex": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz",
+ "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-sets-regex": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz",
+ "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.28.5",
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/preset-env": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.0.tgz",
+ "integrity": "sha512-fNEdfc0yi16lt6IZo2Qxk3knHVdfMYX33czNb4v8yWhemoBhibCpQK/uYHtSKIiO+p/zd3+8fYVXhQdOVV608w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.29.0",
+ "@babel/helper-compilation-targets": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "@babel/helper-validator-option": "^7.27.1",
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5",
+ "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1",
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6",
+ "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
+ "@babel/plugin-syntax-import-assertions": "^7.28.6",
+ "@babel/plugin-syntax-import-attributes": "^7.28.6",
+ "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
+ "@babel/plugin-transform-arrow-functions": "^7.27.1",
+ "@babel/plugin-transform-async-generator-functions": "^7.29.0",
+ "@babel/plugin-transform-async-to-generator": "^7.28.6",
+ "@babel/plugin-transform-block-scoped-functions": "^7.27.1",
+ "@babel/plugin-transform-block-scoping": "^7.28.6",
+ "@babel/plugin-transform-class-properties": "^7.28.6",
+ "@babel/plugin-transform-class-static-block": "^7.28.6",
+ "@babel/plugin-transform-classes": "^7.28.6",
+ "@babel/plugin-transform-computed-properties": "^7.28.6",
+ "@babel/plugin-transform-destructuring": "^7.28.5",
+ "@babel/plugin-transform-dotall-regex": "^7.28.6",
+ "@babel/plugin-transform-duplicate-keys": "^7.27.1",
+ "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.0",
+ "@babel/plugin-transform-dynamic-import": "^7.27.1",
+ "@babel/plugin-transform-explicit-resource-management": "^7.28.6",
+ "@babel/plugin-transform-exponentiation-operator": "^7.28.6",
+ "@babel/plugin-transform-export-namespace-from": "^7.27.1",
+ "@babel/plugin-transform-for-of": "^7.27.1",
+ "@babel/plugin-transform-function-name": "^7.27.1",
+ "@babel/plugin-transform-json-strings": "^7.28.6",
+ "@babel/plugin-transform-literals": "^7.27.1",
+ "@babel/plugin-transform-logical-assignment-operators": "^7.28.6",
+ "@babel/plugin-transform-member-expression-literals": "^7.27.1",
+ "@babel/plugin-transform-modules-amd": "^7.27.1",
+ "@babel/plugin-transform-modules-commonjs": "^7.28.6",
+ "@babel/plugin-transform-modules-systemjs": "^7.29.0",
+ "@babel/plugin-transform-modules-umd": "^7.27.1",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0",
+ "@babel/plugin-transform-new-target": "^7.27.1",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6",
+ "@babel/plugin-transform-numeric-separator": "^7.28.6",
+ "@babel/plugin-transform-object-rest-spread": "^7.28.6",
+ "@babel/plugin-transform-object-super": "^7.27.1",
+ "@babel/plugin-transform-optional-catch-binding": "^7.28.6",
+ "@babel/plugin-transform-optional-chaining": "^7.28.6",
+ "@babel/plugin-transform-parameters": "^7.27.7",
+ "@babel/plugin-transform-private-methods": "^7.28.6",
+ "@babel/plugin-transform-private-property-in-object": "^7.28.6",
+ "@babel/plugin-transform-property-literals": "^7.27.1",
+ "@babel/plugin-transform-regenerator": "^7.29.0",
+ "@babel/plugin-transform-regexp-modifiers": "^7.28.6",
+ "@babel/plugin-transform-reserved-words": "^7.27.1",
+ "@babel/plugin-transform-shorthand-properties": "^7.27.1",
+ "@babel/plugin-transform-spread": "^7.28.6",
+ "@babel/plugin-transform-sticky-regex": "^7.27.1",
+ "@babel/plugin-transform-template-literals": "^7.27.1",
+ "@babel/plugin-transform-typeof-symbol": "^7.27.1",
+ "@babel/plugin-transform-unicode-escapes": "^7.27.1",
+ "@babel/plugin-transform-unicode-property-regex": "^7.28.6",
+ "@babel/plugin-transform-unicode-regex": "^7.27.1",
+ "@babel/plugin-transform-unicode-sets-regex": "^7.28.6",
+ "@babel/preset-modules": "0.1.6-no-external-plugins",
+ "babel-plugin-polyfill-corejs2": "^0.4.15",
+ "babel-plugin-polyfill-corejs3": "^0.14.0",
+ "babel-plugin-polyfill-regenerator": "^0.6.6",
+ "core-js-compat": "^3.48.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.0.tgz",
+ "integrity": "sha512-AvDcMxJ34W4Wgy4KBIIePQTAOP1Ie2WFwkQp3dB7FQ/f0lI5+nM96zUnYEOE1P9sEg0es5VCP0HxiWu5fUHZAQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.6",
+ "core-js-compat": "^3.48.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/preset-env/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/preset-modules": {
+ "version": "0.1.6-no-external-plugins",
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
+ "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/preset-react": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz",
+ "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-validator-option": "^7.27.1",
+ "@babel/plugin-transform-react-display-name": "^7.28.0",
+ "@babel/plugin-transform-react-jsx": "^7.27.1",
+ "@babel/plugin-transform-react-jsx-development": "^7.27.1",
+ "@babel/plugin-transform-react-pure-annotations": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-typescript": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz",
+ "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-validator-option": "^7.27.1",
+ "@babel/plugin-syntax-jsx": "^7.27.1",
+ "@babel/plugin-transform-modules-commonjs": "^7.27.1",
+ "@babel/plugin-transform-typescript": "^7.28.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz",
+ "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/runtime-corejs3": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.29.0.tgz",
+ "integrity": "sha512-TgUkdp71C9pIbBcHudc+gXZnihEDOjUAmXO1VO4HHGES7QLZcShR0stfKIxLSNIYx2fqhmJChOjm/wkF8wv4gA==",
+ "license": "MIT",
+ "dependencies": {
+ "core-js-pure": "^3.48.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
+ "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.28.6",
+ "@babel/parser": "^7.28.6",
+ "@babel/types": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz",
+ "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.0",
+ "@babel/generator": "^7.29.0",
+ "@babel/helper-globals": "^7.28.0",
+ "@babel/parser": "^7.29.0",
+ "@babel/template": "^7.28.6",
+ "@babel/types": "^7.29.0",
+ "debug": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
+ "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.28.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@braintree/sanitize-url": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz",
+ "integrity": "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==",
+ "license": "MIT"
+ },
+ "node_modules/@chevrotain/cst-dts-gen": {
+ "version": "11.1.1",
+ "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.1.1.tgz",
+ "integrity": "sha512-fRHyv6/f542qQqiRGalrfJl/evD39mAvbJLCekPazhiextEatq1Jx1K/i9gSd5NNO0ds03ek0Cbo/4uVKmOBcw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@chevrotain/gast": "11.1.1",
+ "@chevrotain/types": "11.1.1",
+ "lodash-es": "4.17.23"
+ }
+ },
+ "node_modules/@chevrotain/gast": {
+ "version": "11.1.1",
+ "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.1.1.tgz",
+ "integrity": "sha512-Ko/5vPEYy1vn5CbCjjvnSO4U7GgxyGm+dfUZZJIWTlQFkXkyym0jFYrWEU10hyCjrA7rQtiHtBr0EaZqvHFZvg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@chevrotain/types": "11.1.1",
+ "lodash-es": "4.17.23"
+ }
+ },
+ "node_modules/@chevrotain/regexp-to-ast": {
+ "version": "11.1.1",
+ "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.1.1.tgz",
+ "integrity": "sha512-ctRw1OKSXkOrR8VTvOxrQ5USEc4sNrfwXHa1NuTcR7wre4YbjPcKw+82C2uylg/TEwFRgwLmbhlln4qkmDyteg==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/@chevrotain/types": {
+ "version": "11.1.1",
+ "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.1.1.tgz",
+ "integrity": "sha512-wb2ToxG8LkgPYnKe9FH8oGn3TMCBdnwiuNC5l5y+CtlaVRbCytU0kbVsk6CGrqTL4ZN4ksJa0TXOYbxpbthtqw==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/@chevrotain/utils": {
+ "version": "11.1.1",
+ "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.1.1.tgz",
+ "integrity": "sha512-71eTYMzYXYSFPrbg/ZwftSaSDld7UYlS8OQa3lNnn9jzNtpFbaReRRyghzqS7rI3CDaorqpPJJcXGHK+FE1TVQ==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/@colors/colors": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
+ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.1.90"
+ }
+ },
+ "node_modules/@csstools/cascade-layer-name-parser": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz",
+ "integrity": "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4"
+ }
+ },
+ "node_modules/@csstools/color-helpers": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz",
+ "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@csstools/css-calc": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz",
+ "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4"
+ }
+ },
+ "node_modules/@csstools/css-color-parser": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz",
+ "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@csstools/color-helpers": "^5.1.0",
+ "@csstools/css-calc": "^2.1.4"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4"
+ }
+ },
+ "node_modules/@csstools/css-parser-algorithms": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz",
+ "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-tokenizer": "^3.0.4"
+ }
+ },
+ "node_modules/@csstools/css-tokenizer": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz",
+ "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@csstools/media-query-list-parser": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz",
+ "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4"
+ }
+ },
+ "node_modules/@csstools/postcss-alpha-function": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.1.tgz",
+ "integrity": "sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-color-parser": "^3.1.0",
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4",
+ "@csstools/postcss-progressive-custom-properties": "^4.2.1",
+ "@csstools/utilities": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-cascade-layers": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz",
+ "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/selector-specificity": "^5.0.0",
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-cascade-layers/node_modules/@csstools/selector-specificity": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz",
+ "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ }
+ },
+ "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz",
+ "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@csstools/postcss-color-function": {
+ "version": "4.0.12",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.12.tgz",
+ "integrity": "sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-color-parser": "^3.1.0",
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4",
+ "@csstools/postcss-progressive-custom-properties": "^4.2.1",
+ "@csstools/utilities": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-color-function-display-p3-linear": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.1.tgz",
+ "integrity": "sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-color-parser": "^3.1.0",
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4",
+ "@csstools/postcss-progressive-custom-properties": "^4.2.1",
+ "@csstools/utilities": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-color-mix-function": {
+ "version": "3.0.12",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.12.tgz",
+ "integrity": "sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-color-parser": "^3.1.0",
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4",
+ "@csstools/postcss-progressive-custom-properties": "^4.2.1",
+ "@csstools/utilities": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-color-mix-variadic-function-arguments": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.2.tgz",
+ "integrity": "sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-color-parser": "^3.1.0",
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4",
+ "@csstools/postcss-progressive-custom-properties": "^4.2.1",
+ "@csstools/utilities": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-content-alt-text": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.8.tgz",
+ "integrity": "sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4",
+ "@csstools/postcss-progressive-custom-properties": "^4.2.1",
+ "@csstools/utilities": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-contrast-color-function": {
+ "version": "2.0.12",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-2.0.12.tgz",
+ "integrity": "sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-color-parser": "^3.1.0",
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4",
+ "@csstools/postcss-progressive-custom-properties": "^4.2.1",
+ "@csstools/utilities": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-exponential-functions": {
+ "version": "2.0.9",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz",
+ "integrity": "sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-calc": "^2.1.4",
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-font-format-keywords": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz",
+ "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/utilities": "^2.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-gamut-mapping": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.11.tgz",
+ "integrity": "sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-color-parser": "^3.1.0",
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-gradients-interpolation-method": {
+ "version": "5.0.12",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.12.tgz",
+ "integrity": "sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-color-parser": "^3.1.0",
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4",
+ "@csstools/postcss-progressive-custom-properties": "^4.2.1",
+ "@csstools/utilities": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-hwb-function": {
+ "version": "4.0.12",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.12.tgz",
+ "integrity": "sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-color-parser": "^3.1.0",
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4",
+ "@csstools/postcss-progressive-custom-properties": "^4.2.1",
+ "@csstools/utilities": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-ic-unit": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.4.tgz",
+ "integrity": "sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/postcss-progressive-custom-properties": "^4.2.1",
+ "@csstools/utilities": "^2.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-initial": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz",
+ "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-is-pseudo-class": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz",
+ "integrity": "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/selector-specificity": "^5.0.0",
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-is-pseudo-class/node_modules/@csstools/selector-specificity": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz",
+ "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ }
+ },
+ "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz",
+ "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@csstools/postcss-light-dark-function": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz",
+ "integrity": "sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4",
+ "@csstools/postcss-progressive-custom-properties": "^4.2.1",
+ "@csstools/utilities": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-logical-float-and-clear": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz",
+ "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-logical-overflow": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz",
+ "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-logical-overscroll-behavior": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz",
+ "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-logical-resize": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz",
+ "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-logical-viewport-units": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz",
+ "integrity": "sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-tokenizer": "^3.0.4",
+ "@csstools/utilities": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-media-minmax": {
+ "version": "2.0.9",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz",
+ "integrity": "sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@csstools/css-calc": "^2.1.4",
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4",
+ "@csstools/media-query-list-parser": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz",
+ "integrity": "sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4",
+ "@csstools/media-query-list-parser": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-nested-calc": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz",
+ "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/utilities": "^2.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-normalize-display-values": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.1.tgz",
+ "integrity": "sha512-TQUGBuRvxdc7TgNSTevYqrL8oItxiwPDixk20qCB5me/W8uF7BPbhRrAvFuhEoywQp/woRsUZ6SJ+sU5idZAIA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-oklab-function": {
+ "version": "4.0.12",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz",
+ "integrity": "sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-color-parser": "^3.1.0",
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4",
+ "@csstools/postcss-progressive-custom-properties": "^4.2.1",
+ "@csstools/utilities": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-position-area-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-position-area-property/-/postcss-position-area-property-1.0.0.tgz",
+ "integrity": "sha512-fUP6KR8qV2NuUZV3Cw8itx0Ep90aRjAZxAEzC3vrl6yjFv+pFsQbR18UuQctEKmA72K9O27CoYiKEgXxkqjg8Q==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-progressive-custom-properties": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz",
+ "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-property-rule-prelude-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-property-rule-prelude-list/-/postcss-property-rule-prelude-list-1.0.0.tgz",
+ "integrity": "sha512-IxuQjUXq19fobgmSSvUDO7fVwijDJaZMvWQugxfEUxmjBeDCVaDuMpsZ31MsTm5xbnhA+ElDi0+rQ7sQQGisFA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-random-function": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz",
+ "integrity": "sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-calc": "^2.1.4",
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-relative-color-syntax": {
+ "version": "3.0.12",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.12.tgz",
+ "integrity": "sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-color-parser": "^3.1.0",
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4",
+ "@csstools/postcss-progressive-custom-properties": "^4.2.1",
+ "@csstools/utilities": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-scope-pseudo-class": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz",
+ "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz",
+ "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@csstools/postcss-sign-functions": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz",
+ "integrity": "sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-calc": "^2.1.4",
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-stepped-value-functions": {
+ "version": "4.0.9",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz",
+ "integrity": "sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-calc": "^2.1.4",
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-syntax-descriptor-syntax-production": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-syntax-descriptor-syntax-production/-/postcss-syntax-descriptor-syntax-production-1.0.1.tgz",
+ "integrity": "sha512-GneqQWefjM//f4hJ/Kbox0C6f2T7+pi4/fqTqOFGTL3EjnvOReTqO1qUQ30CaUjkwjYq9qZ41hzarrAxCc4gow==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-tokenizer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-system-ui-font-family": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-system-ui-font-family/-/postcss-system-ui-font-family-1.0.0.tgz",
+ "integrity": "sha512-s3xdBvfWYfoPSBsikDXbuorcMG1nN1M6GdU0qBsGfcmNR0A/qhloQZpTxjA3Xsyrk1VJvwb2pOfiOT3at/DuIQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-text-decoration-shorthand": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.3.tgz",
+ "integrity": "sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/color-helpers": "^5.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-trigonometric-functions": {
+ "version": "4.0.9",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz",
+ "integrity": "sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-calc": "^2.1.4",
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-unset-value": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz",
+ "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/utilities": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz",
+ "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@discoveryjs/json-ext": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
+ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/@docsearch/core": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/@docsearch/core/-/core-4.6.0.tgz",
+ "integrity": "sha512-IqG3oSd529jVRQ4dWZQKwZwQLVd//bWJTz2HiL0LkiHrI4U/vLrBasKB7lwQB/69nBAcCgs3TmudxTZSLH/ZQg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": ">= 16.8.0 < 20.0.0",
+ "react": ">= 16.8.0 < 20.0.0",
+ "react-dom": ">= 16.8.0 < 20.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@docsearch/css": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.6.0.tgz",
+ "integrity": "sha512-YlcAimkXclvqta47g47efzCM5CFxDwv2ClkDfEs/fC/Ak0OxPH2b3czwa4o8O1TRBf+ujFF2RiUwszz2fPVNJQ==",
+ "license": "MIT"
+ },
+ "node_modules/@docsearch/react": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.6.0.tgz",
+ "integrity": "sha512-j8H5B4ArGxBPBWvw3X0J0Rm/Pjv2JDa2rV5OE0DLTp5oiBCptIJ/YlNOhZxuzbO2nwge+o3Z52nJRi3hryK9cA==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/autocomplete-core": "1.19.2",
+ "@docsearch/core": "4.6.0",
+ "@docsearch/css": "4.6.0"
+ },
+ "peerDependencies": {
+ "@types/react": ">= 16.8.0 < 20.0.0",
+ "react": ">= 16.8.0 < 20.0.0",
+ "react-dom": ">= 16.8.0 < 20.0.0",
+ "search-insights": ">= 1 < 3"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ },
+ "search-insights": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@docusaurus/babel": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.9.2.tgz",
+ "integrity": "sha512-GEANdi/SgER+L7Japs25YiGil/AUDnFFHaCGPBbundxoWtCkA2lmy7/tFmgED4y1htAy6Oi4wkJEQdGssnw9MA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.25.9",
+ "@babel/generator": "^7.25.9",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+ "@babel/plugin-transform-runtime": "^7.25.9",
+ "@babel/preset-env": "^7.25.9",
+ "@babel/preset-react": "^7.25.9",
+ "@babel/preset-typescript": "^7.25.9",
+ "@babel/runtime": "^7.25.9",
+ "@babel/runtime-corejs3": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "@docusaurus/logger": "3.9.2",
+ "@docusaurus/utils": "3.9.2",
+ "babel-plugin-dynamic-import-node": "^2.3.3",
+ "fs-extra": "^11.1.1",
+ "tslib": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=20.0"
+ }
+ },
+ "node_modules/@docusaurus/bundler": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.9.2.tgz",
+ "integrity": "sha512-ZOVi6GYgTcsZcUzjblpzk3wH1Fya2VNpd5jtHoCCFcJlMQ1EYXZetfAnRHLcyiFeBABaI1ltTYbOBtH/gahGVA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.25.9",
+ "@docusaurus/babel": "3.9.2",
+ "@docusaurus/cssnano-preset": "3.9.2",
+ "@docusaurus/logger": "3.9.2",
+ "@docusaurus/types": "3.9.2",
+ "@docusaurus/utils": "3.9.2",
+ "babel-loader": "^9.2.1",
+ "clean-css": "^5.3.3",
+ "copy-webpack-plugin": "^11.0.0",
+ "css-loader": "^6.11.0",
+ "css-minimizer-webpack-plugin": "^5.0.1",
+ "cssnano": "^6.1.2",
+ "file-loader": "^6.2.0",
+ "html-minifier-terser": "^7.2.0",
+ "mini-css-extract-plugin": "^2.9.2",
+ "null-loader": "^4.0.1",
+ "postcss": "^8.5.4",
+ "postcss-loader": "^7.3.4",
+ "postcss-preset-env": "^10.2.1",
+ "terser-webpack-plugin": "^5.3.9",
+ "tslib": "^2.6.0",
+ "url-loader": "^4.1.1",
+ "webpack": "^5.95.0",
+ "webpackbar": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=20.0"
+ },
+ "peerDependencies": {
+ "@docusaurus/faster": "*"
+ },
+ "peerDependenciesMeta": {
+ "@docusaurus/faster": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@docusaurus/core": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.9.2.tgz",
+ "integrity": "sha512-HbjwKeC+pHUFBfLMNzuSjqFE/58+rLVKmOU3lxQrpsxLBOGosYco/Q0GduBb0/jEMRiyEqjNT/01rRdOMWq5pw==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/babel": "3.9.2",
+ "@docusaurus/bundler": "3.9.2",
+ "@docusaurus/logger": "3.9.2",
+ "@docusaurus/mdx-loader": "3.9.2",
+ "@docusaurus/utils": "3.9.2",
+ "@docusaurus/utils-common": "3.9.2",
+ "@docusaurus/utils-validation": "3.9.2",
+ "boxen": "^6.2.1",
+ "chalk": "^4.1.2",
+ "chokidar": "^3.5.3",
+ "cli-table3": "^0.6.3",
+ "combine-promises": "^1.1.0",
+ "commander": "^5.1.0",
+ "core-js": "^3.31.1",
+ "detect-port": "^1.5.1",
+ "escape-html": "^1.0.3",
+ "eta": "^2.2.0",
+ "eval": "^0.1.8",
+ "execa": "5.1.1",
+ "fs-extra": "^11.1.1",
+ "html-tags": "^3.3.1",
+ "html-webpack-plugin": "^5.6.0",
+ "leven": "^3.1.0",
+ "lodash": "^4.17.21",
+ "open": "^8.4.0",
+ "p-map": "^4.0.0",
+ "prompts": "^2.4.2",
+ "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0",
+ "react-loadable": "npm:@docusaurus/react-loadable@6.0.0",
+ "react-loadable-ssr-addon-v5-slorber": "^1.0.1",
+ "react-router": "^5.3.4",
+ "react-router-config": "^5.1.1",
+ "react-router-dom": "^5.3.4",
+ "semver": "^7.5.4",
+ "serve-handler": "^6.1.6",
+ "tinypool": "^1.0.2",
+ "tslib": "^2.6.0",
+ "update-notifier": "^6.0.2",
+ "webpack": "^5.95.0",
+ "webpack-bundle-analyzer": "^4.10.2",
+ "webpack-dev-server": "^5.2.2",
+ "webpack-merge": "^6.0.1"
+ },
+ "bin": {
+ "docusaurus": "bin/docusaurus.mjs"
+ },
+ "engines": {
+ "node": ">=20.0"
+ },
+ "peerDependencies": {
+ "@mdx-js/react": "^3.0.0",
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/cssnano-preset": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.9.2.tgz",
+ "integrity": "sha512-8gBKup94aGttRduABsj7bpPFTX7kbwu+xh3K9NMCF5K4bWBqTFYW+REKHF6iBVDHRJ4grZdIPbvkiHd/XNKRMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "cssnano-preset-advanced": "^6.1.2",
+ "postcss": "^8.5.4",
+ "postcss-sort-media-queries": "^5.2.0",
+ "tslib": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=20.0"
+ }
+ },
+ "node_modules/@docusaurus/logger": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.9.2.tgz",
+ "integrity": "sha512-/SVCc57ByARzGSU60c50rMyQlBuMIJCjcsJlkphxY6B0GV4UH3tcA1994N8fFfbJ9kX3jIBe/xg3XP5qBtGDbA==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.1.2",
+ "tslib": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=20.0"
+ }
+ },
+ "node_modules/@docusaurus/mdx-loader": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.9.2.tgz",
+ "integrity": "sha512-wiYoGwF9gdd6rev62xDU8AAM8JuLI/hlwOtCzMmYcspEkzecKrP8J8X+KpYnTlACBUUtXNJpSoCwFWJhLRevzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/logger": "3.9.2",
+ "@docusaurus/utils": "3.9.2",
+ "@docusaurus/utils-validation": "3.9.2",
+ "@mdx-js/mdx": "^3.0.0",
+ "@slorber/remark-comment": "^1.0.0",
+ "escape-html": "^1.0.3",
+ "estree-util-value-to-estree": "^3.0.1",
+ "file-loader": "^6.2.0",
+ "fs-extra": "^11.1.1",
+ "image-size": "^2.0.2",
+ "mdast-util-mdx": "^3.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "rehype-raw": "^7.0.0",
+ "remark-directive": "^3.0.0",
+ "remark-emoji": "^4.0.0",
+ "remark-frontmatter": "^5.0.0",
+ "remark-gfm": "^4.0.0",
+ "stringify-object": "^3.3.0",
+ "tslib": "^2.6.0",
+ "unified": "^11.0.3",
+ "unist-util-visit": "^5.0.0",
+ "url-loader": "^4.1.1",
+ "vfile": "^6.0.1",
+ "webpack": "^5.88.1"
+ },
+ "engines": {
+ "node": ">=20.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/module-type-aliases": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.9.2.tgz",
+ "integrity": "sha512-8qVe2QA9hVLzvnxP46ysuofJUIc/yYQ82tvA/rBTrnpXtCjNSFLxEZfd5U8cYZuJIVlkPxamsIgwd5tGZXfvew==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/types": "3.9.2",
+ "@types/history": "^4.7.11",
+ "@types/react": "*",
+ "@types/react-router-config": "*",
+ "@types/react-router-dom": "*",
+ "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0",
+ "react-loadable": "npm:@docusaurus/react-loadable@6.0.0"
+ },
+ "peerDependencies": {
+ "react": "*",
+ "react-dom": "*"
+ }
+ },
+ "node_modules/@docusaurus/plugin-content-blog": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.9.2.tgz",
+ "integrity": "sha512-3I2HXy3L1QcjLJLGAoTvoBnpOwa6DPUa3Q0dMK19UTY9mhPkKQg/DYhAGTiBUKcTR0f08iw7kLPqOhIgdV3eVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/core": "3.9.2",
+ "@docusaurus/logger": "3.9.2",
+ "@docusaurus/mdx-loader": "3.9.2",
+ "@docusaurus/theme-common": "3.9.2",
+ "@docusaurus/types": "3.9.2",
+ "@docusaurus/utils": "3.9.2",
+ "@docusaurus/utils-common": "3.9.2",
+ "@docusaurus/utils-validation": "3.9.2",
+ "cheerio": "1.0.0-rc.12",
+ "feed": "^4.2.2",
+ "fs-extra": "^11.1.1",
+ "lodash": "^4.17.21",
+ "schema-dts": "^1.1.2",
+ "srcset": "^4.0.0",
+ "tslib": "^2.6.0",
+ "unist-util-visit": "^5.0.0",
+ "utility-types": "^3.10.0",
+ "webpack": "^5.88.1"
+ },
+ "engines": {
+ "node": ">=20.0"
+ },
+ "peerDependencies": {
+ "@docusaurus/plugin-content-docs": "*",
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/plugin-content-docs": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz",
+ "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/core": "3.9.2",
+ "@docusaurus/logger": "3.9.2",
+ "@docusaurus/mdx-loader": "3.9.2",
+ "@docusaurus/module-type-aliases": "3.9.2",
+ "@docusaurus/theme-common": "3.9.2",
+ "@docusaurus/types": "3.9.2",
+ "@docusaurus/utils": "3.9.2",
+ "@docusaurus/utils-common": "3.9.2",
+ "@docusaurus/utils-validation": "3.9.2",
+ "@types/react-router-config": "^5.0.7",
+ "combine-promises": "^1.1.0",
+ "fs-extra": "^11.1.1",
+ "js-yaml": "^4.1.0",
+ "lodash": "^4.17.21",
+ "schema-dts": "^1.1.2",
+ "tslib": "^2.6.0",
+ "utility-types": "^3.10.0",
+ "webpack": "^5.88.1"
+ },
+ "engines": {
+ "node": ">=20.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/plugin-content-pages": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.9.2.tgz",
+ "integrity": "sha512-s4849w/p4noXUrGpPUF0BPqIAfdAe76BLaRGAGKZ1gTDNiGxGcpsLcwJ9OTi1/V8A+AzvsmI9pkjie2zjIQZKA==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/core": "3.9.2",
+ "@docusaurus/mdx-loader": "3.9.2",
+ "@docusaurus/types": "3.9.2",
+ "@docusaurus/utils": "3.9.2",
+ "@docusaurus/utils-validation": "3.9.2",
+ "fs-extra": "^11.1.1",
+ "tslib": "^2.6.0",
+ "webpack": "^5.88.1"
+ },
+ "engines": {
+ "node": ">=20.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/plugin-css-cascade-layers": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.9.2.tgz",
+ "integrity": "sha512-w1s3+Ss+eOQbscGM4cfIFBlVg/QKxyYgj26k5AnakuHkKxH6004ZtuLe5awMBotIYF2bbGDoDhpgQ4r/kcj4rQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/core": "3.9.2",
+ "@docusaurus/types": "3.9.2",
+ "@docusaurus/utils": "3.9.2",
+ "@docusaurus/utils-validation": "3.9.2",
+ "tslib": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=20.0"
+ }
+ },
+ "node_modules/@docusaurus/plugin-debug": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.9.2.tgz",
+ "integrity": "sha512-j7a5hWuAFxyQAkilZwhsQ/b3T7FfHZ+0dub6j/GxKNFJp2h9qk/P1Bp7vrGASnvA9KNQBBL1ZXTe7jlh4VdPdA==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/core": "3.9.2",
+ "@docusaurus/types": "3.9.2",
+ "@docusaurus/utils": "3.9.2",
+ "fs-extra": "^11.1.1",
+ "react-json-view-lite": "^2.3.0",
+ "tslib": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=20.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/plugin-google-analytics": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.9.2.tgz",
+ "integrity": "sha512-mAwwQJ1Us9jL/lVjXtErXto4p4/iaLlweC54yDUK1a97WfkC6Z2k5/769JsFgwOwOP+n5mUQGACXOEQ0XDuVUw==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/core": "3.9.2",
+ "@docusaurus/types": "3.9.2",
+ "@docusaurus/utils-validation": "3.9.2",
+ "tslib": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=20.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/plugin-google-gtag": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.9.2.tgz",
+ "integrity": "sha512-YJ4lDCphabBtw19ooSlc1MnxtYGpjFV9rEdzjLsUnBCeis2djUyCozZaFhCg6NGEwOn7HDDyMh0yzcdRpnuIvA==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/core": "3.9.2",
+ "@docusaurus/types": "3.9.2",
+ "@docusaurus/utils-validation": "3.9.2",
+ "@types/gtag.js": "^0.0.12",
+ "tslib": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=20.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/plugin-google-tag-manager": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.9.2.tgz",
+ "integrity": "sha512-LJtIrkZN/tuHD8NqDAW1Tnw0ekOwRTfobWPsdO15YxcicBo2ykKF0/D6n0vVBfd3srwr9Z6rzrIWYrMzBGrvNw==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/core": "3.9.2",
+ "@docusaurus/types": "3.9.2",
+ "@docusaurus/utils-validation": "3.9.2",
+ "tslib": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=20.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/plugin-sitemap": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.9.2.tgz",
+ "integrity": "sha512-WLh7ymgDXjG8oPoM/T4/zUP7KcSuFYRZAUTl8vR6VzYkfc18GBM4xLhcT+AKOwun6kBivYKUJf+vlqYJkm+RHw==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/core": "3.9.2",
+ "@docusaurus/logger": "3.9.2",
+ "@docusaurus/types": "3.9.2",
+ "@docusaurus/utils": "3.9.2",
+ "@docusaurus/utils-common": "3.9.2",
+ "@docusaurus/utils-validation": "3.9.2",
+ "fs-extra": "^11.1.1",
+ "sitemap": "^7.1.1",
+ "tslib": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=20.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/plugin-svgr": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.9.2.tgz",
+ "integrity": "sha512-n+1DE+5b3Lnf27TgVU5jM1d4x5tUh2oW5LTsBxJX4PsAPV0JGcmI6p3yLYtEY0LRVEIJh+8RsdQmRE66wSV8mw==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/core": "3.9.2",
+ "@docusaurus/types": "3.9.2",
+ "@docusaurus/utils": "3.9.2",
+ "@docusaurus/utils-validation": "3.9.2",
+ "@svgr/core": "8.1.0",
+ "@svgr/webpack": "^8.1.0",
+ "tslib": "^2.6.0",
+ "webpack": "^5.88.1"
+ },
+ "engines": {
+ "node": ">=20.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/preset-classic": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.9.2.tgz",
+ "integrity": "sha512-IgyYO2Gvaigi21LuDIe+nvmN/dfGXAiMcV/murFqcpjnZc7jxFAxW+9LEjdPt61uZLxG4ByW/oUmX/DDK9t/8w==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/core": "3.9.2",
+ "@docusaurus/plugin-content-blog": "3.9.2",
+ "@docusaurus/plugin-content-docs": "3.9.2",
+ "@docusaurus/plugin-content-pages": "3.9.2",
+ "@docusaurus/plugin-css-cascade-layers": "3.9.2",
+ "@docusaurus/plugin-debug": "3.9.2",
+ "@docusaurus/plugin-google-analytics": "3.9.2",
+ "@docusaurus/plugin-google-gtag": "3.9.2",
+ "@docusaurus/plugin-google-tag-manager": "3.9.2",
+ "@docusaurus/plugin-sitemap": "3.9.2",
+ "@docusaurus/plugin-svgr": "3.9.2",
+ "@docusaurus/theme-classic": "3.9.2",
+ "@docusaurus/theme-common": "3.9.2",
+ "@docusaurus/theme-search-algolia": "3.9.2",
+ "@docusaurus/types": "3.9.2"
+ },
+ "engines": {
+ "node": ">=20.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/theme-classic": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.9.2.tgz",
+ "integrity": "sha512-IGUsArG5hhekXd7RDb11v94ycpJpFdJPkLnt10fFQWOVxAtq5/D7hT6lzc2fhyQKaaCE62qVajOMKL7OiAFAIA==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/core": "3.9.2",
+ "@docusaurus/logger": "3.9.2",
+ "@docusaurus/mdx-loader": "3.9.2",
+ "@docusaurus/module-type-aliases": "3.9.2",
+ "@docusaurus/plugin-content-blog": "3.9.2",
+ "@docusaurus/plugin-content-docs": "3.9.2",
+ "@docusaurus/plugin-content-pages": "3.9.2",
+ "@docusaurus/theme-common": "3.9.2",
+ "@docusaurus/theme-translations": "3.9.2",
+ "@docusaurus/types": "3.9.2",
+ "@docusaurus/utils": "3.9.2",
+ "@docusaurus/utils-common": "3.9.2",
+ "@docusaurus/utils-validation": "3.9.2",
+ "@mdx-js/react": "^3.0.0",
+ "clsx": "^2.0.0",
+ "infima": "0.2.0-alpha.45",
+ "lodash": "^4.17.21",
+ "nprogress": "^0.2.0",
+ "postcss": "^8.5.4",
+ "prism-react-renderer": "^2.3.0",
+ "prismjs": "^1.29.0",
+ "react-router-dom": "^5.3.4",
+ "rtlcss": "^4.1.0",
+ "tslib": "^2.6.0",
+ "utility-types": "^3.10.0"
+ },
+ "engines": {
+ "node": ">=20.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/theme-common": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.9.2.tgz",
+ "integrity": "sha512-6c4DAbR6n6nPbnZhY2V3tzpnKnGL+6aOsLvFL26VRqhlczli9eWG0VDUNoCQEPnGwDMhPS42UhSAnz5pThm5Ag==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/mdx-loader": "3.9.2",
+ "@docusaurus/module-type-aliases": "3.9.2",
+ "@docusaurus/utils": "3.9.2",
+ "@docusaurus/utils-common": "3.9.2",
+ "@types/history": "^4.7.11",
+ "@types/react": "*",
+ "@types/react-router-config": "*",
+ "clsx": "^2.0.0",
+ "parse-numeric-range": "^1.3.0",
+ "prism-react-renderer": "^2.3.0",
+ "tslib": "^2.6.0",
+ "utility-types": "^3.10.0"
+ },
+ "engines": {
+ "node": ">=20.0"
+ },
+ "peerDependencies": {
+ "@docusaurus/plugin-content-docs": "*",
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/theme-mermaid": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.9.2.tgz",
+ "integrity": "sha512-5vhShRDq/ntLzdInsQkTdoKWSzw8d1jB17sNPYhA/KvYYFXfuVEGHLM6nrf8MFbV8TruAHDG21Fn3W4lO8GaDw==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/core": "3.9.2",
+ "@docusaurus/module-type-aliases": "3.9.2",
+ "@docusaurus/theme-common": "3.9.2",
+ "@docusaurus/types": "3.9.2",
+ "@docusaurus/utils-validation": "3.9.2",
+ "mermaid": ">=11.6.0",
+ "tslib": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=20.0"
+ },
+ "peerDependencies": {
+ "@mermaid-js/layout-elk": "^0.1.9",
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@mermaid-js/layout-elk": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@docusaurus/theme-search-algolia": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.9.2.tgz",
+ "integrity": "sha512-GBDSFNwjnh5/LdkxCKQHkgO2pIMX1447BxYUBG2wBiajS21uj64a+gH/qlbQjDLxmGrbrllBrtJkUHxIsiwRnw==",
+ "license": "MIT",
+ "dependencies": {
+ "@docsearch/react": "^3.9.0 || ^4.1.0",
+ "@docusaurus/core": "3.9.2",
+ "@docusaurus/logger": "3.9.2",
+ "@docusaurus/plugin-content-docs": "3.9.2",
+ "@docusaurus/theme-common": "3.9.2",
+ "@docusaurus/theme-translations": "3.9.2",
+ "@docusaurus/utils": "3.9.2",
+ "@docusaurus/utils-validation": "3.9.2",
+ "algoliasearch": "^5.37.0",
+ "algoliasearch-helper": "^3.26.0",
+ "clsx": "^2.0.0",
+ "eta": "^2.2.0",
+ "fs-extra": "^11.1.1",
+ "lodash": "^4.17.21",
+ "tslib": "^2.6.0",
+ "utility-types": "^3.10.0"
+ },
+ "engines": {
+ "node": ">=20.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/theme-translations": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.9.2.tgz",
+ "integrity": "sha512-vIryvpP18ON9T9rjgMRFLr2xJVDpw1rtagEGf8Ccce4CkTrvM/fRB8N2nyWYOW5u3DdjkwKw5fBa+3tbn9P4PA==",
+ "license": "MIT",
+ "dependencies": {
+ "fs-extra": "^11.1.1",
+ "tslib": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=20.0"
+ }
+ },
+ "node_modules/@docusaurus/tsconfig": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@docusaurus/tsconfig/-/tsconfig-3.9.2.tgz",
+ "integrity": "sha512-j6/Fp4Rlpxsc632cnRnl5HpOWeb6ZKssDj6/XzzAzVGXXfm9Eptx3rxCC+fDzySn9fHTS+CWJjPineCR1bB5WQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@docusaurus/types": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.2.tgz",
+ "integrity": "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@mdx-js/mdx": "^3.0.0",
+ "@types/history": "^4.7.11",
+ "@types/mdast": "^4.0.2",
+ "@types/react": "*",
+ "commander": "^5.1.0",
+ "joi": "^17.9.2",
+ "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0",
+ "utility-types": "^3.10.0",
+ "webpack": "^5.95.0",
+ "webpack-merge": "^5.9.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/types/node_modules/webpack-merge": {
+ "version": "5.10.0",
+ "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz",
+ "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==",
+ "license": "MIT",
+ "dependencies": {
+ "clone-deep": "^4.0.1",
+ "flat": "^5.0.2",
+ "wildcard": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/@docusaurus/utils": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.9.2.tgz",
+ "integrity": "sha512-lBSBiRruFurFKXr5Hbsl2thmGweAPmddhF3jb99U4EMDA5L+e5Y1rAkOS07Nvrup7HUMBDrCV45meaxZnt28nQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/logger": "3.9.2",
+ "@docusaurus/types": "3.9.2",
+ "@docusaurus/utils-common": "3.9.2",
+ "escape-string-regexp": "^4.0.0",
+ "execa": "5.1.1",
+ "file-loader": "^6.2.0",
+ "fs-extra": "^11.1.1",
+ "github-slugger": "^1.5.0",
+ "globby": "^11.1.0",
+ "gray-matter": "^4.0.3",
+ "jiti": "^1.20.0",
+ "js-yaml": "^4.1.0",
+ "lodash": "^4.17.21",
+ "micromatch": "^4.0.5",
+ "p-queue": "^6.6.2",
+ "prompts": "^2.4.2",
+ "resolve-pathname": "^3.0.0",
+ "tslib": "^2.6.0",
+ "url-loader": "^4.1.1",
+ "utility-types": "^3.10.0",
+ "webpack": "^5.88.1"
+ },
+ "engines": {
+ "node": ">=20.0"
+ }
+ },
+ "node_modules/@docusaurus/utils-common": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.9.2.tgz",
+ "integrity": "sha512-I53UC1QctruA6SWLvbjbhCpAw7+X7PePoe5pYcwTOEXD/PxeP8LnECAhTHHwWCblyUX5bMi4QLRkxvyZ+IT8Aw==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/types": "3.9.2",
+ "tslib": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=20.0"
+ }
+ },
+ "node_modules/@docusaurus/utils-validation": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.9.2.tgz",
+ "integrity": "sha512-l7yk3X5VnNmATbwijJkexdhulNsQaNDwoagiwujXoxFbWLcxHQqNQ+c/IAlzrfMMOfa/8xSBZ7KEKDesE/2J7A==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/logger": "3.9.2",
+ "@docusaurus/utils": "3.9.2",
+ "@docusaurus/utils-common": "3.9.2",
+ "fs-extra": "^11.2.0",
+ "joi": "^17.9.2",
+ "js-yaml": "^4.1.0",
+ "lodash": "^4.17.21",
+ "tslib": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=20.0"
+ }
+ },
+ "node_modules/@easyops-cn/autocomplete.js": {
+ "version": "0.38.1",
+ "resolved": "https://registry.npmjs.org/@easyops-cn/autocomplete.js/-/autocomplete.js-0.38.1.tgz",
+ "integrity": "sha512-drg76jS6syilOUmVNkyo1c7ZEBPcPuK+aJA7AksM5ZIIbV57DMHCywiCr+uHyv8BE5jUTU98j/H7gVrkHrWW3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "immediate": "^3.2.3"
+ }
+ },
+ "node_modules/@easyops-cn/docusaurus-search-local": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@easyops-cn/docusaurus-search-local/-/docusaurus-search-local-0.55.0.tgz",
+ "integrity": "sha512-pmyG+e9KZmo4wrufsneeoE2KG2zH9tbRGi0crJFY0kPxOTGSLeuU5w058Qzgpz8vZNui6i59lKjrlQtnXNBgog==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/plugin-content-docs": "^2 || ^3",
+ "@docusaurus/theme-translations": "^2 || ^3",
+ "@docusaurus/utils": "^2 || ^3",
+ "@docusaurus/utils-common": "^2 || ^3",
+ "@docusaurus/utils-validation": "^2 || ^3",
+ "@easyops-cn/autocomplete.js": "^0.38.1",
+ "@node-rs/jieba": "^1.6.0",
+ "cheerio": "^1.0.0",
+ "clsx": "^2.1.1",
+ "comlink": "^4.4.2",
+ "debug": "^4.2.0",
+ "fs-extra": "^10.0.0",
+ "klaw-sync": "^6.0.0",
+ "lunr": "^2.3.9",
+ "lunr-languages": "^1.4.0",
+ "mark.js": "^8.11.1",
+ "tslib": "^2.4.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "peerDependencies": {
+ "@docusaurus/theme-common": "^2 || ^3",
+ "open-ask-ai": "^0.7.3",
+ "react": "^16.14.0 || ^17 || ^18 || ^19",
+ "react-dom": "^16.14.0 || 17 || ^18 || ^19"
+ },
+ "peerDependenciesMeta": {
+ "open-ask-ai": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@easyops-cn/docusaurus-search-local/node_modules/cheerio": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz",
+ "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==",
+ "license": "MIT",
+ "dependencies": {
+ "cheerio-select": "^2.1.0",
+ "dom-serializer": "^2.0.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.2.2",
+ "encoding-sniffer": "^0.2.1",
+ "htmlparser2": "^10.1.0",
+ "parse5": "^7.3.0",
+ "parse5-htmlparser2-tree-adapter": "^7.1.0",
+ "parse5-parser-stream": "^7.1.2",
+ "undici": "^7.19.0",
+ "whatwg-mimetype": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=20.18.1"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
+ }
+ },
+ "node_modules/@easyops-cn/docusaurus-search-local/node_modules/entities": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz",
+ "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/@easyops-cn/docusaurus-search-local/node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@easyops-cn/docusaurus-search-local/node_modules/htmlparser2": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz",
+ "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==",
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.2.2",
+ "entities": "^7.0.1"
+ }
+ },
+ "node_modules/@emnapi/core": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz",
+ "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/wasi-threads": "1.1.0",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/runtime": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz",
+ "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/wasi-threads": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz",
+ "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@hapi/hoek": {
+ "version": "9.3.0",
+ "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
+ "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@hapi/topo": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz",
+ "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@hapi/hoek": "^9.0.0"
+ }
+ },
+ "node_modules/@iconify/types": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",
+ "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==",
+ "license": "MIT"
+ },
+ "node_modules/@iconify/utils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.0.tgz",
+ "integrity": "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==",
+ "license": "MIT",
+ "dependencies": {
+ "@antfu/install-pkg": "^1.1.0",
+ "@iconify/types": "^2.0.0",
+ "mlly": "^1.8.0"
+ }
+ },
+ "node_modules/@jest/schemas": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
+ "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
+ "license": "MIT",
+ "dependencies": {
+ "@sinclair/typebox": "^0.27.8"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/types": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
+ "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^17.0.8",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.11",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz",
+ "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@jsonjoy.com/base64": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz",
+ "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@jsonjoy.com/buffers": {
+ "version": "17.67.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-17.67.0.tgz",
+ "integrity": "sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@jsonjoy.com/codegen": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz",
+ "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@jsonjoy.com/fs-core": {
+ "version": "4.56.10",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.56.10.tgz",
+ "integrity": "sha512-PyAEA/3cnHhsGcdY+AmIU+ZPqTuZkDhCXQ2wkXypdLitSpd6d5Ivxhnq4wa2ETRWFVJGabYynBWxIijOswSmOw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jsonjoy.com/fs-node-builtins": "4.56.10",
+ "@jsonjoy.com/fs-node-utils": "4.56.10",
+ "thingies": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@jsonjoy.com/fs-fsa": {
+ "version": "4.56.10",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.56.10.tgz",
+ "integrity": "sha512-/FVK63ysNzTPOnCCcPoPHt77TOmachdMS422txM4KhxddLdbW1fIbFMYH0AM0ow/YchCyS5gqEjKLNyv71j/5Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jsonjoy.com/fs-core": "4.56.10",
+ "@jsonjoy.com/fs-node-builtins": "4.56.10",
+ "@jsonjoy.com/fs-node-utils": "4.56.10",
+ "thingies": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@jsonjoy.com/fs-node": {
+ "version": "4.56.10",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.56.10.tgz",
+ "integrity": "sha512-7R4Gv3tkUdW3dXfXiOkqxkElxKNVdd8BDOWC0/dbERd0pXpPY+s2s1Mino+aTvkGrFPiY+mmVxA7zhskm4Ue4Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jsonjoy.com/fs-core": "4.56.10",
+ "@jsonjoy.com/fs-node-builtins": "4.56.10",
+ "@jsonjoy.com/fs-node-utils": "4.56.10",
+ "@jsonjoy.com/fs-print": "4.56.10",
+ "@jsonjoy.com/fs-snapshot": "4.56.10",
+ "glob-to-regex.js": "^1.0.0",
+ "thingies": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@jsonjoy.com/fs-node-builtins": {
+ "version": "4.56.10",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.56.10.tgz",
+ "integrity": "sha512-uUnKz8R0YJyKq5jXpZtkGV9U0pJDt8hmYcLRrPjROheIfjMXsz82kXMgAA/qNg0wrZ1Kv+hrg7azqEZx6XZCVw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@jsonjoy.com/fs-node-to-fsa": {
+ "version": "4.56.10",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.56.10.tgz",
+ "integrity": "sha512-oH+O6Y4lhn9NyG6aEoFwIBNKZeYy66toP5LJcDOMBgL99BKQMUf/zWJspdRhMdn/3hbzQsZ8EHHsuekbFLGUWw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jsonjoy.com/fs-fsa": "4.56.10",
+ "@jsonjoy.com/fs-node-builtins": "4.56.10",
+ "@jsonjoy.com/fs-node-utils": "4.56.10"
+ },
+ "engines": {
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@jsonjoy.com/fs-node-utils": {
+ "version": "4.56.10",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.56.10.tgz",
+ "integrity": "sha512-8EuPBgVI2aDPwFdaNQeNpHsyqPi3rr+85tMNG/lHvQLiVjzoZsvxA//Xd8aB567LUhy4QS03ptT+unkD/DIsNg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jsonjoy.com/fs-node-builtins": "4.56.10"
+ },
+ "engines": {
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@jsonjoy.com/fs-print": {
+ "version": "4.56.10",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.56.10.tgz",
+ "integrity": "sha512-JW4fp5mAYepzFsSGrQ48ep8FXxpg4niFWHdF78wDrFGof7F3tKDJln72QFDEn/27M1yHd4v7sKHHVPh78aWcEw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jsonjoy.com/fs-node-utils": "4.56.10",
+ "tree-dump": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@jsonjoy.com/fs-snapshot": {
+ "version": "4.56.10",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.56.10.tgz",
+ "integrity": "sha512-DkR6l5fj7+qj0+fVKm/OOXMGfDFCGXLfyHkORH3DF8hxkpDgIHbhf/DwncBMs2igu/ST7OEkexn1gIqoU6Y+9g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jsonjoy.com/buffers": "^17.65.0",
+ "@jsonjoy.com/fs-node-utils": "4.56.10",
+ "@jsonjoy.com/json-pack": "^17.65.0",
+ "@jsonjoy.com/util": "^17.65.0"
+ },
+ "engines": {
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/base64": {
+ "version": "17.67.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-17.67.0.tgz",
+ "integrity": "sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/codegen": {
+ "version": "17.67.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-17.67.0.tgz",
+ "integrity": "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pack": {
+ "version": "17.67.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-17.67.0.tgz",
+ "integrity": "sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jsonjoy.com/base64": "17.67.0",
+ "@jsonjoy.com/buffers": "17.67.0",
+ "@jsonjoy.com/codegen": "17.67.0",
+ "@jsonjoy.com/json-pointer": "17.67.0",
+ "@jsonjoy.com/util": "17.67.0",
+ "hyperdyperid": "^1.2.0",
+ "thingies": "^2.5.0",
+ "tree-dump": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pointer": {
+ "version": "17.67.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-17.67.0.tgz",
+ "integrity": "sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jsonjoy.com/util": "17.67.0"
+ },
+ "engines": {
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/util": {
+ "version": "17.67.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-17.67.0.tgz",
+ "integrity": "sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jsonjoy.com/buffers": "17.67.0",
+ "@jsonjoy.com/codegen": "17.67.0"
+ },
+ "engines": {
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@jsonjoy.com/json-pack": {
+ "version": "1.21.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz",
+ "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jsonjoy.com/base64": "^1.1.2",
+ "@jsonjoy.com/buffers": "^1.2.0",
+ "@jsonjoy.com/codegen": "^1.0.0",
+ "@jsonjoy.com/json-pointer": "^1.0.2",
+ "@jsonjoy.com/util": "^1.9.0",
+ "hyperdyperid": "^1.2.0",
+ "thingies": "^2.5.0",
+ "tree-dump": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@jsonjoy.com/json-pack/node_modules/@jsonjoy.com/buffers": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz",
+ "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@jsonjoy.com/json-pointer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz",
+ "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jsonjoy.com/codegen": "^1.0.0",
+ "@jsonjoy.com/util": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@jsonjoy.com/util": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz",
+ "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jsonjoy.com/buffers": "^1.0.0",
+ "@jsonjoy.com/codegen": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@jsonjoy.com/util/node_modules/@jsonjoy.com/buffers": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz",
+ "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@leichtgewicht/ip-codec": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz",
+ "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==",
+ "license": "MIT"
+ },
+ "node_modules/@mdx-js/mdx": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz",
+ "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdx": "^2.0.0",
+ "acorn": "^8.0.0",
+ "collapse-white-space": "^2.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "estree-util-scope": "^1.0.0",
+ "estree-walker": "^3.0.0",
+ "hast-util-to-jsx-runtime": "^2.0.0",
+ "markdown-extensions": "^2.0.0",
+ "recma-build-jsx": "^1.0.0",
+ "recma-jsx": "^1.0.0",
+ "recma-stringify": "^1.0.0",
+ "rehype-recma": "^1.0.0",
+ "remark-mdx": "^3.0.0",
+ "remark-parse": "^11.0.0",
+ "remark-rehype": "^11.0.0",
+ "source-map": "^0.7.0",
+ "unified": "^11.0.0",
+ "unist-util-position-from-estree": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/@mdx-js/react": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz",
+ "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdx": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16",
+ "react": ">=16"
+ }
+ },
+ "node_modules/@mermaid-js/parser": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.0.0.tgz",
+ "integrity": "sha512-vvK0Hi/VWndxoh03Mmz6wa1KDriSPjS2XMZL/1l19HFwygiObEEoEwSDxOqyLzzAI6J2PU3261JjTMTO7x+BPw==",
+ "license": "MIT",
+ "dependencies": {
+ "langium": "^4.0.0"
+ }
+ },
+ "node_modules/@napi-rs/wasm-runtime": {
+ "version": "0.2.12",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz",
+ "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "^1.4.3",
+ "@emnapi/runtime": "^1.4.3",
+ "@tybys/wasm-util": "^0.10.0"
+ }
+ },
+ "node_modules/@noble/hashes": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz",
+ "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@node-rs/jieba": {
+ "version": "1.10.4",
+ "resolved": "https://registry.npmjs.org/@node-rs/jieba/-/jieba-1.10.4.tgz",
+ "integrity": "sha512-GvDgi8MnBiyWd6tksojej8anIx18244NmIOc1ovEw8WKNUejcccLfyu8vj66LWSuoZuKILVtNsOy4jvg3aoxIw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ },
+ "optionalDependencies": {
+ "@node-rs/jieba-android-arm-eabi": "1.10.4",
+ "@node-rs/jieba-android-arm64": "1.10.4",
+ "@node-rs/jieba-darwin-arm64": "1.10.4",
+ "@node-rs/jieba-darwin-x64": "1.10.4",
+ "@node-rs/jieba-freebsd-x64": "1.10.4",
+ "@node-rs/jieba-linux-arm-gnueabihf": "1.10.4",
+ "@node-rs/jieba-linux-arm64-gnu": "1.10.4",
+ "@node-rs/jieba-linux-arm64-musl": "1.10.4",
+ "@node-rs/jieba-linux-x64-gnu": "1.10.4",
+ "@node-rs/jieba-linux-x64-musl": "1.10.4",
+ "@node-rs/jieba-wasm32-wasi": "1.10.4",
+ "@node-rs/jieba-win32-arm64-msvc": "1.10.4",
+ "@node-rs/jieba-win32-ia32-msvc": "1.10.4",
+ "@node-rs/jieba-win32-x64-msvc": "1.10.4"
+ }
+ },
+ "node_modules/@node-rs/jieba-android-arm-eabi": {
+ "version": "1.10.4",
+ "resolved": "https://registry.npmjs.org/@node-rs/jieba-android-arm-eabi/-/jieba-android-arm-eabi-1.10.4.tgz",
+ "integrity": "sha512-MhyvW5N3Fwcp385d0rxbCWH42kqDBatQTyP8XbnYbju2+0BO/eTeCCLYj7Agws4pwxn2LtdldXRSKavT7WdzNA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/jieba-android-arm64": {
+ "version": "1.10.4",
+ "resolved": "https://registry.npmjs.org/@node-rs/jieba-android-arm64/-/jieba-android-arm64-1.10.4.tgz",
+ "integrity": "sha512-XyDwq5+rQ+Tk55A+FGi6PtJbzf974oqnpyCcCPzwU3QVXJCa2Rr4Lci+fx8oOpU4plT3GuD+chXMYLsXipMgJA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/jieba-darwin-arm64": {
+ "version": "1.10.4",
+ "resolved": "https://registry.npmjs.org/@node-rs/jieba-darwin-arm64/-/jieba-darwin-arm64-1.10.4.tgz",
+ "integrity": "sha512-G++RYEJ2jo0rxF9626KUy90wp06TRUjAsvY/BrIzEOX/ingQYV/HjwQzNPRR1P1o32a6/U8RGo7zEBhfdybL6w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/jieba-darwin-x64": {
+ "version": "1.10.4",
+ "resolved": "https://registry.npmjs.org/@node-rs/jieba-darwin-x64/-/jieba-darwin-x64-1.10.4.tgz",
+ "integrity": "sha512-MmDNeOb2TXIZCPyWCi2upQnZpPjAxw5ZGEj6R8kNsPXVFALHIKMa6ZZ15LCOkSTsKXVC17j2t4h+hSuyYb6qfQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/jieba-freebsd-x64": {
+ "version": "1.10.4",
+ "resolved": "https://registry.npmjs.org/@node-rs/jieba-freebsd-x64/-/jieba-freebsd-x64-1.10.4.tgz",
+ "integrity": "sha512-/x7aVQ8nqUWhpXU92RZqd333cq639i/olNpd9Z5hdlyyV5/B65LLy+Je2B2bfs62PVVm5QXRpeBcZqaHelp/bg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/jieba-linux-arm-gnueabihf": {
+ "version": "1.10.4",
+ "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm-gnueabihf/-/jieba-linux-arm-gnueabihf-1.10.4.tgz",
+ "integrity": "sha512-crd2M35oJBRLkoESs0O6QO3BBbhpv+tqXuKsqhIG94B1d02RVxtRIvSDwO33QurxqSdvN9IeSnVpHbDGkuXm3g==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/jieba-linux-arm64-gnu": {
+ "version": "1.10.4",
+ "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm64-gnu/-/jieba-linux-arm64-gnu-1.10.4.tgz",
+ "integrity": "sha512-omIzNX1psUzPcsdnUhGU6oHeOaTCuCjUgOA/v/DGkvWC1jLcnfXe4vdYbtXMh4XOCuIgS1UCcvZEc8vQLXFbXQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/jieba-linux-arm64-musl": {
+ "version": "1.10.4",
+ "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm64-musl/-/jieba-linux-arm64-musl-1.10.4.tgz",
+ "integrity": "sha512-Y/tiJ1+HeS5nnmLbZOE+66LbsPOHZ/PUckAYVeLlQfpygLEpLYdlh0aPpS5uiaWMjAXYZYdFkpZHhxDmSLpwpw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/jieba-linux-x64-gnu": {
+ "version": "1.10.4",
+ "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-x64-gnu/-/jieba-linux-x64-gnu-1.10.4.tgz",
+ "integrity": "sha512-WZO8ykRJpWGE9MHuZpy1lu3nJluPoeB+fIJJn5CWZ9YTVhNDWoCF4i/7nxz1ntulINYGQ8VVuCU9LD86Mek97g==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/jieba-linux-x64-musl": {
+ "version": "1.10.4",
+ "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-x64-musl/-/jieba-linux-x64-musl-1.10.4.tgz",
+ "integrity": "sha512-uBBD4S1rGKcgCyAk6VCKatEVQb6EDD5I40v/DxODi5CuZVCANi9m5oee/MQbAoaX7RydA2f0OSCE9/tcwXEwUg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/jieba-wasm32-wasi": {
+ "version": "1.10.4",
+ "resolved": "https://registry.npmjs.org/@node-rs/jieba-wasm32-wasi/-/jieba-wasm32-wasi-1.10.4.tgz",
+ "integrity": "sha512-Y2umiKHjuIJy0uulNDz9SDYHdfq5Hmy7jY5nORO99B4pySKkcrMjpeVrmWXJLIsEKLJwcCXHxz8tjwU5/uhz0A==",
+ "cpu": [
+ "wasm32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@napi-rs/wasm-runtime": "^0.2.3"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@node-rs/jieba-win32-arm64-msvc": {
+ "version": "1.10.4",
+ "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-arm64-msvc/-/jieba-win32-arm64-msvc-1.10.4.tgz",
+ "integrity": "sha512-nwMtViFm4hjqhz1it/juQnxpXgqlGltCuWJ02bw70YUDMDlbyTy3grCJPpQQpueeETcALUnTxda8pZuVrLRcBA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/jieba-win32-ia32-msvc": {
+ "version": "1.10.4",
+ "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-ia32-msvc/-/jieba-win32-ia32-msvc-1.10.4.tgz",
+ "integrity": "sha512-DCAvLx7Z+W4z5oKS+7vUowAJr0uw9JBw8x1Y23Xs/xMA4Em+OOSiaF5/tCJqZUCJ8uC4QeImmgDFiBqGNwxlyA==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/jieba-win32-x64-msvc": {
+ "version": "1.10.4",
+ "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-x64-msvc/-/jieba-win32-x64-msvc-1.10.4.tgz",
+ "integrity": "sha512-+sqemSfS1jjb+Tt7InNbNzrRh1Ua3vProVvC4BZRPg010/leCbGFFiQHpzcPRfpxAXZrzG5Y0YBTsPzN/I4yHQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@peculiar/asn1-cms": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.6.1.tgz",
+ "integrity": "sha512-vdG4fBF6Lkirkcl53q6eOdn3XYKt+kJTG59edgRZORlg/3atWWEReRCx5rYE1ZzTTX6vLK5zDMjHh7vbrcXGtw==",
+ "license": "MIT",
+ "dependencies": {
+ "@peculiar/asn1-schema": "^2.6.0",
+ "@peculiar/asn1-x509": "^2.6.1",
+ "@peculiar/asn1-x509-attr": "^2.6.1",
+ "asn1js": "^3.0.6",
+ "tslib": "^2.8.1"
+ }
+ },
+ "node_modules/@peculiar/asn1-csr": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.6.1.tgz",
+ "integrity": "sha512-WRWnKfIocHyzFYQTka8O/tXCiBquAPSrRjXbOkHbO4qdmS6loffCEGs+rby6WxxGdJCuunnhS2duHURhjyio6w==",
+ "license": "MIT",
+ "dependencies": {
+ "@peculiar/asn1-schema": "^2.6.0",
+ "@peculiar/asn1-x509": "^2.6.1",
+ "asn1js": "^3.0.6",
+ "tslib": "^2.8.1"
+ }
+ },
+ "node_modules/@peculiar/asn1-ecc": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.6.1.tgz",
+ "integrity": "sha512-+Vqw8WFxrtDIN5ehUdvlN2m73exS2JVG0UAyfVB31gIfor3zWEAQPD+K9ydCxaj3MLen9k0JhKpu9LqviuCE1g==",
+ "license": "MIT",
+ "dependencies": {
+ "@peculiar/asn1-schema": "^2.6.0",
+ "@peculiar/asn1-x509": "^2.6.1",
+ "asn1js": "^3.0.6",
+ "tslib": "^2.8.1"
+ }
+ },
+ "node_modules/@peculiar/asn1-pfx": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.6.1.tgz",
+ "integrity": "sha512-nB5jVQy3MAAWvq0KY0R2JUZG8bO/bTLpnwyOzXyEh/e54ynGTatAR+csOnXkkVD9AFZ2uL8Z7EV918+qB1qDvw==",
+ "license": "MIT",
+ "dependencies": {
+ "@peculiar/asn1-cms": "^2.6.1",
+ "@peculiar/asn1-pkcs8": "^2.6.1",
+ "@peculiar/asn1-rsa": "^2.6.1",
+ "@peculiar/asn1-schema": "^2.6.0",
+ "asn1js": "^3.0.6",
+ "tslib": "^2.8.1"
+ }
+ },
+ "node_modules/@peculiar/asn1-pkcs8": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.6.1.tgz",
+ "integrity": "sha512-JB5iQ9Izn5yGMw3ZG4Nw3Xn/hb/G38GYF3lf7WmJb8JZUydhVGEjK/ZlFSWhnlB7K/4oqEs8HnfFIKklhR58Tw==",
+ "license": "MIT",
+ "dependencies": {
+ "@peculiar/asn1-schema": "^2.6.0",
+ "@peculiar/asn1-x509": "^2.6.1",
+ "asn1js": "^3.0.6",
+ "tslib": "^2.8.1"
+ }
+ },
+ "node_modules/@peculiar/asn1-pkcs9": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.6.1.tgz",
+ "integrity": "sha512-5EV8nZoMSxeWmcxWmmcolg22ojZRgJg+Y9MX2fnE2bGRo5KQLqV5IL9kdSQDZxlHz95tHvIq9F//bvL1OeNILw==",
+ "license": "MIT",
+ "dependencies": {
+ "@peculiar/asn1-cms": "^2.6.1",
+ "@peculiar/asn1-pfx": "^2.6.1",
+ "@peculiar/asn1-pkcs8": "^2.6.1",
+ "@peculiar/asn1-schema": "^2.6.0",
+ "@peculiar/asn1-x509": "^2.6.1",
+ "@peculiar/asn1-x509-attr": "^2.6.1",
+ "asn1js": "^3.0.6",
+ "tslib": "^2.8.1"
+ }
+ },
+ "node_modules/@peculiar/asn1-rsa": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.6.1.tgz",
+ "integrity": "sha512-1nVMEh46SElUt5CB3RUTV4EG/z7iYc7EoaDY5ECwganibQPkZ/Y2eMsTKB/LeyrUJ+W/tKoD9WUqIy8vB+CEdA==",
+ "license": "MIT",
+ "dependencies": {
+ "@peculiar/asn1-schema": "^2.6.0",
+ "@peculiar/asn1-x509": "^2.6.1",
+ "asn1js": "^3.0.6",
+ "tslib": "^2.8.1"
+ }
+ },
+ "node_modules/@peculiar/asn1-schema": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.6.0.tgz",
+ "integrity": "sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==",
+ "license": "MIT",
+ "dependencies": {
+ "asn1js": "^3.0.6",
+ "pvtsutils": "^1.3.6",
+ "tslib": "^2.8.1"
+ }
+ },
+ "node_modules/@peculiar/asn1-x509": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.6.1.tgz",
+ "integrity": "sha512-O9jT5F1A2+t3r7C4VT7LYGXqkGLK7Kj1xFpz7U0isPrubwU5PbDoyYtx6MiGst29yq7pXN5vZbQFKRCP+lLZlA==",
+ "license": "MIT",
+ "dependencies": {
+ "@peculiar/asn1-schema": "^2.6.0",
+ "asn1js": "^3.0.6",
+ "pvtsutils": "^1.3.6",
+ "tslib": "^2.8.1"
+ }
+ },
+ "node_modules/@peculiar/asn1-x509-attr": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.6.1.tgz",
+ "integrity": "sha512-tlW6cxoHwgcQghnJwv3YS+9OO1737zgPogZ+CgWRUK4roEwIPzRH4JEiG770xe5HX2ATfCpmX60gurfWIF9dcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@peculiar/asn1-schema": "^2.6.0",
+ "@peculiar/asn1-x509": "^2.6.1",
+ "asn1js": "^3.0.6",
+ "tslib": "^2.8.1"
+ }
+ },
+ "node_modules/@peculiar/x509": {
+ "version": "1.14.3",
+ "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz",
+ "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==",
+ "license": "MIT",
+ "dependencies": {
+ "@peculiar/asn1-cms": "^2.6.0",
+ "@peculiar/asn1-csr": "^2.6.0",
+ "@peculiar/asn1-ecc": "^2.6.0",
+ "@peculiar/asn1-pkcs9": "^2.6.0",
+ "@peculiar/asn1-rsa": "^2.6.0",
+ "@peculiar/asn1-schema": "^2.6.0",
+ "@peculiar/asn1-x509": "^2.6.0",
+ "pvtsutils": "^1.3.6",
+ "reflect-metadata": "^0.2.2",
+ "tslib": "^2.8.1",
+ "tsyringe": "^4.10.0"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@pnpm/config.env-replace": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz",
+ "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.22.0"
+ }
+ },
+ "node_modules/@pnpm/network.ca-file": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz",
+ "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "4.2.10"
+ },
+ "engines": {
+ "node": ">=12.22.0"
+ }
+ },
+ "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": {
+ "version": "4.2.10",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
+ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
+ "license": "ISC"
+ },
+ "node_modules/@pnpm/npm-conf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-3.0.2.tgz",
+ "integrity": "sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==",
+ "license": "MIT",
+ "dependencies": {
+ "@pnpm/config.env-replace": "^1.1.0",
+ "@pnpm/network.ca-file": "^1.0.1",
+ "config-chain": "^1.1.11"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@polka/url": {
+ "version": "1.0.0-next.29",
+ "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz",
+ "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==",
+ "license": "MIT"
+ },
+ "node_modules/@sideway/address": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz",
+ "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@hapi/hoek": "^9.0.0"
+ }
+ },
+ "node_modules/@sideway/formula": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz",
+ "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@sideway/pinpoint": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz",
+ "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@sinclair/typebox": {
+ "version": "0.27.10",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz",
+ "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==",
+ "license": "MIT"
+ },
+ "node_modules/@sindresorhus/is": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
+ "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/is?sponsor=1"
+ }
+ },
+ "node_modules/@slorber/remark-comment": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz",
+ "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-factory-space": "^1.0.0",
+ "micromark-util-character": "^1.1.0",
+ "micromark-util-symbol": "^1.0.1"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-add-jsx-attribute": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz",
+ "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-remove-jsx-attribute": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz",
+ "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz",
+ "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz",
+ "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-svg-dynamic-title": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz",
+ "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-svg-em-dimensions": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz",
+ "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-transform-react-native-svg": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz",
+ "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-transform-svg-component": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz",
+ "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-preset": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz",
+ "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==",
+ "license": "MIT",
+ "dependencies": {
+ "@svgr/babel-plugin-add-jsx-attribute": "8.0.0",
+ "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0",
+ "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0",
+ "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0",
+ "@svgr/babel-plugin-svg-dynamic-title": "8.0.0",
+ "@svgr/babel-plugin-svg-em-dimensions": "8.0.0",
+ "@svgr/babel-plugin-transform-react-native-svg": "8.1.0",
+ "@svgr/babel-plugin-transform-svg-component": "8.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/core": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz",
+ "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.21.3",
+ "@svgr/babel-preset": "8.1.0",
+ "camelcase": "^6.2.0",
+ "cosmiconfig": "^8.1.3",
+ "snake-case": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/hast-util-to-babel-ast": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz",
+ "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.21.3",
+ "entities": "^4.4.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/plugin-jsx": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz",
+ "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.21.3",
+ "@svgr/babel-preset": "8.1.0",
+ "@svgr/hast-util-to-babel-ast": "8.0.0",
+ "svg-parser": "^2.0.4"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@svgr/core": "*"
+ }
+ },
+ "node_modules/@svgr/plugin-svgo": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz",
+ "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==",
+ "license": "MIT",
+ "dependencies": {
+ "cosmiconfig": "^8.1.3",
+ "deepmerge": "^4.3.1",
+ "svgo": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@svgr/core": "*"
+ }
+ },
+ "node_modules/@svgr/webpack": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz",
+ "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.21.3",
+ "@babel/plugin-transform-react-constant-elements": "^7.21.3",
+ "@babel/preset-env": "^7.20.2",
+ "@babel/preset-react": "^7.18.6",
+ "@babel/preset-typescript": "^7.21.0",
+ "@svgr/core": "8.1.0",
+ "@svgr/plugin-jsx": "8.1.0",
+ "@svgr/plugin-svgo": "8.1.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@szmarczak/http-timer": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz",
+ "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==",
+ "license": "MIT",
+ "dependencies": {
+ "defer-to-connect": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=14.16"
+ }
+ },
+ "node_modules/@trysound/sax": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
+ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/@tybys/wasm-util": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
+ "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@types/body-parser": {
+ "version": "1.19.6",
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz",
+ "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/connect": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/bonjour": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz",
+ "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/connect": {
+ "version": "3.4.38",
+ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
+ "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/connect-history-api-fallback": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz",
+ "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/express-serve-static-core": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/d3": {
+ "version": "7.4.3",
+ "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz",
+ "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-array": "*",
+ "@types/d3-axis": "*",
+ "@types/d3-brush": "*",
+ "@types/d3-chord": "*",
+ "@types/d3-color": "*",
+ "@types/d3-contour": "*",
+ "@types/d3-delaunay": "*",
+ "@types/d3-dispatch": "*",
+ "@types/d3-drag": "*",
+ "@types/d3-dsv": "*",
+ "@types/d3-ease": "*",
+ "@types/d3-fetch": "*",
+ "@types/d3-force": "*",
+ "@types/d3-format": "*",
+ "@types/d3-geo": "*",
+ "@types/d3-hierarchy": "*",
+ "@types/d3-interpolate": "*",
+ "@types/d3-path": "*",
+ "@types/d3-polygon": "*",
+ "@types/d3-quadtree": "*",
+ "@types/d3-random": "*",
+ "@types/d3-scale": "*",
+ "@types/d3-scale-chromatic": "*",
+ "@types/d3-selection": "*",
+ "@types/d3-shape": "*",
+ "@types/d3-time": "*",
+ "@types/d3-time-format": "*",
+ "@types/d3-timer": "*",
+ "@types/d3-transition": "*",
+ "@types/d3-zoom": "*"
+ }
+ },
+ "node_modules/@types/d3-array": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz",
+ "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-axis": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz",
+ "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-selection": "*"
+ }
+ },
+ "node_modules/@types/d3-brush": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz",
+ "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-selection": "*"
+ }
+ },
+ "node_modules/@types/d3-chord": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz",
+ "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-color": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz",
+ "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-contour": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz",
+ "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-array": "*",
+ "@types/geojson": "*"
+ }
+ },
+ "node_modules/@types/d3-delaunay": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz",
+ "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-dispatch": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz",
+ "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-drag": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz",
+ "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-selection": "*"
+ }
+ },
+ "node_modules/@types/d3-dsv": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz",
+ "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-ease": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz",
+ "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-fetch": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz",
+ "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-dsv": "*"
+ }
+ },
+ "node_modules/@types/d3-force": {
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz",
+ "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-format": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz",
+ "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-geo": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz",
+ "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/geojson": "*"
+ }
+ },
+ "node_modules/@types/d3-hierarchy": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz",
+ "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-interpolate": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",
+ "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-color": "*"
+ }
+ },
+ "node_modules/@types/d3-path": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz",
+ "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-polygon": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz",
+ "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-quadtree": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz",
+ "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-random": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz",
+ "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-scale": {
+ "version": "4.0.9",
+ "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz",
+ "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-time": "*"
+ }
+ },
+ "node_modules/@types/d3-scale-chromatic": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz",
+ "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-selection": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz",
+ "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-shape": {
+ "version": "3.1.8",
+ "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz",
+ "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-path": "*"
+ }
+ },
+ "node_modules/@types/d3-time": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz",
+ "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-time-format": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz",
+ "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-timer": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz",
+ "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-transition": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz",
+ "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-selection": "*"
+ }
+ },
+ "node_modules/@types/d3-zoom": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz",
+ "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-interpolate": "*",
+ "@types/d3-selection": "*"
+ }
+ },
+ "node_modules/@types/debug": {
+ "version": "4.1.12",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
+ "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/ms": "*"
+ }
+ },
+ "node_modules/@types/eslint": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
+ "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "node_modules/@types/eslint-scope": {
+ "version": "3.7.7",
+ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
+ "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/eslint": "*",
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "license": "MIT"
+ },
+ "node_modules/@types/estree-jsx": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz",
+ "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/express": {
+ "version": "4.17.25",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz",
+ "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/body-parser": "*",
+ "@types/express-serve-static-core": "^4.17.33",
+ "@types/qs": "*",
+ "@types/serve-static": "^1"
+ }
+ },
+ "node_modules/@types/express-serve-static-core": {
+ "version": "4.19.8",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz",
+ "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*",
+ "@types/send": "*"
+ }
+ },
+ "node_modules/@types/geojson": {
+ "version": "7946.0.16",
+ "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz",
+ "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/gtag.js": {
+ "version": "0.0.12",
+ "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz",
+ "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/hast": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
+ "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/history": {
+ "version": "4.7.11",
+ "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz",
+ "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/html-minifier-terser": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
+ "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/http-cache-semantics": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
+ "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==",
+ "license": "MIT"
+ },
+ "node_modules/@types/http-errors": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz",
+ "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/http-proxy": {
+ "version": "1.17.17",
+ "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz",
+ "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/istanbul-lib-coverage": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
+ "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
+ "license": "MIT"
+ },
+ "node_modules/@types/istanbul-lib-report": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
+ "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "*"
+ }
+ },
+ "node_modules/@types/istanbul-reports": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
+ "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-report": "*"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/katex": {
+ "version": "0.16.8",
+ "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.8.tgz",
+ "integrity": "sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/mdx": {
+ "version": "2.0.13",
+ "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz",
+ "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/mime": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
+ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
+ "license": "MIT"
+ },
+ "node_modules/@types/ms": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
+ "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.0.tgz",
+ "integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==",
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~7.18.0"
+ }
+ },
+ "node_modules/@types/prismjs": {
+ "version": "1.26.6",
+ "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.6.tgz",
+ "integrity": "sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/qs": {
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz",
+ "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/range-parser": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
+ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/react": {
+ "version": "19.2.14",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz",
+ "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==",
+ "license": "MIT",
+ "dependencies": {
+ "csstype": "^3.2.2"
+ }
+ },
+ "node_modules/@types/react-router": {
+ "version": "5.1.20",
+ "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz",
+ "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/history": "^4.7.11",
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/react-router-config": {
+ "version": "5.0.11",
+ "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz",
+ "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/history": "^4.7.11",
+ "@types/react": "*",
+ "@types/react-router": "^5.1.0"
+ }
+ },
+ "node_modules/@types/react-router-dom": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz",
+ "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/history": "^4.7.11",
+ "@types/react": "*",
+ "@types/react-router": "*"
+ }
+ },
+ "node_modules/@types/retry": {
+ "version": "0.12.2",
+ "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz",
+ "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==",
+ "license": "MIT"
+ },
+ "node_modules/@types/sax": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz",
+ "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/send": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz",
+ "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/serve-index": {
+ "version": "1.9.4",
+ "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz",
+ "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/express": "*"
+ }
+ },
+ "node_modules/@types/serve-static": {
+ "version": "1.15.10",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz",
+ "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/http-errors": "*",
+ "@types/node": "*",
+ "@types/send": "<1"
+ }
+ },
+ "node_modules/@types/serve-static/node_modules/@types/send": {
+ "version": "0.17.6",
+ "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz",
+ "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mime": "^1",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/sockjs": {
+ "version": "0.3.36",
+ "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz",
+ "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/trusted-types": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
+ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/@types/ws": {
+ "version": "8.18.1",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz",
+ "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/yargs": {
+ "version": "17.0.35",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz",
+ "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@types/yargs-parser": {
+ "version": "21.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
+ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
+ "license": "MIT"
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
+ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
+ "license": "ISC"
+ },
+ "node_modules/@webassemblyjs/ast": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",
+ "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/helper-numbers": "1.13.2",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
+ "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-api-error": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
+ "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-buffer": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
+ "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-numbers": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
+ "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/floating-point-hex-parser": "1.13.2",
+ "@webassemblyjs/helper-api-error": "1.13.2",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
+ "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-wasm-section": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
+ "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/wasm-gen": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/ieee754": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
+ "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
+ "license": "MIT",
+ "dependencies": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "node_modules/@webassemblyjs/leb128": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
+ "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/utf8": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
+ "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/wasm-edit": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
+ "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/helper-wasm-section": "1.14.1",
+ "@webassemblyjs/wasm-gen": "1.14.1",
+ "@webassemblyjs/wasm-opt": "1.14.1",
+ "@webassemblyjs/wasm-parser": "1.14.1",
+ "@webassemblyjs/wast-printer": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-gen": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
+ "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/ieee754": "1.13.2",
+ "@webassemblyjs/leb128": "1.13.2",
+ "@webassemblyjs/utf8": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-opt": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
+ "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/wasm-gen": "1.14.1",
+ "@webassemblyjs/wasm-parser": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-parser": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
+ "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-api-error": "1.13.2",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/ieee754": "1.13.2",
+ "@webassemblyjs/leb128": "1.13.2",
+ "@webassemblyjs/utf8": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/wast-printer": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
+ "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@xtuc/long": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/accepts/node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/accepts/node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/accepts/node_modules/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-import-phases": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz",
+ "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "peerDependencies": {
+ "acorn": "^8.14.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/acorn-walk": {
+ "version": "8.3.5",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz",
+ "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==",
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.11.0"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/address": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz",
+ "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/aggregate-error": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+ "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+ "license": "MIT",
+ "dependencies": {
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "8.18.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz",
+ "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-formats": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
+ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
+ }
+ },
+ "node_modules/algoliasearch": {
+ "version": "5.49.0",
+ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.49.0.tgz",
+ "integrity": "sha512-Tse7vx7WOvbU+kpq/L3BrBhSWTPbtMa59zIEhMn+Z2NoxZlpcCRUDCRxQ7kDFs1T3CHxDgvb+mDuILiBBpBaAA==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/abtesting": "1.15.0",
+ "@algolia/client-abtesting": "5.49.0",
+ "@algolia/client-analytics": "5.49.0",
+ "@algolia/client-common": "5.49.0",
+ "@algolia/client-insights": "5.49.0",
+ "@algolia/client-personalization": "5.49.0",
+ "@algolia/client-query-suggestions": "5.49.0",
+ "@algolia/client-search": "5.49.0",
+ "@algolia/ingestion": "1.49.0",
+ "@algolia/monitoring": "1.49.0",
+ "@algolia/recommend": "5.49.0",
+ "@algolia/requester-browser-xhr": "5.49.0",
+ "@algolia/requester-fetch": "5.49.0",
+ "@algolia/requester-node-http": "5.49.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/algoliasearch-helper": {
+ "version": "3.27.1",
+ "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.27.1.tgz",
+ "integrity": "sha512-XXGr02Cz285vLbqM6vPfb39xqV1ptpFr1xn9mqaW+nUvYTvFTdKgYTC/Cg1VzgRTQqNkq9+LlUVv8cfCeOoKig==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/events": "^4.0.1"
+ },
+ "peerDependencies": {
+ "algoliasearch": ">= 3.1 < 6"
+ }
+ },
+ "node_modules/ansi-align": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
+ "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.1.0"
+ }
+ },
+ "node_modules/ansi-align/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/ansi-align/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-escapes/node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-html-community": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
+ "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==",
+ "engines": [
+ "node >= 0.8.0"
+ ],
+ "license": "Apache-2.0",
+ "bin": {
+ "ansi-html": "bin/ansi-html"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "license": "MIT"
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "license": "Python-2.0"
+ },
+ "node_modules/array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
+ "license": "MIT"
+ },
+ "node_modules/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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/asn1js": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.7.tgz",
+ "integrity": "sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "pvtsutils": "^1.3.6",
+ "pvutils": "^1.1.3",
+ "tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/astring": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz",
+ "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==",
+ "license": "MIT",
+ "bin": {
+ "astring": "bin/astring"
+ }
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.24",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.24.tgz",
+ "integrity": "sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.28.1",
+ "caniuse-lite": "^1.0.30001766",
+ "fraction.js": "^5.3.4",
+ "picocolors": "^1.1.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/babel-loader": {
+ "version": "9.2.1",
+ "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz",
+ "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==",
+ "license": "MIT",
+ "dependencies": {
+ "find-cache-dir": "^4.0.0",
+ "schema-utils": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 14.15.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.12.0",
+ "webpack": ">=5"
+ }
+ },
+ "node_modules/babel-plugin-dynamic-import-node": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
+ "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "object.assign": "^4.1.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2": {
+ "version": "0.4.15",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.15.tgz",
+ "integrity": "sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.28.6",
+ "@babel/helper-define-polyfill-provider": "^0.6.6",
+ "semver": "^6.3.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz",
+ "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.5",
+ "core-js-compat": "^3.43.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-regenerator": {
+ "version": "0.6.6",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.6.tgz",
+ "integrity": "sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.6"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/bail": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
+ "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "license": "MIT"
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz",
+ "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==",
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/batch": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
+ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
+ "license": "MIT"
+ },
+ "node_modules/big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/body-parser": {
+ "version": "1.20.4",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz",
+ "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "~3.1.2",
+ "content-type": "~1.0.5",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "~1.2.0",
+ "http-errors": "~2.0.1",
+ "iconv-lite": "~0.4.24",
+ "on-finished": "~2.4.1",
+ "qs": "~6.14.0",
+ "raw-body": "~2.5.3",
+ "type-is": "~1.6.18",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/body-parser/node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/body-parser/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/body-parser/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/bonjour-service": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz",
+ "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "multicast-dns": "^7.2.5"
+ }
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "license": "ISC"
+ },
+ "node_modules/boxen": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz",
+ "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-align": "^3.0.1",
+ "camelcase": "^6.2.0",
+ "chalk": "^4.1.2",
+ "cli-boxes": "^3.0.0",
+ "string-width": "^5.0.1",
+ "type-fest": "^2.5.0",
+ "widest-line": "^4.0.1",
+ "wrap-ansi": "^8.0.1"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz",
+ "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "baseline-browser-mapping": "^2.9.0",
+ "caniuse-lite": "^1.0.30001759",
+ "electron-to-chromium": "^1.5.263",
+ "node-releases": "^2.0.27",
+ "update-browserslist-db": "^1.2.0"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "license": "MIT"
+ },
+ "node_modules/bundle-name": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz",
+ "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==",
+ "license": "MIT",
+ "dependencies": {
+ "run-applescript": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/bytes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+ "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/bytestreamjs": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz",
+ "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/cacheable-lookup": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz",
+ "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.16"
+ }
+ },
+ "node_modules/cacheable-request": {
+ "version": "10.2.14",
+ "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz",
+ "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/http-cache-semantics": "^4.0.2",
+ "get-stream": "^6.0.1",
+ "http-cache-semantics": "^4.1.1",
+ "keyv": "^4.5.3",
+ "mimic-response": "^4.0.0",
+ "normalize-url": "^8.0.0",
+ "responselike": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
+ "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.0",
+ "es-define-property": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camel-case": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
+ "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
+ "license": "MIT",
+ "dependencies": {
+ "pascal-case": "^3.1.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/caniuse-api": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
+ "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.0.0",
+ "caniuse-lite": "^1.0.0",
+ "lodash.memoize": "^4.1.2",
+ "lodash.uniq": "^4.5.0"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001770",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001770.tgz",
+ "integrity": "sha512-x/2CLQ1jHENRbHg5PSId2sXq1CIO1CISvwWAj027ltMVG2UNgW+w9oH2+HzgEIRFembL8bUlXtfbBHR1fCg2xw==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/ccount": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
+ "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/char-regex": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
+ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/character-entities": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
+ "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-html4": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
+ "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-legacy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
+ "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-reference-invalid": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz",
+ "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/cheerio": {
+ "version": "1.0.0-rc.12",
+ "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz",
+ "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==",
+ "license": "MIT",
+ "dependencies": {
+ "cheerio-select": "^2.1.0",
+ "dom-serializer": "^2.0.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1",
+ "htmlparser2": "^8.0.1",
+ "parse5": "^7.0.0",
+ "parse5-htmlparser2-tree-adapter": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
+ }
+ },
+ "node_modules/cheerio-select": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz",
+ "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-select": "^5.1.0",
+ "css-what": "^6.1.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/chevrotain": {
+ "version": "11.1.1",
+ "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.1.1.tgz",
+ "integrity": "sha512-f0yv5CPKaFxfsPTBzX7vGuim4oIC1/gcS7LUGdBSwl2dU6+FON6LVUksdOo1qJjoUvXNn45urgh8C+0a24pACQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@chevrotain/cst-dts-gen": "11.1.1",
+ "@chevrotain/gast": "11.1.1",
+ "@chevrotain/regexp-to-ast": "11.1.1",
+ "@chevrotain/types": "11.1.1",
+ "@chevrotain/utils": "11.1.1",
+ "lodash-es": "4.17.23"
+ }
+ },
+ "node_modules/chevrotain-allstar": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz",
+ "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==",
+ "license": "MIT",
+ "dependencies": {
+ "lodash-es": "^4.17.21"
+ },
+ "peerDependencies": {
+ "chevrotain": "^11.0.0"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chrome-trace-event": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
+ "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/clean-css": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz",
+ "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==",
+ "license": "MIT",
+ "dependencies": {
+ "source-map": "~0.6.0"
+ },
+ "engines": {
+ "node": ">= 10.0"
+ }
+ },
+ "node_modules/clean-css/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/clean-stack": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/cli-boxes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz",
+ "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-table3": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz",
+ "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==",
+ "license": "MIT",
+ "dependencies": {
+ "string-width": "^4.2.0"
+ },
+ "engines": {
+ "node": "10.* || >= 12.*"
+ },
+ "optionalDependencies": {
+ "@colors/colors": "1.5.0"
+ }
+ },
+ "node_modules/cli-table3/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/cli-table3/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/clone-deep": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+ "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+ "license": "MIT",
+ "dependencies": {
+ "is-plain-object": "^2.0.4",
+ "kind-of": "^6.0.2",
+ "shallow-clone": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/clsx": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/collapse-white-space": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz",
+ "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/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==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/colord": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
+ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
+ "license": "MIT"
+ },
+ "node_modules/colorette": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+ "license": "MIT"
+ },
+ "node_modules/combine-promises": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz",
+ "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/comlink": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.4.2.tgz",
+ "integrity": "sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/comma-separated-tokens": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
+ "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/commander": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
+ "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/common-path-prefix": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz",
+ "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==",
+ "license": "ISC"
+ },
+ "node_modules/compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": ">= 1.43.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/compressible/node_modules/mime-db": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/compression": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz",
+ "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "compressible": "~2.0.18",
+ "debug": "2.6.9",
+ "negotiator": "~0.6.4",
+ "on-headers": "~1.1.0",
+ "safe-buffer": "5.2.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/compression/node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/compression/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/compression/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "license": "MIT"
+ },
+ "node_modules/confbox": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
+ "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
+ "license": "MIT"
+ },
+ "node_modules/config-chain": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
+ "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ini": "^1.3.4",
+ "proto-list": "~1.2.1"
+ }
+ },
+ "node_modules/config-chain/node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "license": "ISC"
+ },
+ "node_modules/configstore": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz",
+ "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dot-prop": "^6.0.1",
+ "graceful-fs": "^4.2.6",
+ "unique-string": "^3.0.0",
+ "write-file-atomic": "^3.0.3",
+ "xdg-basedir": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/yeoman/configstore?sponsor=1"
+ }
+ },
+ "node_modules/connect-history-api-fallback": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz",
+ "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/consola": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz",
+ "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14.18.0 || >=16.10.0"
+ }
+ },
+ "node_modules/content-disposition": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
+ "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "license": "MIT"
+ },
+ "node_modules/cookie": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz",
+ "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==",
+ "license": "MIT"
+ },
+ "node_modules/copy-webpack-plugin": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz",
+ "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-glob": "^3.2.11",
+ "glob-parent": "^6.0.1",
+ "globby": "^13.1.1",
+ "normalize-path": "^3.0.0",
+ "schema-utils": "^4.0.0",
+ "serialize-javascript": "^6.0.0"
+ },
+ "engines": {
+ "node": ">= 14.15.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.1.0"
+ }
+ },
+ "node_modules/copy-webpack-plugin/node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/copy-webpack-plugin/node_modules/globby": {
+ "version": "13.2.2",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz",
+ "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==",
+ "license": "MIT",
+ "dependencies": {
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.3.0",
+ "ignore": "^5.2.4",
+ "merge2": "^1.4.1",
+ "slash": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/copy-webpack-plugin/node_modules/slash": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
+ "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/core-js": {
+ "version": "3.48.0",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.48.0.tgz",
+ "integrity": "sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.48.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.48.0.tgz",
+ "integrity": "sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.28.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-js-pure": {
+ "version": "3.48.0",
+ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.48.0.tgz",
+ "integrity": "sha512-1slJgk89tWC51HQ1AEqG+s2VuwpTRr8ocu4n20QUcH1v9lAN0RXen0Q0AABa/DK1I7RrNWLucplOHMx8hfTGTw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "license": "MIT"
+ },
+ "node_modules/cose-base": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz",
+ "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==",
+ "license": "MIT",
+ "dependencies": {
+ "layout-base": "^1.0.0"
+ }
+ },
+ "node_modules/cosmiconfig": {
+ "version": "8.3.6",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
+ "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
+ "license": "MIT",
+ "dependencies": {
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0",
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/crypto-random-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz",
+ "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==",
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/crypto-random-string/node_modules/type-fest": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
+ "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/css-blank-pseudo": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz",
+ "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz",
+ "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/css-declaration-sorter": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.3.1.tgz",
+ "integrity": "sha512-gz6x+KkgNCjxq3Var03pRYLhyNfwhkKF1g/yoLgDNtFvVu0/fOLV9C8fFEZRjACp/XQLumjAYo7JVjzH3wLbxA==",
+ "license": "ISC",
+ "engines": {
+ "node": "^14 || ^16 || >=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.9"
+ }
+ },
+ "node_modules/css-has-pseudo": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.3.tgz",
+ "integrity": "sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/selector-specificity": "^5.0.0",
+ "postcss-selector-parser": "^7.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/css-has-pseudo/node_modules/@csstools/selector-specificity": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz",
+ "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ }
+ },
+ "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz",
+ "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/css-loader": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz",
+ "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==",
+ "license": "MIT",
+ "dependencies": {
+ "icss-utils": "^5.1.0",
+ "postcss": "^8.4.33",
+ "postcss-modules-extract-imports": "^3.1.0",
+ "postcss-modules-local-by-default": "^4.0.5",
+ "postcss-modules-scope": "^3.2.0",
+ "postcss-modules-values": "^4.0.0",
+ "postcss-value-parser": "^4.2.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "@rspack/core": "0.x || 1.x",
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@rspack/core": {
+ "optional": true
+ },
+ "webpack": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/css-minimizer-webpack-plugin": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz",
+ "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.18",
+ "cssnano": "^6.0.1",
+ "jest-worker": "^29.4.3",
+ "postcss": "^8.4.24",
+ "schema-utils": "^4.0.1",
+ "serialize-javascript": "^6.0.1"
+ },
+ "engines": {
+ "node": ">= 14.15.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@parcel/css": {
+ "optional": true
+ },
+ "@swc/css": {
+ "optional": true
+ },
+ "clean-css": {
+ "optional": true
+ },
+ "csso": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/css-prefers-color-scheme": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz",
+ "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/css-select": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz",
+ "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.1.0",
+ "domhandler": "^5.0.2",
+ "domutils": "^3.0.1",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-tree": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
+ "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.0.30",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz",
+ "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/cssdb": {
+ "version": "8.7.1",
+ "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.7.1.tgz",
+ "integrity": "sha512-+F6LKx48RrdGOtE4DT5jz7Uo+VeyKXpK797FAevIkzjV8bMHz6xTO5F7gNDcRCHmPgD5jj2g6QCsY9zmVrh38A==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ }
+ ],
+ "license": "MIT-0"
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "license": "MIT",
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cssnano": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz",
+ "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==",
+ "license": "MIT",
+ "dependencies": {
+ "cssnano-preset-default": "^6.1.2",
+ "lilconfig": "^3.1.1"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/cssnano"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/cssnano-preset-advanced": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz",
+ "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "autoprefixer": "^10.4.19",
+ "browserslist": "^4.23.0",
+ "cssnano-preset-default": "^6.1.2",
+ "postcss-discard-unused": "^6.0.5",
+ "postcss-merge-idents": "^6.0.3",
+ "postcss-reduce-idents": "^6.0.3",
+ "postcss-zindex": "^6.0.2"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/cssnano-preset-default": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz",
+ "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.23.0",
+ "css-declaration-sorter": "^7.2.0",
+ "cssnano-utils": "^4.0.2",
+ "postcss-calc": "^9.0.1",
+ "postcss-colormin": "^6.1.0",
+ "postcss-convert-values": "^6.1.0",
+ "postcss-discard-comments": "^6.0.2",
+ "postcss-discard-duplicates": "^6.0.3",
+ "postcss-discard-empty": "^6.0.3",
+ "postcss-discard-overridden": "^6.0.2",
+ "postcss-merge-longhand": "^6.0.5",
+ "postcss-merge-rules": "^6.1.1",
+ "postcss-minify-font-values": "^6.1.0",
+ "postcss-minify-gradients": "^6.0.3",
+ "postcss-minify-params": "^6.1.0",
+ "postcss-minify-selectors": "^6.0.4",
+ "postcss-normalize-charset": "^6.0.2",
+ "postcss-normalize-display-values": "^6.0.2",
+ "postcss-normalize-positions": "^6.0.2",
+ "postcss-normalize-repeat-style": "^6.0.2",
+ "postcss-normalize-string": "^6.0.2",
+ "postcss-normalize-timing-functions": "^6.0.2",
+ "postcss-normalize-unicode": "^6.1.0",
+ "postcss-normalize-url": "^6.0.2",
+ "postcss-normalize-whitespace": "^6.0.2",
+ "postcss-ordered-values": "^6.0.2",
+ "postcss-reduce-initial": "^6.1.0",
+ "postcss-reduce-transforms": "^6.0.2",
+ "postcss-svgo": "^6.0.3",
+ "postcss-unique-selectors": "^6.0.4"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/cssnano-utils": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz",
+ "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/csso": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
+ "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "css-tree": "~2.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/css-tree": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
+ "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.0.28",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/mdn-data": {
+ "version": "2.0.28",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
+ "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/csstype": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+ "license": "MIT"
+ },
+ "node_modules/cytoscape": {
+ "version": "3.33.1",
+ "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz",
+ "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/cytoscape-cose-bilkent": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz",
+ "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==",
+ "license": "MIT",
+ "dependencies": {
+ "cose-base": "^1.0.0"
+ },
+ "peerDependencies": {
+ "cytoscape": "^3.2.0"
+ }
+ },
+ "node_modules/cytoscape-fcose": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz",
+ "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==",
+ "license": "MIT",
+ "dependencies": {
+ "cose-base": "^2.2.0"
+ },
+ "peerDependencies": {
+ "cytoscape": "^3.2.0"
+ }
+ },
+ "node_modules/cytoscape-fcose/node_modules/cose-base": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz",
+ "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==",
+ "license": "MIT",
+ "dependencies": {
+ "layout-base": "^2.0.0"
+ }
+ },
+ "node_modules/cytoscape-fcose/node_modules/layout-base": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz",
+ "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==",
+ "license": "MIT"
+ },
+ "node_modules/d3": {
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz",
+ "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-array": "3",
+ "d3-axis": "3",
+ "d3-brush": "3",
+ "d3-chord": "3",
+ "d3-color": "3",
+ "d3-contour": "4",
+ "d3-delaunay": "6",
+ "d3-dispatch": "3",
+ "d3-drag": "3",
+ "d3-dsv": "3",
+ "d3-ease": "3",
+ "d3-fetch": "3",
+ "d3-force": "3",
+ "d3-format": "3",
+ "d3-geo": "3",
+ "d3-hierarchy": "3",
+ "d3-interpolate": "3",
+ "d3-path": "3",
+ "d3-polygon": "3",
+ "d3-quadtree": "3",
+ "d3-random": "3",
+ "d3-scale": "4",
+ "d3-scale-chromatic": "3",
+ "d3-selection": "3",
+ "d3-shape": "3",
+ "d3-time": "3",
+ "d3-time-format": "4",
+ "d3-timer": "3",
+ "d3-transition": "3",
+ "d3-zoom": "3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-array": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz",
+ "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",
+ "license": "ISC",
+ "dependencies": {
+ "internmap": "1 - 2"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-axis": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz",
+ "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-brush": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz",
+ "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-dispatch": "1 - 3",
+ "d3-drag": "2 - 3",
+ "d3-interpolate": "1 - 3",
+ "d3-selection": "3",
+ "d3-transition": "3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-chord": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz",
+ "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-path": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/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==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-contour": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz",
+ "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-array": "^3.2.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-delaunay": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz",
+ "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==",
+ "license": "ISC",
+ "dependencies": {
+ "delaunator": "5"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-dispatch": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz",
+ "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-drag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz",
+ "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-dispatch": "1 - 3",
+ "d3-selection": "3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-dsv": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz",
+ "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==",
+ "license": "ISC",
+ "dependencies": {
+ "commander": "7",
+ "iconv-lite": "0.6",
+ "rw": "1"
+ },
+ "bin": {
+ "csv2json": "bin/dsv2json.js",
+ "csv2tsv": "bin/dsv2dsv.js",
+ "dsv2dsv": "bin/dsv2dsv.js",
+ "dsv2json": "bin/dsv2json.js",
+ "json2csv": "bin/json2dsv.js",
+ "json2dsv": "bin/json2dsv.js",
+ "json2tsv": "bin/json2dsv.js",
+ "tsv2csv": "bin/dsv2dsv.js",
+ "tsv2json": "bin/dsv2json.js"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-dsv/node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/d3-dsv/node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/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==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-fetch": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz",
+ "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-dsv": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-force": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz",
+ "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-dispatch": "1 - 3",
+ "d3-quadtree": "1 - 3",
+ "d3-timer": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-format": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz",
+ "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-geo": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz",
+ "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-array": "2.5.0 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-hierarchy": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz",
+ "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/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==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-color": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-path": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",
+ "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-polygon": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz",
+ "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-quadtree": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz",
+ "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-random": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz",
+ "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-sankey": {
+ "version": "0.12.3",
+ "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz",
+ "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "d3-array": "1 - 2",
+ "d3-shape": "^1.2.0"
+ }
+ },
+ "node_modules/d3-sankey/node_modules/d3-array": {
+ "version": "2.12.1",
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz",
+ "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "internmap": "^1.0.0"
+ }
+ },
+ "node_modules/d3-sankey/node_modules/d3-path": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz",
+ "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/d3-sankey/node_modules/d3-shape": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz",
+ "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "d3-path": "1"
+ }
+ },
+ "node_modules/d3-sankey/node_modules/internmap": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz",
+ "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==",
+ "license": "ISC"
+ },
+ "node_modules/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==",
+ "license": "ISC",
+ "dependencies": {
+ "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"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-scale-chromatic": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz",
+ "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-color": "1 - 3",
+ "d3-interpolate": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-selection": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz",
+ "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-shape": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",
+ "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-path": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-time": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
+ "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-array": "2 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/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==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-time": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/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==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-transition": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz",
+ "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-color": "1 - 3",
+ "d3-dispatch": "1 - 3",
+ "d3-ease": "1 - 3",
+ "d3-interpolate": "1 - 3",
+ "d3-timer": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "peerDependencies": {
+ "d3-selection": "2 - 3"
+ }
+ },
+ "node_modules/d3-zoom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz",
+ "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-dispatch": "1 - 3",
+ "d3-drag": "2 - 3",
+ "d3-interpolate": "1 - 3",
+ "d3-selection": "2 - 3",
+ "d3-transition": "2 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/dagre-d3-es": {
+ "version": "7.0.13",
+ "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.13.tgz",
+ "integrity": "sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "d3": "^7.9.0",
+ "lodash-es": "^4.17.21"
+ }
+ },
+ "node_modules/dayjs": {
+ "version": "1.11.19",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz",
+ "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==",
+ "license": "MIT"
+ },
+ "node_modules/debounce": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz",
+ "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==",
+ "license": "MIT"
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decode-named-character-reference": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz",
+ "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "character-entities": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/decompress-response": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "mimic-response": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/decompress-response/node_modules/mimic-response": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/default-browser": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz",
+ "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==",
+ "license": "MIT",
+ "dependencies": {
+ "bundle-name": "^4.1.0",
+ "default-browser-id": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/default-browser-id": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz",
+ "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/defer-to-connect": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
+ "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/delaunator": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz",
+ "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==",
+ "license": "ISC",
+ "dependencies": {
+ "robust-predicates": "^3.0.2"
+ }
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/detect-node": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
+ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
+ "license": "MIT"
+ },
+ "node_modules/detect-port": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz",
+ "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==",
+ "license": "MIT",
+ "dependencies": {
+ "address": "^1.0.1",
+ "debug": "4"
+ },
+ "bin": {
+ "detect": "bin/detect-port.js",
+ "detect-port": "bin/detect-port.js"
+ },
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/devlop": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
+ "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
+ "license": "MIT",
+ "dependencies": {
+ "dequal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "license": "MIT",
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dns-packet": {
+ "version": "5.6.1",
+ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz",
+ "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==",
+ "license": "MIT",
+ "dependencies": {
+ "@leichtgewicht/ip-codec": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/dom-converter": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
+ "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
+ "license": "MIT",
+ "dependencies": {
+ "utila": "~0.4"
+ }
+ },
+ "node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/dompurify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.1.tgz",
+ "integrity": "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==",
+ "license": "(MPL-2.0 OR Apache-2.0)",
+ "optionalDependencies": {
+ "@types/trusted-types": "^2.0.7"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/dot-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
+ "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+ "license": "MIT",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/dot-prop": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz",
+ "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==",
+ "license": "MIT",
+ "dependencies": {
+ "is-obj": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/dot-prop/node_modules/is-obj": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+ "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/duplexer": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
+ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
+ "license": "MIT"
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "license": "MIT"
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "license": "MIT"
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.302",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz",
+ "integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==",
+ "license": "ISC"
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "license": "MIT"
+ },
+ "node_modules/emojilib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz",
+ "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==",
+ "license": "MIT"
+ },
+ "node_modules/emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/emoticon": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz",
+ "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/encoding-sniffer": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz",
+ "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==",
+ "license": "MIT",
+ "dependencies": {
+ "iconv-lite": "^0.6.3",
+ "whatwg-encoding": "^3.1.1"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/encoding-sniffer?sponsor=1"
+ }
+ },
+ "node_modules/encoding-sniffer/node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.19.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz",
+ "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.3.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
+ "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz",
+ "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==",
+ "license": "MIT"
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/esast-util-from-estree": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz",
+ "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-visit": "^2.0.0",
+ "unist-util-position-from-estree": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/esast-util-from-js": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz",
+ "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "acorn": "^8.0.0",
+ "esast-util-from-estree": "^2.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-goat": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz",
+ "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "license": "MIT"
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "license": "BSD-2-Clause",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estree-util-attach-comments": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz",
+ "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-build-jsx": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz",
+ "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "estree-walker": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-is-identifier-name": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz",
+ "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-scope": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz",
+ "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "devlop": "^1.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-to-js": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz",
+ "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "astring": "^1.8.0",
+ "source-map": "^0.7.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-value-to-estree": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz",
+ "integrity": "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/remcohaszing"
+ }
+ },
+ "node_modules/estree-util-visit": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz",
+ "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eta": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz",
+ "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/eta-dev/eta?sponsor=1"
+ }
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/eval": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz",
+ "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==",
+ "dependencies": {
+ "@types/node": "*",
+ "require-like": ">= 0.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+ "license": "MIT"
+ },
+ "node_modules/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/express": {
+ "version": "4.22.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz",
+ "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.8",
+ "array-flatten": "1.1.1",
+ "body-parser": "~1.20.3",
+ "content-disposition": "~0.5.4",
+ "content-type": "~1.0.4",
+ "cookie": "~0.7.1",
+ "cookie-signature": "~1.0.6",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "~1.3.1",
+ "fresh": "~0.5.2",
+ "http-errors": "~2.0.0",
+ "merge-descriptors": "1.0.3",
+ "methods": "~1.1.2",
+ "on-finished": "~2.4.1",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "~0.1.12",
+ "proxy-addr": "~2.0.7",
+ "qs": "~6.14.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.2.1",
+ "send": "~0.19.0",
+ "serve-static": "~1.16.2",
+ "setprototypeof": "1.2.0",
+ "statuses": "~2.0.1",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/express/node_modules/content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/express/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/express/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/express/node_modules/path-to-regexp": {
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
+ "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
+ "license": "MIT"
+ },
+ "node_modules/express/node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "license": "MIT"
+ },
+ "node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+ "license": "MIT",
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/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==",
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/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==",
+ "license": "MIT"
+ },
+ "node_modules/fast-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz",
+ "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/fastq": {
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
+ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fault": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz",
+ "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==",
+ "license": "MIT",
+ "dependencies": {
+ "format": "^0.2.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/faye-websocket": {
+ "version": "0.11.4",
+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
+ "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "websocket-driver": ">=0.5.1"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/feed": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz",
+ "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==",
+ "license": "MIT",
+ "dependencies": {
+ "xml-js": "^1.6.11"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/figures": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+ "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/figures/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/file-loader": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz",
+ "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==",
+ "license": "MIT",
+ "dependencies": {
+ "loader-utils": "^2.0.0",
+ "schema-utils": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.0.0 || ^5.0.0"
+ }
+ },
+ "node_modules/file-loader/node_modules/ajv": {
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz",
+ "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/file-loader/node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/file-loader/node_modules/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==",
+ "license": "MIT"
+ },
+ "node_modules/file-loader/node_modules/schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz",
+ "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.4.1",
+ "parseurl": "~1.3.3",
+ "statuses": "~2.0.2",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/finalhandler/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/finalhandler/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/find-cache-dir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz",
+ "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==",
+ "license": "MIT",
+ "dependencies": {
+ "common-path-prefix": "^3.0.0",
+ "pkg-dir": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz",
+ "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^7.1.0",
+ "path-exists": "^5.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "license": "BSD-3-Clause",
+ "bin": {
+ "flat": "cli.js"
+ }
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.11",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
+ "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/form-data-encoder": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz",
+ "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.17"
+ }
+ },
+ "node_modules/format": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz",
+ "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==",
+ "engines": {
+ "node": ">=0.4.x"
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "5.3.4",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz",
+ "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "11.3.3",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz",
+ "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-own-enumerable-property-symbols": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
+ "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==",
+ "license": "ISC"
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/github-slugger": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz",
+ "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==",
+ "license": "ISC"
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/glob-to-regex.js": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz",
+ "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/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==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/global-dirs": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz",
+ "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==",
+ "license": "MIT",
+ "dependencies": {
+ "ini": "2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "license": "MIT",
+ "dependencies": {
+ "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"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/got": {
+ "version": "12.6.1",
+ "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz",
+ "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@sindresorhus/is": "^5.2.0",
+ "@szmarczak/http-timer": "^5.0.1",
+ "cacheable-lookup": "^7.0.0",
+ "cacheable-request": "^10.2.8",
+ "decompress-response": "^6.0.0",
+ "form-data-encoder": "^2.1.2",
+ "get-stream": "^6.0.1",
+ "http2-wrapper": "^2.1.10",
+ "lowercase-keys": "^3.0.0",
+ "p-cancelable": "^3.0.0",
+ "responselike": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/got?sponsor=1"
+ }
+ },
+ "node_modules/got/node_modules/@sindresorhus/is": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz",
+ "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/is?sponsor=1"
+ }
+ },
+ "node_modules/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==",
+ "license": "ISC"
+ },
+ "node_modules/gray-matter": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz",
+ "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==",
+ "license": "MIT",
+ "dependencies": {
+ "js-yaml": "^3.13.1",
+ "kind-of": "^6.0.2",
+ "section-matter": "^1.0.0",
+ "strip-bom-string": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/gray-matter/node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "license": "MIT",
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/gray-matter/node_modules/js-yaml": {
+ "version": "3.14.2",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz",
+ "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==",
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/gzip-size": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz",
+ "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "duplexer": "^0.1.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/hachure-fill": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz",
+ "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==",
+ "license": "MIT"
+ },
+ "node_modules/handle-thing": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
+ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
+ "license": "MIT"
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-yarn": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz",
+ "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/hast-util-from-dom": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-5.0.1.tgz",
+ "integrity": "sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==",
+ "license": "ISC",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hastscript": "^9.0.0",
+ "web-namespaces": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-from-html": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz",
+ "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "devlop": "^1.1.0",
+ "hast-util-from-parse5": "^8.0.0",
+ "parse5": "^7.0.0",
+ "vfile": "^6.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-from-html-isomorphic": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-2.0.0.tgz",
+ "integrity": "sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-from-dom": "^5.0.0",
+ "hast-util-from-html": "^2.0.0",
+ "unist-util-remove-position": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-from-parse5": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz",
+ "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "devlop": "^1.0.0",
+ "hastscript": "^9.0.0",
+ "property-information": "^7.0.0",
+ "vfile": "^6.0.0",
+ "vfile-location": "^5.0.0",
+ "web-namespaces": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-is-element": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz",
+ "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-parse-selector": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz",
+ "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-raw": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz",
+ "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "@ungap/structured-clone": "^1.0.0",
+ "hast-util-from-parse5": "^8.0.0",
+ "hast-util-to-parse5": "^8.0.0",
+ "html-void-elements": "^3.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "parse5": "^7.0.0",
+ "unist-util-position": "^5.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0",
+ "web-namespaces": "^2.0.0",
+ "zwitch": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-estree": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz",
+ "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-attach-comments": "^3.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "mdast-util-mdx-expression": "^2.0.0",
+ "mdast-util-mdx-jsx": "^3.0.0",
+ "mdast-util-mdxjs-esm": "^2.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "style-to-js": "^1.0.0",
+ "unist-util-position": "^5.0.0",
+ "zwitch": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-jsx-runtime": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz",
+ "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "mdast-util-mdx-expression": "^2.0.0",
+ "mdast-util-mdx-jsx": "^3.0.0",
+ "mdast-util-mdxjs-esm": "^2.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "style-to-js": "^1.0.0",
+ "unist-util-position": "^5.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-parse5": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz",
+ "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "devlop": "^1.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "web-namespaces": "^2.0.0",
+ "zwitch": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-text": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz",
+ "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "hast-util-is-element": "^3.0.0",
+ "unist-util-find-after": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-whitespace": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
+ "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hastscript": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz",
+ "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "hast-util-parse-selector": "^4.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "license": "MIT",
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/history": {
+ "version": "4.10.1",
+ "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz",
+ "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.1.2",
+ "loose-envify": "^1.2.0",
+ "resolve-pathname": "^3.0.0",
+ "tiny-invariant": "^1.0.2",
+ "tiny-warning": "^1.0.0",
+ "value-equal": "^1.0.1"
+ }
+ },
+ "node_modules/hoist-non-react-statics": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "react-is": "^16.7.0"
+ }
+ },
+ "node_modules/hpack.js": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
+ "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "obuf": "^1.0.0",
+ "readable-stream": "^2.0.1",
+ "wbuf": "^1.1.0"
+ }
+ },
+ "node_modules/hpack.js/node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "license": "MIT"
+ },
+ "node_modules/hpack.js/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/hpack.js/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "license": "MIT"
+ },
+ "node_modules/hpack.js/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "license": "MIT"
+ },
+ "node_modules/html-minifier-terser": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz",
+ "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==",
+ "license": "MIT",
+ "dependencies": {
+ "camel-case": "^4.1.2",
+ "clean-css": "~5.3.2",
+ "commander": "^10.0.0",
+ "entities": "^4.4.0",
+ "param-case": "^3.0.4",
+ "relateurl": "^0.2.7",
+ "terser": "^5.15.1"
+ },
+ "bin": {
+ "html-minifier-terser": "cli.js"
+ },
+ "engines": {
+ "node": "^14.13.1 || >=16.0.0"
+ }
+ },
+ "node_modules/html-minifier-terser/node_modules/commander": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
+ "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/html-tags": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz",
+ "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/html-void-elements": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz",
+ "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/html-webpack-plugin": {
+ "version": "5.6.6",
+ "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.6.tgz",
+ "integrity": "sha512-bLjW01UTrvoWTJQL5LsMRo1SypHW80FTm12OJRSnr3v6YHNhfe+1r0MYUZJMACxnCHURVnBWRwAsWs2yPU9Ezw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/html-minifier-terser": "^6.0.0",
+ "html-minifier-terser": "^6.0.2",
+ "lodash": "^4.17.21",
+ "pretty-error": "^4.0.0",
+ "tapable": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/html-webpack-plugin"
+ },
+ "peerDependencies": {
+ "@rspack/core": "0.x || 1.x",
+ "webpack": "^5.20.0"
+ },
+ "peerDependenciesMeta": {
+ "@rspack/core": {
+ "optional": true
+ },
+ "webpack": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/html-webpack-plugin/node_modules/commander": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
+ "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==",
+ "license": "MIT",
+ "dependencies": {
+ "camel-case": "^4.1.2",
+ "clean-css": "^5.2.2",
+ "commander": "^8.3.0",
+ "he": "^1.2.0",
+ "param-case": "^3.0.4",
+ "relateurl": "^0.2.7",
+ "terser": "^5.10.0"
+ },
+ "bin": {
+ "html-minifier-terser": "cli.js"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/htmlparser2": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz",
+ "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==",
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1",
+ "entities": "^4.4.0"
+ }
+ },
+ "node_modules/http-cache-semantics": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
+ "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/http-deceiver": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
+ "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==",
+ "license": "MIT"
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~2.0.0",
+ "inherits": "~2.0.4",
+ "setprototypeof": "~1.2.0",
+ "statuses": "~2.0.2",
+ "toidentifier": "~1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/http-parser-js": {
+ "version": "0.5.10",
+ "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz",
+ "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==",
+ "license": "MIT"
+ },
+ "node_modules/http-proxy": {
+ "version": "1.18.1",
+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
+ "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+ "license": "MIT",
+ "dependencies": {
+ "eventemitter3": "^4.0.0",
+ "follow-redirects": "^1.0.0",
+ "requires-port": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/http-proxy-middleware": {
+ "version": "2.0.9",
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz",
+ "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/http-proxy": "^1.17.8",
+ "http-proxy": "^1.18.1",
+ "is-glob": "^4.0.1",
+ "is-plain-obj": "^3.0.0",
+ "micromatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "@types/express": "^4.17.13"
+ },
+ "peerDependenciesMeta": {
+ "@types/express": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/http-proxy-middleware/node_modules/is-plain-obj": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
+ "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/http2-wrapper": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz",
+ "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "quick-lru": "^5.1.1",
+ "resolve-alpn": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=10.19.0"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/hyperdyperid": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz",
+ "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.18"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/icss-utils": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
+ "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
+ "license": "ISC",
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/image-size": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz",
+ "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==",
+ "license": "MIT",
+ "bin": {
+ "image-size": "bin/image-size.js"
+ },
+ "engines": {
+ "node": ">=16.x"
+ }
+ },
+ "node_modules/immediate": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz",
+ "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==",
+ "license": "MIT"
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-lazy": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
+ "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/infima": {
+ "version": "0.2.0-alpha.45",
+ "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.45.tgz",
+ "integrity": "sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
+ },
+ "node_modules/ini": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
+ "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/inline-style-parser": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz",
+ "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==",
+ "license": "MIT"
+ },
+ "node_modules/internmap": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
+ "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "node_modules/ipaddr.js": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz",
+ "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/is-alphabetical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz",
+ "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-alphanumerical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz",
+ "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==",
+ "license": "MIT",
+ "dependencies": {
+ "is-alphabetical": "^2.0.0",
+ "is-decimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "license": "MIT"
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "license": "MIT",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-ci": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz",
+ "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ci-info": "^3.2.0"
+ },
+ "bin": {
+ "is-ci": "bin.js"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-decimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz",
+ "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "license": "MIT",
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-hexadecimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz",
+ "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-inside-container": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
+ "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
+ "license": "MIT",
+ "dependencies": {
+ "is-docker": "^3.0.0"
+ },
+ "bin": {
+ "is-inside-container": "cli.js"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-inside-container/node_modules/is-docker": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
+ "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
+ "license": "MIT",
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-installed-globally": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
+ "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "global-dirs": "^3.0.0",
+ "is-path-inside": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-network-error": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.0.tgz",
+ "integrity": "sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-npm": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.1.0.tgz",
+ "integrity": "sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+ "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
+ "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "license": "MIT",
+ "dependencies": {
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-regexp": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
+ "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+ "license": "MIT"
+ },
+ "node_modules/is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "license": "MIT",
+ "dependencies": {
+ "is-docker": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-yarn-global": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz",
+ "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
+ "license": "MIT"
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "license": "ISC"
+ },
+ "node_modules/isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/jest-util": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
+ "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-worker": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz",
+ "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "jest-util": "^29.7.0",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "1.21.7",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
+ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
+ "license": "MIT",
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
+ "node_modules/joi": {
+ "version": "17.13.3",
+ "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz",
+ "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@hapi/hoek": "^9.3.0",
+ "@hapi/topo": "^5.1.0",
+ "@sideway/address": "^4.1.5",
+ "@sideway/formula": "^3.0.1",
+ "@sideway/pinpoint": "^2.0.0"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "license": "MIT"
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "license": "MIT"
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonfile": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
+ "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
+ "license": "MIT",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/katex": {
+ "version": "0.16.28",
+ "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.28.tgz",
+ "integrity": "sha512-YHzO7721WbmAL6Ov1uzN/l5mY5WWWhJBSW+jq4tkfZfsxmo1hu6frS0EOswvjBUnWE6NtjEs48SFn5CQESRLZg==",
+ "funding": [
+ "https://opencollective.com/katex",
+ "https://github.com/sponsors/katex"
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "commander": "^8.3.0"
+ },
+ "bin": {
+ "katex": "cli.js"
+ }
+ },
+ "node_modules/katex/node_modules/commander": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/khroma": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz",
+ "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw=="
+ },
+ "node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/klaw-sync": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz",
+ "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.1.11"
+ }
+ },
+ "node_modules/kleur": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/langium": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/langium/-/langium-4.2.1.tgz",
+ "integrity": "sha512-zu9QWmjpzJcomzdJQAHgDVhLGq5bLosVak1KVa40NzQHXfqr4eAHupvnPOVXEoLkg6Ocefvf/93d//SB7du4YQ==",
+ "license": "MIT",
+ "dependencies": {
+ "chevrotain": "~11.1.1",
+ "chevrotain-allstar": "~0.3.1",
+ "vscode-languageserver": "~9.0.1",
+ "vscode-languageserver-textdocument": "~1.0.11",
+ "vscode-uri": "~3.1.0"
+ },
+ "engines": {
+ "node": ">=20.10.0",
+ "npm": ">=10.2.3"
+ }
+ },
+ "node_modules/latest-version": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz",
+ "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==",
+ "license": "MIT",
+ "dependencies": {
+ "package-json": "^8.1.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/launch-editor": {
+ "version": "2.13.0",
+ "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.13.0.tgz",
+ "integrity": "sha512-u+9asUHMJ99lA15VRMXw5XKfySFR9dGXwgsgS14YTbUq3GITP58mIM32At90P5fZ+MUId5Yw+IwI/yKub7jnCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "picocolors": "^1.1.1",
+ "shell-quote": "^1.8.3"
+ }
+ },
+ "node_modules/layout-base": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz",
+ "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==",
+ "license": "MIT"
+ },
+ "node_modules/leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "license": "MIT"
+ },
+ "node_modules/loader-runner": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz",
+ "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.11.5"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/loader-utils": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+ "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+ "license": "MIT",
+ "dependencies": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=8.9.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz",
+ "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^6.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.23",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
+ "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==",
+ "license": "MIT"
+ },
+ "node_modules/lodash-es": {
+ "version": "4.17.23",
+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz",
+ "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.memoize": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.uniq": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
+ "license": "MIT"
+ },
+ "node_modules/longest-streak": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
+ "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/lowercase-keys": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz",
+ "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/lunr": {
+ "version": "2.3.9",
+ "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz",
+ "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==",
+ "license": "MIT"
+ },
+ "node_modules/lunr-languages": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/lunr-languages/-/lunr-languages-1.14.0.tgz",
+ "integrity": "sha512-hWUAb2KqM3L7J5bcrngszzISY4BxrXn/Xhbb9TTCJYEGqlR1nG67/M14sp09+PTIRklobrn57IAxcdcO/ZFyNA==",
+ "license": "MPL-1.1"
+ },
+ "node_modules/mark.js": {
+ "version": "8.11.1",
+ "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz",
+ "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==",
+ "license": "MIT"
+ },
+ "node_modules/markdown-extensions": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz",
+ "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/markdown-table": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz",
+ "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/marked": {
+ "version": "16.4.2",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz",
+ "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==",
+ "license": "MIT",
+ "bin": {
+ "marked": "bin/marked.js"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/mdast-util-directive": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz",
+ "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "ccount": "^2.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "parse-entities": "^4.0.0",
+ "stringify-entities": "^4.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-find-and-replace": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz",
+ "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "escape-string-regexp": "^5.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mdast-util-from-markdown": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz",
+ "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark": "^4.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/mdast-util-frontmatter": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz",
+ "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "escape-string-regexp": "^5.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "micromark-extension-frontmatter": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mdast-util-gfm": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz",
+ "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==",
+ "license": "MIT",
+ "dependencies": {
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-gfm-autolink-literal": "^2.0.0",
+ "mdast-util-gfm-footnote": "^2.0.0",
+ "mdast-util-gfm-strikethrough": "^2.0.0",
+ "mdast-util-gfm-table": "^2.0.0",
+ "mdast-util-gfm-task-list-item": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-autolink-literal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz",
+ "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "ccount": "^2.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-find-and-replace": "^3.0.0",
+ "micromark-util-character": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/mdast-util-gfm-footnote": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz",
+ "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.1.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-strikethrough": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz",
+ "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-table": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz",
+ "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "markdown-table": "^3.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-task-list-item": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz",
+ "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-math": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-math/-/mdast-util-math-3.0.0.tgz",
+ "integrity": "sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "longest-streak": "^3.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.1.0",
+ "unist-util-remove-position": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz",
+ "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==",
+ "license": "MIT",
+ "dependencies": {
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-mdx-expression": "^2.0.0",
+ "mdast-util-mdx-jsx": "^3.0.0",
+ "mdast-util-mdxjs-esm": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx-expression": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz",
+ "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx-jsx": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz",
+ "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "ccount": "^2.0.0",
+ "devlop": "^1.1.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "parse-entities": "^4.0.0",
+ "stringify-entities": "^4.0.0",
+ "unist-util-stringify-position": "^4.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdxjs-esm": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz",
+ "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-phrasing": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz",
+ "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-hast": {
+ "version": "13.2.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz",
+ "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@ungap/structured-clone": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "trim-lines": "^3.0.0",
+ "unist-util-position": "^5.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-markdown": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz",
+ "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "longest-streak": "^3.0.0",
+ "mdast-util-phrasing": "^4.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "unist-util-visit": "^5.0.0",
+ "zwitch": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdn-data": {
+ "version": "2.0.30",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
+ "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/memfs": {
+ "version": "4.56.10",
+ "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.56.10.tgz",
+ "integrity": "sha512-eLvzyrwqLHnLYalJP7YZ3wBe79MXktMdfQbvMrVD80K+NhrIukCVBvgP30zTJYEEDh9hZ/ep9z0KOdD7FSHo7w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jsonjoy.com/fs-core": "4.56.10",
+ "@jsonjoy.com/fs-fsa": "4.56.10",
+ "@jsonjoy.com/fs-node": "4.56.10",
+ "@jsonjoy.com/fs-node-builtins": "4.56.10",
+ "@jsonjoy.com/fs-node-to-fsa": "4.56.10",
+ "@jsonjoy.com/fs-node-utils": "4.56.10",
+ "@jsonjoy.com/fs-print": "4.56.10",
+ "@jsonjoy.com/fs-snapshot": "4.56.10",
+ "@jsonjoy.com/json-pack": "^1.11.0",
+ "@jsonjoy.com/util": "^1.9.0",
+ "glob-to-regex.js": "^1.0.1",
+ "thingies": "^2.5.0",
+ "tree-dump": "^1.0.3",
+ "tslib": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/merge-descriptors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "license": "MIT"
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/mermaid": {
+ "version": "11.12.3",
+ "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.12.3.tgz",
+ "integrity": "sha512-wN5ZSgJQIC+CHJut9xaKWsknLxaFBwCPwPkGTSUYrTiHORWvpT8RxGk849HPnpUAQ+/9BPRqYb80jTpearrHzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@braintree/sanitize-url": "^7.1.1",
+ "@iconify/utils": "^3.0.1",
+ "@mermaid-js/parser": "^1.0.0",
+ "@types/d3": "^7.4.3",
+ "cytoscape": "^3.29.3",
+ "cytoscape-cose-bilkent": "^4.1.0",
+ "cytoscape-fcose": "^2.2.0",
+ "d3": "^7.9.0",
+ "d3-sankey": "^0.12.3",
+ "dagre-d3-es": "7.0.13",
+ "dayjs": "^1.11.18",
+ "dompurify": "^3.2.5",
+ "katex": "^0.16.22",
+ "khroma": "^2.1.0",
+ "lodash-es": "^4.17.23",
+ "marked": "^16.2.1",
+ "roughjs": "^4.6.6",
+ "stylis": "^4.3.6",
+ "ts-dedent": "^2.2.0",
+ "uuid": "^11.1.0"
+ }
+ },
+ "node_modules/mermaid/node_modules/uuid": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz",
+ "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/esm/bin/uuid"
+ }
+ },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/micromark": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz",
+ "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/debug": "^4.0.0",
+ "debug": "^4.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-core-commonmark": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz",
+ "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-factory-destination": "^2.0.0",
+ "micromark-factory-label": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-factory-title": "^2.0.0",
+ "micromark-factory-whitespace": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-html-tag-name": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-core-commonmark/node_modules/micromark-factory-space": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
+ "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-extension-directive": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz",
+ "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-factory-whitespace": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "parse-entities": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
+ "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-directive/node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-extension-frontmatter": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz",
+ "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==",
+ "license": "MIT",
+ "dependencies": {
+ "fault": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-extension-gfm": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz",
+ "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-extension-gfm-autolink-literal": "^2.0.0",
+ "micromark-extension-gfm-footnote": "^2.0.0",
+ "micromark-extension-gfm-strikethrough": "^2.0.0",
+ "micromark-extension-gfm-table": "^2.0.0",
+ "micromark-extension-gfm-tagfilter": "^2.0.0",
+ "micromark-extension-gfm-task-list-item": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-autolink-literal": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz",
+ "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-extension-gfm-footnote": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz",
+ "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
+ "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-extension-gfm-strikethrough": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz",
+ "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-extension-gfm-table": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz",
+ "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
+ "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-extension-gfm-tagfilter": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz",
+ "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-task-list-item": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz",
+ "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
+ "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-extension-math": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz",
+ "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/katex": "^0.16.0",
+ "devlop": "^1.0.0",
+ "katex": "^0.16.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-math/node_modules/micromark-factory-space": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
+ "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-math/node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-math/node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-extension-mdx-expression": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz",
+ "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-factory-mdx-expression": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-events-to-acorn": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
+ "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-extension-mdx-jsx": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz",
+ "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "micromark-factory-mdx-expression": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-events-to-acorn": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
+ "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-extension-mdx-md": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz",
+ "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-mdxjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz",
+ "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==",
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.0.0",
+ "acorn-jsx": "^5.0.0",
+ "micromark-extension-mdx-expression": "^3.0.0",
+ "micromark-extension-mdx-jsx": "^3.0.0",
+ "micromark-extension-mdx-md": "^2.0.0",
+ "micromark-extension-mdxjs-esm": "^3.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-mdxjs-esm": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz",
+ "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-events-to-acorn": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-position-from-estree": "^2.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-factory-destination": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz",
+ "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-destination/node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-factory-label": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz",
+ "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-label/node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-factory-mdx-expression": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz",
+ "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-events-to-acorn": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-position-from-estree": "^2.0.0",
+ "vfile-message": "^4.0.0"
+ }
+ },
+ "node_modules/micromark-factory-mdx-expression/node_modules/micromark-factory-space": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
+ "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-factory-space": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz",
+ "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^1.0.0",
+ "micromark-util-types": "^1.0.0"
+ }
+ },
+ "node_modules/micromark-factory-space/node_modules/micromark-util-types": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz",
+ "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-factory-title": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz",
+ "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-title/node_modules/micromark-factory-space": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
+ "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-title/node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-factory-whitespace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz",
+ "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
+ "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-character": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz",
+ "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^1.0.0",
+ "micromark-util-types": "^1.0.0"
+ }
+ },
+ "node_modules/micromark-util-character/node_modules/micromark-util-types": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz",
+ "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-chunked": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz",
+ "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-classify-character": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz",
+ "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-combine-extensions": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz",
+ "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-decode-numeric-character-reference": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz",
+ "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-decode-string": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz",
+ "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "decode-named-character-reference": "^1.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-encode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
+ "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-events-to-acorn": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz",
+ "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/unist": "^3.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-visit": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "vfile-message": "^4.0.0"
+ }
+ },
+ "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-html-tag-name": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz",
+ "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-normalize-identifier": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz",
+ "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-resolve-all": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz",
+ "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-sanitize-uri": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
+ "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-subtokenize": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz",
+ "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-symbol": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz",
+ "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-types": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz",
+ "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark/node_modules/micromark-factory-space": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
+ "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark/node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark/node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
+ "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.18",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
+ "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "~1.33.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/mimic-response": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz",
+ "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mini-css-extract-plugin": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.0.tgz",
+ "integrity": "sha512-540P2c5dYnJlyJxTaSloliZexv8rji6rY8FhQN+WF/82iHQfA23j/xtJx97L+mXOML27EqksSek/g4eK7jaL3g==",
+ "license": "MIT",
+ "dependencies": {
+ "schema-utils": "^4.0.0",
+ "tapable": "^2.2.1"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+ "license": "ISC"
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/mlly": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz",
+ "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==",
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.15.0",
+ "pathe": "^2.0.3",
+ "pkg-types": "^1.3.1",
+ "ufo": "^1.6.1"
+ }
+ },
+ "node_modules/mrmime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz",
+ "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/multicast-dns": {
+ "version": "7.2.5",
+ "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz",
+ "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==",
+ "license": "MIT",
+ "dependencies": {
+ "dns-packet": "^5.2.2",
+ "thunky": "^1.0.2"
+ },
+ "bin": {
+ "multicast-dns": "cli.js"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/negotiator": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
+ "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "license": "MIT"
+ },
+ "node_modules/no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "license": "MIT",
+ "dependencies": {
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/node-emoji": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz",
+ "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==",
+ "license": "MIT",
+ "dependencies": {
+ "@sindresorhus/is": "^4.6.0",
+ "char-regex": "^1.0.2",
+ "emojilib": "^2.4.0",
+ "skin-tone": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.27",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
+ "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-url": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz",
+ "integrity": "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nprogress": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz",
+ "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==",
+ "license": "MIT"
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/null-loader": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz",
+ "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==",
+ "license": "MIT",
+ "dependencies": {
+ "loader-utils": "^2.0.0",
+ "schema-utils": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.0.0 || ^5.0.0"
+ }
+ },
+ "node_modules/null-loader/node_modules/ajv": {
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz",
+ "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/null-loader/node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/null-loader/node_modules/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==",
+ "license": "MIT"
+ },
+ "node_modules/null-loader/node_modules/schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
+ "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/obuf": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
+ "license": "MIT"
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "license": "MIT",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/on-headers": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz",
+ "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "license": "MIT",
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/open": {
+ "version": "8.4.2",
+ "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
+ "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
+ "license": "MIT",
+ "dependencies": {
+ "define-lazy-prop": "^2.0.0",
+ "is-docker": "^2.1.1",
+ "is-wsl": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/opener": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz",
+ "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==",
+ "license": "(WTFPL OR MIT)",
+ "bin": {
+ "opener": "bin/opener-bin.js"
+ }
+ },
+ "node_modules/p-cancelable": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz",
+ "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20"
+ }
+ },
+ "node_modules/p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
+ "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^1.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz",
+ "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==",
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-map": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+ "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+ "license": "MIT",
+ "dependencies": {
+ "aggregate-error": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-queue": {
+ "version": "6.6.2",
+ "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz",
+ "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==",
+ "license": "MIT",
+ "dependencies": {
+ "eventemitter3": "^4.0.4",
+ "p-timeout": "^3.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-retry": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz",
+ "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/retry": "0.12.2",
+ "is-network-error": "^1.0.0",
+ "retry": "^0.13.1"
+ },
+ "engines": {
+ "node": ">=16.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-timeout": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz",
+ "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==",
+ "license": "MIT",
+ "dependencies": {
+ "p-finally": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/package-json": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz",
+ "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==",
+ "license": "MIT",
+ "dependencies": {
+ "got": "^12.1.0",
+ "registry-auth-token": "^5.0.1",
+ "registry-url": "^6.0.0",
+ "semver": "^7.3.7"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/package-manager-detector": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz",
+ "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==",
+ "license": "MIT"
+ },
+ "node_modules/param-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
+ "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
+ "license": "MIT",
+ "dependencies": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-entities": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz",
+ "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "character-entities-legacy": "^3.0.0",
+ "character-reference-invalid": "^2.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "is-alphanumerical": "^2.0.0",
+ "is-decimal": "^2.0.0",
+ "is-hexadecimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/parse-entities/node_modules/@types/unist": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
+ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
+ "license": "MIT"
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parse-numeric-range": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz",
+ "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==",
+ "license": "ISC"
+ },
+ "node_modules/parse5": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
+ "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==",
+ "license": "MIT",
+ "dependencies": {
+ "entities": "^6.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/parse5-htmlparser2-tree-adapter": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz",
+ "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==",
+ "license": "MIT",
+ "dependencies": {
+ "domhandler": "^5.0.3",
+ "parse5": "^7.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/parse5-parser-stream": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz",
+ "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==",
+ "license": "MIT",
+ "dependencies": {
+ "parse5": "^7.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/parse5/node_modules/entities": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
+ "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/pascal-case": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
+ "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
+ "license": "MIT",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/path-data-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz",
+ "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==",
+ "license": "MIT"
+ },
+ "node_modules/path-exists": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
+ "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ }
+ },
+ "node_modules/path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==",
+ "license": "(WTFPL OR MIT)"
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "license": "MIT"
+ },
+ "node_modules/path-to-regexp": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz",
+ "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==",
+ "license": "MIT",
+ "dependencies": {
+ "isarray": "0.0.1"
+ }
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pathe": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
+ "license": "MIT"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pkg-dir": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz",
+ "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==",
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pkg-types": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
+ "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "confbox": "^0.1.8",
+ "mlly": "^1.7.4",
+ "pathe": "^2.0.1"
+ }
+ },
+ "node_modules/pkijs": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.3.3.tgz",
+ "integrity": "sha512-+KD8hJtqQMYoTuL1bbGOqxb4z+nZkTAwVdNtWwe8Tc2xNbEmdJYIYoc6Qt0uF55e6YW6KuTHw1DjQ18gMhzepw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@noble/hashes": "1.4.0",
+ "asn1js": "^3.0.6",
+ "bytestreamjs": "^2.0.1",
+ "pvtsutils": "^1.3.6",
+ "pvutils": "^1.1.3",
+ "tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/points-on-curve": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz",
+ "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==",
+ "license": "MIT"
+ },
+ "node_modules/points-on-path": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz",
+ "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==",
+ "license": "MIT",
+ "dependencies": {
+ "path-data-parser": "0.1.0",
+ "points-on-curve": "0.2.0"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.6",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-attribute-case-insensitive": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz",
+ "integrity": "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz",
+ "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-calc": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz",
+ "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.11",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.2"
+ }
+ },
+ "node_modules/postcss-clamp": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz",
+ "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=7.6.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.6"
+ }
+ },
+ "node_modules/postcss-color-functional-notation": {
+ "version": "7.0.12",
+ "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.12.tgz",
+ "integrity": "sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-color-parser": "^3.1.0",
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4",
+ "@csstools/postcss-progressive-custom-properties": "^4.2.1",
+ "@csstools/utilities": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-color-hex-alpha": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz",
+ "integrity": "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@csstools/utilities": "^2.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-color-rebeccapurple": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz",
+ "integrity": "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/utilities": "^2.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-colormin": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz",
+ "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.23.0",
+ "caniuse-api": "^3.0.0",
+ "colord": "^2.9.3",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-convert-values": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz",
+ "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.23.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-custom-media": {
+ "version": "11.0.6",
+ "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz",
+ "integrity": "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@csstools/cascade-layer-name-parser": "^2.0.5",
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4",
+ "@csstools/media-query-list-parser": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-custom-properties": {
+ "version": "14.0.6",
+ "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz",
+ "integrity": "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@csstools/cascade-layer-name-parser": "^2.0.5",
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4",
+ "@csstools/utilities": "^2.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-custom-selectors": {
+ "version": "8.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz",
+ "integrity": "sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@csstools/cascade-layer-name-parser": "^2.0.5",
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4",
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz",
+ "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-dir-pseudo-class": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz",
+ "integrity": "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz",
+ "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-discard-comments": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz",
+ "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-discard-duplicates": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz",
+ "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-discard-empty": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz",
+ "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-discard-overridden": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz",
+ "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-discard-unused": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz",
+ "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.16"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-double-position-gradients": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.4.tgz",
+ "integrity": "sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/postcss-progressive-custom-properties": "^4.2.1",
+ "@csstools/utilities": "^2.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-focus-visible": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz",
+ "integrity": "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz",
+ "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-focus-within": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz",
+ "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz",
+ "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-font-variant": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz",
+ "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-gap-properties": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz",
+ "integrity": "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-image-set-function": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz",
+ "integrity": "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/utilities": "^2.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-lab-function": {
+ "version": "7.0.12",
+ "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.12.tgz",
+ "integrity": "sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-color-parser": "^3.1.0",
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4",
+ "@csstools/postcss-progressive-custom-properties": "^4.2.1",
+ "@csstools/utilities": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-loader": {
+ "version": "7.3.4",
+ "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz",
+ "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==",
+ "license": "MIT",
+ "dependencies": {
+ "cosmiconfig": "^8.3.5",
+ "jiti": "^1.20.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">= 14.15.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "postcss": "^7.0.0 || ^8.0.1",
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/postcss-logical": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz",
+ "integrity": "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-merge-idents": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz",
+ "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==",
+ "license": "MIT",
+ "dependencies": {
+ "cssnano-utils": "^4.0.2",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-merge-longhand": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz",
+ "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0",
+ "stylehacks": "^6.1.1"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-merge-rules": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz",
+ "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.23.0",
+ "caniuse-api": "^3.0.0",
+ "cssnano-utils": "^4.0.2",
+ "postcss-selector-parser": "^6.0.16"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-minify-font-values": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz",
+ "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-minify-gradients": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz",
+ "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==",
+ "license": "MIT",
+ "dependencies": {
+ "colord": "^2.9.3",
+ "cssnano-utils": "^4.0.2",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-minify-params": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz",
+ "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.23.0",
+ "cssnano-utils": "^4.0.2",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-minify-selectors": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz",
+ "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.16"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-modules-extract-imports": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz",
+ "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==",
+ "license": "ISC",
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-local-by-default": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz",
+ "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==",
+ "license": "MIT",
+ "dependencies": {
+ "icss-utils": "^5.0.0",
+ "postcss-selector-parser": "^7.0.0",
+ "postcss-value-parser": "^4.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz",
+ "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-modules-scope": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz",
+ "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==",
+ "license": "ISC",
+ "dependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz",
+ "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-modules-values": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+ "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+ "license": "ISC",
+ "dependencies": {
+ "icss-utils": "^5.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-nesting": {
+ "version": "13.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz",
+ "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/selector-resolve-nested": "^3.1.0",
+ "@csstools/selector-specificity": "^5.0.0",
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz",
+ "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ }
+ },
+ "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz",
+ "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ }
+ },
+ "node_modules/postcss-nesting/node_modules/postcss-selector-parser": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz",
+ "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-normalize-charset": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz",
+ "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-normalize-display-values": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz",
+ "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-normalize-positions": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz",
+ "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-normalize-repeat-style": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz",
+ "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-normalize-string": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz",
+ "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-normalize-timing-functions": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz",
+ "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-normalize-unicode": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz",
+ "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.23.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-normalize-url": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz",
+ "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-normalize-whitespace": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz",
+ "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-opacity-percentage": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz",
+ "integrity": "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==",
+ "funding": [
+ {
+ "type": "kofi",
+ "url": "https://ko-fi.com/mrcgrtz"
+ },
+ {
+ "type": "liberapay",
+ "url": "https://liberapay.com/mrcgrtz"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-ordered-values": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz",
+ "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "cssnano-utils": "^4.0.2",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-overflow-shorthand": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz",
+ "integrity": "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-page-break": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz",
+ "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "postcss": "^8"
+ }
+ },
+ "node_modules/postcss-place": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz",
+ "integrity": "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-preset-env": {
+ "version": "10.6.1",
+ "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.6.1.tgz",
+ "integrity": "sha512-yrk74d9EvY+W7+lO9Aj1QmjWY9q5NsKjK2V9drkOPZB/X6KZ0B3igKsHUYakb7oYVhnioWypQX3xGuePf89f3g==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/postcss-alpha-function": "^1.0.1",
+ "@csstools/postcss-cascade-layers": "^5.0.2",
+ "@csstools/postcss-color-function": "^4.0.12",
+ "@csstools/postcss-color-function-display-p3-linear": "^1.0.1",
+ "@csstools/postcss-color-mix-function": "^3.0.12",
+ "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.2",
+ "@csstools/postcss-content-alt-text": "^2.0.8",
+ "@csstools/postcss-contrast-color-function": "^2.0.12",
+ "@csstools/postcss-exponential-functions": "^2.0.9",
+ "@csstools/postcss-font-format-keywords": "^4.0.0",
+ "@csstools/postcss-gamut-mapping": "^2.0.11",
+ "@csstools/postcss-gradients-interpolation-method": "^5.0.12",
+ "@csstools/postcss-hwb-function": "^4.0.12",
+ "@csstools/postcss-ic-unit": "^4.0.4",
+ "@csstools/postcss-initial": "^2.0.1",
+ "@csstools/postcss-is-pseudo-class": "^5.0.3",
+ "@csstools/postcss-light-dark-function": "^2.0.11",
+ "@csstools/postcss-logical-float-and-clear": "^3.0.0",
+ "@csstools/postcss-logical-overflow": "^2.0.0",
+ "@csstools/postcss-logical-overscroll-behavior": "^2.0.0",
+ "@csstools/postcss-logical-resize": "^3.0.0",
+ "@csstools/postcss-logical-viewport-units": "^3.0.4",
+ "@csstools/postcss-media-minmax": "^2.0.9",
+ "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.5",
+ "@csstools/postcss-nested-calc": "^4.0.0",
+ "@csstools/postcss-normalize-display-values": "^4.0.1",
+ "@csstools/postcss-oklab-function": "^4.0.12",
+ "@csstools/postcss-position-area-property": "^1.0.0",
+ "@csstools/postcss-progressive-custom-properties": "^4.2.1",
+ "@csstools/postcss-property-rule-prelude-list": "^1.0.0",
+ "@csstools/postcss-random-function": "^2.0.1",
+ "@csstools/postcss-relative-color-syntax": "^3.0.12",
+ "@csstools/postcss-scope-pseudo-class": "^4.0.1",
+ "@csstools/postcss-sign-functions": "^1.1.4",
+ "@csstools/postcss-stepped-value-functions": "^4.0.9",
+ "@csstools/postcss-syntax-descriptor-syntax-production": "^1.0.1",
+ "@csstools/postcss-system-ui-font-family": "^1.0.0",
+ "@csstools/postcss-text-decoration-shorthand": "^4.0.3",
+ "@csstools/postcss-trigonometric-functions": "^4.0.9",
+ "@csstools/postcss-unset-value": "^4.0.0",
+ "autoprefixer": "^10.4.23",
+ "browserslist": "^4.28.1",
+ "css-blank-pseudo": "^7.0.1",
+ "css-has-pseudo": "^7.0.3",
+ "css-prefers-color-scheme": "^10.0.0",
+ "cssdb": "^8.6.0",
+ "postcss-attribute-case-insensitive": "^7.0.1",
+ "postcss-clamp": "^4.1.0",
+ "postcss-color-functional-notation": "^7.0.12",
+ "postcss-color-hex-alpha": "^10.0.0",
+ "postcss-color-rebeccapurple": "^10.0.0",
+ "postcss-custom-media": "^11.0.6",
+ "postcss-custom-properties": "^14.0.6",
+ "postcss-custom-selectors": "^8.0.5",
+ "postcss-dir-pseudo-class": "^9.0.1",
+ "postcss-double-position-gradients": "^6.0.4",
+ "postcss-focus-visible": "^10.0.1",
+ "postcss-focus-within": "^9.0.1",
+ "postcss-font-variant": "^5.0.0",
+ "postcss-gap-properties": "^6.0.0",
+ "postcss-image-set-function": "^7.0.0",
+ "postcss-lab-function": "^7.0.12",
+ "postcss-logical": "^8.1.0",
+ "postcss-nesting": "^13.0.2",
+ "postcss-opacity-percentage": "^3.0.0",
+ "postcss-overflow-shorthand": "^6.0.0",
+ "postcss-page-break": "^3.0.4",
+ "postcss-place": "^10.0.0",
+ "postcss-pseudo-class-any-link": "^10.0.1",
+ "postcss-replace-overflow-wrap": "^4.0.0",
+ "postcss-selector-not": "^8.0.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-pseudo-class-any-link": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz",
+ "integrity": "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz",
+ "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-reduce-idents": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz",
+ "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-reduce-initial": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz",
+ "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.23.0",
+ "caniuse-api": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-reduce-transforms": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz",
+ "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-replace-overflow-wrap": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz",
+ "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "postcss": "^8.0.3"
+ }
+ },
+ "node_modules/postcss-selector-not": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz",
+ "integrity": "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz",
+ "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-sort-media-queries": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz",
+ "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==",
+ "license": "MIT",
+ "dependencies": {
+ "sort-css-media-queries": "2.2.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.23"
+ }
+ },
+ "node_modules/postcss-svgo": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz",
+ "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0",
+ "svgo": "^3.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >= 18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-unique-selectors": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz",
+ "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.16"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "license": "MIT"
+ },
+ "node_modules/postcss-zindex": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz",
+ "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/pretty-error": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz",
+ "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==",
+ "license": "MIT",
+ "dependencies": {
+ "lodash": "^4.17.20",
+ "renderkid": "^3.0.0"
+ }
+ },
+ "node_modules/pretty-time": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz",
+ "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/prism-react-renderer": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz",
+ "integrity": "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/prismjs": "^1.26.0",
+ "clsx": "^2.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.0.0"
+ }
+ },
+ "node_modules/prismjs": {
+ "version": "1.30.0",
+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz",
+ "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "license": "MIT"
+ },
+ "node_modules/prompts": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
+ "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "kleur": "^3.0.3",
+ "sisteransi": "^1.0.5"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "node_modules/property-information": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz",
+ "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/proto-list": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
+ "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==",
+ "license": "ISC"
+ },
+ "node_modules/proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "license": "MIT",
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/proxy-addr/node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pupa": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.3.0.tgz",
+ "integrity": "sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==",
+ "license": "MIT",
+ "dependencies": {
+ "escape-goat": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pvtsutils": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz",
+ "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.8.1"
+ }
+ },
+ "node_modules/pvutils": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz",
+ "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.14.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz",
+ "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/quick-lru": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+ "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
+ "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz",
+ "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "~3.1.2",
+ "http-errors": "~2.0.1",
+ "iconv-lite": "~0.4.24",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/raw-body/node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/rc": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+ "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
+ "dependencies": {
+ "deep-extend": "^0.6.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ },
+ "bin": {
+ "rc": "cli.js"
+ }
+ },
+ "node_modules/rc/node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "license": "ISC"
+ },
+ "node_modules/rc/node_modules/strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
+ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
+ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.2"
+ },
+ "peerDependencies": {
+ "react": "^18.3.1"
+ }
+ },
+ "node_modules/react-fast-compare": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz",
+ "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==",
+ "license": "MIT"
+ },
+ "node_modules/react-helmet-async": {
+ "name": "@slorber/react-helmet-async",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@slorber/react-helmet-async/-/react-helmet-async-1.3.0.tgz",
+ "integrity": "sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "invariant": "^2.2.4",
+ "prop-types": "^15.7.2",
+ "react-fast-compare": "^3.2.0",
+ "shallowequal": "^1.1.0"
+ },
+ "peerDependencies": {
+ "react": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "license": "MIT"
+ },
+ "node_modules/react-json-view-lite": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.5.0.tgz",
+ "integrity": "sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/react-loadable": {
+ "name": "@docusaurus/react-loadable",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz",
+ "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/react": "*"
+ },
+ "peerDependencies": {
+ "react": "*"
+ }
+ },
+ "node_modules/react-loadable-ssr-addon-v5-slorber": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz",
+ "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.10.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "peerDependencies": {
+ "react-loadable": "*",
+ "webpack": ">=4.41.1 || 5.x"
+ }
+ },
+ "node_modules/react-router": {
+ "version": "5.3.4",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz",
+ "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.12.13",
+ "history": "^4.9.0",
+ "hoist-non-react-statics": "^3.1.0",
+ "loose-envify": "^1.3.1",
+ "path-to-regexp": "^1.7.0",
+ "prop-types": "^15.6.2",
+ "react-is": "^16.6.0",
+ "tiny-invariant": "^1.0.2",
+ "tiny-warning": "^1.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=15"
+ }
+ },
+ "node_modules/react-router-config": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz",
+ "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.1.2"
+ },
+ "peerDependencies": {
+ "react": ">=15",
+ "react-router": ">=5"
+ }
+ },
+ "node_modules/react-router-dom": {
+ "version": "5.3.4",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz",
+ "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.12.13",
+ "history": "^4.9.0",
+ "loose-envify": "^1.3.1",
+ "prop-types": "^15.6.2",
+ "react-router": "5.3.4",
+ "tiny-invariant": "^1.0.2",
+ "tiny-warning": "^1.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=15"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "license": "MIT",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/recma-build-jsx": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz",
+ "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-util-build-jsx": "^3.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/recma-jsx": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz",
+ "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==",
+ "license": "MIT",
+ "dependencies": {
+ "acorn-jsx": "^5.0.0",
+ "estree-util-to-js": "^2.0.0",
+ "recma-parse": "^1.0.0",
+ "recma-stringify": "^1.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ },
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/recma-parse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz",
+ "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "esast-util-from-js": "^2.0.0",
+ "unified": "^11.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/recma-stringify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz",
+ "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-util-to-js": "^2.0.0",
+ "unified": "^11.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/reflect-metadata": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz",
+ "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+ "license": "MIT"
+ },
+ "node_modules/regenerate-unicode-properties": {
+ "version": "10.2.2",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz",
+ "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==",
+ "license": "MIT",
+ "dependencies": {
+ "regenerate": "^1.4.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regexpu-core": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz",
+ "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==",
+ "license": "MIT",
+ "dependencies": {
+ "regenerate": "^1.4.2",
+ "regenerate-unicode-properties": "^10.2.2",
+ "regjsgen": "^0.8.0",
+ "regjsparser": "^0.13.0",
+ "unicode-match-property-ecmascript": "^2.0.0",
+ "unicode-match-property-value-ecmascript": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/registry-auth-token": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.1.tgz",
+ "integrity": "sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@pnpm/npm-conf": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/registry-url": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz",
+ "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==",
+ "license": "MIT",
+ "dependencies": {
+ "rc": "1.2.8"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/regjsgen": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz",
+ "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==",
+ "license": "MIT"
+ },
+ "node_modules/regjsparser": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz",
+ "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "jsesc": "~3.1.0"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/rehype-katex": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/rehype-katex/-/rehype-katex-7.0.1.tgz",
+ "integrity": "sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/katex": "^0.16.0",
+ "hast-util-from-html-isomorphic": "^2.0.0",
+ "hast-util-to-text": "^4.0.0",
+ "katex": "^0.16.0",
+ "unist-util-visit-parents": "^6.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-raw": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz",
+ "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-raw": "^9.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-recma": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz",
+ "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "hast-util-to-estree": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/relateurl": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+ "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/remark-directive": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz",
+ "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-directive": "^3.0.0",
+ "micromark-extension-directive": "^3.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-emoji": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz",
+ "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.2",
+ "emoticon": "^4.0.1",
+ "mdast-util-find-and-replace": "^3.0.1",
+ "node-emoji": "^2.1.0",
+ "unified": "^11.0.4"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ }
+ },
+ "node_modules/remark-frontmatter": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz",
+ "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-frontmatter": "^2.0.0",
+ "micromark-extension-frontmatter": "^2.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-gfm": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz",
+ "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-gfm": "^3.0.0",
+ "micromark-extension-gfm": "^3.0.0",
+ "remark-parse": "^11.0.0",
+ "remark-stringify": "^11.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-math": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/remark-math/-/remark-math-6.0.0.tgz",
+ "integrity": "sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-math": "^3.0.0",
+ "micromark-extension-math": "^3.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-mdx": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz",
+ "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==",
+ "license": "MIT",
+ "dependencies": {
+ "mdast-util-mdx": "^3.0.0",
+ "micromark-extension-mdxjs": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-parse": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz",
+ "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-rehype": {
+ "version": "11.1.2",
+ "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz",
+ "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "unified": "^11.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-stringify": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz",
+ "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/renderkid": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz",
+ "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==",
+ "license": "MIT",
+ "dependencies": {
+ "css-select": "^4.1.3",
+ "dom-converter": "^0.2.0",
+ "htmlparser2": "^6.1.0",
+ "lodash": "^4.17.21",
+ "strip-ansi": "^6.0.1"
+ }
+ },
+ "node_modules/renderkid/node_modules/css-select": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
+ "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.0.1",
+ "domhandler": "^4.3.1",
+ "domutils": "^2.8.0",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/renderkid/node_modules/dom-serializer": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
+ "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.0",
+ "entities": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/renderkid/node_modules/domhandler": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
+ "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.2.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/renderkid/node_modules/domutils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
+ "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/renderkid/node_modules/entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "license": "BSD-2-Clause",
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/renderkid/node_modules/htmlparser2": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
+ "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.0.0",
+ "domutils": "^2.5.2",
+ "entities": "^2.0.0"
+ }
+ },
+ "node_modules/repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-like": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz",
+ "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+ "license": "MIT"
+ },
+ "node_modules/resolve": {
+ "version": "1.22.11",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
+ "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==",
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.16.1",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-alpn": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
+ "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==",
+ "license": "MIT"
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/resolve-pathname": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz",
+ "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==",
+ "license": "MIT"
+ },
+ "node_modules/responselike": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz",
+ "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==",
+ "license": "MIT",
+ "dependencies": {
+ "lowercase-keys": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/retry": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
+ "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/robust-predicates": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz",
+ "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==",
+ "license": "Unlicense"
+ },
+ "node_modules/roughjs": {
+ "version": "4.6.6",
+ "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz",
+ "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==",
+ "license": "MIT",
+ "dependencies": {
+ "hachure-fill": "^0.5.2",
+ "path-data-parser": "^0.1.0",
+ "points-on-curve": "^0.2.0",
+ "points-on-path": "^0.2.1"
+ }
+ },
+ "node_modules/rtlcss": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz",
+ "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==",
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.21",
+ "strip-json-comments": "^3.1.1"
+ },
+ "bin": {
+ "rtlcss": "bin/rtlcss.js"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/run-applescript": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz",
+ "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/rw": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
+ "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "license": "MIT"
+ },
+ "node_modules/sax": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz",
+ "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==",
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=11.0.0"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.23.2",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/schema-dts": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.5.tgz",
+ "integrity": "sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/schema-utils": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz",
+ "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/search-insights": {
+ "version": "2.17.3",
+ "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz",
+ "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/section-matter": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz",
+ "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==",
+ "license": "MIT",
+ "dependencies": {
+ "extend-shallow": "^2.0.1",
+ "kind-of": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/select-hose": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
+ "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==",
+ "license": "MIT"
+ },
+ "node_modules/selfsigned": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-5.5.0.tgz",
+ "integrity": "sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==",
+ "license": "MIT",
+ "dependencies": {
+ "@peculiar/x509": "^1.14.2",
+ "pkijs": "^3.3.3"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/semver-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz",
+ "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==",
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/send": {
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz",
+ "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "~0.5.2",
+ "http-errors": "~2.0.1",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "~2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "~2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/send/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/send/node_modules/debug/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/send/node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
+ "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/serve-handler": {
+ "version": "6.1.6",
+ "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz",
+ "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.0.0",
+ "content-disposition": "0.5.2",
+ "mime-types": "2.1.18",
+ "minimatch": "3.1.2",
+ "path-is-inside": "1.0.2",
+ "path-to-regexp": "3.3.0",
+ "range-parser": "1.2.0"
+ }
+ },
+ "node_modules/serve-handler/node_modules/path-to-regexp": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz",
+ "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==",
+ "license": "MIT"
+ },
+ "node_modules/serve-index": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.2.tgz",
+ "integrity": "sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.8",
+ "batch": "0.6.1",
+ "debug": "2.6.9",
+ "escape-html": "~1.0.3",
+ "http-errors": "~1.8.0",
+ "mime-types": "~2.1.35",
+ "parseurl": "~1.3.3"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/serve-index/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/serve-index/node_modules/depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-index/node_modules/http-errors": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
+ "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-index/node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-index/node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-index/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/serve-index/node_modules/statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-static": {
+ "version": "1.16.3",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz",
+ "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==",
+ "license": "MIT",
+ "dependencies": {
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "~0.19.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "license": "ISC"
+ },
+ "node_modules/shallow-clone": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+ "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^6.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shallowequal": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
+ "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==",
+ "license": "MIT"
+ },
+ "node_modules/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==",
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shell-quote": {
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz",
+ "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "license": "ISC"
+ },
+ "node_modules/sirv": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz",
+ "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@polka/url": "^1.0.0-next.24",
+ "mrmime": "^2.0.0",
+ "totalist": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+ "license": "MIT"
+ },
+ "node_modules/sitemap": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.2.tgz",
+ "integrity": "sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "^17.0.5",
+ "@types/sax": "^1.2.1",
+ "arg": "^5.0.0",
+ "sax": "^1.2.4"
+ },
+ "bin": {
+ "sitemap": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=12.0.0",
+ "npm": ">=5.6.0"
+ }
+ },
+ "node_modules/sitemap/node_modules/@types/node": {
+ "version": "17.0.45",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz",
+ "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==",
+ "license": "MIT"
+ },
+ "node_modules/skin-tone": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz",
+ "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==",
+ "license": "MIT",
+ "dependencies": {
+ "unicode-emoji-modifier-base": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/snake-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz",
+ "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==",
+ "license": "MIT",
+ "dependencies": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/sockjs": {
+ "version": "0.3.24",
+ "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
+ "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "faye-websocket": "^0.11.3",
+ "uuid": "^8.3.2",
+ "websocket-driver": "^0.7.4"
+ }
+ },
+ "node_modules/sort-css-media-queries": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz",
+ "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6.3.0"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.7.6",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz",
+ "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/source-map-support/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/space-separated-tokens": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
+ "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/spdy": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
+ "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.1.0",
+ "handle-thing": "^2.0.0",
+ "http-deceiver": "^1.2.7",
+ "select-hose": "^2.0.0",
+ "spdy-transport": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/spdy-transport": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
+ "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.1.0",
+ "detect-node": "^2.0.4",
+ "hpack.js": "^2.1.6",
+ "obuf": "^1.1.2",
+ "readable-stream": "^3.0.6",
+ "wbuf": "^1.7.3"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/srcset": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz",
+ "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/std-env": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz",
+ "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==",
+ "license": "MIT"
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/string-width/node_modules/ansi-regex": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/string-width/node_modules/strip-ansi": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz",
+ "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/stringify-entities": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
+ "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",
+ "license": "MIT",
+ "dependencies": {
+ "character-entities-html4": "^2.0.0",
+ "character-entities-legacy": "^3.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/stringify-object": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
+ "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "get-own-enumerable-property-symbols": "^3.0.0",
+ "is-obj": "^1.0.1",
+ "is-regexp": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz",
+ "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/style-to-js": {
+ "version": "1.1.21",
+ "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz",
+ "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "style-to-object": "1.0.14"
+ }
+ },
+ "node_modules/style-to-object": {
+ "version": "1.0.14",
+ "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz",
+ "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==",
+ "license": "MIT",
+ "dependencies": {
+ "inline-style-parser": "0.2.7"
+ }
+ },
+ "node_modules/stylehacks": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz",
+ "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.23.0",
+ "postcss-selector-parser": "^6.0.16"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/stylis": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz",
+ "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==",
+ "license": "MIT"
+ },
+ "node_modules/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==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/svg-parser": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz",
+ "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==",
+ "license": "MIT"
+ },
+ "node_modules/svgo": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz",
+ "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==",
+ "license": "MIT",
+ "dependencies": {
+ "@trysound/sax": "0.2.0",
+ "commander": "^7.2.0",
+ "css-select": "^5.1.0",
+ "css-tree": "^2.3.1",
+ "css-what": "^6.1.0",
+ "csso": "^5.0.5",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "svgo": "bin/svgo"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/svgo"
+ }
+ },
+ "node_modules/svgo/node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/tapable": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz",
+ "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/terser": {
+ "version": "5.46.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz",
+ "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.15.0",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/terser-webpack-plugin": {
+ "version": "5.3.16",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz",
+ "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jest-worker": "^27.4.5",
+ "schema-utils": "^4.3.0",
+ "serialize-javascript": "^6.0.2",
+ "terser": "^5.31.1"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.1.0"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "uglify-js": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/jest-worker": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+ "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/terser/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "license": "MIT"
+ },
+ "node_modules/thingies": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz",
+ "integrity": "sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "^2"
+ }
+ },
+ "node_modules/thunky": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
+ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
+ "license": "MIT"
+ },
+ "node_modules/tiny-invariant": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
+ "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==",
+ "license": "MIT"
+ },
+ "node_modules/tiny-warning": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz",
+ "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==",
+ "license": "MIT"
+ },
+ "node_modules/tinyexec": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz",
+ "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tinypool": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz",
+ "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==",
+ "license": "MIT",
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/totalist": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz",
+ "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tree-dump": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz",
+ "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/trim-lines": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
+ "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/trough": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz",
+ "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/ts-dedent": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz",
+ "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.10"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
+ },
+ "node_modules/tsyringe": {
+ "version": "4.10.0",
+ "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz",
+ "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^1.9.3"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/tsyringe/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "license": "0BSD"
+ },
+ "node_modules/type-fest": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
+ "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "license": "MIT",
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/type-is/node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/type-is/node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/typedarray-to-buffer": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+ "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+ "license": "MIT",
+ "dependencies": {
+ "is-typedarray": "^1.0.0"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.6.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
+ "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
+ "devOptional": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/ufo": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz",
+ "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==",
+ "license": "MIT"
+ },
+ "node_modules/undici": {
+ "version": "7.22.0",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-7.22.0.tgz",
+ "integrity": "sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=20.18.1"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "7.18.2",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz",
+ "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==",
+ "license": "MIT"
+ },
+ "node_modules/unicode-canonical-property-names-ecmascript": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz",
+ "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-emoji-modifier-base": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz",
+ "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+ "license": "MIT",
+ "dependencies": {
+ "unicode-canonical-property-names-ecmascript": "^2.0.0",
+ "unicode-property-aliases-ecmascript": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-value-ecmascript": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz",
+ "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-property-aliases-ecmascript": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz",
+ "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unified": {
+ "version": "11.0.5",
+ "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz",
+ "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "bail": "^2.0.0",
+ "devlop": "^1.0.0",
+ "extend": "^3.0.0",
+ "is-plain-obj": "^4.0.0",
+ "trough": "^2.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unique-string": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz",
+ "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "crypto-random-string": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/unist-util-find-after": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz",
+ "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-is": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz",
+ "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-position": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
+ "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-position-from-estree": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz",
+ "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-remove-position": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz",
+ "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-visit": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz",
+ "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit-parents": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz",
+ "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/update-notifier": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz",
+ "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boxen": "^7.0.0",
+ "chalk": "^5.0.1",
+ "configstore": "^6.0.0",
+ "has-yarn": "^3.0.0",
+ "import-lazy": "^4.0.0",
+ "is-ci": "^3.0.1",
+ "is-installed-globally": "^0.4.0",
+ "is-npm": "^6.0.0",
+ "is-yarn-global": "^0.4.0",
+ "latest-version": "^7.0.0",
+ "pupa": "^3.1.0",
+ "semver": "^7.3.7",
+ "semver-diff": "^4.0.0",
+ "xdg-basedir": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/yeoman/update-notifier?sponsor=1"
+ }
+ },
+ "node_modules/update-notifier/node_modules/boxen": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz",
+ "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-align": "^3.0.1",
+ "camelcase": "^7.0.1",
+ "chalk": "^5.2.0",
+ "cli-boxes": "^3.0.0",
+ "string-width": "^5.1.2",
+ "type-fest": "^2.13.0",
+ "widest-line": "^4.0.1",
+ "wrap-ansi": "^8.1.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/update-notifier/node_modules/camelcase": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz",
+ "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/update-notifier/node_modules/chalk": {
+ "version": "5.6.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
+ "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/url-loader": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz",
+ "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==",
+ "license": "MIT",
+ "dependencies": {
+ "loader-utils": "^2.0.0",
+ "mime-types": "^2.1.27",
+ "schema-utils": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "file-loader": "*",
+ "webpack": "^4.0.0 || ^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "file-loader": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/url-loader/node_modules/ajv": {
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz",
+ "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/url-loader/node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/url-loader/node_modules/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==",
+ "license": "MIT"
+ },
+ "node_modules/url-loader/node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/url-loader/node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/url-loader/node_modules/schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "license": "MIT"
+ },
+ "node_modules/utila": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
+ "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==",
+ "license": "MIT"
+ },
+ "node_modules/utility-types": {
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz",
+ "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/value-equal": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz",
+ "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==",
+ "license": "MIT"
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/vfile": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
+ "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile-location": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz",
+ "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile-message": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz",
+ "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vscode-jsonrpc": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz",
+ "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/vscode-languageserver": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz",
+ "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==",
+ "license": "MIT",
+ "dependencies": {
+ "vscode-languageserver-protocol": "3.17.5"
+ },
+ "bin": {
+ "installServerIntoExtension": "bin/installServerIntoExtension"
+ }
+ },
+ "node_modules/vscode-languageserver-protocol": {
+ "version": "3.17.5",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz",
+ "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==",
+ "license": "MIT",
+ "dependencies": {
+ "vscode-jsonrpc": "8.2.0",
+ "vscode-languageserver-types": "3.17.5"
+ }
+ },
+ "node_modules/vscode-languageserver-textdocument": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz",
+ "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==",
+ "license": "MIT"
+ },
+ "node_modules/vscode-languageserver-types": {
+ "version": "3.17.5",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz",
+ "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==",
+ "license": "MIT"
+ },
+ "node_modules/vscode-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz",
+ "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==",
+ "license": "MIT"
+ },
+ "node_modules/watchpack": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz",
+ "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==",
+ "license": "MIT",
+ "dependencies": {
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/wbuf": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
+ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+ "license": "MIT",
+ "dependencies": {
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "node_modules/web-namespaces": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz",
+ "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/webpack": {
+ "version": "5.105.2",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.2.tgz",
+ "integrity": "sha512-dRXm0a2qcHPUBEzVk8uph0xWSjV/xZxenQQbLwnwP7caQCYpqG1qddwlyEkIDkYn0K8tvmcrZ+bOrzoQ3HxCDw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/eslint-scope": "^3.7.7",
+ "@types/estree": "^1.0.8",
+ "@types/json-schema": "^7.0.15",
+ "@webassemblyjs/ast": "^1.14.1",
+ "@webassemblyjs/wasm-edit": "^1.14.1",
+ "@webassemblyjs/wasm-parser": "^1.14.1",
+ "acorn": "^8.15.0",
+ "acorn-import-phases": "^1.0.3",
+ "browserslist": "^4.28.1",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^5.19.0",
+ "es-module-lexer": "^2.0.0",
+ "eslint-scope": "5.1.1",
+ "events": "^3.2.0",
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.2.11",
+ "json-parse-even-better-errors": "^2.3.1",
+ "loader-runner": "^4.3.1",
+ "mime-types": "^2.1.27",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^4.3.3",
+ "tapable": "^2.3.0",
+ "terser-webpack-plugin": "^5.3.16",
+ "watchpack": "^2.5.1",
+ "webpack-sources": "^3.3.3"
+ },
+ "bin": {
+ "webpack": "bin/webpack.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependenciesMeta": {
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-bundle-analyzer": {
+ "version": "4.10.2",
+ "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz",
+ "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==",
+ "license": "MIT",
+ "dependencies": {
+ "@discoveryjs/json-ext": "0.5.7",
+ "acorn": "^8.0.4",
+ "acorn-walk": "^8.0.0",
+ "commander": "^7.2.0",
+ "debounce": "^1.2.1",
+ "escape-string-regexp": "^4.0.0",
+ "gzip-size": "^6.0.0",
+ "html-escaper": "^2.0.2",
+ "opener": "^1.5.2",
+ "picocolors": "^1.0.0",
+ "sirv": "^2.0.3",
+ "ws": "^7.3.1"
+ },
+ "bin": {
+ "webpack-bundle-analyzer": "lib/bin/analyzer.js"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/webpack-bundle-analyzer/node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/webpack-dev-middleware": {
+ "version": "7.4.5",
+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz",
+ "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==",
+ "license": "MIT",
+ "dependencies": {
+ "colorette": "^2.0.10",
+ "memfs": "^4.43.1",
+ "mime-types": "^3.0.1",
+ "on-finished": "^2.4.1",
+ "range-parser": "^1.2.1",
+ "schema-utils": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 18.12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "webpack": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-dev-middleware/node_modules/mime-db": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/webpack-dev-middleware/node_modules/mime-types": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
+ "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "^1.54.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/webpack-dev-middleware/node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/webpack-dev-server": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.3.tgz",
+ "integrity": "sha512-9Gyu2F7+bg4Vv+pjbovuYDhHX+mqdqITykfzdM9UyKqKHlsE5aAjRhR+oOEfXW5vBeu8tarzlJFIZva4ZjAdrQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/bonjour": "^3.5.13",
+ "@types/connect-history-api-fallback": "^1.5.4",
+ "@types/express": "^4.17.25",
+ "@types/express-serve-static-core": "^4.17.21",
+ "@types/serve-index": "^1.9.4",
+ "@types/serve-static": "^1.15.5",
+ "@types/sockjs": "^0.3.36",
+ "@types/ws": "^8.5.10",
+ "ansi-html-community": "^0.0.8",
+ "bonjour-service": "^1.2.1",
+ "chokidar": "^3.6.0",
+ "colorette": "^2.0.10",
+ "compression": "^1.8.1",
+ "connect-history-api-fallback": "^2.0.0",
+ "express": "^4.22.1",
+ "graceful-fs": "^4.2.6",
+ "http-proxy-middleware": "^2.0.9",
+ "ipaddr.js": "^2.1.0",
+ "launch-editor": "^2.6.1",
+ "open": "^10.0.3",
+ "p-retry": "^6.2.0",
+ "schema-utils": "^4.2.0",
+ "selfsigned": "^5.5.0",
+ "serve-index": "^1.9.1",
+ "sockjs": "^0.3.24",
+ "spdy": "^4.0.2",
+ "webpack-dev-middleware": "^7.4.2",
+ "ws": "^8.18.0"
+ },
+ "bin": {
+ "webpack-dev-server": "bin/webpack-dev-server.js"
+ },
+ "engines": {
+ "node": ">= 18.12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "webpack": {
+ "optional": true
+ },
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/define-lazy-prop": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
+ "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/open": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz",
+ "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==",
+ "license": "MIT",
+ "dependencies": {
+ "default-browser": "^5.2.1",
+ "define-lazy-prop": "^3.0.0",
+ "is-inside-container": "^1.0.0",
+ "wsl-utils": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/ws": {
+ "version": "8.19.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz",
+ "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-merge": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz",
+ "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==",
+ "license": "MIT",
+ "dependencies": {
+ "clone-deep": "^4.0.1",
+ "flat": "^5.0.2",
+ "wildcard": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/webpack-sources": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.4.tgz",
+ "integrity": "sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webpack/node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/webpack/node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/webpackbar": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-6.0.1.tgz",
+ "integrity": "sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-escapes": "^4.3.2",
+ "chalk": "^4.1.2",
+ "consola": "^3.2.3",
+ "figures": "^3.2.0",
+ "markdown-table": "^2.0.0",
+ "pretty-time": "^1.1.0",
+ "std-env": "^3.7.0",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=14.21.3"
+ },
+ "peerDependencies": {
+ "webpack": "3 || 4 || 5"
+ }
+ },
+ "node_modules/webpackbar/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/webpackbar/node_modules/markdown-table": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz",
+ "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==",
+ "license": "MIT",
+ "dependencies": {
+ "repeat-string": "^1.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/webpackbar/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/webpackbar/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/websocket-driver": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
+ "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "http-parser-js": ">=0.5.1",
+ "safe-buffer": ">=5.1.0",
+ "websocket-extensions": ">=0.1.1"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/websocket-extensions": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
+ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/whatwg-encoding": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
+ "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
+ "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation",
+ "license": "MIT",
+ "dependencies": {
+ "iconv-lite": "0.6.3"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/whatwg-encoding/node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/whatwg-mimetype": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
+ "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/widest-line": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz",
+ "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==",
+ "license": "MIT",
+ "dependencies": {
+ "string-width": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/wildcard": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz",
+ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==",
+ "license": "MIT"
+ },
+ "node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-regex": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-styles": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/strip-ansi": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz",
+ "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/write-file-atomic": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+ "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "is-typedarray": "^1.0.0",
+ "signal-exit": "^3.0.2",
+ "typedarray-to-buffer": "^3.1.5"
+ }
+ },
+ "node_modules/ws": {
+ "version": "7.5.10",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
+ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/wsl-utils": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz",
+ "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==",
+ "license": "MIT",
+ "dependencies": {
+ "is-wsl": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/wsl-utils/node_modules/is-wsl": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz",
+ "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==",
+ "license": "MIT",
+ "dependencies": {
+ "is-inside-container": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/xdg-basedir": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz",
+ "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/xml-js": {
+ "version": "1.6.11",
+ "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz",
+ "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==",
+ "license": "MIT",
+ "dependencies": {
+ "sax": "^1.2.4"
+ },
+ "bin": {
+ "xml-js": "bin/cli.js"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "license": "ISC"
+ },
+ "node_modules/yocto-queue": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz",
+ "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zwitch": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
+ "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ }
+ }
+}
diff --git a/doc/website/package.json b/doc/website/package.json
new file mode 100644
index 00000000000..d4ab4d3af41
--- /dev/null
+++ b/doc/website/package.json
@@ -0,0 +1,50 @@
+{
+ "name": "mne-cpp-website",
+ "version": "2.0.0",
+ "private": true,
+ "scripts": {
+ "docusaurus": "docusaurus",
+ "start": "docusaurus start",
+ "build": "docusaurus build",
+ "swizzle": "docusaurus swizzle",
+ "deploy": "docusaurus deploy",
+ "clear": "docusaurus clear",
+ "serve": "docusaurus serve",
+ "write-translations": "docusaurus write-translations",
+ "write-heading-ids": "docusaurus write-heading-ids"
+ },
+ "dependencies": {
+ "@docusaurus/core": "^3.7.0",
+ "@docusaurus/preset-classic": "^3.7.0",
+ "@docusaurus/theme-mermaid": "^3.9.2",
+ "@easyops-cn/docusaurus-search-local": "^0.55.0",
+ "@mdx-js/react": "^3.0.0",
+ "clsx": "^2.1.0",
+ "prism-react-renderer": "^2.3.0",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "rehype-katex": "^7.0.1",
+ "remark-math": "^6.0.0"
+ },
+ "devDependencies": {
+ "@docusaurus/module-type-aliases": "^3.7.0",
+ "@docusaurus/tsconfig": "^3.7.0",
+ "@docusaurus/types": "^3.7.0",
+ "typescript": "~5.6.0"
+ },
+ "browserslist": {
+ "production": [
+ ">0.5%",
+ "not dead",
+ "not op_mini all"
+ ],
+ "development": [
+ "last 3 chrome version",
+ "last 3 firefox version",
+ "last 5 safari version"
+ ]
+ },
+ "engines": {
+ "node": ">=18.0"
+ }
+}
diff --git a/doc/website/sidebars.ts b/doc/website/sidebars.ts
new file mode 100644
index 00000000000..0b75fe20ff4
--- /dev/null
+++ b/doc/website/sidebars.ts
@@ -0,0 +1,167 @@
+import type { SidebarsConfig } from '@docusaurus/plugin-content-docs';
+
+const sidebars: SidebarsConfig = {
+ docsSidebar: [
+ 'overview',
+ {
+ type: 'category',
+ label: 'Manual',
+ link: { type: 'doc', id: 'manual/intro' },
+ items: [
+ {
+ type: 'category',
+ label: 'Background',
+ items: [
+ 'manual/workflow',
+ 'manual/forward',
+ 'manual/inverse',
+ 'manual/ssp',
+ ],
+ },
+ {
+ type: 'category',
+ label: 'Applications',
+ items: [
+ {
+ type: 'category',
+ label: 'MNE Scan',
+ link: { type: 'doc', id: 'manual/scan' },
+ items: [
+ 'manual/scan-prerecordeddata',
+ 'manual/scan-sourceloc',
+ 'manual/scan-headmonitoring',
+ 'manual/scan-forward',
+ 'manual/scan-brainamp',
+ 'manual/scan-gusbamp',
+ 'manual/scan-eegosports',
+ 'manual/scan-natus',
+ 'manual/scan-ftbuffer',
+ 'manual/scan-lsl',
+ 'manual/scan-tmsi',
+ 'manual/scan-interfacewithanalyze',
+ ],
+ },
+ {
+ type: 'category',
+ label: 'MNE Analyze',
+ link: { type: 'doc', id: 'manual/analyze' },
+ items: [
+ 'manual/analyze-dataloader',
+ 'manual/analyze-datamanager',
+ 'manual/analyze-rawdataviewer',
+ 'manual/analyze-annotationmanager',
+ 'manual/analyze-average',
+ 'manual/analyze-filter',
+ 'manual/analyze-channelselect',
+ 'manual/analyze-coregistration',
+ 'manual/analyze-scaling',
+ 'manual/analyze-dipolefit',
+ 'manual/analyze-realtime',
+ ],
+ },
+ 'manual/anonymize',
+ 'manual/inspect',
+ 'manual/browse-raw',
+ ],
+ },
+ {
+ type: 'category',
+ label: 'Command-Line Tools',
+ link: { type: 'doc', id: 'manual/tools-overview' },
+ items: [
+ 'manual/tools-watershed-bem',
+ 'manual/tools-flash-bem',
+ 'manual/tools-surf2bem',
+ 'manual/tools-setup-forward-model',
+ 'manual/tools-setup-mri',
+ 'manual/tools-forward-solution',
+ 'manual/tools-compute-raw-inverse',
+ 'manual/tools-dipole-fit',
+ 'manual/tools-edf2fiff',
+ 'manual/tools-show-fiff',
+ 'manual/tools-rt-server',
+ ],
+ },
+ ],
+ },
+ 'publications',
+ 'cite',
+ ],
+ developmentSidebar: [
+ {
+ type: 'category',
+ label: 'Build & Deploy',
+ items: [
+ 'development/buildguide-cmake',
+ {
+ type: 'category',
+ label: 'WebAssembly',
+ link: { type: 'doc', id: 'development/wasm' },
+ items: [
+ 'development/wasm-buildguide',
+ 'development/wasm-testing',
+ ],
+ },
+ {
+ type: 'category',
+ label: 'Continuous Integration',
+ link: { type: 'doc', id: 'development/ci' },
+ items: [
+ 'development/ci-ghactions',
+ 'development/ci-deployment',
+ 'development/ci-releasecycle',
+ ],
+ },
+ ],
+ },
+ {
+ type: 'category',
+ label: 'Contributing',
+ link: { type: 'doc', id: 'development/contribute' },
+ items: [
+ 'development/contr-guide',
+ 'development/contr-style',
+ 'development/contr-git',
+ 'development/contr-docuimprovements',
+ 'development/writingtest',
+ 'development/contr-mnetracer',
+ ],
+ },
+ {
+ type: 'category',
+ label: 'Library API',
+ link: { type: 'doc', id: 'development/api' },
+ items: [
+ 'development/api-disp3d',
+ 'development/api-connectivity',
+ ],
+ },
+ {
+ type: 'category',
+ label: 'Plugin Development',
+ items: [
+ {
+ type: 'category',
+ label: 'MNE Scan',
+ link: { type: 'doc', id: 'development/scan' },
+ items: [
+ 'development/scan-acq',
+ 'development/scan-plugin',
+ ],
+ },
+ {
+ type: 'category',
+ label: 'MNE Analyze',
+ link: { type: 'doc', id: 'development/analyze' },
+ items: [
+ 'development/analyze-plugin',
+ 'development/analyze-event',
+ 'development/analyze-datamodel',
+ ],
+ },
+ ],
+ },
+ ],
+};
+
+export default sidebars;
diff --git a/doc/website/src/css/custom.css b/doc/website/src/css/custom.css
new file mode 100644
index 00000000000..7da74517ac9
--- /dev/null
+++ b/doc/website/src/css/custom.css
@@ -0,0 +1,106 @@
+:root {
+ --ifm-color-primary: #6c5ce7;
+ --ifm-color-primary-dark: #5a48e0;
+ --ifm-color-primary-darker: #5140dc;
+ --ifm-color-primary-darkest: #3a2ac5;
+ --ifm-color-primary-light: #7e70ee;
+ --ifm-color-primary-lighter: #877af0;
+ --ifm-color-primary-lightest: #a49af5;
+ --ifm-code-font-size: 95%;
+ --docusaurus-highlighted-code-line-bg: rgba(108, 92, 231, 0.1);
+}
+
+[data-theme='dark'] {
+ --ifm-color-primary: #a29bfe;
+ --ifm-color-primary-dark: #8b82fe;
+ --ifm-color-primary-darker: #7d73fd;
+ --ifm-color-primary-darkest: #524bfd;
+ --ifm-color-primary-light: #b9b4fe;
+ --ifm-color-primary-lighter: #c7c3fe;
+ --ifm-color-primary-lightest: #eeedff;
+ --ifm-background-color: #1a1a2e;
+ --ifm-background-surface-color: #16213e;
+ --ifm-navbar-background-color: #0f3460;
+ --ifm-footer-background-color: #0a1628;
+ --docusaurus-highlighted-code-line-bg: rgba(162, 155, 254, 0.15);
+}
+
+/* Smooth scroll */
+html {
+ scroll-behavior: smooth;
+}
+
+/* GitHub icon in navbar */
+.header-github-link::before {
+ content: '';
+ width: 24px;
+ height: 24px;
+ display: flex;
+ background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12' fill='%23333'/%3E%3C/svg%3E") no-repeat;
+}
+
+[data-theme='dark'] .header-github-link::before {
+ background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12' fill='%23fff'/%3E%3C/svg%3E") no-repeat;
+}
+
+.header-github-link:hover {
+ opacity: 0.7;
+}
+
+/* Logo grids in doc pages (funding & institutions) */
+.funding-logo-grid,
+.institution-logo-grid {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+ gap: 2.5rem;
+ margin: 1.5rem 0 2rem;
+}
+
+.funding-logo-grid a,
+.institution-logo-grid a {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.funding-logo-grid img,
+.institution-logo-grid img {
+ height: 48px;
+ width: auto;
+ max-width: 160px;
+ object-fit: contain;
+ opacity: 0.55;
+ filter: grayscale(100%);
+ transition: all 0.25s ease;
+}
+
+[data-theme='dark'] .funding-logo-grid img,
+[data-theme='dark'] .institution-logo-grid img {
+ filter: grayscale(100%) invert(1);
+}
+
+.funding-logo-grid a:hover img,
+.institution-logo-grid a:hover img {
+ opacity: 1;
+ filter: none;
+}
+
+/* Version badge in navbar */
+.navbar-version-badge {
+ font-size: 0.75rem;
+ font-weight: 500;
+ padding: 0.15rem 0.55rem;
+ border-radius: 12px;
+ background: rgba(108, 92, 231, 0.1);
+ border: 1px solid rgba(108, 92, 231, 0.25);
+ color: var(--ifm-color-primary);
+ letter-spacing: 0.03em;
+}
+
+[data-theme='dark'] .navbar-version-badge {
+ background: rgba(162, 155, 254, 0.12);
+ border-color: rgba(162, 155, 254, 0.25);
+ color: var(--ifm-color-primary-light);
+}
\ No newline at end of file
diff --git a/doc/website/src/pages/download.tsx b/doc/website/src/pages/download.tsx
new file mode 100644
index 00000000000..c5cac62e5dd
--- /dev/null
+++ b/doc/website/src/pages/download.tsx
@@ -0,0 +1,72 @@
+import Layout from '@theme/Layout';
+import Heading from '@theme/Heading';
+import Link from '@docusaurus/Link';
+
+export default function Download(): JSX.Element {
+ return (
+
+
+
Download MNE-CPP
+
+
+
+
+
🚀 Stable Release (v0.1.9)
+
Latest stable binaries for all platforms.
+
+
+
+
+
+
+
🔧 Development Builds
+
Latest builds from the development branch (v2.0-dev).
+
+
+
+
+
+
+
Quick Start
+
+ Download the archive for your platform
+ Extract the archive
+ Run the application (e.g., mne_analyze or mne_scan)
+
+
+ For building from source, see the{' '}
+ Build Guide.
+
+
+
+
+
Sample Data
+
+ To try out MNE-CPP, download the{' '}
+
+ MNE-Sample-Data set
+ {' '}
+ and extract it to resources/data/MNE-sample-data.
+
+
+
+
+ );
+}
diff --git a/doc/website/src/pages/index.module.css b/doc/website/src/pages/index.module.css
new file mode 100644
index 00000000000..802427e0eeb
--- /dev/null
+++ b/doc/website/src/pages/index.module.css
@@ -0,0 +1,389 @@
+/* ── Hero ── */
+.hero {
+ position: relative;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+ padding: 7rem 2rem 8rem;
+ background: linear-gradient(175deg, #f8f9fc 0%, #eef0f6 50%, #f4f5fa 100%);
+ color: #1a1a2e;
+ overflow: hidden;
+}
+
+:global([data-theme='dark']) .hero {
+ background: linear-gradient(175deg, #1a1a2e 0%, #16213e 50%, #1a1a2e 100%);
+ color: #fff;
+}
+
+.heroInner {
+ position: relative;
+ z-index: 1;
+ max-width: 640px;
+}
+
+.heroLogo {
+ width: 260px;
+ height: auto;
+ margin-bottom: 1.5rem;
+}
+
+.versionBadge {
+ display: inline-block;
+ background: rgba(108, 92, 231, 0.08);
+ border: 1px solid rgba(108, 92, 231, 0.2);
+ border-radius: 20px;
+ padding: 0.15rem 0.75rem;
+ font-size: 0.75rem;
+ font-weight: 500;
+ letter-spacing: 0.05em;
+ color: rgba(0, 0, 0, 0.5);
+ margin-bottom: 1.25rem;
+}
+
+:global([data-theme='dark']) .versionBadge {
+ background: rgba(255, 255, 255, 0.08);
+ border-color: rgba(255, 255, 255, 0.18);
+ color: rgba(255, 255, 255, 0.6);
+}
+
+.heroTagline {
+ font-size: 1.6rem;
+ font-weight: 600;
+ line-height: 1.35;
+ margin: 0 0 2rem;
+ color: #2d3436;
+}
+
+:global([data-theme='dark']) .heroTagline {
+ color: rgba(255, 255, 255, 0.92);
+}
+
+.heroCta {
+ display: flex;
+ gap: 0.75rem;
+ justify-content: center;
+ flex-wrap: wrap;
+}
+
+.heroCta :global(.button--outline) {
+ color: var(--ifm-color-primary);
+ border-color: var(--ifm-color-primary);
+}
+
+.heroCta :global(.button--outline:hover) {
+ background: rgba(108, 92, 231, 0.06);
+ border-color: var(--ifm-color-primary-dark);
+ color: var(--ifm-color-primary-dark);
+}
+
+:global([data-theme='dark']) .heroCta :global(.button--outline) {
+ color: rgba(255, 255, 255, 0.85);
+ border-color: rgba(255, 255, 255, 0.25);
+}
+
+:global([data-theme='dark']) .heroCta :global(.button--outline:hover) {
+ background: rgba(255, 255, 255, 0.08);
+ border-color: rgba(255, 255, 255, 0.5);
+ color: #fff;
+}
+
+/* ── Waves (subtle EEG-like traces) ── */
+.waveWrap {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ pointer-events: none;
+ overflow: hidden;
+}
+
+.waveSvg {
+ display: block;
+ width: 200%;
+ height: 100%;
+}
+
+/* Semi-transparent fills below the waves */
+.waveFill1,
+.waveFill2,
+.waveFill3 {
+ stroke: none;
+}
+
+.waveFill1 {
+ fill: rgba(255, 255, 255, 0.45);
+ animation: drift 14s ease-in-out infinite;
+}
+
+.waveFill2 {
+ fill: rgba(255, 255, 255, 0.30);
+ animation: drift 18s ease-in-out infinite reverse;
+}
+
+.waveFill3 {
+ fill: rgba(255, 255, 255, 0.20);
+ animation: drift 22s ease-in-out infinite;
+}
+
+:global([data-theme='dark']) .waveFill1 {
+ fill: rgba(255, 255, 255, 0.04);
+}
+
+:global([data-theme='dark']) .waveFill2 {
+ fill: rgba(255, 255, 255, 0.03);
+}
+
+:global([data-theme='dark']) .waveFill3 {
+ fill: rgba(255, 255, 255, 0.025);
+}
+
+/* Stroke lines */
+.wave1,
+.wave2,
+.wave3,
+.wave4,
+.wave5 {
+ fill: none;
+ stroke-linecap: round;
+ stroke-linejoin: round;
+}
+
+.wave1 {
+ stroke: rgba(108, 92, 231, 0.10);
+ stroke-width: 2;
+ animation: drift 14s ease-in-out infinite;
+}
+
+.wave2 {
+ stroke: rgba(108, 92, 231, 0.08);
+ stroke-width: 1.5;
+ animation: drift 18s ease-in-out infinite reverse;
+}
+
+.wave3 {
+ stroke: rgba(108, 92, 231, 0.06);
+ stroke-width: 2;
+ animation: drift 22s ease-in-out infinite;
+}
+
+.wave4 {
+ stroke: rgba(108, 92, 231, 0.05);
+ stroke-width: 1.2;
+ animation: drift 26s ease-in-out infinite reverse;
+}
+
+.wave5 {
+ stroke: rgba(108, 92, 231, 0.07);
+ stroke-width: 1.5;
+ animation: drift 16s ease-in-out infinite;
+}
+
+:global([data-theme='dark']) .wave1 {
+ stroke: rgba(162, 155, 254, 0.10);
+}
+
+:global([data-theme='dark']) .wave2 {
+ stroke: rgba(162, 155, 254, 0.07);
+}
+
+:global([data-theme='dark']) .wave3 {
+ stroke: rgba(162, 155, 254, 0.06);
+}
+
+:global([data-theme='dark']) .wave4 {
+ stroke: rgba(162, 155, 254, 0.05);
+}
+
+:global([data-theme='dark']) .wave5 {
+ stroke: rgba(162, 155, 254, 0.08);
+}
+
+@keyframes drift {
+
+ 0%,
+ 100% {
+ transform: translateX(0);
+ }
+
+ 50% {
+ transform: translateX(-25%);
+ }
+}
+
+/* ── Applications ── */
+.apps {
+ padding: 5rem 0;
+}
+
+.appCard {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ text-align: center;
+ padding: 2.5rem 1.5rem;
+ border-radius: 16px;
+ background: var(--ifm-background-surface-color);
+ border: 1px solid var(--ifm-color-emphasis-200);
+ height: 100%;
+ transition: transform 0.2s, box-shadow 0.2s;
+ text-decoration: none !important;
+ color: inherit !important;
+}
+
+.appCard:hover {
+ transform: translateY(-6px);
+ box-shadow: 0 16px 40px rgba(0, 0, 0, 0.12);
+ text-decoration: none !important;
+}
+
+.appIcon {
+ width: 72px;
+ height: 72px;
+ margin-bottom: 1.25rem;
+}
+
+.appTitle {
+ margin-bottom: 0.5rem;
+ font-size: 1.25rem;
+}
+
+.appDesc {
+ font-size: 0.92rem;
+ color: var(--ifm-color-emphasis-700);
+ flex: 1;
+}
+
+.appLink {
+ font-size: 0.85rem;
+ font-weight: 600;
+ color: var(--ifm-color-primary);
+ margin-top: 0.75rem;
+}
+
+/* ── Logo sections (institutions & funders) ── */
+.logoSection {
+ padding: 4rem 0;
+}
+
+.logoSectionAlt {
+ background: var(--ifm-background-surface-color);
+}
+
+.sectionTitle {
+ font-size: 1.1rem;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.08em;
+ color: var(--ifm-color-emphasis-500);
+ margin-bottom: 1.5rem;
+}
+
+/* ── Contributors ── */
+.contributorsSection {
+ padding: 4rem 0;
+ background: var(--ifm-background-surface-color);
+}
+
+.contributorsSubtitle {
+ font-size: 0.95rem;
+ color: var(--ifm-color-emphasis-600);
+ margin-bottom: 2rem;
+ max-width: 540px;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.contributorsGrid {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ gap: 1rem;
+ max-width: 820px;
+ margin: 0 auto;
+}
+
+.contributorLink {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ text-decoration: none !important;
+ color: inherit !important;
+ transition: transform 0.2s ease;
+ width: 72px;
+}
+
+.contributorLink:hover {
+ transform: translateY(-4px);
+}
+
+.contributorAvatar {
+ width: 56px;
+ height: 56px;
+ border-radius: 50%;
+ border: 2px solid var(--ifm-color-emphasis-200);
+ object-fit: cover;
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
+}
+
+.contributorLink:hover .contributorAvatar {
+ border-color: var(--ifm-color-primary);
+ box-shadow: 0 4px 12px rgba(108, 92, 231, 0.25);
+}
+
+:global([data-theme='dark']) .contributorLink:hover .contributorAvatar {
+ box-shadow: 0 4px 12px rgba(162, 155, 254, 0.3);
+}
+
+.contributorName {
+ display: block;
+ font-size: 0.65rem;
+ color: var(--ifm-color-emphasis-500);
+ margin-top: 0.3rem;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ max-width: 72px;
+ text-align: center;
+}
+
+.logoGrid {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+ gap: 2rem;
+}
+
+.logoLink img {
+ max-height: 48px;
+ width: auto;
+ opacity: 0.5;
+ filter: grayscale(100%);
+ transition: all 0.25s ease;
+}
+
+:global([data-theme='dark']) .logoLink img {
+ filter: grayscale(100%) invert(1);
+}
+
+.logoLink:hover img {
+ opacity: 1;
+ filter: none;
+}
+
+/* ── Responsive ── */
+@media (max-width: 768px) {
+ .heroLogo {
+ width: 180px;
+ }
+
+ .heroTagline {
+ font-size: 1.3rem;
+ }
+
+ .hero {
+ padding: 4rem 1.5rem 6rem;
+ }
+}
\ No newline at end of file
diff --git a/doc/website/src/pages/index.tsx b/doc/website/src/pages/index.tsx
new file mode 100644
index 00000000000..f273eba3de0
--- /dev/null
+++ b/doc/website/src/pages/index.tsx
@@ -0,0 +1,231 @@
+import clsx from 'clsx';
+import Link from '@docusaurus/Link';
+import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
+import { useColorMode } from '@docusaurus/theme-common';
+import Layout from '@theme/Layout';
+import Heading from '@theme/Heading';
+import styles from './index.module.css';
+
+const applications = [
+ {
+ title: 'MNE Scan',
+ description: 'Real-time acquisition and processing of MEG/EEG data with a modular plugin architecture.',
+ link: '/docs/manual/scan',
+ icon: 'img/icon_mne_scan_256x256.png',
+ },
+ {
+ title: 'MNE Analyze',
+ description: 'Visualization, filtering, averaging, co-registration, and source localization.',
+ link: '/docs/manual/analyze',
+ icon: 'img/icon_mne-analyze_256x256.png',
+ },
+ {
+ title: 'C++ Library',
+ description: 'Cross-platform API built on Qt & Eigen. Build your own neuroscience applications.',
+ link: '/docs/development/api',
+ icon: 'img/icon_mne-lib_256x256.png',
+ },
+];
+
+const institutions = [
+ { name: 'Martinos Center', url: 'https://martinos.org/', logo: 'img/institution_logos/martinos.svg' },
+ { name: 'TU Ilmenau', url: 'https://www.tu-ilmenau.de/', logo: 'img/institution_logos/Ilmenau.svg' },
+ { name: 'Massachusetts General Hospital', url: 'https://www.massgeneral.org/', logo: 'img/institution_logos/MGH.svg' },
+ { name: "Boston Children's Hospital", url: 'http://www.childrenshospital.org/', logo: 'img/institution_logos/bch.svg' },
+ { name: 'Harvard Medical School', url: 'https://hms.harvard.edu/', logo: 'img/institution_logos/harvard.svg' },
+ { name: 'UTHealth Houston', url: 'https://www.uth.edu/', logo: 'img/institution_logos/uthealth.png' },
+ { name: 'Universität Magdeburg', url: 'https://www.uni-magdeburg.de/', logo: 'img/institution_logos/magdeburg.svg' },
+ { name: 'Forschungscampus Stimulate', url: 'https://www.forschungscampus-stimulate.de/', logo: 'img/institution_logos/stimulate_magdeburg.svg' },
+ { name: 'Universität Innsbruck', url: 'https://www.uibk.ac.at/', logo: 'img/institution_logos/innsbruck.png' },
+ { name: 'Universitätsklinikum Jena', url: 'https://www.uniklinikum-jena.de/', logo: 'img/institution_logos/jena.png' },
+];
+
+const funders = [
+ { name: 'NIH / NIBIB', logo: 'img/funding_logos/nibib.svg', url: 'https://www.nibib.nih.gov/' },
+ { name: 'NIH', logo: 'img/funding_logos/nih.svg', url: 'https://www.nih.gov/' },
+ { name: 'DFG', logo: 'img/funding_logos/dfg.png', url: 'https://www.dfg.de/' },
+ { name: 'FWF', logo: 'img/funding_logos/fwf.svg', url: 'https://www.fwf.ac.at/' },
+ { name: 'AWS', logo: 'img/funding_logos/aws.svg', url: 'https://aws.amazon.com/' },
+ { name: 'Azure', logo: 'img/funding_logos/azure.png', url: 'https://azure.microsoft.com/' },
+];
+
+const contributors = [
+ { login: 'LorenzE', contributions: 3902 },
+ { login: 'chdinh', contributions: 2868 },
+ { login: 'gabrielbmotta', contributions: 1326 },
+ { login: 'juangpc', contributions: 1207 },
+ { login: 'RDoerfel', contributions: 626 },
+ { login: '1DIce', contributions: 267 },
+ { login: 'LostSign', contributions: 194 },
+ { login: 'ViktorKL', contributions: 179 },
+ { login: 'GBeret', contributions: 169 },
+ { login: 'rickytjen', contributions: 156 },
+ { login: 'JanaKiesel', contributions: 144 },
+ { login: 'floschl', contributions: 76 },
+ { login: 'joewalter', contributions: 64 },
+ { login: 'sheinke', contributions: 58 },
+ { login: 'Andrey1994', contributions: 46 },
+ { login: 'TiKunze', contributions: 41 },
+ { login: 'farndt', contributions: 39 },
+ { login: 'imsorryk', contributions: 35 },
+ { login: 'louiseichhorst', contributions: 20 },
+ { login: 'femigr', contributions: 17 },
+ { login: 'johaenns', contributions: 14 },
+ { login: 'jobehrens', contributions: 12 },
+ { login: 'cdoshi', contributions: 12 },
+ { login: 'cpieloth', contributions: 11 },
+ { login: 'alexrockhill', contributions: 10 },
+ { login: 'buildqa', contributions: 9 },
+ { login: 'SachdevaS', contributions: 7 },
+ { login: 'er06645810', contributions: 6 },
+ { login: 'mfarisyahya', contributions: 6 },
+ { login: 'ag-fieldline', contributions: 5 },
+ { login: 'betaha', contributions: 4 },
+ { login: 'Julius-L', contributions: 4 },
+ { login: 'MKlamke', contributions: 4 },
+ { login: 'fjpolo', contributions: 4 },
+ { login: 'benkay86', contributions: 3 },
+ { login: 'jasmainak', contributions: 3 },
+ { login: 'PetrosSimidyan', contributions: 3 },
+ { login: 'larsoner', contributions: 2 },
+];
+
+function WaveBackground() {
+ return (
+
+
+ {/* Semi-transparent filled bands below each wave */}
+
+
+
+
+ {/* EEG-like trace lines */}
+
+
+
+
+
+
+
+ );
+}
+
+function HeroLogo() {
+ const { colorMode } = useColorMode();
+ const src = colorMode === 'dark' ? 'img/logo-dark.svg' : 'img/logo.svg';
+ return ;
+}
+
+export default function Home(): JSX.Element {
+ const { siteConfig } = useDocusaurusContext();
+ const version = siteConfig.customFields?.version as string;
+
+ return (
+
+
+
+
+
+ {/* Applications */}
+
+
+
+ {applications.map((app, idx) => (
+
+
+
+
{app.title}
+
{app.description}
+
Learn more →
+
+
+ ))}
+
+
+
+
+ {/* Contributors */}
+
+
+
Contributors
+
+ MNE-CPP is built by an open-source community. Thank you to all our contributors!
+
+
+
+
+
+ {/* Supported by Researchers */}
+
+
+
Research Partners
+
+ {institutions.map((inst, idx) => (
+
+
+
+ ))}
+
+
+
+
+ {/* Funding */}
+
+
+
Funding
+
+ {funders.map((f, idx) => (
+
+
+
+ ))}
+
+
+
+
+
+ );
+}
diff --git a/doc/website/static/fonts/KaTeX_AMS-Regular.ttf b/doc/website/static/fonts/KaTeX_AMS-Regular.ttf
new file mode 100644
index 00000000000..c6f9a5e7c03
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_AMS-Regular.ttf differ
diff --git a/doc/website/static/fonts/KaTeX_AMS-Regular.woff b/doc/website/static/fonts/KaTeX_AMS-Regular.woff
new file mode 100644
index 00000000000..b804d7b33a3
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_AMS-Regular.woff differ
diff --git a/doc/website/static/fonts/KaTeX_AMS-Regular.woff2 b/doc/website/static/fonts/KaTeX_AMS-Regular.woff2
new file mode 100644
index 00000000000..0acaaff03d4
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_AMS-Regular.woff2 differ
diff --git a/doc/website/static/fonts/KaTeX_Caligraphic-Bold.ttf b/doc/website/static/fonts/KaTeX_Caligraphic-Bold.ttf
new file mode 100644
index 00000000000..9ff4a5e0442
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Caligraphic-Bold.ttf differ
diff --git a/doc/website/static/fonts/KaTeX_Caligraphic-Bold.woff b/doc/website/static/fonts/KaTeX_Caligraphic-Bold.woff
new file mode 100644
index 00000000000..9759710d1d3
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Caligraphic-Bold.woff differ
diff --git a/doc/website/static/fonts/KaTeX_Caligraphic-Bold.woff2 b/doc/website/static/fonts/KaTeX_Caligraphic-Bold.woff2
new file mode 100644
index 00000000000..f390922ecef
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Caligraphic-Bold.woff2 differ
diff --git a/doc/website/static/fonts/KaTeX_Caligraphic-Regular.ttf b/doc/website/static/fonts/KaTeX_Caligraphic-Regular.ttf
new file mode 100644
index 00000000000..f522294ff0f
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Caligraphic-Regular.ttf differ
diff --git a/doc/website/static/fonts/KaTeX_Caligraphic-Regular.woff b/doc/website/static/fonts/KaTeX_Caligraphic-Regular.woff
new file mode 100644
index 00000000000..9bdd534fd2b
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Caligraphic-Regular.woff differ
diff --git a/doc/website/static/fonts/KaTeX_Caligraphic-Regular.woff2 b/doc/website/static/fonts/KaTeX_Caligraphic-Regular.woff2
new file mode 100644
index 00000000000..75344a1f98e
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Caligraphic-Regular.woff2 differ
diff --git a/doc/website/static/fonts/KaTeX_Fraktur-Bold.ttf b/doc/website/static/fonts/KaTeX_Fraktur-Bold.ttf
new file mode 100644
index 00000000000..4e98259c3b5
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Fraktur-Bold.ttf differ
diff --git a/doc/website/static/fonts/KaTeX_Fraktur-Bold.woff b/doc/website/static/fonts/KaTeX_Fraktur-Bold.woff
new file mode 100644
index 00000000000..e7730f66275
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Fraktur-Bold.woff differ
diff --git a/doc/website/static/fonts/KaTeX_Fraktur-Bold.woff2 b/doc/website/static/fonts/KaTeX_Fraktur-Bold.woff2
new file mode 100644
index 00000000000..395f28beac2
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Fraktur-Bold.woff2 differ
diff --git a/doc/website/static/fonts/KaTeX_Fraktur-Regular.ttf b/doc/website/static/fonts/KaTeX_Fraktur-Regular.ttf
new file mode 100644
index 00000000000..b8461b275fa
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Fraktur-Regular.ttf differ
diff --git a/doc/website/static/fonts/KaTeX_Fraktur-Regular.woff b/doc/website/static/fonts/KaTeX_Fraktur-Regular.woff
new file mode 100644
index 00000000000..acab069f90b
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Fraktur-Regular.woff differ
diff --git a/doc/website/static/fonts/KaTeX_Fraktur-Regular.woff2 b/doc/website/static/fonts/KaTeX_Fraktur-Regular.woff2
new file mode 100644
index 00000000000..735f6948d63
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Fraktur-Regular.woff2 differ
diff --git a/doc/website/static/fonts/KaTeX_Main-Bold.ttf b/doc/website/static/fonts/KaTeX_Main-Bold.ttf
new file mode 100644
index 00000000000..4060e627dc3
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Main-Bold.ttf differ
diff --git a/doc/website/static/fonts/KaTeX_Main-Bold.woff b/doc/website/static/fonts/KaTeX_Main-Bold.woff
new file mode 100644
index 00000000000..f38136ac1cc
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Main-Bold.woff differ
diff --git a/doc/website/static/fonts/KaTeX_Main-Bold.woff2 b/doc/website/static/fonts/KaTeX_Main-Bold.woff2
new file mode 100644
index 00000000000..ab2ad21da6f
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Main-Bold.woff2 differ
diff --git a/doc/website/static/fonts/KaTeX_Main-BoldItalic.ttf b/doc/website/static/fonts/KaTeX_Main-BoldItalic.ttf
new file mode 100644
index 00000000000..dc007977ee7
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Main-BoldItalic.ttf differ
diff --git a/doc/website/static/fonts/KaTeX_Main-BoldItalic.woff b/doc/website/static/fonts/KaTeX_Main-BoldItalic.woff
new file mode 100644
index 00000000000..67807b0bd4f
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Main-BoldItalic.woff differ
diff --git a/doc/website/static/fonts/KaTeX_Main-BoldItalic.woff2 b/doc/website/static/fonts/KaTeX_Main-BoldItalic.woff2
new file mode 100644
index 00000000000..5931794de4a
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Main-BoldItalic.woff2 differ
diff --git a/doc/website/static/fonts/KaTeX_Main-Italic.ttf b/doc/website/static/fonts/KaTeX_Main-Italic.ttf
new file mode 100644
index 00000000000..0e9b0f354ad
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Main-Italic.ttf differ
diff --git a/doc/website/static/fonts/KaTeX_Main-Italic.woff b/doc/website/static/fonts/KaTeX_Main-Italic.woff
new file mode 100644
index 00000000000..6f43b594b6c
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Main-Italic.woff differ
diff --git a/doc/website/static/fonts/KaTeX_Main-Italic.woff2 b/doc/website/static/fonts/KaTeX_Main-Italic.woff2
new file mode 100644
index 00000000000..b50920e1388
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Main-Italic.woff2 differ
diff --git a/doc/website/static/fonts/KaTeX_Main-Regular.ttf b/doc/website/static/fonts/KaTeX_Main-Regular.ttf
new file mode 100644
index 00000000000..dd45e1ed2e1
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Main-Regular.ttf differ
diff --git a/doc/website/static/fonts/KaTeX_Main-Regular.woff b/doc/website/static/fonts/KaTeX_Main-Regular.woff
new file mode 100644
index 00000000000..21f5812968c
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Main-Regular.woff differ
diff --git a/doc/website/static/fonts/KaTeX_Main-Regular.woff2 b/doc/website/static/fonts/KaTeX_Main-Regular.woff2
new file mode 100644
index 00000000000..eb24a7ba282
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Main-Regular.woff2 differ
diff --git a/doc/website/static/fonts/KaTeX_Math-BoldItalic.ttf b/doc/website/static/fonts/KaTeX_Math-BoldItalic.ttf
new file mode 100644
index 00000000000..728ce7a1e2c
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Math-BoldItalic.ttf differ
diff --git a/doc/website/static/fonts/KaTeX_Math-BoldItalic.woff b/doc/website/static/fonts/KaTeX_Math-BoldItalic.woff
new file mode 100644
index 00000000000..0ae390d74c9
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Math-BoldItalic.woff differ
diff --git a/doc/website/static/fonts/KaTeX_Math-BoldItalic.woff2 b/doc/website/static/fonts/KaTeX_Math-BoldItalic.woff2
new file mode 100644
index 00000000000..29657023adc
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Math-BoldItalic.woff2 differ
diff --git a/doc/website/static/fonts/KaTeX_Math-Italic.ttf b/doc/website/static/fonts/KaTeX_Math-Italic.ttf
new file mode 100644
index 00000000000..70d559b4e93
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Math-Italic.ttf differ
diff --git a/doc/website/static/fonts/KaTeX_Math-Italic.woff b/doc/website/static/fonts/KaTeX_Math-Italic.woff
new file mode 100644
index 00000000000..eb5159d4c1c
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Math-Italic.woff differ
diff --git a/doc/website/static/fonts/KaTeX_Math-Italic.woff2 b/doc/website/static/fonts/KaTeX_Math-Italic.woff2
new file mode 100644
index 00000000000..215c143fd78
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Math-Italic.woff2 differ
diff --git a/doc/website/static/fonts/KaTeX_SansSerif-Bold.ttf b/doc/website/static/fonts/KaTeX_SansSerif-Bold.ttf
new file mode 100644
index 00000000000..2f65a8a3a6d
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_SansSerif-Bold.ttf differ
diff --git a/doc/website/static/fonts/KaTeX_SansSerif-Bold.woff b/doc/website/static/fonts/KaTeX_SansSerif-Bold.woff
new file mode 100644
index 00000000000..8d47c02d940
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_SansSerif-Bold.woff differ
diff --git a/doc/website/static/fonts/KaTeX_SansSerif-Bold.woff2 b/doc/website/static/fonts/KaTeX_SansSerif-Bold.woff2
new file mode 100644
index 00000000000..cfaa3bda592
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_SansSerif-Bold.woff2 differ
diff --git a/doc/website/static/fonts/KaTeX_SansSerif-Italic.ttf b/doc/website/static/fonts/KaTeX_SansSerif-Italic.ttf
new file mode 100644
index 00000000000..d5850df98ec
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_SansSerif-Italic.ttf differ
diff --git a/doc/website/static/fonts/KaTeX_SansSerif-Italic.woff b/doc/website/static/fonts/KaTeX_SansSerif-Italic.woff
new file mode 100644
index 00000000000..7e02df96362
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_SansSerif-Italic.woff differ
diff --git a/doc/website/static/fonts/KaTeX_SansSerif-Italic.woff2 b/doc/website/static/fonts/KaTeX_SansSerif-Italic.woff2
new file mode 100644
index 00000000000..349c06dc609
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_SansSerif-Italic.woff2 differ
diff --git a/doc/website/static/fonts/KaTeX_SansSerif-Regular.ttf b/doc/website/static/fonts/KaTeX_SansSerif-Regular.ttf
new file mode 100644
index 00000000000..537279f6bd2
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_SansSerif-Regular.ttf differ
diff --git a/doc/website/static/fonts/KaTeX_SansSerif-Regular.woff b/doc/website/static/fonts/KaTeX_SansSerif-Regular.woff
new file mode 100644
index 00000000000..31b84829b42
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_SansSerif-Regular.woff differ
diff --git a/doc/website/static/fonts/KaTeX_SansSerif-Regular.woff2 b/doc/website/static/fonts/KaTeX_SansSerif-Regular.woff2
new file mode 100644
index 00000000000..a90eea85f6f
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_SansSerif-Regular.woff2 differ
diff --git a/doc/website/static/fonts/KaTeX_Script-Regular.ttf b/doc/website/static/fonts/KaTeX_Script-Regular.ttf
new file mode 100644
index 00000000000..fd679bf374a
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Script-Regular.ttf differ
diff --git a/doc/website/static/fonts/KaTeX_Script-Regular.woff b/doc/website/static/fonts/KaTeX_Script-Regular.woff
new file mode 100644
index 00000000000..0e7da821eee
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Script-Regular.woff differ
diff --git a/doc/website/static/fonts/KaTeX_Script-Regular.woff2 b/doc/website/static/fonts/KaTeX_Script-Regular.woff2
new file mode 100644
index 00000000000..b3048fc1156
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Script-Regular.woff2 differ
diff --git a/doc/website/static/fonts/KaTeX_Size1-Regular.ttf b/doc/website/static/fonts/KaTeX_Size1-Regular.ttf
new file mode 100644
index 00000000000..871fd7d19d8
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Size1-Regular.ttf differ
diff --git a/doc/website/static/fonts/KaTeX_Size1-Regular.woff b/doc/website/static/fonts/KaTeX_Size1-Regular.woff
new file mode 100644
index 00000000000..7f292d91184
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Size1-Regular.woff differ
diff --git a/doc/website/static/fonts/KaTeX_Size1-Regular.woff2 b/doc/website/static/fonts/KaTeX_Size1-Regular.woff2
new file mode 100644
index 00000000000..c5a8462fbfe
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Size1-Regular.woff2 differ
diff --git a/doc/website/static/fonts/KaTeX_Size2-Regular.ttf b/doc/website/static/fonts/KaTeX_Size2-Regular.ttf
new file mode 100644
index 00000000000..7a212caf91c
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Size2-Regular.ttf differ
diff --git a/doc/website/static/fonts/KaTeX_Size2-Regular.woff b/doc/website/static/fonts/KaTeX_Size2-Regular.woff
new file mode 100644
index 00000000000..d241d9be2d3
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Size2-Regular.woff differ
diff --git a/doc/website/static/fonts/KaTeX_Size2-Regular.woff2 b/doc/website/static/fonts/KaTeX_Size2-Regular.woff2
new file mode 100644
index 00000000000..e1bccfe2403
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Size2-Regular.woff2 differ
diff --git a/doc/website/static/fonts/KaTeX_Size3-Regular.ttf b/doc/website/static/fonts/KaTeX_Size3-Regular.ttf
new file mode 100644
index 00000000000..00bff3495fa
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Size3-Regular.ttf differ
diff --git a/doc/website/static/fonts/KaTeX_Size3-Regular.woff b/doc/website/static/fonts/KaTeX_Size3-Regular.woff
new file mode 100644
index 00000000000..e6e9b658dcf
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Size3-Regular.woff differ
diff --git a/doc/website/static/fonts/KaTeX_Size3-Regular.woff2 b/doc/website/static/fonts/KaTeX_Size3-Regular.woff2
new file mode 100644
index 00000000000..249a2866221
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Size3-Regular.woff2 differ
diff --git a/doc/website/static/fonts/KaTeX_Size4-Regular.ttf b/doc/website/static/fonts/KaTeX_Size4-Regular.ttf
new file mode 100644
index 00000000000..74f08921f00
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Size4-Regular.ttf differ
diff --git a/doc/website/static/fonts/KaTeX_Size4-Regular.woff b/doc/website/static/fonts/KaTeX_Size4-Regular.woff
new file mode 100644
index 00000000000..e1ec5457664
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Size4-Regular.woff differ
diff --git a/doc/website/static/fonts/KaTeX_Size4-Regular.woff2 b/doc/website/static/fonts/KaTeX_Size4-Regular.woff2
new file mode 100644
index 00000000000..680c1308507
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Size4-Regular.woff2 differ
diff --git a/doc/website/static/fonts/KaTeX_Typewriter-Regular.ttf b/doc/website/static/fonts/KaTeX_Typewriter-Regular.ttf
new file mode 100644
index 00000000000..c83252c5714
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Typewriter-Regular.ttf differ
diff --git a/doc/website/static/fonts/KaTeX_Typewriter-Regular.woff b/doc/website/static/fonts/KaTeX_Typewriter-Regular.woff
new file mode 100644
index 00000000000..2432419f289
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Typewriter-Regular.woff differ
diff --git a/doc/website/static/fonts/KaTeX_Typewriter-Regular.woff2 b/doc/website/static/fonts/KaTeX_Typewriter-Regular.woff2
new file mode 100644
index 00000000000..771f1af705f
Binary files /dev/null and b/doc/website/static/fonts/KaTeX_Typewriter-Regular.woff2 differ
diff --git a/doc/website/static/img/1280px-EEGoSportsGUI.jpg b/doc/website/static/img/1280px-EEGoSportsGUI.jpg
new file mode 100644
index 00000000000..8a8c0147451
Binary files /dev/null and b/doc/website/static/img/1280px-EEGoSportsGUI.jpg differ
diff --git a/doc/website/static/img/BrainAMP_GUI.jpg b/doc/website/static/img/BrainAMP_GUI.jpg
new file mode 100644
index 00000000000..5088aee26ff
Binary files /dev/null and b/doc/website/static/img/BrainAMP_GUI.jpg differ
diff --git a/doc/website/static/img/EEGoSportsImpedanceWidget.jpg b/doc/website/static/img/EEGoSportsImpedanceWidget.jpg
new file mode 100644
index 00000000000..a661d74337b
Binary files /dev/null and b/doc/website/static/img/EEGoSportsImpedanceWidget.jpg differ
diff --git a/doc/website/static/img/GUSBampGUI.jpg b/doc/website/static/img/GUSBampGUI.jpg
new file mode 100644
index 00000000000..512cc1df930
Binary files /dev/null and b/doc/website/static/img/GUSBampGUI.jpg differ
diff --git a/doc/website/static/img/analyze/mne_an_1.png b/doc/website/static/img/analyze/mne_an_1.png
new file mode 100644
index 00000000000..e3365acb4b1
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_1.png differ
diff --git a/doc/website/static/img/analyze/mne_an_2.png b/doc/website/static/img/analyze/mne_an_2.png
new file mode 100644
index 00000000000..d4f92b57542
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_2.png differ
diff --git a/doc/website/static/img/analyze/mne_an_annotationmanager_2.png b/doc/website/static/img/analyze/mne_an_annotationmanager_2.png
new file mode 100644
index 00000000000..f852c31e173
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_annotationmanager_2.png differ
diff --git a/doc/website/static/img/analyze/mne_an_annotationmanager_3.png b/doc/website/static/img/analyze/mne_an_annotationmanager_3.png
new file mode 100644
index 00000000000..3f3e31599e8
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_annotationmanager_3.png differ
diff --git a/doc/website/static/img/analyze/mne_an_annotationmanager_4.png b/doc/website/static/img/analyze/mne_an_annotationmanager_4.png
new file mode 100644
index 00000000000..2f0b67b3626
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_annotationmanager_4.png differ
diff --git a/doc/website/static/img/analyze/mne_an_annotationmanager_5.png b/doc/website/static/img/analyze/mne_an_annotationmanager_5.png
new file mode 100644
index 00000000000..7c43d1e7e00
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_annotationmanager_5.png differ
diff --git a/doc/website/static/img/analyze/mne_an_avg1.png b/doc/website/static/img/analyze/mne_an_avg1.png
new file mode 100644
index 00000000000..39c021f4604
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_avg1.png differ
diff --git a/doc/website/static/img/analyze/mne_an_avg2.png b/doc/website/static/img/analyze/mne_an_avg2.png
new file mode 100644
index 00000000000..9d3e23c5c40
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_avg2.png differ
diff --git a/doc/website/static/img/analyze/mne_an_avg3.png b/doc/website/static/img/analyze/mne_an_avg3.png
new file mode 100644
index 00000000000..5d5e1240bc5
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_avg3.png differ
diff --git a/doc/website/static/img/analyze/mne_an_avg4.png b/doc/website/static/img/analyze/mne_an_avg4.png
new file mode 100644
index 00000000000..9a2208c81b8
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_avg4.png differ
diff --git a/doc/website/static/img/analyze/mne_an_chanselect_1.png b/doc/website/static/img/analyze/mne_an_chanselect_1.png
new file mode 100644
index 00000000000..255edd88b2f
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_chanselect_1.png differ
diff --git a/doc/website/static/img/analyze/mne_an_chanselect_2.png b/doc/website/static/img/analyze/mne_an_chanselect_2.png
new file mode 100644
index 00000000000..ee668547f89
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_chanselect_2.png differ
diff --git a/doc/website/static/img/analyze/mne_an_coreg.png b/doc/website/static/img/analyze/mne_an_coreg.png
new file mode 100644
index 00000000000..8406bce8876
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_coreg.png differ
diff --git a/doc/website/static/img/analyze/mne_an_coreg_adjust.png b/doc/website/static/img/analyze/mne_an_coreg_adjust.png
new file mode 100644
index 00000000000..c3765e1ee69
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_coreg_adjust.png differ
diff --git a/doc/website/static/img/analyze/mne_an_coreg_fit.png b/doc/website/static/img/analyze/mne_an_coreg_fit.png
new file mode 100644
index 00000000000..d2a13c97e31
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_coreg_fit.png differ
diff --git a/doc/website/static/img/analyze/mne_an_coreg_load.png b/doc/website/static/img/analyze/mne_an_coreg_load.png
new file mode 100644
index 00000000000..d6219dd56d0
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_coreg_load.png differ
diff --git a/doc/website/static/img/analyze/mne_an_dataloader_1.png b/doc/website/static/img/analyze/mne_an_dataloader_1.png
new file mode 100644
index 00000000000..cc8754f7cd6
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_dataloader_1.png differ
diff --git a/doc/website/static/img/analyze/mne_an_datamanager_1.png b/doc/website/static/img/analyze/mne_an_datamanager_1.png
new file mode 100644
index 00000000000..4c20a063d25
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_datamanager_1.png differ
diff --git a/doc/website/static/img/analyze/mne_an_datamanager_2.png b/doc/website/static/img/analyze/mne_an_datamanager_2.png
new file mode 100644
index 00000000000..642ddecf9b2
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_datamanager_2.png differ
diff --git a/doc/website/static/img/analyze/mne_an_datamanager_3.png b/doc/website/static/img/analyze/mne_an_datamanager_3.png
new file mode 100644
index 00000000000..86d07cdf7d7
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_datamanager_3.png differ
diff --git a/doc/website/static/img/analyze/mne_an_dip1.png b/doc/website/static/img/analyze/mne_an_dip1.png
new file mode 100644
index 00000000000..7336f340055
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_dip1.png differ
diff --git a/doc/website/static/img/analyze/mne_an_dip2.png b/doc/website/static/img/analyze/mne_an_dip2.png
new file mode 100644
index 00000000000..b4bef481a39
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_dip2.png differ
diff --git a/doc/website/static/img/analyze/mne_an_dip3.png b/doc/website/static/img/analyze/mne_an_dip3.png
new file mode 100644
index 00000000000..2e6b1bf3248
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_dip3.png differ
diff --git a/doc/website/static/img/analyze/mne_an_filter_1.png b/doc/website/static/img/analyze/mne_an_filter_1.png
new file mode 100644
index 00000000000..5ead7b21a79
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_filter_1.png differ
diff --git a/doc/website/static/img/analyze/mne_an_filter_2.png b/doc/website/static/img/analyze/mne_an_filter_2.png
new file mode 100644
index 00000000000..8c82d7c71ca
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_filter_2.png differ
diff --git a/doc/website/static/img/analyze/mne_an_filter_3.png b/doc/website/static/img/analyze/mne_an_filter_3.png
new file mode 100644
index 00000000000..56ef4ac6207
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_filter_3.png differ
diff --git a/doc/website/static/img/analyze/mne_an_rawdataviewer_1.png b/doc/website/static/img/analyze/mne_an_rawdataviewer_1.png
new file mode 100644
index 00000000000..97d53371992
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_rawdataviewer_1.png differ
diff --git a/doc/website/static/img/analyze/mne_an_scaling1.png b/doc/website/static/img/analyze/mne_an_scaling1.png
new file mode 100644
index 00000000000..5224849f5c0
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_scaling1.png differ
diff --git a/doc/website/static/img/analyze/mne_an_scaling2.png b/doc/website/static/img/analyze/mne_an_scaling2.png
new file mode 100644
index 00000000000..b11ed703eb5
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_scaling2.png differ
diff --git a/doc/website/static/img/analyze/mne_an_scaling3.png b/doc/website/static/img/analyze/mne_an_scaling3.png
new file mode 100644
index 00000000000..fb5e41f110f
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_scaling3.png differ
diff --git a/doc/website/static/img/analyze/mne_an_scaling4.png b/doc/website/static/img/analyze/mne_an_scaling4.png
new file mode 100644
index 00000000000..529e471821e
Binary files /dev/null and b/doc/website/static/img/analyze/mne_an_scaling4.png differ
diff --git a/doc/website/static/img/analyze/mne_offon1.png b/doc/website/static/img/analyze/mne_offon1.png
new file mode 100644
index 00000000000..cf61d781df4
Binary files /dev/null and b/doc/website/static/img/analyze/mne_offon1.png differ
diff --git a/doc/website/static/img/analyze/mne_offon2.png b/doc/website/static/img/analyze/mne_offon2.png
new file mode 100644
index 00000000000..6843af65f91
Binary files /dev/null and b/doc/website/static/img/analyze/mne_offon2.png differ
diff --git a/doc/website/static/img/analyze/mne_offon3.png b/doc/website/static/img/analyze/mne_offon3.png
new file mode 100644
index 00000000000..04042d584b3
Binary files /dev/null and b/doc/website/static/img/analyze/mne_offon3.png differ
diff --git a/doc/website/static/img/dev_tools.png b/doc/website/static/img/dev_tools.png
new file mode 100644
index 00000000000..a1a8d211215
Binary files /dev/null and b/doc/website/static/img/dev_tools.png differ
diff --git a/doc/website/static/img/eeg_amp_scan1.png b/doc/website/static/img/eeg_amp_scan1.png
new file mode 100644
index 00000000000..b0c8bbb4270
Binary files /dev/null and b/doc/website/static/img/eeg_amp_scan1.png differ
diff --git a/doc/website/static/img/eeg_amp_scan2.jpg b/doc/website/static/img/eeg_amp_scan2.jpg
new file mode 100644
index 00000000000..815be536577
Binary files /dev/null and b/doc/website/static/img/eeg_amp_scan2.jpg differ
diff --git a/doc/website/static/img/eeg_amp_scan3.png b/doc/website/static/img/eeg_amp_scan3.png
new file mode 100644
index 00000000000..e2a62faddc7
Binary files /dev/null and b/doc/website/static/img/eeg_amp_scan3.png differ
diff --git a/doc/website/static/img/eeg_amp_scan4.png b/doc/website/static/img/eeg_amp_scan4.png
new file mode 100644
index 00000000000..cd068b34a6a
Binary files /dev/null and b/doc/website/static/img/eeg_amp_scan4.png differ
diff --git a/doc/website/static/img/favicon.ico b/doc/website/static/img/favicon.ico
new file mode 100644
index 00000000000..0d7e0898fef
Binary files /dev/null and b/doc/website/static/img/favicon.ico differ
diff --git a/doc/website/static/img/funding_logos/aws.svg b/doc/website/static/img/funding_logos/aws.svg
new file mode 100644
index 00000000000..75b9e9c8958
--- /dev/null
+++ b/doc/website/static/img/funding_logos/aws.svg
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+
+
diff --git a/doc/website/static/img/funding_logos/azure.png b/doc/website/static/img/funding_logos/azure.png
new file mode 100644
index 00000000000..23f6803bbdf
Binary files /dev/null and b/doc/website/static/img/funding_logos/azure.png differ
diff --git a/doc/website/static/img/funding_logos/dfg.png b/doc/website/static/img/funding_logos/dfg.png
new file mode 100644
index 00000000000..c87ecb82f6c
Binary files /dev/null and b/doc/website/static/img/funding_logos/dfg.png differ
diff --git a/doc/website/static/img/funding_logos/fwf.svg b/doc/website/static/img/funding_logos/fwf.svg
new file mode 100644
index 00000000000..633b000d296
--- /dev/null
+++ b/doc/website/static/img/funding_logos/fwf.svg
@@ -0,0 +1,155 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/website/static/img/funding_logos/nibib.svg b/doc/website/static/img/funding_logos/nibib.svg
new file mode 100644
index 00000000000..59075a92ac1
--- /dev/null
+++ b/doc/website/static/img/funding_logos/nibib.svg
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/website/static/img/funding_logos/nih.svg b/doc/website/static/img/funding_logos/nih.svg
new file mode 100644
index 00000000000..6424bfa2e7f
--- /dev/null
+++ b/doc/website/static/img/funding_logos/nih.svg
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/website/static/img/hpi/mne_scan_hpi_3DView.png b/doc/website/static/img/hpi/mne_scan_hpi_3DView.png
new file mode 100644
index 00000000000..2f67d7736bd
Binary files /dev/null and b/doc/website/static/img/hpi/mne_scan_hpi_3DView.png differ
diff --git a/doc/website/static/img/hpi/mne_scan_hpi_3D_control.png b/doc/website/static/img/hpi/mne_scan_hpi_3D_control.png
new file mode 100644
index 00000000000..39b162b8f76
Binary files /dev/null and b/doc/website/static/img/hpi/mne_scan_hpi_3D_control.png differ
diff --git a/doc/website/static/img/hpi/mne_scan_hpi_control.png b/doc/website/static/img/hpi/mne_scan_hpi_control.png
new file mode 100644
index 00000000000..43051dccbb1
Binary files /dev/null and b/doc/website/static/img/hpi/mne_scan_hpi_control.png differ
diff --git a/doc/website/static/img/hpi/mne_scan_hpi_plugin.png b/doc/website/static/img/hpi/mne_scan_hpi_plugin.png
new file mode 100644
index 00000000000..44ccc1740cd
Binary files /dev/null and b/doc/website/static/img/hpi/mne_scan_hpi_plugin.png differ
diff --git a/doc/website/static/img/hpi/mne_scan_open_quick.png b/doc/website/static/img/hpi/mne_scan_open_quick.png
new file mode 100644
index 00000000000..3843aa879c4
Binary files /dev/null and b/doc/website/static/img/hpi/mne_scan_open_quick.png differ
diff --git a/doc/website/static/img/hpi/mne_scan_quick.png b/doc/website/static/img/hpi/mne_scan_quick.png
new file mode 100644
index 00000000000..42223e06f5f
Binary files /dev/null and b/doc/website/static/img/hpi/mne_scan_quick.png differ
diff --git a/doc/website/static/img/icon_mne-analyze_256x256.png b/doc/website/static/img/icon_mne-analyze_256x256.png
new file mode 100644
index 00000000000..e849c54fe11
Binary files /dev/null and b/doc/website/static/img/icon_mne-analyze_256x256.png differ
diff --git a/doc/website/static/img/icon_mne-browse_256x256.png b/doc/website/static/img/icon_mne-browse_256x256.png
new file mode 100644
index 00000000000..ec87cf2bf4c
Binary files /dev/null and b/doc/website/static/img/icon_mne-browse_256x256.png differ
diff --git a/doc/website/static/img/icon_mne-lib_256x256.png b/doc/website/static/img/icon_mne-lib_256x256.png
new file mode 100644
index 00000000000..bf57e9c6436
Binary files /dev/null and b/doc/website/static/img/icon_mne-lib_256x256.png differ
diff --git a/doc/website/static/img/icon_mne_inspect_256x256.png b/doc/website/static/img/icon_mne_inspect_256x256.png
new file mode 100644
index 00000000000..c946d0e5a27
Binary files /dev/null and b/doc/website/static/img/icon_mne_inspect_256x256.png differ
diff --git a/doc/website/static/img/icon_mne_scan_256x256.png b/doc/website/static/img/icon_mne_scan_256x256.png
new file mode 100644
index 00000000000..942dc4e30a9
Binary files /dev/null and b/doc/website/static/img/icon_mne_scan_256x256.png differ
diff --git a/doc/website/static/img/impedances.png b/doc/website/static/img/impedances.png
new file mode 100644
index 00000000000..1b359420106
Binary files /dev/null and b/doc/website/static/img/impedances.png differ
diff --git a/doc/website/static/img/institution_logos/Ilmenau.svg b/doc/website/static/img/institution_logos/Ilmenau.svg
new file mode 100644
index 00000000000..4fb322f2fbf
--- /dev/null
+++ b/doc/website/static/img/institution_logos/Ilmenau.svg
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/website/static/img/institution_logos/MGH.svg b/doc/website/static/img/institution_logos/MGH.svg
new file mode 100644
index 00000000000..e13da81ff48
--- /dev/null
+++ b/doc/website/static/img/institution_logos/MGH.svg
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/website/static/img/institution_logos/bch.svg b/doc/website/static/img/institution_logos/bch.svg
new file mode 100644
index 00000000000..68bee1c3aef
--- /dev/null
+++ b/doc/website/static/img/institution_logos/bch.svg
@@ -0,0 +1,1997 @@
+
+
+
+
+
+
+
diff --git a/doc/website/static/img/institution_logos/harvard.svg b/doc/website/static/img/institution_logos/harvard.svg
new file mode 100644
index 00000000000..ea18eb1be5a
--- /dev/null
+++ b/doc/website/static/img/institution_logos/harvard.svg
@@ -0,0 +1,1704 @@
+
+
+
+
+
+
+
diff --git a/doc/website/static/img/institution_logos/hst.svg b/doc/website/static/img/institution_logos/hst.svg
new file mode 100644
index 00000000000..3027087a823
--- /dev/null
+++ b/doc/website/static/img/institution_logos/hst.svg
@@ -0,0 +1,3145 @@
+
+
+
+
+
+
+
diff --git a/doc/website/static/img/institution_logos/innsbruck.png b/doc/website/static/img/institution_logos/innsbruck.png
new file mode 100644
index 00000000000..e00fb3beb0d
Binary files /dev/null and b/doc/website/static/img/institution_logos/innsbruck.png differ
diff --git a/doc/website/static/img/institution_logos/jena.png b/doc/website/static/img/institution_logos/jena.png
new file mode 100644
index 00000000000..758ebaeb672
Binary files /dev/null and b/doc/website/static/img/institution_logos/jena.png differ
diff --git a/doc/website/static/img/institution_logos/magdeburg.svg b/doc/website/static/img/institution_logos/magdeburg.svg
new file mode 100644
index 00000000000..6a2757bee12
--- /dev/null
+++ b/doc/website/static/img/institution_logos/magdeburg.svg
@@ -0,0 +1,260 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/website/static/img/institution_logos/martinos.svg b/doc/website/static/img/institution_logos/martinos.svg
new file mode 100644
index 00000000000..8537e75d6de
--- /dev/null
+++ b/doc/website/static/img/institution_logos/martinos.svg
@@ -0,0 +1,6833 @@
+
+
+
+
+
+
+
diff --git a/doc/website/static/img/institution_logos/stimulate_magdeburg.svg b/doc/website/static/img/institution_logos/stimulate_magdeburg.svg
new file mode 100644
index 00000000000..78411e70e9b
--- /dev/null
+++ b/doc/website/static/img/institution_logos/stimulate_magdeburg.svg
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/website/static/img/institution_logos/uthealth.png b/doc/website/static/img/institution_logos/uthealth.png
new file mode 100644
index 00000000000..401a344e3b7
Binary files /dev/null and b/doc/website/static/img/institution_logos/uthealth.png differ
diff --git a/doc/website/static/img/lib/connectivity_architecture.png b/doc/website/static/img/lib/connectivity_architecture.png
new file mode 100644
index 00000000000..b499ae0358f
Binary files /dev/null and b/doc/website/static/img/lib/connectivity_architecture.png differ
diff --git a/doc/website/static/img/lib/disp3d_architecture.png b/doc/website/static/img/lib/disp3d_architecture.png
new file mode 100644
index 00000000000..ccaddde708b
Binary files /dev/null and b/doc/website/static/img/lib/disp3d_architecture.png differ
diff --git a/doc/website/static/img/lib/disp3d_items.png b/doc/website/static/img/lib/disp3d_items.png
new file mode 100644
index 00000000000..076ac7675b9
Binary files /dev/null and b/doc/website/static/img/lib/disp3d_items.png differ
diff --git a/doc/website/static/img/logo-dark.svg b/doc/website/static/img/logo-dark.svg
new file mode 100644
index 00000000000..1449b673081
--- /dev/null
+++ b/doc/website/static/img/logo-dark.svg
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/website/static/img/logo.svg b/doc/website/static/img/logo.svg
new file mode 100644
index 00000000000..36627fe9587
--- /dev/null
+++ b/doc/website/static/img/logo.svg
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/website/static/img/mn_anonymizer_gui.png b/doc/website/static/img/mn_anonymizer_gui.png
new file mode 100644
index 00000000000..d4b0ff374cf
Binary files /dev/null and b/doc/website/static/img/mn_anonymizer_gui.png differ
diff --git a/doc/website/static/img/mne_inspect_screenshot.png b/doc/website/static/img/mne_inspect_screenshot.png
new file mode 100644
index 00000000000..b1fe7e74ac7
Binary files /dev/null and b/doc/website/static/img/mne_inspect_screenshot.png differ
diff --git a/doc/website/static/img/mne_scan_fiffsimulator.png b/doc/website/static/img/mne_scan_fiffsimulator.png
new file mode 100644
index 00000000000..18eb2d61c7e
Binary files /dev/null and b/doc/website/static/img/mne_scan_fiffsimulator.png differ
diff --git a/doc/website/static/img/mne_scan_fiffsimulator_size.png b/doc/website/static/img/mne_scan_fiffsimulator_size.png
new file mode 100644
index 00000000000..a867b9d894c
Binary files /dev/null and b/doc/website/static/img/mne_scan_fiffsimulator_size.png differ
diff --git a/doc/website/static/img/mne_scan_fwdControlWidget.png b/doc/website/static/img/mne_scan_fwdControlWidget.png
new file mode 100644
index 00000000000..7a7cdebd8c2
Binary files /dev/null and b/doc/website/static/img/mne_scan_fwdControlWidget.png differ
diff --git a/doc/website/static/img/mne_scan_fwdLoadPlugin.png b/doc/website/static/img/mne_scan_fwdLoadPlugin.png
new file mode 100644
index 00000000000..5286e0d0d63
Binary files /dev/null and b/doc/website/static/img/mne_scan_fwdLoadPlugin.png differ
diff --git a/doc/website/static/img/mne_scan_fwdPipelines.png b/doc/website/static/img/mne_scan_fwdPipelines.png
new file mode 100644
index 00000000000..7a8949e6684
Binary files /dev/null and b/doc/website/static/img/mne_scan_fwdPipelines.png differ
diff --git a/doc/website/static/img/mne_scan_fwdSettings.png b/doc/website/static/img/mne_scan_fwdSettings.png
new file mode 100644
index 00000000000..28b44336a02
Binary files /dev/null and b/doc/website/static/img/mne_scan_fwdSettings.png differ
diff --git a/doc/website/static/img/mne_scan_play_btn.png b/doc/website/static/img/mne_scan_play_btn.png
new file mode 100644
index 00000000000..fc4ed474e61
Binary files /dev/null and b/doc/website/static/img/mne_scan_play_btn.png differ
diff --git a/doc/website/static/img/mne_scan_source_loc_3dview.png b/doc/website/static/img/mne_scan_source_loc_3dview.png
new file mode 100644
index 00000000000..f5ba065fdef
Binary files /dev/null and b/doc/website/static/img/mne_scan_source_loc_3dview.png differ
diff --git a/doc/website/static/img/mne_scan_source_loc_averaging.png b/doc/website/static/img/mne_scan_source_loc_averaging.png
new file mode 100644
index 00000000000..a101fa82875
Binary files /dev/null and b/doc/website/static/img/mne_scan_source_loc_averaging.png differ
diff --git a/doc/website/static/img/mne_scan_source_loc_forward.png b/doc/website/static/img/mne_scan_source_loc_forward.png
new file mode 100644
index 00000000000..dd1496fdf59
Binary files /dev/null and b/doc/website/static/img/mne_scan_source_loc_forward.png differ
diff --git a/doc/website/static/img/mne_scan_source_loc_plugins.png b/doc/website/static/img/mne_scan_source_loc_plugins.png
new file mode 100644
index 00000000000..5e04a6b2a51
Binary files /dev/null and b/doc/website/static/img/mne_scan_source_loc_plugins.png differ
diff --git a/doc/website/static/img/mne_scan_source_loc_settings.png b/doc/website/static/img/mne_scan_source_loc_settings.png
new file mode 100644
index 00000000000..eb62883c103
Binary files /dev/null and b/doc/website/static/img/mne_scan_source_loc_settings.png differ
diff --git a/doc/website/static/img/mnetracer/access_chrome_tracer.png b/doc/website/static/img/mnetracer/access_chrome_tracer.png
new file mode 100644
index 00000000000..26224240419
Binary files /dev/null and b/doc/website/static/img/mnetracer/access_chrome_tracer.png differ
diff --git a/doc/website/static/img/mnetracer/trace_option.png b/doc/website/static/img/mnetracer/trace_option.png
new file mode 100644
index 00000000000..7abbea502be
Binary files /dev/null and b/doc/website/static/img/mnetracer/trace_option.png differ
diff --git a/doc/website/static/img/mnetracer/tracer_example.png b/doc/website/static/img/mnetracer/tracer_example.png
new file mode 100644
index 00000000000..22d6c429910
Binary files /dev/null and b/doc/website/static/img/mnetracer/tracer_example.png differ
diff --git a/doc/website/static/img/partners.png b/doc/website/static/img/partners.png
new file mode 100644
index 00000000000..2e58e0faf84
Binary files /dev/null and b/doc/website/static/img/partners.png differ
diff --git a/doc/website/static/img/ssvep_bci_example1.jpeg b/doc/website/static/img/ssvep_bci_example1.jpeg
new file mode 100644
index 00000000000..98f59332f1f
Binary files /dev/null and b/doc/website/static/img/ssvep_bci_example1.jpeg differ
diff --git a/doc/website/static/img/ssvep_bci_example2.png b/doc/website/static/img/ssvep_bci_example2.png
new file mode 100644
index 00000000000..f9da5dff4a2
Binary files /dev/null and b/doc/website/static/img/ssvep_bci_example2.png differ
diff --git a/doc/website/static/img/ssvep_bci_example3.jpeg b/doc/website/static/img/ssvep_bci_example3.jpeg
new file mode 100644
index 00000000000..68f48ed2bbb
Binary files /dev/null and b/doc/website/static/img/ssvep_bci_example3.jpeg differ
diff --git a/doc/website/static/img/ssvep_bci_example4.png b/doc/website/static/img/ssvep_bci_example4.png
new file mode 100644
index 00000000000..054129a9dc3
Binary files /dev/null and b/doc/website/static/img/ssvep_bci_example4.png differ
diff --git a/doc/website/static/img/ssvep_bci_example5.jpeg b/doc/website/static/img/ssvep_bci_example5.jpeg
new file mode 100644
index 00000000000..9feba991712
Binary files /dev/null and b/doc/website/static/img/ssvep_bci_example5.jpeg differ
diff --git a/doc/website/static/img/ssvep_bci_example6.jpeg b/doc/website/static/img/ssvep_bci_example6.jpeg
new file mode 100644
index 00000000000..2ee0d5da2d3
Binary files /dev/null and b/doc/website/static/img/ssvep_bci_example6.jpeg differ
diff --git a/doc/website/static/img/test_new.png b/doc/website/static/img/test_new.png
new file mode 100644
index 00000000000..91c46b99619
Binary files /dev/null and b/doc/website/static/img/test_new.png differ
diff --git a/doc/website/static/katex.min.css b/doc/website/static/katex.min.css
new file mode 100644
index 00000000000..3fffaffb924
--- /dev/null
+++ b/doc/website/static/katex.min.css
@@ -0,0 +1 @@
+@font-face{font-display:block;font-family:KaTeX_AMS;font-style:normal;font-weight:400;src:url(fonts/KaTeX_AMS-Regular.woff2) format("woff2"),url(fonts/KaTeX_AMS-Regular.woff) format("woff"),url(fonts/KaTeX_AMS-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Caligraphic;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Caligraphic-Bold.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Bold.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Caligraphic;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Caligraphic-Regular.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Regular.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Fraktur;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Fraktur-Bold.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Bold.woff) format("woff"),url(fonts/KaTeX_Fraktur-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Fraktur;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Fraktur-Regular.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Regular.woff) format("woff"),url(fonts/KaTeX_Fraktur-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Main-Bold.woff2) format("woff2"),url(fonts/KaTeX_Main-Bold.woff) format("woff"),url(fonts/KaTeX_Main-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Main-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Main-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Main-BoldItalic.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Main-Italic.woff2) format("woff2"),url(fonts/KaTeX_Main-Italic.woff) format("woff"),url(fonts/KaTeX_Main-Italic.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Main-Regular.woff2) format("woff2"),url(fonts/KaTeX_Main-Regular.woff) format("woff"),url(fonts/KaTeX_Main-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Math;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Math-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Math-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Math-BoldItalic.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Math;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Math-Italic.woff2) format("woff2"),url(fonts/KaTeX_Math-Italic.woff) format("woff"),url(fonts/KaTeX_Math-Italic.ttf) format("truetype")}@font-face{font-display:block;font-family:"KaTeX_SansSerif";font-style:normal;font-weight:700;src:url(fonts/KaTeX_SansSerif-Bold.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Bold.woff) format("woff"),url(fonts/KaTeX_SansSerif-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:"KaTeX_SansSerif";font-style:italic;font-weight:400;src:url(fonts/KaTeX_SansSerif-Italic.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Italic.woff) format("woff"),url(fonts/KaTeX_SansSerif-Italic.ttf) format("truetype")}@font-face{font-display:block;font-family:"KaTeX_SansSerif";font-style:normal;font-weight:400;src:url(fonts/KaTeX_SansSerif-Regular.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Regular.woff) format("woff"),url(fonts/KaTeX_SansSerif-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Script;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Script-Regular.woff2) format("woff2"),url(fonts/KaTeX_Script-Regular.woff) format("woff"),url(fonts/KaTeX_Script-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size1;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size1-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size1-Regular.woff) format("woff"),url(fonts/KaTeX_Size1-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size2;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size2-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size2-Regular.woff) format("woff"),url(fonts/KaTeX_Size2-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size3;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size3-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size3-Regular.woff) format("woff"),url(fonts/KaTeX_Size3-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size4;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size4-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size4-Regular.woff) format("woff"),url(fonts/KaTeX_Size4-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Typewriter;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Typewriter-Regular.woff2) format("woff2"),url(fonts/KaTeX_Typewriter-Regular.woff) format("woff"),url(fonts/KaTeX_Typewriter-Regular.ttf) format("truetype")}.katex{font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important;border-color:currentColor}.katex .katex-version:after{content:"0.16.28"}.katex .katex-mathml{clip:rect(1px,1px,1px,1px);border:0;height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:-webkit-min-content;width:-moz-min-content;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-style:italic;font-weight:700}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathboldfrak,.katex .textboldfrak{font-family:KaTeX_Fraktur;font-weight:700}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .mathsfit,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{border-collapse:collapse;display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;position:relative;vertical-align:bottom}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;font-size:1px;min-width:2px;vertical-align:bottom;width:2px}.katex .vbox{align-items:baseline;display:inline-flex;flex-direction:column}.katex .hbox{width:100%}.katex .hbox,.katex .thinbox{display:inline-flex;flex-direction:row}.katex .thinbox{max-width:0;width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{position:relative;width:0}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{border:0 solid;display:inline-block;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline{border-bottom-style:dashed;display:inline-block;width:100%}.katex .sqrt>.root{margin-left:.2777777778em;margin-right:-.5555555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.1666666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.3333333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.6666666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.4566666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.1466666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.7142857143em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.8571428571em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.1428571429em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.2857142857em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.4285714286em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.7142857143em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.0571428571em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.4685714286em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.9628571429em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.5542857143em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.5555555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.6666666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.7777777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.8888888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.1111111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.3333333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.3044444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.7644444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.4166666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.5833333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.6666666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.7283333333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.0733333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.3472222222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.4166666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.4861111111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.5555555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.6944444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.4402777778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.7277777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.2893518519em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.3472222222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.4050925926em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.462962963em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.5208333333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.6944444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.2002314815em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.4398148148em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.2410800386em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.2892960463em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.337512054em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.3857280617em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.4339440694em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.4821600771em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.5785920926em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.6943105111em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.8331726133em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.1996142719em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.2009646302em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.2411575563em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.2813504823em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.3215434084em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.3617363344em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.4019292605em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.4823151125em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.578778135em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.6945337621em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.8336012862em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .accent>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:block;height:inherit;position:absolute;width:100%}.katex svg path{stroke:none}.katex img{border-style:none;max-height:none;max-width:none;min-height:0;min-width:0}.katex .stretchy{display:block;overflow:hidden;position:relative;width:100%}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{overflow:hidden;position:relative;width:100%}.katex .halfarrow-left{left:0;overflow:hidden;position:absolute;width:50.2%}.katex .halfarrow-right{overflow:hidden;position:absolute;right:0;width:50.2%}.katex .brace-left{left:0;overflow:hidden;position:absolute;width:25.1%}.katex .brace-center{left:25%;overflow:hidden;position:absolute;width:50%}.katex .brace-right{overflow:hidden;position:absolute;right:0;width:25.1%}.katex .x-arrow-pad{padding:0 .5em}.katex .cd-arrow-pad{padding:0 .55556em 0 .27778em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{border:.04em solid;box-sizing:border-box}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex .angl{border-right:.049em solid;border-top:.049em solid;box-sizing:border-box;margin-right:.03889em}.katex .anglpad{padding:0 .03889em}.katex .eqn-num:before{content:"(" counter(katexEqnNo) ")";counter-increment:katexEqnNo}.katex .mml-eqn-num:before{content:"(" counter(mmlEqnNo) ")";counter-increment:mmlEqnNo}.katex .mtr-glue{width:50%}.katex .cd-vert-arrow{display:inline-block;position:relative}.katex .cd-label-left{display:inline-block;position:absolute;right:calc(50% + .3em);text-align:left}.katex .cd-label-right{display:inline-block;left:calc(50% + .3em);position:absolute;text-align:right}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{padding-left:2em;text-align:left}body{counter-reset:katexEqnNo mmlEqnNo}
diff --git a/doc/website/tsconfig.json b/doc/website/tsconfig.json
new file mode 100644
index 00000000000..52cf4a5ad00
--- /dev/null
+++ b/doc/website/tsconfig.json
@@ -0,0 +1,6 @@
+{
+ "extends": "@docusaurus/tsconfig",
+ "compilerOptions": {
+ "baseUrl": "."
+ }
+}
\ No newline at end of file
diff --git a/resources/general/explanations/fiff_explanations.txt b/resources/general/explanations/fiff_explanations.txt
index e0d9e016a1a..388e2c4dec4 100644
--- a/resources/general/explanations/fiff_explanations.txt
+++ b/resources/general/explanations/fiff_explanations.txt
@@ -1,434 +1,445 @@
-#
-#
-# This file contains explanations of items in a fif file
-#
-# Copyright 2006
-#
-# Matti Hamalainen
-# Athinoula A. Martinos Center for Biomedical Imaging
-# Charlestown, MA, USA
-#
-# $Header$
-# $Log$
-# Revision 1.22 2009/03/01 22:19:00 msh
-# Added some new tag numbers
-#
-# Revision 1.21 2009/02/20 13:40:10 msh
-# Added explanation for tag 3566
-#
-# Revision 1.20 2009/01/30 15:19:14 msh
-# Explain unsigned int data correctly
-# Version number incremented to 1.5
-# Added explanation for the FIFF_MNE_EVENT_TRIGGER_MASK tag
-#
-# Revision 1.19 2008/09/30 09:22:06 msh
-# Added Explanation for block 119 (MaxShield raw data)
-#
-# Revision 1.18 2008/06/07 13:38:53 msh
-# Added explanation for FIFFB_REF (118)
-#
-# Revision 1.17 2008/06/04 19:16:24 msh
-# Added tag number 3546
-#
-# Revision 1.16 2008/02/28 16:23:26 msh
-# Added tag 3523
-#
-# Revision 1.15 2007/11/06 03:23:57 msh
-# Added missing tags 3112 and 3113
-#
-# Revision 1.14 2007/02/27 14:22:50 msh
-# Added missing tag definitions
-#
-# Revision 1.13 2006/11/24 20:58:17 msh
-# Added missing tag numbers
-#
-# Revision 1.12 2006/11/08 13:13:23 msh
-# Added SSS tags
-#
-# Revision 1.11 2006/10/14 01:29:38 msh
-# Added explanations for derivations
-#
-# Revision 1.10 2006/09/26 10:45:09 msh
-# Added missing tag numbers 3515 and 3516
-#
-# Revision 1.9 2006/09/20 22:02:19 msh
-# Added Am to units
-#
-# Revision 1.8 2006/06/22 16:42:00 msh
-# Added explanation for tag 3582
-#
-# Revision 1.7 2006/05/28 17:43:53 msh
-# Added missing tag numbers to fiff_explanations.txt
-#
-# Revision 1.6 2006/05/11 16:42:09 msh
-# Fixed unit multiplier processing.
-#
-# Revision 1.5 2006/05/09 17:42:53 msh
-# Added tag 3560
-#
-# Revision 1.4 2006/04/29 12:12:29 msh
-# Added more missing tags.
-#
-# Revision 1.3 2006/04/27 00:53:53 msh
-# Added more missing explanations.
-#
-# Revision 1.2 2006/04/27 00:51:47 msh
-# Added missing explanations.
-#
-# Revision 1.1.1.1 2006/04/19 15:15:32 msh
-# Initial version
-#
-#
-#
-# Tag explanations
-#
-1 100 "file ID"
-1 101 "dir pointer"
-1 102 "directory"
-1 103 "block ID"
-1 104 "{"
-1 105 "}"
-1 106 "free list"
-1 107 "free block"
-1 108 "NOP"
-1 109 "parent FID"
-1 110 "parent BID"
-1 111 "block name"
-1 112 "block version"
-1 113 "creator"
-1 114 "modifier"
-1 115 "ref role"
-1 116 "ref file id"
-1 117 "ref file num"
-1 118 "ref file name"
-1 120 "ref block id"
-1 150 "acq. pars."
-1 151 "acq. stim seq."
-1 200 "nchan"
-1 201 "sfreq"
-1 202 "packing"
-1 203 "channel"
-1 204 "date"
-1 205 "subject"
-1 206 "comment"
-1 206 "comment"
-1 207 "nave"
-1 208 "firstsamp"
-1 209 "lastsamp"
-1 210 "aspect type"
-1 211 "ref. event"
-1 212 "scientist"
-1 213 "dig. point"
-1 214 "channel pos"
-1 215 "HPI slopes"
-1 216 "HPI # coils"
-1 217 "req. event"
-1 218 "req. limit"
-1 219 "lowpass"
-1 220 "bad chs"
-1 221 "artefacts"
-1 222 "transform"
-1 223 "highpass"
-1 224 "channel cals"
-1 225 "HPI bad chs"
-1 226 "HPI cor coef"
-1 227 "event comment"
-1 228 "nsamp"
-1 229 "time minimum"
-1 230 "subave size"
-1 231 "subave first"
-1 233 "block name"
-1 234 "dig. string"
-1 240 "HPI moments"
-1 241 "HPI g-values"
-1 242 "HPI fit accept"
-1 243 "HPI g limit"
-1 244 "HPI dist limit"
-1 245 "HPI coil no"
-1 263 "SSS coord frame"
-1 264 "SSS task"
-1 265 "SSS origin"
-1 266 "SSS in order"
-1 267 "SSS out order"
-1 268 "SSS nchan"
-1 269 "SSS components"
-1 270 "SSS cal chans"
-1 271 "SSS cal corrs"
-1 272 "SSS ST corr"
-1 300 "data buffer"
-1 301 "data skip"
-1 302 "epoch"
-1 400 "subject id"
-1 401 "first name"
-1 402 "middle name"
-1 403 "last name"
-1 404 "birthday"
-1 405 "sex"
-1 406 "handedness"
-1 407 "weight"
-1 408 "height"
-1 409 "comment"
-1 410 "subject HIS id"
-1 500 "project id"
-1 501 "proj. name"
-1 502 "project aim"
-1 503 "proj. pers."
-1 504 "proj. comm."
-1 600 "event ch #'s"
-1 601 "event list"
-1 701 "SQUID bias"
-1 702 "SQUID offset"
-1 703 "SQUID gate"
-1 800 "Decoupler matrix"
-1 1101 "MRI source"
-1 2002 "MRI src fmt"
-1 2003 "pixel type"
-1 2004 "pixel offset"
-1 2005 "pixel scale"
-1 2006 "pixel data"
-1 2007 "overlay type"
-1 2008 "overlay data"
-1 2010 "pixel width"
-1 2011 "real width"
-1 2012 "pixel height"
-1 2013 "real height"
-1 2014 "pixel depth"
-1 2015 "real depth"
-1 2016 "slice thickness"
-1 2020 "MRI orig source"
-1 2021 "MRI orig format"
-1 2022 "MRI opixel type"
-1 2023 "MRI opixel offs"
-1 3001 "sphere orig."
-1 3002 "sphere coord fr"
-1 3003 "sphere layers"
-1 3101 "surface id"
-1 3102 "surface name"
-1 3103 "surf. nnode"
-1 3104 "surface ntri"
-1 3105 "surf. nodes"
-1 3106 "surf. triang"
-1 3107 "surf. normals"
-1 3108 "surf. curv. vec"
-1 3109 "surf. curv. val"
-1 3110 "BEM pot. sol."
-1 3111 "BEM method"
-1 3112 "BEM coord frame"
-1 3113 "BEM conductivity"
-1 3201 "source dipole"
-1 3401 "xfit leadpro"
-1 3402 "xfit mapprod"
-1 3403 "xfit gmappro"
-1 3404 "xfit volint"
-1 3405 "xfit intrad"
-1 3411 "proj item kind"
-1 3412 "proj item time"
-1 3413 "proj item ign"
-1 3414 "proj nvec"
-1 3415 "proj item vect"
-1 3417 "proj item chs"
-1 3502 "MNE row names"
-1 3503 "MNE col names"
-1 3504 "MNE nrow"
-1 3505 "MNE ncol"
-1 3506 "MNE coordf"
-1 3507 "MNE ch name list"
-1 3508 "MNE file name"
-1 3510 "MNE src loc"
-1 3511 "MNE src norm"
-1 3512 "MNE src npoints"
-1 3513 "MNE src sel"
-1 3514 "MNE src nuse"
-1 3515 "MNE src nearest"
-1 3516 "MNE src nearest dist"
-1 3517 "MNE src id"
-1 3518 "MNE src space type"
-1 3519 "MNE src vertices"
-1 3590 "MNE src ntri"
-1 3591 "MNE src tri"
-1 3592 "MNE src nusetri"
-1 3593 "MNE src usetri"
-1 3594 "MNE src nneighbors"
-1 3595 "MNE src neighbors"
-1 3596 "MNE src voxel dims"
-1 3597 "MNE src interpolator"
-1 3598 "MNE src MRI volume"
-1 3520 "MNE fwd sol"
-1 3521 "MNE src ori"
-1 3522 "MNE methods"
-1 3523 "MNE fwd grad"
-1 3530 "MNE cov kind"
-1 3531 "MNE cov dim"
-1 3532 "MNE cov matrix"
-1 3533 "MNE cov diag"
-1 3534 "MNE cov eigenval"
-1 3535 "MNE cov eigenvec"
-1 3536 "MNE cov nfree"
-1 3540 "MNE inv leads"
-1 3541 "MNE inv fields"
-1 3542 "MNE inv sing"
-1 3543 "MNE inv priors"
-1 3544 "MNE inv full"
-1 3545 "MNE inv src ori"
-1 3546 "MNE inv leads weighted"
-1 3547 "MNE current unit"
-1 3550 "MNE env wd"
-1 3551 "MNE env command"
-1 3560 "MNE proj active"
-1 3561 "MNE event list"
-1 3562 "MNE hemisphere"
-1 3563 "MNE data skip nop"
-1 3565 "MNE trigger mask"
-1 3566 "MNE event comments"
-1 3570 "MNE morph map"
-1 3571 "MNE morph map from"
-1 3572 "MNE morph map to"
-1 3580 "MNE CTF comp kind"
-1 3581 "MNE CTF comp data"
-1 3582 "MNE CTF comp calib"
-1 3585 "MNE derivation data"
-1 3600 "MNE surface map data"
-1 3601 "MNE surface map kind"
-1 4001 "volume id"
-1 4002 "volume name"
-1 4003 "volume uid"
-1 4004 "volume uname"
-1 4005 "vol. urname"
-1 4006 "volume type"
-1 4007 "volume host"
-1 4008 "volume rroot"
-1 4009 "volume sroot"
-1 4010 "volume mntpt"
-1 4011 "vol. blocks"
-1 4012 "vol. fblocks"
-1 4013 "vol. ablocks"
-1 4014 "volume bsize"
-1 4015 "volume dir"
-1 5001 "index kind"
-1 5002 "index"
-#
-# Block explanations
-#
-2 100 "measurement"
-2 101 "meas. info"
-2 102 "raw data"
-2 103 "proc. data"
-2 104 "evoked data"
-2 105 "data aspect"
-2 106 "subject"
-2 107 "isotrak"
-2 108 "HPI meas"
-2 109 "HPI result"
-2 110 "HPI coil"
-2 111 "project"
-2 112 "cont. data"
-2 114 "anything"
-2 115 "events"
-2 116 "index"
-2 117 "acq. pars."
-2 118 "file ref"
-2 119 "MaxShield raw data"
-2 200 "MRI data"
-2 201 "MRI set"
-2 202 "MRI slice"
-2 203 "MRI scenery"
-2 204 "MRI scene"
-2 300 "Sphere mod."
-2 310 "BEM data"
-2 311 "BEM surf"
-2 312 "xfit aux"
-2 313 "projection"
-2 314 "proj. item"
-2 350 "MNE"
-2 351 "MNE src space"
-2 352 "MNE fwd sol"
-2 353 "MNE parent MRI"
-2 354 "MNE parent MEG"
-2 355 "MNE cov matrix"
-2 356 "MNE inv sol"
-2 357 "MNE named mat"
-2 358 "MNE env"
-2 359 "MNE bad chs"
-2 360 "MNE vertex map"
-2 361 "MNE events"
-2 362 "MNE morph map"
-2 363 "MNE surface map"
-2 364 "MNE surface map group"
-2 370 "MNE CTF comp"
-2 371 "MNE CTF comp data"
-2 372 "MNE ch deriv"
-2 400 "volume info"
-2 501 "Channel decoupler"
-2 502 "SSS info"
-2 503 "SSS cal adjust"
-2 504 "SSS ST info"
-2 505 "SSS bases"
-2 510 "Smartshield"
-2 900 "Processing history"
-2 901 "Processing record"
-2 999 "root"
-#
-# Unit explanations
-#
-3 -1 ""
-3 1 "m"
-3 2 "kg"
-3 3 "s"
-3 4 "A"
-3 5 "K"
-3 6 "mol"
-3 7 "rad"
-3 8 "sr"
-3 101 "Hz"
-3 102 "N"
-3 103 "Pa"
-3 104 "J"
-3 105 "W"
-3 106 "C"
-3 107 "V"
-3 108 "F"
-3 109 "ohm"
-3 110 "S"
-3 111 "Wb"
-3 112 "T"
-3 113 "H"
-3 114 "C"
-3 115 "lm"
-3 116 "lx"
-3 201 "T/m"
-3 202 "Am"
-3 203 "Am/m^2"
-3 204 "Am/m^3"
-#
-# Unit multiplier explanations
-#
-4 0 ""
-4 1 "da"
-4 2 "h"
-4 3 "k"
-4 6 "M"
-4 12 "T"
-4 15 "P"
-4 18 "E"
-4 -1 "d"
-4 -2 "c"
-4 -3 "m"
-4 -6 "mu"
-4 -9 "n"
-4 -12 "p"
-4 -15 "f"
-4 -18 "a"
-#
-# Channel kinds
-#
-5 1 "MEG"
-5 2 "EEG"
-5 3 "STI"
-5 201 "MCG"
-5 201 "MEGREF"
-5 202 "EOG"
-5 302 "EMG"
-5 402 "ECG"
-5 502 "MISC"
-5 602 "RESP"
-
+#
+#
+# This file contains explanations of items in a fif file
+#
+# Copyright 2006
+#
+# Matti Hamalainen
+# Athinoula A. Martinos Center for Biomedical Imaging
+# Charlestown, MA, USA
+#
+# $Header$
+# $Log$
+# Revision 1.22 2009/03/01 22:19:00 msh
+# Added some new tag numbers
+#
+# Revision 1.21 2009/02/20 13:40:10 msh
+# Added explanation for tag 3566
+#
+# Revision 1.20 2009/01/30 15:19:14 msh
+# Explain unsigned int data correctly
+# Version number incremented to 1.5
+# Added explanation for the FIFF_MNE_EVENT_TRIGGER_MASK tag
+#
+# Revision 1.19 2008/09/30 09:22:06 msh
+# Added Explanation for block 119 (MaxShield raw data)
+#
+# Revision 1.18 2008/06/07 13:38:53 msh
+# Added explanation for FIFFB_REF (118)
+#
+# Revision 1.17 2008/06/04 19:16:24 msh
+# Added tag number 3546
+#
+# Revision 1.16 2008/02/28 16:23:26 msh
+# Added tag 3523
+#
+# Revision 1.15 2007/11/06 03:23:57 msh
+# Added missing tags 3112 and 3113
+#
+# Revision 1.14 2007/02/27 14:22:50 msh
+# Added missing tag definitions
+#
+# Revision 1.13 2006/11/24 20:58:17 msh
+# Added missing tag numbers
+#
+# Revision 1.12 2006/11/08 13:13:23 msh
+# Added SSS tags
+#
+# Revision 1.11 2006/10/14 01:29:38 msh
+# Added explanations for derivations
+#
+# Revision 1.10 2006/09/26 10:45:09 msh
+# Added missing tag numbers 3515 and 3516
+#
+# Revision 1.9 2006/09/20 22:02:19 msh
+# Added Am to units
+#
+# Revision 1.8 2006/06/22 16:42:00 msh
+# Added explanation for tag 3582
+#
+# Revision 1.7 2006/05/28 17:43:53 msh
+# Added missing tag numbers to fiff_explanations.txt
+#
+# Revision 1.6 2006/05/11 16:42:09 msh
+# Fixed unit multiplier processing.
+#
+# Revision 1.5 2006/05/09 17:42:53 msh
+# Added tag 3560
+#
+# Revision 1.4 2006/04/29 12:12:29 msh
+# Added more missing tags.
+#
+# Revision 1.3 2006/04/27 00:53:53 msh
+# Added more missing explanations.
+#
+# Revision 1.2 2006/04/27 00:51:47 msh
+# Added missing explanations.
+#
+# Revision 1.1.1.1 2006/04/19 15:15:32 msh
+# Initial version
+#
+#
+#
+# Tag explanations
+#
+1 100 "file ID"
+1 101 "dir pointer"
+1 102 "directory"
+1 103 "block ID"
+1 104 "{"
+1 105 "}"
+1 106 "free list"
+1 107 "free block"
+1 108 "NOP"
+1 109 "parent FID"
+1 110 "parent BID"
+1 111 "block name"
+1 112 "block version"
+1 113 "creator"
+1 114 "modifier"
+1 115 "ref role"
+1 116 "ref file id"
+1 117 "ref file num"
+1 118 "ref file name"
+1 120 "ref block id"
+1 150 "acq. pars."
+1 151 "acq. stim seq."
+1 200 "nchan"
+1 201 "sfreq"
+1 202 "packing"
+1 203 "channel"
+1 204 "date"
+1 205 "subject"
+1 206 "comment"
+1 206 "comment"
+1 207 "nave"
+1 208 "firstsamp"
+1 209 "lastsamp"
+1 210 "aspect type"
+1 211 "ref. event"
+1 212 "scientist"
+1 213 "dig. point"
+1 214 "channel pos"
+1 215 "HPI slopes"
+1 216 "HPI # coils"
+1 217 "req. event"
+1 218 "req. limit"
+1 219 "lowpass"
+1 220 "bad chs"
+1 221 "artefacts"
+1 222 "transform"
+1 223 "highpass"
+1 224 "channel cals"
+1 225 "HPI bad chs"
+1 226 "HPI cor coef"
+1 227 "event comment"
+1 228 "nsamp"
+1 229 "time minimum"
+1 230 "subave size"
+1 231 "subave first"
+1 233 "block name"
+1 234 "dig. string"
+1 235 "line freq."
+1 236 "HPI coil freq."
+1 240 "HPI moments"
+1 241 "HPI g-values"
+1 242 "HPI fit accept"
+1 243 "HPI g limit"
+1 244 "HPI dist limit"
+1 245 "HPI coil no"
+1 246 "HPI coils used"
+1 247 "HPI dig order"
+1 263 "SSS coord frame"
+1 264 "SSS task"
+1 265 "SSS origin"
+1 266 "SSS in order"
+1 267 "SSS out order"
+1 268 "SSS nchan"
+1 269 "SSS components"
+1 270 "SSS cal chans"
+1 271 "SSS cal corrs"
+1 272 "SSS ST corr"
+1 300 "data buffer"
+1 301 "data skip"
+1 302 "epoch"
+1 400 "subject id"
+1 401 "first name"
+1 402 "middle name"
+1 403 "last name"
+1 404 "birthday"
+1 405 "sex"
+1 406 "handedness"
+1 407 "weight"
+1 408 "height"
+1 409 "comment"
+1 410 "subject HIS id"
+1 500 "project id"
+1 501 "proj. name"
+1 502 "project aim"
+1 503 "proj. pers."
+1 504 "proj. comm."
+1 600 "event ch #'s"
+1 601 "event list"
+1 602 "event channel"
+1 603 "event bits"
+1 701 "SQUID bias"
+1 702 "SQUID offset"
+1 703 "SQUID gate"
+1 800 "Decoupler matrix"
+1 1101 "MRI source"
+1 2002 "MRI src fmt"
+1 2003 "pixel type"
+1 2004 "pixel offset"
+1 2005 "pixel scale"
+1 2006 "pixel data"
+1 2007 "overlay type"
+1 2008 "overlay data"
+1 2010 "pixel width"
+1 2011 "real width"
+1 2012 "pixel height"
+1 2013 "real height"
+1 2014 "pixel depth"
+1 2015 "real depth"
+1 2016 "slice thickness"
+1 2020 "MRI orig source"
+1 2021 "MRI orig format"
+1 2022 "MRI opixel type"
+1 2023 "MRI opixel offs"
+1 3001 "sphere orig."
+1 3002 "sphere coord fr"
+1 3003 "sphere layers"
+1 3101 "surface id"
+1 3102 "surface name"
+1 3103 "surf. nnode"
+1 3104 "surface ntri"
+1 3105 "surf. nodes"
+1 3106 "surf. triang"
+1 3107 "surf. normals"
+1 3108 "surf. curv. vec"
+1 3109 "surf. curv. val"
+1 3110 "BEM pot. sol."
+1 3111 "BEM method"
+1 3112 "BEM coord frame"
+1 3113 "BEM conductivity"
+1 3201 "source dipole"
+1 3401 "xfit leadpro"
+1 3402 "xfit mapprod"
+1 3403 "xfit gmappro"
+1 3404 "xfit volint"
+1 3405 "xfit intrad"
+1 3411 "proj item kind"
+1 3412 "proj item time"
+1 3413 "proj item ign"
+1 3414 "proj nvec"
+1 3415 "proj item vect"
+1 3417 "proj item chs"
+1 -1 "End of directory"
+1 3502 "MNE row names"
+1 3503 "MNE col names"
+1 3504 "MNE nrow"
+1 3505 "MNE ncol"
+1 3506 "MNE coordf"
+1 3507 "MNE ch name list"
+1 3508 "MNE file name"
+1 3510 "MNE src loc"
+1 3511 "MNE src norm"
+1 3512 "MNE src npoints"
+1 3513 "MNE src sel"
+1 3514 "MNE src nuse"
+1 3515 "MNE src nearest"
+1 3516 "MNE src nearest dist"
+1 3517 "MNE src id"
+1 3518 "MNE src space type"
+1 3519 "MNE src vertices"
+1 3590 "MNE src ntri"
+1 3591 "MNE src tri"
+1 3592 "MNE src nusetri"
+1 3593 "MNE src usetri"
+1 3594 "MNE src nneighbors"
+1 3595 "MNE src neighbors"
+1 3596 "MNE src voxel dims"
+1 3597 "MNE src interpolator"
+1 3598 "MNE src MRI volume"
+1 3599 "MNE src dist"
+1 3600 "MNE src dist limit"
+1 3520 "MNE fwd sol"
+1 3521 "MNE src ori"
+1 3522 "MNE methods"
+1 3523 "MNE fwd grad"
+1 3530 "MNE cov kind"
+1 3531 "MNE cov dim"
+1 3532 "MNE cov matrix"
+1 3533 "MNE cov diag"
+1 3534 "MNE cov eigenval"
+1 3535 "MNE cov eigenvec"
+1 3536 "MNE cov nfree"
+1 3540 "MNE inv leads"
+1 3541 "MNE inv fields"
+1 3542 "MNE inv sing"
+1 3543 "MNE inv priors"
+1 3544 "MNE inv full"
+1 3545 "MNE inv src ori"
+1 3546 "MNE inv leads weighted"
+1 3547 "MNE current unit"
+1 3550 "MNE env wd"
+1 3551 "MNE env command"
+1 3560 "MNE proj active"
+1 3561 "MNE event list"
+1 3562 "MNE hemisphere"
+1 3563 "MNE data skip nop"
+1 3565 "MNE trigger mask"
+1 3566 "MNE event comments"
+1 3570 "MNE morph map"
+1 3571 "MNE morph map from"
+1 3572 "MNE morph map to"
+1 3580 "MNE CTF comp kind"
+1 3581 "MNE CTF comp data"
+1 3582 "MNE CTF comp calib"
+1 3585 "MNE derivation data"
+1 3610 "MNE surface map data"
+1 3611 "MNE surface map kind"
+1 4001 "volume id"
+1 4002 "volume name"
+1 4003 "volume uid"
+1 4004 "volume uname"
+1 4005 "vol. urname"
+1 4006 "volume type"
+1 4007 "volume host"
+1 4008 "volume rroot"
+1 4009 "volume sroot"
+1 4010 "volume mntpt"
+1 4011 "vol. blocks"
+1 4012 "vol. fblocks"
+1 4013 "vol. ablocks"
+1 4014 "volume bsize"
+1 4015 "volume dir"
+1 5001 "index kind"
+1 5002 "index"
+#
+# Block explanations
+#
+2 100 "measurement"
+2 101 "meas. info"
+2 102 "raw data"
+2 103 "proc. data"
+2 104 "evoked data"
+2 105 "data aspect"
+2 106 "subject"
+2 107 "isotrak"
+2 108 "HPI meas"
+2 109 "HPI result"
+2 110 "HPI coil"
+2 111 "project"
+2 112 "cont. data"
+2 114 "anything"
+2 115 "events"
+2 116 "index"
+2 117 "acq. pars."
+2 118 "file ref"
+2 119 "SmartShield raw data"
+2 120 "SmartShield averaged data"
+2 121 "HPI subsystem"
+2 200 "MRI data"
+2 201 "MRI set"
+2 202 "MRI slice"
+2 203 "MRI scenery"
+2 204 "MRI scene"
+2 300 "Sphere mod."
+2 310 "BEM data"
+2 311 "BEM surf"
+2 312 "xfit aux"
+2 313 "projection"
+2 314 "proj. item"
+2 350 "MNE"
+2 351 "MNE src space"
+2 352 "MNE fwd sol"
+2 353 "MNE parent MRI"
+2 354 "MNE parent MEG"
+2 355 "MNE cov matrix"
+2 356 "MNE inv sol"
+2 357 "MNE named mat"
+2 358 "MNE env"
+2 359 "MNE bad chs"
+2 360 "MNE vertex map"
+2 361 "MNE events"
+2 362 "MNE morph map"
+2 363 "MNE surface map"
+2 364 "MNE surface map group"
+2 370 "MNE CTF comp"
+2 371 "MNE CTF comp data"
+2 372 "MNE ch deriv"
+2 400 "volume info"
+2 501 "Channel decoupler"
+2 502 "SSS info"
+2 503 "SSS cal adjust"
+2 504 "SSS ST info"
+2 505 "SSS bases"
+2 510 "Smartshield"
+2 900 "Processing history"
+2 901 "Processing record"
+2 999 "root"
+#
+# Unit explanations
+#
+3 -1 ""
+3 1 "m"
+3 2 "kg"
+3 3 "s"
+3 4 "A"
+3 5 "K"
+3 6 "mol"
+3 7 "rad"
+3 8 "sr"
+3 101 "Hz"
+3 102 "N"
+3 103 "Pa"
+3 104 "J"
+3 105 "W"
+3 106 "C"
+3 107 "V"
+3 108 "F"
+3 109 "ohm"
+3 110 "S"
+3 111 "Wb"
+3 112 "T"
+3 113 "H"
+3 114 "C"
+3 115 "lm"
+3 116 "lx"
+3 201 "T/m"
+3 202 "Am"
+3 203 "Am/m^2"
+3 204 "Am/m^3"
+#
+# Unit multiplier explanations
+#
+4 0 ""
+4 1 "da"
+4 2 "h"
+4 3 "k"
+4 6 "M"
+4 12 "T"
+4 15 "P"
+4 18 "E"
+4 -1 "d"
+4 -2 "c"
+4 -3 "m"
+4 -6 "mu"
+4 -9 "n"
+4 -12 "p"
+4 -15 "f"
+4 -18 "a"
+#
+# Channel kinds
+#
+5 1 "MEG"
+5 2 "EEG"
+5 3 "STI"
+5 201 "MCG"
+5 201 "MEGREF"
+5 202 "EOG"
+5 302 "EMG"
+5 402 "ECG"
+5 502 "MISC"
+5 602 "RESP"
+
diff --git a/resources/general/sensorSurfaces/122m.fif b/resources/general/sensorSurfaces/122m.fif
new file mode 100644
index 00000000000..85ae388f567
Binary files /dev/null and b/resources/general/sensorSurfaces/122m.fif differ
diff --git a/resources/general/sensorSurfaces/CTF_275.fif b/resources/general/sensorSurfaces/CTF_275.fif
new file mode 100644
index 00000000000..afbed3fd9cf
Binary files /dev/null and b/resources/general/sensorSurfaces/CTF_275.fif differ
diff --git a/resources/general/sensorSurfaces/KIT.fif b/resources/general/sensorSurfaces/KIT.fif
new file mode 100644
index 00000000000..68fc893023b
Binary files /dev/null and b/resources/general/sensorSurfaces/KIT.fif differ
diff --git a/resources/general/sensorSurfaces/Magnes_2500wh.fif b/resources/general/sensorSurfaces/Magnes_2500wh.fif
new file mode 100644
index 00000000000..add8907fc13
Binary files /dev/null and b/resources/general/sensorSurfaces/Magnes_2500wh.fif differ
diff --git a/resources/general/sensorSurfaces/Magnes_3600wh.fif b/resources/general/sensorSurfaces/Magnes_3600wh.fif
new file mode 100644
index 00000000000..bb96f90bd9f
Binary files /dev/null and b/resources/general/sensorSurfaces/Magnes_3600wh.fif differ
diff --git a/resources/mne_rt_server/plugins/fiffsimulator/FiffSimulation.cfg b/resources/mne_rt_server/plugins/fiffsimulator/FiffSimulation.cfg
index a5cc6e4ad05..25118701f39 100644
--- a/resources/mne_rt_server/plugins/fiffsimulator/FiffSimulation.cfg
+++ b/resources/mne_rt_server/plugins/fiffsimulator/FiffSimulation.cfg
@@ -1 +1 @@
-simFile = /../resources/data/MNE-sample-data/MEG/sample/sample_audvis_raw.fif
\ No newline at end of file
+simFile = /Users/christoph.dinh/mne_data/MNE-sample-data/MEG/sample/sample_audvis_raw.fif
\ No newline at end of file
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 52cdc766950..f891fea0f4a 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,15 +1,20 @@
cmake_minimum_required(VERSION 3.15)
project(mne_cpp LANGUAGES CXX)
+set(MNE_CPP_VERSION_MAJOR 2)
+set(MNE_CPP_VERSION_MINOR 0)
+set(MNE_CPP_VERSION_PATCH 0)
+
+
##==============================================================================
## Global build options
-set(CMAKE_CXX_STANDARD 14)
+set(CMAKE_CXX_STANDARD 20)
option(BUILD_SHARED_LIBS "Build using shared libraries" ON)
option(BUILD_MAC_APP_BUNDLE "Build app bundle on macos" OFF)
-option(BUILD_EXAMPLES "Build examples" OFF)
+option(BUILD_EXAMPLES "Build examples" ON)
option(BUILD_APPLICATIONS "Build applications" ON)
option(BUILD_TESTS "Build tests" OFF)
@@ -21,6 +26,8 @@ option(NO_IPC "Build project with no interprocess communication features (shared
option(WASM "Setup build for wasm" OFF)
+option(NO_OPENGL "Build without QOpenGLWidget support" OFF)
+
option(USE_FFTW "Use fftw backend for eigen" OFF)
##==============================================================================
@@ -34,12 +41,17 @@ endif()
if(WASM)
add_compile_definitions(WASMBUILD)
+ add_compile_definitions(NO_QOPENGLWIDGET)
set(BUILD_SHARED_LIBS OFF)
set(NO_TESTS ON)
set(NO_EXAMPLES ON)
set(NO_IPC ON)
endif()
+if(NO_OPENGL)
+ add_compile_definitions(NO_QOPENGLWIDGET)
+endif()
+
if(NO_IPC)
add_compile_definitions(NO_IPC)
endif()
@@ -55,6 +67,10 @@ if(WITH_CODE_COV)
add_link_options("--coverage")
endif()
+if(MSVC)
+ add_compile_options(/EHsc /MP)
+endif()
+
##==============================================================================
## Misc. settings
@@ -71,11 +87,11 @@ if(NOT CMAKE_BUILD_TYPE)
endif()
if(NOT DEFINED CMAKE_BINARY_DIR)
- set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR}/../build/${CMAKE_BUILD_TYPE})
+ set(CMAKE_BINARY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../build/${CMAKE_BUILD_TYPE})
endif()
if(NOT DEFINED BINARY_OUTPUT_DIRECTORY)
- set(BINARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/../out/${CMAKE_BUILD_TYPE})
+ set(BINARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../out/${CMAKE_BUILD_TYPE})
message(
"-- [MNE-CPP] Build name not defined."
" Using default value: ${BINARY_OUTPUT_DIRECTORY}"
@@ -94,7 +110,7 @@ if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})
"\"${CMAKE_SOURCE_DIR}/CMakeFiles\" and try again from another folder:"
"\n "
"\n mkdir build"
- "\n cmake -B build -S src"
+ "\n cmake -S . -B build"
"\n "
"\n If you are absolutley sure of what you are doing, you can pass in "
"FORCE_IN_SOURCE_BUILD to CMake to force in-soure building "
@@ -107,6 +123,26 @@ endif()
find_package(QT NAMES Qt6 Qt5)
message("QT_DIR - ${QT_DIR}")
+# ── Pre-find all Qt components once ──────────────────────────────────────────
+# Qt6::Gui (pulled in transitively by Widgets) checks for WrapVulkanHeaders
+# every time find_package(Qt6 …) is called. Since 40+ subdirectory
+# CMakeLists.txt each call find_package, the warning
+# "Could NOT find WrapVulkanHeaders (missing: Vulkan_INCLUDE_DIR)"
+# would be printed dozens of times. Finding all required components here
+# makes the subdirectory calls no-ops and prints the warning at most once.
+set(_MNE_QT_COMPONENTS Core Concurrent Gui Network Widgets Svg Xml)
+if(NOT WASM)
+ list(APPEND _MNE_QT_COMPONENTS OpenGL)
+ if(QT_VERSION_MAJOR EQUAL 6)
+ list(APPEND _MNE_QT_COMPONENTS OpenGLWidgets ShaderTools)
+ endif()
+endif()
+if(BUILD_TESTS)
+ list(APPEND _MNE_QT_COMPONENTS Test)
+endif()
+find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS ${_MNE_QT_COMPONENTS})
+unset(_MNE_QT_COMPONENTS)
+
##==============================================================================
## Save git hash for project
@@ -124,6 +160,11 @@ execute_process(
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_STRIP_TRAILING_WHITESPACE)
+##==============================================================================
+## Define resource directory (before subdirectories so they can use it)
+
+set(PROJECT_RESOURCES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../resources)
+
##==============================================================================
## Add subdirectories
@@ -138,14 +179,20 @@ if(BUILD_EXAMPLES)
add_subdirectory(examples)
endif()
+
if(BUILD_TESTS)
add_subdirectory(testframes)
endif()
+
+option(MNE_ENABLE_INSTALLER "Enable building the installer" OFF)
+if(MNE_ENABLE_INSTALLER)
+ include(${CMAKE_CURRENT_SOURCE_DIR}/../tools/packaging/Installer.cmake)
+endif()
+
##==============================================================================
## Add symbolic links to project resources folder
-set(PROJECT_RESOURCES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../resources)
set(OUTPUT_RESOURCES_DIR ${BINARY_OUTPUT_DIRECTORY}/resources)
cmake_path(
diff --git a/src/applications/CMakeLists.txt b/src/applications/CMakeLists.txt
index 1437a9361e2..4b784f278c9 100644
--- a/src/applications/CMakeLists.txt
+++ b/src/applications/CMakeLists.txt
@@ -22,6 +22,33 @@ option(BUILD_MNE_RT_SERVER "Build MNE Rt Server" ON)
option(BUILD_MNE_FORWARD_SOLUTION "Build MNE Forward Solution" ON)
option(BUILD_MNE_EDF2FIFF "Build MNE edf to fiff" ON)
option(BUILD_MNE_DIPOLE_FIT "Build MNE Dipole Fit" ON)
+option(BUILD_MNE_BROWSE "Build MNE Browse" ON)
+option(BUILD_MNE_INSPECT "Build MNE Inspect" ON)
+option(BUILD_MNE_SHOW_FIFF "Build MNE Show Fiff" ON)
+option(BUILD_MNE_COMPUTE_RAW_INVERSE "Build MNE Compute Raw Inverse" ON)
+option(BUILD_MNE_SETUP_MRI "Build MNE Setup MRI" ON)
+option(BUILD_MNE_SURF2BEM "Build MNE Surf2Bem" ON)
+option(BUILD_MNE_SETUP_FORWARD_MODEL "Build MNE Setup Forward Model" ON)
+
+# FreeSurfer detection — mne_watershed_bem and mne_flash_bem call FreeSurfer
+# programs (mri_watershed, mri_convert, etc.) via QProcess at runtime.
+# Only build these applications when FreeSurfer is available.
+set(FREESURFER_FOUND FALSE)
+if(DEFINED ENV{FREESURFER_HOME} AND EXISTS "$ENV{FREESURFER_HOME}/bin/mri_watershed")
+ set(FREESURFER_FOUND TRUE)
+ message(STATUS "FreeSurfer found at $ENV{FREESURFER_HOME}")
+else()
+ find_program(MRI_WATERSHED_BIN mri_watershed)
+ if(MRI_WATERSHED_BIN)
+ set(FREESURFER_FOUND TRUE)
+ message(STATUS "FreeSurfer mri_watershed found at ${MRI_WATERSHED_BIN}")
+ else()
+ message(STATUS "FreeSurfer not found — skipping mne_watershed_bem and mne_flash_bem")
+ endif()
+endif()
+
+option(BUILD_MNE_WATERSHED_BEM "Build MNE Watershed BEM (requires FreeSurfer)" ${FREESURFER_FOUND})
+option(BUILD_MNE_FLASH_BEM "Build MNE Flash BEM (requires FreeSurfer)" ${FREESURFER_FOUND})
option(APPS_REALTIME "Build only realtime apps" OFF)
if(APPS_REALTIME)
@@ -42,7 +69,18 @@ if(APPS_OFFLINE)
set(BUILD_MNE_RT_SERVER OFF)
set(BUILD_MNE_FORWARD_SOLUTION ON)
set(BUILD_MNE_EDF2FIFF ON)
+
set(BUILD_MNE_DIPOLE_FIT ON)
+ set(BUILD_MNE_BROWSE ON)
+ set(BUILD_MNE_INSPECT ON)
+ set(BUILD_MNE_SHOW_FIFF ON)
+ set(BUILD_MNE_COMPUTE_RAW_INVERSE ON)
+ if(FREESURFER_FOUND)
+ set(BUILD_MNE_WATERSHED_BEM ON)
+ set(BUILD_MNE_FLASH_BEM ON)
+ endif()
+ set(BUILD_MNE_SURF2BEM ON)
+ set(BUILD_MNE_SETUP_FORWARD_MODEL ON)
endif()
if(BUILD_MNE_ANONYMIZE)
@@ -67,4 +105,31 @@ if(NOT WASM)
if(BUILD_MNE_DIPOLE_FIT)
add_subdirectory(mne_dipole_fit)
endif()
+ if(BUILD_MNE_BROWSE)
+ add_subdirectory(mne_browse)
+ endif()
+ if(BUILD_MNE_INSPECT AND TARGET mne_disp3D_rhi)
+ add_subdirectory(mne_inspect)
+ endif()
+ if(BUILD_MNE_SHOW_FIFF)
+ add_subdirectory(mne_show_fiff)
+ endif()
+ if(BUILD_MNE_COMPUTE_RAW_INVERSE)
+ add_subdirectory(mne_compute_raw_inverse)
+ endif()
+ if(BUILD_MNE_SETUP_MRI)
+ add_subdirectory(mne_setup_mri)
+ endif()
+ if(BUILD_MNE_WATERSHED_BEM)
+ add_subdirectory(mne_watershed_bem)
+ endif()
+ if(BUILD_MNE_SURF2BEM)
+ add_subdirectory(mne_surf2bem)
+ endif()
+ if(BUILD_MNE_FLASH_BEM)
+ add_subdirectory(mne_flash_bem)
+ endif()
+ if(BUILD_MNE_SETUP_FORWARD_MODEL)
+ add_subdirectory(mne_setup_forward_model)
+ endif()
endif()
diff --git a/src/applications/mne_analyze/libs/anShared/Management/pluginmanager.cpp b/src/applications/mne_analyze/libs/anShared/Management/pluginmanager.cpp
index 8ef12a1c868..aca00fd7713 100644
--- a/src/applications/mne_analyze/libs/anShared/Management/pluginmanager.cpp
+++ b/src/applications/mne_analyze/libs/anShared/Management/pluginmanager.cpp
@@ -95,6 +95,7 @@ void PluginManager::loadPluginsFromDirectory(const QString& dir)
#else
QDir pluginsDir(dir);
foreach(const QString &file, pluginsDir.entryList(QDir::NoDotAndDotDot | QDir::Files)) {
+ emit pluginLoaded("Loading " + file);
loadPlugin(pluginsDir.absoluteFilePath(file));
}
#endif
@@ -138,6 +139,7 @@ void PluginManager::initPlugins(QSharedPointer data)
{
for(AbstractPlugin* plugin : m_qVecPlugins)
{
+ emit pluginLoaded("Initializing " + plugin->getName());
if(plugin->hasBeenInitialized() == false)
{
plugin->setGlobalData(data);
diff --git a/src/applications/mne_analyze/libs/anShared/Management/pluginmanager.h b/src/applications/mne_analyze/libs/anShared/Management/pluginmanager.h
index 171790dc3b9..6ea1ddecb96 100644
--- a/src/applications/mne_analyze/libs/anShared/Management/pluginmanager.h
+++ b/src/applications/mne_analyze/libs/anShared/Management/pluginmanager.h
@@ -143,7 +143,20 @@ class ANSHAREDSHARED_EXPORT PluginManager : public QPluginLoader
*/
void shutdown();
+
+signals:
+ //=========================================================================================================
+ /**
+ * Emitted when a plugin is loaded.
+ *
+ * @param[in] msg message to display.
+ * @param[in] alignment alignment of the message.
+ * @param[in] color color of the message.
+ */
+ void pluginLoaded(const QString& msg);
+
private:
+
//=========================================================================================================
/**
* Insert a plugin into the vector of plugins inserted.
diff --git a/src/applications/mne_analyze/libs/anShared/Management/statusbar.cpp b/src/applications/mne_analyze/libs/anShared/Management/statusbar.cpp
index e0ede056584..3cb5e38d55e 100644
--- a/src/applications/mne_analyze/libs/anShared/Management/statusbar.cpp
+++ b/src/applications/mne_analyze/libs/anShared/Management/statusbar.cpp
@@ -174,7 +174,7 @@ void StatusBar::enterEvent(QEnterEvent* event)
}
}
- m_pHoverWidget->move(this->mapToGlobal(QPoint(static_cast(event)->pos().y(), static_cast(event)->pos().x())).x(), this->parentWidget()->mapToGlobal(this->pos()).y() - this->height() - m_pHoverWidget->height() - 5);
+ m_pHoverWidget->move(this->mapToGlobal(QPoint(static_cast(event)->position().toPoint().y(), static_cast(event)->position().toPoint().x())).x(), this->parentWidget()->mapToGlobal(this->pos()).y() - this->height() - m_pHoverWidget->height() - 5);
m_pHoverWidget->show();
QWidget::enterEvent(event);
diff --git a/src/applications/mne_analyze/libs/anShared/Model/eventmodel.cpp b/src/applications/mne_analyze/libs/anShared/Model/eventmodel.cpp
index c6f0544fc75..e7241865b6a 100644
--- a/src/applications/mne_analyze/libs/anShared/Model/eventmodel.cpp
+++ b/src/applications/mne_analyze/libs/anShared/Model/eventmodel.cpp
@@ -767,7 +767,7 @@ void EventModel::getEventsFromNewData()
QMap> mEventsinTypes;
- for(const auto& sample : qAsConst(detectedTriggerSamples)){
+ for(const auto& sample : std::as_const(detectedTriggerSamples)){
mEventsinTypes[sample.second].append(sample.first);
}
@@ -775,7 +775,7 @@ void EventModel::getEventsFromNewData()
auto groups = m_EventManager.getAllGroups();
- for (auto key : qAsConst(keyList)){
+ for (auto key : std::as_const(keyList)){
QString name =info->chs[iChannelIndex].ch_name + "_" + QString::number(static_cast(key));
bool foundMatch = false;
int groupID = 0;
@@ -792,7 +792,7 @@ void EventModel::getEventsFromNewData()
groupID = newGroup.id;
}
- for (auto event : qAsConst(mEventsinTypes[key])){
+ for (auto event : std::as_const(mEventsinTypes[key])){
m_EventManager.addEvent(event + iFirstSample, groupID);
}
}
diff --git a/src/applications/mne_analyze/libs/anShared/Model/fiffrawviewmodel.h b/src/applications/mne_analyze/libs/anShared/Model/fiffrawviewmodel.h
index 625d0a03175..1942f2a2fec 100644
--- a/src/applications/mne_analyze/libs/anShared/Model/fiffrawviewmodel.h
+++ b/src/applications/mne_analyze/libs/anShared/Model/fiffrawviewmodel.h
@@ -783,10 +783,16 @@ class ChannelData
/**
* This nested class enables the range-based looping.
*/
- class ChannelIterator : public std::iterator
+ class ChannelIterator
{
public:
+ using iterator_category = std::random_access_iterator_tag;
+ using value_type = const double;
+ using difference_type = std::ptrdiff_t;
+ using pointer = const double*;
+ using reference = const double&;
+
const ChannelData* cd; /**< Pointer to the associated ChannelData container. */
// Remember at which point we are currently (this is NOT the absolute sample number,
// but the index relative to all stored samples in the associated ChannelData container):
@@ -798,8 +804,7 @@ class ChannelData
public:
ChannelIterator(const ChannelData* cd, qint32 index)
- : std::iterator()
- , cd(cd)
+ : cd(cd)
, currentIndex(index)
, currentBlockToAccess(cd->m_lData.begin())
, currentRelativeIndex(0)
diff --git a/src/applications/mne_analyze/libs/anShared/Utils/types.h b/src/applications/mne_analyze/libs/anShared/Utils/types.h
index 25623172680..ea9124889f6 100644
--- a/src/applications/mne_analyze/libs/anShared/Utils/types.h
+++ b/src/applications/mne_analyze/libs/anShared/Utils/types.h
@@ -120,7 +120,7 @@ namespace ANSHAREDLIB
FID_PICKING_STATUS, ///< [bool] event send whenever status of fiducial picking has changed
NEW_FIDUCIAL_PICKED, ///< [QVector3D] event send whenever a new fiducial was picked
FIDUCIAL_CHANGED, ///< [int] event send when fiducial was changed
- SET_DATA3D_TREE_MODEL, ///< [QSharedPointer] send when a new 3D Model is set
+ SET_DATA3D_TREE_MODEL, ///< [QSharedPointer] send when a new 3D Model is set
VIEW3D_SETTINGS_CHANGED, ///< [ANSHAREDLIB::View3DParameters] send to trigger view 3D settings update
MODEL_REMOVED ///< [QSharedPointer>] send to alert plugins when model is being removed
};
diff --git a/src/applications/mne_analyze/mne_analyze/CMakeLists.txt b/src/applications/mne_analyze/mne_analyze/CMakeLists.txt
index 56ed671564c..32ab453a831 100644
--- a/src/applications/mne_analyze/mne_analyze/CMakeLists.txt
+++ b/src/applications/mne_analyze/mne_analyze/CMakeLists.txt
@@ -8,10 +8,6 @@ set(CMAKE_AUTORCC ON)
set(QT_REQUIRED_COMPONENTS Core Widgets Concurrent Network)
-if(NOT WASM)
- list(APPEND QT_REQUIRED_COMPONENTS OpenGL 3DRender)
-endif()
-
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS ${QT_REQUIRED_COMPONENTS})
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS ${QT_REQUIRED_COMPONENTS})
@@ -19,7 +15,13 @@ set(SOURCES main.cpp mainwindow.cpp analyzecore.cpp)
set(HEADERS info.h mainwindow.h analyzecore.h)
-set(RESOURCES mne_analyze.qrc)
+set(RESOURCES
+ mne_analyze.qrc
+ resources/images/appIcons/mne_analyze.icns
+)
+
+set_source_files_properties(resources/images/appIcons/mne_analyze.icns PROPERTIES
+ MACOSX_PACKAGE_LOCATION Resources)
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
qt_add_executable(${PROJECT_NAME} MANUAL_FINALIZATION ${SOURCES} ${HEADERS} ${RESOURCES})
@@ -43,8 +45,8 @@ set(MNE_LIBS_REQUIRED
mne_disp
)
-if(NOT WASM)
- list(APPEND MNE_LIBS_REQUIRED mne_disp3D)
+if(TARGET mne_disp3D_rhi)
+ list(APPEND MNE_LIBS_REQUIRED mne_disp3D_rhi)
endif()
target_link_libraries(${PROJECT_NAME} PRIVATE
@@ -69,7 +71,7 @@ if(NOT BUILD_SHARED_LIBS)
analyze_sourcelocalization
)
- if(NOT WASM)
+ if(TARGET mne_disp3D_rhi)
list(APPEND MNE_ANALYZE_PLUGINS analyze_view3d)
endif()
@@ -81,13 +83,15 @@ endif()
set_target_properties(${PROJECT_NAME} PROPERTIES
MACOSX_BUNDLE_GUI_IDENTIFIER mne-cpp.org
MACOSX_BUNDLE ${BUILD_MAC_APP_BUNDLE}
+ MACOSX_BUNDLE_ICON_FILE mne_analyze.icns
WIN32_EXECUTABLE TRUE
)
install(
TARGETS ${PROJECT_NAME}
- BUNDLE DESTINATION .
- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ BUNDLE DESTINATION . COMPONENT applications
+ RUNTIME DESTINATION bin COMPONENT applications
+ LIBRARY DESTINATION lib COMPONENT applications
)
if(QT_VERSION_MAJOR EQUAL 6)
diff --git a/src/applications/mne_analyze/mne_analyze/analyzecore.cpp b/src/applications/mne_analyze/mne_analyze/analyzecore.cpp
index 6a8daa7abc7..9530c08594d 100644
--- a/src/applications/mne_analyze/mne_analyze/analyzecore.cpp
+++ b/src/applications/mne_analyze/mne_analyze/analyzecore.cpp
@@ -40,6 +40,7 @@
//=============================================================================================================
#include
+#include
#include "analyzecore.h"
#include "mainwindow.h"
#include "../libs/anShared/Plugins/abstractplugin.h"
@@ -106,7 +107,7 @@ AnalyzeCore::AnalyzeCore(QObject* parent)
//show splash screen for 1 second
QPixmap pixmap(":/images/splashscreen_mne_analyze.png");
- QSplashScreen splash(pixmap);
+ QSplashScreen splash(pixmap, Qt::WindowStaysOnTopHint);
splash.show();
registerMetaTypes();
@@ -114,7 +115,7 @@ AnalyzeCore::AnalyzeCore(QObject* parent)
initGlobalData();
initEventSystem();
- initPluginManager();
+ initPluginManager(&splash);
initMainWindow();
splash.hide();
@@ -190,9 +191,16 @@ void AnalyzeCore::initEventSystem()
//=============================================================================================================
-void AnalyzeCore::initPluginManager()
+void AnalyzeCore::initPluginManager(QSplashScreen* pSplash)
{
m_pPluginManager = QSharedPointer::create();
+
+ if(pSplash) {
+ QObject::connect(m_pPluginManager.data(), &PluginManager::pluginLoaded,
+ pSplash, [pSplash](const QString& msg) {
+ pSplash->showMessage(msg, Qt::AlignLeft, Qt::black);
+ });
+ }
loadandInitPlugins();
}
diff --git a/src/applications/mne_analyze/mne_analyze/analyzecore.h b/src/applications/mne_analyze/mne_analyze/analyzecore.h
index 72d20f564a1..63c66647dcf 100644
--- a/src/applications/mne_analyze/mne_analyze/analyzecore.h
+++ b/src/applications/mne_analyze/mne_analyze/analyzecore.h
@@ -55,6 +55,8 @@
// FORWARD DECLARATIONS
//=============================================================================================================
+class QSplashScreen;
+
namespace ANSHAREDLIB
{
class AbstractPlugin;
@@ -74,6 +76,7 @@ namespace MNEANALYZE {
class MainWindow;
+
//=============================================================================================================
/**
* The AnalyzeCore class holds all of MNE-Analyze components.
@@ -160,9 +163,11 @@ class AnalyzeCore : public QObject
//=========================================================================================================
/**
- * This initializes the PluginManager.
+ * Initializes the plugin manager.
+ *
+ * @param[in] pSplash Pointer to the splash screen.
*/
- void initPluginManager();
+ void initPluginManager(QSplashScreen* pSplash = Q_NULLPTR);
//=========================================================================================================
/**
diff --git a/src/applications/mne_analyze/mne_analyze/main.cpp b/src/applications/mne_analyze/mne_analyze/main.cpp
index 5b91b5cd4cf..d5de3f96f2a 100644
--- a/src/applications/mne_analyze/mne_analyze/main.cpp
+++ b/src/applications/mne_analyze/mne_analyze/main.cpp
@@ -78,7 +78,7 @@ Q_IMPORT_PLUGIN(SourceLocalization)
Q_IMPORT_PLUGIN(ControlManager)
Q_IMPORT_PLUGIN(ChannelSelection)
Q_IMPORT_PLUGIN(CoRegistration)
-#ifndef WASMBUILD
+#ifdef MNE_DISP3D_RHI
Q_IMPORT_PLUGIN(View3D)
#endif
#endif
@@ -89,7 +89,7 @@ int main(int argc, char *argv[])
{
// When building a static version of MNE Analyze we have to init all resource (.qrc) files here manually
#ifdef STATICBUILD
- #ifndef WASMBUILD
+ #ifdef MNE_DISP3D_RHI
// Q_INIT_RESOURCE(mne_disp3d);
// Q_INIT_RESOURCE(analyze_view3d);
// Q_INIT_RESOURCE(analyze_dipolefit);
diff --git a/src/applications/mne_analyze/mne_analyze/mainwindow.cpp b/src/applications/mne_analyze/mne_analyze/mainwindow.cpp
index b7c9c81c0ad..363a4768fad 100644
--- a/src/applications/mne_analyze/mne_analyze/mainwindow.cpp
+++ b/src/applications/mne_analyze/mne_analyze/mainwindow.cpp
@@ -340,7 +340,7 @@ void MainWindow::initMenuBar()
pActionDefaultStyle->setChecked(true);
pActionStyleGroup->addAction(pActionDefaultStyle);
connect(pActionDefaultStyle, &QAction::triggered,
- [=]() {
+ [=, this]() {
setCurrentStyle("default");
});
@@ -350,7 +350,7 @@ void MainWindow::initMenuBar()
m_pActionDarkMode->setChecked(false);
pActionStyleGroup->addAction(m_pActionDarkMode);
connect(m_pActionDarkMode.data(), &QAction::triggered,
- [=]() {
+ [=, this]() {
setCurrentStyle("dark");
});
diff --git a/src/applications/mne_analyze/plugins/CMakeLists.txt b/src/applications/mne_analyze/plugins/CMakeLists.txt
index 6b3c5383df9..7311a062c1b 100644
--- a/src/applications/mne_analyze/plugins/CMakeLists.txt
+++ b/src/applications/mne_analyze/plugins/CMakeLists.txt
@@ -31,7 +31,7 @@ add_subdirectory(filtering)
add_subdirectory(rawdataviewer)
add_subdirectory(sourcelocalization)
-if(NOT WASM)
+if(TARGET mne_disp3D_rhi)
add_subdirectory(view3d)
endif()
diff --git a/src/applications/mne_analyze/plugins/averaging/CMakeLists.txt b/src/applications/mne_analyze/plugins/averaging/CMakeLists.txt
index d6608fa2f31..9a2a41d79b8 100644
--- a/src/applications/mne_analyze/plugins/averaging/CMakeLists.txt
+++ b/src/applications/mne_analyze/plugins/averaging/CMakeLists.txt
@@ -7,6 +7,11 @@ set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(QT_REQUIRED_COMPONENTS Core Widgets Svg)
+
+if(Qt6_FOUND OR QT_VERSION_MAJOR EQUAL 6)
+ list(APPEND QT_REQUIRED_COMPONENTS OpenGLWidgets)
+endif()
+
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS ${QT_REQUIRED_COMPONENTS})
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS ${QT_REQUIRED_COMPONENTS})
diff --git a/src/applications/mne_analyze/plugins/controlmanager/CMakeLists.txt b/src/applications/mne_analyze/plugins/controlmanager/CMakeLists.txt
index de5c1844b9b..fdf5f3ef0d2 100644
--- a/src/applications/mne_analyze/plugins/controlmanager/CMakeLists.txt
+++ b/src/applications/mne_analyze/plugins/controlmanager/CMakeLists.txt
@@ -61,8 +61,8 @@ set(MNE_LIBS_REQUIRED
mne_events
)
-if(NOT WASM)
- list(APPEND MNE_LIBS_REQUIRED mne_disp3D)
+if(TARGET mne_disp3D_rhi)
+ list(APPEND MNE_LIBS_REQUIRED mne_disp3D_rhi)
endif()
target_link_libraries(${PROJECT_NAME} PRIVATE
diff --git a/src/applications/mne_analyze/plugins/controlmanager/controlmanager.cpp b/src/applications/mne_analyze/plugins/controlmanager/controlmanager.cpp
index 36f45b51054..5cc49e4597f 100644
--- a/src/applications/mne_analyze/plugins/controlmanager/controlmanager.cpp
+++ b/src/applications/mne_analyze/plugins/controlmanager/controlmanager.cpp
@@ -47,9 +47,8 @@
#include
#include
-#ifndef WASMBUILD
-#include
-#include
+#ifdef MNE_DISP3D_RHI
+#include
#endif
//=============================================================================================================
@@ -164,15 +163,11 @@ QDockWidget *ControlManager::getControl()
m_ViewParameters.m_iTimeSpacers = pFiffViewSettings->getDistanceTimeSpacer();
m_ViewParameters.m_sImageType = "";
- #ifndef WASMBUILD
//View3D Settings
m_pControl3DView = new DISPLIB::Control3DView(QString("MNEANALYZE/%1").arg(this->getName()), Q_NULLPTR, slControlFlags);
- DISP3DLIB::Data3DTreeDelegate* pData3DTreeDelegate = new DISP3DLIB::Data3DTreeDelegate(this);
pTabWidget->addTab(m_pControl3DView, "3D");
- m_pControl3DView->setDelegate(pData3DTreeDelegate);
-
connect(m_pControl3DView, &DISPLIB::Control3DView::sceneColorChanged,
this, &ControlManager::onSceneColorChange);
connect(m_pControl3DView, &DISPLIB::Control3DView::rotationChanged,
@@ -187,7 +182,6 @@ QDockWidget *ControlManager::getControl()
this, &ControlManager::onLightIntensityChanged);
connect(m_pControl3DView, &DISPLIB::Control3DView::takeScreenshotChanged,
this, &ControlManager::onTakeScreenshotChanged);
- #endif
m_pApplyToView = new DISPLIB::ApplyToView();
pLayout->addWidget(pTabWidget);
@@ -220,11 +214,11 @@ void ControlManager::handleEvent(QSharedPointer e)
}
break;
+#ifdef MNE_DISP3D_RHI
case EVENT_TYPE::SET_DATA3D_TREE_MODEL:
- #ifndef WASMBUILD
- init3DGui(e->getData().value>());
- #endif
+ init3DGui(e->getData().value>());
break;
+#endif
default:
qWarning() << "[ControlManager::handleEvent] received an Event that is not handled by switch-cases";
break;
@@ -237,7 +231,9 @@ QVector ControlManager::getEventSubscriptions(void) const
{
QVector temp;
temp.push_back(SELECTED_MODEL_CHANGED);
+#ifdef MNE_DISP3D_RHI
temp.push_back(SET_DATA3D_TREE_MODEL);
+#endif
return temp;
}
@@ -322,8 +318,8 @@ void ControlManager::onMakeScreenshot(const QString& imageType)
//=============================================================================================================
-#ifndef WASMBUILD
-void ControlManager::init3DGui(QSharedPointer pModel)
+#ifdef MNE_DISP3D_RHI
+void ControlManager::init3DGui(QSharedPointer pModel)
{
m_pControl3DView->setModel(pModel.data());
}
diff --git a/src/applications/mne_analyze/plugins/controlmanager/controlmanager.h b/src/applications/mne_analyze/plugins/controlmanager/controlmanager.h
index dcfdf783a79..a52496d3b94 100644
--- a/src/applications/mne_analyze/plugins/controlmanager/controlmanager.h
+++ b/src/applications/mne_analyze/plugins/controlmanager/controlmanager.h
@@ -64,10 +64,8 @@ namespace DISPLIB{
class Control3DView;
}
-#ifndef WASMBUILD
-namespace DISP3DLIB {
- class Data3DTreeModel;
-}
+#ifdef MNE_DISP3D_RHI
+class BrainTreeModel;
#endif
//=============================================================================================================
@@ -172,15 +170,15 @@ class CONTROLMANAGERSHARED_EXPORT ControlManager : public ANSHAREDLIB::AbstractP
*/
void onMakeScreenshot(const QString& imageType);
- #ifndef WASMBUILD
//=========================================================================================================
/**
* Sets 3D model for the 3D controls
*
* @param[in] pModel new 3D Model.
*/
- void init3DGui(QSharedPointer pModel);
- #endif
+#ifdef MNE_DISP3D_RHI
+ void init3DGui(QSharedPointer pModel);
+#endif
//=========================================================================================================
/**
@@ -238,9 +236,7 @@ class CONTROLMANAGERSHARED_EXPORT ControlManager : public ANSHAREDLIB::AbstractP
QPointer m_pCommu; /**< Communicator to send events trhoug hevent manager. */
- #ifndef WASMBUILD
DISPLIB::Control3DView* m_pControl3DView; /**< Controls for 3d View. */
- #endif
DISPLIB::ApplyToView* m_pApplyToView; /**< Controls for selecting views to apply settings. */
ANSHAREDLIB::ScalingParameters m_ScalingParameters; /**< Controls for scaling. */
diff --git a/src/applications/mne_analyze/plugins/coregistration/coregistration.cpp b/src/applications/mne_analyze/plugins/coregistration/coregistration.cpp
index 5dad556d7a6..7afcb65a9f1 100644
--- a/src/applications/mne_analyze/plugins/coregistration/coregistration.cpp
+++ b/src/applications/mne_analyze/plugins/coregistration/coregistration.cpp
@@ -713,7 +713,7 @@ void CoRegistration::getParamFromTrans(const Matrix4f& matTrans,
matRot.col(i) = matRot.col(i) / vecScale(i);
}
// get rotation in rad - z,y,x
- vecRot = matRot.eulerAngles(2,1,0);
+ vecRot = matRot.canonicalEulerAngles(2,1,0);
// get translation vector
vecTrans = m_transHeadMri.trans.block(0,3,3,1);
diff --git a/src/applications/mne_analyze/plugins/dataloader/dataloader.cpp b/src/applications/mne_analyze/plugins/dataloader/dataloader.cpp
index 9bcc8e59512..17666397fe3 100644
--- a/src/applications/mne_analyze/plugins/dataloader/dataloader.cpp
+++ b/src/applications/mne_analyze/plugins/dataloader/dataloader.cpp
@@ -139,19 +139,19 @@ QMenu *DataLoader::getMenu()
QAction* pActionSaveData = new QAction(tr("Save data"));
pActionLoadFile->setStatusTip(tr("Save the selected data file"));
- connect(pActionSaveData, &QAction::triggered,[=] {
+ connect(pActionSaveData, &QAction::triggered,[=, this] {
onSaveFilePressed(DATA_FILE);
});
QAction* pActionSaveAvg = new QAction(tr("Save average"));
pActionLoadFile->setStatusTip(tr("Save the selected data file"));
- connect(pActionSaveAvg, &QAction::triggered,[=] {
+ connect(pActionSaveAvg, &QAction::triggered,[=, this] {
onSaveFilePressed(AVERAGE_FILE);
});
QAction* pActionSaveAnn = new QAction(tr("Save events"));
pActionLoadFile->setStatusTip(tr("Save the selected data file"));
- connect(pActionSaveAnn, &QAction::triggered,[=] {
+ connect(pActionSaveAnn, &QAction::triggered,[=, this] {
onSaveFilePressed(EVENT_FILE);
});
diff --git a/src/applications/mne_analyze/plugins/events/eventview.cpp b/src/applications/mne_analyze/plugins/events/eventview.cpp
index 163aa4e4f3f..0667d60d7f7 100644
--- a/src/applications/mne_analyze/plugins/events/eventview.cpp
+++ b/src/applications/mne_analyze/plugins/events/eventview.cpp
@@ -144,12 +144,12 @@ void EventView::initMVCSettings()
void EventView::initGUIFunctionality()
{
//'Activate events' checkbox
- connect(m_pUi->m_checkBox_activateEvents, &QCheckBox::stateChanged,
- this, &EventView::activeEventsChecked, Qt::UniqueConnection);
+ connect(m_pUi->m_checkBox_activateEvents, &QCheckBox::checkStateChanged,
+ this, [this](Qt::CheckState state) { emit activeEventsChecked(static_cast(state)); }, Qt::UniqueConnection);
//'Show selected event' checkbox
- connect(m_pUi->m_checkBox_showSelectedEventsOnly,&QCheckBox::stateChanged,
- this, &EventView::onSelectedEventsChecked, Qt::UniqueConnection);
+ connect(m_pUi->m_checkBox_showSelectedEventsOnly, &QCheckBox::checkStateChanged,
+ this, [this](Qt::CheckState state) { onSelectedEventsChecked(static_cast(state)); }, Qt::UniqueConnection);
connect(m_pUi->m_tableView_eventTableView->selectionModel(), &QItemSelectionModel::selectionChanged,
this, &EventView::onCurrentSelectedChanged, Qt::UniqueConnection);
@@ -302,10 +302,10 @@ void EventView::disconnectFromModel()
{
disconnect(m_pEventModel.data(),&ANSHAREDLIB::EventModel::dataChanged,
this, &EventView::onDataChanged);
- disconnect(m_pUi->m_checkBox_activateEvents, &QCheckBox::stateChanged,
- this, &EventView::activeEventsChecked);
- disconnect(m_pUi->m_checkBox_showSelectedEventsOnly,&QCheckBox::stateChanged,
- this, &EventView::onSelectedEventsChecked);
+ disconnect(m_pUi->m_checkBox_activateEvents, &QCheckBox::checkStateChanged,
+ this, nullptr);
+ disconnect(m_pUi->m_checkBox_showSelectedEventsOnly, &QCheckBox::checkStateChanged,
+ this, nullptr);
disconnect(m_pUi->m_pushButton_addEventType, &QPushButton::clicked,
this, &EventView::addEventGroup);
disconnect(m_pUi->m_listWidget_groupListWidget->selectionModel(), &QItemSelectionModel::selectionChanged,
diff --git a/src/applications/mne_analyze/plugins/rawdataviewer/CMakeLists.txt b/src/applications/mne_analyze/plugins/rawdataviewer/CMakeLists.txt
index 530cdb6b701..2658df97f68 100644
--- a/src/applications/mne_analyze/plugins/rawdataviewer/CMakeLists.txt
+++ b/src/applications/mne_analyze/plugins/rawdataviewer/CMakeLists.txt
@@ -6,10 +6,13 @@ set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
-set(QT_REQUIRED_COMPONENTS Core Widgets Svg Charts)
+set(QT_REQUIRED_COMPONENTS Core Widgets Svg)
if(NOT WASM)
- list(APPEND QT_REQUIRED_COMPONENTS OpenGL 3DCore 3DRender 3DInput 3DExtras)
+ list(APPEND QT_REQUIRED_COMPONENTS OpenGL)
+ if(Qt6_FOUND OR QT_VERSION_MAJOR EQUAL 6)
+ list(APPEND QT_REQUIRED_COMPONENTS OpenGLWidgets)
+ endif()
endif()
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS ${QT_REQUIRED_COMPONENTS})
diff --git a/src/applications/mne_analyze/plugins/view3d/CMakeLists.txt b/src/applications/mne_analyze/plugins/view3d/CMakeLists.txt
index d30c87c449e..4456067f97c 100644
--- a/src/applications/mne_analyze/plugins/view3d/CMakeLists.txt
+++ b/src/applications/mne_analyze/plugins/view3d/CMakeLists.txt
@@ -6,7 +6,12 @@ set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
-set(QT_REQUIRED_COMPONENTS Core Widgets Svg OpenGL 3DCore 3DRender 3DInput 3DExtras Charts)
+set(QT_REQUIRED_COMPONENTS Core Widgets Svg OpenGL)
+
+if(Qt6_FOUND OR QT_VERSION_MAJOR EQUAL 6)
+ list(APPEND QT_REQUIRED_COMPONENTS OpenGLWidgets)
+endif()
+
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS ${QT_REQUIRED_COMPONENTS})
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS ${QT_REQUIRED_COMPONENTS})
@@ -51,7 +56,7 @@ list(TRANSFORM QT_REQUIRED_COMPONENT_LIBS PREPEND "Qt${QT_VERSION_MAJOR}::")
set(MNE_LIBS_REQUIRED
mne_disp
- mne_disp3D
+ mne_disp3D_rhi
mne_utils
mne_fiff
mne_fs
diff --git a/src/applications/mne_analyze/plugins/view3d/view3d.cpp b/src/applications/mne_analyze/plugins/view3d/view3d.cpp
index 5addd966a20..2bc2b647f5c 100644
--- a/src/applications/mne_analyze/plugins/view3d/view3d.cpp
+++ b/src/applications/mne_analyze/plugins/view3d/view3d.cpp
@@ -44,15 +44,12 @@
#include
#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
+#include
+#include
+#include
+#include
+#include
+#include
#include
@@ -63,7 +60,6 @@
//=============================================================================================================
#include
-#include
//=============================================================================================================
// USED NAMESPACES
@@ -80,7 +76,6 @@ using namespace FIFFLIB;
View3D::View3D()
: m_pCommu(Q_NULLPTR)
, m_pBemTreeCoreg(Q_NULLPTR)
- , m_pDigitizerCoreg(Q_NULLPTR)
, m_pView3D(Q_NULLPTR)
, m_bPickingActivated(false)
{
@@ -106,7 +101,7 @@ QSharedPointer View3D::clone() const
void View3D::init()
{
m_pCommu = new Communicator(this);
- m_p3DModel = QSharedPointer::create();
+ m_p3DModel = QSharedPointer::create();
}
//=============================================================================================================
@@ -135,32 +130,20 @@ QMenu *View3D::getMenu()
QWidget *View3D::getView()
{
if(!m_pView3D) {
- m_pView3D = new DISP3DLIB::View3D();
+ m_pView3D = new BrainView();
}
- m_pView3D->setModel(m_p3DModel);
+ m_pView3D->setModel(m_p3DModel.data());
new3DModel(m_p3DModel);
- connect(m_pView3D, &DISP3DLIB::View3D::pickEventOccured,
- this, &View3D::newPickingEvent);
-
- connect(this, &View3D::sceneColorChanged,
- m_pView3D, &DISP3DLIB::View3D::setSceneColor);
- connect(this, &View3D::rotationChanged,
- m_pView3D, &DISP3DLIB::View3D::startStopCameraRotation);
- connect(this, &View3D::showCoordAxis,
- m_pView3D, &DISP3DLIB::View3D::toggleCoordAxis);
- connect(this, &View3D::showFullScreen,
- m_pView3D, &DISP3DLIB::View3D::showFullScreen);
- connect(this, &View3D::lightColorChanged,
- m_pView3D, &DISP3DLIB::View3D::setLightColor);
- connect(this, &View3D::lightIntensityChanged,
- m_pView3D, &DISP3DLIB::View3D::setLightIntensity);
+ // Note: BrainView (QRhiWidget) does not support scene color, camera rotation toggle,
+ // coord axis toggle, light color/intensity, or screenshot via direct slots.
+ // Use BrainView::saveSnapshot() for screenshots, setLightingEnabled() for lighting.
connect(this, &View3D::takeScreenshotChanged,
- m_pView3D, &DISP3DLIB::View3D::takeScreenshot);
+ m_pView3D, &BrainView::saveSnapshot);
- QWidget *pWidgetContainer = QWidget::createWindowContainer(m_pView3D, Q_NULLPTR, Qt::Widget);
- return pWidgetContainer;
+ // BrainView is a QWidget (QRhiWidget), can be embedded directly
+ return m_pView3D;
}
//=============================================================================================================
@@ -232,15 +215,14 @@ void View3D::updateCoregBem(QSharedPointer pNewModel)
qWarning() << "[View3D::updateCoregBem] Null Bem Model pointer.";
return;
} else if(!m_p3DModel){
- std::cout << "[View3D::updateCoregBem] Null Data3DTreeModel";
+ std::cout << "[View3D::updateCoregBem] Null BrainTreeModel";
return;
} else if(pNewModel->getType() == ANSHAREDLIB_BEMDATA_MODEL) {
- m_pView3D->activatePicker(true);
- m_pBemTreeCoreg = m_p3DModel->addBemData("Co-Registration",
- QFileInfo(pNewModel->getModelPath()).fileName(),
- *pNewModel->getBem().data());
-
- m_pView3D->activatePicker(m_bPickingActivated);
+ if(!pNewModel->getBem().data()->isEmpty()) {
+ m_pBemTreeCoreg = m_p3DModel->addBemSurface("Co-Registration",
+ QFileInfo(pNewModel->getModelPath()).fileName(),
+ (*pNewModel->getBem().data())[0]);
+ }
}
return;
}
@@ -249,18 +231,14 @@ void View3D::updateCoregBem(QSharedPointer pNewModel)
void View3D::updateCoregDigitizer(FiffDigPointSet digSet)
{
- m_pDigitizerCoreg = m_p3DModel->addDigitizerData("Co-Registration",
- "Digitizers",
- digSet);
+ m_p3DModel->addDigitizerData(digSet.getList());
return;
}
//=============================================================================================================
void View3D::updateCoregMriFid(FiffDigPointSet digSetFid)
{
- m_pMriFidCoreg = m_p3DModel->addDigitizerData("Co-Registration",
- "MRI Fiducials",
- digSetFid);
+ m_p3DModel->addDigitizerData(digSetFid.getList());
return;
}
@@ -268,7 +246,10 @@ void View3D::updateCoregMriFid(FiffDigPointSet digSetFid)
void View3D::updateCoregTrans(FiffCoordTrans headMriTrans)
{
- m_pDigitizerCoreg->setTransform(headMriTrans,false);
+ // Note: Per-item transforms for digitizers are not yet supported in disp3D_rhi.
+ // The coregistration transform will need to be applied via BrainView's scene transform
+ // or by rebuilding the digitizer data in the transformed space.
+ Q_UNUSED(headMriTrans)
return;
}
@@ -276,7 +257,6 @@ void View3D::updateCoregTrans(FiffCoordTrans headMriTrans)
void View3D::fiducialPicking(const bool bActivatePicking)
{
- m_pView3D->activatePicker(bActivatePicking);
m_bPickingActivated = bActivatePicking;
if(bActivatePicking) {
@@ -286,9 +266,9 @@ void View3D::fiducialPicking(const bool bActivatePicking)
//=============================================================================================================
-void View3D::newPickingEvent(Qt3DRender::QPickEvent *qPickEvent)
+void View3D::newPickingEvent(const QVector3D &worldIntersection)
{
- QVariant data = QVariant::fromValue(qPickEvent->worldIntersection());
+ QVariant data = QVariant::fromValue(worldIntersection);
m_pCommu->publishEvent(EVENT_TYPE::NEW_FIDUCIAL_PICKED, data);
}
@@ -296,25 +276,15 @@ void View3D::newPickingEvent(Qt3DRender::QPickEvent *qPickEvent)
void View3D::onFiducialChanged(const int iFiducial)
{
- switch(iFiducial) {
- case FIFFV_POINT_LPA:
- m_pView3D->setCameraRotation(90);
- m_iFiducial = FIFFV_POINT_LPA;
- return;
- case FIFFV_POINT_NASION:
- m_pView3D->setCameraRotation(0);
- m_iFiducial = FIFFV_POINT_NASION;
- return;
- case FIFFV_POINT_RPA:
- m_pView3D->setCameraRotation(270);
- m_iFiducial = FIFFV_POINT_RPA;
- return;
- }
+ // Note: BrainView does not have setCameraRotation(int degrees).
+ // Camera rotation for fiducial picking is not yet supported in disp3D_rhi.
+ Q_UNUSED(iFiducial)
+ m_iFiducial = iFiducial;
}
//=============================================================================================================
-void View3D::new3DModel(QSharedPointer pModel)
+void View3D::new3DModel(QSharedPointer pModel)
{
m_pCommu->publishEvent(EVENT_TYPE::SET_DATA3D_TREE_MODEL, QVariant::fromValue(pModel));
}
@@ -354,7 +324,7 @@ void View3D::settingsChanged(ANSHAREDLIB::View3DParameters viewParameters)
void View3D::newDipoleFit(const INVERSELIB::ECDSet &ecdSet)
{
- m_pDipoleFit = m_p3DModel->addDipoleFitData("Dipole Fit", "Data", ecdSet);
+ m_p3DModel->addDipoles(ecdSet);
}
//=============================================================================================================
@@ -371,10 +341,6 @@ void View3D::onModelChanged(QSharedPointer pNewModel
void View3D::onModelRemoved(QSharedPointer pRemovedModel)
{
if(pRemovedModel->getType() == MODEL_TYPE::ANSHAREDLIB_DIPOLEFIT_MODEL) {
- if(!m_pDipoleFit){
- return;
- }
-
QList lItemList = m_p3DModel->findItems("Dipole Fit");
if(!lItemList.isEmpty()){
for(QStandardItem * pItem : lItemList){
@@ -385,10 +351,10 @@ void View3D::onModelRemoved(QSharedPointer pRemovedM
}
}
- m_pBemTreeCoreg = Q_NULLPTR;
-
- m_pView3D->hide();
- m_pView3D->show();
+ if(m_pView3D) {
+ m_pView3D->hide();
+ m_pView3D->show();
+ }
} else if(pRemovedModel->getType() == MODEL_TYPE::ANSHAREDLIB_BEMDATA_MODEL){
if(!m_pBemTreeCoreg){
@@ -411,8 +377,10 @@ void View3D::onModelRemoved(QSharedPointer pRemovedM
m_pBemTreeCoreg = Q_NULLPTR;
- m_pView3D->hide();
- m_pView3D->show();
+ if(m_pView3D) {
+ m_pView3D->hide();
+ m_pView3D->show();
+ }
}
}
diff --git a/src/applications/mne_analyze/plugins/view3d/view3d.h b/src/applications/mne_analyze/plugins/view3d/view3d.h
index 56597266c0c..196253894f6 100644
--- a/src/applications/mne_analyze/plugins/view3d/view3d.h
+++ b/src/applications/mne_analyze/plugins/view3d/view3d.h
@@ -51,7 +51,6 @@
#include
#include
-#include
//=============================================================================================================
// FORWARD DECLARATIONS
@@ -64,13 +63,11 @@ namespace ANSHAREDLIB {
class DipoleFitModel;
}
-namespace DISP3DLIB {
- class View3D;
- class Data3DTreeModel;
- class BemTreeItem;
- class DigitizerSetTreeItem;
- class EcdDataTreeItem;
-}
+class BrainView;
+class BrainTreeModel;
+class BemTreeItem;
+class DigitizerSetTreeItem;
+class DipoleTreeItem;
namespace DISPLIB {
class Control3DView;
@@ -174,9 +171,9 @@ class VIEW3DSHARED_EXPORT View3D : public ANSHAREDLIB::AbstractPlugin
//=========================================================================================================
/**
- * Handle incoming picking event from DISP3DLIB::3DView.
+ * Handle incoming picking event from BrainView.
*/
- void newPickingEvent(Qt3DRender::QPickEvent *qPickEvent);
+ void newPickingEvent(const QVector3D &worldIntersection);
//=========================================================================================================
/**
@@ -184,7 +181,7 @@ class VIEW3DSHARED_EXPORT View3D : public ANSHAREDLIB::AbstractPlugin
*
* @param[in] pModel new 3D model to be emitted.
*/
- void new3DModel(QSharedPointer pModel);
+ void new3DModel(QSharedPointer pModel);
//=========================================================================================================
/**
@@ -221,13 +218,10 @@ class VIEW3DSHARED_EXPORT View3D : public ANSHAREDLIB::AbstractPlugin
int m_iFiducial; /**< Currently selected fiducial. */
- QSharedPointer m_p3DModel; /**< The 3D model data. */
- DISP3DLIB::BemTreeItem* m_pBemTreeCoreg; /**< TThe BEM head model of the coregistration plugin. */
- DISP3DLIB::DigitizerSetTreeItem* m_pDigitizerCoreg; /**< The 3D item pointing to the tracked digitizers. */
- DISP3DLIB::DigitizerSetTreeItem* m_pMriFidCoreg; /**< The 3D item pointing to the mri fiducials. */
- DISP3DLIB::EcdDataTreeItem* m_pDipoleFit; /**< The 3D item pointing to the dipole fit. */
+ QSharedPointer m_p3DModel; /**< The 3D model data. */
+ BemTreeItem* m_pBemTreeCoreg; /**< TThe BEM head model of the coregistration plugin. */
- DISP3DLIB::View3D* m_pView3D; /**< The Disp3D view. */
+ BrainView* m_pView3D; /**< The Disp3D view. */
DISPLIB::Control3DView* m_pControl3DView; /**< The 3D Control view. */
bool m_bPickingActivated; /**< If Picking is activated*/
diff --git a/src/applications/mne_anonymize/CMakeLists.txt b/src/applications/mne_anonymize/CMakeLists.txt
index 874be57a58f..11dfcaedb56 100644
--- a/src/applications/mne_anonymize/CMakeLists.txt
+++ b/src/applications/mne_anonymize/CMakeLists.txt
@@ -42,14 +42,15 @@ target_link_libraries(${PROJECT_NAME} PRIVATE
)
set_target_properties(${PROJECT_NAME} PROPERTIES
- MACOSX_BUNDLE_GUI_IDENTIFIER mne-cpp.org
+ MACOSX_BUNDLE_GUI_IDENTIFIER org.mne-cpp.mne_anonymize
MACOSX_BUNDLE ${BUILD_MAC_APP_BUNDLE}
WIN32_EXECUTABLE TRUE
)
install(TARGETS ${PROJECT_NAME}
- BUNDLE DESTINATION .
- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
+ BUNDLE DESTINATION . COMPONENT applications
+ RUNTIME DESTINATION bin COMPONENT applications
+ LIBRARY DESTINATION lib COMPONENT applications)
if(QT_VERSION_MAJOR EQUAL 6)
qt_finalize_executable(${PROJECT_NAME})
diff --git a/src/applications/mne_anonymize/fiffanonymizer.cpp b/src/applications/mne_anonymize/fiffanonymizer.cpp
index b03d22e714a..711ca08bae4 100644
--- a/src/applications/mne_anonymize/fiffanonymizer.cpp
+++ b/src/applications/mne_anonymize/fiffanonymizer.cpp
@@ -49,6 +49,7 @@
#include
#include
+#include
//=============================================================================================================
// EIGEN INCLUDES
@@ -78,7 +79,7 @@ FiffAnonymizer::FiffAnonymizer()
, m_dMaxValidFiffVerion(1.3)
, m_sDefaultString("mne_anonymize")
, m_sDefaultShortString("mne-cpp")
-, m_dDefaultDate(QDateTime(QDate(2000,1,1), QTime(1, 1, 0), Qt::LocalTime))
+, m_dDefaultDate(QDateTime(QDate(2000,1,1), QTime(1, 1, 0)))
, m_dMeasurementDate(m_dDefaultDate)
, m_iMeasurementDateOffset(0)
, m_bUseMeasurementDateOffset(false)
@@ -264,7 +265,7 @@ void FiffAnonymizer::censorTag()
case FIFF_REF_BLOCK_ID:
{
FIFFLIB::FiffId inId = m_pTag->toFiffID();
- QDateTime inMeasDate = QDateTime::fromSecsSinceEpoch(inId.time.secs, Qt::LocalTime);
+ QDateTime inMeasDate = QDateTime::fromSecsSinceEpoch(inId.time.secs, QTimeZone::LocalTime);
emit readingIdMeasurementDate(inMeasDate);
QDateTime outMeasDate;
@@ -298,7 +299,7 @@ void FiffAnonymizer::censorTag()
}
case FIFF_MEAS_DATE:
{
- QDateTime inMeasDate(QDateTime::fromSecsSinceEpoch(*m_pTag->toInt(), Qt::LocalTime));
+ QDateTime inMeasDate(QDateTime::fromSecsSinceEpoch(*m_pTag->toInt(), QTimeZone::LocalTime));
emit readingFileMeasurementDate(inMeasDate);
QDateTime outMeasDate;
diff --git a/src/applications/mne_anonymize/mainwindow.cpp b/src/applications/mne_anonymize/mainwindow.cpp
index 06b028a4c3c..6e7ba1b4ba3 100644
--- a/src/applications/mne_anonymize/mainwindow.cpp
+++ b/src/applications/mne_anonymize/mainwindow.cpp
@@ -324,7 +324,7 @@ void MainWindow::setupConnections()
{
//from gui to mainwindow class
- QObject::connect(m_pUi->checkBoxShowOptions,&QCheckBox::stateChanged,
+ QObject::connect(m_pUi->checkBoxShowOptions,&QCheckBox::checkStateChanged,
this,&MainWindow::checkBoxShowOptionsChanged);
QObject::connect(m_pUi->pushButtonReadData,&QPushButton::clicked,
@@ -346,17 +346,17 @@ void MainWindow::setupConnections()
QObject::connect(m_pUi->openOutFileWindowButton,&QToolButton::clicked,
this,&MainWindow::openOutFileDialog);
- QObject::connect(m_pUi->checkBoxBruteMode,&QCheckBox::stateChanged,
+ QObject::connect(m_pUi->checkBoxBruteMode,&QCheckBox::checkStateChanged,
this,&MainWindow::checkBoxBruteModeChanged);
- QObject::connect(m_pUi->checkBoxMeasurementDateOffset,&QCheckBox::stateChanged,
+ QObject::connect(m_pUi->checkBoxMeasurementDateOffset,&QCheckBox::checkStateChanged,
this,&MainWindow::checkBoxMeasurementDateOffsetStateChanged);
QObject::connect(m_pUi->spinBoxMeasurementDateOffset,QOverload::of(&QSpinBox::valueChanged),
this,&MainWindow::spinBoxMeasurementDateOffsetValueChanged);
QObject::connect(m_pUi->dateTimeMeasurementDate,&QDateTimeEdit::dateTimeChanged,
this,&MainWindow::dateTimeMeasurementDateDateTimeChanged);
- QObject::connect(m_pUi->checkBoxBirthdayDateOffset,&QCheckBox::stateChanged,
+ QObject::connect(m_pUi->checkBoxBirthdayDateOffset,&QCheckBox::checkStateChanged,
this,&MainWindow::checkBoxBirthdayDateOffsetStateChanged);
QObject::connect(m_pUi->dateEditBirthdayDate,&QDateEdit::dateChanged,
this,&MainWindow::dateEditBirthdayDateDateChanged);
@@ -803,7 +803,7 @@ void MainWindow::checkBoxBruteModeChanged()
//=============================================================================================================
-void MainWindow::checkBoxMeasurementDateOffsetStateChanged(int arg)
+void MainWindow::checkBoxMeasurementDateOffsetStateChanged(Qt::CheckState arg)
{
Q_UNUSED(arg)
bool state(m_pUi->checkBoxMeasurementDateOffset->isChecked());
@@ -820,7 +820,7 @@ void MainWindow::checkBoxMeasurementDateOffsetStateChanged(int arg)
//=============================================================================================================
-void MainWindow::checkBoxBirthdayDateOffsetStateChanged(int arg)
+void MainWindow::checkBoxBirthdayDateOffsetStateChanged(Qt::CheckState arg)
{
Q_UNUSED(arg)
bool state(m_pUi->checkBoxBirthdayDateOffset->isChecked());
diff --git a/src/applications/mne_anonymize/mainwindow.h b/src/applications/mne_anonymize/mainwindow.h
index cfa54dac364..15f5eb56a65 100644
--- a/src/applications/mne_anonymize/mainwindow.h
+++ b/src/applications/mne_anonymize/mainwindow.h
@@ -648,7 +648,7 @@ private slots:
* Since the control for the number of offset days is otherwise disabled.
*
*/
- void checkBoxMeasurementDateOffsetStateChanged(int arg);
+ void checkBoxMeasurementDateOffsetStateChanged(Qt::CheckState arg);
//=========================================================================================================
/**
@@ -656,7 +656,7 @@ private slots:
* substituting the subject's birthday or to use a number of offset days.
*
*/
- void checkBoxBirthdayDateOffsetStateChanged(int arg);
+ void checkBoxBirthdayDateOffsetStateChanged(Qt::CheckState arg);
//=========================================================================================================
/**
diff --git a/src/applications/mne_browse/CMakeLists.txt b/src/applications/mne_browse/CMakeLists.txt
new file mode 100644
index 00000000000..1c021fd134b
--- /dev/null
+++ b/src/applications/mne_browse/CMakeLists.txt
@@ -0,0 +1,165 @@
+cmake_minimum_required(VERSION 3.14)
+project(mne_browse LANGUAGES CXX)
+
+# Handle qt uic, moc, rrc automatically
+set(CMAKE_AUTOUIC ON)
+set(CMAKE_AUTOMOC ON)
+set(CMAKE_AUTORCC ON)
+
+set(QT_REQUIRED_COMPONENTS Core Widgets Concurrent Network Svg)
+
+if(NOT WASM AND NOT NO_OPENGL)
+ list(APPEND QT_REQUIRED_COMPONENTS OpenGL)
+ if(Qt6_FOUND OR QT_VERSION_MAJOR EQUAL 6)
+ list(APPEND QT_REQUIRED_COMPONENTS OpenGLWidgets)
+ endif()
+endif()
+
+if(NOT WASM)
+ list(APPEND QT_REQUIRED_COMPONENTS PrintSupport)
+endif()
+
+find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS ${QT_REQUIRED_COMPONENTS})
+find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS ${QT_REQUIRED_COMPONENTS})
+
+set(SOURCES
+ main.cpp
+ Utils/datamarker.cpp
+ Utils/rawsettings.cpp
+ Utils/filteroperator.cpp
+ Utils/filterplotscene.cpp
+ Utils/butterflyscene.cpp
+ Utils/butterflysceneitem.cpp
+ Models/averagemodel.cpp
+ Models/rawmodel.cpp
+ Models/eventmodel.cpp
+ Delegates/averagedelegate.cpp
+ Delegates/rawdelegate.cpp
+ Delegates/eventdelegate.cpp
+ Windows/mainwindow.cpp
+ Windows/filterwindow.cpp
+ Windows/eventwindow.cpp
+ Windows/datawindow.cpp
+ Windows/aboutwindow.cpp
+ Windows/informationwindow.cpp
+ Windows/averagewindow.cpp
+ Windows/scalewindow.cpp
+ Windows/chinfowindow.cpp
+ Utils/datapackage.cpp
+ Windows/noisereductionwindow.cpp
+)
+
+set(HEADERS
+ Utils/datamarker.h
+ Utils/rawsettings.h
+ Utils/filteroperator.h
+ Utils/types.h
+ Utils/info.h
+ Utils/filterplotscene.h
+ Utils/butterflyscene.h
+ Utils/butterflysceneitem.h
+ Models/averagemodel.h
+ Models/rawmodel.h
+ Models/eventmodel.h
+ Delegates/averagedelegate.h
+ Delegates/rawdelegate.h
+ Delegates/eventdelegate.h
+ Windows/mainwindow.h
+ Windows/filterwindow.h
+ Windows/eventwindow.h
+ Windows/datawindow.h
+ Windows/aboutwindow.h
+ Windows/informationwindow.h
+ Windows/averagewindow.h
+ Windows/scalewindow.h
+ Windows/chinfowindow.h
+ Windows/noisereductionwindow.h
+ Utils/datapackage.h
+)
+
+set(FORMS
+ Windows/eventwindowdock.ui
+ Windows/datawindowdock.ui
+ Windows/mainwindow.ui
+ Windows/aboutwindow.ui
+ Windows/informationwindow.ui
+ Windows/averagewindow.ui
+ Windows/scalewindow.ui
+ Windows/chinfowindow.ui
+ Windows/filterwindowdock.ui
+ Windows/noisereductionwindow.ui
+)
+
+set(RESOURCES
+ mne_browse.qrc
+ Resources/Images/ApplicationIcons/mne_browse.icns
+)
+
+set_source_files_properties(Resources/Images/ApplicationIcons/mne_browse.icns PROPERTIES
+ MACOSX_PACKAGE_LOCATION Resources)
+
+if(APPLE)
+ set(RESOURCE_GROUPS
+ selectionGroups
+ 2DLayouts
+ default_filters
+ hpiAlignment
+ sensorSurfaces
+ 3DLayouts
+ )
+
+ foreach(GROUP ${RESOURCE_GROUPS})
+ file(GLOB GROUP_FILES "${CMAKE_SOURCE_DIR}/resources/general/${GROUP}/*")
+ set_source_files_properties(${GROUP_FILES} PROPERTIES MACOSX_PACKAGE_LOCATION "MacOS/../resources/general/${GROUP}")
+ list(APPEND SOURCES ${GROUP_FILES})
+ endforeach()
+endif()
+
+if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
+ qt_add_executable(${PROJECT_NAME} MANUAL_FINALIZATION ${SOURCES} ${HEADERS} ${FORMS} ${RESOURCES})
+else()
+ add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS} ${FORMS} ${RESOURCES})
+endif()
+
+set(QT_REQUIRED_COMPONENT_LIBS ${QT_REQUIRED_COMPONENTS})
+list(TRANSFORM QT_REQUIRED_COMPONENT_LIBS PREPEND "Qt${QT_VERSION_MAJOR}::")
+
+set(MNE_LIBS_REQUIRED
+ mne_utils
+ mne_fs
+ mne_fiff
+ mne_mne
+ mne_fwd
+ mne_inverse
+ mne_disp
+ mne_rtprocessing
+)
+
+target_link_libraries(${PROJECT_NAME} PRIVATE
+ ${QT_REQUIRED_COMPONENT_LIBS}
+ ${MNE_LIBS_REQUIRED}
+ eigen
+)
+
+set_target_properties(${PROJECT_NAME} PROPERTIES
+ MACOSX_BUNDLE_GUI_IDENTIFIER org.mne-cpp.mne_browse
+ MACOSX_BUNDLE TRUE
+ MACOSX_BUNDLE_ICON_FILE mne_browse.icns
+ WIN32_EXECUTABLE TRUE
+)
+
+# Install
+install(
+ TARGETS ${PROJECT_NAME}
+ BUNDLE DESTINATION . COMPONENT applications
+ RUNTIME DESTINATION bin COMPONENT applications
+ LIBRARY DESTINATION lib COMPONENT applications
+)
+
+if(QT_VERSION_MAJOR EQUAL 6)
+ qt_finalize_executable(${PROJECT_NAME})
+endif()
+
+if(NOT BUILD_SHARED_LIBS)
+ target_compile_definitions(${PROJECT_NAME} PRIVATE STATICBUILD)
+endif()
diff --git a/src/applications/mne_browse/Delegates/averagedelegate.cpp b/src/applications/mne_browse/Delegates/averagedelegate.cpp
new file mode 100644
index 00000000000..f519eacb843
--- /dev/null
+++ b/src/applications/mne_browse/Delegates/averagedelegate.cpp
@@ -0,0 +1,81 @@
+//=============================================================================================================
+/**
+ * @file averagedelegate.cpp
+ * @author Christoph Dinh ;
+ * Lorenz Esch
+ * @version dev
+ * @date October, 2014
+ *
+ * @section LICENSE
+ *
+ * Copyright (C) 2014, Christoph Dinh, Lorenz Esch. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are permitted provided that
+ * the following conditions are met:
+ * * Redistributions of source code must retain the above copyright notice, this list of conditions and the
+ * following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
+ * the following disclaimer in the documentation and/or other materials provided with the distribution.
+ * * Neither the name of MNE-CPP authors nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ * @brief Definition of AverageDelegate of mne_browse
+ *
+ */
+
+//*************************************************************************************************************
+//=============================================================================================================
+// INCLUDES
+//=============================================================================================================
+
+#include "averagedelegate.h"
+
+
+//*************************************************************************************************************
+//=============================================================================================================
+// Qt INCLUDES
+//=============================================================================================================
+
+
+//*************************************************************************************************************
+//=============================================================================================================
+// USED NAMESPACES
+//=============================================================================================================
+
+using namespace MNEBROWSE;
+using namespace Eigen;
+
+
+//*************************************************************************************************************
+//=============================================================================================================
+// DEFINE MEMBER METHODS
+//=============================================================================================================
+
+AverageDelegate::AverageDelegate(QObject *parent)
+: QItemDelegate(parent)
+{
+}
+
+
+//*************************************************************************************************************
+
+void AverageDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
+{
+}
+
+
+//*************************************************************************************************************
+
+void AverageDelegate::createPlotPath(const QModelIndex &index, const QStyleOptionViewItem &option, QPainterPath& path, QList& listPairs) const
+{
+}
diff --git a/src/applications/mne_browse/Delegates/averagedelegate.h b/src/applications/mne_browse/Delegates/averagedelegate.h
new file mode 100644
index 00000000000..c3fc4c578c8
--- /dev/null
+++ b/src/applications/mne_browse/Delegates/averagedelegate.h
@@ -0,0 +1,95 @@
+//=============================================================================================================
+/**
+ * @file averagedelegate.h
+ * @author Christoph Dinh ;
+ * Lorenz Esch
+ * @version dev
+ * @date October, 2014
+ *
+ * @section LICENSE
+ *
+ * Copyright (C) 2014, Christoph Dinh, Lorenz Esch. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are permitted provided that
+ * the following conditions are met:
+ * * Redistributions of source code must retain the above copyright notice, this list of conditions and the
+ * following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
+ * the following disclaimer in the documentation and/or other materials provided with the distribution.
+ * * Neither the name of MNE-CPP authors nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ * @brief Contains the declaration of the AverageDelegate class.
+ *
+ */
+
+#ifndef AVERAGEDELEGATE_H
+#define AVERAGEDELEGATE_H
+
+//*************************************************************************************************************
+//=============================================================================================================
+// INCLUDES
+//=============================================================================================================
+
+#include "../Utils/types.h"
+
+
+//*************************************************************************************************************
+//=============================================================================================================
+// QT INCLUDES
+//=============================================================================================================
+
+#include
+
+
+//*************************************************************************************************************
+//=============================================================================================================
+// DEFINE NAMESPACE MNEBROWSE
+//=============================================================================================================
+
+namespace MNEBROWSE
+{
+
+
+//=============================================================================================================
+/**
+ * DECLARE CLASS AverageDelegate
+ */
+
+class AverageDelegate : public QItemDelegate
+{
+ Q_OBJECT
+public:
+ AverageDelegate(QObject *parent = 0);
+
+ //=========================================================================================================
+ /**
+ * Reimplemented virtual functions
+ *
+ */
+ virtual void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const;
+
+protected:
+ //=========================================================================================================
+ /**
+ * createPlotPath creates the QPointer path for the average data plot.
+ *
+ * @param[in] index QModelIndex for accessing associated data and model object.
+ * @param[in,out] path The QPointerPath to create for the data plot.
+ */
+ void createPlotPath(const QModelIndex &index, const QStyleOptionViewItem &option, QPainterPath& path, QList& listPairs) const;
+};
+
+} //NAMESPACE
+
+#endif // AVERAGEDELEGATE_H
diff --git a/src/applications/mne_browse/Delegates/eventdelegate.cpp b/src/applications/mne_browse/Delegates/eventdelegate.cpp
new file mode 100644
index 00000000000..6d25fcec786
--- /dev/null
+++ b/src/applications/mne_browse/Delegates/eventdelegate.cpp
@@ -0,0 +1,169 @@
+//=============================================================================================================
+/**
+ * @file eventdelegate.cpp
+ * @author Christoph Dinh ;
+ * Lorenz Esch
+ * @version dev
+ * @date August, 2014
+ *
+ * @section LICENSE
+ *
+ * Copyright (C) 2014, Christoph Dinh, Lorenz Esch. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are permitted provided that
+ * the following conditions are met:
+ * * Redistributions of source code must retain the above copyright notice, this list of conditions and the
+ * following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
+ * the following disclaimer in the documentation and/or other materials provided with the distribution.
+ * * Neither the name of MNE-CPP authors nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ * @brief Definition of delegate of EventDelegate
+ *
+ */
+
+//*************************************************************************************************************
+//=============================================================================================================
+// INCLUDES
+//=============================================================================================================
+
+#include "eventdelegate.h"
+
+
+//*************************************************************************************************************
+//=============================================================================================================
+// USED NAMESPACES
+//=============================================================================================================
+
+using namespace MNEBROWSE;
+
+
+//*************************************************************************************************************
+//=============================================================================================================
+// DEFINE MEMBER METHODS
+//=============================================================================================================
+
+EventDelegate::EventDelegate(QObject *parent)
+: QItemDelegate(parent)
+{
+}
+
+
+//*************************************************************************************************************
+
+QWidget *EventDelegate::createEditor(QWidget *parent,
+ const QStyleOptionViewItem &/* option */,
+ const QModelIndex & index) const
+{
+ const EventModel* pEventModel = static_cast(index.model());
+
+ switch(index.column()) {
+ case 0: {
+ QSpinBox *editor = new QSpinBox(parent);
+ editor->setMinimum(0);
+ editor->setMaximum(pEventModel->getFirstLastSample().second);
+ return editor;
+ }
+
+ case 1: {
+ QDoubleSpinBox *editor = new QDoubleSpinBox(parent);
+ editor->setMinimum(0.0);
+ editor->setMaximum(pEventModel->getFirstLastSample().second / pEventModel->getFiffInfo()->sfreq);
+ editor->setSingleStep(0.01);
+ return editor;
+ }
+
+ case 2: {
+ QComboBox *editor = new QComboBox(parent);
+ editor->addItems(pEventModel->getEventTypeList());
+ return editor;
+ }
+ }
+
+ QWidget *returnWidget = new QWidget();
+ return returnWidget;
+}
+
+
+//*************************************************************************************************************
+
+void EventDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
+{
+ switch(index.column()) {
+ case 0: {
+ int value = index.model()->data(index, Qt::DisplayRole).toInt();
+ QSpinBox *spinBox = static_cast(editor);
+ spinBox->setValue(value);
+ break;
+ }
+
+ case 1: {
+ double value = index.model()->data(index, Qt::DisplayRole).toDouble();
+ QDoubleSpinBox *spinBox = static_cast(editor);
+ spinBox->setValue(value);
+ break;
+ }
+
+ case 2: {
+ int value = index.model()->data(index, Qt::DisplayRole).toInt();
+ QComboBox *spinBox = static_cast(editor);
+ spinBox->setCurrentText(QString().number(value));
+ break;
+ }
+ }
+}
+
+
+//*************************************************************************************************************
+
+void EventDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
+ const QModelIndex &index) const
+{
+ switch(index.column()) {
+ case 0: {
+ QSpinBox *spinBox = static_cast(editor);
+ spinBox->interpretText();
+ int value = spinBox->value();
+
+ model->setData(index, value, Qt::EditRole);
+ break;
+ }
+
+ case 1: {
+ QDoubleSpinBox *spinBox = static_cast(editor);
+ spinBox->interpretText();
+ double value = spinBox->value();
+
+ model->setData(index, value, Qt::EditRole);
+ break;
+ }
+
+ case 2: {
+ QComboBox *spinBox = static_cast(editor);
+ QString value = spinBox->currentText();
+
+ model->setData(index, value.toInt(), Qt::EditRole);
+ break;
+ }
+ }
+}
+
+
+//*************************************************************************************************************
+
+void EventDelegate::updateEditorGeometry(QWidget *editor,
+ const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
+{
+ editor->setGeometry(option.rect);
+}
diff --git a/src/applications/mne_browse/Delegates/eventdelegate.h b/src/applications/mne_browse/Delegates/eventdelegate.h
new file mode 100644
index 00000000000..dd88e8eab36
--- /dev/null
+++ b/src/applications/mne_browse/Delegates/eventdelegate.h
@@ -0,0 +1,96 @@
+//=============================================================================================================
+/**
+ * @file eventdelegate.h
+ * @author Christoph Dinh ;
+ * Lorenz Esch
+ * @version dev
+ * @date August, 2014
+ *
+ * @section LICENSE
+ *
+ * Copyright (C) 2014, Christoph Dinh, Lorenz Esch. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are permitted provided that
+ * the following conditions are met:
+ * * Redistributions of source code must retain the above copyright notice, this list of conditions and the
+ * following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
+ * the following disclaimer in the documentation and/or other materials provided with the distribution.
+ * * Neither the name of MNE-CPP authors nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ * @brief Contains the declaration of the EventDelegate class.
+ *
+ */
+
+#ifndef EVENTDELEGATE_H
+#define EVENTDELEGATE_H
+
+//*************************************************************************************************************
+//=============================================================================================================
+// INCLUDES
+//=============================================================================================================
+
+#include "../Models/eventmodel.h"
+
+
+//*************************************************************************************************************
+//=============================================================================================================
+// QT INCLUDES
+//=============================================================================================================
+
+#include