diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 8f55b3ab..2399d512 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -2,13 +2,13 @@ * @MindWorkAI/maintainer # The release team is responsible for anything inside the .github directory, such as workflows, actions, and issue templates: -/.github/ @MindWorkAI/release - -# The release team is responsible for the update directory: -/.updates/ @MindWorkAI/release +/.github/ @MindWorkAI/release @SommerEngineering # Our Rust experts are responsible for the Rust codebase: /runtime/ @MindWorkAI/rust-experts # Our .NET experts are responsible for the .NET codebase: -/app/ @MindWorkAI/net-experts \ No newline at end of file +/app/ @MindWorkAI/net-experts + +# The source code rules must be reviewed by the release team: +/app/SourceCodeRules/ @MindWorkAI/release @SommerEngineering \ No newline at end of file diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 9706675a..e039df5a 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,2 +1 @@ -github: [MindWorkAI] -open_collective: mindwork-ai \ No newline at end of file +github: [MindWorkAI] \ No newline at end of file diff --git a/.github/workflows/build-and-release.yml b/.github/workflows/build-and-release.yml index d5e54401..9a9a8100 100644 --- a/.github/workflows/build-and-release.yml +++ b/.github/workflows/build-and-release.yml @@ -1,6 +1,8 @@ name: Build and Release on: push: + branches: + - main tags: - "v*.*.*" @@ -46,6 +48,7 @@ jobs: echo "version=${version}" >> "$GITHUB_OUTPUT" - name: Check tag vs. metadata version + if: startsWith(github.ref, 'refs/tags/v') run: | # Ensure, that the tag matches the version in the metadata file: if [ "${GITHUB_REF}" != "refs/tags/${FORMATTED_VERSION}" ]; then @@ -291,6 +294,35 @@ jobs: } else { Write-Output "Tauri is already installed" } + + - name: Delete previous artifact, which may exist due to caching (macOS) + if: startsWith(matrix.platform, 'macos') + run: | + rm -f runtime/target/${{ matrix.rust_target }}/release/bundle/dmg/MindWork AI Studio_*.dmg + rm -f runtime/target/${{ matrix.rust_target }}/release/bundle/macos/MindWork AI Studio.app.tar.gz* + + - name: Delete previous artifact, which may exist due to caching (Windows - MSI) + if: startsWith(matrix.platform, 'windows') && contains(matrix.tauri_bundle, 'msi') + run: | + rm -Force "runtime/target/${{ matrix.rust_target }}/release/bundle/msi/MindWork AI Studio_*.msi" -ErrorAction SilentlyContinue + rm -Force "runtime/target/${{ matrix.rust_target }}/release/bundle/msi/MindWork AI Studio*msi.zip*" -ErrorAction SilentlyContinue + + - name: Delete previous artifact, which may exist due to caching (Windows - NSIS) + if: startsWith(matrix.platform, 'windows') && contains(matrix.tauri_bundle, 'nsis') + run: | + rm -Force "runtime/target/${{ matrix.rust_target }}/release/bundle/nsis/MindWork AI Studio_*.exe" -ErrorAction SilentlyContinue + rm -Force "runtime/target/${{ matrix.rust_target }}/release/bundle/nsis/MindWork AI Studio*nsis.zip*" -ErrorAction SilentlyContinue + + - name: Delete previous artifact, which may exist due to caching (Linux - Debian Package) + if: startsWith(matrix.platform, 'ubuntu') && contains(matrix.tauri_bundle, 'deb') + run: | + rm -f runtime/target/${{ matrix.rust_target }}/release/bundle/deb/mind-work-ai-studio_*.deb + + - name: Delete previous artifact, which may exist due to caching (Linux - AppImage) + if: startsWith(matrix.platform, 'ubuntu') && contains(matrix.tauri_bundle, 'appimage') + run: | + rm -f runtime/target/${{ matrix.rust_target }}/release/bundle/appimage/mind-work-ai-studio_*.AppImage + rm -f runtime/target/${{ matrix.rust_target }}/release/bundle/appimage/mind-work-ai-studio*AppImage.tar.gz* - name: Build Tauri project (Unix) if: matrix.platform != 'windows-latest' @@ -315,7 +347,7 @@ jobs: cargo tauri build --target ${{ matrix.rust_target }} --bundles ${{ matrix.tauri_bundle }} - name: Upload artifact (macOS) - if: startsWith(matrix.platform, 'macos') + if: startsWith(matrix.platform, 'macos') && startsWith(github.ref, 'refs/tags/v') uses: actions/upload-artifact@v4 with: name: MindWork AI Studio (macOS ${{ matrix.dotnet_runtime }}) @@ -326,7 +358,7 @@ jobs: retention-days: ${{ env.RETENTION_INTERMEDIATE_ASSETS }} - name: Upload artifact (Windows - MSI) - if: startsWith(matrix.platform, 'windows') && contains(matrix.tauri_bundle, 'msi') + if: startsWith(matrix.platform, 'windows') && contains(matrix.tauri_bundle, 'msi') && startsWith(github.ref, 'refs/tags/v') uses: actions/upload-artifact@v4 with: name: MindWork AI Studio (Windows - MSI ${{ matrix.dotnet_runtime }}) @@ -337,7 +369,7 @@ jobs: retention-days: ${{ env.RETENTION_INTERMEDIATE_ASSETS }} - name: Upload artifact (Windows - NSIS) - if: startsWith(matrix.platform, 'windows') && contains(matrix.tauri_bundle, 'nsis') + if: startsWith(matrix.platform, 'windows') && contains(matrix.tauri_bundle, 'nsis') && startsWith(github.ref, 'refs/tags/v') uses: actions/upload-artifact@v4 with: name: MindWork AI Studio (Windows - NSIS ${{ matrix.dotnet_runtime }}) @@ -348,7 +380,7 @@ jobs: retention-days: ${{ env.RETENTION_INTERMEDIATE_ASSETS }} - name: Upload artifact (Linux - Debian Package) - if: startsWith(matrix.platform, 'ubuntu') && contains(matrix.tauri_bundle, 'deb') + if: startsWith(matrix.platform, 'ubuntu') && contains(matrix.tauri_bundle, 'deb') && startsWith(github.ref, 'refs/tags/v') uses: actions/upload-artifact@v4 with: name: MindWork AI Studio (Linux - deb ${{ matrix.dotnet_runtime }}) @@ -358,7 +390,7 @@ jobs: retention-days: ${{ env.RETENTION_INTERMEDIATE_ASSETS }} - name: Upload artifact (Linux - AppImage) - if: startsWith(matrix.platform, 'ubuntu') && contains(matrix.tauri_bundle, 'appimage') + if: startsWith(matrix.platform, 'ubuntu') && contains(matrix.tauri_bundle, 'appimage') && startsWith(github.ref, 'refs/tags/v') uses: actions/upload-artifact@v4 with: name: MindWork AI Studio (Linux - AppImage ${{ matrix.dotnet_runtime }}) @@ -506,6 +538,14 @@ jobs: if: ${{ steps.linux_arm_cache.outputs.cache-hit != 'true' && env.SKIP != 'true' }} run: | mv ${{ steps.build-linux-arm-runner.outputs.image }} ${{ runner.temp }}/linux_arm_qemu_cache.img + + # + # This step does not work, because we start a VM with qemu to run the build. + # + #- name: Delete previous artifact, which may exist due to caching (Linux - Debian Package) + # if: ${{ env.SKIP != 'true' }} + # run: | + # rm -f result/target/aarch64-unknown-linux-gnu/release/bundle/deb/mind-work-ai-studio_*.deb - name: Build Tauri project if: ${{ env.SKIP != 'true' }} @@ -531,6 +571,9 @@ jobs: shell: /bin/bash commands: | + # Delete all previous artifacts, which may exist due to caching: + rm -f runtime/target/aarch64-unknown-linux-gnu/release/bundle/deb/mind-work-ai-studio_*.deb + export HOME=/root export CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse source "$HOME/.cargo/env" @@ -553,7 +596,7 @@ jobs: mv ${{ steps.build-linux-arm.outputs.image }} $RUNNER_TEMP/linux_arm_qemu_cache.img - name: Upload artifact (Linux - Debian Package) - if: ${{ env.SKIP != 'true' }} + if: ${{ env.SKIP != 'true' && startsWith(github.ref, 'refs/tags/v') }} uses: actions/upload-artifact@v4 with: name: MindWork AI Studio (Linux - deb linux-arm64) @@ -566,6 +609,7 @@ jobs: name: Prepare & create release runs-on: ubuntu-latest needs: [build_main, read_metadata, build_linux_arm64] + if: startsWith(github.ref, 'refs/tags/v') steps: - name: Create artifact directory run: mkdir -p $GITHUB_WORKSPACE/artifacts @@ -723,6 +767,7 @@ jobs: name: Publish release runs-on: ubuntu-latest needs: [read_metadata, create_release] + if: startsWith(github.ref, 'refs/tags/v') permissions: contents: write diff --git a/README.md b/README.md index dc9f053d..84f945a2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # MindWork AI Studio +Are you new here? [Read here](#what-is-ai-studio) what AI Studio is. ## News Things we are currently working on: @@ -11,16 +12,16 @@ Things we are currently working on: - [x] ~~App: Add an option to show preview features (PR [#222](https://github.com/MindWorkAI/AI-Studio/pull/222))~~ - [x] ~~App: Configure embedding providers (PR [#224](https://github.com/MindWorkAI/AI-Studio/pull/224))~~ - [x] ~~App: Implement an [ERI](https://github.com/MindWorkAI/ERI) server coding assistant (PR [#231](https://github.com/MindWorkAI/AI-Studio/pull/231))~~ - - [ ] App: Management of data sources (local & external data via [ERI](https://github.com/MindWorkAI/ERI)) + - [x] ~~App: Management of data sources (local & external data via [ERI](https://github.com/MindWorkAI/ERI)) (PR [#259](https://github.com/MindWorkAI/AI-Studio/pull/259), [#273](https://github.com/MindWorkAI/AI-Studio/pull/273))~~ - [ ] Runtime: Extract data from txt / md / pdf / docx / xlsx files - [ ] (*Optional*) Runtime: Implement internal embedding provider through [fastembed-rs](https://github.com/Anush008/fastembed-rs) - [ ] App: Implement external embedding providers - [ ] App: Implement the process to vectorize one local file using embeddings - [ ] Runtime: Integration of the vector database [LanceDB](https://github.com/lancedb/lancedb) - [ ] App: Implement the continuous process of vectorizing data - - [ ] App: Define a common retrieval context interface for the integration of RAG processes in chats - - [ ] App: Define a common augmentation interface for the integration of RAG processes in chats - - [ ] App: Integrate data sources in chats + - [x] ~~App: Define a common retrieval context interface for the integration of RAG processes in chats (PR [#281](https://github.com/MindWorkAI/AI-Studio/pull/281), [#284](https://github.com/MindWorkAI/AI-Studio/pull/284), [#286](https://github.com/MindWorkAI/AI-Studio/pull/286), [#287](https://github.com/MindWorkAI/AI-Studio/pull/287))~~ + - [x] ~~App: Define a common augmentation interface for the integration of RAG processes in chats (PR [#288](https://github.com/MindWorkAI/AI-Studio/pull/288), [#289](https://github.com/MindWorkAI/AI-Studio/pull/289))~~ + - [x] ~~App: Integrate data sources in chats (PR [#282](https://github.com/MindWorkAI/AI-Studio/pull/282))~~ - Since September 2024: Experiments have been started on how we can work on long texts with AI Studio. Let's say you want to write a fantasy novel or create a complex project proposal and use LLM for support. The initial experiments were promising, but not yet satisfactory. We are testing further approaches until a satisfactory solution is found. The current state of our experiment is available as an experimental preview feature through your app configuration. Related PR: ~~[#167](https://github.com/MindWorkAI/AI-Studio/pull/167), [#226](https://github.com/MindWorkAI/AI-Studio/pull/226)~~. @@ -49,14 +50,17 @@ Features we have recently released: ![MindWork AI Studio - Home](documentation/AI%20Studio%20Home.png) ![MindWork AI Studio - Assistants](documentation/AI%20Studio%20Assistants.png) -MindWork AI Studio is a desktop application available for macOS, Windows, and Linux. It provides a unified chat interface for Large Language Models (LLMs). You bring your own API key for the respective LLM provider to use the models. The API keys are securely stored by the operating system. +MindWork AI Studio is a free desktop app for macOS, Windows, and Linux. It provides a unified user interface for interaction with Large Language Models (LLM). AI Studio also offers so-called assistants, where prompting is not necessary. You can think of AI Studio like an email program: you bring your own API key for the LLM of your choice and can then use these AI systems with AI Studio. Whether you want to use Google Gemini, OpenAI o1, or even your own local AI models. + +**Ready to get started 🤩?** [Download the appropriate setup for your operating system here](documentation/Setup.md). **Key advantages:** - **Free of charge**: The app is free to use, both for personal and commercial purposes. -- **Independence**: You are not tied to any single provider. Instead, you can choose the provider that best suits their needs. Right now, we support OpenAI (GPT4o etc.), Mistral, Anthropic (Claude), Google Gemini, xAI (Grok), and self-hosted models using [llama.cpp](https://github.com/ggerganov/llama.cpp), [ollama](https://github.com/ollama/ollama), [LM Studio](https://lmstudio.ai/), [Groq](https://groq.com/), or [Fireworks](https://fireworks.ai/). +- **Independence**: You are not tied to any single provider. Instead, you can choose the provider that best suits their needs. Right now, we support OpenAI (GPT4o, o1, etc.), Mistral, Anthropic (Claude), Google Gemini, xAI (Grok), DeepSeek, and self-hosted models using [llama.cpp](https://github.com/ggerganov/llama.cpp), [ollama](https://github.com/ollama/ollama), [LM Studio](https://lmstudio.ai/), [Groq](https://groq.com/), or [Fireworks](https://fireworks.ai/). For scientists and employees of research institutions, we also support [Helmholtz](https://helmholtz.cloud/services/?serviceID=d7d5c597-a2f6-4bd1-b71e-4d6499d98570) and [GWDG](https://gwdg.de/services/application-services/ai-services/) AI services. These are available through federated logins like eduGAIN to all 18 Helmholtz Centers, the Max Planck Society, most German, and many international universities. +- **Assistants**: You just want to quickly translate a text? AI Studio has so-called assistants for such and other tasks. No prompting is necessary when working with these assistants. - **Unrestricted usage**: Unlike services like ChatGPT, which impose limits after intensive use, MindWork AI Studio offers unlimited usage through the providers API. - **Cost-effective**: You only pay for what you use, which can be cheaper than monthly subscription services like ChatGPT Plus, especially if used infrequently. But beware, here be dragons: For extremely intensive usage, the API costs can be significantly higher. Unfortunately, providers currently do not offer a way to display current costs in the app. Therefore, check your account with the respective provider to see how your costs are developing. When available, use prepaid and set a cost limit. -- **Privacy**: The data entered into the app is not used for training by the providers since we are using the provider's API. +- **Privacy**: You can control which providers receive your data using the provider confidence settings. For example, you can set different protection levels for writing emails compared to general chats, etc. Additionally, most providers guarantee that they won't use your data to train new AI systems. - **Flexibility**: Choose the provider and model best suited for your current task. - **No bloatware**: The app requires minimal storage for installation and operates with low memory usage. Additionally, it has a minimal impact on system resources, which is beneficial for battery life. @@ -78,12 +82,15 @@ Your support, whether big or small, keeps the wheels turning and is deeply appre ## Planned Features Here's an exciting look at some of the features we're planning to add to AI Studio in future releases: -- **Integrating your data**: You should be able to integrate your data into AI Studio. For example, your PDF or Office files, or your Markdown notes. -- **Integration of enterprise data:** Soon, it will also be possible to integrate data from the corporate network using an interface that we have specified ([External Retrieval Interface](https://github.com/MindWorkAI/ERI), ERI for short). -- **Writing mode:** We want to integrate a writing mode that should support you in creating extensive works. We are thinking of comprehensive project proposals, tenders, or your next fantasy novel. -- **Browser usage:** We're trying to offer the features from AI Studio to you in the browser via a plugin, so we could use spell-checking or rewriting text directly in the browser. -- **Voice control:** You should be able to interact with the AI systems using your voice as well. To achieve this, we want to integrate voice input (speech-to-text) and output (text-to-speech). However, later on, it should also have a natural conversation flow, i.e., seamless conversation. -- **Email monitoring:** You should have the option to connect your email inboxes with AI Studio. The AI reads your emails and sends you a notification when something important happens. At the same time, you can access knowledge from your emails in your chats. +- **Integrating your data**: You'll be able to integrate your data into AI Studio, like your PDF or Office files, or your Markdown notes. +- **Integration of enterprise data:** It will soon be possible to integrate data from the corporate network using a specified interface ([External Retrieval Interface](https://github.com/MindWorkAI/ERI), ERI for short). This will likely require development work by the organization in question. +- **Useful assistants:** We'll develop more assistants for everyday tasks. +- **Writing mode:** We're integrating a writing mode to help you create extensive works, like comprehensive project proposals, tenders, or your next fantasy novel. +- **Specific requirements:** Want an assistant that suits your specific needs? We aim to offer a plugin architecture so organizations and enthusiasts can implement such ideas. +- **Voice control:** You'll interact with the AI systems using your voice. To achieve this, we want to integrate voice input (speech-to-text) and output (text-to-speech). However, later on, it should also have a natural conversation flow, i.e., seamless conversation. +- **Content creation:** There will be an interface for AI Studio to create content in other apps. You could, for example, create blog posts directly on the target platform or add entries to an internal knowledge management tool. This requires development work by the tool developers. +- **Email monitoring:** You can connect your email inboxes with AI Studio. The AI will read your emails and notify you of important events. You'll also be able to access knowledge from your emails in your chats. +- **Browser usage:** We're working on offering AI Studio features in your browser via a plugin, allowing, e.g., for spell-checking or text rewriting directly in the browser. Stay tuned for more updates and enhancements to make MindWork AI Studio even more powerful and versatile 🤩. diff --git a/app/MindWork AI Studio.sln b/app/MindWork AI Studio.sln index 696edae2..37871ac7 100644 --- a/app/MindWork AI Studio.sln +++ b/app/MindWork AI Studio.sln @@ -2,6 +2,8 @@ Microsoft Visual Studio Solution File, Format Version 12.00 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MindWork AI Studio", "MindWork AI Studio\MindWork AI Studio.csproj", "{059FDFCC-7D0B-474E-9F20-B9C437DF1CDD}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SourceCodeRules", "SourceCodeRules\SourceCodeRules\SourceCodeRules.csproj", "{0976C1CB-D499-4C86-8ADA-B7A7A4DE0BF8}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -12,5 +14,11 @@ Global {059FDFCC-7D0B-474E-9F20-B9C437DF1CDD}.Debug|Any CPU.Build.0 = Debug|Any CPU {059FDFCC-7D0B-474E-9F20-B9C437DF1CDD}.Release|Any CPU.ActiveCfg = Release|Any CPU {059FDFCC-7D0B-474E-9F20-B9C437DF1CDD}.Release|Any CPU.Build.0 = Release|Any CPU + {0976C1CB-D499-4C86-8ADA-B7A7A4DE0BF8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0976C1CB-D499-4C86-8ADA-B7A7A4DE0BF8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0976C1CB-D499-4C86-8ADA-B7A7A4DE0BF8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0976C1CB-D499-4C86-8ADA-B7A7A4DE0BF8}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(NestedProjects) = preSolution EndGlobalSection EndGlobal diff --git a/app/MindWork AI Studio.sln.DotSettings b/app/MindWork AI Studio.sln.DotSettings index c9d147b2..44079898 100644 --- a/app/MindWork AI Studio.sln.DotSettings +++ b/app/MindWork AI Studio.sln.DotSettings @@ -2,9 +2,15 @@ AI EDI ERI + GWDG LLM LM MSG + RAG + UI + True True + True + True True True \ No newline at end of file diff --git a/app/MindWork AI Studio/Agents/AgentBase.cs b/app/MindWork AI Studio/Agents/AgentBase.cs index 8028a864..66f13146 100644 --- a/app/MindWork AI Studio/Agents/AgentBase.cs +++ b/app/MindWork AI Studio/Agents/AgentBase.cs @@ -1,19 +1,37 @@ +using System.Text.Json; + using AIStudio.Chat; using AIStudio.Provider; using AIStudio.Settings; +using AIStudio.Tools.Services; // ReSharper disable MemberCanBePrivate.Global namespace AIStudio.Agents; -public abstract class AgentBase(ILogger logger, SettingsManager settingsManager, ThreadSafeRandom rng) : IAgent +public abstract class AgentBase(ILogger logger, SettingsManager settingsManager, DataSourceService dataSourceService, ThreadSafeRandom rng) : IAgent { + protected static readonly ContentBlock EMPTY_BLOCK = new() + { + Content = null, + ContentType = ContentType.NONE, + Role = ChatRole.AGENT, + Time = DateTimeOffset.UtcNow, + }; + + protected static readonly JsonSerializerOptions JSON_SERIALIZER_OPTIONS = new() + { + PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower, + }; + + protected DataSourceService DataSourceService { get; init; } = dataSourceService; + protected SettingsManager SettingsManager { get; init; } = settingsManager; protected ThreadSafeRandom RNG { get; init; } = rng; protected ILogger Logger { get; init; } = logger; - + /// /// Represents the type or category of this agent. /// @@ -60,24 +78,30 @@ public abstract class AgentBase(ILogger logger, SettingsManager setti Blocks = [], }; - protected DateTimeOffset AddUserRequest(ChatThread thread, string request) + protected UserRequest AddUserRequest(ChatThread thread, string request) { var time = DateTimeOffset.Now; + var lastUserPrompt = new ContentText + { + Text = request, + }; + thread.Blocks.Add(new ContentBlock { Time = time, ContentType = ContentType.TEXT, Role = ChatRole.USER, - Content = new ContentText - { - Text = request, - }, + Content = lastUserPrompt, }); - - return time; + + return new() + { + Time = time, + UserPrompt = lastUserPrompt, + }; } - protected async Task AddAIResponseAsync(ChatThread thread, DateTimeOffset time) + protected async Task AddAIResponseAsync(ChatThread thread, IContent lastUserPrompt, DateTimeOffset time) { if(this.ProviderSettings is null) return; @@ -103,6 +127,6 @@ public abstract class AgentBase(ILogger logger, SettingsManager setti // Use the selected provider to get the AI response. // By awaiting this line, we wait for the entire // content to be streamed. - await aiText.CreateFromProviderAsync(providerSettings.CreateProvider(this.Logger), this.SettingsManager, providerSettings.Model, thread); + await aiText.CreateFromProviderAsync(providerSettings.CreateProvider(this.Logger), providerSettings.Model, lastUserPrompt, thread); } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Agents/AgentDataSourceSelection.cs b/app/MindWork AI Studio/Agents/AgentDataSourceSelection.cs new file mode 100644 index 00000000..6fe1f4e2 --- /dev/null +++ b/app/MindWork AI Studio/Agents/AgentDataSourceSelection.cs @@ -0,0 +1,378 @@ +using System.Text; +using System.Text.Json; + +using AIStudio.Chat; +using AIStudio.Provider; +using AIStudio.Settings; +using AIStudio.Settings.DataModel; +using AIStudio.Tools.ERIClient; +using AIStudio.Tools.Services; + +namespace AIStudio.Agents; + +public sealed class AgentDataSourceSelection (ILogger logger, ILogger baseLogger, SettingsManager settingsManager, DataSourceService dataSourceService, ThreadSafeRandom rng) : AgentBase(baseLogger, settingsManager, dataSourceService, rng) +{ + private readonly List answers = new(); + + #region Overrides of AgentBase + + /// + protected override Type Type => Type.SYSTEM; + + /// + public override string Id => "Data Source Selection"; + + /// + protected override string JobDescription => + """ + You receive a system and a user prompt, as well as a list of possible data sources as input. + Your task is to select the appropriate data sources for the given task. You may choose none, + one, or multiple sources, depending on what best fits the system and user prompt. You need + to estimate and assess which source, based on its description, might be helpful in + processing the prompts. + + Your response is a JSON list in the following format: + + ``` + [ + {"id": "The data source ID", "reason": "Why did you choose this source?", "confidence": 0.87}, + {"id": "The data source ID", "reason": "Why did you choose this source?", "confidence": 0.54} + ] + ``` + + You express your confidence as a floating-point number between 0.0 (maximum uncertainty) and + 1.0 (you are absolutely certain that this source is needed). + + The JSON schema is: + + ``` + { + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "array", + "items": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "confidence": { + "type": "number" + } + }, + "required": [ + "id", + "reason", + "confidence" + ] + } + ] + } + ``` + + When no data source is needed, you return an empty JSON list `[]`. You do not ask any + follow-up questions. You do not address the user. Your response consists solely of + the JSON list. + """; + + /// + protected override string SystemPrompt(string availableDataSources) => $""" + {this.JobDescription} + + {availableDataSources} + """; + + /// + public override Settings.Provider? ProviderSettings { get; set; } + + /// + /// The data source selection agent does not work with context. Use + /// the process input method instead. + /// + /// The chat thread without any changes. + public override Task ProcessContext(ChatThread chatThread, IDictionary additionalData) => Task.FromResult(chatThread); + + /// + public override async Task ProcessInput(ContentBlock input, IDictionary additionalData) + { + if (input.Content is not ContentText text) + return EMPTY_BLOCK; + + if(text.InitialRemoteWait || text.IsStreaming) + return EMPTY_BLOCK; + + if(string.IsNullOrWhiteSpace(text.Text)) + return EMPTY_BLOCK; + + if(!additionalData.TryGetValue("availableDataSources", out var availableDataSources) || string.IsNullOrWhiteSpace(availableDataSources)) + return EMPTY_BLOCK; + + var thread = this.CreateChatThread(this.SystemPrompt(availableDataSources)); + var userRequest = this.AddUserRequest(thread, text.Text); + await this.AddAIResponseAsync(thread, userRequest.UserPrompt, userRequest.Time); + + var answer = thread.Blocks[^1]; + + this.answers.Add(answer); + return answer; + } + + // + public override Task MadeDecision(ContentBlock input) => Task.FromResult(true); + + // + public override IReadOnlyCollection GetContext() => []; + + // + public override IReadOnlyCollection GetAnswers() => this.answers; + + #endregion + + public async Task> PerformSelectionAsync(IProvider provider, IContent lastPrompt, ChatThread chatThread, AllowedSelectedDataSources dataSources, CancellationToken token = default) + { + logger.LogInformation("The AI should select the appropriate data sources."); + + // + // 1. Which LLM provider should the agent use? + // + + // We start with the provider currently selected by the user: + var agentProvider = this.SettingsManager.GetPreselectedProvider(Tools.Components.AGENT_DATA_SOURCE_SELECTION, provider.Id, true); + + // Assign the provider settings to the agent: + logger.LogInformation($"The agent for the data source selection uses the provider '{agentProvider.InstanceName}' ({agentProvider.UsedLLMProvider.ToName()}, confidence={agentProvider.UsedLLMProvider.GetConfidence(this.SettingsManager).Level.GetName()})."); + this.ProviderSettings = agentProvider; + + // + // 2. Prepare the current system and user prompts as input for the agent: + // + var lastPromptContent = lastPrompt switch + { + ContentText text => text.Text, + + // Image prompts may be empty, e.g., when the image is too large: + ContentImage image => await image.AsBase64(token), + + // Other content types are not supported yet: + _ => string.Empty, + }; + + if (string.IsNullOrWhiteSpace(lastPromptContent)) + { + logger.LogWarning("The last prompt is empty. The AI cannot select data sources."); + return []; + } + + // + // 3. Prepare the allowed data sources as input for the agent: + // + var additionalData = new Dictionary(); + logger.LogInformation("Preparing the list of allowed data sources for the agent to choose from."); + + // Notice: We do not dispose the Rust service here. The Rust service is a singleton + // and will be disposed when the application shuts down: + var rustService = Program.SERVICE_PROVIDER.GetService()!; + + var sb = new StringBuilder(); + sb.AppendLine("The following data sources are available for selection:"); + foreach (var ds in dataSources.AllowedDataSources) + { + switch (ds) + { + case DataSourceLocalDirectory localDirectory: + sb.AppendLine($"- Id={ds.Id}, name='{localDirectory.Name}', type=local directory, path='{localDirectory.Path}'"); + break; + + case DataSourceLocalFile localFile: + sb.AppendLine($"- Id={ds.Id}, name='{localFile.Name}', type=local file, path='{localFile.FilePath}'"); + break; + + case IERIDataSource eriDataSource: + var eriServerDescription = string.Empty; + + try + { + // + // Call the ERI server to get the server description: + // + using var eriClient = ERIClientFactory.Get(eriDataSource.Version, eriDataSource)!; + var authResponse = await eriClient.AuthenticateAsync(rustService, cancellationToken: token); + if (authResponse.Successful) + { + var serverDescriptionResponse = await eriClient.GetDataSourceInfoAsync(token); + if (serverDescriptionResponse.Successful) + { + eriServerDescription = serverDescriptionResponse.Data.Description; + + // Remove all line breaks from the description: + eriServerDescription = eriServerDescription.Replace("\n", " ").Replace("\r", " "); + } + else + logger.LogWarning($"Was not able to retrieve the server description from the ERI data source '{eriDataSource.Name}'. Message: {serverDescriptionResponse.Message}"); + } + else + logger.LogWarning($"Was not able to authenticate with the ERI data source '{eriDataSource.Name}'. Message: {authResponse.Message}"); + } + catch (Exception e) + { + logger.LogWarning($"The ERI data source '{eriDataSource.Name}' is not available. Thus, we cannot retrieve the server description. Error: {e.Message}"); + } + + // + // Append the ERI data source to the list. Use the server description if available: + // + if (string.IsNullOrWhiteSpace(eriServerDescription)) + sb.AppendLine($"- Id={ds.Id}, name='{eriDataSource.Name}', type=external data source"); + else + sb.AppendLine($"- Id={ds.Id}, name='{eriDataSource.Name}', type=external data source, description='{eriServerDescription}'"); + + break; + } + } + + logger.LogInformation("Prepared the list of allowed data sources for the agent."); + additionalData.Add("availableDataSources", sb.ToString()); + + // + // 4. Let the agent select the data sources: + // + var prompt = $""" + The system prompt is: + + ``` + {chatThread.SystemPrompt} + ``` + + The user prompt is: + + ``` + {lastPromptContent} + ``` + """; + + // Call the agent: + var aiResponse = await this.ProcessInput(new ContentBlock + { + Time = DateTimeOffset.UtcNow, + ContentType = ContentType.TEXT, + Role = ChatRole.USER, + Content = new ContentText + { + Text = prompt, + }, + }, additionalData); + + if(aiResponse.Content is null) + { + logger.LogWarning("The agent did not return a response."); + return []; + } + + switch (aiResponse) + { + + // + // 5. Parse the agent response: + // + case { ContentType: ContentType.TEXT, Content: ContentText textContent }: + { + // + // What we expect is a JSON list of SelectedDataSource objects: + // + var selectedDataSourcesJson = textContent.Text; + + // + // We know how bad LLM may be in generating JSON without surrounding text. + // Thus, we expect the worst and try to extract the JSON list from the text: + // + var json = ExtractJson(selectedDataSourcesJson); + + try + { + var aiSelectedDataSources = JsonSerializer.Deserialize>(json, JSON_SERIALIZER_OPTIONS); + return aiSelectedDataSources ?? []; + } + catch + { + logger.LogWarning("The agent answered with an invalid or unexpected JSON format."); + return []; + } + } + + case { ContentType: ContentType.TEXT }: + logger.LogWarning("The agent answered with an unexpected inner content type."); + return []; + + case { ContentType: ContentType.NONE }: + logger.LogWarning("The agent did not return a response."); + return []; + + default: + logger.LogWarning($"The agent answered with an unexpected content type '{aiResponse.ContentType}'."); + return []; + } + } + + /// + /// Extracts the JSON list from the given text. The text may contain additional + /// information around the JSON list. The method tries to extract the JSON list + /// from the text. + /// + /// + /// Algorithm: The method searches for the first line that contains only a '[' character. + /// Then, it searches for the first line that contains only a ']' character. The method + /// returns the text between these two lines (including the brackets). When the method + /// cannot find the JSON list, it returns an empty string. + /// + /// The text that may contain the JSON list. + /// The extracted JSON list. + private static ReadOnlySpan ExtractJson(ReadOnlySpan text) + { + var startIndex = -1; + var endIndex = -1; + var foundStart = false; + var foundEnd = false; + var lineStart = 0; + + for (var i = 0; i <= text.Length; i++) + { + // Handle the end of the line or the end of the text: + if (i == text.Length || text[i] == '\n') + { + if (IsCharacterAloneInLine(text, lineStart, i, '[') && !foundStart) + { + startIndex = lineStart; + foundStart = true; + } + else if (IsCharacterAloneInLine(text, lineStart, i, ']') && foundStart && !foundEnd) + { + endIndex = i; + foundEnd = true; + break; + } + + lineStart = i + 1; + } + } + + if (foundStart && foundEnd) + { + // Adjust endIndex for slicing, ensuring it's within bounds: + return text.Slice(startIndex, Math.Min(text.Length, endIndex + 1) - startIndex); + } + + return ReadOnlySpan.Empty; + } + + private static bool IsCharacterAloneInLine(ReadOnlySpan text, int lineStart, int lineEnd, char character) + { + for (var i = lineStart; i < lineEnd; i++) + if (!char.IsWhiteSpace(text[i]) && text[i] != character) + return false; + + return true; + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Agents/AgentRetrievalContextValidation.cs b/app/MindWork AI Studio/Agents/AgentRetrievalContextValidation.cs new file mode 100644 index 00000000..9a4fdff5 --- /dev/null +++ b/app/MindWork AI Studio/Agents/AgentRetrievalContextValidation.cs @@ -0,0 +1,385 @@ +using System.Text.Json; + +using AIStudio.Chat; +using AIStudio.Provider; +using AIStudio.Settings; +using AIStudio.Tools.RAG; +using AIStudio.Tools.Services; + +namespace AIStudio.Agents; + +public sealed class AgentRetrievalContextValidation (ILogger logger, ILogger baseLogger, SettingsManager settingsManager, DataSourceService dataSourceService, ThreadSafeRandom rng) : AgentBase(baseLogger, settingsManager, dataSourceService, rng) +{ + #region Overrides of AgentBase + + /// + protected override Type Type => Type.WORKER; + + /// + public override string Id => "Retrieval Context Validation"; + + /// + protected override string JobDescription => + """ + You receive a system and user prompt as well as a retrieval context as input. Your task is to decide whether this + retrieval context is helpful in processing the prompts or not. You respond with the decision (true or false), + your reasoning, and your confidence in this decision. + + Your response is only one JSON object in the following format: + + ``` + {"decision": true, "reason": "Why did you choose this source?", "confidence": 0.87} + ``` + + You express your confidence as a floating-point number between 0.0 (maximum uncertainty) and + 1.0 (you are absolutely certain that this retrieval context is needed). + + The JSON schema is: + + ``` + { + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "properties": { + "decision": { + "type": "boolean" + }, + "reason": { + "type": "string" + }, + "confidence": { + "type": "number" + } + }, + "required": [ + "decision", + "reason", + "confidence" + ] + } + ``` + + You do not ask any follow-up questions. You do not address the user. Your response consists solely of + that one JSON object. + """; + + /// + protected override string SystemPrompt(string retrievalContext) => $""" + {this.JobDescription} + + {retrievalContext} + """; + + /// + public override Settings.Provider? ProviderSettings { get; set; } + + /// + /// The retrieval context validation agent does not work with context. Use + /// the process input method instead. + /// + /// The chat thread without any changes. + public override Task ProcessContext(ChatThread chatThread, IDictionary additionalData) => Task.FromResult(chatThread); + + /// + public override async Task ProcessInput(ContentBlock input, IDictionary additionalData) + { + if (input.Content is not ContentText text) + return EMPTY_BLOCK; + + if(text.InitialRemoteWait || text.IsStreaming) + return EMPTY_BLOCK; + + if(string.IsNullOrWhiteSpace(text.Text)) + return EMPTY_BLOCK; + + if(!additionalData.TryGetValue("retrievalContext", out var retrievalContext) || string.IsNullOrWhiteSpace(retrievalContext)) + return EMPTY_BLOCK; + + var thread = this.CreateChatThread(this.SystemPrompt(retrievalContext)); + var userRequest = this.AddUserRequest(thread, text.Text); + await this.AddAIResponseAsync(thread, userRequest.UserPrompt, userRequest.Time); + + return thread.Blocks[^1]; + } + + /// + public override Task MadeDecision(ContentBlock input) => Task.FromResult(true); + + /// + /// We do not provide any context. This agent will process many retrieval contexts. + /// This would block a huge amount of memory. + /// + /// An empty list. + public override IReadOnlyCollection GetContext() => []; + + /// + /// We do not provide any answers. This agent will process many retrieval contexts. + /// This would block a huge amount of memory. + /// + /// An empty list. + public override IReadOnlyCollection GetAnswers() => []; + + #endregion + + /// + /// Sets the LLM provider for the agent. + /// + /// + /// When you have to call the validation in parallel for many retrieval contexts, + /// you can set the provider once and then call the validation method in parallel. + /// + /// The current LLM provider. When the user doesn't preselect an agent provider, the agent uses this provider. + public void SetLLMProvider(IProvider provider) + { + // We start with the provider currently selected by the user: + var agentProvider = this.SettingsManager.GetPreselectedProvider(Tools.Components.AGENT_RETRIEVAL_CONTEXT_VALIDATION, provider.Id, true); + + // Assign the provider settings to the agent: + logger.LogInformation($"The agent for the retrieval context validation uses the provider '{agentProvider.InstanceName}' ({agentProvider.UsedLLMProvider.ToName()}, confidence={agentProvider.UsedLLMProvider.GetConfidence(this.SettingsManager).Level.GetName()})."); + this.ProviderSettings = agentProvider; + } + + /// + /// Validate all retrieval contexts against the last user and the system prompt. + /// + /// The last user prompt. + /// The chat thread. + /// All retrieval contexts to validate. + /// The cancellation token. + /// The validation results. + public async Task> ValidateRetrievalContextsAsync(IContent lastPrompt, ChatThread chatThread, IReadOnlyList retrievalContexts, CancellationToken token = default) + { + // Check if the retrieval context validation is enabled: + if (!this.SettingsManager.ConfigurationData.AgentRetrievalContextValidation.EnableRetrievalContextValidation) + return []; + + logger.LogInformation($"Validating {retrievalContexts.Count:###,###,###,###} retrieval contexts."); + + // Prepare the list of validation tasks: + var validationTasks = new List>(retrievalContexts.Count); + + // Read the number of parallel validations: + var numParallelValidations = 3; + if(this.SettingsManager.ConfigurationData.AgentRetrievalContextValidation.PreselectAgentOptions) + numParallelValidations = this.SettingsManager.ConfigurationData.AgentRetrievalContextValidation.NumParallelValidations; + + numParallelValidations = Math.Max(1, numParallelValidations); + + // Use a semaphore to limit the number of parallel validations: + using var semaphore = new SemaphoreSlim(numParallelValidations); + foreach (var retrievalContext in retrievalContexts) + { + // Wait for an available slot in the semaphore: + await semaphore.WaitAsync(token); + + // Start the next validation task: + validationTasks.Add(this.ValidateRetrievalContextAsync(lastPrompt, chatThread, retrievalContext, token, semaphore)); + } + + // Wait for all validation tasks to complete: + return await Task.WhenAll(validationTasks); + } + + /// + /// Validates the retrieval context against the last user and the system prompt. + /// + /// + /// Probably, you have a lot of retrieval contexts to validate. In this case, you + /// can call this method in parallel for each retrieval context. You might use + /// the ValidateRetrievalContextsAsync method to validate all retrieval contexts. + /// + /// The last user prompt. + /// The chat thread. + /// The retrieval context to validate. + /// The cancellation token. + /// The optional semaphore to limit the number of parallel validations. + /// The validation result. + public async Task ValidateRetrievalContextAsync(IContent lastPrompt, ChatThread chatThread, IRetrievalContext retrievalContext, CancellationToken token = default, SemaphoreSlim? semaphore = null) + { + try + { + // + // Check if the validation was canceled. This could happen when the user + // canceled the validation process or when the validation process took + // too long: + // + if(token.IsCancellationRequested) + return new(false, "The validation was canceled.", 1.0f, retrievalContext); + + // + // 1. Prepare the current system and user prompts as input for the agent: + // + var lastPromptContent = lastPrompt switch + { + ContentText text => text.Text, + + // Image prompts may be empty, e.g., when the image is too large: + ContentImage image => await image.AsBase64(token), + + // Other content types are not supported yet: + _ => string.Empty, + }; + + if (string.IsNullOrWhiteSpace(lastPromptContent)) + { + logger.LogWarning("The last prompt is empty. The AI cannot validate the retrieval context."); + return new(false, "The last prompt was empty.", 1.0f, retrievalContext); + } + + // + // 2. Prepare the retrieval context for the agent: + // + var additionalData = new Dictionary(); + var markdownRetrievalContext = await retrievalContext.AsMarkdown(token: token); + additionalData.Add("retrievalContext", markdownRetrievalContext); + + // + // 3. Let the agent validate the retrieval context: + // + var prompt = $""" + The system prompt is: + + ``` + {chatThread.SystemPrompt} + ``` + + The user prompt is: + + ``` + {lastPromptContent} + ``` + """; + + // Call the agent: + var aiResponse = await this.ProcessInput(new ContentBlock + { + Time = DateTimeOffset.UtcNow, + ContentType = ContentType.TEXT, + Role = ChatRole.USER, + Content = new ContentText + { + Text = prompt, + }, + }, additionalData); + + if (aiResponse.Content is null) + { + logger.LogWarning("The agent did not return a response."); + return new(false, "The agent did not return a response.", 1.0f, retrievalContext); + } + + switch (aiResponse) + { + + // + // 4. Parse the agent response: + // + case { ContentType: ContentType.TEXT, Content: ContentText textContent }: + { + // + // What we expect is one JSON object: + // + var validationJson = textContent.Text; + + // + // We know how bad LLM may be in generating JSON without surrounding text. + // Thus, we expect the worst and try to extract the JSON list from the text: + // + var json = ExtractJson(validationJson); + + try + { + var result = JsonSerializer.Deserialize(json, JSON_SERIALIZER_OPTIONS); + return result with { RetrievalContext = retrievalContext }; + } + catch + { + logger.LogWarning("The agent answered with an invalid or unexpected JSON format."); + return new(false, "The agent answered with an invalid or unexpected JSON format.", 1.0f, retrievalContext); + } + } + + case { ContentType: ContentType.TEXT }: + logger.LogWarning("The agent answered with an unexpected inner content type."); + return new(false, "The agent answered with an unexpected inner content type.", 1.0f, retrievalContext); + + case { ContentType: ContentType.NONE }: + logger.LogWarning("The agent did not return a response."); + return new(false, "The agent did not return a response.", 1.0f, retrievalContext); + + default: + logger.LogWarning($"The agent answered with an unexpected content type '{aiResponse.ContentType}'."); + return new(false, $"The agent answered with an unexpected content type '{aiResponse.ContentType}'.", 1.0f, retrievalContext); + } + } + finally + { + // Release the semaphore slot: + semaphore?.Release(); + } + } + + private static ReadOnlySpan ExtractJson(ReadOnlySpan input) + { + // + // 1. Expect the best case ;-) + // + if (CheckJsonObjectStart(input)) + return ExtractJsonPart(input); + + // + // 2. Okay, we have some garbage before the + // JSON object. We expected that... + // + for (var index = 0; index < input.Length; index++) + { + if (input[index] is '{' && CheckJsonObjectStart(input[index..])) + return ExtractJsonPart(input[index..]); + } + + return []; + } + + private static bool CheckJsonObjectStart(ReadOnlySpan area) + { + char[] expectedSymbols = ['{', '"', 'd']; + var symbolIndex = 0; + + foreach (var c in area) + { + if (symbolIndex >= expectedSymbols.Length) + return true; + + if (char.IsWhiteSpace(c)) + continue; + + if (c == expectedSymbols[symbolIndex++]) + continue; + + return false; + } + + return true; + } + + private static ReadOnlySpan ExtractJsonPart(ReadOnlySpan input) + { + var insideString = false; + for (var index = 0; index < input.Length; index++) + { + if (input[index] is '"') + { + insideString = !insideString; + continue; + } + + if (insideString) + continue; + + if (input[index] is '}') + return input[..++index]; + } + + return []; + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Agents/AgentTextContentCleaner.cs b/app/MindWork AI Studio/Agents/AgentTextContentCleaner.cs index e8d19aa8..2c541ddb 100644 --- a/app/MindWork AI Studio/Agents/AgentTextContentCleaner.cs +++ b/app/MindWork AI Studio/Agents/AgentTextContentCleaner.cs @@ -1,18 +1,11 @@ using AIStudio.Chat; using AIStudio.Settings; +using AIStudio.Tools.Services; namespace AIStudio.Agents; -public sealed class AgentTextContentCleaner(ILogger logger, SettingsManager settingsManager, ThreadSafeRandom rng) : AgentBase(logger, settingsManager, rng) +public sealed class AgentTextContentCleaner(ILogger logger, SettingsManager settingsManager, DataSourceService dataSourceService, ThreadSafeRandom rng) : AgentBase(logger, settingsManager, dataSourceService, rng) { - private static readonly ContentBlock EMPTY_BLOCK = new() - { - Content = null, - ContentType = ContentType.NONE, - Role = ChatRole.AGENT, - Time = DateTimeOffset.UtcNow, - }; - private readonly List context = new(); private readonly List answers = new(); @@ -72,8 +65,8 @@ public sealed class AgentTextContentCleaner(ILogger logger, SettingsM return EMPTY_BLOCK; var thread = this.CreateChatThread(this.SystemPrompt(sourceURL)); - var time = this.AddUserRequest(thread, text.Text); - await this.AddAIResponseAsync(thread, time); + var userRequest = this.AddUserRequest(thread, text.Text); + await this.AddAIResponseAsync(thread, userRequest.UserPrompt, userRequest.Time); var answer = thread.Blocks[^1]; this.answers.Add(answer); diff --git a/app/MindWork AI Studio/Agents/RetrievalContextValidationResult.cs b/app/MindWork AI Studio/Agents/RetrievalContextValidationResult.cs new file mode 100644 index 00000000..826c3430 --- /dev/null +++ b/app/MindWork AI Studio/Agents/RetrievalContextValidationResult.cs @@ -0,0 +1,12 @@ +using AIStudio.Tools.RAG; + +namespace AIStudio.Agents; + +/// +/// Represents the result of a retrieval context validation. +/// +/// Whether the retrieval context is useful or not. +/// The reason for the decision. +/// The confidence of the decision. +/// The retrieval context that was validated. +public readonly record struct RetrievalContextValidationResult(bool Decision, string Reason, float Confidence, IRetrievalContext? RetrievalContext) : IConfidence; \ No newline at end of file diff --git a/app/MindWork AI Studio/Agents/SelectedDataSource.cs b/app/MindWork AI Studio/Agents/SelectedDataSource.cs new file mode 100644 index 00000000..ca2c2a9f --- /dev/null +++ b/app/MindWork AI Studio/Agents/SelectedDataSource.cs @@ -0,0 +1,9 @@ +namespace AIStudio.Agents; + +/// +/// Represents a selected data source, chosen by the agent. +/// +/// The data source ID. +/// The reason for selecting the data source. +/// The confidence of the agent in the selection. +public readonly record struct SelectedDataSource(string Id, string Reason, float Confidence) : IConfidence; \ No newline at end of file diff --git a/app/MindWork AI Studio/Agents/UserRequest.cs b/app/MindWork AI Studio/Agents/UserRequest.cs new file mode 100644 index 00000000..216eebe4 --- /dev/null +++ b/app/MindWork AI Studio/Agents/UserRequest.cs @@ -0,0 +1,19 @@ +using AIStudio.Chat; + +namespace AIStudio.Agents; + +/// +/// The created user request. +/// +public sealed class UserRequest +{ + /// + /// The time when the request was created. + /// + public required DateTimeOffset Time { get; init; } + + /// + /// The user prompt. + /// + public required IContent UserPrompt { get; init; } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/Agenda/AssistantAgenda.razor b/app/MindWork AI Studio/Assistants/Agenda/AssistantAgenda.razor index 018800c6..f18c9ab7 100644 --- a/app/MindWork AI Studio/Assistants/Agenda/AssistantAgenda.razor +++ b/app/MindWork AI Studio/Assistants/Agenda/AssistantAgenda.razor @@ -1,5 +1,5 @@ @attribute [Route(Routes.ASSISTANT_AGENDA)] -@inherits AssistantBaseCore +@inherits AssistantBaseCore diff --git a/app/MindWork AI Studio/Assistants/Agenda/AssistantAgenda.razor.cs b/app/MindWork AI Studio/Assistants/Agenda/AssistantAgenda.razor.cs index 531c2df1..6e1c4d52 100644 --- a/app/MindWork AI Studio/Assistants/Agenda/AssistantAgenda.razor.cs +++ b/app/MindWork AI Studio/Assistants/Agenda/AssistantAgenda.razor.cs @@ -1,10 +1,11 @@ using System.Text; using AIStudio.Chat; +using AIStudio.Dialogs.Settings; namespace AIStudio.Assistants.Agenda; -public partial class AssistantAgenda : AssistantBaseCore +public partial class AssistantAgenda : AssistantBaseCore { public override Tools.Components Component => Tools.Components.AGENDA_ASSISTANT; diff --git a/app/MindWork AI Studio/Assistants/AssistantBase.razor b/app/MindWork AI Studio/Assistants/AssistantBase.razor index 5387d8ee..38d4b8b8 100644 --- a/app/MindWork AI Studio/Assistants/AssistantBase.razor +++ b/app/MindWork AI Studio/Assistants/AssistantBase.razor @@ -1,131 +1,151 @@ @using AIStudio.Chat +@inherits AssistantLowerBase +@typeparam TSettings - - @(this.Title) - +
- - - - - @this.Description - + + @(this.Title) + - @if (this.Body is not null) - { - - @this.Body - - - - @this.SubmitText - - } - - + + + + + + + @this.Description + + + + + + - @if (this.ShowDedicatedProgress && this.isProcessing) - { - - } - -
-
- -
-
- - @if (this.ShowResult && !this.ShowEntireChatThread && this.resultingContentBlock is not null) - { - - } - - @if(this.ShowResult && this.ShowEntireChatThread && this.chatThread is not null) - { - foreach (var block in this.chatThread.Blocks.OrderBy(n => n.Time)) - { - @if (!block.HideFromUser) + @if (this.Body is not null) { - - } - } - } - -
-
-
- - - - @if (!this.FooterButtons.Any(x => x.Type is ButtonTypes.SEND_TO)) - { - @if (this.ShowSendTo) - { - - @foreach (var assistant in Enum.GetValues().Where(n => n.AllowSendTo()).OrderBy(n => n.Name().Length)) - { - - @assistant.Name() - - } - - } - } - - @foreach (var button in this.FooterButtons) - { - switch (button) - { - case ButtonData buttonData when !string.IsNullOrWhiteSpace(buttonData.Tooltip): - - - @buttonData.Text - - - break; - - case ButtonData buttonData: - - @buttonData.Text + + @this.Body + + + + + @this.SubmitText - break; + @if (this.isProcessing && this.cancellationTokenSource is not null) + { + + + + } + + } + + - case SendToButton sendToButton: - + @if (this.ShowDedicatedProgress && this.isProcessing) + { + + } + +
+
+ +
+
+ + @if (this.ShowResult && !this.ShowEntireChatThread && this.resultingContentBlock is not null) + { + + } + + @if(this.ShowResult && this.ShowEntireChatThread && this.chatThread is not null) + { + foreach (var block in this.chatThread.Blocks.OrderBy(n => n.Time)) + { + @if (!block.HideFromUser) + { + + } + } + } + +
+
+
+ + + + @if (!this.FooterButtons.Any(x => x.Type is ButtonTypes.SEND_TO)) + { + @if (this.ShowSendTo) + { + @foreach (var assistant in Enum.GetValues().Where(n => n.AllowSendTo()).OrderBy(n => n.Name().Length)) { - + @assistant.Name() } - break; + } } - } - - @if (this.ShowCopyResult) - { - - Copy result - - } - @if (this.ShowReset) - { - - Reset - - } + @foreach (var button in this.FooterButtons) + { + switch (button) + { + case ButtonData buttonData when !string.IsNullOrWhiteSpace(buttonData.Tooltip): + + + @buttonData.Text + + + break; - @if (this.SettingsManager.ConfigurationData.LLMProviders.ShowProviderConfidence) - { - - } + case ButtonData buttonData: + + @buttonData.Text + + break; - @if (this.AllowProfiles && this.ShowProfileSelection) - { - - } - - -
\ No newline at end of file + case SendToButton sendToButton: + + @foreach (var assistant in Enum.GetValues().Where(n => n.AllowSendTo()).OrderBy(n => n.Name().Length)) + { + + @assistant.Name() + + } + + break; + } + } + + @if (this.ShowCopyResult) + { + + Copy result + + } + + @if (this.ShowReset) + { + + Reset + + } + + @if (this.SettingsManager.ConfigurationData.LLMProviders.ShowProviderConfidence) + { + + } + + @if (this.AllowProfiles && this.ShowProfileSelection) + { + + } + + + +
\ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/AssistantBase.razor.cs b/app/MindWork AI Studio/Assistants/AssistantBase.razor.cs index b589f8ff..1f0c7364 100644 --- a/app/MindWork AI Studio/Assistants/AssistantBase.razor.cs +++ b/app/MindWork AI Studio/Assistants/AssistantBase.razor.cs @@ -1,21 +1,26 @@ using AIStudio.Chat; using AIStudio.Provider; using AIStudio.Settings; +using AIStudio.Tools.Services; using Microsoft.AspNetCore.Components; using MudBlazor.Utilities; -using RustService = AIStudio.Tools.RustService; using Timer = System.Timers.Timer; +using DialogOptions = AIStudio.Dialogs.DialogOptions; + namespace AIStudio.Assistants; -public abstract partial class AssistantBase : ComponentBase, IMessageBusReceiver, IDisposable +public abstract partial class AssistantBase : AssistantLowerBase, IMessageBusReceiver, IDisposable where TSettings : IComponent { [Inject] protected SettingsManager SettingsManager { get; init; } = null!; + [Inject] + private IDialogService DialogService { get; init; } = null!; + [Inject] protected IJSRuntime JsRuntime { get; init; } = null!; @@ -32,7 +37,7 @@ public abstract partial class AssistantBase : ComponentBase, IMessageBusReceiver protected NavigationManager NavigationManager { get; init; } = null!; [Inject] - protected ILogger Logger { get; init; } = null!; + protected ILogger> Logger { get; init; } = null!; [Inject] private MudTheme ColorTheme { get; init; } = null!; @@ -40,10 +45,6 @@ public abstract partial class AssistantBase : ComponentBase, IMessageBusReceiver [Inject] private MessageBus MessageBus { get; init; } = null!; - internal const string RESULT_DIV_ID = "assistantResult"; - internal const string BEFORE_RESULT_DIV_ID = "beforeAssistantResult"; - internal const string AFTER_RESULT_DIV_ID = "afterAssistantResult"; - protected abstract string Title { get; } protected abstract string Description { get; } @@ -65,7 +66,7 @@ public abstract partial class AssistantBase : ComponentBase, IMessageBusReceiver protected abstract string SubmitText { get; } protected abstract Func SubmitAction { get; } - + protected virtual bool SubmitDisabled => false; private protected virtual RenderFragment? Body => null; @@ -89,17 +90,17 @@ public abstract partial class AssistantBase : ComponentBase, IMessageBusReceiver protected virtual ChatThread ConvertToChatThread => this.chatThread ?? new(); protected virtual IReadOnlyList FooterButtons => []; - - protected static readonly Dictionary USER_INPUT_ATTRIBUTES = new(); protected AIStudio.Settings.Provider providerSettings; protected MudForm? form; protected bool inputIsValid; protected Profile currentProfile = Profile.NO_PROFILE; protected ChatThread? chatThread; + protected IContent? lastUserPrompt; private readonly Timer formChangeTimer = new(TimeSpan.FromSeconds(1.6)); + private CancellationTokenSource? cancellationTokenSource; private ContentBlock? resultingContentBlock; private string[] inputIssues = []; private bool isProcessing; @@ -147,6 +148,8 @@ public abstract partial class AssistantBase : ComponentBase, IMessageBusReceiver #region Implementation of IMessageBusReceiver + public string ComponentName => nameof(AssistantBase); + public Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) { switch (triggeredEvent) @@ -240,16 +243,18 @@ public abstract partial class AssistantBase : ComponentBase, IMessageBusReceiver protected DateTimeOffset AddUserRequest(string request, bool hideContentFromUser = false) { var time = DateTimeOffset.Now; + this.lastUserPrompt = new ContentText + { + Text = request, + }; + this.chatThread!.Blocks.Add(new ContentBlock { Time = time, ContentType = ContentType.TEXT, HideFromUser = hideContentFromUser, Role = ChatRole.USER, - Content = new ContentText - { - Text = request, - }, + Content = this.lastUserPrompt, }); return time; @@ -281,12 +286,16 @@ public abstract partial class AssistantBase : ComponentBase, IMessageBusReceiver this.isProcessing = true; this.StateHasChanged(); - - // Use the selected provider to get the AI response. - // By awaiting this line, we wait for the entire - // content to be streamed. - await aiText.CreateFromProviderAsync(this.providerSettings.CreateProvider(this.Logger), this.SettingsManager, this.providerSettings.Model, this.chatThread); - + + using (this.cancellationTokenSource = new()) + { + // Use the selected provider to get the AI response. + // By awaiting this line, we wait for the entire + // content to be streamed. + this.chatThread = await aiText.CreateFromProviderAsync(this.providerSettings.CreateProvider(this.Logger), this.providerSettings.Model, this.lastUserPrompt, this.chatThread, this.cancellationTokenSource.Token); + } + + this.cancellationTokenSource = null; this.isProcessing = false; this.StateHasChanged(); @@ -294,6 +303,13 @@ public abstract partial class AssistantBase : ComponentBase, IMessageBusReceiver return aiText.Text; } + private async Task CancelStreaming() + { + if (this.cancellationTokenSource is not null) + if(!this.cancellationTokenSource.IsCancellationRequested) + await this.cancellationTokenSource.CancelAsync(); + } + protected async Task CopyToClipboard() { await this.RustService.CopyText2Clipboard(this.Snackbar, this.Result2Copy()); @@ -307,6 +323,12 @@ public abstract partial class AssistantBase : ComponentBase, IMessageBusReceiver return icon; } + protected async Task OpenSettingsDialog() + { + var dialogParameters = new DialogParameters(); + await this.DialogService.ShowAsync(null, dialogParameters, DialogOptions.FULLSCREEN); + } + protected Task SendToAssistant(Tools.Components destination, SendToButton sendToButton) { if (!destination.AllowSendTo()) diff --git a/app/MindWork AI Studio/Assistants/AssistantBaseCore.cs b/app/MindWork AI Studio/Assistants/AssistantBaseCore.cs index 96b16a1e..eccc8ce5 100644 --- a/app/MindWork AI Studio/Assistants/AssistantBaseCore.cs +++ b/app/MindWork AI Studio/Assistants/AssistantBaseCore.cs @@ -7,7 +7,7 @@ namespace AIStudio.Assistants; // See https://stackoverflow.com/a/77300384/2258393 for why this class is necessary // -public abstract class AssistantBaseCore : AssistantBase +public abstract class AssistantBaseCore : AssistantBase where TSettings : IComponent { private protected sealed override RenderFragment Body => this.BuildRenderTree; diff --git a/app/MindWork AI Studio/Assistants/AssistantLowerBase.cs b/app/MindWork AI Studio/Assistants/AssistantLowerBase.cs new file mode 100644 index 00000000..8e053015 --- /dev/null +++ b/app/MindWork AI Studio/Assistants/AssistantLowerBase.cs @@ -0,0 +1,12 @@ +using Microsoft.AspNetCore.Components; + +namespace AIStudio.Assistants; + +public abstract class AssistantLowerBase : ComponentBase +{ + protected static readonly Dictionary USER_INPUT_ATTRIBUTES = new(); + + internal const string RESULT_DIV_ID = "assistantResult"; + internal const string BEFORE_RESULT_DIV_ID = "beforeAssistantResult"; + internal const string AFTER_RESULT_DIV_ID = "afterAssistantResult"; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/BiasDay/BiasOfTheDayAssistant.razor b/app/MindWork AI Studio/Assistants/BiasDay/BiasOfTheDayAssistant.razor index f5acf481..2a5a9b19 100644 --- a/app/MindWork AI Studio/Assistants/BiasDay/BiasOfTheDayAssistant.razor +++ b/app/MindWork AI Studio/Assistants/BiasDay/BiasOfTheDayAssistant.razor @@ -1,5 +1,5 @@ @attribute [Route(Routes.ASSISTANT_BIAS)] -@inherits AssistantBaseCore +@inherits AssistantBaseCore Links: diff --git a/app/MindWork AI Studio/Assistants/BiasDay/BiasOfTheDayAssistant.razor.cs b/app/MindWork AI Studio/Assistants/BiasDay/BiasOfTheDayAssistant.razor.cs index 576e4332..94356393 100644 --- a/app/MindWork AI Studio/Assistants/BiasDay/BiasOfTheDayAssistant.razor.cs +++ b/app/MindWork AI Studio/Assistants/BiasDay/BiasOfTheDayAssistant.razor.cs @@ -1,11 +1,12 @@ using System.Text; using AIStudio.Chat; +using AIStudio.Dialogs.Settings; using AIStudio.Settings.DataModel; namespace AIStudio.Assistants.BiasDay; -public partial class BiasOfTheDayAssistant : AssistantBaseCore +public partial class BiasOfTheDayAssistant : AssistantBaseCore { public override Tools.Components Component => Tools.Components.BIAS_DAY_ASSISTANT; diff --git a/app/MindWork AI Studio/Assistants/Coding/AssistantCoding.razor b/app/MindWork AI Studio/Assistants/Coding/AssistantCoding.razor index 6af0819d..92cc8a78 100644 --- a/app/MindWork AI Studio/Assistants/Coding/AssistantCoding.razor +++ b/app/MindWork AI Studio/Assistants/Coding/AssistantCoding.razor @@ -1,5 +1,5 @@ @attribute [Route(Routes.ASSISTANT_CODING)] -@inherits AssistantBaseCore +@inherits AssistantBaseCore @for (var contextIndex = 0; contextIndex < this.codingContexts.Count; contextIndex++) diff --git a/app/MindWork AI Studio/Assistants/Coding/AssistantCoding.razor.cs b/app/MindWork AI Studio/Assistants/Coding/AssistantCoding.razor.cs index c8a61123..61e94865 100644 --- a/app/MindWork AI Studio/Assistants/Coding/AssistantCoding.razor.cs +++ b/app/MindWork AI Studio/Assistants/Coding/AssistantCoding.razor.cs @@ -1,8 +1,10 @@ using System.Text; +using AIStudio.Dialogs.Settings; + namespace AIStudio.Assistants.Coding; -public partial class AssistantCoding : AssistantBaseCore +public partial class AssistantCoding : AssistantBaseCore { public override Tools.Components Component => Tools.Components.CODING_ASSISTANT; @@ -31,7 +33,7 @@ public partial class AssistantCoding : AssistantBaseCore protected override string SubmitText => "Get Support"; protected override Func SubmitAction => this.GetSupport; - + protected override void ResetForm() { this.codingContexts.Clear(); diff --git a/app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor b/app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor index 57c57876..7a441dc0 100644 --- a/app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor +++ b/app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor @@ -1,5 +1,5 @@ @attribute [Route(Routes.ASSISTANT_EMAIL)] -@inherits AssistantBaseCore +@inherits AssistantBaseCore @if (this.provideHistory) diff --git a/app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor.cs b/app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor.cs index 4606f4b3..7a91f1c8 100644 --- a/app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor.cs +++ b/app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor.cs @@ -1,10 +1,11 @@ using System.Text; using AIStudio.Chat; +using AIStudio.Dialogs.Settings; namespace AIStudio.Assistants.EMail; -public partial class AssistantEMail : AssistantBaseCore +public partial class AssistantEMail : AssistantBaseCore { public override Tools.Components Component => Tools.Components.EMAIL_ASSISTANT; @@ -27,7 +28,7 @@ public partial class AssistantEMail : AssistantBaseCore protected override string SubmitText => "Create email"; protected override Func SubmitAction => this.CreateMail; - + protected override ChatThread ConvertToChatThread => (this.chatThread ?? new()) with { SystemPrompt = SystemPrompts.DEFAULT, diff --git a/app/MindWork AI Studio/Assistants/ERI/AllowedLLMProvidersExtensions.cs b/app/MindWork AI Studio/Assistants/ERI/AllowedLLMProvidersExtensions.cs index 130859b9..c9c6462c 100644 --- a/app/MindWork AI Studio/Assistants/ERI/AllowedLLMProvidersExtensions.cs +++ b/app/MindWork AI Studio/Assistants/ERI/AllowedLLMProvidersExtensions.cs @@ -2,15 +2,12 @@ namespace AIStudio.Assistants.ERI; public static class AllowedLLMProvidersExtensions { - public static string Description(this AllowedLLMProviders provider) + public static string Description(this AllowedLLMProviders provider) => provider switch { - return provider switch - { - AllowedLLMProviders.NONE => "Please select what kind of LLM provider are allowed for this data source", - AllowedLLMProviders.ANY => "Any LLM provider is allowed: users might choose a cloud-based or a self-hosted provider", - AllowedLLMProviders.SELF_HOSTED => "Self-hosted LLM providers are allowed: users cannot choose any cloud-based provider", - - _ => "Unknown option was selected" - }; - } + AllowedLLMProviders.NONE => "Please select what kind of LLM provider are allowed for this data source", + AllowedLLMProviders.ANY => "Any LLM provider is allowed: users might choose a cloud-based or a self-hosted provider", + AllowedLLMProviders.SELF_HOSTED => "Self-hosted LLM providers are allowed: users cannot choose any cloud-based provider", + + _ => "Unknown option was selected" + }; } \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/ERI/AssistantERI.razor b/app/MindWork AI Studio/Assistants/ERI/AssistantERI.razor index 5e008e25..86dfd241 100644 --- a/app/MindWork AI Studio/Assistants/ERI/AssistantERI.razor +++ b/app/MindWork AI Studio/Assistants/ERI/AssistantERI.razor @@ -1,14 +1,14 @@ @attribute [Route(Routes.ASSISTANT_ERI)] @using AIStudio.Settings.DataModel @using MudExtensions -@inherits AssistantBaseCore +@inherits AssistantBaseCore - + You can imagine it like this: Hypothetically, when Wikipedia implemented the ERI, it would vectorize all pages using an embedding method. All of Wikipedia’s data would remain with Wikipedia, including the vector database (decentralized approach). Then, any AI Studio user could add Wikipedia as a data source to significantly reduce the hallucination of the LLM in knowledge questions. - + Related links: @@ -25,10 +25,10 @@ ERI server presets - + Here you have the option to save different configurations for various ERI servers and switch between them. This is useful if you are responsible for multiple ERI servers. - + @if(this.SettingsManager.ConfigurationData.ERI.ERIServers.Count is 0) { @@ -52,33 +52,33 @@ else Add ERI server preset - + Delete this server preset @if(this.AreServerPresetsBlocked) { - + Hint: to allow this assistant to manage multiple presets, you must enable the preselection of values in the settings. - + } Auto save - + The ERI specification will change over time. You probably want to keep your ERI server up to date. This means you might want to regenerate the code for your ERI server. To avoid having to make all inputs each time, all your inputs and decisions can be automatically saved. Would you like this? - + @if(this.AreServerPresetsBlocked) { - + Hint: to allow this assistant to automatically save your changes, you must enable the preselection of values in the settings. - + } @@ -204,18 +204,18 @@ else Embedding settings - + You will likely use one or more embedding methods to encode the meaning of your data into a typically high-dimensional vector space. In this case, you will use a vector database to store and search these vectors (called embeddings). However, you don't have to use embedding methods. When your retrieval method works without any embedding, you can ignore this section. An example: You store files on a file server, and your retrieval method works exclusively with file names in the file system, so you don't need embeddings. - + - + You can specify more than one embedding method. This can be useful when you want to use different embeddings for different queries or data types. For example, one embedding for texts, another for images, and a third for videos, etc. - + @if (!this.IsNoneERIServerSelected) { @@ -228,18 +228,20 @@ else Name Type - Actions + Actions @context.EmbeddingName @context.EmbeddingType - - - Edit - - - Delete - + + + + Edit + + + Delete + + @@ -258,12 +260,12 @@ else Data retrieval settings - + For your ERI server, you need to retrieve data that matches a chat or prompt in some way. We call this the retrieval process. You must describe at least one such process. You may offer several retrieval processes from which users can choose. This allows you to test with beta users which process works better. Or you might generally want to give users the choice so they can select the process that best suits their circumstances. - + @if (!this.IsNoneERIServerSelected) { @@ -274,17 +276,19 @@ else Name - Actions + Actions @context.Name - - - Edit - - - Delete - + + + + Edit + + + Delete + + @@ -299,13 +303,13 @@ else Add Retrieval Process - + You can integrate additional libraries. Perhaps you want to evaluate the prompts in advance using a machine learning method or analyze them with a text mining approach? Or maybe you want to preprocess images in the prompts? For such advanced scenarios, you can specify which libraries you want to use here. It's best to describe which library you want to integrate for which purpose. This way, the LLM that writes the ERI server for you can try to use these libraries effectively. This should result in less rework being necessary. If you don't know the necessary libraries, you can instead attempt to describe the intended use. The LLM can then attempt to choose suitable libraries. However, hallucinations can occur, and fictional libraries might be selected. - + @@ -313,17 +317,17 @@ else Provider selection for generation - + The task of writing the ERI server for you is very complex. Therefore, a very powerful LLM is needed to successfully accomplish this task. Small local models will probably not be sufficient. Instead, try using a large cloud-based or a large self-hosted model. - + - + Important: The LLM may need to generate many files. This reaches the request limit of most providers. Typically, only a certain number of requests can be made per minute, and only a maximum number of tokens can be generated per minute. AI Studio automatically considers this. However, generating all the files takes a certain amount of time. Local or self-hosted models may work without these limitations and can generate responses faster. AI Studio dynamically adapts its behavior and always tries to achieve the fastest possible data processing. - + @@ -331,19 +335,19 @@ else Write code to file system - + AI Studio can save the generated code to the file system. You can select a base folder for this. AI Studio ensures that no files are created outside of this base folder. Furthermore, we recommend that you create a Git repository in this folder. This way, you can see what changes the AI has made in which files. - + - + When you rebuild / re-generate the ERI server code, AI Studio proceeds as follows: All files generated last time will be deleted. All other files you have created remain. Then, the AI generates the new files. But beware: It may happen that the AI generates a file this time that you manually created last time. In this case, your manually created file will then be overwritten. Therefore, you should always create a Git repository and commit or revert all changes before using this assistant. With a diff visualization, you can immediately see where the AI has made changes. It is best to use an IDE suitable for your selected language for this purpose. - + - + diff --git a/app/MindWork AI Studio/Assistants/ERI/AssistantERI.razor.cs b/app/MindWork AI Studio/Assistants/ERI/AssistantERI.razor.cs index 85347316..c752f4cb 100644 --- a/app/MindWork AI Studio/Assistants/ERI/AssistantERI.razor.cs +++ b/app/MindWork AI Studio/Assistants/ERI/AssistantERI.razor.cs @@ -3,6 +3,7 @@ using System.Text.RegularExpressions; using AIStudio.Chat; using AIStudio.Dialogs; +using AIStudio.Dialogs.Settings; using AIStudio.Settings.DataModel; using Microsoft.AspNetCore.Components; @@ -11,7 +12,7 @@ using DialogOptions = AIStudio.Dialogs.DialogOptions; namespace AIStudio.Assistants.ERI; -public partial class AssistantERI : AssistantBaseCore +public partial class AssistantERI : AssistantBaseCore { [Inject] private HttpClient HttpClient { get; set; } = null!; @@ -290,6 +291,7 @@ public partial class AssistantERI : AssistantBaseCore - You consider the security of the implementation by applying the Security by Design principle. - Your output is formatted as Markdown. Code is formatted as code blocks. For every file, you create a separate code block with its file path and name as chapter title. + - Important: The JSON objects of the API messages use camel case for the data field names. """); return sb.ToString(); @@ -299,6 +301,8 @@ public partial class AssistantERI : AssistantBaseCore protected override IReadOnlyList FooterButtons => []; protected override bool ShowEntireChatThread => true; + + protected override bool ShowSendTo => false; protected override string SubmitText => "Create the ERI server"; @@ -476,6 +480,16 @@ public partial class AssistantERI : AssistantBaseCore if(this.selectedERIServer is null) return; + var dialogParameters = new DialogParameters + { + { "Message", $"Are you sure you want to delete the ERI server preset '{this.selectedERIServer.ServerName}'?" }, + }; + + var dialogReference = await this.DialogService.ShowAsync("Delete ERI server preset", dialogParameters, DialogOptions.FULLSCREEN); + var dialogResult = await dialogReference.Result; + if (dialogResult is null || dialogResult.Canceled) + return; + this.SettingsManager.ConfigurationData.ERI.ERIServers.Remove(this.selectedERIServer); this.selectedERIServer = null; this.ResetForm(); @@ -739,6 +753,17 @@ public partial class AssistantERI : AssistantBaseCore return null; } + + private string? ValidateDirectory(string path) + { + if(!this.writeToFilesystem) + return null; + + if(string.IsNullOrWhiteSpace(path)) + return "Please provide a base directory for the ERI server to write files to."; + + return null; + } private string GetMultiSelectionAuthText(List selectedValues) { diff --git a/app/MindWork AI Studio/Assistants/ERI/ERIVersionExtensions.cs b/app/MindWork AI Studio/Assistants/ERI/ERIVersionExtensions.cs index c7ef7c16..99631e14 100644 --- a/app/MindWork AI Studio/Assistants/ERI/ERIVersionExtensions.cs +++ b/app/MindWork AI Studio/Assistants/ERI/ERIVersionExtensions.cs @@ -7,7 +7,7 @@ public static class ERIVersionExtensions try { var url = version.SpecificationURL(); - var response = await httpClient.GetAsync(url); + using var response = await httpClient.GetAsync(url); return await response.Content.ReadAsStringAsync(); } catch diff --git a/app/MindWork AI Studio/Assistants/GrammarSpelling/AssistantGrammarSpelling.razor b/app/MindWork AI Studio/Assistants/GrammarSpelling/AssistantGrammarSpelling.razor index 18a4280f..b6a500a0 100644 --- a/app/MindWork AI Studio/Assistants/GrammarSpelling/AssistantGrammarSpelling.razor +++ b/app/MindWork AI Studio/Assistants/GrammarSpelling/AssistantGrammarSpelling.razor @@ -1,5 +1,5 @@ @attribute [Route(Routes.ASSISTANT_GRAMMAR_SPELLING)] -@inherits AssistantBaseCore +@inherits AssistantBaseCore diff --git a/app/MindWork AI Studio/Assistants/GrammarSpelling/AssistantGrammarSpelling.razor.cs b/app/MindWork AI Studio/Assistants/GrammarSpelling/AssistantGrammarSpelling.razor.cs index 29cf4866..4a0e53c1 100644 --- a/app/MindWork AI Studio/Assistants/GrammarSpelling/AssistantGrammarSpelling.razor.cs +++ b/app/MindWork AI Studio/Assistants/GrammarSpelling/AssistantGrammarSpelling.razor.cs @@ -1,8 +1,9 @@ using AIStudio.Chat; +using AIStudio.Dialogs.Settings; namespace AIStudio.Assistants.GrammarSpelling; -public partial class AssistantGrammarSpelling : AssistantBaseCore +public partial class AssistantGrammarSpelling : AssistantBaseCore { public override Tools.Components Component => Tools.Components.GRAMMAR_SPELLING_ASSISTANT; @@ -42,7 +43,7 @@ public partial class AssistantGrammarSpelling : AssistantBaseCore protected override string SubmitText => "Proofread"; protected override Func SubmitAction => this.ProofreadText; - + protected override ChatThread ConvertToChatThread => (this.chatThread ?? new()) with { SystemPrompt = SystemPrompts.DEFAULT, diff --git a/app/MindWork AI Studio/Assistants/IconFinder/AssistantIconFinder.razor b/app/MindWork AI Studio/Assistants/IconFinder/AssistantIconFinder.razor index af241b87..576558ac 100644 --- a/app/MindWork AI Studio/Assistants/IconFinder/AssistantIconFinder.razor +++ b/app/MindWork AI Studio/Assistants/IconFinder/AssistantIconFinder.razor @@ -1,5 +1,5 @@ @attribute [Route(Routes.ASSISTANT_ICON_FINDER)] -@inherits AssistantBaseCore +@inherits AssistantBaseCore diff --git a/app/MindWork AI Studio/Assistants/IconFinder/AssistantIconFinder.razor.cs b/app/MindWork AI Studio/Assistants/IconFinder/AssistantIconFinder.razor.cs index 54348344..a071a81e 100644 --- a/app/MindWork AI Studio/Assistants/IconFinder/AssistantIconFinder.razor.cs +++ b/app/MindWork AI Studio/Assistants/IconFinder/AssistantIconFinder.razor.cs @@ -1,6 +1,8 @@ +using AIStudio.Dialogs.Settings; + namespace AIStudio.Assistants.IconFinder; -public partial class AssistantIconFinder : AssistantBaseCore +public partial class AssistantIconFinder : AssistantBaseCore { public override Tools.Components Component => Tools.Components.ICON_FINDER_ASSISTANT; @@ -32,7 +34,7 @@ public partial class AssistantIconFinder : AssistantBaseCore protected override string SubmitText => "Find Icon"; protected override Func SubmitAction => this.FindIcon; - + protected override void ResetForm() { this.inputContext = string.Empty; diff --git a/app/MindWork AI Studio/Assistants/JobPosting/AssistantJobPostings.razor b/app/MindWork AI Studio/Assistants/JobPosting/AssistantJobPostings.razor index ba419227..b92cbd31 100644 --- a/app/MindWork AI Studio/Assistants/JobPosting/AssistantJobPostings.razor +++ b/app/MindWork AI Studio/Assistants/JobPosting/AssistantJobPostings.razor @@ -1,5 +1,5 @@ @attribute [Route(Routes.ASSISTANT_JOB_POSTING)] -@inherits AssistantBaseCore +@inherits AssistantBaseCore diff --git a/app/MindWork AI Studio/Assistants/JobPosting/AssistantJobPostings.razor.cs b/app/MindWork AI Studio/Assistants/JobPosting/AssistantJobPostings.razor.cs index 164abde7..651824dd 100644 --- a/app/MindWork AI Studio/Assistants/JobPosting/AssistantJobPostings.razor.cs +++ b/app/MindWork AI Studio/Assistants/JobPosting/AssistantJobPostings.razor.cs @@ -1,8 +1,9 @@ using AIStudio.Chat; +using AIStudio.Dialogs.Settings; namespace AIStudio.Assistants.JobPosting; -public partial class AssistantJobPostings : AssistantBaseCore +public partial class AssistantJobPostings : AssistantBaseCore { public override Tools.Components Component => Tools.Components.JOB_POSTING_ASSISTANT; diff --git a/app/MindWork AI Studio/Assistants/LegalCheck/AssistantLegalCheck.razor b/app/MindWork AI Studio/Assistants/LegalCheck/AssistantLegalCheck.razor index f8494ea6..7dc781fd 100644 --- a/app/MindWork AI Studio/Assistants/LegalCheck/AssistantLegalCheck.razor +++ b/app/MindWork AI Studio/Assistants/LegalCheck/AssistantLegalCheck.razor @@ -1,5 +1,5 @@ @attribute [Route(Routes.ASSISTANT_LEGAL_CHECK)] -@inherits AssistantBaseCore +@inherits AssistantBaseCore @if (!this.SettingsManager.ConfigurationData.LegalCheck.HideWebContentReader) { diff --git a/app/MindWork AI Studio/Assistants/LegalCheck/AssistantLegalCheck.razor.cs b/app/MindWork AI Studio/Assistants/LegalCheck/AssistantLegalCheck.razor.cs index 45755675..218563fe 100644 --- a/app/MindWork AI Studio/Assistants/LegalCheck/AssistantLegalCheck.razor.cs +++ b/app/MindWork AI Studio/Assistants/LegalCheck/AssistantLegalCheck.razor.cs @@ -1,8 +1,9 @@ using AIStudio.Chat; +using AIStudio.Dialogs.Settings; namespace AIStudio.Assistants.LegalCheck; -public partial class AssistantLegalCheck : AssistantBaseCore +public partial class AssistantLegalCheck : AssistantBaseCore { public override Tools.Components Component => Tools.Components.LEGAL_CHECK_ASSISTANT; @@ -29,7 +30,7 @@ public partial class AssistantLegalCheck : AssistantBaseCore protected override string SubmitText => "Ask your questions"; protected override Func SubmitAction => this.AksQuestions; - + protected override bool SubmitDisabled => this.isAgentRunning; protected override ChatThread ConvertToChatThread => (this.chatThread ?? new()) with diff --git a/app/MindWork AI Studio/Assistants/MyTasks/AssistantMyTasks.razor b/app/MindWork AI Studio/Assistants/MyTasks/AssistantMyTasks.razor index 23154c8b..6ffb9c74 100644 --- a/app/MindWork AI Studio/Assistants/MyTasks/AssistantMyTasks.razor +++ b/app/MindWork AI Studio/Assistants/MyTasks/AssistantMyTasks.razor @@ -1,5 +1,5 @@ @attribute [Route(Routes.ASSISTANT_MY_TASKS)] -@inherits AssistantBaseCore +@inherits AssistantBaseCore diff --git a/app/MindWork AI Studio/Assistants/MyTasks/AssistantMyTasks.razor.cs b/app/MindWork AI Studio/Assistants/MyTasks/AssistantMyTasks.razor.cs index b0e52a18..3a512615 100644 --- a/app/MindWork AI Studio/Assistants/MyTasks/AssistantMyTasks.razor.cs +++ b/app/MindWork AI Studio/Assistants/MyTasks/AssistantMyTasks.razor.cs @@ -1,9 +1,10 @@ using AIStudio.Chat; +using AIStudio.Dialogs.Settings; using AIStudio.Settings; namespace AIStudio.Assistants.MyTasks; -public partial class AssistantMyTasks : AssistantBaseCore +public partial class AssistantMyTasks : AssistantBaseCore { public override Tools.Components Component => Tools.Components.MY_TASKS_ASSISTANT; diff --git a/app/MindWork AI Studio/Assistants/RewriteImprove/AssistantRewriteImprove.razor b/app/MindWork AI Studio/Assistants/RewriteImprove/AssistantRewriteImprove.razor index c599ad12..05feda39 100644 --- a/app/MindWork AI Studio/Assistants/RewriteImprove/AssistantRewriteImprove.razor +++ b/app/MindWork AI Studio/Assistants/RewriteImprove/AssistantRewriteImprove.razor @@ -1,5 +1,5 @@ @attribute [Route(Routes.ASSISTANT_REWRITE)] -@inherits AssistantBaseCore +@inherits AssistantBaseCore diff --git a/app/MindWork AI Studio/Assistants/RewriteImprove/AssistantRewriteImprove.razor.cs b/app/MindWork AI Studio/Assistants/RewriteImprove/AssistantRewriteImprove.razor.cs index 216f85a9..0fb45089 100644 --- a/app/MindWork AI Studio/Assistants/RewriteImprove/AssistantRewriteImprove.razor.cs +++ b/app/MindWork AI Studio/Assistants/RewriteImprove/AssistantRewriteImprove.razor.cs @@ -1,8 +1,9 @@ using AIStudio.Chat; +using AIStudio.Dialogs.Settings; namespace AIStudio.Assistants.RewriteImprove; -public partial class AssistantRewriteImprove : AssistantBaseCore +public partial class AssistantRewriteImprove : AssistantBaseCore { public override Tools.Components Component => Tools.Components.REWRITE_ASSISTANT; @@ -43,7 +44,7 @@ public partial class AssistantRewriteImprove : AssistantBaseCore protected override string SubmitText => "Improve"; protected override Func SubmitAction => this.RewriteText; - + protected override ChatThread ConvertToChatThread => (this.chatThread ?? new()) with { SystemPrompt = SystemPrompts.DEFAULT, diff --git a/app/MindWork AI Studio/Assistants/Synonym/AssistantSynonyms.razor b/app/MindWork AI Studio/Assistants/Synonym/AssistantSynonyms.razor index 5ce13aab..0a960303 100644 --- a/app/MindWork AI Studio/Assistants/Synonym/AssistantSynonyms.razor +++ b/app/MindWork AI Studio/Assistants/Synonym/AssistantSynonyms.razor @@ -1,5 +1,5 @@ @attribute [Route(Routes.ASSISTANT_SYNONYMS)] -@inherits AssistantBaseCore +@inherits AssistantBaseCore diff --git a/app/MindWork AI Studio/Assistants/Synonym/AssistantSynonyms.razor.cs b/app/MindWork AI Studio/Assistants/Synonym/AssistantSynonyms.razor.cs index c849b685..2244e7af 100644 --- a/app/MindWork AI Studio/Assistants/Synonym/AssistantSynonyms.razor.cs +++ b/app/MindWork AI Studio/Assistants/Synonym/AssistantSynonyms.razor.cs @@ -1,8 +1,9 @@ using AIStudio.Chat; +using AIStudio.Dialogs.Settings; namespace AIStudio.Assistants.Synonym; -public partial class AssistantSynonyms : AssistantBaseCore +public partial class AssistantSynonyms : AssistantBaseCore { public override Tools.Components Component => Tools.Components.SYNONYMS_ASSISTANT; @@ -54,7 +55,7 @@ public partial class AssistantSynonyms : AssistantBaseCore protected override string SubmitText => "Find synonyms"; protected override Func SubmitAction => this.FindSynonyms; - + protected override ChatThread ConvertToChatThread => (this.chatThread ?? new()) with { SystemPrompt = SystemPrompts.DEFAULT, diff --git a/app/MindWork AI Studio/Assistants/TextSummarizer/AssistantTextSummarizer.razor b/app/MindWork AI Studio/Assistants/TextSummarizer/AssistantTextSummarizer.razor index 5302a1aa..c1b05d99 100644 --- a/app/MindWork AI Studio/Assistants/TextSummarizer/AssistantTextSummarizer.razor +++ b/app/MindWork AI Studio/Assistants/TextSummarizer/AssistantTextSummarizer.razor @@ -1,5 +1,5 @@ @attribute [Route(Routes.ASSISTANT_SUMMARIZER)] -@inherits AssistantBaseCore +@inherits AssistantBaseCore @if (!this.SettingsManager.ConfigurationData.TextSummarizer.HideWebContentReader) { diff --git a/app/MindWork AI Studio/Assistants/TextSummarizer/AssistantTextSummarizer.razor.cs b/app/MindWork AI Studio/Assistants/TextSummarizer/AssistantTextSummarizer.razor.cs index fb9244b0..c5fc437c 100644 --- a/app/MindWork AI Studio/Assistants/TextSummarizer/AssistantTextSummarizer.razor.cs +++ b/app/MindWork AI Studio/Assistants/TextSummarizer/AssistantTextSummarizer.razor.cs @@ -1,8 +1,9 @@ using AIStudio.Chat; +using AIStudio.Dialogs.Settings; namespace AIStudio.Assistants.TextSummarizer; -public partial class AssistantTextSummarizer : AssistantBaseCore +public partial class AssistantTextSummarizer : AssistantBaseCore { public override Tools.Components Component => Tools.Components.TEXT_SUMMARIZER_ASSISTANT; @@ -32,7 +33,7 @@ public partial class AssistantTextSummarizer : AssistantBaseCore protected override string SubmitText => "Summarize"; protected override Func SubmitAction => this.SummarizeText; - + protected override bool SubmitDisabled => this.isAgentRunning; protected override ChatThread ConvertToChatThread => (this.chatThread ?? new()) with diff --git a/app/MindWork AI Studio/Assistants/Translation/AssistantTranslation.razor b/app/MindWork AI Studio/Assistants/Translation/AssistantTranslation.razor index fa158797..f1a6467c 100644 --- a/app/MindWork AI Studio/Assistants/Translation/AssistantTranslation.razor +++ b/app/MindWork AI Studio/Assistants/Translation/AssistantTranslation.razor @@ -1,5 +1,5 @@ @attribute [Route(Routes.ASSISTANT_TRANSLATION)] -@inherits AssistantBaseCore +@inherits AssistantBaseCore @if (!this.SettingsManager.ConfigurationData.Translation.HideWebContentReader) { diff --git a/app/MindWork AI Studio/Assistants/Translation/AssistantTranslation.razor.cs b/app/MindWork AI Studio/Assistants/Translation/AssistantTranslation.razor.cs index 785aae4c..628190cd 100644 --- a/app/MindWork AI Studio/Assistants/Translation/AssistantTranslation.razor.cs +++ b/app/MindWork AI Studio/Assistants/Translation/AssistantTranslation.razor.cs @@ -1,8 +1,9 @@ using AIStudio.Chat; +using AIStudio.Dialogs.Settings; namespace AIStudio.Assistants.Translation; -public partial class AssistantTranslation : AssistantBaseCore +public partial class AssistantTranslation : AssistantBaseCore { public override Tools.Components Component => Tools.Components.TRANSLATION_ASSISTANT; @@ -28,7 +29,7 @@ public partial class AssistantTranslation : AssistantBaseCore protected override string SubmitText => "Translate"; protected override Func SubmitAction => () => this.TranslateText(true); - + protected override bool SubmitDisabled => this.isAgentRunning; protected override ChatThread ConvertToChatThread => (this.chatThread ?? new()) with diff --git a/app/MindWork AI Studio/Chat/ChatThread.cs b/app/MindWork AI Studio/Chat/ChatThread.cs index 4f4f5738..ceb3041a 100644 --- a/app/MindWork AI Studio/Chat/ChatThread.cs +++ b/app/MindWork AI Studio/Chat/ChatThread.cs @@ -1,4 +1,7 @@ +using AIStudio.Components; using AIStudio.Settings; +using AIStudio.Settings.DataModel; +using AIStudio.Tools.ERIClient.DataModel; namespace AIStudio.Chat; @@ -27,6 +30,26 @@ public sealed record ChatThread /// public string SelectedProfile { get; set; } = string.Empty; + /// + /// The data source options for this chat thread. + /// + public DataSourceOptions DataSourceOptions { get; set; } = new(); + + /// + /// The AI-selected data sources for this chat thread. + /// + public IReadOnlyList AISelectedDataSources { get; set; } = []; + + /// + /// The augmented data for this chat thread. Will be inserted into the system prompt. + /// + public string AugmentedData { get; set; } = string.Empty; + + /// + /// The data security to use, derived from the data sources used so far. + /// + public DataSourceSecurity DataSecurity { get; set; } = DataSourceSecurity.NOT_SPECIFIED; + /// /// The name of the chat thread. Usually generated by an AI model or manually edited by the user. /// @@ -61,31 +84,48 @@ public sealed record ChatThread /// The prepared system prompt. public string PrepareSystemPrompt(SettingsManager settingsManager, ChatThread chatThread, ILogger logger) { + var isAugmentedDataAvailable = !string.IsNullOrWhiteSpace(chatThread.AugmentedData); + var systemPromptWithAugmentedData = isAugmentedDataAvailable switch + { + true => $""" + {chatThread.SystemPrompt} + + {chatThread.AugmentedData} + """, + + false => chatThread.SystemPrompt, + }; + + if(isAugmentedDataAvailable) + logger.LogInformation("Augmented data is available for the chat thread."); + else + logger.LogInformation("No augmented data is available for the chat thread."); + // // Prepare the system prompt: // string systemPromptText; var logMessage = $"Using no profile for chat thread '{chatThread.Name}'."; if (string.IsNullOrWhiteSpace(chatThread.SelectedProfile)) - systemPromptText = chatThread.SystemPrompt; + systemPromptText = systemPromptWithAugmentedData; else { if(!Guid.TryParse(chatThread.SelectedProfile, out var profileId)) - systemPromptText = chatThread.SystemPrompt; + systemPromptText = systemPromptWithAugmentedData; else { if(chatThread.SelectedProfile == Profile.NO_PROFILE.Id || profileId == Guid.Empty) - systemPromptText = chatThread.SystemPrompt; + systemPromptText = systemPromptWithAugmentedData; else { var profile = settingsManager.ConfigurationData.Profiles.FirstOrDefault(x => x.Id == chatThread.SelectedProfile); if(profile == default) - systemPromptText = chatThread.SystemPrompt; + systemPromptText = systemPromptWithAugmentedData; else { logMessage = $"Using profile '{profile.Name}' for chat thread '{chatThread.Name}'."; systemPromptText = $""" - {chatThread.SystemPrompt} + {systemPromptWithAugmentedData} {profile.ToSystemPrompt()} """; @@ -138,4 +178,46 @@ public sealed record ChatThread // Remove the block from the chat thread: this.Blocks.Remove(block); } + + /// + /// Transforms this chat thread to an ERI chat thread. + /// + /// The cancellation token. + /// The ERI chat thread. + public async Task ToERIChatThread(CancellationToken token = default) + { + // + // Transform the content blocks: + // + var contentBlocks = new List(this.Blocks.Count); + foreach (var block in this.Blocks) + { + var (contentData, contentType) = block.Content switch + { + ContentImage image => (await image.AsBase64(token), Tools.ERIClient.DataModel.ContentType.IMAGE), + ContentText text => (text.Text, Tools.ERIClient.DataModel.ContentType.TEXT), + + _ => (string.Empty, Tools.ERIClient.DataModel.ContentType.UNKNOWN), + }; + + contentBlocks.Add(new Tools.ERIClient.DataModel.ContentBlock + { + Role = block.Role switch + { + ChatRole.AI => Role.AI, + ChatRole.USER => Role.USER, + ChatRole.AGENT => Role.AGENT, + ChatRole.SYSTEM => Role.SYSTEM, + ChatRole.NONE => Role.NONE, + + _ => Role.UNKNOWN, + }, + + Content = contentData, + Type = contentType, + }); + } + + return new Tools.ERIClient.DataModel.ChatThread { ContentBlocks = contentBlocks }; + } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Chat/ChatThreadExtensions.cs b/app/MindWork AI Studio/Chat/ChatThreadExtensions.cs new file mode 100644 index 00000000..6b1b6500 --- /dev/null +++ b/app/MindWork AI Studio/Chat/ChatThreadExtensions.cs @@ -0,0 +1,58 @@ +using AIStudio.Provider.SelfHosted; +using AIStudio.Settings.DataModel; + +namespace AIStudio.Chat; + +public static class ChatThreadExtensions +{ + /// + /// Checks if the specified provider is allowed for the chat thread. + /// + /// + /// We don't check if the provider is allowed to use the data sources of the chat thread. + /// That kind of check is done in the RAG process itself.

+ /// + /// One thing which is not so obvious: after RAG was used on this thread, the entire chat + /// thread is kind of a data source by itself. Why? Because the augmentation data collected + /// from the data sources is stored in the chat thread. This means we must check if the + /// selected provider is allowed to use this thread's data. + ///
+ /// The chat thread to check. + /// The provider to check. + /// True, when the provider is allowed for the chat thread. False, otherwise. + public static bool IsLLMProviderAllowed(this ChatThread? chatThread, T provider) + { + // No chat thread available means we have a new chat. That's fine: + if (chatThread is null) + return true; + + // The chat thread is available, but the data security is not specified. + // Means, we never used RAG or RAG was enabled, but no data sources were selected. + // That's fine as well: + if (chatThread.DataSecurity is DataSourceSecurity.NOT_SPECIFIED) + return true; + + // + // Is the provider self-hosted? + // + var isSelfHostedProvider = provider switch + { + ProviderSelfHosted => true, + AIStudio.Settings.Provider p => p.IsSelfHosted, + + _ => false, + }; + + // + // Check the chat data security against the selected provider: + // + return isSelfHostedProvider switch + { + // The provider is self-hosted -- we can use any data source: + true => true, + + // The provider is not self-hosted -- it depends on the data security of the chat thread: + false => chatThread.DataSecurity is not DataSourceSecurity.SELF_HOSTED, + }; + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Chat/ContentBlockComponent.razor b/app/MindWork AI Studio/Chat/ContentBlockComponent.razor index ca61acc2..f1c93b65 100644 --- a/app/MindWork AI Studio/Chat/ContentBlockComponent.razor +++ b/app/MindWork AI Studio/Chat/ContentBlockComponent.razor @@ -27,7 +27,7 @@ @if (this.IsLastContentBlock && this.Role is ChatRole.AI && this.RegenerateFunc is not null) { - + } @if (this.RemoveBlockFunc is not null) @@ -78,9 +78,9 @@ break; case ContentType.IMAGE: - if (this.Content is ContentImage imageContent) + if (this.Content is ContentImage { SourceType: ContentImageSource.URL or ContentImageSource.LOCAL_PATH } imageContent) { - + } break; diff --git a/app/MindWork AI Studio/Chat/ContentBlockComponent.razor.cs b/app/MindWork AI Studio/Chat/ContentBlockComponent.razor.cs index 57975903..815caa6e 100644 --- a/app/MindWork AI Studio/Chat/ContentBlockComponent.razor.cs +++ b/app/MindWork AI Studio/Chat/ContentBlockComponent.razor.cs @@ -1,9 +1,8 @@ using AIStudio.Settings; +using AIStudio.Tools.Services; using Microsoft.AspNetCore.Components; -using RustService = AIStudio.Tools.RustService; - namespace AIStudio.Chat; /// @@ -42,10 +41,10 @@ public partial class ContentBlockComponent : ComponentBase public string Class { get; set; } = string.Empty; [Parameter] - public bool IsLastContentBlock { get; set; } = false; + public bool IsLastContentBlock { get; set; } [Parameter] - public bool IsSecondToLastBlock { get; set; } = false; + public bool IsSecondToLastBlock { get; set; } [Parameter] public Func? RemoveBlockFunc { get; set; } diff --git a/app/MindWork AI Studio/Chat/ContentImage.cs b/app/MindWork AI Studio/Chat/ContentImage.cs index 314ba93c..c7e785eb 100644 --- a/app/MindWork AI Studio/Chat/ContentImage.cs +++ b/app/MindWork AI Studio/Chat/ContentImage.cs @@ -1,14 +1,13 @@ using System.Text.Json.Serialization; using AIStudio.Provider; -using AIStudio.Settings; namespace AIStudio.Chat; /// /// Represents an image inside the chat. /// -public sealed class ContentImage : IContent +public sealed class ContentImage : IContent, IImageSource { #region Implementation of IContent @@ -29,7 +28,7 @@ public sealed class ContentImage : IContent public Func StreamingEvent { get; set; } = () => Task.CompletedTask; /// - public Task CreateFromProviderAsync(IProvider provider, SettingsManager settings, Model chatModel, ChatThread chatChatThread, CancellationToken token = default) + public Task CreateFromProviderAsync(IProvider provider, Model chatModel, IContent? lastPrompt, ChatThread? chatChatThread, CancellationToken token = default) { throw new NotImplementedException(); } @@ -37,12 +36,15 @@ public sealed class ContentImage : IContent #endregion /// - /// The URL of the image. + /// The type of the image source. /// - public string URL { get; set; } = string.Empty; + /// + /// Is the image source a URL, a local file path, a base64 string, etc.? + /// + public required ContentImageSource SourceType { get; init; } /// - /// The local path of the image. + /// The image source. /// - public string LocalPath { get; set; } = string.Empty; + public required string Source { get; set; } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Chat/ContentImageSource.cs b/app/MindWork AI Studio/Chat/ContentImageSource.cs new file mode 100644 index 00000000..ec009661 --- /dev/null +++ b/app/MindWork AI Studio/Chat/ContentImageSource.cs @@ -0,0 +1,8 @@ +namespace AIStudio.Chat; + +public enum ContentImageSource +{ + URL, + LOCAL_PATH, + BASE64, +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Chat/ContentText.cs b/app/MindWork AI Studio/Chat/ContentText.cs index f7cc62f6..38872edf 100644 --- a/app/MindWork AI Studio/Chat/ContentText.cs +++ b/app/MindWork AI Studio/Chat/ContentText.cs @@ -2,6 +2,7 @@ using System.Text.Json.Serialization; using AIStudio.Provider; using AIStudio.Settings; +using AIStudio.Tools.RAG.RAGProcesses; namespace AIStudio.Chat; @@ -35,10 +36,32 @@ public sealed class ContentText : IContent public Func StreamingEvent { get; set; } = () => Task.CompletedTask; /// - public async Task CreateFromProviderAsync(IProvider provider, SettingsManager settings, Model chatModel, ChatThread? chatThread, CancellationToken token = default) + public async Task CreateFromProviderAsync(IProvider provider, Model chatModel, IContent? lastPrompt, ChatThread? chatThread, CancellationToken token = default) { if(chatThread is null) - return; + return new(); + + if(!chatThread.IsLLMProviderAllowed(provider)) + { + var logger = Program.SERVICE_PROVIDER.GetService>()!; + logger.LogError("The provider is not allowed for this chat thread due to data security reasons. Skipping the AI process."); + return chatThread; + } + + // Call the RAG process. Right now, we only have one RAG process: + if (lastPrompt is not null) + { + try + { + var rag = new AISrcSelWithRetCtxVal(); + chatThread = await rag.ProcessAsync(provider, lastPrompt, chatThread, token); + } + catch (Exception e) + { + var logger = Program.SERVICE_PROVIDER.GetService>()!; + logger.LogError(e, "Skipping the RAG process due to an error."); + } + } // Store the last time we got a response. We use this later // to determine whether we should notify the UI about the @@ -46,6 +69,9 @@ public sealed class ContentText : IContent // the user chose. var last = DateTimeOffset.Now; + // Get the settings manager: + var settings = Program.SERVICE_PROVIDER.GetService()!; + // Start another thread by using a task to uncouple // the UI thread from the AI processing: await Task.Run(async () => @@ -96,6 +122,7 @@ public sealed class ContentText : IContent // Inform the UI that the streaming is done: await this.StreamingDone(); + return chatThread; } #endregion diff --git a/app/MindWork AI Studio/Chat/IContent.cs b/app/MindWork AI Studio/Chat/IContent.cs index 1feea520..be3bf097 100644 --- a/app/MindWork AI Studio/Chat/IContent.cs +++ b/app/MindWork AI Studio/Chat/IContent.cs @@ -1,7 +1,6 @@ using System.Text.Json.Serialization; using AIStudio.Provider; -using AIStudio.Settings; namespace AIStudio.Chat; @@ -42,5 +41,16 @@ public interface IContent /// /// Uses the provider to create the content. /// - public Task CreateFromProviderAsync(IProvider provider, SettingsManager settings, Model chatModel, ChatThread chatChatThread, CancellationToken token = default); + public Task CreateFromProviderAsync(IProvider provider, Model chatModel, IContent? lastPrompt, ChatThread? chatChatThread, CancellationToken token = default); + + /// + /// Returns the corresponding ERI content type. + /// + public Tools.ERIClient.DataModel.ContentType ToERIContentType => this switch + { + ContentText => Tools.ERIClient.DataModel.ContentType.TEXT, + ContentImage => Tools.ERIClient.DataModel.ContentType.IMAGE, + + _ => Tools.ERIClient.DataModel.ContentType.UNKNOWN, + }; } \ No newline at end of file diff --git a/app/MindWork AI Studio/Chat/IImageSource.cs b/app/MindWork AI Studio/Chat/IImageSource.cs new file mode 100644 index 00000000..1931630f --- /dev/null +++ b/app/MindWork AI Studio/Chat/IImageSource.cs @@ -0,0 +1,17 @@ +namespace AIStudio.Chat; + +public interface IImageSource +{ + /// + /// The type of the image source. + /// + /// + /// Is the image source a URL, a local file path, a base64 string, etc.? + /// + public ContentImageSource SourceType { get; init; } + + /// + /// The image source. + /// + public string Source { get; set; } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Chat/IImageSourceExtensions.cs b/app/MindWork AI Studio/Chat/IImageSourceExtensions.cs new file mode 100644 index 00000000..836df531 --- /dev/null +++ b/app/MindWork AI Studio/Chat/IImageSourceExtensions.cs @@ -0,0 +1,63 @@ +namespace AIStudio.Chat; + +public static class IImageSourceExtensions +{ + /// + /// Read the image content as a base64 string. + /// + /// + /// The images are directly converted to base64 strings. The maximum + /// size of the image is around 10 MB. If the image is larger, the method + /// returns an empty string. + /// + /// As of now, this method does no sort of image processing. LLMs usually + /// do not work with arbitrary image sizes. In the future, we might have + /// to resize the images before sending them to the model. + /// + /// The image source. + /// The cancellation token. + /// The image content as a base64 string; might be empty. + public static async Task AsBase64(this IImageSource image, CancellationToken token = default) + { + switch (image.SourceType) + { + case ContentImageSource.BASE64: + return image.Source; + + case ContentImageSource.URL: + { + using var httpClient = new HttpClient(); + using var response = await httpClient.GetAsync(image.Source, HttpCompletionOption.ResponseHeadersRead, token); + if(response.IsSuccessStatusCode) + { + // Read the length of the content: + var lengthBytes = response.Content.Headers.ContentLength; + if(lengthBytes > 10_000_000) + return string.Empty; + + var bytes = await response.Content.ReadAsByteArrayAsync(token); + return Convert.ToBase64String(bytes); + } + + return string.Empty; + } + + case ContentImageSource.LOCAL_PATH: + if(File.Exists(image.Source)) + { + // Read the content length: + var length = new FileInfo(image.Source).Length; + if(length > 10_000_000) + return string.Empty; + + var bytes = await File.ReadAllBytesAsync(image.Source, token); + return Convert.ToBase64String(bytes); + } + + return string.Empty; + + default: + return string.Empty; + } + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Chat/Workspace.cs b/app/MindWork AI Studio/Chat/Workspace.cs deleted file mode 100644 index 0dad2b9b..00000000 --- a/app/MindWork AI Studio/Chat/Workspace.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace AIStudio.Chat; - -/// -/// Data about a workspace. -/// -/// The name of the workspace. -public sealed class Workspace(string name) -{ - public string Name { get; set; } = name; - - public List Threads { get; set; } = new(); -} \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/AssistantBlock.razor b/app/MindWork AI Studio/Components/AssistantBlock.razor index 0fc497af..3d0d9723 100644 --- a/app/MindWork AI Studio/Components/AssistantBlock.razor +++ b/app/MindWork AI Studio/Components/AssistantBlock.razor @@ -1,3 +1,5 @@ +@typeparam TSettings + @@ -17,8 +19,11 @@ - - @this.ButtonText - + + + @this.ButtonText + + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/AssistantBlock.razor.cs b/app/MindWork AI Studio/Components/AssistantBlock.razor.cs index f79b7bda..df5c84cd 100644 --- a/app/MindWork AI Studio/Components/AssistantBlock.razor.cs +++ b/app/MindWork AI Studio/Components/AssistantBlock.razor.cs @@ -2,9 +2,11 @@ using AIStudio.Settings; using Microsoft.AspNetCore.Components; +using DialogOptions = AIStudio.Dialogs.DialogOptions; + namespace AIStudio.Components; -public partial class AssistantBlock : ComponentBase, IMessageBusReceiver, IDisposable +public partial class AssistantBlock : ComponentBase, IMessageBusReceiver, IDisposable where TSettings : IComponent { [Parameter] public string Name { get; set; } = string.Empty; @@ -29,6 +31,16 @@ public partial class AssistantBlock : ComponentBase, IMessageBusReceiver, IDispo [Inject] private MessageBus MessageBus { get; init; } = null!; + + [Inject] + private IDialogService DialogService { get; init; } = null!; + + private async Task OpenSettingsDialog() + { + var dialogParameters = new DialogParameters(); + + await this.DialogService.ShowAsync("Open Settings", dialogParameters, DialogOptions.FULLSCREEN); + } #region Overrides of ComponentBase @@ -44,6 +56,8 @@ public partial class AssistantBlock : ComponentBase, IMessageBusReceiver, IDispo #region Implementation of IMessageBusReceiver + public string ComponentName => nameof(AssistantBlock); + public Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) { switch (triggeredEvent) @@ -62,7 +76,7 @@ public partial class AssistantBlock : ComponentBase, IMessageBusReceiver, IDispo } #endregion - + private string BorderColor => this.SettingsManager.IsDarkMode switch { true => this.ColorTheme.GetCurrentPalette(this.SettingsManager).GrayLight, diff --git a/app/MindWork AI Studio/Components/Changelog.Logs.cs b/app/MindWork AI Studio/Components/Changelog.Logs.cs index ea205478..11627ab6 100644 --- a/app/MindWork AI Studio/Components/Changelog.Logs.cs +++ b/app/MindWork AI Studio/Components/Changelog.Logs.cs @@ -13,6 +13,19 @@ public partial class Changelog public static readonly Log[] LOGS = [ + new (213, "v0.9.38, build 213 (2025-03-17 18:18 UTC)", "v0.9.38.md"), + new (212, "v0.9.37, build 212 (2025-03-16 20:32 UTC)", "v0.9.37.md"), + new (211, "v0.9.36, build 211 (2025-03-15 10:42 UTC)", "v0.9.36.md"), + new (210, "v0.9.35, build 210 (2025-03-13 08:44 UTC)", "v0.9.35.md"), + new (209, "v0.9.34, build 209 (2025-03-11 13:02 UTC)", "v0.9.34.md"), + new (208, "v0.9.33, build 208 (2025-03-11 08:14 UTC)", "v0.9.33.md"), + new (207, "v0.9.32, build 207 (2025-03-08 20:15 UTC)", "v0.9.32.md"), + new (206, "v0.9.31, build 206 (2025-03-03 15:33 UTC)", "v0.9.31.md"), + new (205, "v0.9.30, build 205 (2025-02-24 19:55 UTC)", "v0.9.30.md"), + new (204, "v0.9.29, build 204 (2025-02-24 13:48 UTC)", "v0.9.29.md"), + new (203, "v0.9.28, build 203 (2025-02-09 16:33 UTC)", "v0.9.28.md"), + new (202, "v0.9.27, build 202 (2025-01-21 18:24 UTC)", "v0.9.27.md"), + new (201, "v0.9.26, build 201 (2025-01-13 19:11 UTC)", "v0.9.26.md"), new (200, "v0.9.25, build 200 (2025-01-04 18:33 UTC)", "v0.9.25.md"), new (199, "v0.9.24, build 199 (2025-01-04 11:40 UTC)", "v0.9.24.md"), new (198, "v0.9.23, build 198 (2025-01-02 19:39 UTC)", "v0.9.23.md"), diff --git a/app/MindWork AI Studio/Components/Changelog.razor.cs b/app/MindWork AI Studio/Components/Changelog.razor.cs index c90a46c6..bba8b8a5 100644 --- a/app/MindWork AI Studio/Components/Changelog.razor.cs +++ b/app/MindWork AI Studio/Components/Changelog.razor.cs @@ -23,7 +23,7 @@ public partial class Changelog : ComponentBase private async Task ReadLogAsync() { - var response = await this.HttpClient.GetAsync($"changelog/{this.SelectedLog.Filename}"); + using var response = await this.HttpClient.GetAsync($"changelog/{this.SelectedLog.Filename}"); this.LogContent = await response.Content.ReadAsStringAsync(); } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/ChatComponent.razor b/app/MindWork AI Studio/Components/ChatComponent.razor index 2b8ff2dc..703d9175 100644 --- a/app/MindWork AI Studio/Components/ChatComponent.razor +++ b/app/MindWork AI Studio/Components/ChatComponent.razor @@ -3,7 +3,7 @@ @inherits MSGComponentBase - + @if (this.ChatThread is not null) { @@ -24,7 +24,7 @@ IsLastContentBlock="@isLastBlock" IsSecondToLastBlock="@isSecondLastBlock" RegenerateFunc="@this.RegenerateBlock" - RegenerateEnabled="@(() => this.IsProviderSelected)" + RegenerateEnabled="@(() => this.IsProviderSelected && this.ChatThread.IsLLMProviderAllowed(this.Provider))" EditLastBlockFunc="@this.EditLastBlock" EditLastUserBlockFunc="@this.EditLastUserBlock"/> } @@ -46,7 +46,7 @@ Adornment="Adornment.End" AdornmentIcon="@Icons.Material.Filled.Send" OnAdornmentClick="() => this.SendMessage()" - ReadOnly="!this.IsProviderSelected || this.isStreaming" + Disabled="@this.IsInputForbidden()" Immediate="@true" OnKeyUp="this.InputKeyEvent" UserAttributes="@USER_INPUT_ATTRIBUTES" @@ -97,7 +97,7 @@ @if (this.SettingsManager.ConfigurationData.LLMProviders.ShowProviderConfidence) { - + } @if (this.isStreaming && this.cancellationTokenSource is not null) @@ -108,6 +108,19 @@ } + + @if (PreviewFeatures.PRE_RAG_2024.IsEnabled(this.SettingsManager)) + { + + } + + @if (!this.ChatThread.IsLLMProviderAllowed(this.Provider)) + { + + + + } + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/ChatComponent.razor.cs b/app/MindWork AI Studio/Components/ChatComponent.razor.cs index 5ca0ebdd..0759d5b4 100644 --- a/app/MindWork AI Studio/Components/ChatComponent.razor.cs +++ b/app/MindWork AI Studio/Components/ChatComponent.razor.cs @@ -40,9 +40,11 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable [Inject] private IDialogService DialogService { get; init; } = null!; - private const Placement TOOLBAR_TOOLTIP_PLACEMENT = Placement.Bottom; + private const Placement TOOLBAR_TOOLTIP_PLACEMENT = Placement.Top; private static readonly Dictionary USER_INPUT_ATTRIBUTES = new(); + private DataSourceSelection? dataSourceSelectionComponent; + private DataSourceOptions earlyDataSourceOptions = new(); private Profile currentProfile = Profile.NO_PROFILE; private bool hasUnsavedChanges; private bool mustScrollToBottomAfterRender; @@ -66,21 +68,40 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable protected override async Task OnInitializedAsync() { + // Apply the filters for the message bus: this.ApplyFilters([], [ Event.HAS_CHAT_UNSAVED_CHANGES, Event.RESET_CHAT_STATE, Event.CHAT_STREAMING_DONE, Event.WORKSPACE_LOADED_CHAT_CHANGED ]); // Configure the spellchecking for the user input: this.SettingsManager.InjectSpellchecking(USER_INPUT_ATTRIBUTES); - + + // Get the preselected profile: this.currentProfile = this.SettingsManager.GetPreselectedProfile(Tools.Components.CHAT); + + // + // Check for deferred messages of the kind 'SEND_TO_CHAT', + // aka the user sends an assistant result to the chat: + // var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages(Event.SEND_TO_CHAT).FirstOrDefault(); if (deferredContent is not null) { + // + // Yes, the user sent an assistant result to the chat. + // + + // Use chat thread sent by the user: this.ChatThread = deferredContent; this.Logger.LogInformation($"The chat '{this.ChatThread.Name}' with {this.ChatThread.Blocks.Count} messages was deferred and will be rendered now."); await this.ChatThreadChanged.InvokeAsync(this.ChatThread); + // We know already that the chat thread is not null, + // but we have to check it again for the nullability + // for the compiler: if (this.ChatThread is not null) { + // + // Check if the chat thread has a name. If not, we + // generate the name now: + // if (string.IsNullOrWhiteSpace(this.ChatThread.Name)) { var firstUserBlock = this.ChatThread.Blocks.FirstOrDefault(x => x.Role == ChatRole.USER); @@ -94,12 +115,24 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable } } + // + // Check if the user wants to apply the standard chat data source options: + // + if (this.SettingsManager.ConfigurationData.Chat.SendToChatDataSourceBehavior is SendToChatDataSourceBehavior.APPLY_STANDARD_CHAT_DATA_SOURCE_OPTIONS) + this.ChatThread.DataSourceOptions = this.SettingsManager.ConfigurationData.Chat.PreselectedDataSourceOptions.CreateCopy(); + + // + // Check if the user wants to store the chat automatically: + // if (this.SettingsManager.ConfigurationData.Workspace.StorageBehavior is WorkspaceStorageBehavior.STORE_CHATS_AUTOMATICALLY) { this.autoSaveEnabled = true; this.mustStoreChat = true; - // Ensure the workspace exists: + // + // When a standard workspace is used, we have to ensure + // that the workspace is available: + // if(this.ChatThread.WorkspaceId == KnownWorkspaces.ERI_SERVER_WORKSPACE_ID) await WorkspaceBehaviour.EnsureERIServerWorkspace(); @@ -108,14 +141,38 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable } } } + else + { + // + // No, the user did not send an assistant result to the chat. + // + this.ApplyStandardDataSourceOptions(); + } + // + // Check if the user wants to show the latest message after loading: + // if (this.SettingsManager.ConfigurationData.Chat.ShowLatestMessageAfterLoading) { + // + // We cannot scroll to the bottom right now because the + // chat component is not rendered yet. We have to wait for + // the rendering process to finish. Thus, we set a flag + // to scroll to the bottom after the rendering process.: + // this.mustScrollToBottomAfterRender = true; this.scrollRenderCountdown = 4; this.StateHasChanged(); } + // + // Check if another component deferred the loading of a chat. + // + // This is used, e.g., for the bias-of-the-day component: + // when the bias for this day was already produced, the bias + // component sends a message to the chat component to load + // the chat with the bias: + // var deferredLoading = MessageBus.INSTANCE.CheckDeferredMessages(Event.LOAD_CHAT).FirstOrDefault(); if (deferredLoading != default) { @@ -123,7 +180,20 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable this.mustLoadChat = true; this.Logger.LogInformation($"The loading of the chat '{this.loadChat.ChatId}' was deferred and will be loaded now."); } + + // + // When for whatever reason we have a chat thread, we have to + // ensure that the corresponding workspace id is set and the + // workspace name is loaded: + // + if (this.ChatThread is not null) + { + this.currentWorkspaceId = this.ChatThread.WorkspaceId; + this.currentWorkspaceName = await WorkspaceBehaviour.LoadWorkspaceName(this.ChatThread.WorkspaceId); + this.WorkspaceName(this.currentWorkspaceName); + } + // Select the correct provider: await this.SelectProviderWhenLoadingChat(); await base.OnInitializedAsync(); } @@ -197,6 +267,16 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable private string UserInputClass => this.SettingsManager.ConfigurationData.LLMProviders.ShowProviderConfidence ? "confidence-border" : string.Empty; + private void ApplyStandardDataSourceOptions() + { + var chatDefaultOptions = this.SettingsManager.ConfigurationData.Chat.PreselectedDataSourceOptions.CreateCopy(); + this.earlyDataSourceOptions = chatDefaultOptions; + if(this.ChatThread is not null) + this.ChatThread.DataSourceOptions = chatDefaultOptions; + + this.dataSourceSelectionComponent?.ChangeOptionWithoutSaving(chatDefaultOptions); + } + private string ExtractThreadName(string firstUserInput) { // We select the first 10 words of the user input: @@ -224,8 +304,57 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable await this.ChatThreadChanged.InvokeAsync(this.ChatThread); } + private IReadOnlyList GetAgentSelectedDataSources() + { + if (this.ChatThread is null) + return []; + + return this.ChatThread.AISelectedDataSources; + } + + private DataSourceOptions GetCurrentDataSourceOptions() + { + if (this.ChatThread is not null) + return this.ChatThread.DataSourceOptions; + + return this.earlyDataSourceOptions; + } + + private async Task SetCurrentDataSourceOptions(DataSourceOptions updatedOptions) + { + if (this.ChatThread is not null) + { + this.hasUnsavedChanges = true; + this.ChatThread.DataSourceOptions = updatedOptions; + if(this.SettingsManager.ConfigurationData.Workspace.StorageBehavior is WorkspaceStorageBehavior.STORE_CHATS_AUTOMATICALLY) + { + await this.SaveThread(); + this.hasUnsavedChanges = false; + } + } + else + this.earlyDataSourceOptions = updatedOptions; + } + + private bool IsInputForbidden() + { + if (!this.IsProviderSelected) + return true; + + if(this.isStreaming) + return true; + + if(!this.ChatThread.IsLLMProviderAllowed(this.Provider)) + return true; + + return false; + } + private async Task InputKeyEvent(KeyboardEventArgs keyEvent) { + if(this.dataSourceSelectionComponent?.IsVisible ?? false) + this.dataSourceSelectionComponent.Hide(); + this.hasUnsavedChanges = true; var key = keyEvent.Code.ToLowerInvariant(); @@ -255,6 +384,9 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable if (!this.IsProviderSelected) return; + if(!this.ChatThread.IsLLMProviderAllowed(this.Provider)) + return; + // We need to blur the focus away from the input field // to be able to clear the field: await this.inputField.BlurAsync(); @@ -269,6 +401,7 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable SystemPrompt = SystemPrompts.DEFAULT, WorkspaceId = this.currentWorkspaceId, ChatId = Guid.NewGuid(), + DataSourceOptions = this.earlyDataSourceOptions, Name = this.ExtractThreadName(this.userInput), Seed = this.RNG.Next(), Blocks = [], @@ -288,8 +421,14 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable } var time = DateTimeOffset.Now; + IContent? lastUserPrompt; if (!reuseLastUserPrompt) { + lastUserPrompt = new ContentText + { + Text = this.userInput, + }; + // // Add the user message to the thread: // @@ -298,10 +437,7 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable Time = time, ContentType = ContentType.TEXT, Role = ChatRole.USER, - Content = new ContentText - { - Text = this.userInput, - }, + Content = lastUserPrompt, }); // Save the chat: @@ -312,6 +448,8 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable this.StateHasChanged(); } } + else + lastUserPrompt = this.ChatThread.Blocks.Last(x => x.Role is ChatRole.USER).Content; // // Add the AI response to the thread: @@ -353,7 +491,7 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable // Use the selected provider to get the AI response. // By awaiting this line, we wait for the entire // content to be streamed. - await aiText.CreateFromProviderAsync(this.Provider.CreateProvider(this.Logger), this.SettingsManager, this.Provider.Model, this.ChatThread, this.cancellationTokenSource.Token); + this.ChatThread = await aiText.CreateFromProviderAsync(this.Provider.CreateProvider(this.Logger), this.Provider.Model, lastUserPrompt, this.ChatThread, this.cancellationTokenSource.Token); } this.cancellationTokenSource = null; @@ -367,6 +505,8 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable // Disable the stream state: this.isStreaming = false; + + // Update the UI: this.StateHasChanged(); } @@ -400,6 +540,10 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable private async Task StartNewChat(bool useSameWorkspace = false, bool deletePreviousChat = false) { + // + // Want the user to manage the chat storage manually? In that case, we have to ask the user + // about possible data loss: + // if (this.SettingsManager.ConfigurationData.Workspace.StorageBehavior is WorkspaceStorageBehavior.STORE_CHATS_MANUALLY && this.hasUnsavedChanges) { var dialogParameters = new DialogParameters @@ -413,6 +557,9 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable return; } + // + // Delete the previous chat when desired and necessary: + // if (this.ChatThread is not null && deletePreviousChat) { string chatPath; @@ -427,10 +574,16 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable await this.Workspaces.DeleteChat(chatPath, askForConfirmation: false, unloadChat: true); } + // + // Reset our state: + // this.isStreaming = false; this.hasUnsavedChanges = false; this.userInput = string.Empty; + // + // Reset the LLM provider considering the user's settings: + // switch (this.SettingsManager.ConfigurationData.Chat.AddChatProviderBehavior) { case AddChatProviderBehavior.ADDED_CHATS_USE_DEFAULT_PROVIDER: @@ -449,8 +602,16 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable break; } + // + // Reset the chat thread or create a new one: + // if (!useSameWorkspace) { + // + // When the user wants to start a new chat outside the current workspace, + // we have to reset the workspace id and the workspace name. Also, we have + // to reset the chat thread: + // this.ChatThread = null; this.currentWorkspaceId = Guid.Empty; this.currentWorkspaceName = string.Empty; @@ -458,6 +619,11 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable } else { + // + // When the user wants to start a new chat in the same workspace, we have to + // reset the chat thread only. The workspace id and the workspace name remain + // the same: + // this.ChatThread = new() { SelectedProvider = this.Provider.Id, @@ -470,8 +636,11 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable Blocks = [], }; } - - this.userInput = string.Empty; + + // Now, we have to reset the data source options as well: + this.ApplyStandardDataSourceOptions(); + + // Notify the parent component about the change: await this.ChatThreadChanged.InvokeAsync(this.ChatThread); } @@ -525,17 +694,30 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable this.isStreaming = false; this.hasUnsavedChanges = false; this.userInput = string.Empty; - this.currentWorkspaceId = this.ChatThread?.WorkspaceId ?? Guid.Empty; - this.currentWorkspaceName = this.ChatThread is null ? string.Empty : await WorkspaceBehaviour.LoadWorkspaceName(this.ChatThread.WorkspaceId); - this.WorkspaceName(this.currentWorkspaceName); + + if (this.ChatThread is not null) + { + this.currentWorkspaceId = this.ChatThread.WorkspaceId; + this.currentWorkspaceName = await WorkspaceBehaviour.LoadWorkspaceName(this.ChatThread.WorkspaceId); + this.WorkspaceName(this.currentWorkspaceName); + this.dataSourceSelectionComponent?.ChangeOptionWithoutSaving(this.ChatThread.DataSourceOptions, this.ChatThread.AISelectedDataSources); + } + else + { + this.currentWorkspaceId = Guid.Empty; + this.currentWorkspaceName = string.Empty; + this.WorkspaceName(this.currentWorkspaceName); + this.ApplyStandardDataSourceOptions(); + } await this.SelectProviderWhenLoadingChat(); if (this.SettingsManager.ConfigurationData.Chat.ShowLatestMessageAfterLoading) { this.mustScrollToBottomAfterRender = true; this.scrollRenderCountdown = 2; - this.StateHasChanged(); } + + this.StateHasChanged(); } private async Task ResetState() @@ -549,6 +731,7 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable this.WorkspaceName(this.currentWorkspaceName); this.ChatThread = null; + this.ApplyStandardDataSourceOptions(); await this.ChatThreadChanged.InvokeAsync(this.ChatThread); } @@ -606,6 +789,9 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable if(this.ChatThread is null) return; + if(!this.ChatThread.IsLLMProviderAllowed(this.Provider)) + return; + this.ChatThread.Remove(aiBlock, removeForRegenerate: true); this.hasUnsavedChanges = true; this.StateHasChanged(); @@ -653,6 +839,8 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable #region Overrides of MSGComponentBase + public override string ComponentName => nameof(ChatComponent); + public override async Task ProcessIncomingMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) where T : default { switch (triggeredEvent) @@ -692,6 +880,7 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable public async ValueTask DisposeAsync() { + this.MessageBus.Unregister(this); if(this.SettingsManager.ConfigurationData.Workspace.StorageBehavior is WorkspaceStorageBehavior.STORE_CHATS_AUTOMATICALLY) { await this.SaveThread(); diff --git a/app/MindWork AI Studio/Components/ConfidenceInfo.razor b/app/MindWork AI Studio/Components/ConfidenceInfo.razor index e43a4cbe..7870c9a9 100644 --- a/app/MindWork AI Studio/Components/ConfidenceInfo.razor +++ b/app/MindWork AI Studio/Components/ConfidenceInfo.razor @@ -1,7 +1,7 @@ @using AIStudio.Provider
- - @if (this.Mode is ConfidenceInfoMode.ICON) + + @if (this.Mode is PopoverTriggerMode.ICON) { } @@ -20,7 +20,7 @@ Confidence Card - + Description diff --git a/app/MindWork AI Studio/Components/ConfidenceInfo.razor.cs b/app/MindWork AI Studio/Components/ConfidenceInfo.razor.cs index a541b273..3bad56ea 100644 --- a/app/MindWork AI Studio/Components/ConfidenceInfo.razor.cs +++ b/app/MindWork AI Studio/Components/ConfidenceInfo.razor.cs @@ -8,7 +8,7 @@ namespace AIStudio.Components; public partial class ConfidenceInfo : ComponentBase, IMessageBusReceiver, IDisposable { [Parameter] - public ConfidenceInfoMode Mode { get; set; } = ConfidenceInfoMode.BUTTON; + public PopoverTriggerMode Mode { get; set; } = PopoverTriggerMode.BUTTON; [Parameter] public LLMProviders LLMProvider { get; set; } @@ -59,10 +59,12 @@ public partial class ConfidenceInfo : ComponentBase, IMessageBusReceiver, IDispo private string GetCurrentConfidenceColor() => $"color: {this.currentConfidence.Level.GetColor(this.SettingsManager)};"; - private string GetPopoverStyle() => $"border-color: {this.currentConfidence.Level.GetColor(this.SettingsManager)}; max-width: calc(35vw);"; + private string GetPopoverStyle() => $"border-color: {this.currentConfidence.Level.GetColor(this.SettingsManager)};"; #region Implementation of IMessageBusReceiver + public string ComponentName => nameof(ConfidenceInfo); + public Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) { switch (triggeredEvent) diff --git a/app/MindWork AI Studio/Components/ConfigurationBase.razor.cs b/app/MindWork AI Studio/Components/ConfigurationBase.razor.cs index 6951c5e0..64217ffe 100644 --- a/app/MindWork AI Studio/Components/ConfigurationBase.razor.cs +++ b/app/MindWork AI Studio/Components/ConfigurationBase.razor.cs @@ -57,6 +57,8 @@ public partial class ConfigurationBase : ComponentBase, IMessageBusReceiver, IDi #region Implementation of IMessageBusReceiver + public string ComponentName => nameof(ConfigurationBase); + public Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, TMsg? data) { switch (triggeredEvent) diff --git a/app/MindWork AI Studio/Components/ConfigurationProviderSelection.razor.cs b/app/MindWork AI Studio/Components/ConfigurationProviderSelection.razor.cs index 7e93e76c..a1e60c87 100644 --- a/app/MindWork AI Studio/Components/ConfigurationProviderSelection.razor.cs +++ b/app/MindWork AI Studio/Components/ConfigurationProviderSelection.razor.cs @@ -1,3 +1,5 @@ +using System.Diagnostics.CodeAnalysis; + using AIStudio.Provider; using AIStudio.Settings; @@ -47,8 +49,12 @@ public partial class ConfigurationProviderSelection : ComponentBase, IMessageBus #endregion + [SuppressMessage("Usage", "MWAIS0001:Direct access to `Providers` is not allowed")] private IEnumerable> FilteredData() { + if(this.Component is not Tools.Components.NONE and not Tools.Components.APP_SETTINGS) + yield return new("Use app default", string.Empty); + var minimumLevel = this.SettingsManager.GetMinimumConfidenceLevel(this.Component); foreach (var providerId in this.Data) { @@ -60,6 +66,8 @@ public partial class ConfigurationProviderSelection : ComponentBase, IMessageBus #region Implementation of IMessageBusReceiver + public string ComponentName => nameof(ConfigurationProviderSelection); + public async Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) { switch (triggeredEvent) diff --git a/app/MindWork AI Studio/Components/DataSourceAgentSelected.cs b/app/MindWork AI Studio/Components/DataSourceAgentSelected.cs new file mode 100644 index 00000000..5108596b --- /dev/null +++ b/app/MindWork AI Studio/Components/DataSourceAgentSelected.cs @@ -0,0 +1,25 @@ +using AIStudio.Agents; +using AIStudio.Settings; + +namespace AIStudio.Components; + +/// +/// A data structure to combine the data source and the underlying AI decision. +/// +public sealed class DataSourceAgentSelected +{ + /// + /// The data source. + /// + public required IDataSource DataSource { get; set; } + + /// + /// The AI decision, which led to the selection of the data source. + /// + public required SelectedDataSource AIDecision { get; set; } + + /// + /// Indicates whether the data source is part of the final selection for the RAG process. + /// + public bool Selected { get; set; } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/DataSourceSelection.razor b/app/MindWork AI Studio/Components/DataSourceSelection.razor new file mode 100644 index 00000000..f99aa6fa --- /dev/null +++ b/app/MindWork AI Studio/Components/DataSourceSelection.razor @@ -0,0 +1,181 @@ +@using AIStudio.Settings + +@if (this.SelectionMode is DataSourceSelectionMode.SELECTION_MODE) +{ +
+ + @if (this.PopoverTriggerMode is PopoverTriggerMode.ICON) + { + + } + else + { + + Select data + + } + + + + + + + + + Data Source Selection + + + + + + + + + @if (this.waitingForDataSources) + { + + + + } + else if (this.SettingsManager.ConfigurationData.DataSources.Count == 0) + { + + You haven't configured any data sources. To grant the AI access to your data, you need to + add such a source. However, if you wish to use data from your device, you first have to set up + a so-called embedding. This embedding is necessary so the AI can effectively search your data, + find and retrieve the correct information required for each task. In addition to local data, + you can also incorporate your company's data. To do so, your company must provide the data through + an ERI (External Retrieval Interface). + + + + + Manage Data Sources + + + Read more about ERI + + + } + else if (this.showDataSourceSelection) + { + + @if (this.areDataSourcesEnabled) + { + + + @if (this.SettingsManager.ConfigurationData.AgentRetrievalContextValidation.EnableRetrievalContextValidation) + { + + } + + @switch (this.aiBasedSourceSelection) + { + case true when this.availableDataSources.Count == 0: + + Your data sources cannot be used with the LLM provider you selected due to data privacy, or they are currently unavailable. + + break; + + case true when this.DataSourcesAISelected.Count == 0: + + The AI evaluates each of your inputs to determine whether and which data sources are necessary. Currently, the AI has not selected any source. + + break; + + case false when this.availableDataSources.Count == 0: + + Your data sources cannot be used with the LLM provider you selected due to data privacy, or they are currently unavailable. + + break; + + case false: + + + @foreach (var source in this.availableDataSources) + { + + @source.Name + + } + + + break; + + case true: + + + + @foreach (var source in this.availableDataSources) + { + + @source.Name + + } + + + + + @foreach (var source in this.DataSourcesAISelected) + { + + + + @source.DataSource.Name + + + + + @(this.GetAIReasoning(source)) + + + + } + + + + break; + } + } + } + + + + Close + + + + +
+} +else if (this.SelectionMode is DataSourceSelectionMode.CONFIGURATION_MODE) +{ + + + Data Source Selection + + @if (!string.IsNullOrWhiteSpace(this.ConfigurationHeaderMessage)) + { + + @this.ConfigurationHeaderMessage + + } + + + @if (this.areDataSourcesEnabled) + { + + + + + @foreach (var source in this.availableDataSources) + { + + @source.Name + + } + + + } + +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/DataSourceSelection.razor.cs b/app/MindWork AI Studio/Components/DataSourceSelection.razor.cs new file mode 100644 index 00000000..22d4b0cb --- /dev/null +++ b/app/MindWork AI Studio/Components/DataSourceSelection.razor.cs @@ -0,0 +1,295 @@ +using AIStudio.Dialogs.Settings; +using AIStudio.Settings; +using AIStudio.Settings.DataModel; +using AIStudio.Tools.Services; + +using Microsoft.AspNetCore.Components; + +using DialogOptions = AIStudio.Dialogs.DialogOptions; + +namespace AIStudio.Components; + +public partial class DataSourceSelection : ComponentBase, IMessageBusReceiver, IDisposable +{ + [Parameter] + public DataSourceSelectionMode SelectionMode { get; set; } = DataSourceSelectionMode.SELECTION_MODE; + + [Parameter] + public PopoverTriggerMode PopoverTriggerMode { get; set; } = PopoverTriggerMode.BUTTON; + + [Parameter] + public string PopoverButtonClasses { get; set; } = string.Empty; + + [Parameter] + public required AIStudio.Settings.Provider LLMProvider { get; set; } + + [Parameter] + public required DataSourceOptions DataSourceOptions { get; set; } + + [Parameter] + public EventCallback DataSourceOptionsChanged { get; set; } + + [Parameter] + public IReadOnlyList DataSourcesAISelected { get; set; } = []; + + [Parameter] + public string ConfigurationHeaderMessage { get; set; } = string.Empty; + + [Parameter] + public bool AutoSaveAppSettings { get; set; } + + [Inject] + private SettingsManager SettingsManager { get; init; } = null!; + + [Inject] + private MessageBus MessageBus { get; init; } = null!; + + [Inject] + private DataSourceService DataSourceService { get; init; } = null!; + + [Inject] + private IDialogService DialogService { get; init; } = null!; + + private bool internalChange; + private bool showDataSourceSelection; + private bool waitingForDataSources = true; + private IReadOnlyList availableDataSources = []; + private IReadOnlyCollection selectedDataSources = []; + private bool aiBasedSourceSelection; + private bool aiBasedValidation; + private bool areDataSourcesEnabled; + + #region Overrides of ComponentBase + + protected override async Task OnInitializedAsync() + { + this.MessageBus.RegisterComponent(this); + this.MessageBus.ApplyFilters(this, [], [ Event.COLOR_THEME_CHANGED, Event.RAG_AUTO_DATA_SOURCES_SELECTED ]); + + // + // Load the settings: + // + this.aiBasedSourceSelection = this.DataSourceOptions.AutomaticDataSourceSelection; + this.aiBasedValidation = this.DataSourceOptions.AutomaticValidation; + this.areDataSourcesEnabled = !this.DataSourceOptions.DisableDataSources; + this.waitingForDataSources = this.areDataSourcesEnabled; + + // + // Preselect the data sources. Right now, we cannot filter + // the data sources. Later, when the component is shown, we + // will filter the data sources. + // + // Right before the preselection would be used to kick off the + // RAG process, we will filter the data sources as well. + // + var preselectedSources = new List(this.DataSourceOptions.PreselectedDataSourceIds.Count); + foreach (var preselectedDataSourceId in this.DataSourceOptions.PreselectedDataSourceIds) + { + var dataSource = this.SettingsManager.ConfigurationData.DataSources.FirstOrDefault(ds => ds.Id == preselectedDataSourceId); + if (dataSource is not null) + preselectedSources.Add(dataSource); + } + + this.selectedDataSources = preselectedSources; + await base.OnInitializedAsync(); + } + + protected override async Task OnParametersSetAsync() + { + if (!this.internalChange) + { + this.aiBasedSourceSelection = this.DataSourceOptions.AutomaticDataSourceSelection; + this.aiBasedValidation = this.DataSourceOptions.AutomaticValidation; + this.areDataSourcesEnabled = !this.DataSourceOptions.DisableDataSources; + } + + switch (this.SelectionMode) + { + // + // In selection mode, we have to load & filter the data sources + // when the component is shown: + // + case DataSourceSelectionMode.SELECTION_MODE: + + // + // For external changes, we have to reload & filter + // the data sources: + // + if (this.showDataSourceSelection && !this.internalChange) + await this.LoadAndApplyFilters(); + else + this.internalChange = false; + + break; + + // + // In configuration mode, we have to load all data sources: + // + case DataSourceSelectionMode.CONFIGURATION_MODE: + this.availableDataSources = this.SettingsManager.ConfigurationData.DataSources; + break; + } + + await base.OnParametersSetAsync(); + } + + #endregion + + private async Task OpenSettingsDialog() + { + this.showDataSourceSelection = false; + this.StateHasChanged(); + + var dialogParameters = new DialogParameters(); + var dialogReference = await this.DialogService.ShowAsync(null, dialogParameters, DialogOptions.FULLSCREEN); + await dialogReference.Result; + await this.LoadAndApplyFilters(); + + this.showDataSourceSelection = true; + this.StateHasChanged(); + } + + private SelectionMode GetListSelectionMode() => this.aiBasedSourceSelection ? MudBlazor.SelectionMode.SingleSelection : MudBlazor.SelectionMode.MultiSelection; + + private IReadOnlyCollection GetSelectedDataSourcesWithAI() => this.DataSourcesAISelected.Where(n => n.Selected).ToList(); + + private string GetAIReasoning(DataSourceAgentSelected source) => $"AI reasoning (confidence {source.AIDecision.Confidence:P0}): {source.AIDecision.Reason}"; + + public void ChangeOptionWithoutSaving(DataSourceOptions options, IReadOnlyList? aiSelectedDataSources = null) + { + this.DataSourceOptions = options; + this.DataSourcesAISelected = aiSelectedDataSources ?? []; + + this.aiBasedSourceSelection = this.DataSourceOptions.AutomaticDataSourceSelection; + this.aiBasedValidation = this.DataSourceOptions.AutomaticValidation; + this.areDataSourcesEnabled = !this.DataSourceOptions.DisableDataSources; + this.selectedDataSources = this.SettingsManager.ConfigurationData.DataSources.Where(ds => this.DataSourceOptions.PreselectedDataSourceIds.Contains(ds.Id)).ToList(); + this.waitingForDataSources = false; + + // + // Remark: We do not apply the filters here. This is done later + // when either the parameters are changed or just before the + // RAG process is started (outside of this component). + // + // In fact, when we apply the filters here, multiple calls + // to the filter method would be made. We would get conflicts. + // + } + + public bool IsVisible => this.showDataSourceSelection; + + public void Hide() + { + this.showDataSourceSelection = false; + this.StateHasChanged(); + } + + private async Task LoadAndApplyFilters() + { + if(this.DataSourceOptions.DisableDataSources) + return; + + this.waitingForDataSources = true; + this.StateHasChanged(); + + // Load the data sources: + var sources = await this.DataSourceService.GetDataSources(this.LLMProvider, this.selectedDataSources); + this.availableDataSources = sources.AllowedDataSources; + this.selectedDataSources = sources.SelectedDataSources; + this.waitingForDataSources = false; + this.StateHasChanged(); + } + + private async Task EnabledChanged(bool state) + { + this.areDataSourcesEnabled = state; + this.DataSourceOptions.DisableDataSources = !this.areDataSourcesEnabled; + + await this.LoadAndApplyFilters(); + await this.OptionsChanged(); + this.StateHasChanged(); + } + + private async Task AutoModeChanged(bool state) + { + this.aiBasedSourceSelection = state; + this.DataSourceOptions.AutomaticDataSourceSelection = this.aiBasedSourceSelection; + + await this.OptionsChanged(); + } + + private async Task ValidationModeChanged(bool state) + { + this.aiBasedValidation = state; + this.DataSourceOptions.AutomaticValidation = this.aiBasedValidation; + + await this.OptionsChanged(); + } + + private async Task SelectionChanged(IReadOnlyCollection? chosenDataSources) + { + this.selectedDataSources = chosenDataSources ?? []; + this.DataSourceOptions.PreselectedDataSourceIds = this.selectedDataSources.Select(ds => ds.Id).ToList(); + + await this.OptionsChanged(); + } + + private async Task OptionsChanged() + { + this.internalChange = true; + + await this.DataSourceOptionsChanged.InvokeAsync(this.DataSourceOptions); + + if(this.AutoSaveAppSettings) + await this.SettingsManager.StoreSettings(); + } + + private async Task ToggleDataSourceSelection() + { + this.showDataSourceSelection = !this.showDataSourceSelection; + if (this.showDataSourceSelection) + await this.LoadAndApplyFilters(); + } + + private void HideDataSourceSelection() => this.showDataSourceSelection = false; + + #region Implementation of IMessageBusReceiver + + public string ComponentName => nameof(ConfidenceInfo); + + public Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) + { + switch (triggeredEvent) + { + case Event.COLOR_THEME_CHANGED: + this.showDataSourceSelection = false; + this.StateHasChanged(); + break; + + case Event.RAG_AUTO_DATA_SOURCES_SELECTED: + if(data is IReadOnlyList aiSelectedDataSources) + this.DataSourcesAISelected = aiSelectedDataSources; + + this.StateHasChanged(); + break; + } + + return Task.CompletedTask; + } + + public Task ProcessMessageWithResult(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data) + { + return Task.FromResult(default); + } + + #endregion + + #region Implementation of IDisposable + + public void Dispose() + { + this.MessageBus.Unregister(this); + } + + #endregion +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/DataSourceSelectionMode.cs b/app/MindWork AI Studio/Components/DataSourceSelectionMode.cs new file mode 100644 index 00000000..e10a0136 --- /dev/null +++ b/app/MindWork AI Studio/Components/DataSourceSelectionMode.cs @@ -0,0 +1,23 @@ +namespace AIStudio.Components; + +public enum DataSourceSelectionMode +{ + /// + /// The user is selecting data sources for, e.g., the chat. + /// + /// + /// In this case, we have to filter the data sources based on the + /// selected provider and check security requirements. + /// + SELECTION_MODE, + + /// + /// The user is configuring the default data sources, e.g., for the chat. + /// + /// + /// In this case, all data sources are available for selection. + /// They get filtered later based on the selected provider and + /// security requirements. + /// + CONFIGURATION_MODE, +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/EnumSelection.razor b/app/MindWork AI Studio/Components/EnumSelection.razor index 84fd6130..bd5bc08a 100644 --- a/app/MindWork AI Studio/Components/EnumSelection.razor +++ b/app/MindWork AI Studio/Components/EnumSelection.razor @@ -12,6 +12,6 @@ @if (this.AllowOther && this.Value.Equals(this.OtherValue)) { - + } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/InnerScrolling.razor b/app/MindWork AI Studio/Components/InnerScrolling.razor index 5a2da661..6905bf2d 100644 --- a/app/MindWork AI Studio/Components/InnerScrolling.razor +++ b/app/MindWork AI Studio/Components/InnerScrolling.razor @@ -7,17 +7,17 @@ @this.HeaderContent
} -
+
@this.ChildContent -
+
 
@if (this.FooterContent is not null) { - + @this.FooterContent } diff --git a/app/MindWork AI Studio/Components/InnerScrolling.razor.cs b/app/MindWork AI Studio/Components/InnerScrolling.razor.cs index 126317cd..29f4847b 100644 --- a/app/MindWork AI Studio/Components/InnerScrolling.razor.cs +++ b/app/MindWork AI Studio/Components/InnerScrolling.razor.cs @@ -9,14 +9,6 @@ public partial class InnerScrolling : MSGComponentBase [Parameter] public bool FillEntireHorizontalSpace { get; set; } - /// - /// Set the height of anything above the scrolling content; usually a header. - /// What we do is calc(100vh - HeaderHeight). Means, you can use multiple measures like - /// 230px - 3em. Default is 3em. - /// - [Parameter] - public string HeaderHeight { get; set; } = "3em"; - [Parameter] public RenderFragment? HeaderContent { get; set; } @@ -34,6 +26,9 @@ public partial class InnerScrolling : MSGComponentBase [Parameter] public string? MinWidth { get; set; } + + [Parameter] + public string Style { get; set; } = string.Empty; [CascadingParameter] private MainLayout MainLayout { get; set; } = null!; @@ -55,6 +50,8 @@ public partial class InnerScrolling : MSGComponentBase #region Overrides of MSGComponentBase + public override string ComponentName => nameof(InnerScrolling); + public override Task ProcessIncomingMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) where T : default { switch (triggeredEvent) @@ -74,12 +71,14 @@ public partial class InnerScrolling : MSGComponentBase #endregion - private string MinWidthStyle => string.IsNullOrWhiteSpace(this.MinWidth) ? string.Empty : $"min-width: {this.MinWidth};"; + private string MinWidthStyle => string.IsNullOrWhiteSpace(this.MinWidth) ? string.Empty : $"min-width: {this.MinWidth}; "; + + private string TerminatedStyles => string.IsNullOrWhiteSpace(this.Style) ? string.Empty : $"{this.Style}; "; - private string Styles => this.FillEntireHorizontalSpace ? $"height: calc(100vh - {this.HeaderHeight} - {this.MainLayout.AdditionalHeight}); overflow-x: auto; min-width: 0; {this.MinWidthStyle}" : $"height: calc(100vh - {this.HeaderHeight} - {this.MainLayout.AdditionalHeight}); flex-shrink: 0; {this.MinWidthStyle}"; - private string Classes => this.FillEntireHorizontalSpace ? $"{this.Class} d-flex flex-column flex-grow-1" : $"{this.Class} d-flex flex-column"; + private string Styles => $"flex-grow: 1; overflow: hidden; {this.TerminatedStyles}{this.MinWidthStyle}"; + public async Task ScrollToBottom() { await this.AnchorAfterChildContent.ScrollIntoViewAsync(this.JsRuntime); diff --git a/app/MindWork AI Studio/Components/MSGComponentBase.cs b/app/MindWork AI Studio/Components/MSGComponentBase.cs index 940ec78e..4dddb57d 100644 --- a/app/MindWork AI Studio/Components/MSGComponentBase.cs +++ b/app/MindWork AI Studio/Components/MSGComponentBase.cs @@ -24,6 +24,8 @@ public abstract class MSGComponentBase : ComponentBase, IDisposable, IMessageBus #region Implementation of IMessageBusReceiver + public abstract string ComponentName { get; } + public Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) { switch (triggeredEvent) diff --git a/app/MindWork AI Studio/Components/MudTextList.razor.cs b/app/MindWork AI Studio/Components/MudTextList.razor.cs index 551878b0..46cde417 100644 --- a/app/MindWork AI Studio/Components/MudTextList.razor.cs +++ b/app/MindWork AI Studio/Components/MudTextList.razor.cs @@ -14,7 +14,7 @@ public partial class MudTextList : ComponentBase public string Icon { get; set; } = Icons.Material.Filled.CheckCircle; [Parameter] - public string Class { get; set; } = ""; + public string Class { get; set; } = string.Empty; private string Classes => $"mud-text-list {this.Class}"; } diff --git a/app/MindWork AI Studio/Components/ConfidenceInfoMode.cs b/app/MindWork AI Studio/Components/PopoverTriggerMode.cs similarity index 63% rename from app/MindWork AI Studio/Components/ConfidenceInfoMode.cs rename to app/MindWork AI Studio/Components/PopoverTriggerMode.cs index d7e63da6..c122e409 100644 --- a/app/MindWork AI Studio/Components/ConfidenceInfoMode.cs +++ b/app/MindWork AI Studio/Components/PopoverTriggerMode.cs @@ -1,6 +1,6 @@ namespace AIStudio.Components; -public enum ConfidenceInfoMode +public enum PopoverTriggerMode { BUTTON, ICON, diff --git a/app/MindWork AI Studio/Components/PreviewAlpha.razor b/app/MindWork AI Studio/Components/PreviewAlpha.razor index 99f9d844..b1b629d8 100644 --- a/app/MindWork AI Studio/Components/PreviewAlpha.razor +++ b/app/MindWork AI Studio/Components/PreviewAlpha.razor @@ -1,4 +1,4 @@ - + Alpha diff --git a/app/MindWork AI Studio/Components/PreviewAlpha.razor.cs b/app/MindWork AI Studio/Components/PreviewAlpha.razor.cs index 62466852..deb962c4 100644 --- a/app/MindWork AI Studio/Components/PreviewAlpha.razor.cs +++ b/app/MindWork AI Studio/Components/PreviewAlpha.razor.cs @@ -2,4 +2,10 @@ using Microsoft.AspNetCore.Components; namespace AIStudio.Components; -public partial class PreviewAlpha : ComponentBase; \ No newline at end of file +public partial class PreviewAlpha : ComponentBase +{ + [Parameter] + public bool ApplyInnerScrollingFix { get; set; } + + private string Classes => this.ApplyInnerScrollingFix ? "InnerScrollingFix" : string.Empty; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/PreviewBeta.razor b/app/MindWork AI Studio/Components/PreviewBeta.razor index cd6b3c65..dd54225e 100644 --- a/app/MindWork AI Studio/Components/PreviewBeta.razor +++ b/app/MindWork AI Studio/Components/PreviewBeta.razor @@ -1,4 +1,4 @@ - + Beta diff --git a/app/MindWork AI Studio/Components/PreviewBeta.razor.cs b/app/MindWork AI Studio/Components/PreviewBeta.razor.cs index a5064b60..d8fee758 100644 --- a/app/MindWork AI Studio/Components/PreviewBeta.razor.cs +++ b/app/MindWork AI Studio/Components/PreviewBeta.razor.cs @@ -2,4 +2,10 @@ using Microsoft.AspNetCore.Components; namespace AIStudio.Components; -public partial class PreviewBeta : ComponentBase; \ No newline at end of file +public partial class PreviewBeta : ComponentBase +{ + [Parameter] + public bool ApplyInnerScrollingFix { get; set; } + + private string Classes => this.ApplyInnerScrollingFix ? "InnerScrollingFix" : string.Empty; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/PreviewExperimental.razor b/app/MindWork AI Studio/Components/PreviewExperimental.razor index 59e6651a..bedc9e4f 100644 --- a/app/MindWork AI Studio/Components/PreviewExperimental.razor +++ b/app/MindWork AI Studio/Components/PreviewExperimental.razor @@ -1,4 +1,4 @@ - + Experimental diff --git a/app/MindWork AI Studio/Components/PreviewExperimental.razor.cs b/app/MindWork AI Studio/Components/PreviewExperimental.razor.cs index c66fa730..0588d489 100644 --- a/app/MindWork AI Studio/Components/PreviewExperimental.razor.cs +++ b/app/MindWork AI Studio/Components/PreviewExperimental.razor.cs @@ -2,4 +2,10 @@ using Microsoft.AspNetCore.Components; namespace AIStudio.Components; -public partial class PreviewExperimental : ComponentBase; \ No newline at end of file +public partial class PreviewExperimental : ComponentBase +{ + [Parameter] + public bool ApplyInnerScrollingFix { get; set; } + + private string Classes => this.ApplyInnerScrollingFix ? "InnerScrollingFix" : string.Empty; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/PreviewPrototype.razor b/app/MindWork AI Studio/Components/PreviewPrototype.razor index f645e0ca..9aa8bbc0 100644 --- a/app/MindWork AI Studio/Components/PreviewPrototype.razor +++ b/app/MindWork AI Studio/Components/PreviewPrototype.razor @@ -1,4 +1,4 @@ - + Prototype diff --git a/app/MindWork AI Studio/Components/PreviewPrototype.razor.cs b/app/MindWork AI Studio/Components/PreviewPrototype.razor.cs index 573e2fd0..3ceab4d1 100644 --- a/app/MindWork AI Studio/Components/PreviewPrototype.razor.cs +++ b/app/MindWork AI Studio/Components/PreviewPrototype.razor.cs @@ -2,4 +2,10 @@ using Microsoft.AspNetCore.Components; namespace AIStudio.Components; -public partial class PreviewPrototype : ComponentBase; \ No newline at end of file +public partial class PreviewPrototype : ComponentBase +{ + [Parameter] + public bool ApplyInnerScrollingFix { get; set; } + + private string Classes => this.ApplyInnerScrollingFix ? "InnerScrollingFix" : string.Empty; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/PreviewReleaseCandidate.razor b/app/MindWork AI Studio/Components/PreviewReleaseCandidate.razor index 44b51084..86954ddd 100644 --- a/app/MindWork AI Studio/Components/PreviewReleaseCandidate.razor +++ b/app/MindWork AI Studio/Components/PreviewReleaseCandidate.razor @@ -1,4 +1,4 @@ - + Release Candidate diff --git a/app/MindWork AI Studio/Components/PreviewReleaseCandidate.razor.cs b/app/MindWork AI Studio/Components/PreviewReleaseCandidate.razor.cs index 1d22d17e..249f1f35 100644 --- a/app/MindWork AI Studio/Components/PreviewReleaseCandidate.razor.cs +++ b/app/MindWork AI Studio/Components/PreviewReleaseCandidate.razor.cs @@ -2,4 +2,10 @@ using Microsoft.AspNetCore.Components; namespace AIStudio.Components; -public partial class PreviewReleaseCandidate : ComponentBase; \ No newline at end of file +public partial class PreviewReleaseCandidate : ComponentBase +{ + [Parameter] + public bool ApplyInnerScrollingFix { get; set; } + + private string Classes => this.ApplyInnerScrollingFix ? "InnerScrollingFix" : string.Empty; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/ProfileSelection.razor b/app/MindWork AI Studio/Components/ProfileSelection.razor index a832ec60..f4acf35a 100644 --- a/app/MindWork AI Studio/Components/ProfileSelection.razor +++ b/app/MindWork AI Studio/Components/ProfileSelection.razor @@ -1,5 +1,5 @@ - - + + @foreach (var profile in this.SettingsManager.ConfigurationData.Profiles.GetAllProfiles()) { diff --git a/app/MindWork AI Studio/Components/ProfileSelection.razor.cs b/app/MindWork AI Studio/Components/ProfileSelection.razor.cs index 55f2fa99..d2b41a57 100644 --- a/app/MindWork AI Studio/Components/ProfileSelection.razor.cs +++ b/app/MindWork AI Studio/Components/ProfileSelection.razor.cs @@ -14,11 +14,14 @@ public partial class ProfileSelection : ComponentBase [Parameter] public string MarginLeft { get; set; } = "ml-3"; + + [Parameter] + public string MarginRight { get; set; } = string.Empty; [Inject] private SettingsManager SettingsManager { get; init; } = null!; - private string MarginClass => $"{this.MarginLeft}"; + private string MarginClass => $"{this.MarginLeft} {this.MarginRight}"; private async Task SelectionChanged(Profile profile) { diff --git a/app/MindWork AI Studio/Components/ProviderSelection.razor b/app/MindWork AI Studio/Components/ProviderSelection.razor index 3ac64b96..9082f016 100644 --- a/app/MindWork AI Studio/Components/ProviderSelection.razor +++ b/app/MindWork AI Studio/Components/ProviderSelection.razor @@ -1,6 +1,6 @@ @using AIStudio.Settings - + @foreach (var provider in this.GetAvailableProviders()) { diff --git a/app/MindWork AI Studio/Components/ProviderSelection.razor.cs b/app/MindWork AI Studio/Components/ProviderSelection.razor.cs index 927c1d62..66158211 100644 --- a/app/MindWork AI Studio/Components/ProviderSelection.razor.cs +++ b/app/MindWork AI Studio/Components/ProviderSelection.razor.cs @@ -1,3 +1,5 @@ +using System.Diagnostics.CodeAnalysis; + using AIStudio.Assistants; using AIStudio.Provider; using AIStudio.Settings; @@ -9,7 +11,7 @@ namespace AIStudio.Components; public partial class ProviderSelection : ComponentBase { [CascadingParameter] - public AssistantBase? AssistantBase { get; set; } + public AssistantBase? AssistantBase { get; set; } [Parameter] public AIStudio.Settings.Provider ProviderSettings { get; set; } @@ -29,6 +31,7 @@ public partial class ProviderSelection : ComponentBase await this.ProviderSettingsChanged.InvokeAsync(provider); } + [SuppressMessage("Usage", "MWAIS0001:Direct access to `Providers` is not allowed")] private IEnumerable GetAvailableProviders() { var minimumLevel = this.SettingsManager.GetMinimumConfidenceLevel(this.AssistantBase?.Component ?? Tools.Components.NONE); diff --git a/app/MindWork AI Studio/Components/ReadWebContent.razor b/app/MindWork AI Studio/Components/ReadWebContent.razor index 1d83309c..9cb451b2 100644 --- a/app/MindWork AI Studio/Components/ReadWebContent.razor +++ b/app/MindWork AI Studio/Components/ReadWebContent.razor @@ -2,7 +2,7 @@ @if (this.showWebContentReader) { - + diff --git a/app/MindWork AI Studio/Components/ReadWebContent.razor.cs b/app/MindWork AI Studio/Components/ReadWebContent.razor.cs index aebe7ef4..6cf40701 100644 --- a/app/MindWork AI Studio/Components/ReadWebContent.razor.cs +++ b/app/MindWork AI Studio/Components/ReadWebContent.razor.cs @@ -59,11 +59,7 @@ public partial class ReadWebContent : ComponentBase if(this.PreselectContentCleanerAgent) this.useContentCleanerAgent = true; - if (this.SettingsManager.ConfigurationData.TextContentCleaner.PreselectAgentOptions) - this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.TextContentCleaner.PreselectedAgentProvider); - else - this.providerSettings = this.ProviderSettings; - + this.ProviderSettings = this.SettingsManager.GetPreselectedProvider(Tools.Components.AGENT_TEXT_CONTENT_CLEANER, this.ProviderSettings.Id, true); await base.OnInitializedAsync(); } diff --git a/app/MindWork AI Studio/Components/SelectDirectory.razor b/app/MindWork AI Studio/Components/SelectDirectory.razor index 95f09d69..29a0fc8f 100644 --- a/app/MindWork AI Studio/Components/SelectDirectory.razor +++ b/app/MindWork AI Studio/Components/SelectDirectory.razor @@ -4,6 +4,7 @@ Text="@this.Directory" Label="@this.Label" ReadOnly="@true" + Validation="@this.Validation" Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.Folder" UserAttributes="@SPELLCHECK_ATTRIBUTES" diff --git a/app/MindWork AI Studio/Components/SelectDirectory.razor.cs b/app/MindWork AI Studio/Components/SelectDirectory.razor.cs index ec4f6cd3..a4ebbf8b 100644 --- a/app/MindWork AI Studio/Components/SelectDirectory.razor.cs +++ b/app/MindWork AI Studio/Components/SelectDirectory.razor.cs @@ -1,4 +1,5 @@ using AIStudio.Settings; +using AIStudio.Tools.Services; using Microsoft.AspNetCore.Components; @@ -21,6 +22,9 @@ public partial class SelectDirectory : ComponentBase [Parameter] public string DirectoryDialogTitle { get; set; } = "Select Directory"; + [Parameter] + public Func Validation { get; set; } = _ => null; + [Inject] private SettingsManager SettingsManager { get; init; } = null!; diff --git a/app/MindWork AI Studio/Components/SelectFile.razor b/app/MindWork AI Studio/Components/SelectFile.razor new file mode 100644 index 00000000..34842360 --- /dev/null +++ b/app/MindWork AI Studio/Components/SelectFile.razor @@ -0,0 +1,17 @@ + + + + + Choose File + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/SelectFile.razor.cs b/app/MindWork AI Studio/Components/SelectFile.razor.cs new file mode 100644 index 00000000..d4a03ad5 --- /dev/null +++ b/app/MindWork AI Studio/Components/SelectFile.razor.cs @@ -0,0 +1,64 @@ +using AIStudio.Settings; +using AIStudio.Tools.Services; + +using Microsoft.AspNetCore.Components; + +namespace AIStudio.Components; + +public partial class SelectFile : ComponentBase +{ + [Parameter] + public string File { get; set; } = string.Empty; + + [Parameter] + public EventCallback FileChanged { get; set; } + + [Parameter] + public bool Disabled { get; set; } + + [Parameter] + public string Label { get; set; } = string.Empty; + + [Parameter] + public string FileDialogTitle { get; set; } = "Select File"; + + [Parameter] + public Func Validation { get; set; } = _ => null; + + [Inject] + private SettingsManager SettingsManager { get; init; } = null!; + + [Inject] + public RustService RustService { get; set; } = null!; + + [Inject] + protected ILogger Logger { get; init; } = null!; + + private static readonly Dictionary SPELLCHECK_ATTRIBUTES = new(); + + #region Overrides of ComponentBase + + protected override async Task OnInitializedAsync() + { + // Configure the spellchecking for the instance name input: + this.SettingsManager.InjectSpellchecking(SPELLCHECK_ATTRIBUTES); + await base.OnInitializedAsync(); + } + + #endregion + + private void InternalFileChanged(string file) + { + this.File = file; + this.FileChanged.InvokeAsync(file); + } + + private async Task OpenFileDialog() + { + var response = await this.RustService.SelectFile(this.FileDialogTitle, string.IsNullOrWhiteSpace(this.File) ? null : this.File); + this.Logger.LogInformation($"The user selected the file '{response.SelectedFilePath}'."); + + if (!response.UserCancelled) + this.InternalFileChanged(response.SelectedFilePath); + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelAgenda.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelAgenda.razor deleted file mode 100644 index 6412d159..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelAgenda.razor +++ /dev/null @@ -1,32 +0,0 @@ -@using AIStudio.Settings -@inherits SettingsPanelBase - - - - - - - - - - - - - - - - - - - - - - @if (this.SettingsManager.ConfigurationData.Agenda.PreselectedTargetLanguage is CommonLanguages.OTHER) - { - - } - - - - - \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelAgenda.razor.cs b/app/MindWork AI Studio/Components/Settings/SettingsPanelAgenda.razor.cs deleted file mode 100644 index 82368a5c..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelAgenda.razor.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace AIStudio.Components.Settings; - -public partial class SettingsPanelAgenda : SettingsPanelBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentContentCleaner.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentContentCleaner.razor index 6bdd3770..8da6ff3e 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentContentCleaner.razor +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentContentCleaner.razor @@ -6,7 +6,7 @@ Use Case: this agent is used to clean up text content. It extracts the main content, removes advertisements and other irrelevant things, and attempts to convert relative links into absolute links so that they can be used. - + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentDataSourceSelection.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentDataSourceSelection.razor new file mode 100644 index 00000000..f3c1df20 --- /dev/null +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentDataSourceSelection.razor @@ -0,0 +1,11 @@ +@inherits SettingsPanelBase + + + + + Use Case: this agent is used to select the appropriate data sources for the current prompt. + + + + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentDataSourceSelection.razor.cs b/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentDataSourceSelection.razor.cs new file mode 100644 index 00000000..1c191a55 --- /dev/null +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentDataSourceSelection.razor.cs @@ -0,0 +1,3 @@ +namespace AIStudio.Components.Settings; + +public partial class SettingsPanelAgentDataSourceSelection : SettingsPanelBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentRetrievalContextValidation.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentRetrievalContextValidation.razor new file mode 100644 index 00000000..7de4ea81 --- /dev/null +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentRetrievalContextValidation.razor @@ -0,0 +1,18 @@ +@inherits SettingsPanelBase + + + + Use Case: this agent is used to validate any retrieval context of any retrieval process. Perhaps there are many of these + retrieval contexts and you want to validate them all. Therefore, you might want to use a cheap and fast LLM for this + job. When using a local or self-hosted LLM, look for a small (e.g. 3B) and fast model. + + + @if (this.SettingsManager.ConfigurationData.AgentRetrievalContextValidation.EnableRetrievalContextValidation) + { + + + + + + } + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentRetrievalContextValidation.razor.cs b/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentRetrievalContextValidation.razor.cs new file mode 100644 index 00000000..aaf0d938 --- /dev/null +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentRetrievalContextValidation.razor.cs @@ -0,0 +1,3 @@ +namespace AIStudio.Components.Settings; + +public partial class SettingsPanelAgentRetrievalContextValidation : SettingsPanelBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelApp.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelApp.razor index 5cdb3263..e67aaf5f 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelApp.razor +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelApp.razor @@ -19,6 +19,6 @@ } } - + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelAssistantBias.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelAssistantBias.razor deleted file mode 100644 index 40f178e2..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelAssistantBias.razor +++ /dev/null @@ -1,29 +0,0 @@ -@using AIStudio.Settings -@using AIStudio.Settings.DataModel -@inherits SettingsPanelBase - - - - - - - - You have learned about @this.SettingsManager.ConfigurationData.BiasOfTheDay.UsedBias.Count out of @BiasCatalog.ALL_BIAS.Count biases. - - - Reset - - - - - - - @if (this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectedTargetLanguage is CommonLanguages.OTHER) - { - - } - - - - - \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelBase.cs b/app/MindWork AI Studio/Components/Settings/SettingsPanelBase.cs index f7f3a1d2..c3384167 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelBase.cs +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelBase.cs @@ -1,4 +1,5 @@ using AIStudio.Settings; +using AIStudio.Tools.Services; using Microsoft.AspNetCore.Components; diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelChat.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelChat.razor index 602af631..8b274405 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelChat.razor +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelChat.razor @@ -1,4 +1,5 @@ @using AIStudio.Settings +@using AIStudio.Settings.DataModel @inherits SettingsPanelBase @@ -9,7 +10,13 @@ - + + + @if (PreviewFeatures.PRE_RAG_2024.IsEnabled(this.SettingsManager)) + { + + + } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelCoding.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelCoding.razor deleted file mode 100644 index 12bf8795..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelCoding.razor +++ /dev/null @@ -1,18 +0,0 @@ -@using AIStudio.Assistants.Coding -@using AIStudio.Settings -@inherits SettingsPanelBase - - - - - - - @if (this.SettingsManager.ConfigurationData.Coding.PreselectedProgrammingLanguage is CommonCodingLanguages.OTHER) - { - - } - - - - - \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelCoding.razor.cs b/app/MindWork AI Studio/Components/Settings/SettingsPanelCoding.razor.cs deleted file mode 100644 index 060a30a6..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelCoding.razor.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace AIStudio.Components.Settings; - -public partial class SettingsPanelCoding : SettingsPanelBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelERIServer.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelERIServer.razor deleted file mode 100644 index 62d2fd0c..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelERIServer.razor +++ /dev/null @@ -1,19 +0,0 @@ -@using AIStudio.Settings -@inherits SettingsPanelBase - - - - - - - - - Most ERI server options can be customized and saved directly in the ERI server assistant. - For this, the ERI server assistant has an auto-save function. - - - - Switch to ERI server assistant - - - \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelERIServer.razor.cs b/app/MindWork AI Studio/Components/Settings/SettingsPanelERIServer.razor.cs deleted file mode 100644 index 0e01ed2f..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelERIServer.razor.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace AIStudio.Components.Settings; - -public partial class SettingsPanelERIServer : SettingsPanelBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelEmbeddings.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelEmbeddings.razor index ea82ce7a..7203ff78 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelEmbeddings.razor +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelEmbeddings.razor @@ -36,7 +36,7 @@ Name Provider Model - Actions + Actions @context.Num @@ -44,16 +44,18 @@ @context.UsedLLMProvider @this.GetEmbeddingProviderModelName(context) - - - Open Dashboard - - - Edit - - - Delete - + + + + Open Dashboard + + + Edit + + + Delete + + diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelEmbeddings.razor.cs b/app/MindWork AI Studio/Components/Settings/SettingsPanelEmbeddings.razor.cs index afa50246..7520e596 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelEmbeddings.razor.cs +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelEmbeddings.razor.cs @@ -21,7 +21,17 @@ public partial class SettingsPanelEmbeddings : SettingsPanelBase var modelName = provider.Model.ToString(); return modelName.Length > MAX_LENGTH ? "[...] " + modelName[^Math.Min(MAX_LENGTH, modelName.Length)..] : modelName; } - + + #region Overrides of ComponentBase + + protected override async Task OnInitializedAsync() + { + await this.UpdateEmbeddingProviders(); + await base.OnInitializedAsync(); + } + + #endregion + private async Task AddEmbeddingProvider() { var dialogParameters = new DialogParameters diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelGrammarSpelling.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelGrammarSpelling.razor deleted file mode 100644 index 73b31ca6..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelGrammarSpelling.razor +++ /dev/null @@ -1,15 +0,0 @@ -@using AIStudio.Settings -@inherits SettingsPanelBase - - - - - - @if (this.SettingsManager.ConfigurationData.GrammarSpelling.PreselectedTargetLanguage is CommonLanguages.OTHER) - { - - } - - - - \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelGrammarSpelling.razor.cs b/app/MindWork AI Studio/Components/Settings/SettingsPanelGrammarSpelling.razor.cs deleted file mode 100644 index b15d58a6..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelGrammarSpelling.razor.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace AIStudio.Components.Settings; - -public partial class SettingsPanelGrammarSpelling : SettingsPanelBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelIconFinder.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelIconFinder.razor deleted file mode 100644 index 76317e92..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelIconFinder.razor +++ /dev/null @@ -1,11 +0,0 @@ -@using AIStudio.Settings -@inherits SettingsPanelBase - - - - - - - - - \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelIconFinder.razor.cs b/app/MindWork AI Studio/Components/Settings/SettingsPanelIconFinder.razor.cs deleted file mode 100644 index e545163b..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelIconFinder.razor.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace AIStudio.Components.Settings; - -public partial class SettingsPanelIconFinder : SettingsPanelBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelJobPostings.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelJobPostings.razor deleted file mode 100644 index b9b56a55..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelJobPostings.razor +++ /dev/null @@ -1,22 +0,0 @@ -@using AIStudio.Settings -@inherits SettingsPanelBase - - - - - - - - - - - - - @if (this.SettingsManager.ConfigurationData.JobPostings.PreselectedTargetLanguage is CommonLanguages.OTHER) - { - - } - - - - \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelJobPostings.razor.cs b/app/MindWork AI Studio/Components/Settings/SettingsPanelJobPostings.razor.cs deleted file mode 100644 index 20ecab68..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelJobPostings.razor.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace AIStudio.Components.Settings; - -public partial class SettingsPanelJobPostings : SettingsPanelBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelLegalCheck.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelLegalCheck.razor deleted file mode 100644 index 00c2f7d4..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelLegalCheck.razor +++ /dev/null @@ -1,14 +0,0 @@ -@using AIStudio.Settings -@inherits SettingsPanelBase - - - - - - - - - - - - \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelLegalCheck.razor.cs b/app/MindWork AI Studio/Components/Settings/SettingsPanelLegalCheck.razor.cs deleted file mode 100644 index 66db4693..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelLegalCheck.razor.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace AIStudio.Components.Settings; - -public partial class SettingsPanelLegalCheck : SettingsPanelBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelMyTasks.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelMyTasks.razor deleted file mode 100644 index 2a443f76..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelMyTasks.razor +++ /dev/null @@ -1,16 +0,0 @@ -@using AIStudio.Settings -@inherits SettingsPanelBase - - - - - - @if (this.SettingsManager.ConfigurationData.MyTasks.PreselectedTargetLanguage is CommonLanguages.OTHER) - { - - } - - - - - \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelMyTasks.razor.cs b/app/MindWork AI Studio/Components/Settings/SettingsPanelMyTasks.razor.cs deleted file mode 100644 index 2c4291dc..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelMyTasks.razor.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace AIStudio.Components.Settings; - -public partial class SettingsPanelMyTasks : SettingsPanelBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelProfiles.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelProfiles.razor index 924eb773..e49390f0 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelProfiles.razor +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelProfiles.razor @@ -23,18 +23,20 @@ # Profile Name - Actions + Actions @context.Num @context.Name - - - Edit - - - Delete - + + + + Edit + + + Delete + + diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelProviders.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelProviders.razor index cd1b4ffb..51db26b4 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelProviders.razor +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelProviders.razor @@ -24,7 +24,7 @@ Instance Name Provider Model - Actions + Actions @context.Num @@ -44,16 +44,18 @@ @("as selected by provider") } - - - Open Dashboard - - - Edit - - - Delete - + + + + Open Dashboard + + + Edit + + + Delete + + diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelProviders.razor.cs b/app/MindWork AI Studio/Components/Settings/SettingsPanelProviders.razor.cs index e2c434fe..0aa3afd0 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelProviders.razor.cs +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelProviders.razor.cs @@ -1,3 +1,5 @@ +using System.Diagnostics.CodeAnalysis; + using AIStudio.Dialogs; using AIStudio.Provider; using AIStudio.Settings; @@ -26,6 +28,7 @@ public partial class SettingsPanelProviders : SettingsPanelBase #endregion + [SuppressMessage("Usage", "MWAIS0001:Direct access to `Providers` is not allowed")] private async Task AddLLMProvider() { var dialogParameters = new DialogParameters @@ -48,6 +51,7 @@ public partial class SettingsPanelProviders : SettingsPanelBase await this.MessageBus.SendMessage(this, Event.CONFIGURATION_CHANGED); } + [SuppressMessage("Usage", "MWAIS0001:Direct access to `Providers` is not allowed")] private async Task EditLLMProvider(AIStudio.Settings.Provider provider) { var dialogParameters = new DialogParameters @@ -82,6 +86,7 @@ public partial class SettingsPanelProviders : SettingsPanelBase await this.MessageBus.SendMessage(this, Event.CONFIGURATION_CHANGED); } + [SuppressMessage("Usage", "MWAIS0001:Direct access to `Providers` is not allowed")] private async Task DeleteLLMProvider(AIStudio.Settings.Provider provider) { var dialogParameters = new DialogParameters @@ -112,6 +117,7 @@ public partial class SettingsPanelProviders : SettingsPanelBase return modelName.Length > MAX_LENGTH ? "[...] " + modelName[^Math.Min(MAX_LENGTH, modelName.Length)..] : modelName; } + [SuppressMessage("Usage", "MWAIS0001:Direct access to `Providers` is not allowed")] private async Task UpdateProviders() { this.AvailableLLMProviders.Clear(); diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelRewrite.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelRewrite.razor deleted file mode 100644 index fe911994..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelRewrite.razor +++ /dev/null @@ -1,17 +0,0 @@ -@using AIStudio.Settings -@inherits SettingsPanelBase - - - - - - @if (this.SettingsManager.ConfigurationData.RewriteImprove.PreselectedTargetLanguage is CommonLanguages.OTHER) - { - - } - - - - - - \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelRewrite.razor.cs b/app/MindWork AI Studio/Components/Settings/SettingsPanelRewrite.razor.cs deleted file mode 100644 index ca72bef5..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelRewrite.razor.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace AIStudio.Components.Settings; - -public partial class SettingsPanelRewrite : SettingsPanelBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelSynonyms.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelSynonyms.razor deleted file mode 100644 index 6468c537..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelSynonyms.razor +++ /dev/null @@ -1,15 +0,0 @@ -@using AIStudio.Settings -@inherits SettingsPanelBase - - - - - - @if (this.SettingsManager.ConfigurationData.Synonyms.PreselectedLanguage is CommonLanguages.OTHER) - { - - } - - - - \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelSynonyms.razor.cs b/app/MindWork AI Studio/Components/Settings/SettingsPanelSynonyms.razor.cs deleted file mode 100644 index c4a9ee40..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelSynonyms.razor.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace AIStudio.Components.Settings; - -public partial class SettingsPanelSynonyms : SettingsPanelBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelTextSummarizer.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelTextSummarizer.razor deleted file mode 100644 index f8afa494..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelTextSummarizer.razor +++ /dev/null @@ -1,24 +0,0 @@ -@using AIStudio.Assistants.TextSummarizer -@using AIStudio.Settings -@inherits SettingsPanelBase - - - - - - - - - @if (this.SettingsManager.ConfigurationData.TextSummarizer.PreselectedTargetLanguage is CommonLanguages.OTHER) - { - - } - - @if(this.SettingsManager.ConfigurationData.TextSummarizer.PreselectedComplexity is Complexity.SCIENTIFIC_LANGUAGE_OTHER_EXPERTS) - { - - } - - - - \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelTextSummarizer.razor.cs b/app/MindWork AI Studio/Components/Settings/SettingsPanelTextSummarizer.razor.cs deleted file mode 100644 index 8eab6d8c..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelTextSummarizer.razor.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace AIStudio.Components.Settings; - -public partial class SettingsPanelTextSummarizer : SettingsPanelBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelTranslation.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelTranslation.razor deleted file mode 100644 index 6ad87762..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelTranslation.razor +++ /dev/null @@ -1,20 +0,0 @@ -@using AIStudio.Settings -@inherits SettingsPanelBase - - - - - - - - - - - @if (this.SettingsManager.ConfigurationData.Translation.PreselectedTargetLanguage is CommonLanguages.OTHER) - { - - } - - - - \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelTranslation.razor.cs b/app/MindWork AI Studio/Components/Settings/SettingsPanelTranslation.razor.cs deleted file mode 100644 index d68b5789..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelTranslation.razor.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace AIStudio.Components.Settings; - -public partial class SettingsPanelTranslation : SettingsPanelBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelWritingEMails.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelWritingEMails.razor deleted file mode 100644 index 0126ecf2..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelWritingEMails.razor +++ /dev/null @@ -1,19 +0,0 @@ -@using AIStudio.Settings -@inherits SettingsPanelBase - - - - - - - - @if (this.SettingsManager.ConfigurationData.EMail.PreselectedTargetLanguage is CommonLanguages.OTHER) - { - - } - - - - - - \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelWritingEMails.razor.cs b/app/MindWork AI Studio/Components/Settings/SettingsPanelWritingEMails.razor.cs deleted file mode 100644 index 5d87b618..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelWritingEMails.razor.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace AIStudio.Components.Settings; - -public partial class SettingsPanelWritingEMails : SettingsPanelBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/TextInfoLine.razor b/app/MindWork AI Studio/Components/TextInfoLine.razor new file mode 100644 index 00000000..5e5de4da --- /dev/null +++ b/app/MindWork AI Studio/Components/TextInfoLine.razor @@ -0,0 +1,19 @@ + + + + @if (this.ShowingCopyButton) + { + + + + } + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/TextInfoLine.razor.cs b/app/MindWork AI Studio/Components/TextInfoLine.razor.cs new file mode 100644 index 00000000..206fae4b --- /dev/null +++ b/app/MindWork AI Studio/Components/TextInfoLine.razor.cs @@ -0,0 +1,51 @@ +using AIStudio.Settings; +using AIStudio.Tools.Services; + +using Microsoft.AspNetCore.Components; + +namespace AIStudio.Components; + +public partial class TextInfoLine : ComponentBase +{ + [Parameter] + public string Label { get; set; } = string.Empty; + + [Parameter] + public string Icon { get; set; } = Icons.Material.Filled.Info; + + [Parameter] + public string Value { get; set; } = string.Empty; + + [Parameter] + public string ClipboardTooltipSubject { get; set; } = "the text"; + + [Parameter] + public bool ShowingCopyButton { get; set; } = true; + + [Inject] + private RustService RustService { get; init; } = null!; + + [Inject] + private ISnackbar Snackbar { get; init; } = null!; + + [Inject] + private SettingsManager SettingsManager { get; init; } = null!; + + #region Overrides of ComponentBase + + protected override async Task OnInitializedAsync() + { + // Configure the spellchecking for the user input: + this.SettingsManager.InjectSpellchecking(USER_INPUT_ATTRIBUTES); + + await base.OnInitializedAsync(); + } + + #endregion + + private static readonly Dictionary USER_INPUT_ATTRIBUTES = new(); + + private string ClipboardTooltip => $"Copy {this.ClipboardTooltipSubject} to the clipboard"; + + private async Task CopyToClipboard(string content) => await this.RustService.CopyText2Clipboard(this.Snackbar, content); +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/TextInfoLines.razor b/app/MindWork AI Studio/Components/TextInfoLines.razor new file mode 100644 index 00000000..68186316 --- /dev/null +++ b/app/MindWork AI Studio/Components/TextInfoLines.razor @@ -0,0 +1,21 @@ + + + + @if (this.ShowingCopyButton) + { + + + + } + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/TextInfoLines.razor.cs b/app/MindWork AI Studio/Components/TextInfoLines.razor.cs new file mode 100644 index 00000000..2427133c --- /dev/null +++ b/app/MindWork AI Studio/Components/TextInfoLines.razor.cs @@ -0,0 +1,63 @@ +using AIStudio.Settings; +using AIStudio.Tools.Services; + +using Microsoft.AspNetCore.Components; + +namespace AIStudio.Components; + +public partial class TextInfoLines : ComponentBase +{ + [Parameter] + public string Label { get; set; } = string.Empty; + + [Parameter] + public string Value { get; set; } = string.Empty; + + [Parameter] + public string ClipboardTooltipSubject { get; set; } = "the text"; + + [Parameter] + public int MaxLines { get; set; } = 30; + + [Parameter] + public bool ShowingCopyButton { get; set; } = true; + + [Parameter] + public TextColor Color { get; set; } = TextColor.DEFAULT; + + [Inject] + private RustService RustService { get; init; } = null!; + + [Inject] + private ISnackbar Snackbar { get; init; } = null!; + + [Inject] + private SettingsManager SettingsManager { get; init; } = null!; + + #region Overrides of ComponentBase + + protected override async Task OnInitializedAsync() + { + // Configure the spellchecking for the user input: + this.SettingsManager.InjectSpellchecking(USER_INPUT_ATTRIBUTES); + + await base.OnInitializedAsync(); + } + + #endregion + + private static readonly Dictionary USER_INPUT_ATTRIBUTES = new(); + + private string ClipboardTooltip => $"Copy {this.ClipboardTooltipSubject} to the clipboard"; + + private async Task CopyToClipboard(string content) => await this.RustService.CopyText2Clipboard(this.Snackbar, content); + + private string GetColor() + { + var htmlColorCode = this.Color.GetHTMLColor(this.SettingsManager); + if(string.IsNullOrWhiteSpace(htmlColorCode)) + return string.Empty; + + return $"color: {htmlColorCode} !important;"; + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Vision.razor.cs b/app/MindWork AI Studio/Components/Vision.razor.cs index 9277c00a..2f7f2659 100644 --- a/app/MindWork AI Studio/Components/Vision.razor.cs +++ b/app/MindWork AI Studio/Components/Vision.razor.cs @@ -7,10 +7,14 @@ public partial class Vision : ComponentBase private static readonly TextItem[] ITEMS_VISION = [ new("Meet your needs", "Whatever your job or task is, MindWork AI Studio aims to meet your needs: whether you're a project manager, scientist, artist, author, software developer, or game developer."), - new("One stop shop", "The app will strive to fulfill all your AI needs: text-generation AI (LLM), image-generation AI, audio-generation AI (text-to-speech, potentially even text-to-music), and audio input (transcription, dictation). When there's a provider and an API available, we'll try to integrate it."), - new("Local file system", "When you wish, we aim to integrate your local system. Local documents could be incorporated using Retrieval-Augmented Generation (RAG), and we could directly save AI-generated content to your file system."), - new("Local AI systems", "Want to use AI systems locally and offline? We aim to make that possible too."), - new("Your AI systems", "Prefer to run your AI systems with providers like replicate.com? We plan to support that!"), - new("Assistants", "We aim to integrate specialized user interfaces as assistants. For example, a UI specifically for writing emails, or one designed for translating and correcting text, and more."), + new("Integrating your data", "You'll be able to integrate your data into AI Studio, like your PDF or Office files, or your Markdown notes."), + new("Integration of enterprise data", "It will soon be possible to integrate data from the corporate network using a specified interface (External Retrieval Interface, ERI for short). This will likely require development work by the organization in question."), + new("Useful assistants", "We'll develop more assistants for everyday tasks."), + new("Writing mode", "We're integrating a writing mode to help you create extensive works, like comprehensive project proposals, tenders, or your next fantasy novel."), + new("Specific requirements", "Want an assistant that suits your specific needs? We aim to offer a plugin architecture so organizations and enthusiasts can implement such ideas."), + new("Voice control", "You'll interact with the AI systems using your voice. To achieve this, we want to integrate voice input (speech-to-text) and output (text-to-speech). However, later on, it should also have a natural conversation flow, i.e., seamless conversation."), + new("Content creation", "There will be an interface for AI Studio to create content in other apps. You could, for example, create blog posts directly on the target platform or add entries to an internal knowledge management tool. This requires development work by the tool developers."), + new("Email monitoring", "You can connect your email inboxes with AI Studio. The AI will read your emails and notify you of important events. You'll also be able to access knowledge from your emails in your chats."), + new("Browser usage", "We're working on offering AI Studio features in your browser via a plugin, allowing, e.g., for spell-checking or text rewriting directly in the browser."), ]; } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Workspaces.razor.cs b/app/MindWork AI Studio/Components/Workspaces.razor.cs index 1ec3c0e1..9b6b0bb6 100644 --- a/app/MindWork AI Studio/Components/Workspaces.razor.cs +++ b/app/MindWork AI Studio/Components/Workspaces.razor.cs @@ -13,9 +13,6 @@ namespace AIStudio.Components; public partial class Workspaces : ComponentBase { - [Inject] - private SettingsManager SettingsManager { get; init; } = null!; - [Inject] private IDialogService DialogService { get; init; } = null!; diff --git a/app/MindWork AI Studio/Dialogs/ConfirmDialog.razor.cs b/app/MindWork AI Studio/Dialogs/ConfirmDialog.razor.cs index 05fd6be9..78fb9ad3 100644 --- a/app/MindWork AI Studio/Dialogs/ConfirmDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/ConfirmDialog.razor.cs @@ -8,7 +8,7 @@ namespace AIStudio.Dialogs; public partial class ConfirmDialog : ComponentBase { [CascadingParameter] - private MudDialogInstance MudDialog { get; set; } = null!; + private IMudDialogInstance MudDialog { get; set; } = null!; [Parameter] public string Message { get; set; } = string.Empty; diff --git a/app/MindWork AI Studio/Dialogs/DataSourceERI-V1InfoDialog.razor b/app/MindWork AI Studio/Dialogs/DataSourceERI-V1InfoDialog.razor new file mode 100644 index 00000000..dd6d2773 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/DataSourceERI-V1InfoDialog.razor @@ -0,0 +1,101 @@ +@using AIStudio.Settings.DataModel +@using AIStudio.Tools.ERIClient.DataModel + + + + + + Common data source information + + + + + + + @if (!this.IsConnectionEncrypted()) + { + + Please note: the connection to the ERI v1 server is not encrypted. This means that all + data sent to the server is transmitted in plain text. Please ask the ERI server administrator + to enable encryption. + + } + + @if (this.DataSource.AuthMethod is AuthMethod.USERNAME_PASSWORD) + { + + } + + + + + + + Retrieval information + + @if (!this.retrievalInfoformation.Any()) + { + + The data source does not provide any retrieval information. + + } + else + { + + + + + + @if (!string.IsNullOrWhiteSpace(this.selectedRetrievalInfo.Link)) + { + + Open web link, show more information + + } + + + Embeddings + + @* ReSharper disable once ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract *@ + @if (this.selectedRetrievalInfo.Embeddings is null || !this.selectedRetrievalInfo.Embeddings.Any()) + { + + The data source does not provide any embedding information. + + } + else + { + + @for (var embeddingIndex = 0; embeddingIndex < this.selectedRetrievalInfo.Embeddings.Count; embeddingIndex++) + { + var embedding = this.selectedRetrievalInfo.Embeddings[embeddingIndex]; + + + + + + @if (!string.IsNullOrWhiteSpace(embedding.Link)) + { + + Open web link, show more information + + } + + } + + } + + + } + + + + + @if (this.IsOperationInProgress) + { + + } + Reload + Close + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/DataSourceERI-V1InfoDialog.razor.cs b/app/MindWork AI Studio/Dialogs/DataSourceERI-V1InfoDialog.razor.cs new file mode 100644 index 00000000..2594ee58 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/DataSourceERI-V1InfoDialog.razor.cs @@ -0,0 +1,180 @@ +// ReSharper disable InconsistentNaming + +using System.Text; + +using AIStudio.Assistants.ERI; +using AIStudio.Settings.DataModel; +using AIStudio.Tools.ERIClient; +using AIStudio.Tools.ERIClient.DataModel; +using AIStudio.Tools.Services; + +using Microsoft.AspNetCore.Components; + +using RetrievalInfo = AIStudio.Tools.ERIClient.DataModel.RetrievalInfo; + +namespace AIStudio.Dialogs; + +public partial class DataSourceERI_V1InfoDialog : ComponentBase, IAsyncDisposable, ISecretId +{ + [CascadingParameter] + private IMudDialogInstance MudDialog { get; set; } = null!; + + [Parameter] + public DataSourceERI_V1 DataSource { get; set; } + + [Inject] + private RustService RustService { get; init; } = null!; + + #region Overrides of ComponentBase + + protected override async Task OnInitializedAsync() + { + this.eriServerTasks.Add(this.GetERIMetadata()); + await base.OnInitializedAsync(); + } + + #endregion + + private readonly CancellationTokenSource cts = new(); + private readonly List eriServerTasks = new(); + private readonly List dataIssues = []; + + private string serverDescription = string.Empty; + private ProviderType securityRequirements = ProviderType.NONE; + private IReadOnlyList retrievalInfoformation = []; + private RetrievalInfo selectedRetrievalInfo; + + private bool IsOperationInProgress { get; set; } = true; + + private bool IsConnectionEncrypted() => this.DataSource.Hostname.StartsWith("https://", StringComparison.InvariantCultureIgnoreCase); + + private string Port => this.DataSource.Port == 0 ? string.Empty : $"{this.DataSource.Port}"; + + private string RetrievalName(RetrievalInfo retrievalInfo) + { + var hasId = !string.IsNullOrWhiteSpace(retrievalInfo.Id); + var hasName = !string.IsNullOrWhiteSpace(retrievalInfo.Name); + + if (hasId && hasName) + return $"[{retrievalInfo.Id}] {retrievalInfo.Name}"; + + if (hasId) + return $"[{retrievalInfo.Id}] Unnamed retrieval process"; + + return hasName ? retrievalInfo.Name : "Unnamed retrieval process"; + } + + private string RetrievalParameters(RetrievalInfo retrievalInfo) + { + var parameters = retrievalInfo.ParametersDescription; + if (parameters is null || parameters.Count == 0) + return "This retrieval process has no parameters."; + + var sb = new StringBuilder(); + foreach (var (paramName, description) in parameters) + { + sb.Append("Parameter: "); + sb.AppendLine(paramName); + sb.AppendLine(description); + sb.AppendLine(); + } + + return sb.ToString(); + } + + private async Task GetERIMetadata() + { + this.dataIssues.Clear(); + + try + { + this.IsOperationInProgress = true; + this.StateHasChanged(); + + using var client = ERIClientFactory.Get(ERIVersion.V1, this.DataSource); + if(client is null) + { + this.dataIssues.Add("Failed to connect to the ERI v1 server. The server is not supported."); + return; + } + + var loginResult = await client.AuthenticateAsync(this.RustService); + if (!loginResult.Successful) + { + this.dataIssues.Add(loginResult.Message); + return; + } + + var dataSourceInfo = await client.GetDataSourceInfoAsync(this.cts.Token); + if (!dataSourceInfo.Successful) + { + this.dataIssues.Add(dataSourceInfo.Message); + return; + } + + this.serverDescription = dataSourceInfo.Data.Description; + + var securityRequirementsResult = await client.GetSecurityRequirementsAsync(this.cts.Token); + if (!securityRequirementsResult.Successful) + { + this.dataIssues.Add(securityRequirementsResult.Message); + return; + } + + this.securityRequirements = securityRequirementsResult.Data.AllowedProviderType; + + var retrievalInfoResult = await client.GetRetrievalInfoAsync(this.cts.Token); + if (!retrievalInfoResult.Successful) + { + this.dataIssues.Add(retrievalInfoResult.Message); + return; + } + + this.retrievalInfoformation = retrievalInfoResult.Data ?? []; + this.selectedRetrievalInfo = this.retrievalInfoformation.FirstOrDefault(x => x.Id == this.DataSource.SelectedRetrievalId); + this.StateHasChanged(); + } + catch (Exception e) + { + this.dataIssues.Add($"Failed to connect to the ERI v1 server. The message was: {e.Message}"); + } + finally + { + this.IsOperationInProgress = false; + this.StateHasChanged(); + } + } + + private void Close() + { + this.cts.Cancel(); + this.MudDialog.Close(); + } + + #region Implementation of ISecretId + + public string SecretId => this.DataSource.Id; + + public string SecretName => this.DataSource.Name; + + #endregion + + #region Implementation of IDisposable + + public async ValueTask DisposeAsync() + { + try + { + await this.cts.CancelAsync(); + await Task.WhenAll(this.eriServerTasks); + + this.cts.Dispose(); + } + catch + { + // ignored + } + } + + #endregion +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/DataSourceERI_V1Dialog.razor b/app/MindWork AI Studio/Dialogs/DataSourceERI_V1Dialog.razor new file mode 100644 index 00000000..a37a2d4d --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/DataSourceERI_V1Dialog.razor @@ -0,0 +1,150 @@ +@using AIStudio.Settings.DataModel +@using AIStudio.Tools.ERIClient.DataModel + + + + @* ReSharper disable once CSharpWarnings::CS8974 *@ + + + + @* ReSharper disable once CSharpWarnings::CS8974 *@ + + + + + + @if (!this.IsConnectionEncrypted()) + { + + Please note: the connection to the ERI v1 server is not encrypted. This means that all + data sent to the server is transmitted in plain text. Please ask the ERI server administrator + to enable encryption. + + } + + @if (this.IsConnectionPossible()) + { + + + Test connection & read available metadata + + + @this.GetTestResultText() + + + } + + @if(this.availableAuthMethods.Count > 0 || this.dataAuthMethod != default) + { + + @foreach (var authMethod in this.availableAuthMethods) + { + @authMethod.DisplayName() + } + + } + + @if (this.NeedsSecret()) + { + if (this.dataAuthMethod is AuthMethod.USERNAME_PASSWORD) + { + @* ReSharper disable once CSharpWarnings::CS8974 *@ + + } + + @* ReSharper disable once CSharpWarnings::CS8974 *@ + + } + + @if (this.availableRetrievalProcesses.Count > 0) + { + + @foreach (var retrievalProcess in this.availableRetrievalProcesses) + { + + @retrievalProcess.Name + + } + + } + + + @foreach (var policy in Enum.GetValues()) + { + + @policy.ToSelectionText() + + } + + + + + + + Cancel + + @if(this.IsEditing) + { + @:Update + } + else + { + @:Add + } + + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/DataSourceERI_V1Dialog.razor.cs b/app/MindWork AI Studio/Dialogs/DataSourceERI_V1Dialog.razor.cs new file mode 100644 index 00000000..e3547d9d --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/DataSourceERI_V1Dialog.razor.cs @@ -0,0 +1,333 @@ +using AIStudio.Assistants.ERI; +using AIStudio.Settings; +using AIStudio.Settings.DataModel; +using AIStudio.Tools.ERIClient; +using AIStudio.Tools.ERIClient.DataModel; +using AIStudio.Tools.Services; +using AIStudio.Tools.Validation; + +using Microsoft.AspNetCore.Components; + +using RetrievalInfo = AIStudio.Tools.ERIClient.DataModel.RetrievalInfo; + +// ReSharper disable InconsistentNaming +namespace AIStudio.Dialogs; + +public partial class DataSourceERI_V1Dialog : ComponentBase, ISecretId +{ + [CascadingParameter] + private IMudDialogInstance MudDialog { get; set; } = null!; + + [Parameter] + public bool IsEditing { get; set; } + + [Parameter] + public DataSourceERI_V1 DataSource { get; set; } + + [Inject] + private SettingsManager SettingsManager { get; init; } = null!; + + [Inject] + private ILogger Logger { get; init; } = null!; + + [Inject] + private RustService RustService { get; init; } = null!; + + private static readonly Dictionary SPELLCHECK_ATTRIBUTES = new(); + + private readonly DataSourceValidation dataSourceValidation; + private readonly Encryption encryption = Program.ENCRYPTION; + + /// + /// The list of used data source names. We need this to check for uniqueness. + /// + private List UsedDataSourcesNames { get; set; } = []; + + private bool dataIsValid; + private string[] dataIssues = []; + private string dataSecretStorageIssue = string.Empty; + private string dataEditingPreviousInstanceName = string.Empty; + private List availableAuthMethods = []; + private DataSourceSecurity dataSecurityPolicy; + private SecurityRequirements dataSourceSecurityRequirements; + private bool connectionTested; + private bool connectionSuccessfulTested; + + private uint dataNum; + private string dataSecret = string.Empty; + private string dataId = Guid.NewGuid().ToString(); + private string dataName = string.Empty; + private string dataHostname = string.Empty; + private int dataPort; + private AuthMethod dataAuthMethod; + private string dataUsername = string.Empty; + private List availableRetrievalProcesses = []; + private RetrievalInfo dataSelectedRetrievalProcess; + + // We get the form reference from Blazor code to validate it manually: + private MudForm form = null!; + + public DataSourceERI_V1Dialog() + { + this.dataSourceValidation = new() + { + GetAuthMethod = () => this.dataAuthMethod, + GetPreviousDataSourceName = () => this.dataEditingPreviousInstanceName, + GetUsedDataSourceNames = () => this.UsedDataSourcesNames, + GetSecretStorageIssue = () => this.dataSecretStorageIssue, + GetTestedConnection = () => this.connectionTested, + GetTestedConnectionResult = () => this.connectionSuccessfulTested, + GetAvailableAuthMethods = () => this.availableAuthMethods, + GetSecurityRequirements = () => this.dataSourceSecurityRequirements, + }; + } + + #region Overrides of ComponentBase + + protected override async Task OnInitializedAsync() + { + // Configure the spellchecking for the instance name input: + this.SettingsManager.InjectSpellchecking(SPELLCHECK_ATTRIBUTES); + + // Load the used instance names: + this.UsedDataSourcesNames = this.SettingsManager.ConfigurationData.DataSources.Select(x => x.Name.ToLowerInvariant()).ToList(); + + // When editing, we need to load the data: + if(this.IsEditing) + { + // + // Assign the data to the form fields: + // + this.dataEditingPreviousInstanceName = this.DataSource.Name.ToLowerInvariant(); + this.dataNum = this.DataSource.Num; + this.dataId = this.DataSource.Id; + this.dataName = this.DataSource.Name; + this.dataHostname = this.DataSource.Hostname; + this.dataPort = this.DataSource.Port; + this.dataAuthMethod = this.DataSource.AuthMethod; + this.dataUsername = this.DataSource.Username; + this.dataSecurityPolicy = this.DataSource.SecurityPolicy; + + if (this.dataAuthMethod is AuthMethod.TOKEN or AuthMethod.USERNAME_PASSWORD) + { + // Load the secret: + var requestedSecret = await this.RustService.GetSecret(this); + if (requestedSecret.Success) + this.dataSecret = await requestedSecret.Secret.Decrypt(this.encryption); + else + { + this.dataSecret = string.Empty; + this.dataSecretStorageIssue = $"Failed to load the auth. secret from the operating system. The message was: {requestedSecret.Issue}. You might ignore this message and provide the secret again."; + await this.form.Validate(); + } + } + + // Load the data: + await this.TestConnection(); + + // Select the retrieval process: + this.dataSelectedRetrievalProcess = this.availableRetrievalProcesses.FirstOrDefault(n => n.Id == this.DataSource.SelectedRetrievalId); + } + + await base.OnInitializedAsync(); + } + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + // Reset the validation when not editing and on the first render. + // We don't want to show validation errors when the user opens the dialog. + if(!this.IsEditing && firstRender) + this.form.ResetValidation(); + + await base.OnAfterRenderAsync(firstRender); + } + + #endregion + + #region Implementation of ISecretId + + public string SecretId => this.dataId; + + public string SecretName => this.dataName; + + #endregion + + private DataSourceERI_V1 CreateDataSource() + { + var cleanedHostname = this.dataHostname.Trim(); + return new DataSourceERI_V1 + { + Id = this.dataId, + Num = this.dataNum, + Port = this.dataPort, + Name = this.dataName, + Hostname = cleanedHostname.EndsWith('/') ? cleanedHostname[..^1] : cleanedHostname, + AuthMethod = this.dataAuthMethod, + Username = this.dataUsername, + Type = DataSourceType.ERI_V1, + SecurityPolicy = this.dataSecurityPolicy, + SelectedRetrievalId = this.dataSelectedRetrievalProcess.Id, + }; + } + + private bool IsConnectionEncrypted() => this.dataHostname.StartsWith("https://", StringComparison.InvariantCultureIgnoreCase); + + private bool IsConnectionPossible() + { + if(this.dataSourceValidation.ValidatingHostname(this.dataHostname) is not null) + return false; + + if(this.dataSourceValidation.ValidatePort(this.dataPort) is not null) + return false; + + return true; + } + + private async Task TestConnection() + { + try + { + var cts = new CancellationTokenSource(TimeSpan.FromSeconds(14)); + this.DataSource = this.CreateDataSource(); + using var client = ERIClientFactory.Get(ERIVersion.V1, this.DataSource); + if(client is null) + { + await this.form.Validate(); + + Array.Resize(ref this.dataIssues, this.dataIssues.Length + 1); + this.dataIssues[^1] = "Failed to connect to the ERI v1 server. The server is not supported."; + return; + } + + var authSchemes = await client.GetAuthMethodsAsync(cts.Token); + if (!authSchemes.Successful) + { + await this.form.Validate(); + + Array.Resize(ref this.dataIssues, this.dataIssues.Length + 1); + this.dataIssues[^1] = authSchemes.Message; + return; + } + + this.availableAuthMethods = authSchemes.Data!.Select(n => n.AuthMethod).ToList(); + + var loginResult = await client.AuthenticateAsync(this.RustService, this.dataSecret, cts.Token); + if (!loginResult.Successful) + { + await this.form.Validate(); + + Array.Resize(ref this.dataIssues, this.dataIssues.Length + 1); + this.dataIssues[^1] = loginResult.Message; + return; + } + + var securityRequirementsRequest = await client.GetSecurityRequirementsAsync(cts.Token); + if (!securityRequirementsRequest.Successful) + { + await this.form.Validate(); + + Array.Resize(ref this.dataIssues, this.dataIssues.Length + 1); + this.dataIssues[^1] = securityRequirementsRequest.Message; + return; + } + + this.dataSourceSecurityRequirements = securityRequirementsRequest.Data; + + var retrievalInfoRequest = await client.GetRetrievalInfoAsync(cts.Token); + if (!retrievalInfoRequest.Successful) + { + await this.form.Validate(); + + Array.Resize(ref this.dataIssues, this.dataIssues.Length + 1); + this.dataIssues[^1] = retrievalInfoRequest.Message; + return; + } + + this.availableRetrievalProcesses = retrievalInfoRequest.Data ?? []; + + this.connectionTested = true; + this.connectionSuccessfulTested = true; + this.Logger.LogInformation("Connection to the ERI v1 server was successful tested."); + } + catch (Exception e) + { + await this.form.Validate(); + + Array.Resize(ref this.dataIssues, this.dataIssues.Length + 1); + this.dataIssues[^1] = $"Failed to connect to the ERI v1 server. The message was: {e.Message}"; + this.Logger.LogError($"Failed to connect to the ERI v1 server. Message: {e.Message}"); + + this.connectionTested = true; + this.connectionSuccessfulTested = false; + } + } + + private string GetTestResultText() + { + if(!this.connectionTested) + return "Not tested yet."; + + return this.connectionSuccessfulTested ? "Connection successful." : "Connection failed."; + } + + private Color GetTestResultColor() + { + if (!this.connectionTested) + return Color.Default; + + return this.connectionSuccessfulTested ? Color.Success : Color.Error; + } + + private string GetTestResultIcon() + { + if (!this.connectionTested) + return Icons.Material.Outlined.HourglassEmpty; + + return this.connectionSuccessfulTested ? Icons.Material.Outlined.CheckCircle : Icons.Material.Outlined.Error; + } + + private bool NeedsSecret() => this.dataAuthMethod is AuthMethod.TOKEN or AuthMethod.USERNAME_PASSWORD; + + private string GetSecretLabel() => this.dataAuthMethod switch + { + AuthMethod.TOKEN => "Access Token", + AuthMethod.USERNAME_PASSWORD => "Password", + _ => "Secret", + }; + + private async Task Store() + { + await this.form.Validate(); + + var testConnectionValidation = this.dataSourceValidation.ValidateTestedConnection(); + if(testConnectionValidation is not null) + { + Array.Resize(ref this.dataIssues, this.dataIssues.Length + 1); + this.dataIssues[^1] = testConnectionValidation; + this.dataIsValid = false; + } + + this.dataSecretStorageIssue = string.Empty; + + // When the data is not valid, we don't store it: + if (!this.dataIsValid) + return; + + var addedDataSource = this.CreateDataSource(); + if (!string.IsNullOrWhiteSpace(this.dataSecret)) + { + // Store the secret in the OS secure storage: + var storeResponse = await this.RustService.SetSecret(this, this.dataSecret); + if (!storeResponse.Success) + { + this.dataSecretStorageIssue = $"Failed to store the auth. secret in the operating system. The message was: {storeResponse.Issue}. Please try again."; + await this.form.Validate(); + return; + } + } + + this.MudDialog.Close(DialogResult.Ok(addedDataSource)); + } + + private void Cancel() => this.MudDialog.Cancel(); +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryDialog.razor b/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryDialog.razor new file mode 100644 index 00000000..e7863285 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryDialog.razor @@ -0,0 +1,88 @@ +@using AIStudio.Settings.DataModel + + + + + @* ReSharper disable once CSharpWarnings::CS8974 *@ + + + + Select a root directory for this data source. All data in this directory and all + its subdirectories will be processed for this data source. + + + + + In order for the AI to be able to determine the appropriate data at any time, you must + choose an embedding method. + + + @foreach (var embedding in this.AvailableEmbeddings) + { + @embedding.Name + } + + + @if (!string.IsNullOrWhiteSpace(this.dataEmbeddingId)) + { + if (this.SelectedCloudEmbedding) + { + + @if (string.IsNullOrWhiteSpace(this.dataPath)) + { + @: Please note: the embedding you selected runs in the cloud. All your data will be sent to the cloud. + @: Please confirm that you have read and understood this. + } + else + { + @: Please note: the embedding you selected runs in the cloud. All your data from the + @: folder '@this.dataPath' and all its subdirectories will be sent to the cloud. Please + @: confirm that you have read and understood this. + } + + + } + else + { + + The embedding you selected runs locally or in your organization. Your data is not sent to the cloud. + + } + } + + + @foreach (var policy in Enum.GetValues()) + { + @policy.ToSelectionText() + } + + + + + + Cancel + + @if(this.IsEditing) + { + @:Update + } + else + { + @:Add + } + + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryDialog.razor.cs b/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryDialog.razor.cs new file mode 100644 index 00000000..16c2e677 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryDialog.razor.cs @@ -0,0 +1,123 @@ +using AIStudio.Settings; +using AIStudio.Settings.DataModel; +using AIStudio.Tools.Validation; + +using Microsoft.AspNetCore.Components; + +namespace AIStudio.Dialogs; + +public partial class DataSourceLocalDirectoryDialog : ComponentBase +{ + [CascadingParameter] + private IMudDialogInstance MudDialog { get; set; } = null!; + + [Parameter] + public bool IsEditing { get; set; } + + [Parameter] + public DataSourceLocalDirectory DataSource { get; set; } + + [Parameter] + public IReadOnlyList> AvailableEmbeddings { get; set; } = []; + + [Inject] + private SettingsManager SettingsManager { get; init; } = null!; + + private static readonly Dictionary SPELLCHECK_ATTRIBUTES = new(); + + private readonly DataSourceValidation dataSourceValidation; + + /// + /// The list of used data source names. We need this to check for uniqueness. + /// + private List UsedDataSourcesNames { get; set; } = []; + + private bool dataIsValid; + private string[] dataIssues = []; + private string dataEditingPreviousInstanceName = string.Empty; + + private uint dataNum; + private string dataId = Guid.NewGuid().ToString(); + private string dataName = string.Empty; + private bool dataUserAcknowledgedCloudEmbedding; + private string dataEmbeddingId = string.Empty; + private string dataPath = string.Empty; + private DataSourceSecurity dataSecurityPolicy; + + // We get the form reference from Blazor code to validate it manually: + private MudForm form = null!; + + public DataSourceLocalDirectoryDialog() + { + this.dataSourceValidation = new() + { + GetSelectedCloudEmbedding = () => this.SelectedCloudEmbedding, + GetPreviousDataSourceName = () => this.dataEditingPreviousInstanceName, + GetUsedDataSourceNames = () => this.UsedDataSourcesNames, + }; + } + + #region Overrides of ComponentBase + + protected override async Task OnInitializedAsync() + { + // Configure the spellchecking for the instance name input: + this.SettingsManager.InjectSpellchecking(SPELLCHECK_ATTRIBUTES); + + // Load the used instance names: + this.UsedDataSourcesNames = this.SettingsManager.ConfigurationData.DataSources.Select(x => x.Name.ToLowerInvariant()).ToList(); + + // When editing, we need to load the data: + if(this.IsEditing) + { + this.dataEditingPreviousInstanceName = this.DataSource.Name.ToLowerInvariant(); + this.dataNum = this.DataSource.Num; + this.dataId = this.DataSource.Id; + this.dataName = this.DataSource.Name; + this.dataEmbeddingId = this.DataSource.EmbeddingId; + this.dataPath = this.DataSource.Path; + this.dataSecurityPolicy = this.DataSource.SecurityPolicy; + } + + await base.OnInitializedAsync(); + } + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + // Reset the validation when not editing and on the first render. + // We don't want to show validation errors when the user opens the dialog. + if(!this.IsEditing && firstRender) + this.form.ResetValidation(); + + await base.OnAfterRenderAsync(firstRender); + } + + #endregion + + private bool SelectedCloudEmbedding => !this.SettingsManager.ConfigurationData.EmbeddingProviders.FirstOrDefault(x => x.Id == this.dataEmbeddingId).IsSelfHosted; + + private DataSourceLocalDirectory CreateDataSource() => new() + { + Id = this.dataId, + Num = this.dataNum, + Name = this.dataName, + Type = DataSourceType.LOCAL_DIRECTORY, + EmbeddingId = this.dataEmbeddingId, + Path = this.dataPath, + SecurityPolicy = this.dataSecurityPolicy, + }; + + private async Task Store() + { + await this.form.Validate(); + + // When the data is not valid, we don't store it: + if (!this.dataIsValid) + return; + + var addedDataSource = this.CreateDataSource(); + this.MudDialog.Close(DialogResult.Ok(addedDataSource)); + } + + private void Cancel() => this.MudDialog.Cancel(); +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryInfoDialog.razor b/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryInfoDialog.razor new file mode 100644 index 00000000..a4b647b0 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryInfoDialog.razor @@ -0,0 +1,56 @@ +@using AIStudio.Settings.DataModel + + + + + + + @if (!this.IsDirectoryAvailable) + { + + The directory chosen for the data source does not exist anymore. Please edit the data source and correct the path. + + } + else + { + + The directory chosen for the data source exists. + + } + + + @if (this.IsCloudEmbedding) + { + + The embedding runs in the cloud. All your data from the folder '@this.DataSource.Path' and all its subdirectories + will be sent to the cloud. + + } + else + { + + The embedding runs locally or in your organization. Your data is not sent to the cloud. + + } + + + + + + @if (this.directorySizeNumFiles > 100) + { + + For performance reasons, only the first 100 files are shown. The directory contains @this.NumberFilesInDirectory files in total. + + } + + + + + @if (this.IsOperationInProgress) + { + + } + Close + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryInfoDialog.razor.cs b/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryInfoDialog.razor.cs new file mode 100644 index 00000000..af8c0df8 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryInfoDialog.razor.cs @@ -0,0 +1,112 @@ +using System.Text; + +using AIStudio.Settings; +using AIStudio.Settings.DataModel; + +using Microsoft.AspNetCore.Components; + +using Timer = System.Timers.Timer; + +namespace AIStudio.Dialogs; + +public partial class DataSourceLocalDirectoryInfoDialog : ComponentBase, IAsyncDisposable +{ + [CascadingParameter] + private IMudDialogInstance MudDialog { get; set; } = null!; + + [Parameter] + public DataSourceLocalDirectory DataSource { get; set; } + + [Inject] + private SettingsManager SettingsManager { get; init; } = null!; + + private readonly Timer refreshTimer = new(TimeSpan.FromSeconds(1.6)) + { + AutoReset = true, + }; + + #region Overrides of ComponentBase + + protected override async Task OnInitializedAsync() + { + this.embeddingProvider = this.SettingsManager.ConfigurationData.EmbeddingProviders.FirstOrDefault(x => x.Id == this.DataSource.EmbeddingId); + this.directoryInfo = new DirectoryInfo(this.DataSource.Path); + + if (this.directoryInfo.Exists) + { + this.directorySizeTask = this.directoryInfo.DetermineContentSize(this.UpdateDirectorySize, this.UpdateDirectoryFiles, this.UpdateFileList, MAX_FILES_TO_SHOW, this.DirectoryOperationDone, this.cts.Token); + this.refreshTimer.Elapsed += (_, _) => this.InvokeAsync(this.StateHasChanged); + this.refreshTimer.Start(); + } + + await base.OnInitializedAsync(); + } + + #endregion + + private const int MAX_FILES_TO_SHOW = 100; + + private readonly CancellationTokenSource cts = new(); + + private EmbeddingProvider embeddingProvider; + private DirectoryInfo directoryInfo = null!; + private long directorySizeBytes; + private long directorySizeNumFiles; + private readonly StringBuilder directoryFiles = new(); + private Task directorySizeTask = Task.CompletedTask; + + private bool IsOperationInProgress { get; set; } = true; + + private bool IsCloudEmbedding => !this.embeddingProvider.IsSelfHosted; + + private bool IsDirectoryAvailable => this.directoryInfo.Exists; + + private void UpdateFileList(string file) + { + this.directoryFiles.Append("- "); + this.directoryFiles.AppendLine(file); + } + + private void UpdateDirectorySize(long size) + { + this.directorySizeBytes = size; + } + + private void UpdateDirectoryFiles(long numFiles) => this.directorySizeNumFiles = numFiles; + + private void DirectoryOperationDone() + { + this.refreshTimer.Stop(); + this.IsOperationInProgress = false; + this.InvokeAsync(this.StateHasChanged); + } + + private string NumberFilesInDirectory => $"{this.directorySizeNumFiles:###,###,###,###}"; + + private void Close() + { + this.cts.Cancel(); + this.MudDialog.Close(); + } + + #region Implementation of IDisposable + + public async ValueTask DisposeAsync() + { + try + { + await this.cts.CancelAsync(); + await this.directorySizeTask; + + this.cts.Dispose(); + this.refreshTimer.Stop(); + this.refreshTimer.Dispose(); + } + catch + { + // ignored + } + } + + #endregion +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/DataSourceLocalFileDialog.razor b/app/MindWork AI Studio/Dialogs/DataSourceLocalFileDialog.razor new file mode 100644 index 00000000..ebd0a5bc --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/DataSourceLocalFileDialog.razor @@ -0,0 +1,86 @@ +@using AIStudio.Settings.DataModel + + + + @* ReSharper disable once CSharpWarnings::CS8974 *@ + + + + Select a file for this data source. The content of this file will be processed for the data source. + + + + + In order for the AI to be able to determine the appropriate data at any time, you must + choose an embedding method. + + + @foreach (var embedding in this.AvailableEmbeddings) + { + @embedding.Name + } + + + @if (!string.IsNullOrWhiteSpace(this.dataEmbeddingId)) + { + if (this.SelectedCloudEmbedding) + { + + @if (string.IsNullOrWhiteSpace(this.dataFilePath)) + { + @: Please note: the embedding you selected runs in the cloud. All your data will be sent to the cloud. + @: Please confirm that you have read and understood this. + } + else + { + @: Please note: the embedding you selected runs in the cloud. All your data within the + @: file '@this.dataFilePath' will be sent to the cloud. Please confirm that you have read + @: and understood this. + } + + + } + else + { + + The embedding you selected runs locally or in your organization. Your data is not sent to the cloud. + + } + } + + + @foreach (var policy in Enum.GetValues()) + { + @policy.ToSelectionText() + } + + + + + + Cancel + + @if(this.IsEditing) + { + @:Update + } + else + { + @:Add + } + + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/DataSourceLocalFileDialog.razor.cs b/app/MindWork AI Studio/Dialogs/DataSourceLocalFileDialog.razor.cs new file mode 100644 index 00000000..902899fe --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/DataSourceLocalFileDialog.razor.cs @@ -0,0 +1,123 @@ +using AIStudio.Settings; +using AIStudio.Settings.DataModel; +using AIStudio.Tools.Validation; + +using Microsoft.AspNetCore.Components; + +namespace AIStudio.Dialogs; + +public partial class DataSourceLocalFileDialog : ComponentBase +{ + [CascadingParameter] + private IMudDialogInstance MudDialog { get; set; } = null!; + + [Parameter] + public bool IsEditing { get; set; } + + [Parameter] + public DataSourceLocalFile DataSource { get; set; } + + [Parameter] + public IReadOnlyList> AvailableEmbeddings { get; set; } = []; + + [Inject] + private SettingsManager SettingsManager { get; init; } = null!; + + private static readonly Dictionary SPELLCHECK_ATTRIBUTES = new(); + + private readonly DataSourceValidation dataSourceValidation; + + /// + /// The list of used data source names. We need this to check for uniqueness. + /// + private List UsedDataSourcesNames { get; set; } = []; + + private bool dataIsValid; + private string[] dataIssues = []; + private string dataEditingPreviousInstanceName = string.Empty; + + private uint dataNum; + private string dataId = Guid.NewGuid().ToString(); + private string dataName = string.Empty; + private bool dataUserAcknowledgedCloudEmbedding; + private string dataEmbeddingId = string.Empty; + private string dataFilePath = string.Empty; + private DataSourceSecurity dataSecurityPolicy; + + // We get the form reference from Blazor code to validate it manually: + private MudForm form = null!; + + public DataSourceLocalFileDialog() + { + this.dataSourceValidation = new() + { + GetSelectedCloudEmbedding = () => this.SelectedCloudEmbedding, + GetPreviousDataSourceName = () => this.dataEditingPreviousInstanceName, + GetUsedDataSourceNames = () => this.UsedDataSourcesNames, + }; + } + + #region Overrides of ComponentBase + + protected override async Task OnInitializedAsync() + { + // Configure the spellchecking for the instance name input: + this.SettingsManager.InjectSpellchecking(SPELLCHECK_ATTRIBUTES); + + // Load the used instance names: + this.UsedDataSourcesNames = this.SettingsManager.ConfigurationData.DataSources.Select(x => x.Name.ToLowerInvariant()).ToList(); + + // When editing, we need to load the data: + if(this.IsEditing) + { + this.dataEditingPreviousInstanceName = this.DataSource.Name.ToLowerInvariant(); + this.dataNum = this.DataSource.Num; + this.dataId = this.DataSource.Id; + this.dataName = this.DataSource.Name; + this.dataEmbeddingId = this.DataSource.EmbeddingId; + this.dataFilePath = this.DataSource.FilePath; + this.dataSecurityPolicy = this.DataSource.SecurityPolicy; + } + + await base.OnInitializedAsync(); + } + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + // Reset the validation when not editing and on the first render. + // We don't want to show validation errors when the user opens the dialog. + if(!this.IsEditing && firstRender) + this.form.ResetValidation(); + + await base.OnAfterRenderAsync(firstRender); + } + + #endregion + + private bool SelectedCloudEmbedding => !this.SettingsManager.ConfigurationData.EmbeddingProviders.FirstOrDefault(x => x.Id == this.dataEmbeddingId).IsSelfHosted; + + private DataSourceLocalFile CreateDataSource() => new() + { + Id = this.dataId, + Num = this.dataNum, + Name = this.dataName, + Type = DataSourceType.LOCAL_FILE, + EmbeddingId = this.dataEmbeddingId, + FilePath = this.dataFilePath, + SecurityPolicy = this.dataSecurityPolicy, + }; + + private async Task Store() + { + await this.form.Validate(); + + // When the data is not valid, we don't store it: + if (!this.dataIsValid) + return; + + var addedDataSource = this.CreateDataSource(); + this.MudDialog.Close(DialogResult.Ok(addedDataSource)); + } + + private void Cancel() => this.MudDialog.Cancel(); +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/DataSourceLocalFileInfoDialog.razor b/app/MindWork AI Studio/Dialogs/DataSourceLocalFileInfoDialog.razor new file mode 100644 index 00000000..0605ff93 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/DataSourceLocalFileInfoDialog.razor @@ -0,0 +1,42 @@ +@using AIStudio.Settings.DataModel + + + + + + + @if (!this.IsFileAvailable) + { + + The file chosen for the data source does not exist anymore. Please edit the data source and choose another file or correct the path. + + } + else + { + + The file chosen for the data source exists. + + } + + + @if (this.IsCloudEmbedding) + { + + The embedding runs in the cloud. All your data within the + file '@this.DataSource.FilePath' will be sent to the cloud. + + } + else + { + + The embedding runs locally or in your organization. Your data is not sent to the cloud. + + } + + + + + + Close + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/DataSourceLocalFileInfoDialog.razor.cs b/app/MindWork AI Studio/Dialogs/DataSourceLocalFileInfoDialog.razor.cs new file mode 100644 index 00000000..7dc204c1 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/DataSourceLocalFileInfoDialog.razor.cs @@ -0,0 +1,40 @@ +using AIStudio.Settings; +using AIStudio.Settings.DataModel; + +using Microsoft.AspNetCore.Components; + +namespace AIStudio.Dialogs; + +public partial class DataSourceLocalFileInfoDialog : ComponentBase +{ + [CascadingParameter] + private IMudDialogInstance MudDialog { get; set; } = null!; + + [Parameter] + public DataSourceLocalFile DataSource { get; set; } + + [Inject] + private SettingsManager SettingsManager { get; init; } = null!; + + #region Overrides of ComponentBase + + protected override async Task OnInitializedAsync() + { + this.embeddingProvider = this.SettingsManager.ConfigurationData.EmbeddingProviders.FirstOrDefault(x => x.Id == this.DataSource.EmbeddingId); + this.fileInfo = new FileInfo(this.DataSource.FilePath); + await base.OnInitializedAsync(); + } + + #endregion + + private EmbeddingProvider embeddingProvider; + private FileInfo fileInfo = null!; + + private bool IsCloudEmbedding => !this.embeddingProvider.IsSelfHosted; + + private bool IsFileAvailable => this.fileInfo.Exists; + + private string FileSize => this.fileInfo.FileSize(); + + private void Close() => this.MudDialog.Close(); +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/EmbeddingMethodDialog.razor.cs b/app/MindWork AI Studio/Dialogs/EmbeddingMethodDialog.razor.cs index c2733fbc..36ee9417 100644 --- a/app/MindWork AI Studio/Dialogs/EmbeddingMethodDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/EmbeddingMethodDialog.razor.cs @@ -8,7 +8,7 @@ namespace AIStudio.Dialogs; public partial class EmbeddingMethodDialog : ComponentBase { [CascadingParameter] - private MudDialogInstance MudDialog { get; set; } = null!; + private IMudDialogInstance MudDialog { get; set; } = null!; /// /// The user chosen embedding name. diff --git a/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs b/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs index 3a7b092b..1d09fa52 100644 --- a/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs @@ -1,5 +1,6 @@ using AIStudio.Provider; using AIStudio.Settings; +using AIStudio.Tools.Services; using AIStudio.Tools.Validation; using Microsoft.AspNetCore.Components; @@ -11,7 +12,7 @@ namespace AIStudio.Dialogs; public partial class EmbeddingProviderDialog : ComponentBase, ISecretId { [CascadingParameter] - private MudDialogInstance MudDialog { get; set; } = null!; + private IMudDialogInstance MudDialog { get; set; } = null!; /// /// The embedding's number in the list. @@ -112,13 +113,24 @@ public partial class EmbeddingProviderDialog : ComponentBase, ISecretId private EmbeddingProvider CreateEmbeddingProviderSettings() { var cleanedHostname = this.DataHostname.Trim(); + Model model = default; + if(this.DataLLMProvider is LLMProviders.SELF_HOSTED) + { + if (this.DataHost is Host.OLLAMA) + model = new Model(this.dataManuallyModel, null); + else if (this.DataHost is Host.LM_STUDIO) + model = this.DataModel; + } + else + model = this.DataModel; + return new() { Num = this.DataNum, Id = this.DataId, Name = this.DataName, UsedLLMProvider = this.DataLLMProvider, - Model = this.DataLLMProvider is LLMProviders.SELF_HOSTED ? new Model(this.dataManuallyModel, null) : this.DataModel, + Model = model, IsSelfHosted = this.DataLLMProvider is LLMProviders.SELF_HOSTED, Hostname = cleanedHostname.EndsWith('/') ? cleanedHostname[..^1] : cleanedHostname, Host = this.DataHost, @@ -197,8 +209,7 @@ public partial class EmbeddingProviderDialog : ComponentBase, ISecretId private async Task Store() { await this.form.Validate(); - if (!string.IsNullOrWhiteSpace(this.dataAPIKeyStorageIssue)) - this.dataAPIKeyStorageIssue = string.Empty; + this.dataAPIKeyStorageIssue = string.Empty; // When the data is not valid, we don't store it: if (!this.dataIsValid) diff --git a/app/MindWork AI Studio/Dialogs/ProfileDialog.razor.cs b/app/MindWork AI Studio/Dialogs/ProfileDialog.razor.cs index 7391c1d5..28b9b4b1 100644 --- a/app/MindWork AI Studio/Dialogs/ProfileDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/ProfileDialog.razor.cs @@ -7,7 +7,7 @@ namespace AIStudio.Dialogs; public partial class ProfileDialog : ComponentBase { [CascadingParameter] - private MudDialogInstance MudDialog { get; set; } = null!; + private IMudDialogInstance MudDialog { get; set; } = null!; /// /// The profile's number in the list. diff --git a/app/MindWork AI Studio/Dialogs/ProviderDialog.razor.cs b/app/MindWork AI Studio/Dialogs/ProviderDialog.razor.cs index 87e5569e..f1a71739 100644 --- a/app/MindWork AI Studio/Dialogs/ProviderDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/ProviderDialog.razor.cs @@ -1,11 +1,11 @@ using AIStudio.Provider; using AIStudio.Settings; +using AIStudio.Tools.Services; using AIStudio.Tools.Validation; using Microsoft.AspNetCore.Components; using Host = AIStudio.Provider.SelfHosted.Host; -using RustService = AIStudio.Tools.RustService; namespace AIStudio.Dialogs; @@ -15,7 +15,7 @@ namespace AIStudio.Dialogs; public partial class ProviderDialog : ComponentBase, ISecretId { [CascadingParameter] - private MudDialogInstance MudDialog { get; set; } = null!; + private IMudDialogInstance MudDialog { get; set; } = null!; /// /// The provider's number in the list. @@ -137,7 +137,9 @@ public partial class ProviderDialog : ComponentBase, ISecretId this.SettingsManager.InjectSpellchecking(SPELLCHECK_ATTRIBUTES); // Load the used instance names: + #pragma warning disable MWAIS0001 this.UsedInstanceNames = this.SettingsManager.ConfigurationData.Providers.Select(x => x.InstanceName.ToLowerInvariant()).ToList(); + #pragma warning restore MWAIS0001 // When editing, we need to load the data: if(this.IsEditing) diff --git a/app/MindWork AI Studio/Dialogs/RetrievalProcessDialog.razor.cs b/app/MindWork AI Studio/Dialogs/RetrievalProcessDialog.razor.cs index df01a7c1..99b5d9f8 100644 --- a/app/MindWork AI Studio/Dialogs/RetrievalProcessDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/RetrievalProcessDialog.razor.cs @@ -8,7 +8,7 @@ namespace AIStudio.Dialogs; public partial class RetrievalProcessDialog : ComponentBase { [CascadingParameter] - private MudDialogInstance MudDialog { get; set; } = null!; + private IMudDialogInstance MudDialog { get; set; } = null!; /// /// The user chosen retrieval process name. diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAgenda.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAgenda.razor new file mode 100644 index 00000000..cfdbdd47 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAgenda.razor @@ -0,0 +1,43 @@ +@using AIStudio.Settings +@inherits SettingsDialogBase + + + + + + Assistant: Agenda Planner Options + + + + + + + + + + + + + + + + + + + + + + + @if (this.SettingsManager.ConfigurationData.Agenda.PreselectedTargetLanguage is CommonLanguages.OTHER) + { + + } + + + + + + + Close + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAgenda.razor.cs b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAgenda.razor.cs new file mode 100644 index 00000000..261d6b31 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAgenda.razor.cs @@ -0,0 +1,3 @@ +namespace AIStudio.Dialogs.Settings; + +public partial class SettingsDialogAgenda : SettingsDialogBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAssistantBias.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAssistantBias.razor new file mode 100644 index 00000000..1aef4b4e --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAssistantBias.razor @@ -0,0 +1,40 @@ +@using AIStudio.Settings +@using AIStudio.Settings.DataModel +@inherits SettingsDialogBase + + + + + Assistant: Bias of the Day Options + + + + + + + + + You have learned about @this.SettingsManager.ConfigurationData.BiasOfTheDay.UsedBias.Count out of @BiasCatalog.ALL_BIAS.Count biases. + + + Reset + + + + + + + @if (this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectedTargetLanguage is CommonLanguages.OTHER) + { + + } + + + + + + + + Close + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelAssistantBias.razor.cs b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAssistantBias.razor.cs similarity index 84% rename from app/MindWork AI Studio/Components/Settings/SettingsPanelAssistantBias.razor.cs rename to app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAssistantBias.razor.cs index 375d644b..75767049 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelAssistantBias.razor.cs +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAssistantBias.razor.cs @@ -1,10 +1,6 @@ -using AIStudio.Dialogs; +namespace AIStudio.Dialogs.Settings; -using DialogOptions = AIStudio.Dialogs.DialogOptions; - -namespace AIStudio.Components.Settings; - -public partial class SettingsPanelAssistantBias : SettingsPanelBase +public partial class SettingsDialogAssistantBias : SettingsDialogBase { private async Task ResetBiasOfTheDayHistory() { @@ -24,4 +20,5 @@ public partial class SettingsPanelAssistantBias : SettingsPanelBase await this.MessageBus.SendMessage(this, Event.CONFIGURATION_CHANGED); } + } \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogBase.cs b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogBase.cs new file mode 100644 index 00000000..b1568427 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogBase.cs @@ -0,0 +1,94 @@ +using System.Diagnostics.CodeAnalysis; + +using AIStudio.Settings; +using AIStudio.Tools.Services; + +using Microsoft.AspNetCore.Components; + +namespace AIStudio.Dialogs.Settings; + +public abstract class SettingsDialogBase : ComponentBase, IMessageBusReceiver, IDisposable +{ + [CascadingParameter] + protected IMudDialogInstance MudDialog { get; set; } = null!; + + [Inject] + protected SettingsManager SettingsManager { get; init; } = null!; + + [Inject] + protected IDialogService DialogService { get; init; } = null!; + + [Inject] + protected MessageBus MessageBus { get; init; } = null!; + + [Inject] + protected RustService RustService { get; init; } = null!; + + protected readonly List> availableLLMProviders = new(); + protected readonly List> availableEmbeddingProviders = new(); + + #region Overrides of ComponentBase + + /// + protected override async Task OnInitializedAsync() + { + // Register this component with the message bus: + this.MessageBus.RegisterComponent(this); + this.MessageBus.ApplyFilters(this, [], [ Event.CONFIGURATION_CHANGED ]); + + this.UpdateProviders(); + this.UpdateEmbeddingProviders(); + await base.OnInitializedAsync(); + } + + #endregion + + protected void Close() => this.MudDialog.Cancel(); + + [SuppressMessage("Usage", "MWAIS0001:Direct access to `Providers` is not allowed")] + private void UpdateProviders() + { + this.availableLLMProviders.Clear(); + foreach (var provider in this.SettingsManager.ConfigurationData.Providers) + this.availableLLMProviders.Add(new (provider.InstanceName, provider.Id)); + } + + private void UpdateEmbeddingProviders() + { + this.availableEmbeddingProviders.Clear(); + foreach (var provider in this.SettingsManager.ConfigurationData.EmbeddingProviders) + this.availableEmbeddingProviders.Add(new (provider.Name, provider.Id)); + } + + #region Implementation of IMessageBusReceiver + + public string ComponentName => nameof(Settings); + + public Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, TMsg? data) + { + switch (triggeredEvent) + { + case Event.CONFIGURATION_CHANGED: + this.StateHasChanged(); + break; + } + + return Task.CompletedTask; + } + + public Task ProcessMessageWithResult(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data) + { + return Task.FromResult(default); + } + + #endregion + + #region Implementation of IDisposable + + public void Dispose() + { + this.MessageBus.Unregister(this); + } + + #endregion +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogCoding.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogCoding.razor new file mode 100644 index 00000000..c5a09136 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogCoding.razor @@ -0,0 +1,29 @@ +@using AIStudio.Assistants.Coding +@using AIStudio.Settings +@inherits SettingsDialogBase + + + + + + Assistant: Coding Options + + + + + + + + @if (this.SettingsManager.ConfigurationData.Coding.PreselectedProgrammingLanguage is CommonCodingLanguages.OTHER) + { + + } + + + + + + + Close + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogCoding.razor.cs b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogCoding.razor.cs new file mode 100644 index 00000000..f914bd72 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogCoding.razor.cs @@ -0,0 +1,3 @@ +namespace AIStudio.Dialogs.Settings; + +public partial class SettingsDialogCoding : SettingsDialogBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor new file mode 100644 index 00000000..17c05fc2 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor @@ -0,0 +1,68 @@ +@using AIStudio.Settings.DataModel +@inherits SettingsDialogBase + + + + + + + Configured Data Sources + + + + + You might configure different data sources. A data source can include one file, all files + in a directory, or data from your company. Later, you can incorporate these data sources + as needed when the AI requires this data to complete a certain task. + + + + + + + + + + + + # + Name + Type + Embedding + Actions + + + @context.Num + @context.Name + @context.Type.GetDisplayName() + @this.GetEmbeddingName(context) + + + + + + Edit + + + Delete + + + + + + + @if (this.SettingsManager.ConfigurationData.DataSources.Count == 0) + { + No data sources configured yet. + } + + + External Data (ERI-Server v1) + Local Directory + Local File + + + + Close + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor.cs b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor.cs new file mode 100644 index 00000000..d2c6cef8 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor.cs @@ -0,0 +1,223 @@ +using AIStudio.Settings; +using AIStudio.Settings.DataModel; +using AIStudio.Tools.ERIClient.DataModel; + +namespace AIStudio.Dialogs.Settings; + +public partial class SettingsDialogDataSources : SettingsDialogBase +{ + private string GetEmbeddingName(IDataSource dataSource) + { + if(dataSource is IInternalDataSource internalDataSource) + { + var matchedEmbedding = this.SettingsManager.ConfigurationData.EmbeddingProviders.FirstOrDefault(x => x.Id == internalDataSource.EmbeddingId); + if(matchedEmbedding == default) + return "No valid embedding"; + + return matchedEmbedding.Name; + } + + if(dataSource is IExternalDataSource) + return "External (ERI)"; + + return "Unknown"; + } + + private async Task AddDataSource(DataSourceType type) + { + IDataSource? addedDataSource = null; + switch (type) + { + case DataSourceType.LOCAL_FILE: + var localFileDialogParameters = new DialogParameters + { + { x => x.IsEditing, false }, + { x => x.AvailableEmbeddings, this.availableEmbeddingProviders } + }; + + var localFileDialogReference = await this.DialogService.ShowAsync("Add Local File as Data Source", localFileDialogParameters, DialogOptions.FULLSCREEN); + var localFileDialogResult = await localFileDialogReference.Result; + if (localFileDialogResult is null || localFileDialogResult.Canceled) + return; + + var localFile = (DataSourceLocalFile)localFileDialogResult.Data!; + localFile = localFile with { Num = this.SettingsManager.ConfigurationData.NextDataSourceNum++ }; + addedDataSource = localFile; + break; + + case DataSourceType.LOCAL_DIRECTORY: + var localDirectoryDialogParameters = new DialogParameters + { + { x => x.IsEditing, false }, + { x => x.AvailableEmbeddings, this.availableEmbeddingProviders } + }; + + var localDirectoryDialogReference = await this.DialogService.ShowAsync("Add Local Directory as Data Source", localDirectoryDialogParameters, DialogOptions.FULLSCREEN); + var localDirectoryDialogResult = await localDirectoryDialogReference.Result; + if (localDirectoryDialogResult is null || localDirectoryDialogResult.Canceled) + return; + + var localDirectory = (DataSourceLocalDirectory)localDirectoryDialogResult.Data!; + localDirectory = localDirectory with { Num = this.SettingsManager.ConfigurationData.NextDataSourceNum++ }; + addedDataSource = localDirectory; + break; + + case DataSourceType.ERI_V1: + var eriDialogParameters = new DialogParameters + { + { x => x.IsEditing, false }, + }; + + var eriDialogReference = await this.DialogService.ShowAsync("Add ERI v1 Data Source", eriDialogParameters, DialogOptions.FULLSCREEN); + var eriDialogResult = await eriDialogReference.Result; + if (eriDialogResult is null || eriDialogResult.Canceled) + return; + + var eriDataSource = (DataSourceERI_V1)eriDialogResult.Data!; + eriDataSource = eriDataSource with { Num = this.SettingsManager.ConfigurationData.NextDataSourceNum++ }; + addedDataSource = eriDataSource; + break; + } + + if(addedDataSource is null) + return; + + this.SettingsManager.ConfigurationData.DataSources.Add(addedDataSource); + await this.SettingsManager.StoreSettings(); + await this.MessageBus.SendMessage(this, Event.CONFIGURATION_CHANGED); + } + + private async Task EditDataSource(IDataSource dataSource) + { + IDataSource? editedDataSource = null; + switch (dataSource) + { + case DataSourceLocalFile localFile: + var localFileDialogParameters = new DialogParameters + { + { x => x.IsEditing, true }, + { x => x.DataSource, localFile }, + { x => x.AvailableEmbeddings, this.availableEmbeddingProviders } + }; + + var localFileDialogReference = await this.DialogService.ShowAsync("Edit Local File Data Source", localFileDialogParameters, DialogOptions.FULLSCREEN); + var localFileDialogResult = await localFileDialogReference.Result; + if (localFileDialogResult is null || localFileDialogResult.Canceled) + return; + + editedDataSource = (DataSourceLocalFile)localFileDialogResult.Data!; + break; + + case DataSourceLocalDirectory localDirectory: + var localDirectoryDialogParameters = new DialogParameters + { + { x => x.IsEditing, true }, + { x => x.DataSource, localDirectory }, + { x => x.AvailableEmbeddings, this.availableEmbeddingProviders } + }; + + var localDirectoryDialogReference = await this.DialogService.ShowAsync("Edit Local Directory Data Source", localDirectoryDialogParameters, DialogOptions.FULLSCREEN); + var localDirectoryDialogResult = await localDirectoryDialogReference.Result; + if (localDirectoryDialogResult is null || localDirectoryDialogResult.Canceled) + return; + + editedDataSource = (DataSourceLocalDirectory)localDirectoryDialogResult.Data!; + break; + + case DataSourceERI_V1 eriDataSource: + var eriDialogParameters = new DialogParameters + { + { x => x.IsEditing, true }, + { x => x.DataSource, eriDataSource }, + }; + + var eriDialogReference = await this.DialogService.ShowAsync("Edit ERI v1 Data Source", eriDialogParameters, DialogOptions.FULLSCREEN); + var eriDialogResult = await eriDialogReference.Result; + if (eriDialogResult is null || eriDialogResult.Canceled) + return; + + editedDataSource = (DataSourceERI_V1)eriDialogResult.Data!; + break; + } + + if(editedDataSource is null) + return; + + this.SettingsManager.ConfigurationData.DataSources[this.SettingsManager.ConfigurationData.DataSources.IndexOf(dataSource)] = editedDataSource; + + await this.SettingsManager.StoreSettings(); + await this.MessageBus.SendMessage(this, Event.CONFIGURATION_CHANGED); + } + + private async Task DeleteDataSource(IDataSource dataSource) + { + var dialogParameters = new DialogParameters + { + { "Message", $"Are you sure you want to delete the data source '{dataSource.Name}' of type {dataSource.Type.GetDisplayName()}?" }, + }; + + var dialogReference = await this.DialogService.ShowAsync("Delete Data Source", dialogParameters, DialogOptions.FULLSCREEN); + var dialogResult = await dialogReference.Result; + if (dialogResult is null || dialogResult.Canceled) + return; + + var applyChanges = dataSource is IInternalDataSource; + + // External data sources may need a secret for authentication: + if (dataSource is IExternalDataSource externalDataSource) + { + // When the auth method is NONE or KERBEROS, we don't need to delete a secret. + // In the case of KERBEROS, we don't store the Kerberos ticket in the secret store. + if(dataSource is IERIDataSource { AuthMethod: AuthMethod.NONE or AuthMethod.KERBEROS }) + applyChanges = true; + + // All other auth methods require a secret, which we need to delete now: + else + { + var deleteSecretResponse = await this.RustService.DeleteSecret(externalDataSource); + if (deleteSecretResponse.Success) + applyChanges = true; + } + } + + if(applyChanges) + { + this.SettingsManager.ConfigurationData.DataSources.Remove(dataSource); + await this.SettingsManager.StoreSettings(); + await this.MessageBus.SendMessage(this, Event.CONFIGURATION_CHANGED); + } + } + + private async Task ShowInformation(IDataSource dataSource) + { + switch (dataSource) + { + case DataSourceLocalFile localFile: + var localFileDialogParameters = new DialogParameters + { + { x => x.DataSource, localFile }, + }; + + await this.DialogService.ShowAsync("Local File Data Source Information", localFileDialogParameters, DialogOptions.FULLSCREEN); + break; + + case DataSourceLocalDirectory localDirectory: + var localDirectoryDialogParameters = new DialogParameters + { + { x => x.DataSource, localDirectory }, + }; + + await this.DialogService.ShowAsync("Local Directory Data Source Information", localDirectoryDialogParameters, DialogOptions.FULLSCREEN); + break; + + case DataSourceERI_V1 eriV1DataSource: + var eriV1DialogParameters = new DialogParameters + { + { x => x.DataSource, eriV1DataSource }, + }; + + await this.DialogService.ShowAsync("ERI v1 Data Source Information", eriV1DialogParameters, DialogOptions.FULLSCREEN); + break; + } + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogERIServer.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogERIServer.razor new file mode 100644 index 00000000..7ce8cc3b --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogERIServer.razor @@ -0,0 +1,27 @@ +@using AIStudio.Settings +@inherits SettingsDialogBase + + + + + + + Assistant: ERI Server Options + + + + + + + + + + Most ERI server options can be customized and saved directly in the ERI server assistant. + For this, the ERI server assistant has an auto-save function. + + + + + Close + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogERIServer.razor.cs b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogERIServer.razor.cs new file mode 100644 index 00000000..d2f36c8a --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogERIServer.razor.cs @@ -0,0 +1,3 @@ +namespace AIStudio.Dialogs.Settings; + +public partial class SettingsDialogERIServer : SettingsDialogBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogGrammarSpelling.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogGrammarSpelling.razor new file mode 100644 index 00000000..c7ae29dd --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogGrammarSpelling.razor @@ -0,0 +1,26 @@ +@using AIStudio.Settings +@inherits SettingsDialogBase + + + + + + Assistant: Grammar & Spelling Checker Options + + + + + + + @if (this.SettingsManager.ConfigurationData.GrammarSpelling.PreselectedTargetLanguage is CommonLanguages.OTHER) + { + + } + + + + + + Close + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogGrammarSpelling.razor.cs b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogGrammarSpelling.razor.cs new file mode 100644 index 00000000..e2a0da0c --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogGrammarSpelling.razor.cs @@ -0,0 +1,3 @@ +namespace AIStudio.Dialogs.Settings; + +public partial class SettingsDialogGrammarSpelling : SettingsDialogBase; diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogIconFinder.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogIconFinder.razor new file mode 100644 index 00000000..0562b38e --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogIconFinder.razor @@ -0,0 +1,22 @@ +@using AIStudio.Settings +@inherits SettingsDialogBase + + + + + + Assistant: Icon Finder Options + + + + + + + + + + + + Close + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogIconFinder.razor.cs b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogIconFinder.razor.cs new file mode 100644 index 00000000..708efdd0 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogIconFinder.razor.cs @@ -0,0 +1,3 @@ +namespace AIStudio.Dialogs.Settings; + +public partial class SettingsDialogIconFinder : SettingsDialogBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogJobPostings.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogJobPostings.razor new file mode 100644 index 00000000..505d5624 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogJobPostings.razor @@ -0,0 +1,33 @@ +@using AIStudio.Settings +@inherits SettingsDialogBase + + + + + + Assistant: Job Posting Options + + + + + + + + + + + + + + @if (this.SettingsManager.ConfigurationData.JobPostings.PreselectedTargetLanguage is CommonLanguages.OTHER) + { + + } + + + + + + Close + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogJobPostings.razor.cs b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogJobPostings.razor.cs new file mode 100644 index 00000000..328adc2f --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogJobPostings.razor.cs @@ -0,0 +1,3 @@ +namespace AIStudio.Dialogs.Settings; + +public partial class SettingsDialogJobPostings : SettingsDialogBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogLegalCheck.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogLegalCheck.razor new file mode 100644 index 00000000..10b2c286 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogLegalCheck.razor @@ -0,0 +1,24 @@ +@using AIStudio.Settings +@inherits SettingsDialogBase + + + + + Assistant: Legal Check Options + + + + + + + + + + + + + + + Close + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogLegalCheck.razor.cs b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogLegalCheck.razor.cs new file mode 100644 index 00000000..9139c228 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogLegalCheck.razor.cs @@ -0,0 +1,3 @@ +namespace AIStudio.Dialogs.Settings; + +public partial class SettingsDialogLegalCheck : SettingsDialogBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogMyTasks.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogMyTasks.razor new file mode 100644 index 00000000..91d318af --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogMyTasks.razor @@ -0,0 +1,27 @@ +@using AIStudio.Settings +@inherits SettingsDialogBase + + + + + + Assistant: My Tasks Options + + + + + + + @if (this.SettingsManager.ConfigurationData.MyTasks.PreselectedTargetLanguage is CommonLanguages.OTHER) + { + + } + + + + + + + Close + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogMyTasks.razor.cs b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogMyTasks.razor.cs new file mode 100644 index 00000000..d18c9860 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogMyTasks.razor.cs @@ -0,0 +1,3 @@ +namespace AIStudio.Dialogs.Settings; + +public partial class SettingsDialogMyTasks : SettingsDialogBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogRewrite.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogRewrite.razor new file mode 100644 index 00000000..e6bcf79f --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogRewrite.razor @@ -0,0 +1,28 @@ +@using AIStudio.Settings +@inherits SettingsDialogBase + + + + + + Assistant: Rewrite & Improve Text Options + + + + + + + @if (this.SettingsManager.ConfigurationData.RewriteImprove.PreselectedTargetLanguage is CommonLanguages.OTHER) + { + + } + + + + + + + + Close + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogRewrite.razor.cs b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogRewrite.razor.cs new file mode 100644 index 00000000..12a74394 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogRewrite.razor.cs @@ -0,0 +1,3 @@ +namespace AIStudio.Dialogs.Settings; + +public partial class SettingsDialogRewrite : SettingsDialogBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogSynonyms.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogSynonyms.razor new file mode 100644 index 00000000..2d7e29f4 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogSynonyms.razor @@ -0,0 +1,26 @@ +@using AIStudio.Settings +@inherits SettingsDialogBase + + + + + + Assistant: Synonyms Options + + + + + + + @if (this.SettingsManager.ConfigurationData.Synonyms.PreselectedLanguage is CommonLanguages.OTHER) + { + + } + + + + + + Close + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogSynonyms.razor.cs b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogSynonyms.razor.cs new file mode 100644 index 00000000..729e02c0 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogSynonyms.razor.cs @@ -0,0 +1,3 @@ +namespace AIStudio.Dialogs.Settings; + +public partial class SettingsDialogSynonyms : SettingsDialogBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogTextSummarizer.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogTextSummarizer.razor new file mode 100644 index 00000000..111fda45 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogTextSummarizer.razor @@ -0,0 +1,35 @@ +@using AIStudio.Assistants.TextSummarizer +@using AIStudio.Settings +@inherits SettingsDialogBase + + + + + + Assistant: Text Summarizer Options + + + + + + + + + + @if (this.SettingsManager.ConfigurationData.TextSummarizer.PreselectedTargetLanguage is CommonLanguages.OTHER) + { + + } + + @if(this.SettingsManager.ConfigurationData.TextSummarizer.PreselectedComplexity is Complexity.SCIENTIFIC_LANGUAGE_OTHER_EXPERTS) + { + + } + + + + + + Close + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogTextSummarizer.razor.cs b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogTextSummarizer.razor.cs new file mode 100644 index 00000000..de7bb910 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogTextSummarizer.razor.cs @@ -0,0 +1,3 @@ +namespace AIStudio.Dialogs.Settings; + +public partial class SettingsDialogTextSummarizer : SettingsDialogBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogTranslation.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogTranslation.razor new file mode 100644 index 00000000..8cb87ac7 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogTranslation.razor @@ -0,0 +1,30 @@ +@using AIStudio.Settings +@inherits SettingsDialogBase + + + + + Assistant: Translator Options + + + + + + + + + + + + @if (this.SettingsManager.ConfigurationData.Translation.PreselectedTargetLanguage is CommonLanguages.OTHER) + { + + } + + + + + + Close + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogTranslation.razor.cs b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogTranslation.razor.cs new file mode 100644 index 00000000..1dc31ea8 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogTranslation.razor.cs @@ -0,0 +1,3 @@ +namespace AIStudio.Dialogs.Settings; + +public partial class SettingsDialogTranslation : SettingsDialogBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogWritingEMails.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogWritingEMails.razor new file mode 100644 index 00000000..a6f4bca9 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogWritingEMails.razor @@ -0,0 +1,30 @@ +@using AIStudio.Settings +@inherits SettingsDialogBase + + + + + + Assistant: Writing E-Mails Options + + + + + + + + + @if (this.SettingsManager.ConfigurationData.EMail.PreselectedTargetLanguage is CommonLanguages.OTHER) + { + + } + + + + + + + + Close + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogWritingEMails.razor.cs b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogWritingEMails.razor.cs new file mode 100644 index 00000000..11c04324 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogWritingEMails.razor.cs @@ -0,0 +1,3 @@ +namespace AIStudio.Dialogs.Settings; + +public partial class SettingsDialogWritingEMails : SettingsDialogBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/SingleInputDialog.razor.cs b/app/MindWork AI Studio/Dialogs/SingleInputDialog.razor.cs index 5b0e8e88..914b20e4 100644 --- a/app/MindWork AI Studio/Dialogs/SingleInputDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/SingleInputDialog.razor.cs @@ -7,7 +7,7 @@ namespace AIStudio.Dialogs; public partial class SingleInputDialog : ComponentBase { [CascadingParameter] - private MudDialogInstance MudDialog { get; set; } = null!; + private IMudDialogInstance MudDialog { get; set; } = null!; [Parameter] public string Message { get; set; } = string.Empty; diff --git a/app/MindWork AI Studio/Dialogs/UpdateDialog.razor.cs b/app/MindWork AI Studio/Dialogs/UpdateDialog.razor.cs index aefd5518..555cb182 100644 --- a/app/MindWork AI Studio/Dialogs/UpdateDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/UpdateDialog.razor.cs @@ -15,7 +15,7 @@ public partial class UpdateDialog : ComponentBase private static readonly MetaDataAttribute META_DATA = ASSEMBLY.GetCustomAttribute()!; [CascadingParameter] - private MudDialogInstance MudDialog { get; set; } = null!; + private IMudDialogInstance MudDialog { get; set; } = null!; [Parameter] public UpdateResponse UpdateResponse { get; set; } diff --git a/app/MindWork AI Studio/Dialogs/WorkspaceSelectionDialog.razor.cs b/app/MindWork AI Studio/Dialogs/WorkspaceSelectionDialog.razor.cs index f123fc87..f2c3d090 100644 --- a/app/MindWork AI Studio/Dialogs/WorkspaceSelectionDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/WorkspaceSelectionDialog.razor.cs @@ -9,7 +9,7 @@ namespace AIStudio.Dialogs; public partial class WorkspaceSelectionDialog : ComponentBase { [CascadingParameter] - private MudDialogInstance MudDialog { get; set; } = null!; + private IMudDialogInstance MudDialog { get; set; } = null!; [Parameter] public string Message { get; set; } = string.Empty; diff --git a/app/MindWork AI Studio/Layout/MainLayout.razor.cs b/app/MindWork AI Studio/Layout/MainLayout.razor.cs index e18afe1d..4c45a3b9 100644 --- a/app/MindWork AI Studio/Layout/MainLayout.razor.cs +++ b/app/MindWork AI Studio/Layout/MainLayout.razor.cs @@ -1,6 +1,7 @@ using AIStudio.Dialogs; using AIStudio.Settings; using AIStudio.Settings.DataModel; +using AIStudio.Tools.PluginSystem; using AIStudio.Tools.Rust; using AIStudio.Tools.Services; @@ -8,7 +9,6 @@ using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Routing; using DialogOptions = AIStudio.Dialogs.DialogOptions; -using RustService = AIStudio.Tools.RustService; namespace AIStudio.Layout; @@ -82,6 +82,23 @@ public partial class MainLayout : LayoutComponentBase, IMessageBusReceiver, IDis // Ensure that all settings are loaded: await this.SettingsManager.LoadSettings(); + // + // We cannot process the plugins before the settings are loaded, + // and we know our data directory. + // + if(PreviewFeatures.PRE_PLUGINS_2025.IsEnabled(this.SettingsManager)) + { + // Ensure that all internal plugins are present: + await PluginFactory.EnsureInternalPlugins(); + + // Load (but not start) all plugins, without waiting for them: + var pluginLoadingTimeout = new CancellationTokenSource(TimeSpan.FromSeconds(5)); + _ = PluginFactory.LoadAll(pluginLoadingTimeout.Token); + + // Set up hot reloading for plugins: + PluginFactory.SetUpHotReloading(); + } + // Register this component with the message bus: this.MessageBus.RegisterComponent(this); this.MessageBus.ApplyFilters(this, [], [ Event.UPDATE_AVAILABLE, Event.USER_SEARCH_FOR_UPDATE, Event.CONFIGURATION_CHANGED, Event.COLOR_THEME_CHANGED ]); @@ -103,39 +120,15 @@ public partial class MainLayout : LayoutComponentBase, IMessageBusReceiver, IDis private void LoadNavItems() { - var palette = this.ColorTheme.GetCurrentPalette(this.SettingsManager); - var isWriterModePreviewEnabled = PreviewFeatures.PRE_WRITER_MODE_2024.IsEnabled(this.SettingsManager); - if (!isWriterModePreviewEnabled) - { - this.navItems = new List - { - new("Home", Icons.Material.Filled.Home, palette.DarkLighten, palette.GrayLight, Routes.HOME, true), - new("Chat", Icons.Material.Filled.Chat, palette.DarkLighten, palette.GrayLight, Routes.CHAT, false), - new("Assistants", Icons.Material.Filled.Apps, palette.DarkLighten, palette.GrayLight, Routes.ASSISTANTS, false), - new("Supporters", Icons.Material.Filled.Favorite, palette.Error.Value, "#801a00", Routes.SUPPORTERS, false), - new("About", Icons.Material.Filled.Info, palette.DarkLighten, palette.GrayLight, Routes.ABOUT, false), - new("Settings", Icons.Material.Filled.Settings, palette.DarkLighten, palette.GrayLight, Routes.SETTINGS, false), - }; - } - else - { - this.navItems = new List - { - new("Home", Icons.Material.Filled.Home, palette.DarkLighten, palette.GrayLight, Routes.HOME, true), - new("Chat", Icons.Material.Filled.Chat, palette.DarkLighten, palette.GrayLight, Routes.CHAT, false), - new("Assistants", Icons.Material.Filled.Apps, palette.DarkLighten, palette.GrayLight, Routes.ASSISTANTS, false), - new("Writer", Icons.Material.Filled.Create, palette.DarkLighten, palette.GrayLight, Routes.WRITER, false), - new("Supporters", Icons.Material.Filled.Favorite, palette.Error.Value, "#801a00", Routes.SUPPORTERS, false), - new("About", Icons.Material.Filled.Info, palette.DarkLighten, palette.GrayLight, Routes.ABOUT, false), - new("Settings", Icons.Material.Filled.Settings, palette.DarkLighten, palette.GrayLight, Routes.SETTINGS, false), - }; - } + this.navItems = new List(this.GetNavItems()); } #endregion #region Implementation of IMessageBusReceiver + public string ComponentName => nameof(MainLayout); + public async Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) { switch (triggeredEvent) @@ -180,6 +173,25 @@ public partial class MainLayout : LayoutComponentBase, IMessageBusReceiver, IDis } #endregion + + private IEnumerable GetNavItems() + { + var palette = this.ColorTheme.GetCurrentPalette(this.SettingsManager); + + yield return new("Home", Icons.Material.Filled.Home, palette.DarkLighten, palette.GrayLight, Routes.HOME, true); + yield return new("Chat", Icons.Material.Filled.Chat, palette.DarkLighten, palette.GrayLight, Routes.CHAT, false); + yield return new("Assistants", Icons.Material.Filled.Apps, palette.DarkLighten, palette.GrayLight, Routes.ASSISTANTS, false); + + if (PreviewFeatures.PRE_WRITER_MODE_2024.IsEnabled(this.SettingsManager)) + yield return new("Writer", Icons.Material.Filled.Create, palette.DarkLighten, palette.GrayLight, Routes.WRITER, false); + + if (PreviewFeatures.PRE_PLUGINS_2025.IsEnabled(this.SettingsManager)) + yield return new("Plugins", Icons.Material.TwoTone.Extension, palette.DarkLighten, palette.GrayLight, Routes.PLUGINS, false); + + yield return new("Supporters", Icons.Material.Filled.Favorite, palette.Error.Value, "#801a00", Routes.SUPPORTERS, false); + yield return new("About", Icons.Material.Filled.Info, palette.DarkLighten, palette.GrayLight, Routes.ABOUT, false); + yield return new("Settings", Icons.Material.Filled.Settings, palette.DarkLighten, palette.GrayLight, Routes.SETTINGS, false); + } private async Task DismissUpdate() { diff --git a/app/MindWork AI Studio/MindWork AI Studio.csproj b/app/MindWork AI Studio/MindWork AI Studio.csproj index 0d6fc288..90069618 100644 --- a/app/MindWork AI Studio/MindWork AI Studio.csproj +++ b/app/MindWork AI Studio/MindWork AI Studio.csproj @@ -5,7 +5,7 @@ Thorsten Sommer - net8.0 + net9.0 enable CS8600;CS8602;CS8603 enable @@ -31,6 +31,7 @@ CS8974: Converting method group to non-delegate type; Did you intend to invoke the method? We have this issue with MudBlazor validation methods. --> IL2026, CS8974 + latest @@ -40,17 +41,22 @@ - + - - - - - + + + + + + + + + + diff --git a/app/MindWork AI Studio/Pages/About.razor b/app/MindWork AI Studio/Pages/About.razor index 07f87804..282e5e72 100644 --- a/app/MindWork AI Studio/Pages/About.razor +++ b/app/MindWork AI Studio/Pages/About.razor @@ -1,64 +1,122 @@ @attribute [Route(Routes.ABOUT)] -About MindWork AI Studio +
+ About MindWork AI Studio - - - - - The following list shows the versions of the MindWork AI Studio, the used compilers, build time, etc.: - - - - - - - - - - - - Check for updates - - - - - - + + + + + The following list shows the versions of the MindWork AI Studio, the used compilers, build time, etc.: + + + + + + + + + + + + Check for updates + + - - - + + + + Discover MindWork AI's mission and vision on our official homepage. + + + Browse AI Studio's source code on GitHub — we welcome your contributions. + + + Connect AI Studio to your organization's data with our External Retrieval Interface (ERI). + + + View our project roadmap and help shape AI Studio's future development. + + + Did you find a bug or are you experiencing issues? Report your concern here. + + + Have feature ideas? Submit suggestions for future AI Studio enhancements. + + + + + + + + + + + Explanation + + + AI Studio creates a log file at startup, in which events during startup are recorded. After startup, + another log file is created that records all events that occur during the use of the app. This + includes any errors that may occur. Depending on when an error occurs (at startup or during use), + the contents of these log files can be helpful for troubleshooting. Sensitive information such as + passwords is not included in the log files. + + + + By clicking on the respective path, the path is copied to the clipboard. You might open these files + with a text editor to view their contents. + + + + Startup log file + + + + + + + Usage log file + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/app/MindWork AI Studio/Pages/About.razor.cs b/app/MindWork AI Studio/Pages/About.razor.cs index 100ebdbe..51727506 100644 --- a/app/MindWork AI Studio/Pages/About.razor.cs +++ b/app/MindWork AI Studio/Pages/About.razor.cs @@ -1,5 +1,8 @@ using System.Reflection; +using AIStudio.Tools.Rust; +using AIStudio.Tools.Services; + using Microsoft.AspNetCore.Components; namespace AIStudio.Pages; @@ -9,9 +12,15 @@ public partial class About : ComponentBase [Inject] private MessageBus MessageBus { get; init; } = null!; + [Inject] + private RustService RustService { get; init; } = null!; + + [Inject] + private ISnackbar Snackbar { get; init; } = null!; + private static readonly Assembly ASSEMBLY = Assembly.GetExecutingAssembly(); private static readonly MetaDataAttribute META_DATA = ASSEMBLY.GetCustomAttribute()!; - + private static string VersionDotnetRuntime => $"Used .NET runtime: v{META_DATA.DotnetVersion}"; private static string VersionDotnetSdk => $"Used .NET SDK: v{META_DATA.DotnetSdkVersion}"; @@ -26,6 +35,28 @@ public partial class About : ComponentBase private static string TauriVersion => $"Tauri: v{META_DATA.TauriVersion}"; + private GetLogPathsResponse logPaths; + + #region Overrides of ComponentBase + + private async Task CopyStartupLogPath() + { + await this.RustService.CopyText2Clipboard(this.Snackbar, this.logPaths.LogStartupPath); + } + + private async Task CopyAppLogPath() + { + await this.RustService.CopyText2Clipboard(this.Snackbar, this.logPaths.LogAppPath); + } + + protected override async Task OnInitializedAsync() + { + this.logPaths = await this.RustService.GetLogPaths(); + await base.OnInitializedAsync(); + } + + #endregion + private const string LICENSE = """ # Functional Source License, Version 1.1, MIT Future License diff --git a/app/MindWork AI Studio/Pages/Assistants.razor b/app/MindWork AI Studio/Pages/Assistants.razor index 212f8b5a..58c0deb1 100644 --- a/app/MindWork AI Studio/Pages/Assistants.razor +++ b/app/MindWork AI Studio/Pages/Assistants.razor @@ -1,51 +1,54 @@ +@using AIStudio.Dialogs.Settings @using AIStudio.Settings.DataModel @attribute [Route(Routes.ASSISTANTS)] - - Assistants - +
+ + Assistants + - - - - General - - - - - - - - + + + + General + + + + + + + + - - Business - - - - - - - - - + + Business + + + + + + + + + - - Learning - - - - - - - Software Engineering - - - - @if (PreviewFeatures.PRE_RAG_2024.IsEnabled(this.SettingsManager)) - { - - } - - - \ No newline at end of file + + Learning + + + + + + + Software Engineering + + + + @if (PreviewFeatures.PRE_RAG_2024.IsEnabled(this.SettingsManager)) + { + + } + + + +
\ No newline at end of file diff --git a/app/MindWork AI Studio/Pages/Chat.razor b/app/MindWork AI Studio/Pages/Chat.razor index 2f56c2b5..b77edf18 100644 --- a/app/MindWork AI Studio/Pages/Chat.razor +++ b/app/MindWork AI Studio/Pages/Chat.razor @@ -2,109 +2,100 @@ @using AIStudio.Settings.DataModel @inherits MSGComponentBase - - @if (this.chatThread is not null && this.chatThread.WorkspaceId != Guid.Empty) - { - @($"Chat in Workspace \"{this.currentWorkspaceName}\"") - } - else - { - @("Temporary Chat") - } - +
+ + + @if (this.chatThread is not null && this.chatThread.WorkspaceId != Guid.Empty) + { + @($"Chat in Workspace \"{this.currentWorkspaceName}\"") + } + else + { + @("Temporary Chat") + } + - -@if (this.AreWorkspacesVisible) -{ - - - @if (this.AreWorkspacesHidden) - { - - - - - - } - @if (this.SettingsManager.ConfigurationData.Workspace.StorageBehavior is not WorkspaceStorageBehavior.DISABLE_WORKSPACES) - { - @if ((this.SettingsManager.ConfigurationData.Workspace.DisplayBehavior is WorkspaceDisplayBehavior.TOGGLE_SIDEBAR && this.SettingsManager.ConfigurationData.Workspace.IsSidebarVisible) || this.SettingsManager.ConfigurationData.Workspace.DisplayBehavior is WorkspaceDisplayBehavior.SIDEBAR_ALWAYS_VISIBLE) + + @if (this.AreWorkspacesVisible) + { + + + @if (this.SettingsManager.ConfigurationData.Workspace.DisplayBehavior is WorkspaceDisplayBehavior.TOGGLE_SIDEBAR && this.SettingsManager.ConfigurationData.Workspace.IsSidebarVisible) { - @if (this.SettingsManager.ConfigurationData.Workspace.DisplayBehavior is WorkspaceDisplayBehavior.TOGGLE_SIDEBAR && this.SettingsManager.ConfigurationData.Workspace.IsSidebarVisible) - { - - - - - - - - - - - } - else - { - - - - - - } + // Case: Sidebar can be toggled and is currently visible + + + + + + + + + + } - } - - - + else + { + // Case: Sidebar is always visible + + + + + + } + + + + + + } + else if (this.SettingsManager.ConfigurationData.Workspace.StorageBehavior is not WorkspaceStorageBehavior.DISABLE_WORKSPACES && this.SettingsManager.ConfigurationData.Workspace.DisplayBehavior is WorkspaceDisplayBehavior.TOGGLE_SIDEBAR) + { + // Case: Sidebar can be toggled and is currently hidden + + + + + + + - - - -} -else if(this.SettingsManager.ConfigurationData.Workspace.StorageBehavior is not WorkspaceStorageBehavior.DISABLE_WORKSPACES && this.SettingsManager.ConfigurationData.Workspace.DisplayBehavior is WorkspaceDisplayBehavior.TOGGLE_SIDEBAR) -{ - - - - - - - + WorkspaceName="name => this.UpdateWorkspaceName(name)"/> + + } + else + { + // Case: Workspaces are disabled or shown in an overlay - -} -else -{ - -} + WorkspaceName="name => this.UpdateWorkspaceName(name)"/> + } -@if ( - this.SettingsManager.ConfigurationData.Workspace.StorageBehavior != WorkspaceStorageBehavior.DISABLE_WORKSPACES - && this.SettingsManager.ConfigurationData.Workspace.DisplayBehavior is WorkspaceDisplayBehavior.TOGGLE_OVERLAY) -{ - - - - - Your workspaces - - - - - - - - -} \ No newline at end of file + @if ( + this.SettingsManager.ConfigurationData.Workspace.StorageBehavior != WorkspaceStorageBehavior.DISABLE_WORKSPACES + && this.SettingsManager.ConfigurationData.Workspace.DisplayBehavior is WorkspaceDisplayBehavior.TOGGLE_OVERLAY) + { + + + + + Your workspaces + + + + + + + + + } +
\ No newline at end of file diff --git a/app/MindWork AI Studio/Pages/Chat.razor.cs b/app/MindWork AI Studio/Pages/Chat.razor.cs index 8546b64d..3ee7ecc9 100644 --- a/app/MindWork AI Studio/Pages/Chat.razor.cs +++ b/app/MindWork AI Studio/Pages/Chat.razor.cs @@ -28,6 +28,8 @@ public partial class Chat : MSGComponentBase protected override async Task OnInitializedAsync() { + this.ApplyFilters([], [ Event.WORKSPACE_TOGGLE_OVERLAY ]); + this.splitterPosition = this.SettingsManager.ConfigurationData.Workspace.SplitterPosition; this.splitterSaveTimer.AutoReset = false; this.splitterSaveTimer.Elapsed += async (_, _) => @@ -71,9 +73,17 @@ public partial class Chat : MSGComponentBase } private double ReadSplitterPosition => this.AreWorkspacesHidden ? 6 : this.splitterPosition; + + private void UpdateWorkspaceName(string workspaceName) + { + this.currentWorkspaceName = workspaceName; + this.StateHasChanged(); + } #region Overrides of MSGComponentBase + public override string ComponentName => nameof(Chat); + public override Task ProcessIncomingMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) where T : default { switch (triggeredEvent) diff --git a/app/MindWork AI Studio/Pages/Home.razor b/app/MindWork AI Studio/Pages/Home.razor index a86b8372..de74a626 100644 --- a/app/MindWork AI Studio/Pages/Home.razor +++ b/app/MindWork AI Studio/Pages/Home.razor @@ -1,40 +1,42 @@ @attribute [Route(Routes.HOME)] - -Let's get started +
+ + Let's get started - - + + - - - Welcome to MindWork AI Studio! - - - Thank you for considering MindWork AI Studio for your AI needs. This app is designed to help you harness - the power of Large Language Models (LLMs). Please note that this app doesn't come with an integrated - LLM. Instead, you will need to bring an API key from a suitable provider. - - - Here's what makes MindWork AI Studio stand out: - - - - We hope you enjoy using MindWork AI Studio to bring your AI projects to life! - - + + + Welcome to MindWork AI Studio! + + + Thank you for considering MindWork AI Studio for your AI needs. This app is designed to help you harness + the power of Large Language Models (LLMs). Please note that this app doesn't come with an integrated + LLM. Instead, you will need to bring an API key from a suitable provider. + + + Here's what makes MindWork AI Studio stand out: + + + + We hope you enjoy using MindWork AI Studio to bring your AI projects to life! + + - - - + + + - - - - - - - + + + + + + + - - \ No newline at end of file + + +
\ No newline at end of file diff --git a/app/MindWork AI Studio/Pages/Home.razor.cs b/app/MindWork AI Studio/Pages/Home.razor.cs index 924767f1..026fafe5 100644 --- a/app/MindWork AI Studio/Pages/Home.razor.cs +++ b/app/MindWork AI Studio/Pages/Home.razor.cs @@ -26,17 +26,18 @@ public partial class Home : ComponentBase private async Task ReadLastChangeAsync() { var latest = Changelog.LOGS.MaxBy(n => n.Build); - var response = await this.HttpClient.GetAsync($"changelog/{latest.Filename}"); + using var response = await this.HttpClient.GetAsync($"changelog/{latest.Filename}"); this.LastChangeContent = await response.Content.ReadAsStringAsync(); } private static readonly TextItem[] ITEMS_ADVANTAGES = [ new("Free of charge", "The app is free to use, both for personal and commercial purposes."), - new("Independence", "You are not tied to any single provider. Instead, you might choose the provider that best suits your needs. Right now, we support OpenAI (GPT4o etc.), Mistral, Anthropic (Claude), Google Gemini, xAI (Grok), and self-hosted models using llama.cpp, ollama, LM Studio, Groq, or Fireworks."), + new("Independence", "You are not tied to any single provider. Instead, you might choose the provider that best suits your needs. Right now, we support OpenAI (GPT4o, o1, etc.), Mistral, Anthropic (Claude), Google Gemini, xAI (Grok), DeepSeek, and self-hosted models using llama.cpp, ollama, LM Studio, Groq, or Fireworks. For scientists and employees of research institutions, we also support Helmholtz and GWDG AI services. These are available through federated logins like eduGAIN to all 18 Helmholtz Centers, the Max Planck Society, most German, and many international universities."), + new("Assistants", "You just want to quickly translate a text? AI Studio has so-called assistants for such and other tasks. No prompting is necessary when working with these assistants."), new("Unrestricted usage", "Unlike services like ChatGPT, which impose limits after intensive use, MindWork AI Studio offers unlimited usage through the providers API."), new("Cost-effective", "You only pay for what you use, which can be cheaper than monthly subscription services like ChatGPT Plus, especially if used infrequently. But beware, here be dragons: For extremely intensive usage, the API costs can be significantly higher. Unfortunately, providers currently do not offer a way to display current costs in the app. Therefore, check your account with the respective provider to see how your costs are developing. When available, use prepaid and set a cost limit."), - new("Privacy", "The data entered into the app is not used for training by the providers since we are using the provider's API."), + new("Privacy", "You can control which providers receive your data using the provider confidence settings. For example, you can set different protection levels for writing emails compared to general chats, etc. Additionally, most providers guarantee that they won't use your data to train new AI systems."), new("Flexibility", "Choose the provider and model best suited for your current task."), new("No bloatware", "The app requires minimal storage for installation and operates with low memory usage. Additionally, it has a minimal impact on system resources, which is beneficial for battery life."), ]; diff --git a/app/MindWork AI Studio/Pages/Plugins.razor b/app/MindWork AI Studio/Pages/Plugins.razor new file mode 100644 index 00000000..6d5bf8ce --- /dev/null +++ b/app/MindWork AI Studio/Pages/Plugins.razor @@ -0,0 +1,77 @@ +@using AIStudio.Tools.PluginSystem +@attribute [Route(Routes.PLUGINS)] + +
+ + Plugins + + + + + + + + + + + + + + Plugins + Actions + + + + @switch (context.Key) + { + case GROUP_ENABLED: + + Enabled Plugins + + break; + + case GROUP_DISABLED: + + Disabled Plugins + + break; + + case GROUP_INTERNAL: + + Internal Plugins + + break; + } + + + + + +
+ @((MarkupString)context.IconSVG) +
+
+
+ + + + @context.Name + + + @context.Description + + + + + @if (!context.IsInternal) + { + var isEnabled = this.SettingsManager.IsPluginEnabled(context); + + + + } + +
+
+
+
\ No newline at end of file diff --git a/app/MindWork AI Studio/Pages/Plugins.razor.cs b/app/MindWork AI Studio/Pages/Plugins.razor.cs new file mode 100644 index 00000000..9504c0ff --- /dev/null +++ b/app/MindWork AI Studio/Pages/Plugins.razor.cs @@ -0,0 +1,82 @@ +using AIStudio.Settings; +using AIStudio.Tools.PluginSystem; + +using Microsoft.AspNetCore.Components; + +namespace AIStudio.Pages; + +public partial class Plugins : ComponentBase, IMessageBusReceiver +{ + private const string GROUP_ENABLED = "Enabled"; + private const string GROUP_DISABLED = "Disabled"; + private const string GROUP_INTERNAL = "Internal"; + + [Inject] + private MessageBus MessageBus { get; init; } = null!; + + [Inject] + private SettingsManager SettingsManager { get; init; } = null!; + + private TableGroupDefinition groupConfig = null!; + + #region Overrides of ComponentBase + + protected override async Task OnInitializedAsync() + { + this.MessageBus.RegisterComponent(this); + this.MessageBus.ApplyFilters(this, [], [ Event.PLUGINS_RELOADED ]); + + this.groupConfig = new TableGroupDefinition + { + Expandable = true, + IsInitiallyExpanded = true, + Selector = pluginMeta => + { + if (pluginMeta.IsInternal) + return GROUP_INTERNAL; + + return this.SettingsManager.IsPluginEnabled(pluginMeta) + ? GROUP_ENABLED + : GROUP_DISABLED; + } + }; + + await base.OnInitializedAsync(); + } + + #endregion + + private async Task PluginActivationStateChanged(IPluginMetadata pluginMeta) + { + if (this.SettingsManager.IsPluginEnabled(pluginMeta)) + this.SettingsManager.ConfigurationData.EnabledPlugins.Remove(pluginMeta.Id); + else + this.SettingsManager.ConfigurationData.EnabledPlugins.Add(pluginMeta.Id); + + await this.SettingsManager.StoreSettings(); + await this.MessageBus.SendMessage(this, Event.CONFIGURATION_CHANGED); + } + + #region Implementation of IMessageBusReceiver + + public string ComponentName => nameof(Plugins); + + public Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) + { + switch (triggeredEvent) + { + case Event.PLUGINS_RELOADED: + this.InvokeAsync(this.StateHasChanged); + break; + } + + return Task.CompletedTask; + } + + public Task ProcessMessageWithResult(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data) + { + return Task.FromResult(default); + } + + #endregion +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Pages/Settings.razor b/app/MindWork AI Studio/Pages/Settings.razor index 4a004734..c048a542 100644 --- a/app/MindWork AI Studio/Pages/Settings.razor +++ b/app/MindWork AI Studio/Pages/Settings.razor @@ -1,30 +1,31 @@ @attribute [Route(Routes.SETTINGS)] @using AIStudio.Components.Settings +@using AIStudio.Settings.DataModel -Settings +
+ Settings - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + @if (PreviewFeatures.PRE_RAG_2024.IsEnabled(this.SettingsManager)) + { + + } + + + + + + + @if (PreviewFeatures.PRE_RAG_2024.IsEnabled(this.SettingsManager)) + { + + + } + + + + +
\ No newline at end of file diff --git a/app/MindWork AI Studio/Pages/Settings.razor.cs b/app/MindWork AI Studio/Pages/Settings.razor.cs index d06ab02e..57c34c5a 100644 --- a/app/MindWork AI Studio/Pages/Settings.razor.cs +++ b/app/MindWork AI Studio/Pages/Settings.razor.cs @@ -6,6 +6,9 @@ namespace AIStudio.Pages; public partial class Settings : ComponentBase, IMessageBusReceiver, IDisposable { + [Inject] + private SettingsManager SettingsManager { get; init; } = null!; + [Inject] private MessageBus MessageBus { get; init; } = null!; @@ -27,6 +30,8 @@ public partial class Settings : ComponentBase, IMessageBusReceiver, IDisposable #region Implementation of IMessageBusReceiver + public string ComponentName => nameof(Settings); + public Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, TMsg? data) { switch (triggeredEvent) diff --git a/app/MindWork AI Studio/Pages/Supporters.razor b/app/MindWork AI Studio/Pages/Supporters.razor index 6793d6d9..91a744a3 100644 --- a/app/MindWork AI Studio/Pages/Supporters.razor +++ b/app/MindWork AI Studio/Pages/Supporters.razor @@ -1,63 +1,103 @@ @attribute [Route(Routes.SUPPORTERS)] -Supporters +
+ Supporters + - - -
- Our Titans - - In this section, we highlight the titan supporters of MindWork AI Studio. Titans are prestigious companies that provide significant support to our mission. - - - For companies, sponsoring MindWork AI Studio is not only a way to support innovation but also a valuable opportunity for public relations and marketing. Your company's name and logo will be featured prominently, showcasing your commitment to using cutting-edge AI tools and enhancing your reputation as an innovative enterprise. - - - Become our first Titan - -
- - - - - - - Individual Contributors - + + + +
+ Our Titans + + In this section, we highlight the titan supporters of MindWork AI Studio. Titans are prestigious companies that provide significant support to our mission. + + + For companies, sponsoring MindWork AI Studio is not only a way to support innovation but also a valuable opportunity for public relations and marketing. Your company's name and logo will be featured prominently, showcasing your commitment to using cutting-edge AI tools and enhancing your reputation as an innovative enterprise. + + + Become our first Titan + +
- - Become a contributor - - - - The first 10 supporters who make a monthly contribution: - - - - - + + + + + + Individual Contributors + - - The first 10 supporters who make a one-time contribution: - - - - - - + + Become a contributor + - - - - - Business Contributors - + + The first 10 supporters who make a monthly contribution: + + + + + + - - Become a contributor - - - - + + The first 10 supporters who make a one-time contribution: + + + + +
+
-
\ No newline at end of file + + + + + Business Contributors + + + + Become a contributor + + + + + + + + + + + + + + Code Contributions + + + + + + + + + + + + + + + Moderation, Design, Wiki, and Documentation + + + + + + + + + + + +
+
\ No newline at end of file diff --git a/app/MindWork AI Studio/Pages/Writer.razor b/app/MindWork AI Studio/Pages/Writer.razor index bf65c3e7..790e3e07 100644 --- a/app/MindWork AI Studio/Pages/Writer.razor +++ b/app/MindWork AI Studio/Pages/Writer.razor @@ -1,57 +1,58 @@ @attribute [Route(Routes.WRITER)] @inherits MSGComponentBase - - Writer - +
+ + Writer + + - + + + + - - - - - - - - - @if (this.isStreaming) - { - - } - - - \ No newline at end of file + + + + @if (this.isStreaming) + { + + } + + + +
\ No newline at end of file diff --git a/app/MindWork AI Studio/Pages/Writer.razor.cs b/app/MindWork AI Studio/Pages/Writer.razor.cs index 7b6a8cf5..42b23abc 100644 --- a/app/MindWork AI Studio/Pages/Writer.razor.cs +++ b/app/MindWork AI Studio/Pages/Writer.razor.cs @@ -41,6 +41,8 @@ public partial class Writer : MSGComponentBase, IAsyncDisposable #region Overrides of MSGComponentBase + public override string ComponentName => nameof(Writer); + public override Task ProcessIncomingMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) where T : default { return Task.CompletedTask; @@ -104,17 +106,19 @@ public partial class Writer : MSGComponentBase, IAsyncDisposable }; var time = DateTimeOffset.Now; + var lastUserPrompt = new ContentText + { + // We use the maximum 160 characters from the end of the text: + Text = this.userInput.Length > 160 ? this.userInput[^160..] : this.userInput, + }; + this.chatThread.Blocks.Clear(); this.chatThread.Blocks.Add(new ContentBlock { Time = time, ContentType = ContentType.TEXT, Role = ChatRole.USER, - Content = new ContentText - { - // We use the maximum 160 characters from the end of the text: - Text = this.userInput.Length > 160 ? this.userInput[^160..] : this.userInput, - }, + Content = lastUserPrompt, }); var aiText = new ContentText @@ -135,7 +139,7 @@ public partial class Writer : MSGComponentBase, IAsyncDisposable this.isStreaming = true; this.StateHasChanged(); - await aiText.CreateFromProviderAsync(this.providerSettings.CreateProvider(this.Logger), this.SettingsManager, this.providerSettings.Model, this.chatThread); + this.chatThread = await aiText.CreateFromProviderAsync(this.providerSettings.CreateProvider(this.Logger), this.providerSettings.Model, lastUserPrompt, this.chatThread); this.suggestion = aiText.Text; this.isStreaming = false; diff --git a/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/contentHome.lua b/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/contentHome.lua new file mode 100644 index 00000000..f26d9aff --- /dev/null +++ b/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/contentHome.lua @@ -0,0 +1,3 @@ +CONTENT_HOME = { + LetsGetStarted = "Lass uns anfangen", +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/icon.lua b/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/icon.lua new file mode 100644 index 00000000..c10dd294 --- /dev/null +++ b/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/icon.lua @@ -0,0 +1,11 @@ +SVG = [[ + + + + + + + + + + ]] \ No newline at end of file diff --git a/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua b/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua new file mode 100644 index 00000000..ab05f0bc --- /dev/null +++ b/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua @@ -0,0 +1,45 @@ +require("contentHome") +require("icon") + +-- The ID for this plugin: +ID = "43065dbc-78d0-45b7-92be-f14c2926e2dc" + +-- The icon for the plugin: +ICON_SVG = SVG + +-- The name of the plugin: +NAME = "MindWork AI Studio - German / Deutsch" + +-- The description of the plugin: +DESCRIPTION = "Dieses Plugin bietet deutsche Sprachunterstützung für MindWork AI Studio." + +-- The version of the plugin: +VERSION = "1.0.0" + +-- The type of the plugin: +TYPE = "LANGUAGE" + +-- The authors of the plugin: +AUTHORS = {"MindWork AI Community"} + +-- The support contact for the plugin: +SUPPORT_CONTACT = "MindWork AI Community" + +-- The source URL for the plugin: +SOURCE_URL = "https://github.com/MindWorkAI/AI-Studio" + +-- The categories for the plugin: +CATEGORIES = { "CORE" } + +-- The target groups for the plugin: +TARGET_GROUPS = { "EVERYONE" } + +-- The flag for whether the plugin is maintained: +IS_MAINTAINED = true + +-- When the plugin is deprecated, this message will be shown to users: +DEPRECATION_MESSAGE = "" + +UI_TEXT_CONTENT = { + HOME = CONTENT_HOME, +} diff --git a/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/contentHome.lua b/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/contentHome.lua new file mode 100644 index 00000000..d1805fd0 --- /dev/null +++ b/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/contentHome.lua @@ -0,0 +1,3 @@ +CONTENT_HOME = { + LetsGetStarted = "Let's get started", +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/icon.lua b/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/icon.lua new file mode 100644 index 00000000..75320473 --- /dev/null +++ b/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/icon.lua @@ -0,0 +1,12 @@ +SVG = [[ + + + + + + + + + + + ]] \ No newline at end of file diff --git a/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua b/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua new file mode 100644 index 00000000..d6c98d49 --- /dev/null +++ b/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua @@ -0,0 +1,45 @@ +require("contentHome") +require("icon") + +-- The ID for this plugin: +ID = "97dfb1ba-50c4-4440-8dfa-6575daf543c8" + +-- The icon for the plugin: +ICON_SVG = SVG + +-- The name of the plugin: +NAME = "MindWork AI Studio - US English" + +-- The description of the plugin: +DESCRIPTION = "This plugin provides US English language support for MindWork AI Studio." + +-- The version of the plugin: +VERSION = "1.0.0" + +-- The type of the plugin: +TYPE = "LANGUAGE" + +-- The authors of the plugin: +AUTHORS = {"MindWork AI Community"} + +-- The support contact for the plugin: +SUPPORT_CONTACT = "MindWork AI Community" + +-- The source URL for the plugin: +SOURCE_URL = "https://github.com/MindWorkAI/AI-Studio" + +-- The categories for the plugin: +CATEGORIES = { "CORE" } + +-- The target groups for the plugin: +TARGET_GROUPS = { "EVERYONE" } + +-- The flag for whether the plugin is maintained: +IS_MAINTAINED = true + +-- When the plugin is deprecated, this message will be shown to users: +DEPRECATION_MESSAGE = "" + +UI_TEXT_CONTENT = { + HOME = CONTENT_HOME, +} diff --git a/app/MindWork AI Studio/Program.cs b/app/MindWork AI Studio/Program.cs index 0844cae7..8283a481 100644 --- a/app/MindWork AI Studio/Program.cs +++ b/app/MindWork AI Studio/Program.cs @@ -1,5 +1,6 @@ using AIStudio.Agents; using AIStudio.Settings; +using AIStudio.Tools.PluginSystem; using AIStudio.Tools.Services; using Microsoft.AspNetCore.Server.Kestrel.Core; @@ -21,6 +22,8 @@ internal sealed class Program public static RustService RUST_SERVICE = null!; public static Encryption ENCRYPTION = null!; public static string API_TOKEN = null!; + public static IServiceProvider SERVICE_PROVIDER = null!; + public static ILoggerFactory LOGGER_FACTORY = null!; public static async Task Main(string[] args) { @@ -115,7 +118,10 @@ internal sealed class Program builder.Services.AddMudMarkdownClipboardService(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); + builder.Services.AddSingleton(); builder.Services.AddTransient(); + builder.Services.AddTransient(); + builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddHostedService(); builder.Services.AddHostedService(); @@ -143,12 +149,25 @@ internal sealed class Program // Execute the builder to get the app: var app = builder.Build(); + // Get the logging factory for e.g., static classes: + LOGGER_FACTORY = app.Services.GetRequiredService(); + + // Get a program logger: + var programLogger = app.Services.GetRequiredService>(); + programLogger.LogInformation("Starting the AI Studio server."); + + // Store the service provider (DI). We need it later for some classes, + // which are not part of the request pipeline: + SERVICE_PROVIDER = app.Services; + // Initialize the encryption service: + programLogger.LogInformation("Initializing the encryption service."); var encryptionLogger = app.Services.GetRequiredService>(); var encryption = new Encryption(encryptionLogger, secretPassword, secretKeySalt); var encryptionInitializer = encryption.Initialize(); // Set the logger for the Rust service: + programLogger.LogInformation("Initializing the Rust service."); var rustLogger = app.Services.GetRequiredService>(); rust.SetLogger(rustLogger); rust.SetEncryptor(encryption); @@ -156,6 +175,7 @@ internal sealed class Program RUST_SERVICE = rust; ENCRYPTION = encryption; + programLogger.LogInformation("Initialize internal file system."); app.Use(Redirect.HandlerContentAsync); #if DEBUG @@ -175,9 +195,22 @@ internal sealed class Program .AddInteractiveServerRenderMode(); var serverTask = app.RunAsync(); + programLogger.LogInformation("Server was started successfully."); await encryptionInitializer; await rust.AppIsReady(); + programLogger.LogInformation("The AI Studio server is ready."); + + TaskScheduler.UnobservedTaskException += (sender, taskArgs) => + { + programLogger.LogError(taskArgs.Exception, $"Unobserved task exception by sender '{sender ?? "n/a"}'."); + taskArgs.SetObserved(); + }; + await serverTask; + + RUST_SERVICE.Dispose(); + PluginFactory.Dispose(); + programLogger.LogInformation("The AI Studio server was stopped."); } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Provider/Anthropic/ProviderAnthropic.cs b/app/MindWork AI Studio/Provider/Anthropic/ProviderAnthropic.cs index d0e20d34..7693d21f 100644 --- a/app/MindWork AI Studio/Provider/Anthropic/ProviderAnthropic.cs +++ b/app/MindWork AI Studio/Provider/Anthropic/ProviderAnthropic.cs @@ -1,3 +1,4 @@ +using System.Net.Http.Headers; using System.Runtime.CompilerServices; using System.Text; using System.Text.Json; @@ -86,21 +87,15 @@ public sealed class ProviderAnthropic(ILogger logger) : BaseProvider("https://ap /// public override Task> GetTextModels(string? apiKeyProvisional = null, CancellationToken token = default) { - return Task.FromResult(new[] + var additionalModels = new[] { - new Model("claude-3-5-sonnet-latest", "Claude 3.5 Sonnet (latest)"), - new Model("claude-3-5-sonnet-20240620", "Claude 3.5 Sonnet (20. June 2024)"), - new Model("claude-3-5-sonnet-20241022", "Claude 3.5 Sonnet (22. October 2024)"), - - new Model("claude-3-5-haiku-latest", "Claude 3.5 Haiku (latest)"), - new Model("claude-3-5-heiku-20241022", "Claude 3.5 Haiku (22. October 2024)"), - - new Model("claude-3-opus-20240229", "Claude 3.0 Opus (29. February 2024)"), - new Model("claude-3-opus-latest", "Claude 3.0 Opus (latest)"), - - new Model("claude-3-sonnet-20240229", "Claude 3.0 Sonnet (29. February 2024)"), - new Model("claude-3-haiku-20240307", "Claude 3.0 Haiku (7. March 2024)"), - }.AsEnumerable()); + new Model("claude-3-7-sonnet-latest", "Claude 3.7 Sonnet (Latest)"), + new Model("claude-3-5-sonnet-latest", "Claude 3.5 Sonnet (Latest)"), + new Model("claude-3-5-haiku-latest", "Claude 3.5 Haiku (Latest)"), + new Model("claude-3-opus-latest", "Claude 3 Opus (Latest)"), + }; + + return this.LoadModels(token, apiKeyProvisional).ContinueWith(t => t.Result.Concat(additionalModels).OrderBy(x => x.Id).AsEnumerable(), token); } /// @@ -116,4 +111,37 @@ public sealed class ProviderAnthropic(ILogger logger) : BaseProvider("https://ap } #endregion + + private async Task> LoadModels(CancellationToken token, string? apiKeyProvisional = null) + { + var secretKey = apiKeyProvisional switch + { + not null => apiKeyProvisional, + _ => await RUST_SERVICE.GetAPIKey(this) switch + { + { Success: true } result => await result.Secret.Decrypt(ENCRYPTION), + _ => null, + } + }; + + if (secretKey is null) + return []; + + using var request = new HttpRequestMessage(HttpMethod.Get, "models?limit=100"); + + // Set the authorization header: + request.Headers.Add("x-api-key", secretKey); + + // Set the Anthropic version: + request.Headers.Add("anthropic-version", "2023-06-01"); + + request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", secretKey); + + using var response = await this.httpClient.SendAsync(request, token); + if(!response.IsSuccessStatusCode) + return []; + + var modelResponse = await response.Content.ReadFromJsonAsync(JSON_SERIALIZER_OPTIONS, token); + return modelResponse.Data; + } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Provider/BaseProvider.cs b/app/MindWork AI Studio/Provider/BaseProvider.cs index 25143834..3ad4e8f2 100644 --- a/app/MindWork AI Studio/Provider/BaseProvider.cs +++ b/app/MindWork AI Studio/Provider/BaseProvider.cs @@ -4,8 +4,7 @@ using System.Text.Json; using AIStudio.Chat; using AIStudio.Settings; - -using RustService = AIStudio.Tools.RustService; +using AIStudio.Tools.Services; namespace AIStudio.Provider; @@ -103,9 +102,14 @@ public abstract class BaseProvider : IProvider, ISecretId { using var request = await requestBuilder(); + // // Send the request with the ResponseHeadersRead option. // This allows us to read the stream as soon as the headers are received. // This is important because we want to stream the responses. + // + // Please notice: We do not dispose the response here. The caller is responsible + // for disposing the response object. This is important because the response + // object is used to read the stream. var nextResponse = await this.httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, token); if (nextResponse.IsSuccessStatusCode) { diff --git a/app/MindWork AI Studio/Provider/Confidence.cs b/app/MindWork AI Studio/Provider/Confidence.cs index ac5557a8..087ac4e0 100644 --- a/app/MindWork AI Studio/Provider/Confidence.cs +++ b/app/MindWork AI Studio/Provider/Confidence.cs @@ -53,6 +53,12 @@ public sealed record Confidence Description = "The provider operates its service from the USA and is subject to **US jurisdiction**. In case of suspicion, authorities in the USA can access your data. However, **your data is not used for training** purposes.", }; + public static readonly Confidence CHINA_NO_TRAINING = new() + { + Level = ConfidenceLevel.MODERATE, + Description = "The provider operates its service from China. In case of suspicion, authorities in the respective countries of operation may access your data. However, **your data is not used for training** purposes.", + }; + public static readonly Confidence GDPR_NO_TRAINING = new() { Level = ConfidenceLevel.MEDIUM, diff --git a/app/MindWork AI Studio/Provider/DeepSeek/ProviderDeepSeek.cs b/app/MindWork AI Studio/Provider/DeepSeek/ProviderDeepSeek.cs new file mode 100644 index 00000000..b4ce57a0 --- /dev/null +++ b/app/MindWork AI Studio/Provider/DeepSeek/ProviderDeepSeek.cs @@ -0,0 +1,136 @@ +using System.Net.Http.Headers; +using System.Runtime.CompilerServices; +using System.Text; +using System.Text.Json; + +using AIStudio.Chat; +using AIStudio.Provider.OpenAI; +using AIStudio.Settings; + +namespace AIStudio.Provider.DeepSeek; + +public sealed class ProviderDeepSeek(ILogger logger) : BaseProvider("https://api.deepseek.com/", logger) +{ + #region Implementation of IProvider + + /// + public override string Id => LLMProviders.DEEP_SEEK.ToName(); + + /// + public override string InstanceName { get; set; } = "DeepSeek"; + + /// + public override async IAsyncEnumerable StreamChatCompletion(Model chatModel, ChatThread chatThread, SettingsManager settingsManager, [EnumeratorCancellation] CancellationToken token = default) + { + // Get the API key: + var requestedSecret = await RUST_SERVICE.GetAPIKey(this); + if(!requestedSecret.Success) + yield break; + + // Prepare the system prompt: + var systemPrompt = new Message + { + Role = "system", + Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread, this.logger), + }; + + // Prepare the DeepSeek HTTP chat request: + var deepSeekChatRequest = JsonSerializer.Serialize(new ChatRequest + { + Model = chatModel.Id, + + // Build the messages: + // - First of all the system prompt + // - Then none-empty user and AI messages + Messages = [systemPrompt, ..chatThread.Blocks.Where(n => n.ContentType is ContentType.TEXT && !string.IsNullOrWhiteSpace((n.Content as ContentText)?.Text)).Select(n => new Message + { + Role = n.Role switch + { + ChatRole.USER => "user", + ChatRole.AI => "assistant", + ChatRole.AGENT => "assistant", + ChatRole.SYSTEM => "system", + + _ => "user", + }, + + Content = n.Content switch + { + ContentText text => text.Text, + _ => string.Empty, + } + }).ToList()], + Stream = true, + }, JSON_SERIALIZER_OPTIONS); + + async Task RequestBuilder() + { + // Build the HTTP post request: + var request = new HttpRequestMessage(HttpMethod.Post, "chat/completions"); + + // Set the authorization header: + request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", await requestedSecret.Secret.Decrypt(ENCRYPTION)); + + // Set the content: + request.Content = new StringContent(deepSeekChatRequest, Encoding.UTF8, "application/json"); + return request; + } + + await foreach (var content in this.StreamChatCompletionInternal("Helmholtz", RequestBuilder, token)) + yield return content; + } + + #pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously + /// + public override async IAsyncEnumerable StreamImageCompletion(Model imageModel, string promptPositive, string promptNegative = FilterOperator.String.Empty, ImageURL referenceImageURL = default, [EnumeratorCancellation] CancellationToken token = default) + { + yield break; + } + #pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously + + /// + public override Task> GetTextModels(string? apiKeyProvisional = null, CancellationToken token = default) + { + return this.LoadModels(token, apiKeyProvisional); + } + + /// + public override Task> GetImageModels(string? apiKeyProvisional = null, CancellationToken token = default) + { + return Task.FromResult(Enumerable.Empty()); + } + + /// + public override Task> GetEmbeddingModels(string? apiKeyProvisional = null, CancellationToken token = default) + { + return Task.FromResult(Enumerable.Empty()); + } + + #endregion + + private async Task> LoadModels(CancellationToken token, string? apiKeyProvisional = null) + { + var secretKey = apiKeyProvisional switch + { + not null => apiKeyProvisional, + _ => await RUST_SERVICE.GetAPIKey(this) switch + { + { Success: true } result => await result.Secret.Decrypt(ENCRYPTION), + _ => null, + } + }; + + if (secretKey is null) + return []; + + using var request = new HttpRequestMessage(HttpMethod.Get, "models"); + request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", secretKey); + + using var response = await this.httpClient.SendAsync(request, token); + if(!response.IsSuccessStatusCode) + return []; + + var modelResponse = await response.Content.ReadFromJsonAsync(token); + return modelResponse.Data; + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Provider/GWDG/ProviderGWDG.cs b/app/MindWork AI Studio/Provider/GWDG/ProviderGWDG.cs new file mode 100644 index 00000000..c0562a69 --- /dev/null +++ b/app/MindWork AI Studio/Provider/GWDG/ProviderGWDG.cs @@ -0,0 +1,138 @@ +using System.Net.Http.Headers; +using System.Runtime.CompilerServices; +using System.Text; +using System.Text.Json; + +using AIStudio.Chat; +using AIStudio.Provider.OpenAI; +using AIStudio.Settings; + +namespace AIStudio.Provider.GWDG; + +public sealed class ProviderGWDG(ILogger logger) : BaseProvider("https://chat-ai.academiccloud.de/v1/", logger) +{ + #region Implementation of IProvider + + /// + public override string Id => LLMProviders.GWDG.ToName(); + + /// + public override string InstanceName { get; set; } = "GWDG SAIA"; + + /// + public override async IAsyncEnumerable StreamChatCompletion(Model chatModel, ChatThread chatThread, SettingsManager settingsManager, [EnumeratorCancellation] CancellationToken token = default) + { + // Get the API key: + var requestedSecret = await RUST_SERVICE.GetAPIKey(this); + if(!requestedSecret.Success) + yield break; + + // Prepare the system prompt: + var systemPrompt = new Message + { + Role = "system", + Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread, this.logger), + }; + + // Prepare the GWDG HTTP chat request: + var gwdgChatRequest = JsonSerializer.Serialize(new ChatRequest + { + Model = chatModel.Id, + + // Build the messages: + // - First of all the system prompt + // - Then none-empty user and AI messages + Messages = [systemPrompt, ..chatThread.Blocks.Where(n => n.ContentType is ContentType.TEXT && !string.IsNullOrWhiteSpace((n.Content as ContentText)?.Text)).Select(n => new Message + { + Role = n.Role switch + { + ChatRole.USER => "user", + ChatRole.AI => "assistant", + ChatRole.AGENT => "assistant", + ChatRole.SYSTEM => "system", + + _ => "user", + }, + + Content = n.Content switch + { + ContentText text => text.Text, + _ => string.Empty, + } + }).ToList()], + Stream = true, + }, JSON_SERIALIZER_OPTIONS); + + async Task RequestBuilder() + { + // Build the HTTP post request: + var request = new HttpRequestMessage(HttpMethod.Post, "chat/completions"); + + // Set the authorization header: + request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", await requestedSecret.Secret.Decrypt(ENCRYPTION)); + + // Set the content: + request.Content = new StringContent(gwdgChatRequest, Encoding.UTF8, "application/json"); + return request; + } + + await foreach (var content in this.StreamChatCompletionInternal("GWDG", RequestBuilder, token)) + yield return content; + } + + #pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously + /// + public override async IAsyncEnumerable StreamImageCompletion(Model imageModel, string promptPositive, string promptNegative = FilterOperator.String.Empty, ImageURL referenceImageURL = default, [EnumeratorCancellation] CancellationToken token = default) + { + yield break; + } + #pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously + + /// + public override async Task> GetTextModels(string? apiKeyProvisional = null, CancellationToken token = default) + { + var models = await this.LoadModels(token, apiKeyProvisional); + return models.Where(model => !model.Id.StartsWith("e5-mistral-7b-instruct", StringComparison.InvariantCultureIgnoreCase)); + } + + /// + public override Task> GetImageModels(string? apiKeyProvisional = null, CancellationToken token = default) + { + return Task.FromResult(Enumerable.Empty()); + } + + /// + public override async Task> GetEmbeddingModels(string? apiKeyProvisional = null, CancellationToken token = default) + { + var models = await this.LoadModels(token, apiKeyProvisional); + return models.Where(model => model.Id.StartsWith("e5-", StringComparison.InvariantCultureIgnoreCase)); + } + + #endregion + + private async Task> LoadModels(CancellationToken token, string? apiKeyProvisional = null) + { + var secretKey = apiKeyProvisional switch + { + not null => apiKeyProvisional, + _ => await RUST_SERVICE.GetAPIKey(this) switch + { + { Success: true } result => await result.Secret.Decrypt(ENCRYPTION), + _ => null, + } + }; + + if (secretKey is null) + return []; + + using var request = new HttpRequestMessage(HttpMethod.Get, "models"); + request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", secretKey); + + using var response = await this.httpClient.SendAsync(request, token); + if(!response.IsSuccessStatusCode) + return []; + + var modelResponse = await response.Content.ReadFromJsonAsync(token); + return modelResponse.Data; + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Provider/Google/ProviderGoogle.cs b/app/MindWork AI Studio/Provider/Google/ProviderGoogle.cs index e0d5da77..942cb245 100644 --- a/app/MindWork AI Studio/Provider/Google/ProviderGoogle.cs +++ b/app/MindWork AI Studio/Provider/Google/ProviderGoogle.cs @@ -136,8 +136,8 @@ public class ProviderGoogle(ILogger logger) : BaseProvider("https://generativela if (secretKey is null) return default; - var request = new HttpRequestMessage(HttpMethod.Get, $"models?key={secretKey}"); - var response = await this.httpClient.SendAsync(request, token); + using var request = new HttpRequestMessage(HttpMethod.Get, $"models?key={secretKey}"); + using var response = await this.httpClient.SendAsync(request, token); if(!response.IsSuccessStatusCode) return default; diff --git a/app/MindWork AI Studio/Provider/Groq/ProviderGroq.cs b/app/MindWork AI Studio/Provider/Groq/ProviderGroq.cs index 2fc7e88f..f32a31b5 100644 --- a/app/MindWork AI Studio/Provider/Groq/ProviderGroq.cs +++ b/app/MindWork AI Studio/Provider/Groq/ProviderGroq.cs @@ -127,10 +127,10 @@ public class ProviderGroq(ILogger logger) : BaseProvider("https://api.groq.com/o if (secretKey is null) return []; - var request = new HttpRequestMessage(HttpMethod.Get, "models"); + using var request = new HttpRequestMessage(HttpMethod.Get, "models"); request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", secretKey); - var response = await this.httpClient.SendAsync(request, token); + using var response = await this.httpClient.SendAsync(request, token); if(!response.IsSuccessStatusCode) return []; diff --git a/app/MindWork AI Studio/Provider/Helmholtz/ProviderHelmholtz.cs b/app/MindWork AI Studio/Provider/Helmholtz/ProviderHelmholtz.cs new file mode 100644 index 00000000..b8450503 --- /dev/null +++ b/app/MindWork AI Studio/Provider/Helmholtz/ProviderHelmholtz.cs @@ -0,0 +1,142 @@ +using System.Net.Http.Headers; +using System.Runtime.CompilerServices; +using System.Text; +using System.Text.Json; + +using AIStudio.Chat; +using AIStudio.Provider.OpenAI; +using AIStudio.Settings; + +namespace AIStudio.Provider.Helmholtz; + +public sealed class ProviderHelmholtz(ILogger logger) : BaseProvider("https://api.helmholtz-blablador.fz-juelich.de/v1/", logger) +{ + #region Implementation of IProvider + + /// + public override string Id => LLMProviders.HELMHOLTZ.ToName(); + + /// + public override string InstanceName { get; set; } = "Helmholtz Blablador"; + + /// + public override async IAsyncEnumerable StreamChatCompletion(Model chatModel, ChatThread chatThread, SettingsManager settingsManager, [EnumeratorCancellation] CancellationToken token = default) + { + // Get the API key: + var requestedSecret = await RUST_SERVICE.GetAPIKey(this); + if(!requestedSecret.Success) + yield break; + + // Prepare the system prompt: + var systemPrompt = new Message + { + Role = "system", + Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread, this.logger), + }; + + // Prepare the Helmholtz HTTP chat request: + var helmholtzChatRequest = JsonSerializer.Serialize(new ChatRequest + { + Model = chatModel.Id, + + // Build the messages: + // - First of all the system prompt + // - Then none-empty user and AI messages + Messages = [systemPrompt, ..chatThread.Blocks.Where(n => n.ContentType is ContentType.TEXT && !string.IsNullOrWhiteSpace((n.Content as ContentText)?.Text)).Select(n => new Message + { + Role = n.Role switch + { + ChatRole.USER => "user", + ChatRole.AI => "assistant", + ChatRole.AGENT => "assistant", + ChatRole.SYSTEM => "system", + + _ => "user", + }, + + Content = n.Content switch + { + ContentText text => text.Text, + _ => string.Empty, + } + }).ToList()], + Stream = true, + }, JSON_SERIALIZER_OPTIONS); + + async Task RequestBuilder() + { + // Build the HTTP post request: + var request = new HttpRequestMessage(HttpMethod.Post, "chat/completions"); + + // Set the authorization header: + request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", await requestedSecret.Secret.Decrypt(ENCRYPTION)); + + // Set the content: + request.Content = new StringContent(helmholtzChatRequest, Encoding.UTF8, "application/json"); + return request; + } + + await foreach (var content in this.StreamChatCompletionInternal("Helmholtz", RequestBuilder, token)) + yield return content; + } + + #pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously + /// + public override async IAsyncEnumerable StreamImageCompletion(Model imageModel, string promptPositive, string promptNegative = FilterOperator.String.Empty, ImageURL referenceImageURL = default, [EnumeratorCancellation] CancellationToken token = default) + { + yield break; + } + #pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously + + /// + public override async Task> GetTextModels(string? apiKeyProvisional = null, CancellationToken token = default) + { + var models = await this.LoadModels(token, apiKeyProvisional); + return models.Where(model => !model.Id.StartsWith("text-", StringComparison.InvariantCultureIgnoreCase) && + !model.Id.StartsWith("alias-embedding", StringComparison.InvariantCultureIgnoreCase)); + } + + /// + public override Task> GetImageModels(string? apiKeyProvisional = null, CancellationToken token = default) + { + return Task.FromResult(Enumerable.Empty()); + } + + /// + public override async Task> GetEmbeddingModels(string? apiKeyProvisional = null, CancellationToken token = default) + { + var models = await this.LoadModels(token, apiKeyProvisional); + return models.Where(model => + model.Id.StartsWith("alias-embedding", StringComparison.InvariantCultureIgnoreCase) || + model.Id.StartsWith("text-", StringComparison.InvariantCultureIgnoreCase) || + model.Id.Contains("gritlm", StringComparison.InvariantCultureIgnoreCase)); + } + + #endregion + + private async Task> LoadModels(CancellationToken token, string? apiKeyProvisional = null) + { + var secretKey = apiKeyProvisional switch + { + not null => apiKeyProvisional, + _ => await RUST_SERVICE.GetAPIKey(this) switch + { + { Success: true } result => await result.Secret.Decrypt(ENCRYPTION), + _ => null, + } + }; + + if (secretKey is null) + return []; + + using var request = new HttpRequestMessage(HttpMethod.Get, "models"); + request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", secretKey); + + using var response = await this.httpClient.SendAsync(request, token); + if(!response.IsSuccessStatusCode) + return []; + + var modelResponse = await response.Content.ReadFromJsonAsync(token); + return modelResponse.Data; + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Provider/LLMProviders.cs b/app/MindWork AI Studio/Provider/LLMProviders.cs index 2078e5d0..92c0873b 100644 --- a/app/MindWork AI Studio/Provider/LLMProviders.cs +++ b/app/MindWork AI Studio/Provider/LLMProviders.cs @@ -12,9 +12,13 @@ public enum LLMProviders MISTRAL = 3, GOOGLE = 7, X = 8, + DEEP_SEEK = 11, FIREWORKS = 5, GROQ = 6, SELF_HOSTED = 4, + + HELMHOLTZ = 9, + GWDG = 10, } \ No newline at end of file diff --git a/app/MindWork AI Studio/Provider/LLMProvidersExtensions.cs b/app/MindWork AI Studio/Provider/LLMProvidersExtensions.cs index f9addf8d..7fb80e7f 100644 --- a/app/MindWork AI Studio/Provider/LLMProvidersExtensions.cs +++ b/app/MindWork AI Studio/Provider/LLMProvidersExtensions.cs @@ -1,7 +1,10 @@ using AIStudio.Provider.Anthropic; +using AIStudio.Provider.DeepSeek; using AIStudio.Provider.Fireworks; using AIStudio.Provider.Google; using AIStudio.Provider.Groq; +using AIStudio.Provider.GWDG; +using AIStudio.Provider.Helmholtz; using AIStudio.Provider.Mistral; using AIStudio.Provider.OpenAI; using AIStudio.Provider.SelfHosted; @@ -28,12 +31,16 @@ public static class LLMProvidersExtensions LLMProviders.MISTRAL => "Mistral", LLMProviders.GOOGLE => "Google", LLMProviders.X => "xAI", + LLMProviders.DEEP_SEEK => "DeepSeek", LLMProviders.GROQ => "Groq", LLMProviders.FIREWORKS => "Fireworks.ai", LLMProviders.SELF_HOSTED => "Self-hosted", + LLMProviders.HELMHOLTZ => "Helmholtz Blablador", + LLMProviders.GWDG => "GWDG SAIA", + _ => "Unknown", }; @@ -66,8 +73,13 @@ public static class LLMProvidersExtensions LLMProviders.X => Confidence.USA_NO_TRAINING.WithRegion("America, U.S.").WithSources("https://x.ai/legal/terms-of-service-enterprise").WithLevel(settingsManager.GetConfiguredConfidenceLevel(llmProvider)), + LLMProviders.DEEP_SEEK => Confidence.CHINA_NO_TRAINING.WithRegion("Asia").WithSources("https://cdn.deepseek.com/policies/en-US/deepseek-open-platform-terms-of-service.html").WithLevel(settingsManager.GetConfiguredConfidenceLevel(llmProvider)), + LLMProviders.SELF_HOSTED => Confidence.SELF_HOSTED.WithLevel(settingsManager.GetConfiguredConfidenceLevel(llmProvider)), + LLMProviders.HELMHOLTZ => Confidence.GDPR_NO_TRAINING.WithRegion("Europe, Germany").WithSources("https://helmholtz.cloud/services/?serviceID=d7d5c597-a2f6-4bd1-b71e-4d6499d98570").WithLevel(settingsManager.GetConfiguredConfidenceLevel(llmProvider)), + LLMProviders.GWDG => Confidence.GDPR_NO_TRAINING.WithRegion("Europe, Germany").WithSources("https://docs.hpc.gwdg.de/services/chat-ai/data-privacy/index.html").WithLevel(settingsManager.GetConfiguredConfidenceLevel(llmProvider)), + _ => Confidence.UNKNOWN.WithLevel(settingsManager.GetConfiguredConfidenceLevel(llmProvider)), }; @@ -84,6 +96,7 @@ public static class LLMProvidersExtensions LLMProviders.OPEN_AI => true, LLMProviders.MISTRAL => true, LLMProviders.GOOGLE => true, + LLMProviders.HELMHOLTZ => true, // // Providers that do not support embeddings: @@ -92,6 +105,8 @@ public static class LLMProvidersExtensions LLMProviders.ANTHROPIC => false, LLMProviders.FIREWORKS => false, LLMProviders.X => false, + LLMProviders.GWDG => false, + LLMProviders.DEEP_SEEK => false, // // Self-hosted providers are treated as a special case anyway. @@ -134,12 +149,16 @@ public static class LLMProvidersExtensions LLMProviders.MISTRAL => new ProviderMistral(logger) { InstanceName = instanceName }, LLMProviders.GOOGLE => new ProviderGoogle(logger) { InstanceName = instanceName }, LLMProviders.X => new ProviderX(logger) { InstanceName = instanceName }, + LLMProviders.DEEP_SEEK => new ProviderDeepSeek(logger) { InstanceName = instanceName }, LLMProviders.GROQ => new ProviderGroq(logger) { InstanceName = instanceName }, LLMProviders.FIREWORKS => new ProviderFireworks(logger) { InstanceName = instanceName }, LLMProviders.SELF_HOSTED => new ProviderSelfHosted(logger, host, hostname) { InstanceName = instanceName }, + LLMProviders.HELMHOLTZ => new ProviderHelmholtz(logger) { InstanceName = instanceName }, + LLMProviders.GWDG => new ProviderGWDG(logger) { InstanceName = instanceName }, + _ => new NoProvider(), }; } @@ -157,10 +176,14 @@ public static class LLMProvidersExtensions LLMProviders.ANTHROPIC => "https://console.anthropic.com/dashboard", LLMProviders.GOOGLE => "https://console.cloud.google.com/", LLMProviders.X => "https://accounts.x.ai/sign-up", + LLMProviders.DEEP_SEEK => "https://platform.deepseek.com/sign_up", LLMProviders.GROQ => "https://console.groq.com/", LLMProviders.FIREWORKS => "https://fireworks.ai/login", + LLMProviders.HELMHOLTZ => "https://sdlaml.pages.jsc.fz-juelich.de/ai/guides/blablador_api_access/#step-1-register-on-gitlab", + LLMProviders.GWDG => "https://docs.hpc.gwdg.de/services/saia/index.html#api-request", + _ => string.Empty, }; @@ -173,6 +196,7 @@ public static class LLMProvidersExtensions LLMProviders.GROQ => "https://console.groq.com/settings/usage", LLMProviders.GOOGLE => "https://console.cloud.google.com/billing", LLMProviders.FIREWORKS => "https://fireworks.ai/account/billing", + LLMProviders.DEEP_SEEK => "https://platform.deepseek.com/usage", _ => string.Empty, }; @@ -186,6 +210,7 @@ public static class LLMProvidersExtensions LLMProviders.GROQ => true, LLMProviders.FIREWORKS => true, LLMProviders.GOOGLE => true, + LLMProviders.DEEP_SEEK => true, _ => false, }; @@ -227,9 +252,12 @@ public static class LLMProvidersExtensions LLMProviders.ANTHROPIC => true, LLMProviders.GOOGLE => true, LLMProviders.X => true, + LLMProviders.DEEP_SEEK => true, LLMProviders.GROQ => true, LLMProviders.FIREWORKS => true, + LLMProviders.HELMHOLTZ => true, + LLMProviders.GWDG => true, LLMProviders.SELF_HOSTED => host is Host.OLLAMA, @@ -243,9 +271,12 @@ public static class LLMProvidersExtensions LLMProviders.ANTHROPIC => true, LLMProviders.GOOGLE => true, LLMProviders.X => true, + LLMProviders.DEEP_SEEK => true, LLMProviders.GROQ => true, LLMProviders.FIREWORKS => true, + LLMProviders.HELMHOLTZ => true, + LLMProviders.GWDG => true, _ => false, }; diff --git a/app/MindWork AI Studio/Provider/Mistral/ProviderMistral.cs b/app/MindWork AI Studio/Provider/Mistral/ProviderMistral.cs index ebde4c7b..024f60d3 100644 --- a/app/MindWork AI Studio/Provider/Mistral/ProviderMistral.cs +++ b/app/MindWork AI Studio/Provider/Mistral/ProviderMistral.cs @@ -138,10 +138,10 @@ public sealed class ProviderMistral(ILogger logger) : BaseProvider("https://api. if (secretKey is null) return default; - var request = new HttpRequestMessage(HttpMethod.Get, "models"); + using var request = new HttpRequestMessage(HttpMethod.Get, "models"); request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", secretKey); - var response = await this.httpClient.SendAsync(request, token); + using var response = await this.httpClient.SendAsync(request, token); if(!response.IsSuccessStatusCode) return default; diff --git a/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs b/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs index 6ddeeabc..ed092174 100644 --- a/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs +++ b/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs @@ -154,10 +154,10 @@ public sealed class ProviderOpenAI(ILogger logger) : BaseProvider("https://api.o if (secretKey is null) return []; - var request = new HttpRequestMessage(HttpMethod.Get, "models"); + using var request = new HttpRequestMessage(HttpMethod.Get, "models"); request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", secretKey); - var response = await this.httpClient.SendAsync(request, token); + using var response = await this.httpClient.SendAsync(request, token); if(!response.IsSuccessStatusCode) return []; diff --git a/app/MindWork AI Studio/Provider/SelfHosted/HostExtensions.cs b/app/MindWork AI Studio/Provider/SelfHosted/HostExtensions.cs index ada7920b..a4e29648 100644 --- a/app/MindWork AI Studio/Provider/SelfHosted/HostExtensions.cs +++ b/app/MindWork AI Studio/Provider/SelfHosted/HostExtensions.cs @@ -15,19 +15,11 @@ public static class HostExtensions public static string BaseURL(this Host host) => host switch { - Host.LM_STUDIO => "/v1/", - Host.LLAMACPP => "/v1/", - Host.OLLAMA => "/v1/", - _ => "/v1/", }; public static string ChatURL(this Host host) => host switch { - Host.LM_STUDIO => "chat/completions", - Host.LLAMACPP => "chat/completions", - Host.OLLAMA => "chat/completions", - _ => "chat/completions", }; diff --git a/app/MindWork AI Studio/Provider/SelfHosted/ProviderSelfHosted.cs b/app/MindWork AI Studio/Provider/SelfHosted/ProviderSelfHosted.cs index 3abda28c..4ba45c6b 100644 --- a/app/MindWork AI Studio/Provider/SelfHosted/ProviderSelfHosted.cs +++ b/app/MindWork AI Studio/Provider/SelfHosted/ProviderSelfHosted.cs @@ -154,11 +154,11 @@ public sealed class ProviderSelfHosted(ILogger logger, Host host, string hostnam } }; - var lmStudioRequest = new HttpRequestMessage(HttpMethod.Get, "models"); + using var lmStudioRequest = new HttpRequestMessage(HttpMethod.Get, "models"); if(secretKey is not null) lmStudioRequest.Headers.Authorization = new AuthenticationHeaderValue("Bearer", apiKeyProvisional); - var lmStudioResponse = await this.httpClient.SendAsync(lmStudioRequest, token); + using var lmStudioResponse = await this.httpClient.SendAsync(lmStudioRequest, token); if(!lmStudioResponse.IsSuccessStatusCode) return []; diff --git a/app/MindWork AI Studio/Provider/X/ProviderX.cs b/app/MindWork AI Studio/Provider/X/ProviderX.cs index c915c964..a8334c8d 100644 --- a/app/MindWork AI Studio/Provider/X/ProviderX.cs +++ b/app/MindWork AI Studio/Provider/X/ProviderX.cs @@ -127,10 +127,10 @@ public sealed class ProviderX(ILogger logger) : BaseProvider("https://api.x.ai/v if (secretKey is null) return []; - var request = new HttpRequestMessage(HttpMethod.Get, "models"); + using var request = new HttpRequestMessage(HttpMethod.Get, "models"); request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", secretKey); - var response = await this.httpClient.SendAsync(request, token); + using var response = await this.httpClient.SendAsync(request, token); if(!response.IsSuccessStatusCode) return []; diff --git a/app/MindWork AI Studio/Redirect.cs b/app/MindWork AI Studio/Redirect.cs index 1b974a3d..29c42bce 100644 --- a/app/MindWork AI Studio/Redirect.cs +++ b/app/MindWork AI Studio/Redirect.cs @@ -13,7 +13,6 @@ internal static class Redirect await nextHandler(); return; } - #if DEBUG diff --git a/app/MindWork AI Studio/Routes.razor.cs b/app/MindWork AI Studio/Routes.razor.cs index 98326821..b6318820 100644 --- a/app/MindWork AI Studio/Routes.razor.cs +++ b/app/MindWork AI Studio/Routes.razor.cs @@ -9,6 +9,7 @@ public sealed partial class Routes public const string SETTINGS = "/settings"; public const string SUPPORTERS = "/supporters"; public const string WRITER = "/writer"; + public const string PLUGINS = "/plugins"; // ReSharper disable InconsistentNaming public const string ASSISTANT_TRANSLATION = "/assistant/translation"; diff --git a/app/MindWork AI Studio/Settings/ConfigurationSelectData.cs b/app/MindWork AI Studio/Settings/ConfigurationSelectData.cs index 3f6ec933..5a2b8f11 100644 --- a/app/MindWork AI Studio/Settings/ConfigurationSelectData.cs +++ b/app/MindWork AI Studio/Settings/ConfigurationSelectData.cs @@ -94,6 +94,12 @@ public static class ConfigurationSelectDataFactory yield return new(source.GetPreviewDescription(), source); } + public static IEnumerable> GetSendToChatDataSourceBehaviorData() + { + foreach (var behavior in Enum.GetValues()) + yield return new(behavior.Description(), behavior); + } + public static IEnumerable> GetNavBehaviorData() { yield return new("Navigation expands on mouse hover", NavBehavior.EXPAND_ON_HOVER); diff --git a/app/MindWork AI Studio/Settings/DataModel/Data.cs b/app/MindWork AI Studio/Settings/DataModel/Data.cs index f6f08a5a..b47eba49 100644 --- a/app/MindWork AI Studio/Settings/DataModel/Data.cs +++ b/app/MindWork AI Studio/Settings/DataModel/Data.cs @@ -25,12 +25,22 @@ public sealed class Data /// A collection of embedding providers configured. ///
public List EmbeddingProviders { get; init; } = []; + + /// + /// A collection of data sources configured. + /// + public List DataSources { get; set; } = []; /// /// List of configured profiles. /// public List Profiles { get; init; } = []; + /// + /// List of enabled plugins. + /// + public List EnabledPlugins { get; set; } = []; + /// /// The next provider number to use. /// @@ -41,6 +51,11 @@ public sealed class Data ///
public uint NextEmbeddingNum { get; set; } = 1; + /// + /// The next data source number to use. + /// + public uint NextDataSourceNum { get; set; } = 1; + /// /// The next profile number to use. /// @@ -64,6 +79,10 @@ public sealed class Data public DataTextContentCleaner TextContentCleaner { get; init; } = new(); + public DataAgentDataSourceSelection AgentDataSourceSelection { get; init; } = new(); + + public DataAgentRetrievalContextValidation AgentRetrievalContextValidation { get; init; } = new(); + public DataAgenda Agenda { get; init; } = new(); public DataGrammarSpelling GrammarSpelling { get; init; } = new(); diff --git a/app/MindWork AI Studio/Settings/DataModel/DataAgentDataSourceSelection.cs b/app/MindWork AI Studio/Settings/DataModel/DataAgentDataSourceSelection.cs new file mode 100644 index 00000000..55473dcc --- /dev/null +++ b/app/MindWork AI Studio/Settings/DataModel/DataAgentDataSourceSelection.cs @@ -0,0 +1,14 @@ +namespace AIStudio.Settings.DataModel; + +public sealed class DataAgentDataSourceSelection +{ + /// + /// Preselect any data source selection options? + /// + public bool PreselectAgentOptions { get; set; } + + /// + /// Preselect a data source selection provider? + /// + public string PreselectedAgentProvider { get; set; } = string.Empty; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/DataModel/DataAgentRetrievalContextValidation.cs b/app/MindWork AI Studio/Settings/DataModel/DataAgentRetrievalContextValidation.cs new file mode 100644 index 00000000..a4ae0a8f --- /dev/null +++ b/app/MindWork AI Studio/Settings/DataModel/DataAgentRetrievalContextValidation.cs @@ -0,0 +1,24 @@ +namespace AIStudio.Settings.DataModel; + +public sealed class DataAgentRetrievalContextValidation +{ + /// + /// Enable the retrieval context validation agent? + /// + public bool EnableRetrievalContextValidation { get; set; } + + /// + /// Preselect any retrieval context validation options? + /// + public bool PreselectAgentOptions { get; set; } + + /// + /// Preselect a retrieval context validation provider? + /// + public string PreselectedAgentProvider { get; set; } = string.Empty; + + /// + /// Configure how many parallel validations to run. + /// + public int NumParallelValidations { get; set; } = 3; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/DataModel/DataChat.cs b/app/MindWork AI Studio/Settings/DataModel/DataChat.cs index 8283150b..baf995fd 100644 --- a/app/MindWork AI Studio/Settings/DataModel/DataChat.cs +++ b/app/MindWork AI Studio/Settings/DataModel/DataChat.cs @@ -17,6 +17,11 @@ public sealed class DataChat ///
public AddChatProviderBehavior AddChatProviderBehavior { get; set; } = AddChatProviderBehavior.ADDED_CHATS_USE_LATEST_PROVIDER; + /// + /// Defines the data source behavior when sending assistant results to a chat. + /// + public SendToChatDataSourceBehavior SendToChatDataSourceBehavior { get; set; } = SendToChatDataSourceBehavior.NO_DATA_SOURCES; + /// /// Preselect any chat options? /// @@ -31,6 +36,11 @@ public sealed class DataChat /// Preselect a profile? ///
public string PreselectedProfile { get; set; } = string.Empty; + + /// + /// Should we preselect data sources options for a created chat? + /// + public DataSourceOptions PreselectedDataSourceOptions { get; set; } = new(); /// /// Should we show the latest message after loading? When false, we show the first (aka oldest) message. diff --git a/app/MindWork AI Studio/Settings/DataModel/DataLLMProviders.cs b/app/MindWork AI Studio/Settings/DataModel/DataLLMProviders.cs index a716476a..30ad8bab 100644 --- a/app/MindWork AI Studio/Settings/DataModel/DataLLMProviders.cs +++ b/app/MindWork AI Studio/Settings/DataModel/DataLLMProviders.cs @@ -22,7 +22,7 @@ public sealed class DataLLMProviders /// /// Which confidence scheme to use. /// - public ConfidenceSchemes ConfidenceScheme { get; set; } = ConfidenceSchemes.TRUST_USA_EUROPE; + public ConfidenceSchemes ConfidenceScheme { get; set; } = ConfidenceSchemes.TRUST_ALL; /// /// Provide custom confidence levels for each LLM provider. diff --git a/app/MindWork AI Studio/Settings/DataModel/DataSourceERI_V1.cs b/app/MindWork AI Studio/Settings/DataModel/DataSourceERI_V1.cs new file mode 100644 index 00000000..cc43a3eb --- /dev/null +++ b/app/MindWork AI Studio/Settings/DataModel/DataSourceERI_V1.cs @@ -0,0 +1,137 @@ +// ReSharper disable InconsistentNaming + +using AIStudio.Assistants.ERI; +using AIStudio.Chat; +using AIStudio.Tools.ERIClient; +using AIStudio.Tools.ERIClient.DataModel; +using AIStudio.Tools.RAG; +using AIStudio.Tools.Services; + +using ChatThread = AIStudio.Chat.ChatThread; +using ContentType = AIStudio.Tools.ERIClient.DataModel.ContentType; + +namespace AIStudio.Settings.DataModel; + +/// +/// An external data source, accessed via an ERI server, cf. https://github.com/MindWorkAI/ERI. +/// +public readonly record struct DataSourceERI_V1 : IERIDataSource +{ + public DataSourceERI_V1() + { + } + + /// + public uint Num { get; init; } + + /// + public string Id { get; init; } = Guid.Empty.ToString(); + + /// + public string Name { get; init; } = string.Empty; + + /// + public DataSourceType Type { get; init; } = DataSourceType.NONE; + + /// + public string Hostname { get; init; } = string.Empty; + + /// + public int Port { get; init; } + + /// + public AuthMethod AuthMethod { get; init; } = AuthMethod.NONE; + + /// + public string Username { get; init; } = string.Empty; + + /// + public DataSourceSecurity SecurityPolicy { get; init; } = DataSourceSecurity.NOT_SPECIFIED; + + /// + public ERIVersion Version { get; init; } = ERIVersion.V1; + + /// + public string SelectedRetrievalId { get; init; } = string.Empty; + + /// + public async Task> RetrieveDataAsync(IContent lastPrompt, ChatThread thread, CancellationToken token = default) + { + // Important: Do not dispose the RustService here, as it is a singleton. + var rustService = Program.SERVICE_PROVIDER.GetRequiredService(); + var logger = Program.SERVICE_PROVIDER.GetRequiredService>(); + + using var eriClient = ERIClientFactory.Get(this.Version, this)!; + var authResponse = await eriClient.AuthenticateAsync(rustService, cancellationToken: token); + if (authResponse.Successful) + { + var retrievalRequest = new RetrievalRequest + { + LatestUserPromptType = lastPrompt.ToERIContentType, + LatestUserPrompt = lastPrompt switch + { + ContentText text => text.Text, + ContentImage image => await image.AsBase64(token), + _ => string.Empty + }, + + Thread = await thread.ToERIChatThread(token), + MaxMatches = 10, + RetrievalProcessId = string.IsNullOrWhiteSpace(this.SelectedRetrievalId) ? null : this.SelectedRetrievalId, + Parameters = null, // The ERI server selects useful default parameters + }; + + var retrievalResponse = await eriClient.ExecuteRetrievalAsync(retrievalRequest, token); + if(retrievalResponse is { Successful: true, Data: not null }) + { + // + // Next, we have to transform the ERI context back to our generic retrieval context: + // + var genericRetrievalContexts = new List(retrievalResponse.Data.Count); + foreach (var eriContext in retrievalResponse.Data) + { + switch (eriContext.Type) + { + case ContentType.TEXT: + genericRetrievalContexts.Add(new RetrievalTextContext + { + Path = eriContext.Path ?? string.Empty, + Type = eriContext.ToRetrievalContentType(), + Links = eriContext.Links, + Category = eriContext.Type.ToRetrievalContentCategory(), + MatchedText = eriContext.MatchedContent, + DataSourceName = this.Name, + SurroundingContent = eriContext.SurroundingContent, + }); + break; + + case ContentType.IMAGE: + genericRetrievalContexts.Add(new RetrievalImageContext + { + Path = eriContext.Path ?? string.Empty, + Type = eriContext.ToRetrievalContentType(), + Links = eriContext.Links, + Source = eriContext.MatchedContent, + Category = eriContext.Type.ToRetrievalContentCategory(), + SourceType = ContentImageSource.BASE64, + DataSourceName = this.Name, + }); + break; + + default: + logger.LogWarning($"The ERI context type '{eriContext.Type}' is not supported yet."); + break; + } + } + + return genericRetrievalContexts; + } + + logger.LogWarning($"Was not able to retrieve data from the ERI data source '{this.Name}'. Message: {retrievalResponse.Message}"); + return []; + } + + logger.LogWarning($"Was not able to authenticate with the ERI data source '{this.Name}'. Message: {authResponse.Message}"); + return []; + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/DataModel/DataSourceLocalDirectory.cs b/app/MindWork AI Studio/Settings/DataModel/DataSourceLocalDirectory.cs new file mode 100644 index 00000000..d81e30db --- /dev/null +++ b/app/MindWork AI Studio/Settings/DataModel/DataSourceLocalDirectory.cs @@ -0,0 +1,44 @@ +using AIStudio.Chat; +using AIStudio.Tools.RAG; + +namespace AIStudio.Settings.DataModel; + +/// +/// Represents a local directory as a data source. +/// +public readonly record struct DataSourceLocalDirectory : IInternalDataSource +{ + public DataSourceLocalDirectory() + { + } + + /// + public uint Num { get; init; } + + /// + public string Id { get; init; } = Guid.Empty.ToString(); + + /// + public string Name { get; init; } = string.Empty; + + /// + public DataSourceType Type { get; init; } = DataSourceType.NONE; + + /// + public string EmbeddingId { get; init; } = Guid.Empty.ToString(); + + /// + public DataSourceSecurity SecurityPolicy { get; init; } = DataSourceSecurity.NOT_SPECIFIED; + + /// + public Task> RetrieveDataAsync(IContent lastPrompt, ChatThread thread, CancellationToken token = default) + { + IReadOnlyList retrievalContext = new List(); + return Task.FromResult(retrievalContext); + } + + /// + /// The path to the directory. + /// + public string Path { get; init; } = string.Empty; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/DataModel/DataSourceLocalFile.cs b/app/MindWork AI Studio/Settings/DataModel/DataSourceLocalFile.cs new file mode 100644 index 00000000..5788a2a6 --- /dev/null +++ b/app/MindWork AI Studio/Settings/DataModel/DataSourceLocalFile.cs @@ -0,0 +1,44 @@ +using AIStudio.Chat; +using AIStudio.Tools.RAG; + +namespace AIStudio.Settings.DataModel; + +/// +/// Represents one local file as a data source. +/// +public readonly record struct DataSourceLocalFile : IInternalDataSource +{ + public DataSourceLocalFile() + { + } + + /// + public uint Num { get; init; } + + /// + public string Id { get; init; } = Guid.Empty.ToString(); + + /// + public string Name { get; init; } = string.Empty; + + /// + public DataSourceType Type { get; init; } = DataSourceType.NONE; + + /// + public string EmbeddingId { get; init; } = Guid.Empty.ToString(); + + /// + public DataSourceSecurity SecurityPolicy { get; init; } = DataSourceSecurity.NOT_SPECIFIED; + + /// + public Task> RetrieveDataAsync(IContent lastPrompt, ChatThread thread, CancellationToken token = default) + { + IReadOnlyList retrievalContext = new List(); + return Task.FromResult(retrievalContext); + } + + /// + /// The path to the file. + /// + public string FilePath { get; init; } = string.Empty; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/DataModel/DataSourceOptions.cs b/app/MindWork AI Studio/Settings/DataModel/DataSourceOptions.cs new file mode 100644 index 00000000..1def9887 --- /dev/null +++ b/app/MindWork AI Studio/Settings/DataModel/DataSourceOptions.cs @@ -0,0 +1,65 @@ +namespace AIStudio.Settings.DataModel; + +public sealed class DataSourceOptions +{ + /// + /// Whether data sources are disabled in this context. + /// + public bool DisableDataSources { get; set; } = true; + + /// + /// Whether the data sources should be selected automatically. + /// + /// + /// When true, the appropriate data sources for the current prompt are + /// selected automatically. When false, the user has to select the + /// data sources manually. + /// + /// This setting does not affect the selection of the actual data + /// for augmentation. + /// + public bool AutomaticDataSourceSelection { get; set; } + + /// + /// Whether the retrieved data should be validated for the current prompt. + /// + /// + /// When true, the retrieved data is validated against the current prompt. + /// An AI will decide whether the data point is useful for answering the + /// prompt or not. + /// + public bool AutomaticValidation { get; set; } + + /// + /// The preselected data source IDs. When these data sources are available + /// for the selected provider, they are pre-selected. + /// + public List PreselectedDataSourceIds { get; set; } = []; + + /// + /// Returns true when data sources are enabled. + /// + /// True when data sources are enabled. + public bool IsEnabled() + { + if(this.DisableDataSources) + return false; + + if(this.AutomaticDataSourceSelection) + return true; + + return this.PreselectedDataSourceIds.Count > 0; + } + + /// + /// Creates a copy of the current data source options. + /// + /// A copy of the current data source options. + public DataSourceOptions CreateCopy() => new() + { + DisableDataSources = this.DisableDataSources, + AutomaticDataSourceSelection = this.AutomaticDataSourceSelection, + AutomaticValidation = this.AutomaticValidation, + PreselectedDataSourceIds = [..this.PreselectedDataSourceIds], + }; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/DataModel/DataSourceSecurity.cs b/app/MindWork AI Studio/Settings/DataModel/DataSourceSecurity.cs new file mode 100644 index 00000000..58caf457 --- /dev/null +++ b/app/MindWork AI Studio/Settings/DataModel/DataSourceSecurity.cs @@ -0,0 +1,19 @@ +namespace AIStudio.Settings.DataModel; + +public enum DataSourceSecurity +{ + /// + /// The security of the data source is not specified yet. + /// + NOT_SPECIFIED, + + /// + /// This data can be used with any LLM provider. + /// + ALLOW_ANY, + + /// + /// This data can only be used for self-hosted LLM providers. + /// + SELF_HOSTED, +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/DataModel/DataSourceSecurityExtensions.cs b/app/MindWork AI Studio/Settings/DataModel/DataSourceSecurityExtensions.cs new file mode 100644 index 00000000..6e52d0fd --- /dev/null +++ b/app/MindWork AI Studio/Settings/DataModel/DataSourceSecurityExtensions.cs @@ -0,0 +1,32 @@ +namespace AIStudio.Settings.DataModel; + +public static class DataSourceSecurityExtensions +{ + public static string ToSelectionText(this DataSourceSecurity security) => security switch + { + DataSourceSecurity.NOT_SPECIFIED => "Please select a security policy", + + DataSourceSecurity.ALLOW_ANY => "This data source can be used with any LLM provider. Your data may be sent to a cloud-based provider.", + DataSourceSecurity.SELF_HOSTED => "This data source can only be used with a self-hosted LLM provider. Your data will not be sent to any cloud-based provider.", + + _ => "Unknown security policy" + }; + + public static string ToInfoText(this DataSourceSecurity security) => security switch + { + DataSourceSecurity.NOT_SPECIFIED => "The security of the data source is not specified yet. You cannot use this data source until you specify a security policy.", + + DataSourceSecurity.ALLOW_ANY => "This data source can be used with any LLM provider. Your data may be sent to a cloud-based provider.", + DataSourceSecurity.SELF_HOSTED => "This data source can only be used with a self-hosted LLM provider. Your data will not be sent to any cloud-based provider.", + + _ => "Unknown security policy" + }; + + public static TextColor GetColor(this DataSourceSecurity security) => security switch + { + DataSourceSecurity.ALLOW_ANY => TextColor.WARN, + DataSourceSecurity.SELF_HOSTED => TextColor.SUCCESS, + + _ => TextColor.ERROR + }; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/DataModel/DataSourceType.cs b/app/MindWork AI Studio/Settings/DataModel/DataSourceType.cs new file mode 100644 index 00000000..9c8b031f --- /dev/null +++ b/app/MindWork AI Studio/Settings/DataModel/DataSourceType.cs @@ -0,0 +1,27 @@ +namespace AIStudio.Settings.DataModel; + +/// +/// AI Studio data source types. +/// +public enum DataSourceType +{ + /// + /// No data source. + /// + NONE = 0, + + /// + /// One file on the local machine (or a network share). + /// + LOCAL_FILE, + + /// + /// A directory on the local machine (or a network share). + /// + LOCAL_DIRECTORY, + + /// + /// External data source accessed via an ERI server, cf. https://github.com/MindWorkAI/ERI. + /// + ERI_V1, +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/DataModel/DataSourceTypeExtension.cs b/app/MindWork AI Studio/Settings/DataModel/DataSourceTypeExtension.cs new file mode 100644 index 00000000..196eac78 --- /dev/null +++ b/app/MindWork AI Studio/Settings/DataModel/DataSourceTypeExtension.cs @@ -0,0 +1,21 @@ +namespace AIStudio.Settings.DataModel; + +/// +/// Extension methods for data source types. +/// +public static class DataSourceTypeExtension +{ + /// + /// Get the display name of the data source type. + /// + /// The data source type. + /// The display name of the data source type. + public static string GetDisplayName(this DataSourceType type) => type switch + { + DataSourceType.LOCAL_FILE => "Local File", + DataSourceType.LOCAL_DIRECTORY => "Local Directory", + DataSourceType.ERI_V1 => "External ERI Server (v1)", + + _ => "None", + }; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/DataModel/PreviewFeatures.cs b/app/MindWork AI Studio/Settings/DataModel/PreviewFeatures.cs index 825e8037..ff642a0a 100644 --- a/app/MindWork AI Studio/Settings/DataModel/PreviewFeatures.cs +++ b/app/MindWork AI Studio/Settings/DataModel/PreviewFeatures.cs @@ -8,4 +8,6 @@ public enum PreviewFeatures // PRE_WRITER_MODE_2024, PRE_RAG_2024, + + PRE_PLUGINS_2025, } \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/DataModel/PreviewFeatureExtensions.cs b/app/MindWork AI Studio/Settings/DataModel/PreviewFeaturesExtensions.cs similarity index 78% rename from app/MindWork AI Studio/Settings/DataModel/PreviewFeatureExtensions.cs rename to app/MindWork AI Studio/Settings/DataModel/PreviewFeaturesExtensions.cs index a6e6cf0e..2eb25587 100644 --- a/app/MindWork AI Studio/Settings/DataModel/PreviewFeatureExtensions.cs +++ b/app/MindWork AI Studio/Settings/DataModel/PreviewFeaturesExtensions.cs @@ -1,11 +1,12 @@ namespace AIStudio.Settings.DataModel; -public static class PreviewFeatureExtensions +public static class PreviewFeaturesExtensions { public static string GetPreviewDescription(this PreviewFeatures feature) => feature switch { PreviewFeatures.PRE_WRITER_MODE_2024 => "Writer Mode: Experiments about how to write long texts using AI", PreviewFeatures.PRE_RAG_2024 => "RAG: Preview of our RAG implementation where you can refer your files or integrate enterprise data within your company", + PreviewFeatures.PRE_PLUGINS_2025 => "Plugins: Preview of our plugin system where you can extend the functionality of the app", _ => "Unknown preview feature" }; diff --git a/app/MindWork AI Studio/Settings/DataModel/PreviewVisibilityExtensions.cs b/app/MindWork AI Studio/Settings/DataModel/PreviewVisibilityExtensions.cs index f80939f6..b0f07716 100644 --- a/app/MindWork AI Studio/Settings/DataModel/PreviewVisibilityExtensions.cs +++ b/app/MindWork AI Studio/Settings/DataModel/PreviewVisibilityExtensions.cs @@ -25,6 +25,7 @@ public static class PreviewVisibilityExtensions if (visibility >= PreviewVisibility.EXPERIMENTAL) { features.Add(PreviewFeatures.PRE_WRITER_MODE_2024); + features.Add(PreviewFeatures.PRE_PLUGINS_2025); } return features; diff --git a/app/MindWork AI Studio/Settings/DataModel/SendToChatDataSourceBehavior.cs b/app/MindWork AI Studio/Settings/DataModel/SendToChatDataSourceBehavior.cs new file mode 100644 index 00000000..fcbcaf4b --- /dev/null +++ b/app/MindWork AI Studio/Settings/DataModel/SendToChatDataSourceBehavior.cs @@ -0,0 +1,7 @@ +namespace AIStudio.Settings.DataModel; + +public enum SendToChatDataSourceBehavior +{ + NO_DATA_SOURCES, + APPLY_STANDARD_CHAT_DATA_SOURCE_OPTIONS, +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/DataModel/SendToChatDataSourceBehaviorExtensions.cs b/app/MindWork AI Studio/Settings/DataModel/SendToChatDataSourceBehaviorExtensions.cs new file mode 100644 index 00000000..3894ba2b --- /dev/null +++ b/app/MindWork AI Studio/Settings/DataModel/SendToChatDataSourceBehaviorExtensions.cs @@ -0,0 +1,12 @@ +namespace AIStudio.Settings.DataModel; + +public static class SendToChatDataSourceBehaviorExtensions +{ + public static string Description(this SendToChatDataSourceBehavior behavior) => behavior switch + { + SendToChatDataSourceBehavior.NO_DATA_SOURCES => "Use no data sources, when sending an assistant result to a chat", + SendToChatDataSourceBehavior.APPLY_STANDARD_CHAT_DATA_SOURCE_OPTIONS => "Apply standard chat data source options, when sending an assistant result to a chat", + + _ => "Unknown behavior", + }; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/DataModel/ThemesExtensions.cs b/app/MindWork AI Studio/Settings/DataModel/ThemesExtensions.cs index 7942ab7b..5d36a1bc 100644 --- a/app/MindWork AI Studio/Settings/DataModel/ThemesExtensions.cs +++ b/app/MindWork AI Studio/Settings/DataModel/ThemesExtensions.cs @@ -2,15 +2,12 @@ namespace AIStudio.Settings.DataModel; public static class ThemesExtensions { - public static string GetName(this Themes theme) + public static string GetName(this Themes theme) => theme switch { - return theme switch - { - Themes.SYSTEM => "Synchronized with the operating system settings", - Themes.LIGHT => "Always use light theme", - Themes.DARK => "Always use dark theme", - - _ => "Unknown setting", - }; - } + Themes.SYSTEM => "Synchronized with the operating system settings", + Themes.LIGHT => "Always use light theme", + Themes.DARK => "Always use dark theme", + + _ => "Unknown setting", + }; } \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/IDataSource.cs b/app/MindWork AI Studio/Settings/IDataSource.cs new file mode 100644 index 00000000..7ee47e1c --- /dev/null +++ b/app/MindWork AI Studio/Settings/IDataSource.cs @@ -0,0 +1,51 @@ +using System.Text.Json.Serialization; + +using AIStudio.Chat; +using AIStudio.Settings.DataModel; +using AIStudio.Tools.RAG; + +namespace AIStudio.Settings; + +/// +/// The common interface for all data sources. +/// +[JsonPolymorphic(TypeDiscriminatorPropertyName = "$type_discriminator")] +[JsonDerivedType(typeof(DataSourceLocalDirectory), nameof(DataSourceType.LOCAL_DIRECTORY))] +[JsonDerivedType(typeof(DataSourceLocalFile), nameof(DataSourceType.LOCAL_FILE))] +[JsonDerivedType(typeof(DataSourceERI_V1), nameof(DataSourceType.ERI_V1))] +public interface IDataSource +{ + /// + /// The number of the data source. + /// + public uint Num { get; init; } + + /// + /// The unique identifier of the data source. + /// + public string Id { get; init; } + + /// + /// The name of the data source. + /// + public string Name { get; init; } + + /// + /// Which type of data source is this? + /// + public DataSourceType Type { get; init; } + + /// + /// Which data security policy is applied to this data source? + /// + public DataSourceSecurity SecurityPolicy { get; init; } + + /// + /// Perform the data retrieval process. + /// + /// The last prompt from the chat. + /// The chat thread. + /// The cancellation token. + /// The retrieved data context. + public Task> RetrieveDataAsync(IContent lastPrompt, ChatThread thread, CancellationToken token = default); +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/IERIDataSource.cs b/app/MindWork AI Studio/Settings/IERIDataSource.cs new file mode 100644 index 00000000..55138978 --- /dev/null +++ b/app/MindWork AI Studio/Settings/IERIDataSource.cs @@ -0,0 +1,37 @@ +using AIStudio.Assistants.ERI; +using AIStudio.Tools.ERIClient.DataModel; + +namespace AIStudio.Settings; + +public interface IERIDataSource : IExternalDataSource +{ + /// + /// The hostname of the ERI server. + /// + public string Hostname { get; init; } + + /// + /// The port of the ERI server. + /// + public int Port { get; init; } + + /// + /// The authentication method to use. + /// + public AuthMethod AuthMethod { get; init; } + + /// + /// The username to use for authentication, when the auth. method is USERNAME_PASSWORD. + /// + public string Username { get; init; } + + /// + /// The ERI specification to use. + /// + public ERIVersion Version { get; init; } + + /// + /// The ID of the selected retrieval process. + /// + public string SelectedRetrievalId { get; init; } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/IExternalDataSource.cs b/app/MindWork AI Studio/Settings/IExternalDataSource.cs new file mode 100644 index 00000000..8a7c067c --- /dev/null +++ b/app/MindWork AI Studio/Settings/IExternalDataSource.cs @@ -0,0 +1,16 @@ +using System.Text.Json.Serialization; + +namespace AIStudio.Settings; + +public interface IExternalDataSource : IDataSource, ISecretId +{ + #region Implementation of ISecretId + + [JsonIgnore] + string ISecretId.SecretId => this.Id; + + [JsonIgnore] + string ISecretId.SecretName => this.Name; + + #endregion +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/IInternalDataSource.cs b/app/MindWork AI Studio/Settings/IInternalDataSource.cs new file mode 100644 index 00000000..0ffa7dea --- /dev/null +++ b/app/MindWork AI Studio/Settings/IInternalDataSource.cs @@ -0,0 +1,9 @@ +namespace AIStudio.Settings; + +public interface IInternalDataSource : IDataSource +{ + /// + /// The unique identifier of the embedding method used by this internal data source. + /// + public string EmbeddingId { get; init; } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/SettingsManager.cs b/app/MindWork AI Studio/Settings/SettingsManager.cs index 0fa3e184..ec74cab8 100644 --- a/app/MindWork AI Studio/Settings/SettingsManager.cs +++ b/app/MindWork AI Studio/Settings/SettingsManager.cs @@ -1,8 +1,10 @@ +using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; using AIStudio.Provider; using AIStudio.Settings.DataModel; +using AIStudio.Tools.PluginSystem; // ReSharper disable NotAccessedPositionalProperty.Local @@ -141,7 +143,10 @@ public sealed class SettingsManager(ILogger logger) return minimumLevel; } - public Provider GetPreselectedProvider(Tools.Components component, string? chatProviderId = null) + public bool IsPluginEnabled(IPluginMetadata plugin) => this.ConfigurationData.EnabledPlugins.Contains(plugin.Id); + + [SuppressMessage("Usage", "MWAIS0001:Direct access to `Providers` is not allowed")] + public Provider GetPreselectedProvider(Tools.Components component, string? currentProviderId = null, bool usePreselectionBeforeCurrentProvider = false) { var minimumLevel = this.GetMinimumConfidenceLevel(component); @@ -149,17 +154,43 @@ public sealed class SettingsManager(ILogger logger) if (this.ConfigurationData.Providers.Count == 1 && this.ConfigurationData.Providers[0].UsedLLMProvider.GetConfidence(this).Level >= minimumLevel) return this.ConfigurationData.Providers[0]; - // When there is a chat provider, and it has a confidence level that is high enough, we return it: - if (chatProviderId is not null && !string.IsNullOrWhiteSpace(chatProviderId)) + // Is there a current provider with a sufficiently high confidence level? + Provider currentProvider = default; + if (currentProviderId is not null && !string.IsNullOrWhiteSpace(currentProviderId)) { - var chatProvider = this.ConfigurationData.Providers.FirstOrDefault(x => x.Id == chatProviderId); - if (chatProvider.UsedLLMProvider.GetConfidence(this).Level >= minimumLevel) - return chatProvider; + var currentProviderProbe = this.ConfigurationData.Providers.FirstOrDefault(x => x.Id == currentProviderId); + if (currentProviderProbe.UsedLLMProvider.GetConfidence(this).Level >= minimumLevel) + currentProvider = currentProviderProbe; } - // When there is a component-preselected provider, and it has a confidence level that is high enough, we return it: - var preselectedProvider = component.PreselectedProvider(this); - if(preselectedProvider != default && preselectedProvider.UsedLLMProvider.GetConfidence(this).Level >= minimumLevel) + // Is there a component-preselected provider with a sufficiently high confidence level? + Provider preselectedProvider = default; + var preselectedProviderProbe = component.PreselectedProvider(this); + if(preselectedProviderProbe != default && preselectedProviderProbe.UsedLLMProvider.GetConfidence(this).Level >= minimumLevel) + preselectedProvider = preselectedProviderProbe; + + // + // Case: The preselected provider should be used before the current provider, + // and the preselected provider is available and has a confidence level + // that is high enough. + // + if(usePreselectionBeforeCurrentProvider && preselectedProvider != default) + return preselectedProvider; + + // + // Case: The current provider is available and has a confidence level that is + // high enough. + // + if(currentProvider != default) + return currentProvider; + + // + // Case: The current provider should be used before the preselected provider, + // but the current provider is not available or does not have a confidence + // level that is high enough. The preselected provider is available and + // has a confidence level that is high enough. + // + if(preselectedProvider != default) return preselectedProvider; // When there is an app-wide preselected provider, and it has a confidence level that is high enough, we return it: @@ -183,11 +214,19 @@ public sealed class SettingsManager(ILogger logger) switch (this.ConfigurationData.LLMProviders.ConfidenceScheme) { + case ConfidenceSchemes.TRUST_ALL: + return llmProvider switch + { + LLMProviders.SELF_HOSTED => ConfidenceLevel.HIGH, + + _ => ConfidenceLevel.MEDIUM, + }; + case ConfidenceSchemes.TRUST_USA_EUROPE: return llmProvider switch { LLMProviders.SELF_HOSTED => ConfidenceLevel.HIGH, - LLMProviders.FIREWORKS => ConfidenceLevel.UNTRUSTED, + LLMProviders.DEEP_SEEK => ConfidenceLevel.LOW, _ => ConfidenceLevel.MEDIUM, }; @@ -196,8 +235,10 @@ public sealed class SettingsManager(ILogger logger) return llmProvider switch { LLMProviders.SELF_HOSTED => ConfidenceLevel.HIGH, - LLMProviders.FIREWORKS => ConfidenceLevel.UNTRUSTED, LLMProviders.MISTRAL => ConfidenceLevel.LOW, + LLMProviders.HELMHOLTZ => ConfidenceLevel.LOW, + LLMProviders.GWDG => ConfidenceLevel.LOW, + LLMProviders.DEEP_SEEK => ConfidenceLevel.LOW, _ => ConfidenceLevel.MEDIUM, }; @@ -206,8 +247,18 @@ public sealed class SettingsManager(ILogger logger) return llmProvider switch { LLMProviders.SELF_HOSTED => ConfidenceLevel.HIGH, - LLMProviders.FIREWORKS => ConfidenceLevel.UNTRUSTED, LLMProviders.MISTRAL => ConfidenceLevel.MEDIUM, + LLMProviders.HELMHOLTZ => ConfidenceLevel.MEDIUM, + LLMProviders.GWDG => ConfidenceLevel.MEDIUM, + + _ => ConfidenceLevel.LOW, + }; + + case ConfidenceSchemes.TRUST_ASIA: + return llmProvider switch + { + LLMProviders.SELF_HOSTED => ConfidenceLevel.HIGH, + LLMProviders.DEEP_SEEK => ConfidenceLevel.MEDIUM, _ => ConfidenceLevel.LOW, }; @@ -216,7 +267,6 @@ public sealed class SettingsManager(ILogger logger) return llmProvider switch { LLMProviders.SELF_HOSTED => ConfidenceLevel.HIGH, - LLMProviders.FIREWORKS => ConfidenceLevel.UNTRUSTED, _ => ConfidenceLevel.VERY_LOW, }; diff --git a/app/MindWork AI Studio/Settings/SettingsMigrations.cs b/app/MindWork AI Studio/Settings/SettingsMigrations.cs index da2a5eef..98482ceb 100644 --- a/app/MindWork AI Studio/Settings/SettingsMigrations.cs +++ b/app/MindWork AI Studio/Settings/SettingsMigrations.cs @@ -84,7 +84,7 @@ public static class SettingsMigrations { Version = Version.V2, - Providers = previousData.Providers.Select(provider => provider with { IsSelfHosted = false, Hostname = "" }).ToList(), + Providers = previousData.Providers.Select(provider => provider with { IsSelfHosted = false, Hostname = string.Empty }).ToList(), EnableSpellchecking = previousData.EnableSpellchecking, IsSavingEnergy = previousData.IsSavingEnergy, diff --git a/app/MindWork AI Studio/Tools/AllowedSelectedDataSources.cs b/app/MindWork AI Studio/Tools/AllowedSelectedDataSources.cs new file mode 100644 index 00000000..1aed9d1c --- /dev/null +++ b/app/MindWork AI Studio/Tools/AllowedSelectedDataSources.cs @@ -0,0 +1,13 @@ +using AIStudio.Settings; + +namespace AIStudio.Tools; + +/// +/// Contains both the allowed and selected data sources. +/// +/// +/// The selected data sources are a subset of the allowed data sources. +/// +/// The allowed data sources. +/// The selected data sources, which are a subset of the allowed data sources. +public readonly record struct AllowedSelectedDataSources(IReadOnlyList AllowedDataSources, IReadOnlyList SelectedDataSources); \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/AuthMethodsV1Extensions.cs b/app/MindWork AI Studio/Tools/AuthMethodsV1Extensions.cs new file mode 100644 index 00000000..4d11017a --- /dev/null +++ b/app/MindWork AI Studio/Tools/AuthMethodsV1Extensions.cs @@ -0,0 +1,16 @@ +using AIStudio.Tools.ERIClient.DataModel; + +namespace AIStudio.Tools; + +public static class AuthMethodsV1Extensions +{ + public static string DisplayName(this AuthMethod authMethod) => authMethod switch + { + AuthMethod.NONE => "None", + AuthMethod.USERNAME_PASSWORD => "Username & Password", + AuthMethod.KERBEROS => "SSO (Kerberos)", + AuthMethod.TOKEN => "Access Token", + + _ => "Unknown authentication method", + }; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/CommonTools.cs b/app/MindWork AI Studio/Tools/CommonTools.cs new file mode 100644 index 00000000..26150880 --- /dev/null +++ b/app/MindWork AI Studio/Tools/CommonTools.cs @@ -0,0 +1,22 @@ +using System.Text; + +namespace AIStudio.Tools; + +public static class CommonTools +{ + /// + /// Get all the values (the names) of an enum as a string, separated by commas. + /// + /// The enum type to get the values of. + /// The values to exclude from the result. + /// The values of the enum as a string, separated by commas. + public static string GetAllEnumValues(params TEnum[] exceptions) where TEnum : struct, Enum + { + var sb = new StringBuilder(); + foreach (var value in Enum.GetValues()) + if(!exceptions.Contains(value)) + sb.Append(value).Append(", "); + + return sb.ToString(); + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Components.cs b/app/MindWork AI Studio/Tools/Components.cs index c910b7ce..d65a5c5d 100644 --- a/app/MindWork AI Studio/Tools/Components.cs +++ b/app/MindWork AI Studio/Tools/Components.cs @@ -20,4 +20,9 @@ public enum Components ERI_ASSISTANT, CHAT, + APP_SETTINGS, + + AGENT_TEXT_CONTENT_CLEANER, + AGENT_DATA_SOURCE_SELECTION, + AGENT_RETRIEVAL_CONTEXT_VALIDATION, } \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/ComponentsExtensions.cs b/app/MindWork AI Studio/Tools/ComponentsExtensions.cs index 0f8107cc..6112debb 100644 --- a/app/MindWork AI Studio/Tools/ComponentsExtensions.cs +++ b/app/MindWork AI Studio/Tools/ComponentsExtensions.cs @@ -1,3 +1,5 @@ +using System.Diagnostics.CodeAnalysis; + using AIStudio.Provider; using AIStudio.Settings; @@ -10,6 +12,11 @@ public static class ComponentsExtensions Components.NONE => false, Components.ERI_ASSISTANT => false, Components.BIAS_DAY_ASSISTANT => false, + Components.APP_SETTINGS => false, + + Components.AGENT_TEXT_CONTENT_CLEANER => false, + Components.AGENT_DATA_SOURCE_SELECTION => false, + Components.AGENT_RETRIEVAL_CONTEXT_VALIDATION => false, _ => true, }; @@ -75,6 +82,7 @@ public static class ComponentsExtensions _ => default, }; + [SuppressMessage("Usage", "MWAIS0001:Direct access to `Providers` is not allowed")] public static AIStudio.Settings.Provider PreselectedProvider(this Components component, SettingsManager settingsManager) => component switch { Components.GRAMMAR_SPELLING_ASSISTANT => settingsManager.ConfigurationData.GrammarSpelling.PreselectOptions ? settingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.GrammarSpelling.PreselectedProvider) : default, @@ -94,6 +102,10 @@ public static class ComponentsExtensions Components.CHAT => settingsManager.ConfigurationData.Chat.PreselectOptions ? settingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.Chat.PreselectedProvider) : default, + Components.AGENT_TEXT_CONTENT_CLEANER => settingsManager.ConfigurationData.TextContentCleaner.PreselectAgentOptions ? settingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.TextContentCleaner.PreselectedAgentProvider) : default, + Components.AGENT_DATA_SOURCE_SELECTION => settingsManager.ConfigurationData.AgentDataSourceSelection.PreselectAgentOptions ? settingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.AgentDataSourceSelection.PreselectedAgentProvider) : default, + Components.AGENT_RETRIEVAL_CONTEXT_VALIDATION => settingsManager.ConfigurationData.AgentRetrievalContextValidation.PreselectAgentOptions ? settingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.AgentRetrievalContextValidation.PreselectedAgentProvider) : default, + _ => default, }; diff --git a/app/MindWork AI Studio/Tools/ConfidenceSchemes.cs b/app/MindWork AI Studio/Tools/ConfidenceSchemes.cs index 97d4f4d6..b5085284 100644 --- a/app/MindWork AI Studio/Tools/ConfidenceSchemes.cs +++ b/app/MindWork AI Studio/Tools/ConfidenceSchemes.cs @@ -2,11 +2,13 @@ namespace AIStudio.Tools; public enum ConfidenceSchemes { - TRUST_USA_EUROPE = 0, - TRUST_USA = 1, - TRUST_EUROPE = 2, + TRUST_ALL, + TRUST_USA_EUROPE, + TRUST_USA, + TRUST_EUROPE, + TRUST_ASIA, - LOCAL_TRUST_ONLY = 3, + LOCAL_TRUST_ONLY, CUSTOM = 10_000, } \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/ConfidenceSchemesExtensions.cs b/app/MindWork AI Studio/Tools/ConfidenceSchemesExtensions.cs index d36993f1..035be948 100644 --- a/app/MindWork AI Studio/Tools/ConfidenceSchemesExtensions.cs +++ b/app/MindWork AI Studio/Tools/ConfidenceSchemesExtensions.cs @@ -4,9 +4,11 @@ public static class ConfidenceSchemesExtensions { public static string GetListDescription(this ConfidenceSchemes scheme) => scheme switch { + ConfidenceSchemes.TRUST_ALL => "Trust all LLM providers", ConfidenceSchemes.TRUST_USA_EUROPE => "Trust LLM providers from the USA and Europe", ConfidenceSchemes.TRUST_USA => "Trust LLM providers from the USA", ConfidenceSchemes.TRUST_EUROPE => "Trust LLM providers from Europe", + ConfidenceSchemes.TRUST_ASIA => "Trust LLM providers from Asia", ConfidenceSchemes.LOCAL_TRUST_ONLY => "Trust only local LLM providers", ConfidenceSchemes.CUSTOM => "Configure your own confidence scheme", diff --git a/app/MindWork AI Studio/Tools/DirectoryInfoExtensions.cs b/app/MindWork AI Studio/Tools/DirectoryInfoExtensions.cs new file mode 100644 index 00000000..70adcab7 --- /dev/null +++ b/app/MindWork AI Studio/Tools/DirectoryInfoExtensions.cs @@ -0,0 +1,66 @@ +namespace AIStudio.Tools; + +public static class DirectoryInfoExtensions +{ + private static readonly EnumerationOptions ENUMERATION_OPTIONS = new() + { + IgnoreInaccessible = true, + RecurseSubdirectories = true, + ReturnSpecialDirectories = false, + }; + + /// + /// Determines the size of the directory and all its subdirectories, as well as the number of files. When desired, + /// it can report the found files up to a certain limit. + /// + /// + /// You might set reportMaxFiles to a negative value to report all files. Any positive value will limit the number + /// of reported files. The cancellation token can be used to stop the operation. The cancellation operation is also able + /// to cancel slow operations, e.g., when the directory is on a slow network drive. + /// + /// After stopping the operation, the total size and number of files are reported as they were at the time of cancellation. + /// + /// Please note that the entire operation is done on a background thread. Thus, when reporting the found files or the + /// current total size, you need to use the appropriate dispatcher to update the UI. Usually, you can use the InvokeAsync + /// method to update the UI from a background thread. + /// + /// The root directory to determine the size of. + /// The callback to report the current total size of the directory. + /// The callback to report the current number of files found. + /// The callback to report the next file found. The file name is relative to the root directory. + /// The maximum number of files to report. A negative value reports all files. + /// The callback to report that the operation is done. + /// The cancellation token to stop the operation. + public static async Task DetermineContentSize(this DirectoryInfo directoryInfo, Action reportCurrentTotalSize, Action reportCurrentNumFiles, Action reportNextFile, int reportMaxFiles = -1, Action? done = null, CancellationToken cancellationToken = default) + { + var rootDirectoryLen = directoryInfo.FullName.Length; + long totalSize = 0; + long numFiles = 0; + + await Task.Factory.StartNew(() => { + foreach (var file in directoryInfo.EnumerateFiles("*", ENUMERATION_OPTIONS)) + { + if (cancellationToken.IsCancellationRequested) + return; + + totalSize += file.Length; + numFiles++; + + if (numFiles % 100 == 0) + { + reportCurrentTotalSize(totalSize); + reportCurrentNumFiles(numFiles); + } + + if (reportMaxFiles < 0 || numFiles <= reportMaxFiles) + reportNextFile(file.FullName[rootDirectoryLen..]); + } + }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Default); + + reportCurrentTotalSize(totalSize); + reportCurrentNumFiles(numFiles); + + if(done is not null) + done(); + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/ERIClient/APIResponse.cs b/app/MindWork AI Studio/Tools/ERIClient/APIResponse.cs new file mode 100644 index 00000000..1f82914c --- /dev/null +++ b/app/MindWork AI Studio/Tools/ERIClient/APIResponse.cs @@ -0,0 +1,19 @@ +namespace AIStudio.Tools.ERIClient; + +public sealed class APIResponse +{ + /// + /// Was the API call successful? + /// + public bool Successful { get; set; } + + /// + /// When the API call was not successful, this will contain the error message. + /// + public string Message { get; set; } = string.Empty; + + /// + /// The data returned by the API call. + /// + public T? Data { get; set; } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/ERIClient/DataModel/AuthField.cs b/app/MindWork AI Studio/Tools/ERIClient/DataModel/AuthField.cs new file mode 100644 index 00000000..89727430 --- /dev/null +++ b/app/MindWork AI Studio/Tools/ERIClient/DataModel/AuthField.cs @@ -0,0 +1,13 @@ +namespace AIStudio.Tools.ERIClient.DataModel; + +/// +/// An authentication field. +/// +public enum AuthField +{ + NONE, + USERNAME, + PASSWORD, + TOKEN, + KERBEROS_TICKET, +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/ERIClient/DataModel/AuthFieldMapping.cs b/app/MindWork AI Studio/Tools/ERIClient/DataModel/AuthFieldMapping.cs new file mode 100644 index 00000000..e11c3d9f --- /dev/null +++ b/app/MindWork AI Studio/Tools/ERIClient/DataModel/AuthFieldMapping.cs @@ -0,0 +1,8 @@ +namespace AIStudio.Tools.ERIClient.DataModel; + +/// +/// The mapping between an AuthField and the field name in the authentication request. +/// +/// The AuthField that is mapped to the field name. +/// The field name in the authentication request. +public record AuthFieldMapping(AuthField AuthField, string FieldName); \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/ERIClient/DataModel/AuthMethod.cs b/app/MindWork AI Studio/Tools/ERIClient/DataModel/AuthMethod.cs new file mode 100644 index 00000000..7494ce9b --- /dev/null +++ b/app/MindWork AI Studio/Tools/ERIClient/DataModel/AuthMethod.cs @@ -0,0 +1,9 @@ +namespace AIStudio.Tools.ERIClient.DataModel; + +public enum AuthMethod +{ + NONE, + KERBEROS, + USERNAME_PASSWORD, + TOKEN, +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/ERIClient/DataModel/AuthResponse.cs b/app/MindWork AI Studio/Tools/ERIClient/DataModel/AuthResponse.cs new file mode 100644 index 00000000..cdc325dd --- /dev/null +++ b/app/MindWork AI Studio/Tools/ERIClient/DataModel/AuthResponse.cs @@ -0,0 +1,9 @@ +namespace AIStudio.Tools.ERIClient.DataModel; + +/// +/// The response to an authentication request. +/// +/// True, when the authentication was successful. +/// The token to use for further requests. +/// When the authentication was not successful, this contains the reason. +public readonly record struct AuthResponse(bool Success, string? Token, string? Message); \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/ERIClient/DataModel/AuthScheme.cs b/app/MindWork AI Studio/Tools/ERIClient/DataModel/AuthScheme.cs new file mode 100644 index 00000000..bde0175b --- /dev/null +++ b/app/MindWork AI Studio/Tools/ERIClient/DataModel/AuthScheme.cs @@ -0,0 +1,9 @@ +namespace AIStudio.Tools.ERIClient.DataModel; + +/// +/// Describes one authentication scheme for this data source. +/// +/// The method used for authentication, e.g., "API Key," "Username/Password," etc. +/// A list of field mappings for the authentication method. The client must know, +/// e.g., how the password field is named in the request. +public readonly record struct AuthScheme(AuthMethod AuthMethod, List AuthFieldMappings); \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/ERIClient/DataModel/ChatThread.cs b/app/MindWork AI Studio/Tools/ERIClient/DataModel/ChatThread.cs new file mode 100644 index 00000000..8d6a0983 --- /dev/null +++ b/app/MindWork AI Studio/Tools/ERIClient/DataModel/ChatThread.cs @@ -0,0 +1,7 @@ +namespace AIStudio.Tools.ERIClient.DataModel; + +/// +/// A chat thread, which is a list of content blocks. +/// +/// The content blocks in this chat thread. +public readonly record struct ChatThread(List ContentBlocks); \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/ERIClient/DataModel/ContentBlock.cs b/app/MindWork AI Studio/Tools/ERIClient/DataModel/ContentBlock.cs new file mode 100644 index 00000000..0a46d3b5 --- /dev/null +++ b/app/MindWork AI Studio/Tools/ERIClient/DataModel/ContentBlock.cs @@ -0,0 +1,12 @@ +namespace AIStudio.Tools.ERIClient.DataModel; + +/// +/// A block of content of a chat thread. +/// +/// +/// Images and other media are base64 encoded. +/// +/// The content of the block. Remember that images and other media are base64 encoded. +/// The role of the content in the chat thread. +/// The type of the content, e.g., text, image, video, etc. +public readonly record struct ContentBlock(string Content, Role Role, ContentType Type); \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/ERIClient/DataModel/ContentType.cs b/app/MindWork AI Studio/Tools/ERIClient/DataModel/ContentType.cs new file mode 100644 index 00000000..14203728 --- /dev/null +++ b/app/MindWork AI Studio/Tools/ERIClient/DataModel/ContentType.cs @@ -0,0 +1,16 @@ +namespace AIStudio.Tools.ERIClient.DataModel; + +/// +/// The type of content. +/// +public enum ContentType +{ + NONE, + UNKNOWN, + + TEXT, + IMAGE, + VIDEO, + AUDIO, + SPEECH, +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/ERIClient/DataModel/Context.cs b/app/MindWork AI Studio/Tools/ERIClient/DataModel/Context.cs new file mode 100644 index 00000000..fb5c13f5 --- /dev/null +++ b/app/MindWork AI Studio/Tools/ERIClient/DataModel/Context.cs @@ -0,0 +1,27 @@ +namespace AIStudio.Tools.ERIClient.DataModel; + +/// +/// Matching context returned by the data source as a result of a retrieval request. +/// +/// The name of the source, e.g., a document name, database name, +/// collection name, etc. +/// What are the contents of the source? For example, is it a +/// dictionary, a book chapter, business concept, a paper, etc. +/// The path to the content, e.g., a URL, a file path, a path in a +/// graph database, etc. +/// The type of the content, e.g., text, image, video, audio, speech, etc. +/// The content that matched the user prompt. For text, you +/// return the matched text and, e.g., three words before and after it. +/// The surrounding content of the matched content. +/// For text, you may return, e.g., one sentence or paragraph before and after +/// the matched content. +/// Links to related content, e.g., links to Wikipedia articles, +/// links to sources, etc. +public readonly record struct Context( + string Name, + string Category, + string? Path, + ContentType Type, + string MatchedContent, + string[] SurroundingContent, + string[] Links); \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/ERIClient/DataModel/DataSourceInfo.cs b/app/MindWork AI Studio/Tools/ERIClient/DataModel/DataSourceInfo.cs new file mode 100644 index 00000000..07a8f92e --- /dev/null +++ b/app/MindWork AI Studio/Tools/ERIClient/DataModel/DataSourceInfo.cs @@ -0,0 +1,9 @@ +namespace AIStudio.Tools.ERIClient.DataModel; + +/// +/// Information about the data source. +/// +/// The name of the data source, e.g., "Internal Organization Documents." +/// A short description of the data source. What kind of data does it contain? +/// What is the data source used for? +public readonly record struct DataSourceInfo(string Name, string Description); \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/ERIClient/DataModel/EmbeddingInfo.cs b/app/MindWork AI Studio/Tools/ERIClient/DataModel/EmbeddingInfo.cs new file mode 100644 index 00000000..47285126 --- /dev/null +++ b/app/MindWork AI Studio/Tools/ERIClient/DataModel/EmbeddingInfo.cs @@ -0,0 +1,20 @@ +namespace AIStudio.Tools.ERIClient.DataModel; + +/// +/// Represents information about the used embedding for this data source. The purpose of this information is to give the +/// interested user an idea of what kind of embedding is used and what it does. +/// +/// What kind of embedding is used. For example, "Transformer Embedding," "Contextual Word +/// Embedding," "Graph Embedding," etc. +/// Name the embedding used. This can be a library, a framework, or the name of the used +/// algorithm. +/// A short description of the embedding. Describe what the embedding is doing. +/// Describe when the embedding is used. For example, when the user prompt contains certain +/// keywords, or anytime? +/// A link to the embedding's documentation or the source code. Might be null. +public readonly record struct EmbeddingInfo( + string EmbeddingType, + string EmbeddingName, + string Description, + string UsedWhen, + string? Link); \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/ERIClient/DataModel/ProviderType.cs b/app/MindWork AI Studio/Tools/ERIClient/DataModel/ProviderType.cs new file mode 100644 index 00000000..008811f8 --- /dev/null +++ b/app/MindWork AI Studio/Tools/ERIClient/DataModel/ProviderType.cs @@ -0,0 +1,22 @@ +namespace AIStudio.Tools.ERIClient.DataModel; + +/// +/// Known types of providers that can process data. +/// +public enum ProviderType +{ + /// + /// The related data is not allowed to be sent to any provider. + /// + NONE, + + /// + /// The related data can be sent to any provider. + /// + ANY, + + /// + /// The related data can be sent to a provider that is hosted by the same organization, either on-premises or locally. + /// + SELF_HOSTED, +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/ERIClient/DataModel/ProviderTypeExtensions.cs b/app/MindWork AI Studio/Tools/ERIClient/DataModel/ProviderTypeExtensions.cs new file mode 100644 index 00000000..ecdbcc19 --- /dev/null +++ b/app/MindWork AI Studio/Tools/ERIClient/DataModel/ProviderTypeExtensions.cs @@ -0,0 +1,13 @@ +namespace AIStudio.Tools.ERIClient.DataModel; + +public static class ProviderTypeExtensions +{ + public static string Explain(this ProviderType providerType) => providerType switch + { + ProviderType.NONE => "The related data is not allowed to be sent to any LLM provider. This means that this data source cannot be used at the moment.", + ProviderType.ANY => "The related data can be sent to any provider, regardless of where it is hosted (cloud or self-hosted).", + ProviderType.SELF_HOSTED => "The related data can be sent to a provider that is hosted by the same organization, either on-premises or locally. Cloud-based providers are not allowed.", + + _ => "Unknown configuration. This data source cannot be used at the moment.", + }; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/ERIClient/DataModel/RetrievalInfo.cs b/app/MindWork AI Studio/Tools/ERIClient/DataModel/RetrievalInfo.cs new file mode 100644 index 00000000..cdd71a6b --- /dev/null +++ b/app/MindWork AI Studio/Tools/ERIClient/DataModel/RetrievalInfo.cs @@ -0,0 +1,20 @@ +namespace AIStudio.Tools.ERIClient.DataModel; + +/// +/// Information about a retrieval process, which this data source implements. +/// +/// A unique identifier for the retrieval process. This can be a GUID, a unique name, or an increasing integer. +/// The name of the retrieval process, e.g., "Keyword-Based Wikipedia Article Retrieval". +/// A short description of the retrieval process. What kind of retrieval process is it? +/// A link to the retrieval process's documentation, paper, Wikipedia article, or the source code. Might be null. +/// A dictionary that describes the parameters of the retrieval process. The key is the parameter name, +/// and the value is a description of the parameter. Although each parameter will be sent as a string, the description should indicate the +/// expected type and range, e.g., 0.0 to 1.0 for a float parameter. +/// A list of embeddings used in this retrieval process. It might be empty in case no embedding is used. +public readonly record struct RetrievalInfo( + string Id, + string Name, + string Description, + string? Link, + Dictionary? ParametersDescription, + List Embeddings); \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/ERIClient/DataModel/RetrievalRequest.cs b/app/MindWork AI Studio/Tools/ERIClient/DataModel/RetrievalRequest.cs new file mode 100644 index 00000000..abeac50b --- /dev/null +++ b/app/MindWork AI Studio/Tools/ERIClient/DataModel/RetrievalRequest.cs @@ -0,0 +1,25 @@ +namespace AIStudio.Tools.ERIClient.DataModel; + +/// +/// The retrieval request sent by AI Studio. +/// +/// +/// Images and other media are base64 encoded. +/// +/// The latest user prompt that AI Studio received. +/// The type of the latest user prompt, e.g., text, image, etc. +/// The chat thread that the user is currently in. +/// Optional. The ID of the retrieval process that the data source should use. +/// When null, the data source chooses an appropriate retrieval process. Selecting a retrieval process is optional +/// for AI Studio users. Most users do not specify a retrieval process. +/// A dictionary of parameters that the data source should use for the retrieval process. +/// Although each parameter will be sent as a string, the retrieval process specifies the expected type and range. +/// The maximum number of matches that the data source should return. AI Studio uses +/// any value below 1 to indicate that the data source should return as many matches as appropriate. +public readonly record struct RetrievalRequest( + string LatestUserPrompt, + ContentType LatestUserPromptType, + ChatThread Thread, + string? RetrievalProcessId, + Dictionary? Parameters, + int MaxMatches); \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/ERIClient/DataModel/Role.cs b/app/MindWork AI Studio/Tools/ERIClient/DataModel/Role.cs new file mode 100644 index 00000000..a8f3fdf8 --- /dev/null +++ b/app/MindWork AI Studio/Tools/ERIClient/DataModel/Role.cs @@ -0,0 +1,15 @@ +namespace AIStudio.Tools.ERIClient.DataModel; + +/// +/// Possible roles of any chat thread. +/// +public enum Role +{ + NONE, + UNKNOWN, + + SYSTEM, + USER, + AI, + AGENT, +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/ERIClient/DataModel/SecurityRequirements.cs b/app/MindWork AI Studio/Tools/ERIClient/DataModel/SecurityRequirements.cs new file mode 100644 index 00000000..aa4df1f5 --- /dev/null +++ b/app/MindWork AI Studio/Tools/ERIClient/DataModel/SecurityRequirements.cs @@ -0,0 +1,7 @@ +namespace AIStudio.Tools.ERIClient.DataModel; + +/// +/// Represents the security requirements for this data source. +/// +/// Which provider types are allowed to process the data? +public readonly record struct SecurityRequirements(ProviderType AllowedProviderType); \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/ERIClient/ERIClientBase.cs b/app/MindWork AI Studio/Tools/ERIClient/ERIClientBase.cs new file mode 100644 index 00000000..5458bedc --- /dev/null +++ b/app/MindWork AI Studio/Tools/ERIClient/ERIClientBase.cs @@ -0,0 +1,41 @@ +using System.Text.Json; +using System.Text.Json.Serialization; + +using AIStudio.Settings; + +namespace AIStudio.Tools.ERIClient; + +public abstract class ERIClientBase(IERIDataSource dataSource) : IDisposable +{ + protected readonly IERIDataSource dataSource = dataSource; + + protected static readonly JsonSerializerOptions JSON_OPTIONS = new() + { + WriteIndented = true, + AllowTrailingCommas = true, + PropertyNameCaseInsensitive = true, + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + DictionaryKeyPolicy = JsonNamingPolicy.CamelCase, + UnmappedMemberHandling = JsonUnmappedMemberHandling.Disallow, + Converters = + { + new JsonStringEnumConverter(JsonNamingPolicy.SnakeCaseUpper), + } + }; + + protected readonly HttpClient httpClient = new() + { + BaseAddress = new Uri($"{dataSource.Hostname}:{dataSource.Port}"), + }; + + protected string securityToken = string.Empty; + + #region Implementation of IDisposable + + public void Dispose() + { + this.httpClient.Dispose(); + } + + #endregion +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/ERIClient/ERIClientFactory.cs b/app/MindWork AI Studio/Tools/ERIClient/ERIClientFactory.cs new file mode 100644 index 00000000..0beb0f64 --- /dev/null +++ b/app/MindWork AI Studio/Tools/ERIClient/ERIClientFactory.cs @@ -0,0 +1,14 @@ +using AIStudio.Assistants.ERI; +using AIStudio.Settings; + +namespace AIStudio.Tools.ERIClient; + +public static class ERIClientFactory +{ + public static IERIClient? Get(ERIVersion version, IERIDataSource dataSource) => version switch + { + ERIVersion.V1 => new ERIClientV1(dataSource), + + _ => null + }; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/ERIClient/ERIClientV1.cs b/app/MindWork AI Studio/Tools/ERIClient/ERIClientV1.cs new file mode 100644 index 00000000..178849dd --- /dev/null +++ b/app/MindWork AI Studio/Tools/ERIClient/ERIClientV1.cs @@ -0,0 +1,492 @@ +using System.Text; +using System.Text.Json; + +using AIStudio.Settings; +using AIStudio.Tools.ERIClient.DataModel; +using AIStudio.Tools.Services; + +namespace AIStudio.Tools.ERIClient; + +public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), IERIClient +{ + #region Implementation of IERIClient + + public async Task>> GetAuthMethodsAsync(CancellationToken cancellationToken = default) + { + try + { + using var response = await this.httpClient.GetAsync("/auth/methods", cancellationToken); + if (!response.IsSuccessStatusCode) + { + return new() + { + Successful = false, + Message = $"Failed to retrieve the authentication methods: there was an issue communicating with the ERI server. Code: {response.StatusCode}, Reason: {response.ReasonPhrase}" + }; + } + + var authMethods = await response.Content.ReadFromJsonAsync>(JSON_OPTIONS, cancellationToken); + if (authMethods is null) + { + return new() + { + Successful = false, + Message = "Failed to retrieve the authentication methods: the ERI server did not return a valid response." + }; + } + + return new() + { + Successful = true, + Data = authMethods + }; + } + catch (TaskCanceledException) + { + return new() + { + Successful = false, + Message = "Failed to retrieve the authentication methods: the request was canceled either by the user or due to a timeout." + }; + } + catch (Exception e) + { + return new() + { + Successful = false, + Message = $"Failed to retrieve the authentication methods due to an exception: {e.Message}" + }; + } + } + + public async Task> AuthenticateAsync(RustService rustService, string? temporarySecret = null, CancellationToken cancellationToken = default) + { + try + { + var authMethod = this.dataSource.AuthMethod; + var username = this.dataSource.Username; + switch (this.dataSource.AuthMethod) + { + case AuthMethod.NONE: + using (var request = new HttpRequestMessage(HttpMethod.Post, $"auth?authMethod={authMethod}")) + { + using var noneAuthResponse = await this.httpClient.SendAsync(request, cancellationToken); + if(!noneAuthResponse.IsSuccessStatusCode) + { + return new() + { + Successful = false, + Message = $"Failed to authenticate with the ERI server. Code: {noneAuthResponse.StatusCode}, Reason: {noneAuthResponse.ReasonPhrase}" + }; + } + + var noneAuthResult = await noneAuthResponse.Content.ReadFromJsonAsync(JSON_OPTIONS, cancellationToken); + if(noneAuthResult == default) + { + return new() + { + Successful = false, + Message = "Failed to authenticate with the ERI server: the response was invalid." + }; + } + + this.securityToken = noneAuthResult.Token ?? string.Empty; + return new() + { + Successful = true, + Data = noneAuthResult + }; + } + + case AuthMethod.USERNAME_PASSWORD: + string password; + if (string.IsNullOrWhiteSpace(temporarySecret)) + { + var passwordResponse = await rustService.GetSecret(this.dataSource); + if (!passwordResponse.Success) + { + return new() + { + Successful = false, + Message = "Failed to retrieve the password." + }; + } + + password = await passwordResponse.Secret.Decrypt(Program.ENCRYPTION); + } + else + password = temporarySecret; + + using (var request = new HttpRequestMessage(HttpMethod.Post, $"auth?authMethod={authMethod}")) + { + // We must send both values inside the header. The username field is named 'user'. + // The password field is named 'password'. + request.Headers.Add("user", username); + request.Headers.Add("password", password); + + using var usernamePasswordAuthResponse = await this.httpClient.SendAsync(request, cancellationToken); + if(!usernamePasswordAuthResponse.IsSuccessStatusCode) + { + return new() + { + Successful = false, + Message = $"Failed to authenticate with the ERI server. Code: {usernamePasswordAuthResponse.StatusCode}, Reason: {usernamePasswordAuthResponse.ReasonPhrase}" + }; + } + + var usernamePasswordAuthResult = await usernamePasswordAuthResponse.Content.ReadFromJsonAsync(JSON_OPTIONS, cancellationToken); + if(usernamePasswordAuthResult == default) + { + return new() + { + Successful = false, + Message = "Failed to authenticate with the server: the response was invalid." + }; + } + + this.securityToken = usernamePasswordAuthResult.Token ?? string.Empty; + return new() + { + Successful = true, + Data = usernamePasswordAuthResult + }; + } + + case AuthMethod.TOKEN: + string token; + if (string.IsNullOrWhiteSpace(temporarySecret)) + { + var tokenResponse = await rustService.GetSecret(this.dataSource); + if (!tokenResponse.Success) + { + return new() + { + Successful = false, + Message = "Failed to retrieve the access token." + }; + } + + token = await tokenResponse.Secret.Decrypt(Program.ENCRYPTION); + } + else + token = temporarySecret; + + using (var request = new HttpRequestMessage(HttpMethod.Post, $"auth?authMethod={authMethod}")) + { + request.Headers.Add("Authorization", $"Bearer {token}"); + + using var tokenAuthResponse = await this.httpClient.SendAsync(request, cancellationToken); + if(!tokenAuthResponse.IsSuccessStatusCode) + { + return new() + { + Successful = false, + Message = $"Failed to authenticate with the ERI server. Code: {tokenAuthResponse.StatusCode}, Reason: {tokenAuthResponse.ReasonPhrase}" + }; + } + + var tokenAuthResult = await tokenAuthResponse.Content.ReadFromJsonAsync(JSON_OPTIONS, cancellationToken); + if(tokenAuthResult == default) + { + return new() + { + Successful = false, + Message = "Failed to authenticate with the ERI server: the response was invalid." + }; + } + + this.securityToken = tokenAuthResult.Token ?? string.Empty; + return new() + { + Successful = true, + Data = tokenAuthResult + }; + } + + default: + this.securityToken = string.Empty; + return new() + { + Successful = false, + Message = "The authentication method is not supported yet." + }; + } + } + catch(TaskCanceledException) + { + return new() + { + Successful = false, + Message = "Failed to authenticate with the ERI server: the request was canceled either by the user or due to a timeout." + }; + } + catch (Exception e) + { + return new() + { + Successful = false, + Message = $"Failed to authenticate with the ERI server due to an exception: {e.Message}" + }; + } + } + + public async Task> GetDataSourceInfoAsync(CancellationToken cancellationToken = default) + { + try + { + using var request = new HttpRequestMessage(HttpMethod.Get, "/dataSource"); + request.Headers.Add("token", this.securityToken); + + using var response = await this.httpClient.SendAsync(request, cancellationToken); + if(!response.IsSuccessStatusCode) + { + return new() + { + Successful = false, + Message = $"Failed to retrieve the data source information: there was an issue communicating with the ERI server. Code: {response.StatusCode}, Reason: {response.ReasonPhrase}" + }; + } + + var dataSourceInfo = await response.Content.ReadFromJsonAsync(JSON_OPTIONS, cancellationToken); + if(dataSourceInfo == default) + { + return new() + { + Successful = false, + Message = "Failed to retrieve the data source information: the ERI server did not return a valid response." + }; + } + + return new() + { + Successful = true, + Data = dataSourceInfo + }; + } + catch(TaskCanceledException) + { + return new() + { + Successful = false, + Message = "Failed to retrieve the data source information: the request was canceled either by the user or due to a timeout." + }; + } + catch (Exception e) + { + return new() + { + Successful = false, + Message = $"Failed to retrieve the data source information due to an exception: {e.Message}" + }; + } + } + + public async Task>> GetEmbeddingInfoAsync(CancellationToken cancellationToken = default) + { + try + { + using var request = new HttpRequestMessage(HttpMethod.Get, "/embedding/info"); + request.Headers.Add("token", this.securityToken); + + using var response = await this.httpClient.SendAsync(request, cancellationToken); + if(!response.IsSuccessStatusCode) + { + return new() + { + Successful = false, + Message = $"Failed to retrieve the embedding information: there was an issue communicating with the ERI server. Code: {response.StatusCode}, Reason: {response.ReasonPhrase}" + }; + } + + var embeddingInfo = await response.Content.ReadFromJsonAsync>(JSON_OPTIONS, cancellationToken); + if(embeddingInfo is null) + { + return new() + { + Successful = false, + Message = "Failed to retrieve the embedding information: the ERI server did not return a valid response." + }; + } + + return new() + { + Successful = true, + Data = embeddingInfo + }; + } + catch(TaskCanceledException) + { + return new() + { + Successful = false, + Message = "Failed to retrieve the embedding information: the request was canceled either by the user or due to a timeout." + }; + } + catch (Exception e) + { + return new() + { + Successful = false, + Message = $"Failed to retrieve the embedding information due to an exception: {e.Message}" + }; + } + } + + public async Task>> GetRetrievalInfoAsync(CancellationToken cancellationToken = default) + { + try + { + using var request = new HttpRequestMessage(HttpMethod.Get, "/retrieval/info"); + request.Headers.Add("token", this.securityToken); + + using var response = await this.httpClient.SendAsync(request, cancellationToken); + if(!response.IsSuccessStatusCode) + { + return new() + { + Successful = false, + Message = $"Failed to retrieve the retrieval information: there was an issue communicating with the ERI server. Code: {response.StatusCode}, Reason: {response.ReasonPhrase}" + }; + } + + var retrievalInfo = await response.Content.ReadFromJsonAsync>(JSON_OPTIONS, cancellationToken); + if(retrievalInfo is null) + { + return new() + { + Successful = false, + Message = "Failed to retrieve the retrieval information: the ERI server did not return a valid response." + }; + } + + return new() + { + Successful = true, + Data = retrievalInfo + }; + } + catch(TaskCanceledException) + { + return new() + { + Successful = false, + Message = "Failed to retrieve the retrieval information: the request was canceled either by the user or due to a timeout." + }; + } + catch (Exception e) + { + return new() + { + Successful = false, + Message = $"Failed to retrieve the retrieval information due to an exception: {e.Message}" + }; + } + } + + public async Task>> ExecuteRetrievalAsync(RetrievalRequest request, CancellationToken cancellationToken = default) + { + try + { + using var requestMessage = new HttpRequestMessage(HttpMethod.Post, "/retrieval"); + requestMessage.Headers.Add("token", this.securityToken); + + using var content = new StringContent(JsonSerializer.Serialize(request, JSON_OPTIONS), Encoding.UTF8, "application/json"); + requestMessage.Content = content; + + using var response = await this.httpClient.SendAsync(requestMessage, cancellationToken); + if(!response.IsSuccessStatusCode) + { + return new() + { + Successful = false, + Message = $"Failed to execute the retrieval request: there was an issue communicating with the ERI server. Code: {response.StatusCode}, Reason: {response.ReasonPhrase}" + }; + } + + var contexts = await response.Content.ReadFromJsonAsync>(JSON_OPTIONS, cancellationToken); + if(contexts is null) + { + return new() + { + Successful = false, + Message = "Failed to execute the retrieval request: the ERI server did not return a valid response." + }; + } + + return new() + { + Successful = true, + Data = contexts + }; + } + catch(TaskCanceledException) + { + return new() + { + Successful = false, + Message = "Failed to execute the retrieval request: the request was canceled either by the user or due to a timeout." + }; + } + catch (Exception e) + { + return new() + { + Successful = false, + Message = $"Failed to execute the retrieval request due to an exception: {e.Message}" + }; + } + } + + public async Task> GetSecurityRequirementsAsync(CancellationToken cancellationToken = default) + { + try + { + using var request = new HttpRequestMessage(HttpMethod.Get, "/security/requirements"); + request.Headers.Add("token", this.securityToken); + + using var response = await this.httpClient.SendAsync(request, cancellationToken); + if(!response.IsSuccessStatusCode) + { + return new() + { + Successful = false, + Message = $"Failed to retrieve the security requirements: there was an issue communicating with the ERI server. Code: {response.StatusCode}, Reason: {response.ReasonPhrase}" + }; + } + + var securityRequirements = await response.Content.ReadFromJsonAsync(JSON_OPTIONS, cancellationToken); + if(securityRequirements == default) + { + return new() + { + Successful = false, + Message = "Failed to retrieve the security requirements: the ERI server did not return a valid response." + }; + } + + return new() + { + Successful = true, + Data = securityRequirements + }; + } + catch(TaskCanceledException) + { + return new() + { + Successful = false, + Message = "Failed to retrieve the security requirements: the request was canceled either by the user or due to a timeout." + }; + } + catch (Exception e) + { + return new() + { + Successful = false, + Message = $"Failed to retrieve the security requirements due to an exception: {e.Message}" + }; + } + } + + #endregion +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/ERIClient/IERIClient.cs b/app/MindWork AI Studio/Tools/ERIClient/IERIClient.cs new file mode 100644 index 00000000..80d8c4f7 --- /dev/null +++ b/app/MindWork AI Studio/Tools/ERIClient/IERIClient.cs @@ -0,0 +1,62 @@ +using AIStudio.Tools.ERIClient.DataModel; +using AIStudio.Tools.Services; + +namespace AIStudio.Tools.ERIClient; + +public interface IERIClient : IDisposable +{ + /// + /// Retrieves the available authentication methods from the ERI server. + /// + /// + /// No authentication is required to retrieve the available authentication methods. + /// + /// The cancellation token. + /// The available authentication methods. + public Task>> GetAuthMethodsAsync(CancellationToken cancellationToken = default); + + /// + /// Authenticate the user to the ERI server. + /// + /// The Rust service. + /// The temporary secret when adding a new data source, and the secret is not yet stored in the OS. + /// The cancellation token. + /// The authentication response. + public Task> AuthenticateAsync(RustService rustService, string? temporarySecret = null, CancellationToken cancellationToken = default); + + /// + /// Retrieves the data source information from the ERI server. + /// + /// The cancellation token. + /// The data source information. + public Task> GetDataSourceInfoAsync(CancellationToken cancellationToken = default); + + /// + /// Retrieves the embedding information from the ERI server. + /// + /// The cancellation token. + /// A list of embedding information. + public Task>> GetEmbeddingInfoAsync(CancellationToken cancellationToken = default); + + /// + /// Retrieves the retrieval information from the ERI server. + /// + /// The cancellation token. + /// A list of retrieval information. + public Task>> GetRetrievalInfoAsync(CancellationToken cancellationToken = default); + + /// + /// Executes a retrieval request on the ERI server. + /// + /// The retrieval request. + /// The cancellation token. + /// The retrieved contexts to use for augmentation and generation. + public Task>> ExecuteRetrievalAsync(RetrievalRequest request, CancellationToken cancellationToken = default); + + /// + /// Retrieves the security requirements from the ERI server. + /// + /// The cancellation token. + /// The security requirements. + public Task> GetSecurityRequirementsAsync(CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Event.cs b/app/MindWork AI Studio/Tools/Event.cs index 37a855fd..38235c8e 100644 --- a/app/MindWork AI Studio/Tools/Event.cs +++ b/app/MindWork AI Studio/Tools/Event.cs @@ -8,6 +8,7 @@ public enum Event STATE_HAS_CHANGED, CONFIGURATION_CHANGED, COLOR_THEME_CHANGED, + PLUGINS_RELOADED, // Update events: USER_SEARCH_FOR_UPDATE, @@ -23,6 +24,9 @@ public enum Event WORKSPACE_LOADED_CHAT_CHANGED, WORKSPACE_TOGGLE_OVERLAY, + // RAG events: + RAG_AUTO_DATA_SOURCES_SELECTED, + // Send events: SEND_TO_GRAMMAR_SPELLING_ASSISTANT, SEND_TO_ICON_FINDER_ASSISTANT, diff --git a/app/MindWork AI Studio/Tools/FileInfoExtensions.cs b/app/MindWork AI Studio/Tools/FileInfoExtensions.cs new file mode 100644 index 00000000..c3002624 --- /dev/null +++ b/app/MindWork AI Studio/Tools/FileInfoExtensions.cs @@ -0,0 +1,17 @@ +namespace AIStudio.Tools; + +public static class FileInfoExtensions +{ + /// + /// Returns the file size in human-readable format. + /// + /// The file info object. + /// The file size in human-readable format. + public static string FileSize(this FileInfo fileInfo) + { + if (!fileInfo.Exists) + return "N/A"; + + return fileInfo.Length.FileSize(); + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/IConfidence.cs b/app/MindWork AI Studio/Tools/IConfidence.cs new file mode 100644 index 00000000..dff9343a --- /dev/null +++ b/app/MindWork AI Studio/Tools/IConfidence.cs @@ -0,0 +1,16 @@ +namespace AIStudio.Tools; + +/// +/// A contract for data classes with a confidence value. +/// +/// +/// Using this confidence contract allows us to provide +/// algorithms based on confidence values. +/// +public interface IConfidence +{ + /// + /// How confident is the AI in this task or decision? + /// + public float Confidence { get; init; } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/IConfidenceExtensions.cs b/app/MindWork AI Studio/Tools/IConfidenceExtensions.cs new file mode 100644 index 00000000..f6f15bfd --- /dev/null +++ b/app/MindWork AI Studio/Tools/IConfidenceExtensions.cs @@ -0,0 +1,101 @@ +namespace AIStudio.Tools; + +public static class IConfidenceExtensions +{ + public static TargetWindow DetermineTargetWindow(this IReadOnlyList items, TargetWindowStrategy strategy, int numMaximumItems = 30) where T : IConfidence + { + switch (strategy) + { + case TargetWindowStrategy.A_FEW_GOOD_ONES: + return new(1, 2, 3, 0f); + + case TargetWindowStrategy.TOP10_BETTER_THAN_GUESSING: + var numItemsBetterThanGuessing = items.Count(x => x.Confidence > 0.5f); + if(numItemsBetterThanGuessing < 3) + return new(1, 2, 3, 0.5f); + + // We want the top 10% of items better than guessing: + var numTop10Percent = (int) MathF.Floor(numItemsBetterThanGuessing * 0.1f); + + // When these 10% are just a few items, we take them all: + if (numTop10Percent <= 10) + { + var diff = numItemsBetterThanGuessing - numTop10Percent; + var num50Percent = (int) MathF.Floor(numItemsBetterThanGuessing * 0.5f); + return new(num50Percent, num50Percent + 1, Math.Max(numItemsBetterThanGuessing, diff), 0.5f); + } + + // Let's define the size of the window: + const int MIN_NUM_ITEMS = 3; + var windowMin = Math.Max(MIN_NUM_ITEMS + 1, numTop10Percent); + windowMin = Math.Min(windowMin, numMaximumItems - 1); + var totalMin = Math.Max(MIN_NUM_ITEMS, windowMin - 3); + var windowSize = (int)MathF.Max(MathF.Floor(numTop10Percent * 0.1f), MathF.Min(10, numTop10Percent)); + var windowMax = Math.Min(numMaximumItems, numTop10Percent + windowSize); + return new(totalMin, windowMin, windowMax, 0.5f); + + case TargetWindowStrategy.NONE: + default: + return new(-1, -1, -1, 0f); + } + } + + /// + /// Determine the optimal confidence threshold for a list of items + /// in order to match a target window of number of items. + /// + /// The list of confidence items to analyze. + /// The target window for the number of items. + /// The maximum number of steps to search for the threshold. + /// The type of items in the list. + /// The confidence threshold. + public static float GetConfidenceThreshold(this IReadOnlyList items, TargetWindow targetWindow, int maxSteps = 10) where T : IConfidence + { + if(!targetWindow.IsValid()) + { + var logger = Program.SERVICE_PROVIDER.GetService>()!; + logger.LogWarning("The target window is invalid. Returning 0f as threshold."); + return 0f; + } + + var confidenceValues = items.Select(x => x.Confidence).ToList(); + var minConfidence = confidenceValues.Min(); + var lowerBound = MathF.Max(minConfidence, targetWindow.MinThreshold); + var upperBound = confidenceValues.Max(); + + // + // We search for a threshold so that we have between + // targetWindowMin and targetWindowMax items. When not + // possible, we take all items (e.g., threshold = 0f; depends on the used window strategy) + // + var threshold = 0.0f; + + // Check the case where the confidence values are too close: + if (upperBound - minConfidence >= 0.01) + { + var previousThreshold = threshold; + for (var i = 0; i < maxSteps; i++) + { + threshold = lowerBound + (upperBound - lowerBound) * i / maxSteps; + var numMatches = items.Count(x => x.Confidence >= threshold); + if (numMatches <= targetWindow.NumMinItems) + { + threshold = previousThreshold; + break; + } + + if (targetWindow.InsideWindow(numMatches)) + break; + + previousThreshold = threshold; + } + } + else + { + var logger = Program.SERVICE_PROVIDER.GetService>()!; + logger.LogWarning("The confidence values are too close. Returning 0f as threshold."); + } + + return threshold; + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/IMessageBusReceiver.cs b/app/MindWork AI Studio/Tools/IMessageBusReceiver.cs index 019ce115..044e425b 100644 --- a/app/MindWork AI Studio/Tools/IMessageBusReceiver.cs +++ b/app/MindWork AI Studio/Tools/IMessageBusReceiver.cs @@ -4,6 +4,8 @@ namespace AIStudio.Tools; public interface IMessageBusReceiver { + public string ComponentName { get; } + public Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data); public Task ProcessMessageWithResult(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data); diff --git a/app/MindWork AI Studio/Tools/JsRuntimeExtensions.cs b/app/MindWork AI Studio/Tools/JsRuntimeExtensions.cs index c78bf2d0..702d2732 100644 --- a/app/MindWork AI Studio/Tools/JsRuntimeExtensions.cs +++ b/app/MindWork AI Studio/Tools/JsRuntimeExtensions.cs @@ -6,7 +6,7 @@ public static class JsRuntimeExtensions { public static async Task GenerateAndShowDiff(this IJSRuntime jsRuntime, string text1, string text2) { - await jsRuntime.InvokeVoidAsync("generateDiff", text1, text2, AssistantBase.RESULT_DIV_ID, AssistantBase.BEFORE_RESULT_DIV_ID); + await jsRuntime.InvokeVoidAsync("generateDiff", text1, text2, AssistantLowerBase.RESULT_DIV_ID, AssistantLowerBase.BEFORE_RESULT_DIV_ID); } public static async Task ClearDiv(this IJSRuntime jsRuntime, string divId) diff --git a/app/MindWork AI Studio/Tools/LongExtensions.cs b/app/MindWork AI Studio/Tools/LongExtensions.cs new file mode 100644 index 00000000..3209e47a --- /dev/null +++ b/app/MindWork AI Studio/Tools/LongExtensions.cs @@ -0,0 +1,22 @@ +namespace AIStudio.Tools; + +public static class LongExtensions +{ + /// + /// Formats the file size in a human-readable format. + /// + /// The size in bytes. + /// The formatted file size. + public static string FileSize(this long sizeBytes) + { + string[] sizes = { "B", "kB", "MB", "GB", "TB" }; + var order = 0; + while (sizeBytes >= 1024 && order < sizes.Length - 1) + { + order++; + sizeBytes /= 1024; + } + + return $"{sizeBytes:0.##} {sizes[order]}"; + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/NoComponent.cs b/app/MindWork AI Studio/Tools/NoComponent.cs new file mode 100644 index 00000000..f0072efa --- /dev/null +++ b/app/MindWork AI Studio/Tools/NoComponent.cs @@ -0,0 +1,16 @@ +using Microsoft.AspNetCore.Components; + +namespace AIStudio.Tools; + +public sealed class NoComponent: IComponent +{ + public void Attach(RenderHandle renderHandle) + { + throw new NotImplementedException(); + } + + public Task SetParametersAsync(ParameterView parameters) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/ForbiddenPlugins.cs b/app/MindWork AI Studio/Tools/PluginSystem/ForbiddenPlugins.cs new file mode 100644 index 00000000..b38459d6 --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/ForbiddenPlugins.cs @@ -0,0 +1,99 @@ +namespace AIStudio.Tools.PluginSystem; + +/// +/// Checks if a plugin is forbidden. +/// +public static class ForbiddenPlugins +{ + private const string ID_PATTERN = "ID = \""; + private static readonly int ID_PATTERN_LEN = ID_PATTERN.Length; + + /// + /// Checks if the given code represents a forbidden plugin. + /// + /// The code to check. + /// The result of the check. + public static PluginCheckResult Check(ReadOnlySpan code) + { + var endIndex = 0; + var foundAnyId = false; + var id = ReadOnlySpan.Empty; + while (true) + { + // Create a slice of the code starting at the end index. + // This way we can search for all IDs in the code: + code = code[endIndex..]; + + // Read the next ID as a string: + if (!TryGetId(code, out id, out endIndex)) + { + // When no ID was found at all, we block this plugin. + // When another ID was found previously, we allow this plugin. + if(foundAnyId) + return new PluginCheckResult(false, null); + + return new PluginCheckResult(true, "No ID was found."); + } + + // Try to parse the ID as a GUID: + if (!Guid.TryParse(id, out var parsedGuid)) + { + // Again, when no ID was found at all, we block this plugin. + if(foundAnyId) + return new PluginCheckResult(false, null); + + return new PluginCheckResult(true, "The ID is not a valid GUID."); + } + + // Check if the GUID is forbidden: + if (FORBIDDEN_PLUGINS.TryGetValue(parsedGuid, out var reason)) + return new PluginCheckResult(true, reason); + + foundAnyId = true; + } + } + + private static bool TryGetId(ReadOnlySpan code, out ReadOnlySpan id, out int endIndex) + { + // + // Please note: the code variable is a slice of the original code. + // That means the indices are relative to the slice, not the original code. + // + + id = ReadOnlySpan.Empty; + endIndex = 0; + + // Find the next ID: + var idStartIndex = code.IndexOf(ID_PATTERN); + if (idStartIndex < 0) + return false; + + // Find the start index of the value (Guid): + var valueStartIndex = idStartIndex + ID_PATTERN_LEN; + + // Find the end index of the value. In order to do that, + // we create a slice of the code starting at the value + // start index. That means that the end index is relative + // to the inner slice, not the original code nor the outer slice. + var valueEndIndex = code[valueStartIndex..].IndexOf('"'); + if (valueEndIndex < 0) + return false; + + // From the perspective of the start index is the end index + // the length of the value: + endIndex = valueStartIndex + valueEndIndex; + id = code.Slice(valueStartIndex, valueEndIndex); + return true; + } + + /// + /// The forbidden plugins. + /// + /// + /// A dictionary that maps the GUID of a plugin to the reason why it is forbidden. + /// + // ReSharper disable once CollectionNeverUpdated.Local + private static readonly Dictionary FORBIDDEN_PLUGINS = + [ + ]; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/ILanguagePlugin.cs b/app/MindWork AI Studio/Tools/PluginSystem/ILanguagePlugin.cs new file mode 100644 index 00000000..a33bf3f5 --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/ILanguagePlugin.cs @@ -0,0 +1,21 @@ +namespace AIStudio.Tools.PluginSystem; + +/// +/// Represents a contract for a language plugin. +/// +public interface ILanguagePlugin +{ + /// + /// Tries to get a text from the language plugin. + /// + /// + /// When the key does not exist, the value will be an empty string. + /// Please note that the key is case-sensitive. Furthermore, the keys + /// are in the format "root::key". That means that the keys are + /// hierarchical and separated by "::". + /// + /// The key to use to get the text. + /// The desired text. + /// True if the key exists, false otherwise. + public bool TryGetText(string key, out string value); +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/IPluginMetadata.cs b/app/MindWork AI Studio/Tools/PluginSystem/IPluginMetadata.cs new file mode 100644 index 00000000..95d26b34 --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/IPluginMetadata.cs @@ -0,0 +1,74 @@ +namespace AIStudio.Tools.PluginSystem; + +public interface IPluginMetadata +{ + /// + /// The icon of this plugin. + /// + public string IconSVG { get; } + + /// + /// The type of this plugin. + /// + public PluginType Type { get; } + + /// + /// The ID of this plugin. + /// + public Guid Id { get; } + + /// + /// The name of this plugin. + /// + public string Name { get; } + + /// + /// The description of this plugin. + /// + public string Description { get; } + + /// + /// The version of this plugin. + /// + public PluginVersion Version { get; } + + /// + /// The authors of this plugin. + /// + public string[] Authors { get; } + + /// + /// The support contact for this plugin. + /// + public string SupportContact { get; } + + /// + /// The source URL of this plugin. + /// + public string SourceURL { get; } + + /// + /// The categories of this plugin. + /// + public PluginCategory[] Categories { get; } + + /// + /// The target groups of this plugin. + /// + public PluginTargetGroup[] TargetGroups { get; } + + /// + /// True, when the plugin is maintained. + /// + public bool IsMaintained { get; } + + /// + /// The message that should be displayed when the plugin is deprecated. + /// + public string DeprecationMessage { get; } + + /// + /// True, when the plugin is AI Studio internal. + /// + public bool IsInternal { get; } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/InternalPlugin.cs b/app/MindWork AI Studio/Tools/PluginSystem/InternalPlugin.cs new file mode 100644 index 00000000..1cbd8ca7 --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/InternalPlugin.cs @@ -0,0 +1,7 @@ +namespace AIStudio.Tools.PluginSystem; + +public enum InternalPlugin +{ + LANGUAGE_EN_US, + LANGUAGE_DE_DE, +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/InternalPluginData.cs b/app/MindWork AI Studio/Tools/PluginSystem/InternalPluginData.cs new file mode 100644 index 00000000..d7595f2a --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/InternalPluginData.cs @@ -0,0 +1,8 @@ +namespace AIStudio.Tools.PluginSystem; + +public readonly record struct InternalPluginData(PluginType Type, Guid Id, string ShortName) +{ + public string ResourcePath => $"{this.Type.GetDirectory()}/{this.ShortName.ToLowerInvariant()}-{this.Id}"; + + public string ResourceName => $"{this.ShortName.ToLowerInvariant()}-{this.Id}"; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/InternalPluginExtensions.cs b/app/MindWork AI Studio/Tools/PluginSystem/InternalPluginExtensions.cs new file mode 100644 index 00000000..3a25aa18 --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/InternalPluginExtensions.cs @@ -0,0 +1,12 @@ +namespace AIStudio.Tools.PluginSystem; + +public static class InternalPluginExtensions +{ + public static InternalPluginData MetaData(this InternalPlugin plugin) => plugin switch + { + InternalPlugin.LANGUAGE_EN_US => new (PluginType.LANGUAGE, new("97dfb1ba-50c4-4440-8dfa-6575daf543c8"), "en-us"), + InternalPlugin.LANGUAGE_DE_DE => new(PluginType.LANGUAGE, new("43065dbc-78d0-45b7-92be-f14c2926e2dc"), "de-de"), + + _ => new InternalPluginData(PluginType.NONE, Guid.Empty, "unknown") + }; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/NoModuleLoader.cs b/app/MindWork AI Studio/Tools/PluginSystem/NoModuleLoader.cs new file mode 100644 index 00000000..d40d2237 --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/NoModuleLoader.cs @@ -0,0 +1,20 @@ +using Lua; + +namespace AIStudio.Tools.PluginSystem; + +/// +/// This Lua module loader does not load any modules. +/// +public sealed class NoModuleLoader : ILuaModuleLoader +{ + #region Implementation of ILuaModuleLoader + + public bool Exists(string moduleName) => false; + + public ValueTask LoadAsync(string moduleName, CancellationToken cancellationToken = default) + { + return ValueTask.FromResult(new LuaModule()); + } + + #endregion +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/NoPlugin.cs b/app/MindWork AI Studio/Tools/PluginSystem/NoPlugin.cs new file mode 100644 index 00000000..3d9b74d1 --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/NoPlugin.cs @@ -0,0 +1,9 @@ +using Lua; + +namespace AIStudio.Tools.PluginSystem; + +/// +/// Represents a plugin that could not be loaded. +/// +/// The error message that occurred while parsing the plugin. +public sealed class NoPlugin(string parsingError) : PluginBase(false, LuaState.Create(), PluginType.NONE, parsingError); \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/PluginBase.Icon.cs b/app/MindWork AI Studio/Tools/PluginSystem/PluginBase.Icon.cs new file mode 100644 index 00000000..5c6140c8 --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/PluginBase.Icon.cs @@ -0,0 +1,45 @@ +namespace AIStudio.Tools.PluginSystem; + +public abstract partial class PluginBase +{ + private const string DEFAULT_ICON_SVG = + """ + + """; + + #region Initialization-related methods + + /// + /// Tries to initialize the icon of the plugin. + /// + /// + /// When no icon is specified, the default icon will be used. + /// + /// The error message, when the icon could not be read. + /// The read icon as SVG. + /// True, when the icon could be read successfully. + + // ReSharper disable once OutParameterValueIsAlwaysDiscarded.Local + // ReSharper disable once UnusedMethodReturnValue.Local + private bool TryInitIconSVG(out string message, out string iconSVG) + { + if (!this.state.Environment["ICON_SVG"].TryRead(out iconSVG)) + { + iconSVG = DEFAULT_ICON_SVG; + message = "The field ICON_SVG does not exist or is not a valid string."; + return true; + } + + if (string.IsNullOrWhiteSpace(iconSVG)) + { + iconSVG = DEFAULT_ICON_SVG; + message = "The field ICON_SVG is empty. The icon must be a non-empty string."; + return true; + } + + message = string.Empty; + return true; + } + + #endregion +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/PluginBase.cs b/app/MindWork AI Studio/Tools/PluginSystem/PluginBase.cs new file mode 100644 index 00000000..2674d4db --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/PluginBase.cs @@ -0,0 +1,495 @@ +using Lua; + +// ReSharper disable MemberCanBePrivate.Global +namespace AIStudio.Tools.PluginSystem; + +/// +/// Represents the base of any AI Studio plugin. +/// +public abstract partial class PluginBase : IPluginMetadata +{ + private readonly IReadOnlyCollection baseIssues; + protected readonly LuaState state; + + protected readonly List pluginIssues = []; + + /// + public string IconSVG { get; } + + /// + public PluginType Type { get; } + + /// + public Guid Id { get; } + + /// + public string Name { get; } = string.Empty; + + /// + public string Description { get; } = string.Empty; + + /// + public PluginVersion Version { get; } + + /// + public string[] Authors { get; } = []; + + /// + public string SupportContact { get; } = string.Empty; + + /// + public string SourceURL { get; } = string.Empty; + + /// + public PluginCategory[] Categories { get; } = []; + + /// + public PluginTargetGroup[] TargetGroups { get; } = []; + + /// + public bool IsMaintained { get; } + + /// + public string DeprecationMessage { get; } = string.Empty; + + /// + public bool IsInternal { get; } + + /// + /// The issues that occurred during the initialization of this plugin. + /// + public IEnumerable Issues => this.baseIssues.Concat(this.pluginIssues); + + /// + /// True, when the plugin is valid. + /// + /// + /// False means that there were issues during the initialization of the plugin. + /// Please check the Issues property for more information. + /// + public bool IsValid => this is not NoPlugin && this.baseIssues.Count == 0 && this.pluginIssues.Count == 0; + + protected PluginBase(bool isInternal, LuaState state, PluginType type, string parseError = "") + { + this.state = state; + this.Type = type; + + var issues = new List(); + if(!string.IsNullOrWhiteSpace(parseError)) + issues.Add(parseError); + + // Notice: when no icon is specified, the default icon will be used. + this.TryInitIconSVG(out _, out var iconSVG); + this.IconSVG = iconSVG; + + if(this.TryInitId(out var issue, out var id)) + { + this.Id = id; + this.IsInternal = isInternal; + } + else if(this is not NoPlugin) + issues.Add(issue); + + if(this.TryInitName(out issue, out var name)) + this.Name = name; + else if(this is not NoPlugin) + issues.Add(issue); + + if(this.TryInitDescription(out issue, out var description)) + this.Description = description; + else if(this is not NoPlugin) + issues.Add(issue); + + if(this.TryInitVersion(out issue, out var version)) + this.Version = version; + else if(this is not NoPlugin) + issues.Add(issue); + + if(this.TryInitAuthors(out issue, out var authors)) + this.Authors = authors; + else if(this is not NoPlugin) + issues.Add(issue); + + if(this.TryInitSupportContact(out issue, out var contact)) + this.SupportContact = contact; + else if(this is not NoPlugin) + issues.Add(issue); + + if(this.TryInitSourceURL(out issue, out var url)) + this.SourceURL = url; + else if(this is not NoPlugin) + issues.Add(issue); + + if(this.TryInitCategories(out issue, out var categories)) + this.Categories = categories; + else if(this is not NoPlugin) + issues.Add(issue); + + if(this.TryInitTargetGroups(out issue, out var targetGroups)) + this.TargetGroups = targetGroups; + else if(this is not NoPlugin) + issues.Add(issue); + + if(this.TryInitIsMaintained(out issue, out var isMaintained)) + this.IsMaintained = isMaintained; + else if(this is not NoPlugin) + issues.Add(issue); + + if(this.TryInitDeprecationMessage(out issue, out var deprecationMessage)) + this.DeprecationMessage = deprecationMessage; + else if(this is not NoPlugin) + issues.Add(issue); + + this.baseIssues = issues; + } + + #region Initialization-related methods + + /// + /// Tries to read the ID of the plugin. + /// + /// The error message, when the ID could not be read. + /// The read ID. + /// True, when the ID could be read successfully. + private bool TryInitId(out string message, out Guid id) + { + if (!this.state.Environment["ID"].TryRead(out var idText)) + { + message = "The field ID does not exist or is not a valid string."; + id = Guid.Empty; + return false; + } + + if (!Guid.TryParse(idText, out id)) + { + message = "The field ID is not a valid GUID / UUID. The ID must be formatted in the 8-4-4-4-12 format (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)."; + id = Guid.Empty; + return false; + } + + if(id == Guid.Empty) + { + message = "The field ID is empty. The ID must be formatted in the 8-4-4-4-12 format (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)."; + return false; + } + + message = string.Empty; + return true; + } + + /// + /// Tries to read the name of the plugin. + /// + /// The error message, when the name could not be read. + /// The read name. + /// True, when the name could be read successfully. + private bool TryInitName(out string message, out string name) + { + if (!this.state.Environment["NAME"].TryRead(out name)) + { + message = "The field NAME does not exist or is not a valid string."; + name = string.Empty; + return false; + } + + if(string.IsNullOrWhiteSpace(name)) + { + message = "The field NAME is empty. The name must be a non-empty string."; + return false; + } + + message = string.Empty; + return true; + } + + /// + /// Tries to read the description of the plugin. + /// + /// The error message, when the description could not be read. + /// The read description. + /// True, when the description could be read successfully. + private bool TryInitDescription(out string message, out string description) + { + if (!this.state.Environment["DESCRIPTION"].TryRead(out description)) + { + message = "The field DESCRIPTION does not exist or is not a valid string."; + description = string.Empty; + return false; + } + + if(string.IsNullOrWhiteSpace(description)) + { + message = "The field DESCRIPTION is empty. The description must be a non-empty string."; + return false; + } + + message = string.Empty; + return true; + } + + /// + /// Tries to read the version of the plugin. + /// + /// The error message, when the version could not be read. + /// The read version. + /// True, when the version could be read successfully. + private bool TryInitVersion(out string message, out PluginVersion version) + { + if (!this.state.Environment["VERSION"].TryRead(out var versionText)) + { + message = "The field VERSION does not exist or is not a valid string."; + version = PluginVersion.NONE; + return false; + } + + if (!PluginVersion.TryParse(versionText, out version)) + { + message = "The field VERSION is not a valid version number. The version number must be formatted as string in the major.minor.patch format (X.X.X)."; + version = PluginVersion.NONE; + return false; + } + + if(version == PluginVersion.NONE) + { + message = "The field VERSION is empty. The version number must be formatted as string in the major.minor.patch format (X.X.X)."; + return false; + } + + message = string.Empty; + return true; + } + + /// + /// Tries to read the authors of the plugin. + /// + /// The error message, when the authors could not be read. + /// The read authors. + /// True, when the authors could be read successfully. + private bool TryInitAuthors(out string message, out string[] authors) + { + if (!this.state.Environment["AUTHORS"].TryRead(out var authorsTable)) + { + authors = []; + message = "The table AUTHORS does not exist or is using an invalid syntax."; + return false; + } + + var authorList = new List(); + foreach(var author in authorsTable.GetArraySpan()) + if(author.TryRead(out var authorName)) + authorList.Add(authorName); + + authors = authorList.ToArray(); + if(authorList.Count == 0) + { + message = "The table AUTHORS is empty. At least one author must be specified."; + return false; + } + + message = string.Empty; + return true; + } + + /// + /// Tries to read the support contact for the plugin. + /// + /// The error message, when the support contact could not be read. + /// The read support contact. + /// True, when the support contact could be read successfully. + private bool TryInitSupportContact(out string message, out string contact) + { + if (!this.state.Environment["SUPPORT_CONTACT"].TryRead(out contact)) + { + contact = string.Empty; + message = "The field SUPPORT_CONTACT does not exist or is not a valid string."; + return false; + } + + if(string.IsNullOrWhiteSpace(contact)) + { + message = "The field SUPPORT_CONTACT is empty. The support contact must be a non-empty string."; + return false; + } + + message = string.Empty; + return true; + } + + /// + /// Try to read the source URL of the plugin. + /// + /// The error message, when the source URL could not be read. + /// The read source URL. + /// True, when the source URL could be read successfully. + private bool TryInitSourceURL(out string message, out string url) + { + if (!this.state.Environment["SOURCE_URL"].TryRead(out url)) + { + url = string.Empty; + message = "The field SOURCE_URL does not exist or is not a valid string."; + return false; + } + + if (!url.StartsWith("http://", StringComparison.InvariantCultureIgnoreCase) && !url.StartsWith("https://", StringComparison.InvariantCultureIgnoreCase)) + { + url = string.Empty; + message = "The field SOURCE_URL is not a valid URL. The URL must start with 'http://' or 'https://'."; + return false; + } + + message = string.Empty; + return true; + } + + /// + /// Tries to read the categories of the plugin. + /// + /// The error message, when the categories could not be read. + /// The read categories. + /// True, when the categories could be read successfully. + private bool TryInitCategories(out string message, out PluginCategory[] categories) + { + if (!this.state.Environment["CATEGORIES"].TryRead(out var categoriesTable)) + { + categories = []; + message = "The table CATEGORIES does not exist or is using an invalid syntax."; + return false; + } + + var categoryList = new List(); + foreach(var luaCategory in categoriesTable.GetArraySpan()) + if(luaCategory.TryRead(out var categoryName)) + if(Enum.TryParse(categoryName, out var category) && category != PluginCategory.NONE) + categoryList.Add(category); + + categories = categoryList.ToArray(); + if(categoryList.Count == 0) + { + message = $"The table CATEGORIES is empty. At least one category is necessary. Valid categories are: {CommonTools.GetAllEnumValues(PluginCategory.NONE)}."; + return false; + } + + message = string.Empty; + return true; + } + + /// + /// Tries to read the intended target groups for the plugin. + /// + /// The error message, when the target groups could not be read. + /// The read target groups. + /// True, when the target groups could be read successfully. + private bool TryInitTargetGroups(out string message, out PluginTargetGroup[] targetGroups) + { + if (!this.state.Environment["TARGET_GROUPS"].TryRead(out var targetGroupsTable)) + { + targetGroups = []; + message = "The table TARGET_GROUPS does not exist or is using an invalid syntax."; + return false; + } + + var targetGroupList = new List(); + foreach(var luaTargetGroup in targetGroupsTable.GetArraySpan()) + if(luaTargetGroup.TryRead(out var targetGroupName)) + if(Enum.TryParse(targetGroupName, out var targetGroup) && targetGroup != PluginTargetGroup.NONE) + targetGroupList.Add(targetGroup); + + targetGroups = targetGroupList.ToArray(); + if(targetGroups.Length == 0) + { + message = "The table TARGET_GROUPS is empty or is not a valid table of strings. Valid target groups are: {CommonTools.GetAllEnumValues(PluginTargetGroup.NONE)}."; + return false; + } + + message = string.Empty; + return true; + } + + /// + /// Tries to read the maintenance status of the plugin. + /// + /// The error message, when the maintenance status could not be read. + /// The read maintenance status. + /// True, when the maintenance status could be read successfully. + private bool TryInitIsMaintained(out string message, out bool isMaintained) + { + if (!this.state.Environment["IS_MAINTAINED"].TryRead(out isMaintained)) + { + isMaintained = false; + message = "The field IS_MAINTAINED does not exist or is not a valid boolean."; + return false; + } + + message = string.Empty; + return true; + } + + /// + /// Tries to read the deprecation message of the plugin. + /// + /// The error message, when the deprecation message could not be read. + /// The read deprecation message. + /// True, when the deprecation message could be read successfully. + private bool TryInitDeprecationMessage(out string message, out string deprecationMessage) + { + if (!this.state.Environment["DEPRECATION_MESSAGE"].TryRead(out deprecationMessage)) + { + deprecationMessage = string.Empty; + message = "The field DEPRECATION_MESSAGE does not exist, is not a valid string. This message is optional: use an empty string to indicate that the plugin is not deprecated."; + return false; + } + + message = string.Empty; + return true; + } + + /// + /// Tries to initialize the UI text content of the plugin. + /// + /// The error message, when the UI text content could not be read. + /// The read UI text content. + /// True, when the UI text content could be read successfully. + protected bool TryInitUITextContent(out string message, out Dictionary pluginContent) + { + if (!this.state.Environment["UI_TEXT_CONTENT"].TryRead(out var textTable)) + { + message = "The UI_TEXT_CONTENT table does not exist or is not a valid table."; + pluginContent = []; + return false; + } + + this.ReadTextTable("root", textTable, out pluginContent); + + message = string.Empty; + return true; + } + + /// + /// Reads a flat or hierarchical text table. + /// + /// The parent key(s). + /// The table to read. + /// The read table content. + protected void ReadTextTable(string parent, LuaTable table, out Dictionary tableContent) + { + tableContent = []; + var lastKey = LuaValue.Nil; + while (table.TryGetNext(lastKey, out var pair)) + { + var keyText = pair.Key.ToString(); + if (pair.Value.TryRead(out var value)) + tableContent[$"{parent}::{keyText}"] = value; + + else if (pair.Value.TryRead(out var t)) + { + this.ReadTextTable($"{parent}::{keyText}", t, out var subContent); + foreach (var (k, v) in subContent) + tableContent[k] = v; + } + + lastKey = pair.Key; + } + } + + #endregion +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/PluginCategory.cs b/app/MindWork AI Studio/Tools/PluginSystem/PluginCategory.cs new file mode 100644 index 00000000..00afcd0e --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/PluginCategory.cs @@ -0,0 +1,33 @@ +namespace AIStudio.Tools.PluginSystem; + +public enum PluginCategory +{ + NONE, + CORE, + + BUSINESS, + INDUSTRY, + UTILITY, + SOFTWARE_DEVELOPMENT, + GAMING, + EDUCATION, + ENTERTAINMENT, + SOCIAL, + SHOPPING, + TRAVEL, + HEALTH, + FITNESS, + FOOD, + PARTY, + SPORTS, + NEWS, + WEATHER, + MUSIC, + POLITICAL, + SCIENCE, + TECHNOLOGY, + ART, + FICTION, + WRITING, + CONTENT_CREATION, +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/PluginCategoryExtensions.cs b/app/MindWork AI Studio/Tools/PluginSystem/PluginCategoryExtensions.cs new file mode 100644 index 00000000..35303c06 --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/PluginCategoryExtensions.cs @@ -0,0 +1,38 @@ +namespace AIStudio.Tools.PluginSystem; + +public static class PluginCategoryExtensions +{ + public static string GetName(this PluginCategory type) => type switch + { + PluginCategory.NONE => "None", + PluginCategory.CORE => "AI Studio Core", + + PluginCategory.BUSINESS => "Business", + PluginCategory.INDUSTRY => "Industry", + PluginCategory.UTILITY => "Utility", + PluginCategory.SOFTWARE_DEVELOPMENT => "Software Development", + PluginCategory.GAMING => "Gaming", + PluginCategory.EDUCATION => "Education", + PluginCategory.ENTERTAINMENT => "Entertainment", + PluginCategory.SOCIAL => "Social", + PluginCategory.SHOPPING => "Shopping", + PluginCategory.TRAVEL => "Travel", + PluginCategory.HEALTH => "Health", + PluginCategory.FITNESS => "Fitness", + PluginCategory.FOOD => "Food", + PluginCategory.PARTY => "Party", + PluginCategory.SPORTS => "Sports", + PluginCategory.NEWS => "News", + PluginCategory.WEATHER => "Weather", + PluginCategory.MUSIC => "Music", + PluginCategory.POLITICAL => "Political", + PluginCategory.SCIENCE => "Science", + PluginCategory.TECHNOLOGY => "Technology", + PluginCategory.ART => "Art", + PluginCategory.FICTION => "Fiction", + PluginCategory.WRITING => "Writing", + PluginCategory.CONTENT_CREATION => "Content Creation", + + _ => "Unknown plugin category", + }; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/PluginCheckResult.cs b/app/MindWork AI Studio/Tools/PluginSystem/PluginCheckResult.cs new file mode 100644 index 00000000..f390a47d --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/PluginCheckResult.cs @@ -0,0 +1,8 @@ +namespace AIStudio.Tools.PluginSystem; + +/// +/// Represents the result of a plugin check. +/// +/// In case the plugin is forbidden, this is true. +/// The message that describes why the plugin is forbidden. +public readonly record struct PluginCheckResult(bool IsForbidden, string? Message); \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.HotReload.cs b/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.HotReload.cs new file mode 100644 index 00000000..c2d75bf3 --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.HotReload.cs @@ -0,0 +1,33 @@ +namespace AIStudio.Tools.PluginSystem; + +public static partial class PluginFactory +{ + public static void SetUpHotReloading() + { + LOG.LogInformation($"Start hot reloading plugins for path '{HOT_RELOAD_WATCHER.Path}'."); + try + { + var messageBus = Program.SERVICE_PROVIDER.GetRequiredService(); + + HOT_RELOAD_WATCHER.IncludeSubdirectories = true; + HOT_RELOAD_WATCHER.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName; + HOT_RELOAD_WATCHER.Filter = "*.lua"; + HOT_RELOAD_WATCHER.Changed += async (_, args) => + { + LOG.LogInformation($"File changed: {args.FullPath}"); + await LoadAll(); + await messageBus.SendMessage(null, Event.PLUGINS_RELOADED); + }; + + HOT_RELOAD_WATCHER.EnableRaisingEvents = true; + } + catch (Exception e) + { + LOG.LogError(e, "Error while setting up hot reloading."); + } + finally + { + LOG.LogInformation("Hot reloading plugins set up."); + } + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.Internal.cs b/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.Internal.cs new file mode 100644 index 00000000..2c14adb6 --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.Internal.cs @@ -0,0 +1,81 @@ +using Microsoft.Extensions.FileProviders; + +#if RELEASE +using System.Reflection; +#endif + +namespace AIStudio.Tools.PluginSystem; + +public static partial class PluginFactory +{ + public static async Task EnsureInternalPlugins() + { + LOG.LogInformation("Start ensuring internal plugins."); + foreach (var plugin in Enum.GetValues()) + { + LOG.LogInformation($"Ensure plugin: {plugin}"); + await EnsurePlugin(plugin); + } + } + + private static async Task EnsurePlugin(InternalPlugin plugin) + { + try + { + #if DEBUG + var basePath = Path.Join(Environment.CurrentDirectory, "Plugins"); + var resourceFileProvider = new PhysicalFileProvider(basePath); + #else + var resourceFileProvider = new ManifestEmbeddedFileProvider(Assembly.GetAssembly(type: typeof(Program))!, "Plugins"); + #endif + + var metaData = plugin.MetaData(); + var mainResourcePath = $"{metaData.ResourcePath}/plugin.lua"; + var resourceInfo = resourceFileProvider.GetFileInfo(mainResourcePath); + + if(!resourceInfo.Exists) + { + LOG.LogError($"The plugin {plugin} does not exist. This should not happen, since the plugin is an integral part of AI Studio."); + return; + } + + // Ensure that the additional resources exist: + foreach (var content in resourceFileProvider.GetDirectoryContents(metaData.ResourcePath)) + { + if(content.IsDirectory) + { + LOG.LogError("The plugin contains a directory. This is not allowed."); + continue; + } + + await CopyInternalPluginFile(content, metaData); + } + } + catch + { + LOG.LogError($"Was not able to ensure the plugin: {plugin}"); + } + } + + private static async Task CopyInternalPluginFile(IFileInfo resourceInfo, InternalPluginData metaData) + { + await using var inputStream = resourceInfo.CreateReadStream(); + + var pluginTypeBasePath = Path.Join(INTERNAL_PLUGINS_ROOT, metaData.Type.GetDirectory()); + + if (!Directory.Exists(INTERNAL_PLUGINS_ROOT)) + Directory.CreateDirectory(INTERNAL_PLUGINS_ROOT); + + if (!Directory.Exists(pluginTypeBasePath)) + Directory.CreateDirectory(pluginTypeBasePath); + + var pluginPath = Path.Join(pluginTypeBasePath, metaData.ResourceName); + if (!Directory.Exists(pluginPath)) + Directory.CreateDirectory(pluginPath); + + var pluginFilePath = Path.Join(pluginPath, resourceInfo.Name); + + await using var outputStream = File.Create(pluginFilePath); + await inputStream.CopyToAsync(outputStream); + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.cs b/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.cs new file mode 100644 index 00000000..0cb87178 --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.cs @@ -0,0 +1,148 @@ +using System.Text; + +using AIStudio.Settings; + +using Lua; +using Lua.Standard; + +namespace AIStudio.Tools.PluginSystem; + +public static partial class PluginFactory +{ + private static readonly ILogger LOG = Program.LOGGER_FACTORY.CreateLogger("PluginFactory"); + + private static readonly string DATA_DIR = SettingsManager.DataDirectory!; + + private static readonly string PLUGINS_ROOT = Path.Join(DATA_DIR, "plugins"); + + private static readonly string INTERNAL_PLUGINS_ROOT = Path.Join(PLUGINS_ROOT, ".internal"); + + private static readonly FileSystemWatcher HOT_RELOAD_WATCHER = new(PLUGINS_ROOT); + + private static readonly List AVAILABLE_PLUGINS = []; + + /// + /// A list of all available plugins. + /// + public static IReadOnlyCollection AvailablePlugins => AVAILABLE_PLUGINS; + + /// + /// Try to load all plugins from the plugins directory. + /// + /// + /// Loading plugins means:
+ /// - Parsing and checking the plugin code
+ /// - Check for forbidden plugins
+ /// - Creating a new instance of the allowed plugin
+ /// - Read the plugin metadata
+ ///
+ /// Loading a plugin does not mean to start the plugin, though. + ///
+ public static async Task LoadAll(CancellationToken cancellationToken = default) + { + LOG.LogInformation("Start loading plugins."); + if (!Directory.Exists(PLUGINS_ROOT)) + { + LOG.LogInformation("No plugins found."); + return; + } + + AVAILABLE_PLUGINS.Clear(); + + // + // The easiest way to load all plugins is to find all `plugin.lua` files and load them. + // By convention, each plugin is enforced to have a `plugin.lua` file. + // + var pluginMainFiles = Directory.EnumerateFiles(PLUGINS_ROOT, "plugin.lua", SearchOption.AllDirectories); + foreach (var pluginMainFile in pluginMainFiles) + { + if (cancellationToken.IsCancellationRequested) + break; + + LOG.LogInformation($"Try to load plugin: {pluginMainFile}"); + var code = await File.ReadAllTextAsync(pluginMainFile, Encoding.UTF8, cancellationToken); + var pluginPath = Path.GetDirectoryName(pluginMainFile)!; + var plugin = await Load(pluginPath, code, cancellationToken); + + switch (plugin) + { + case NoPlugin noPlugin when noPlugin.Issues.Any(): + LOG.LogError($"Was not able to load plugin: '{pluginMainFile}'. Reason: {noPlugin.Issues.First()}"); + continue; + + case NoPlugin: + LOG.LogError($"Was not able to load plugin: '{pluginMainFile}'. Reason: Unknown."); + continue; + + case { IsValid: false }: + LOG.LogError($"Was not able to load plugin '{pluginMainFile}', because the Lua code is not a valid AI Studio plugin. There are {plugin.Issues.Count()} issues to fix."); + #if DEBUG + foreach (var pluginIssue in plugin.Issues) + LOG.LogError($"Plugin issue: {pluginIssue}"); + #endif + continue; + + case { IsMaintained: false }: + LOG.LogWarning($"The plugin '{pluginMainFile}' is not maintained anymore. Please consider to disable it."); + break; + } + + LOG.LogInformation($"Successfully loaded plugin: '{pluginMainFile}' (Id='{plugin.Id}', Type='{plugin.Type}', Name='{plugin.Name}', Version='{plugin.Version}', Authors='{string.Join(", ", plugin.Authors)}')"); + AVAILABLE_PLUGINS.Add(new PluginMetadata(plugin)); + } + } + + private static async Task Load(string pluginPath, string code, CancellationToken cancellationToken = default) + { + if(ForbiddenPlugins.Check(code) is { IsForbidden: true } forbiddenState) + return new NoPlugin($"This plugin is forbidden: {forbiddenState.Message}"); + + var state = LuaState.Create(); + + // Add the module loader so that the plugin can load other Lua modules: + state.ModuleLoader = new PluginLoader(pluginPath); + + // Add some useful libraries: + state.OpenModuleLibrary(); + state.OpenStringLibrary(); + state.OpenTableLibrary(); + state.OpenMathLibrary(); + state.OpenBitwiseLibrary(); + state.OpenCoroutineLibrary(); + + try + { + await state.DoStringAsync(code, cancellationToken: cancellationToken); + } + catch (LuaParseException e) + { + return new NoPlugin($"Was not able to parse the plugin: {e.Message}"); + } + catch (LuaRuntimeException e) + { + return new NoPlugin($"Was not able to run the plugin: {e.Message}"); + } + + if (!state.Environment["TYPE"].TryRead(out var typeText)) + return new NoPlugin("TYPE does not exist or is not a valid string."); + + if (!Enum.TryParse(typeText, out var type)) + return new NoPlugin($"TYPE is not a valid plugin type. Valid types are: {CommonTools.GetAllEnumValues()}"); + + if(type is PluginType.NONE) + return new NoPlugin($"TYPE is not a valid plugin type. Valid types are: {CommonTools.GetAllEnumValues()}"); + + var isInternal = pluginPath.StartsWith(INTERNAL_PLUGINS_ROOT, StringComparison.OrdinalIgnoreCase); + return type switch + { + PluginType.LANGUAGE => new PluginLanguage(isInternal, state, type), + + _ => new NoPlugin("This plugin type is not supported yet. Please try again with a future version of AI Studio.") + }; + } + + public static void Dispose() + { + HOT_RELOAD_WATCHER.Dispose(); + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/PluginLanguage.cs b/app/MindWork AI Studio/Tools/PluginSystem/PluginLanguage.cs new file mode 100644 index 00000000..4c8cf30a --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/PluginLanguage.cs @@ -0,0 +1,48 @@ +using Lua; + +namespace AIStudio.Tools.PluginSystem; + +public sealed class PluginLanguage : PluginBase, ILanguagePlugin +{ + private readonly Dictionary content = []; + + private ILanguagePlugin? baseLanguage; + + public PluginLanguage(bool isInternal, LuaState state, PluginType type) : base(isInternal, state, type) + { + if (this.TryInitUITextContent(out var issue, out var readContent)) + this.content = readContent; + else + this.pluginIssues.Add(issue); + } + + /// + /// Sets the base language plugin. This plugin will be used to fill in missing keys. + /// + /// The base language plugin to use. + public void SetBaseLanguage(ILanguagePlugin baseLanguagePlugin) => this.baseLanguage = baseLanguagePlugin; + + /// + /// Tries to get a text from the language plugin. + /// + /// + /// When the key neither in the base language nor in this language exist, + /// the value will be an empty string. Please note that the key is case-sensitive. + /// Furthermore, the keys are in the format "root::key". That means that + /// the keys are hierarchical and separated by "::". + /// + /// The key to use to get the text. + /// The desired text. + /// True if the key exists, false otherwise. + public bool TryGetText(string key, out string value) + { + if (this.content.TryGetValue(key, out value!)) + return true; + + if(this.baseLanguage is not null && this.baseLanguage.TryGetText(key, out value)) + return true; + + value = string.Empty; + return false; + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/PluginLoader.cs b/app/MindWork AI Studio/Tools/PluginSystem/PluginLoader.cs new file mode 100644 index 00000000..ec81f73c --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/PluginLoader.cs @@ -0,0 +1,48 @@ +using System.Text; + +using AIStudio.Settings; + +using Lua; + +namespace AIStudio.Tools.PluginSystem; + +/// +/// Loads Lua modules from a plugin directory. +/// +/// +/// Any plugin can load Lua modules from its own directory. This class is used to load these modules. +/// Loading other modules outside the plugin directory is not allowed. +/// +/// The directory where the plugin is located. +public sealed class PluginLoader(string pluginDirectory) : ILuaModuleLoader +{ + private static readonly string PLUGIN_BASE_PATH = Path.Join(SettingsManager.DataDirectory, "plugins"); + + #region Implementation of ILuaModuleLoader + + /// + public bool Exists(string moduleName) + { + // Ensure that the user doesn't try to escape the plugin directory: + if (moduleName.Contains("..") || pluginDirectory.Contains("..")) + return false; + + // Ensure that the plugin directory is nested in the plugin base path: + if (!pluginDirectory.StartsWith(PLUGIN_BASE_PATH, StringComparison.OrdinalIgnoreCase)) + return false; + + var path = Path.Join(pluginDirectory, $"{moduleName}.lua"); + return File.Exists(path); + } + + /// + public async ValueTask LoadAsync(string moduleName, CancellationToken cancellationToken = default) + { + var path = Path.Join(pluginDirectory, $"{moduleName}.lua"); + var code = await File.ReadAllTextAsync(path, Encoding.UTF8, cancellationToken); + + return new(moduleName, code); + } + + #endregion +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/PluginMetadata.cs b/app/MindWork AI Studio/Tools/PluginSystem/PluginMetadata.cs new file mode 100644 index 00000000..2bfdab1e --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/PluginMetadata.cs @@ -0,0 +1,50 @@ +namespace AIStudio.Tools.PluginSystem; + +public sealed class PluginMetadata(PluginBase plugin) : IPluginMetadata +{ + #region Implementation of IPluginMetadata + + /// + public string IconSVG { get; } = plugin.IconSVG; + + /// + public PluginType Type { get; } = plugin.Type; + + /// + public Guid Id { get; } = plugin.Id; + + /// + public string Name { get; } = plugin.Name; + + /// + public string Description { get; } = plugin.Description; + + /// + public PluginVersion Version { get; } = plugin.Version; + + /// + public string[] Authors { get; } = plugin.Authors; + + /// + public string SupportContact { get; } = plugin.SupportContact; + + /// + public string SourceURL { get; } = plugin.SourceURL; + + /// + public PluginCategory[] Categories { get; } = plugin.Categories; + + /// + public PluginTargetGroup[] TargetGroups { get; } = plugin.TargetGroups; + + /// + public bool IsMaintained { get; } = plugin.IsMaintained; + + /// + public string DeprecationMessage { get; } = plugin.DeprecationMessage; + + /// + public bool IsInternal { get; } = plugin.IsInternal; + + #endregion +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/PluginTargetGroup.cs b/app/MindWork AI Studio/Tools/PluginSystem/PluginTargetGroup.cs new file mode 100644 index 00000000..102aa857 --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/PluginTargetGroup.cs @@ -0,0 +1,20 @@ +namespace AIStudio.Tools.PluginSystem; + +public enum PluginTargetGroup +{ + NONE, + + EVERYONE, + CHILDREN, + TEENAGERS, + STUDENTS, + ADULTS, + + INDUSTRIAL_WORKERS, + OFFICE_WORKERS, + BUSINESS_PROFESSIONALS, + SOFTWARE_DEVELOPERS, + SCIENTISTS, + TEACHERS, + ARTISTS, +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/PluginTargetGroupExtensions.cs b/app/MindWork AI Studio/Tools/PluginSystem/PluginTargetGroupExtensions.cs new file mode 100644 index 00000000..7a14123f --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/PluginTargetGroupExtensions.cs @@ -0,0 +1,25 @@ +namespace AIStudio.Tools.PluginSystem; + +public static class PluginTargetGroupExtensions +{ + public static string Name(this PluginTargetGroup group) => group switch + { + PluginTargetGroup.NONE => "No target group", + + PluginTargetGroup.EVERYONE => "Everyone", + PluginTargetGroup.CHILDREN => "Children", + PluginTargetGroup.TEENAGERS => "Teenagers", + PluginTargetGroup.STUDENTS => "Students", + PluginTargetGroup.ADULTS => "Adults", + + PluginTargetGroup.INDUSTRIAL_WORKERS => "Industrial workers", + PluginTargetGroup.OFFICE_WORKERS => "Office workers", + PluginTargetGroup.BUSINESS_PROFESSIONALS => "Business professionals", + PluginTargetGroup.SOFTWARE_DEVELOPERS => "Software developers", + PluginTargetGroup.SCIENTISTS => "Scientists", + PluginTargetGroup.TEACHERS => "Teachers", + PluginTargetGroup.ARTISTS => "Artists", + + _ => "Unknown target group", + }; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/PluginType.cs b/app/MindWork AI Studio/Tools/PluginSystem/PluginType.cs new file mode 100644 index 00000000..5730e62f --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/PluginType.cs @@ -0,0 +1,11 @@ +namespace AIStudio.Tools.PluginSystem; + +public enum PluginType +{ + NONE, + + LANGUAGE, + ASSISTANT, + CONFIGURATION, + THEME, +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/PluginTypeExtensions.cs b/app/MindWork AI Studio/Tools/PluginSystem/PluginTypeExtensions.cs new file mode 100644 index 00000000..b65eb502 --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/PluginTypeExtensions.cs @@ -0,0 +1,24 @@ +namespace AIStudio.Tools.PluginSystem; + +public static class PluginTypeExtensions +{ + public static string GetName(this PluginType type) => type switch + { + PluginType.LANGUAGE => "Language plugin", + PluginType.ASSISTANT => "Assistant plugin", + PluginType.CONFIGURATION => "Configuration plugin", + PluginType.THEME => "Theme plugin", + + _ => "Unknown plugin type", + }; + + public static string GetDirectory(this PluginType type) => type switch + { + PluginType.LANGUAGE => "languages", + PluginType.ASSISTANT => "assistants", + PluginType.CONFIGURATION => "configurations", + PluginType.THEME => "themes", + + _ => "unknown", + }; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/PluginVersion.cs b/app/MindWork AI Studio/Tools/PluginSystem/PluginVersion.cs new file mode 100644 index 00000000..d5507a56 --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/PluginVersion.cs @@ -0,0 +1,90 @@ +// ReSharper disable MemberCanBePrivate.Global +namespace AIStudio.Tools.PluginSystem; + +/// +/// Represents a version number for a plugin. +/// +/// The major version number. +/// The minor version number. +/// The patch version number. +public readonly record struct PluginVersion(int Major, int Minor, int Patch) : IComparable +{ + /// + /// Represents no version number. + /// + public static readonly PluginVersion NONE = new(0, 0, 0); + + /// + /// Tries to parse the input string as a plugin version number. + /// + /// The input string to parse. + /// The parsed version number. + /// True when the input string was successfully parsed; otherwise, false. + public static bool TryParse(string input, out PluginVersion version) + { + try + { + version = Parse(input); + return true; + } + catch + { + version = NONE; + return false; + } + } + + /// + /// Parses the input string as a plugin version number. + /// + /// The input string to parse. + /// The parsed version number. + /// The input string is not in the correct format. + public static PluginVersion Parse(string input) + { + var segments = input.Split('.'); + if (segments.Length != 3) + throw new FormatException("The input string must be in the format 'major.minor.patch'."); + + var major = int.Parse(segments[0]); + var minor = int.Parse(segments[1]); + var patch = int.Parse(segments[2]); + + if(major < 0 || minor < 0 || patch < 0) + throw new FormatException("The major, minor, and patch numbers must be greater than or equal to 0."); + + return new PluginVersion(major, minor, patch); + } + + /// + /// Converts the plugin version number to a string in the format 'major.minor.patch'. + /// + /// The plugin version number as a string. + public override string ToString() => $"{this.Major}.{this.Minor}.{this.Patch}"; + + /// + /// Compares the plugin version number to another plugin version number. + /// + /// The other plugin version number to compare to. + /// A value indicating the relative order of the plugin version numbers. + public int CompareTo(PluginVersion other) + { + var majorCompare = this.Major.CompareTo(other.Major); + if (majorCompare != 0) + return majorCompare; + + var minorCompare = this.Minor.CompareTo(other.Minor); + if (minorCompare != 0) + return minorCompare; + + return this.Patch.CompareTo(other.Patch); + } + + public static bool operator >(PluginVersion left, PluginVersion right) => left.CompareTo(right) > 0; + + public static bool operator <(PluginVersion left, PluginVersion right) => left.CompareTo(right) < 0; + + public static bool operator >=(PluginVersion left, PluginVersion right) => left.CompareTo(right) >= 0; + + public static bool operator <=(PluginVersion left, PluginVersion right) => left.CompareTo(right) <= 0; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/RAG/AugmentationProcesses/AugmentationOne.cs b/app/MindWork AI Studio/Tools/RAG/AugmentationProcesses/AugmentationOne.cs new file mode 100644 index 00000000..fff91251 --- /dev/null +++ b/app/MindWork AI Studio/Tools/RAG/AugmentationProcesses/AugmentationOne.cs @@ -0,0 +1,75 @@ +using System.Text; + +using AIStudio.Agents; +using AIStudio.Chat; +using AIStudio.Provider; +using AIStudio.Settings; + +namespace AIStudio.Tools.RAG.AugmentationProcesses; + +public sealed class AugmentationOne : IAugmentationProcess +{ + #region Implementation of IAugmentationProcess + + /// + public string TechnicalName => "AugmentationOne"; + + /// + public string UIName => "Standard augmentation process"; + + /// + public string Description => "This is the standard augmentation process, which uses all retrieval contexts to augment the chat thread."; + + /// + public async Task ProcessAsync(IProvider provider, IContent lastPrompt, ChatThread chatThread, IReadOnlyList retrievalContexts, CancellationToken token = default) + { + var logger = Program.SERVICE_PROVIDER.GetService>()!; + var settings = Program.SERVICE_PROVIDER.GetService()!; + + if(retrievalContexts.Count == 0) + { + logger.LogWarning("No retrieval contexts were issued. Skipping the augmentation process."); + return chatThread; + } + + var numTotalRetrievalContexts = retrievalContexts.Count; + + // Want the user to validate all retrieval contexts? + if (settings.ConfigurationData.AgentRetrievalContextValidation.EnableRetrievalContextValidation && chatThread.DataSourceOptions.AutomaticValidation) + { + // Let's get the validation agent & set up its provider: + var validationAgent = Program.SERVICE_PROVIDER.GetService()!; + validationAgent.SetLLMProvider(provider); + + // Let's validate all retrieval contexts: + var validationResults = await validationAgent.ValidateRetrievalContextsAsync(lastPrompt, chatThread, retrievalContexts, token); + + // + // Now, filter the retrieval contexts to the most relevant ones: + // + var targetWindow = validationResults.DetermineTargetWindow(TargetWindowStrategy.TOP10_BETTER_THAN_GUESSING); + var threshold = validationResults.GetConfidenceThreshold(targetWindow); + + // Filter the retrieval contexts: + retrievalContexts = validationResults.Where(x => x.RetrievalContext is not null && x.Confidence >= threshold).Select(x => x.RetrievalContext!).ToList(); + } + + logger.LogInformation($"Starting the augmentation process over {numTotalRetrievalContexts:###,###,###,###} retrieval contexts."); + + // + // We build a huge prompt from all retrieval contexts: + // + var sb = new StringBuilder(); + sb.AppendLine("The following useful information will help you in processing the user prompt:"); + sb.AppendLine(); + + // Let's convert all retrieval contexts to Markdown: + await retrievalContexts.AsMarkdown(sb, token); + + // Add the augmented data to the chat thread: + chatThread.AugmentedData = sb.ToString(); + return chatThread; + } + + #endregion +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/RAG/DataSelectionResult.cs b/app/MindWork AI Studio/Tools/RAG/DataSelectionResult.cs new file mode 100644 index 00000000..6508b76a --- /dev/null +++ b/app/MindWork AI Studio/Tools/RAG/DataSelectionResult.cs @@ -0,0 +1,10 @@ +using AIStudio.Settings; + +namespace AIStudio.Tools.RAG; + +/// +/// Result of any data selection process. +/// +/// Makes it sense to proceed with the RAG process? +/// The selected data sources. +public readonly record struct DataSelectionResult(bool ProceedWithRAG, IReadOnlyList SelectedDataSources); \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/RAG/DataSourceSelectionProcesses/AgenticSrcSelWithDynHeur.cs b/app/MindWork AI Studio/Tools/RAG/DataSourceSelectionProcesses/AgenticSrcSelWithDynHeur.cs new file mode 100644 index 00000000..76f27892 --- /dev/null +++ b/app/MindWork AI Studio/Tools/RAG/DataSourceSelectionProcesses/AgenticSrcSelWithDynHeur.cs @@ -0,0 +1,115 @@ +using AIStudio.Agents; +using AIStudio.Chat; +using AIStudio.Components; +using AIStudio.Provider; +using AIStudio.Settings; + +namespace AIStudio.Tools.RAG.DataSourceSelectionProcesses; + +public class AgenticSrcSelWithDynHeur : IDataSourceSelectionProcess +{ + #region Implementation of IDataSourceSelectionProcess + + /// + public string TechnicalName => "AgenticSrcSelWithDynHeur"; + + /// + public string UIName => "Automatic AI data source selection with heuristik source reduction"; + + /// + public string Description => "Automatically selects the appropriate data sources based on the last prompt. Applies a heuristic reduction at the end to reduce the number of data sources."; + + /// + public async Task SelectDataSourcesAsync(IProvider provider, IContent lastPrompt, ChatThread chatThread, AllowedSelectedDataSources dataSources, CancellationToken token = default) + { + var proceedWithRAG = true; + IReadOnlyList selectedDataSources = []; + IReadOnlyList finalAISelection = []; + + // Get the logger: + var logger = Program.SERVICE_PROVIDER.GetService>()!; + + // Get the settings manager: + var settings = Program.SERVICE_PROVIDER.GetService()!; + + // Get the agent for the data source selection: + var selectionAgent = Program.SERVICE_PROVIDER.GetService()!; + + try + { + // Let the AI agent do its work: + var aiSelectedDataSources = await selectionAgent.PerformSelectionAsync(provider, lastPrompt, chatThread, dataSources, token); + + // Check if the AI selected any data sources: + if (aiSelectedDataSources.Count is 0) + { + logger.LogWarning("The AI did not select any data sources. The RAG process is skipped."); + proceedWithRAG = false; + + return new(proceedWithRAG, selectedDataSources); + } + + // Log the selected data sources: + var selectedDataSourceInfo = aiSelectedDataSources.Select(ds => $"[Id={ds.Id}, reason={ds.Reason}, confidence={ds.Confidence}]").Aggregate((a, b) => $"'{a}', '{b}'"); + logger.LogInformation($"The AI selected the data sources automatically. {aiSelectedDataSources.Count} data source(s) are selected: {selectedDataSourceInfo}."); + + // + // Check how many data sources were hallucinated by the AI: + // + var totalAISelectedDataSources = aiSelectedDataSources.Count; + + // Filter out the data sources that are not available: + aiSelectedDataSources = aiSelectedDataSources.Where(x => settings.ConfigurationData.DataSources.FirstOrDefault(ds => ds.Id == x.Id) is not null).ToList(); + + // Store the real AI-selected data sources: + finalAISelection = aiSelectedDataSources.Select(x => new DataSourceAgentSelected { DataSource = settings.ConfigurationData.DataSources.First(ds => ds.Id == x.Id), AIDecision = x, Selected = false }).ToList(); + + var numHallucinatedSources = totalAISelectedDataSources - aiSelectedDataSources.Count; + if (numHallucinatedSources > 0) + logger.LogWarning($"The AI hallucinated {numHallucinatedSources} data source(s). We ignore them."); + + if (aiSelectedDataSources.Count > 3) + { + // We have more than 3 data sources. Let's filter by confidence: + var targetWindow = aiSelectedDataSources.DetermineTargetWindow(TargetWindowStrategy.A_FEW_GOOD_ONES); + var threshold = aiSelectedDataSources.GetConfidenceThreshold(targetWindow); + + // + // Filter the data sources by the threshold: + // + aiSelectedDataSources = aiSelectedDataSources.Where(x => x.Confidence >= threshold).ToList(); + foreach (var dataSource in finalAISelection) + if (aiSelectedDataSources.Any(x => x.Id == dataSource.DataSource.Id)) + dataSource.Selected = true; + + logger.LogInformation($"The AI selected {aiSelectedDataSources.Count} data source(s) with a confidence of at least {threshold}."); + + // Transform the final data sources to the actual data sources: + selectedDataSources = aiSelectedDataSources.Select(x => settings.ConfigurationData.DataSources.FirstOrDefault(ds => ds.Id == x.Id)).Where(ds => ds is not null).ToList()!; + return new(proceedWithRAG, selectedDataSources); + } + + // + // Case: we have max. 3 data sources. We take all of them: + // + + // Transform the selected data sources to the actual data sources: + selectedDataSources = aiSelectedDataSources.Select(x => settings.ConfigurationData.DataSources.FirstOrDefault(ds => ds.Id == x.Id)).Where(ds => ds is not null).ToList()!; + + // Mark the data sources as selected: + foreach (var dataSource in finalAISelection) + dataSource.Selected = true; + + return new(proceedWithRAG, selectedDataSources); + } + finally + { + // Send the selected data sources to the data source selection component. + // Then, the user can see which data sources were selected by the AI. + await MessageBus.INSTANCE.SendMessage(null, Event.RAG_AUTO_DATA_SOURCES_SELECTED, finalAISelection); + chatThread.AISelectedDataSources = finalAISelection; + } + } + + #endregion +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/RAG/IAugmentationProcess.cs b/app/MindWork AI Studio/Tools/RAG/IAugmentationProcess.cs new file mode 100644 index 00000000..81bb6da7 --- /dev/null +++ b/app/MindWork AI Studio/Tools/RAG/IAugmentationProcess.cs @@ -0,0 +1,33 @@ +using AIStudio.Chat; +using AIStudio.Provider; + +namespace AIStudio.Tools.RAG; + +public interface IAugmentationProcess +{ + /// + /// How is the augmentation process called? + /// + public string TechnicalName { get; } + + /// + /// How is the augmentation process called in the UI? + /// + public string UIName { get; } + + /// + /// How works the augmentation process? + /// + public string Description { get; } + + /// + /// Starts the augmentation process. + /// + /// The LLM provider. Gets used, e.g., for automatic retrieval context validation. + /// The last prompt that was issued by the user. + /// The chat thread. + /// The retrieval contexts that were issued by the retrieval process. + /// The cancellation token. + /// The altered chat thread. + public Task ProcessAsync(IProvider provider, IContent lastPrompt, ChatThread chatThread, IReadOnlyList retrievalContexts, CancellationToken token = default); +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/RAG/IDataSourceSelectionProcess.cs b/app/MindWork AI Studio/Tools/RAG/IDataSourceSelectionProcess.cs new file mode 100644 index 00000000..8213ec24 --- /dev/null +++ b/app/MindWork AI Studio/Tools/RAG/IDataSourceSelectionProcess.cs @@ -0,0 +1,33 @@ +using AIStudio.Chat; +using AIStudio.Provider; + +namespace AIStudio.Tools.RAG; + +public interface IDataSourceSelectionProcess +{ + /// + /// How is the RAG process called? + /// + public string TechnicalName { get; } + + /// + /// How is the RAG process called in the UI? + /// + public string UIName { get; } + + /// + /// How works the RAG process? + /// + public string Description { get; } + + /// + /// Starts the data source selection process. + /// + /// The LLM provider. Used as default for data selection agents. + /// The last prompt that was issued by the user. + /// The chat thread. + /// The allowed data sources yielded by the data source service. + /// The cancellation token. + /// + public Task SelectDataSourcesAsync(IProvider provider, IContent lastPrompt, ChatThread chatThread, AllowedSelectedDataSources dataSources, CancellationToken token = default); +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/RAG/IRagProcess.cs b/app/MindWork AI Studio/Tools/RAG/IRagProcess.cs new file mode 100644 index 00000000..d38e3236 --- /dev/null +++ b/app/MindWork AI Studio/Tools/RAG/IRagProcess.cs @@ -0,0 +1,32 @@ +using AIStudio.Chat; +using AIStudio.Provider; + +namespace AIStudio.Tools.RAG; + +public interface IRagProcess +{ + /// + /// How is the RAG process called? + /// + public string TechnicalName { get; } + + /// + /// How is the RAG process called in the UI? + /// + public string UIName { get; } + + /// + /// How works the RAG process? + /// + public string Description { get; } + + /// + /// Starts the RAG process. + /// + /// The LLM provider. Used to check whether the data sources are allowed to be used by this LLM. + /// The last prompt that was issued by the user. + /// The chat thread. + /// The cancellation token. + /// The altered chat thread. + public Task ProcessAsync(IProvider provider, IContent lastPrompt, ChatThread chatThread, CancellationToken token = default); +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/RAG/IRetrievalContext.cs b/app/MindWork AI Studio/Tools/RAG/IRetrievalContext.cs new file mode 100644 index 00000000..27a03dfd --- /dev/null +++ b/app/MindWork AI Studio/Tools/RAG/IRetrievalContext.cs @@ -0,0 +1,45 @@ +namespace AIStudio.Tools.RAG; + +/// +/// The common interface for any retrieval context. +/// +public interface IRetrievalContext +{ + /// + /// The name of the data source. + /// + /// + /// Depending on the configuration, the AI is selecting the appropriate data source. + /// In order to inform the user about where the information is coming from, the data + /// source name is necessary. + /// + public string DataSourceName { get; init; } + + /// + /// The category of the content, like e.g., text, audio, image, etc. + /// + public RetrievalContentCategory Category { get; init; } + + /// + /// What type of content is being retrieved? Like e.g., a project proposal, spreadsheet, art, etc. + /// + public RetrievalContentType Type { get; init; } + + /// + /// The path to the content, e.g., a URL, a file path, a path in a graph database, etc. + /// + public string Path { get; init; } + + /// + /// Links to related content, e.g., links to Wikipedia articles, links to sources, etc. + /// + /// + /// Why would you need links for retrieval? You are right that not all retrieval + /// contexts need links. But think about a web search feature, where we want to + /// query a search engine and get back a list of links to the most relevant + /// matches. Think about a continuous web crawler that is constantly looking for + /// new information and adding it to the knowledge base. In these cases, links + /// are essential. + /// + public IReadOnlyList Links { get; init; } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/RAG/IRetrievalContextExtensions.cs b/app/MindWork AI Studio/Tools/RAG/IRetrievalContextExtensions.cs new file mode 100644 index 00000000..ee5e6cb5 --- /dev/null +++ b/app/MindWork AI Studio/Tools/RAG/IRetrievalContextExtensions.cs @@ -0,0 +1,96 @@ +using System.Text; + +using AIStudio.Chat; + +namespace AIStudio.Tools.RAG; + +public static class IRetrievalContextExtensions +{ + private static readonly ILogger LOGGER = Program.SERVICE_PROVIDER.GetService>()!; + + public static async Task AsMarkdown(this IReadOnlyList retrievalContexts, StringBuilder? sb = null, CancellationToken token = default) + { + sb ??= new StringBuilder(); + var index = 0; + + foreach(var retrievalContext in retrievalContexts) + { + index++; + await retrievalContext.AsMarkdown(sb, index, retrievalContexts.Count, token); + } + + return sb.ToString(); + } + + public static async Task AsMarkdown(this IRetrievalContext retrievalContext, StringBuilder? sb = null, int index = -1, int numTotalRetrievalContexts = -1, CancellationToken token = default) + { + sb ??= new StringBuilder(); + switch (index) + { + case > 0 when numTotalRetrievalContexts is -1: + sb.AppendLine($"# Retrieval context {index}"); + break; + + case > 0 when numTotalRetrievalContexts > 0: + sb.AppendLine($"# Retrieval context {index} of {numTotalRetrievalContexts}"); + break; + + default: + sb.AppendLine("# Retrieval context"); + break; + } + + sb.AppendLine($"Data source name: {retrievalContext.DataSourceName}"); + sb.AppendLine($"Content category: {retrievalContext.Category}"); + sb.AppendLine($"Content type: {retrievalContext.Type}"); + sb.AppendLine($"Content path: {retrievalContext.Path}"); + + if(retrievalContext.Links.Count > 0) + { + sb.AppendLine("Additional links:"); + foreach(var link in retrievalContext.Links) + sb.AppendLine($"- {link}"); + } + + switch(retrievalContext) + { + case RetrievalTextContext textContext: + sb.AppendLine(); + sb.AppendLine("Matched text content:"); + sb.AppendLine("````"); + sb.AppendLine(textContext.MatchedText); + sb.AppendLine("````"); + + if(textContext.SurroundingContent.Count > 0) + { + sb.AppendLine(); + sb.AppendLine("Surrounding text content:"); + foreach(var surrounding in textContext.SurroundingContent) + { + sb.AppendLine(); + sb.AppendLine("````"); + sb.AppendLine(surrounding); + sb.AppendLine("````"); + } + } + + + break; + + case RetrievalImageContext imageContext: + sb.AppendLine(); + sb.AppendLine("Matched image content as base64-encoded data:"); + sb.AppendLine("````"); + sb.AppendLine(await imageContext.AsBase64(token)); + sb.AppendLine("````"); + break; + + default: + LOGGER.LogWarning($"The retrieval content type '{retrievalContext.Type}' of data source '{retrievalContext.DataSourceName}' at location '{retrievalContext.Path}' is not supported yet."); + break; + } + + sb.AppendLine(); + return sb.ToString(); + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/RAG/RAGProcesses/AISrcSelWithRetCtxVal.cs b/app/MindWork AI Studio/Tools/RAG/RAGProcesses/AISrcSelWithRetCtxVal.cs new file mode 100644 index 00000000..2736f7b0 --- /dev/null +++ b/app/MindWork AI Studio/Tools/RAG/RAGProcesses/AISrcSelWithRetCtxVal.cs @@ -0,0 +1,194 @@ +using AIStudio.Chat; +using AIStudio.Provider; +using AIStudio.Settings; +using AIStudio.Settings.DataModel; +using AIStudio.Tools.RAG.AugmentationProcesses; +using AIStudio.Tools.RAG.DataSourceSelectionProcesses; +using AIStudio.Tools.Services; + +namespace AIStudio.Tools.RAG.RAGProcesses; + +public sealed class AISrcSelWithRetCtxVal : IRagProcess +{ + #region Implementation of IRagProcess + + /// + public string TechnicalName => "AISrcSelWithRetCtxVal"; + + /// + public string UIName => "AI source selection with AI retrieval context validation"; + + /// + public string Description => "This RAG process filters data sources, automatically selects appropriate sources, optionally allows manual source selection, retrieves data, and automatically validates the retrieval context."; + + /// + public async Task ProcessAsync(IProvider provider, IContent lastPrompt, ChatThread chatThread, CancellationToken token = default) + { + var logger = Program.SERVICE_PROVIDER.GetService>()!; + var settings = Program.SERVICE_PROVIDER.GetService()!; + var dataSourceService = Program.SERVICE_PROVIDER.GetService()!; + + // + // 1. Check if the user wants to bind any data sources to the chat: + // + if (chatThread.DataSourceOptions.IsEnabled()) + { + logger.LogInformation("Data sources are enabled for this chat."); + + // Across the different code-branches, we keep track of whether it + // makes sense to proceed with the RAG process: + var proceedWithRAG = true; + + // + // We read the last block in the chat thread. We need to re-arrange + // the order of blocks later, after the augmentation process takes + // place: + // + if(chatThread.Blocks.Count == 0) + { + logger.LogError("The chat thread is empty. Skipping the RAG process."); + return chatThread; + } + + if (chatThread.Blocks.Last().Role != ChatRole.AI) + { + logger.LogError("The last block in the chat thread is not the AI block. There is something wrong with the chat thread. Skipping the RAG process."); + return chatThread; + } + + // + // At this point in time, the chat thread contains already the + // last block, which is the waiting AI block. We need to remove + // this block before we call some parts of the RAG process: + // + var chatThreadWithoutWaitingAIBlock = chatThread with { Blocks = chatThread.Blocks[..^1] }; + + // + // When the user wants to bind data sources to the chat, we + // have to check if the data sources are available for the + // selected provider. Also, we have to check if any ERI + // data sources changed its security requirements. + // + List preselectedDataSources = chatThread.DataSourceOptions.PreselectedDataSourceIds.Select(id => settings.ConfigurationData.DataSources.FirstOrDefault(ds => ds.Id == id)).Where(ds => ds is not null).ToList()!; + var dataSources = await dataSourceService.GetDataSources(provider, preselectedDataSources); + var selectedDataSources = dataSources.SelectedDataSources; + + // + // Should the AI select the data sources? + // + if (chatThread.DataSourceOptions.AutomaticDataSourceSelection) + { + var dataSourceSelectionProcess = new AgenticSrcSelWithDynHeur(); + var result = await dataSourceSelectionProcess.SelectDataSourcesAsync(provider, lastPrompt, chatThread, dataSources, token); + proceedWithRAG = result.ProceedWithRAG; + selectedDataSources = result.SelectedDataSources; + } + else + { + // + // No, the user made the choice manually: + // + var selectedDataSourceInfo = selectedDataSources.Select(ds => ds.Name).Aggregate((a, b) => $"'{a}', '{b}'"); + logger.LogInformation($"The user selected the data sources manually. {selectedDataSources.Count} data source(s) are selected: {selectedDataSourceInfo}."); + } + + if(selectedDataSources.Count == 0) + { + logger.LogWarning("No data sources are selected. The RAG process is skipped."); + proceedWithRAG = false; + } + else + { + var previousDataSecurity = chatThread.DataSecurity; + + // + // Update the data security of the chat thread. We consider the current data security + // of the chat thread and the data security of the selected data sources: + // + var dataSecurityRestrictedToSelfHosted = selectedDataSources.Any(x => x.SecurityPolicy is DataSourceSecurity.SELF_HOSTED); + chatThread.DataSecurity = dataSecurityRestrictedToSelfHosted switch + { + // + // + // Case: the data sources which are selected have a security policy + // of SELF_HOSTED (at least one data source). + // + // When the policy was already set to ALLOW_ANY, we restrict it + // to SELF_HOSTED. + // + true => DataSourceSecurity.SELF_HOSTED, + + // + // Case: the data sources which are selected have a security policy + // of ALLOW_ANY (none of the data sources has a SELF_HOSTED policy). + // + // When the policy was already set to SELF_HOSTED, we must keep that. + // + false => chatThread.DataSecurity switch + { + // + // When the policy was not specified yet, we set it to ALLOW_ANY. + // + DataSourceSecurity.NOT_SPECIFIED => DataSourceSecurity.ALLOW_ANY, + DataSourceSecurity.ALLOW_ANY => DataSourceSecurity.ALLOW_ANY, + + // + // When the policy was already set to SELF_HOSTED, we must keep that. + // This is important since the thread might already contain data + // from a data source with a SELF_HOSTED policy. + // + DataSourceSecurity.SELF_HOSTED => DataSourceSecurity.SELF_HOSTED, + + // Default case: we use the current data security of the chat thread. + _ => chatThread.DataSecurity, + } + }; + + if (previousDataSecurity != chatThread.DataSecurity) + logger.LogInformation($"The data security of the chat thread was updated from '{previousDataSecurity}' to '{chatThread.DataSecurity}'."); + } + + // + // Trigger the retrieval part of the (R)AG process: + // + var dataContexts = new List(); + if (proceedWithRAG) + { + // + // We kick off the retrieval process for each data source in parallel: + // + var retrievalTasks = new List>>(selectedDataSources.Count); + foreach (var dataSource in selectedDataSources) + retrievalTasks.Add(dataSource.RetrieveDataAsync(lastPrompt, chatThreadWithoutWaitingAIBlock, token)); + + // + // Wait for all retrieval tasks to finish: + // + foreach (var retrievalTask in retrievalTasks) + { + try + { + dataContexts.AddRange(await retrievalTask); + } + catch (Exception e) + { + logger.LogError(e, "An error occurred during the retrieval process."); + } + } + } + + // + // Perform the augmentation of the R(A)G process: + // + if (proceedWithRAG) + { + var augmentationProcess = new AugmentationOne(); + chatThread = await augmentationProcess.ProcessAsync(provider, lastPrompt, chatThread, dataContexts, token); + } + } + + return chatThread; + } + + #endregion +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/RAG/RetrievalContentCategory.cs b/app/MindWork AI Studio/Tools/RAG/RetrievalContentCategory.cs new file mode 100644 index 00000000..b3ee1bec --- /dev/null +++ b/app/MindWork AI Studio/Tools/RAG/RetrievalContentCategory.cs @@ -0,0 +1,12 @@ +namespace AIStudio.Tools.RAG; + +public enum RetrievalContentCategory +{ + NONE, + UNKNOWN, + + TEXT, + IMAGE, + VIDEO, + AUDIO, +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/RAG/RetrievalContentCategoryExtensions.cs b/app/MindWork AI Studio/Tools/RAG/RetrievalContentCategoryExtensions.cs new file mode 100644 index 00000000..a5481695 --- /dev/null +++ b/app/MindWork AI Studio/Tools/RAG/RetrievalContentCategoryExtensions.cs @@ -0,0 +1,24 @@ +using AIStudio.Tools.ERIClient.DataModel; + +namespace AIStudio.Tools.RAG; + +public static class RetrievalContentCategoryExtensions +{ + /// + /// Converts an ERI content type to a common retrieval content category. + /// + /// The content type yielded by the ERI server. + /// The corresponding retrieval content category. + public static RetrievalContentCategory ToRetrievalContentCategory(this ContentType contentType) => contentType switch + { + ContentType.NONE => RetrievalContentCategory.NONE, + ContentType.UNKNOWN => RetrievalContentCategory.UNKNOWN, + ContentType.TEXT => RetrievalContentCategory.TEXT, + ContentType.IMAGE => RetrievalContentCategory.IMAGE, + ContentType.VIDEO => RetrievalContentCategory.VIDEO, + ContentType.AUDIO => RetrievalContentCategory.AUDIO, + ContentType.SPEECH => RetrievalContentCategory.AUDIO, + + _ => RetrievalContentCategory.UNKNOWN, + }; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/RAG/RetrievalContentType.cs b/app/MindWork AI Studio/Tools/RAG/RetrievalContentType.cs new file mode 100644 index 00000000..c8866118 --- /dev/null +++ b/app/MindWork AI Studio/Tools/RAG/RetrievalContentType.cs @@ -0,0 +1,105 @@ +namespace AIStudio.Tools.RAG; + +/// +/// The type of the retrieved content. +/// +public enum RetrievalContentType +{ + NOT_SPECIFIED, + UNKNOWN, + + // + // Text Content: + // + TEXT_DOCUMENT, + TEXT_ARTICLE, + TEXT_BOOK, + TEXT_CHAPTER, + TEXT_PAPER, + TEXT_THESIS, + TEXT_BUSINESS_CONCEPT, + TEXT_DICTIONARY, + TEXT_ENCYCLOPEDIA, + TEXT_GLOSSARY, + TEXT_JOURNAL, + TEXT_MAGAZINE, + TEXT_NEWSPAPER, + TEXT_REPORT, + TEXT_REVIEW, + TEXT_WEBSITE, + TEXT_IDEA, + TEXT_CONCEPT, + TEXT_DEFINITION, + TEXT_EXAMPLE, + TEXT_QUOTE, + TEXT_DRAFT, + TEXT_SCRIPT, + TEXT_TRANSCRIPT, + TEXT_SUBTITLE, + TEXT_CAPTION, + TEXT_DIALOGUE, + TEXT_PROJECT_PROPOSAL, + TEXT_PROJECT_PLAN, + TEXT_SPREADSHEET, + TEXT_PRESENTATION, + TEXT_MEETING_MINUTES, + TEXT_EMAIL, + TEXT_PROTOCOL, + + // + // Image Content: + // + IMAGE_PHOTO, + IMAGE_ILLUSTRATION, + IMAGE_DIAGRAM, + IMAGE_CHART, + IMAGE_ART, + IMAGE_DRAWING, + IMAGE_PAINTING, + IMAGE_SKETCH, + IMAGE_MAP, + IMAGE_CHARACTER, + IMAGE_SCENE, + IMAGE_LANDSCAPE, + IMAGE_PORTRAIT, + IMAGE_POSTER, + IMAGE_LOGO, + IMAGE_ICON, + IMAGE_SATELLITE_IMAGE, + + // + // Audio Content: + // + AUDIO_SPEECH, + AUDIO_PODCAST, + AUDIO_BOOK, + AUDIO_INTERVIEW, + AUDIO_LECTURE, + AUDIO_TALK, + AUDIO_SONG, + AUDIO_MUSIC, + AUDIO_SOUND, + AUDIO_CALL, + AUDIO_VOICE_ACTING, + AUDIO_DESCRIPTION, + AUDIO_GUIDE, + AUDIO_DIALOGUE, + + // + // Video Content: + // + VIDEO_MOVIE, + VIDEO_FILM, + VIDEO_TV_SHOW, + VIDEO_SERIES, + VIDEO_EPISODE, + VIDEO_DOCUMENTARY, + VIDEO_TUTORIAL, + VIDEO_LECTURE, + VIDEO_WEBINAR, + VIDEO_GAME, + VIDEO_ANIMATION, + VIDEO_CUTSCENE, + VIDEO_TRAILER, + VIDEO_ADVERTISEMENT, +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/RAG/RetrievalContentTypeExtensions.cs b/app/MindWork AI Studio/Tools/RAG/RetrievalContentTypeExtensions.cs new file mode 100644 index 00000000..6abc4750 --- /dev/null +++ b/app/MindWork AI Studio/Tools/RAG/RetrievalContentTypeExtensions.cs @@ -0,0 +1,141 @@ +using AIStudio.Tools.ERIClient.DataModel; + +namespace AIStudio.Tools.RAG; + +public static class RetrievalContentTypeExtensions +{ + public static RetrievalContentType ToRetrievalContentType(this Context eriContext) + { + // + // Right now, we have to parse the category string along the type enum to + // determine the common retrieval content type. In future ERI versions, we + // might use the same enum. + // + + var lowerCategory = eriContext.Category.ToLowerInvariant(); + var type = eriContext.Type; + return type switch + { + ContentType.TEXT when lowerCategory.Contains("book") => RetrievalContentType.TEXT_BOOK, + ContentType.TEXT when lowerCategory.Contains("paper") => RetrievalContentType.TEXT_PAPER, + ContentType.TEXT when lowerCategory.Contains("dictionary") => RetrievalContentType.TEXT_DICTIONARY, + ContentType.TEXT when lowerCategory.Contains("encyclopedia") => RetrievalContentType.TEXT_ENCYCLOPEDIA, + ContentType.TEXT when lowerCategory.Contains("glossary") => RetrievalContentType.TEXT_GLOSSARY, + ContentType.TEXT when lowerCategory.Contains("journal") => RetrievalContentType.TEXT_JOURNAL, + ContentType.TEXT when lowerCategory.Contains("magazine") => RetrievalContentType.TEXT_MAGAZINE, + ContentType.TEXT when lowerCategory.Contains("newspaper") => RetrievalContentType.TEXT_NEWSPAPER, + ContentType.TEXT when lowerCategory.Contains("report") => RetrievalContentType.TEXT_REPORT, + ContentType.TEXT when lowerCategory.Contains("review") => RetrievalContentType.TEXT_REVIEW, + ContentType.TEXT when lowerCategory.Contains("website") => RetrievalContentType.TEXT_WEBSITE, + ContentType.TEXT when lowerCategory.Contains("idea") => RetrievalContentType.TEXT_IDEA, + + ContentType.TEXT when lowerCategory.Contains("business concept") => RetrievalContentType.TEXT_BUSINESS_CONCEPT, + ContentType.TEXT when lowerCategory.Contains("concept") => RetrievalContentType.TEXT_CONCEPT, + + ContentType.TEXT when lowerCategory.Contains("definition") => RetrievalContentType.TEXT_DEFINITION, + ContentType.TEXT when lowerCategory.Contains("example") => RetrievalContentType.TEXT_EXAMPLE, + ContentType.TEXT when lowerCategory.Contains("quote") => RetrievalContentType.TEXT_QUOTE, + ContentType.TEXT when lowerCategory.Contains("article") => RetrievalContentType.TEXT_ARTICLE, + ContentType.TEXT when lowerCategory.Contains("chapter") => RetrievalContentType.TEXT_CHAPTER, + + ContentType.TEXT when lowerCategory.Contains("thesis") => RetrievalContentType.TEXT_THESIS, + ContentType.TEXT when lowerCategory.Contains("dissertation") => RetrievalContentType.TEXT_THESIS, + + ContentType.TEXT when lowerCategory.Contains("draft") => RetrievalContentType.TEXT_DRAFT, + ContentType.TEXT when lowerCategory.Contains("script") => RetrievalContentType.TEXT_SCRIPT, + ContentType.TEXT when lowerCategory.Contains("transcript") => RetrievalContentType.TEXT_TRANSCRIPT, + ContentType.TEXT when lowerCategory.Contains("subtitle") => RetrievalContentType.TEXT_SUBTITLE, + ContentType.TEXT when lowerCategory.Contains("caption") => RetrievalContentType.TEXT_CAPTION, + ContentType.TEXT when lowerCategory.Contains("dialogue") => RetrievalContentType.TEXT_DIALOGUE, + ContentType.TEXT when lowerCategory.Contains("project proposal") => RetrievalContentType.TEXT_PROJECT_PROPOSAL, + ContentType.TEXT when lowerCategory.Contains("project plan") => RetrievalContentType.TEXT_PROJECT_PLAN, + ContentType.TEXT when lowerCategory.Contains("spreadsheet") => RetrievalContentType.TEXT_SPREADSHEET, + + ContentType.TEXT when lowerCategory.Contains("presentation") => RetrievalContentType.TEXT_PRESENTATION, + ContentType.TEXT when lowerCategory.Contains("powerpoint") => RetrievalContentType.TEXT_PRESENTATION, + ContentType.TEXT when lowerCategory.Contains("slide") => RetrievalContentType.TEXT_PRESENTATION, + + ContentType.TEXT when lowerCategory.Contains("meeting minutes") => RetrievalContentType.TEXT_MEETING_MINUTES, + ContentType.TEXT when lowerCategory.Contains("email") => RetrievalContentType.TEXT_EMAIL, + ContentType.TEXT when lowerCategory.Contains("protocol") => RetrievalContentType.TEXT_PROTOCOL, + + ContentType.TEXT => RetrievalContentType.TEXT_DOCUMENT, + + + ContentType.IMAGE when lowerCategory.Contains("photo") => RetrievalContentType.IMAGE_PHOTO, + ContentType.IMAGE when lowerCategory.Contains("illustration") => RetrievalContentType.IMAGE_ILLUSTRATION, + ContentType.IMAGE when lowerCategory.Contains("diagram") => RetrievalContentType.IMAGE_DIAGRAM, + ContentType.IMAGE when lowerCategory.Contains("chart") => RetrievalContentType.IMAGE_CHART, + ContentType.IMAGE when lowerCategory.Contains("art") => RetrievalContentType.IMAGE_ART, + ContentType.IMAGE when lowerCategory.Contains("drawing") => RetrievalContentType.IMAGE_DRAWING, + ContentType.IMAGE when lowerCategory.Contains("painting") => RetrievalContentType.IMAGE_PAINTING, + ContentType.IMAGE when lowerCategory.Contains("sketch") => RetrievalContentType.IMAGE_SKETCH, + ContentType.IMAGE when lowerCategory.Contains("map") => RetrievalContentType.IMAGE_MAP, + ContentType.IMAGE when lowerCategory.Contains("scene") => RetrievalContentType.IMAGE_SCENE, + ContentType.IMAGE when lowerCategory.Contains("character") => RetrievalContentType.IMAGE_CHARACTER, + ContentType.IMAGE when lowerCategory.Contains("landscape") => RetrievalContentType.IMAGE_LANDSCAPE, + ContentType.IMAGE when lowerCategory.Contains("portrait") => RetrievalContentType.IMAGE_PORTRAIT, + ContentType.IMAGE when lowerCategory.Contains("poster") => RetrievalContentType.IMAGE_POSTER, + ContentType.IMAGE when lowerCategory.Contains("logo") => RetrievalContentType.IMAGE_LOGO, + ContentType.IMAGE when lowerCategory.Contains("icon") => RetrievalContentType.IMAGE_ICON, + + ContentType.IMAGE when lowerCategory.Contains("satellite") => RetrievalContentType.IMAGE_SATELLITE_IMAGE, + ContentType.IMAGE when lowerCategory.Contains("EO") => RetrievalContentType.IMAGE_SATELLITE_IMAGE, + ContentType.IMAGE when lowerCategory.Contains("earth observation") => RetrievalContentType.IMAGE_SATELLITE_IMAGE, + + ContentType.IMAGE => RetrievalContentType.NOT_SPECIFIED, + + + ContentType.AUDIO when lowerCategory.Contains("speech") => RetrievalContentType.AUDIO_SPEECH, + + ContentType.AUDIO when lowerCategory.Contains("podcast") => RetrievalContentType.AUDIO_PODCAST, + ContentType.SPEECH when lowerCategory.Contains("podcast") => RetrievalContentType.AUDIO_PODCAST, + + ContentType.AUDIO when lowerCategory.Contains("book") => RetrievalContentType.AUDIO_BOOK, + ContentType.SPEECH when lowerCategory.Contains("book") => RetrievalContentType.AUDIO_BOOK, + + ContentType.AUDIO when lowerCategory.Contains("interview") => RetrievalContentType.AUDIO_INTERVIEW, + ContentType.SPEECH when lowerCategory.Contains("interview") => RetrievalContentType.AUDIO_INTERVIEW, + + ContentType.AUDIO when lowerCategory.Contains("lecture") => RetrievalContentType.AUDIO_LECTURE, + ContentType.SPEECH when lowerCategory.Contains("lecture") => RetrievalContentType.AUDIO_LECTURE, + + ContentType.AUDIO when lowerCategory.Contains("talk") => RetrievalContentType.AUDIO_TALK, + ContentType.SPEECH when lowerCategory.Contains("talk") => RetrievalContentType.AUDIO_TALK, + + ContentType.AUDIO when lowerCategory.Contains("song") => RetrievalContentType.AUDIO_SONG, + ContentType.AUDIO when lowerCategory.Contains("music") => RetrievalContentType.AUDIO_MUSIC, + ContentType.AUDIO when lowerCategory.Contains("sound") => RetrievalContentType.AUDIO_SOUND, + ContentType.AUDIO when lowerCategory.Contains("call") => RetrievalContentType.AUDIO_CALL, + ContentType.AUDIO when lowerCategory.Contains("voice acting") => RetrievalContentType.AUDIO_VOICE_ACTING, + ContentType.AUDIO when lowerCategory.Contains("description") => RetrievalContentType.AUDIO_DESCRIPTION, + ContentType.AUDIO when lowerCategory.Contains("guide") => RetrievalContentType.AUDIO_GUIDE, + ContentType.AUDIO when lowerCategory.Contains("dialogue") => RetrievalContentType.AUDIO_DIALOGUE, + + ContentType.SPEECH => RetrievalContentType.AUDIO_SPEECH, + ContentType.AUDIO => RetrievalContentType.NOT_SPECIFIED, + + + ContentType.VIDEO when lowerCategory.Contains("movie") => RetrievalContentType.VIDEO_MOVIE, + ContentType.VIDEO when lowerCategory.Contains("film") => RetrievalContentType.VIDEO_FILM, + ContentType.VIDEO when lowerCategory.Contains("tv show") => RetrievalContentType.VIDEO_TV_SHOW, + ContentType.VIDEO when lowerCategory.Contains("series") => RetrievalContentType.VIDEO_SERIES, + ContentType.VIDEO when lowerCategory.Contains("episode") => RetrievalContentType.VIDEO_EPISODE, + ContentType.VIDEO when lowerCategory.Contains("documentary") => RetrievalContentType.VIDEO_DOCUMENTARY, + ContentType.VIDEO when lowerCategory.Contains("tutorial") => RetrievalContentType.VIDEO_TUTORIAL, + ContentType.VIDEO when lowerCategory.Contains("lecture") => RetrievalContentType.VIDEO_LECTURE, + ContentType.VIDEO when lowerCategory.Contains("webinar") => RetrievalContentType.VIDEO_WEBINAR, + ContentType.VIDEO when lowerCategory.Contains("game") => RetrievalContentType.VIDEO_GAME, + ContentType.VIDEO when lowerCategory.Contains("animation") => RetrievalContentType.VIDEO_ANIMATION, + ContentType.VIDEO when lowerCategory.Contains("cutscene") => RetrievalContentType.VIDEO_CUTSCENE, + ContentType.VIDEO when lowerCategory.Contains("trailer") => RetrievalContentType.VIDEO_TRAILER, + ContentType.VIDEO when lowerCategory.Contains("advertisement") => RetrievalContentType.VIDEO_ADVERTISEMENT, + + ContentType.VIDEO => RetrievalContentType.NOT_SPECIFIED, + + ContentType.NONE => RetrievalContentType.NOT_SPECIFIED, + + _ => RetrievalContentType.UNKNOWN, + }; + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/RAG/RetrievalImageContext.cs b/app/MindWork AI Studio/Tools/RAG/RetrievalImageContext.cs new file mode 100644 index 00000000..973892d3 --- /dev/null +++ b/app/MindWork AI Studio/Tools/RAG/RetrievalImageContext.cs @@ -0,0 +1,38 @@ +using AIStudio.Chat; + +namespace AIStudio.Tools.RAG; + +public sealed class RetrievalImageContext : IRetrievalContext, IImageSource +{ + #region Implementation of IRetrievalContext + + /// + public required string DataSourceName { get; init; } + + /// + public required RetrievalContentCategory Category { get; init; } + + /// + public required RetrievalContentType Type { get; init; } + + /// + public required string Path { get; init; } + + /// + public IReadOnlyList Links { get; init; } = []; + + #endregion + + /// + /// The type of the image source. + /// + /// + /// Is the image source a URL, a local file path, a base64 string, etc.? + /// + public required ContentImageSource SourceType { get; init; } + + /// + /// The image source. + /// + public required string Source { get; set; } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/RAG/RetrievalTextContext.cs b/app/MindWork AI Studio/Tools/RAG/RetrievalTextContext.cs new file mode 100644 index 00000000..9997e571 --- /dev/null +++ b/app/MindWork AI Studio/Tools/RAG/RetrievalTextContext.cs @@ -0,0 +1,43 @@ +namespace AIStudio.Tools.RAG; + +/// +/// The retrieval context for text data. +/// +public sealed class RetrievalTextContext : IRetrievalContext +{ + #region Implementation of IRetrievalContext + + /// + public required string DataSourceName { get; init; } + + /// + public required RetrievalContentCategory Category { get; init; } + + /// + public required RetrievalContentType Type { get; init; } + + /// + public required string Path { get; init; } + + /// + public IReadOnlyList Links { get; init; } = []; + + #endregion + + /// + /// The text content. + /// + /// + /// Should contain the matched text and some small context around it. + /// + public required string MatchedText { get; set; } + + /// + /// The surrounding content of the matched text. + /// + /// + /// Might give the user some context about the matched text. + /// For example, one sentence or paragraph before and after the matched text. + /// + public IReadOnlyList SurroundingContent { get; set; } = []; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Rust/FileSelectionResponse.cs b/app/MindWork AI Studio/Tools/Rust/FileSelectionResponse.cs new file mode 100644 index 00000000..fd3bed6f --- /dev/null +++ b/app/MindWork AI Studio/Tools/Rust/FileSelectionResponse.cs @@ -0,0 +1,8 @@ +namespace AIStudio.Tools.Rust; + +/// +/// Data structure for selecting a file. +/// +/// Was the file selection canceled? +/// The selected file, if any. +public readonly record struct FileSelectionResponse(bool UserCancelled, string SelectedFilePath); \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Rust/GetLogPathsResponse.cs b/app/MindWork AI Studio/Tools/Rust/GetLogPathsResponse.cs new file mode 100644 index 00000000..4cd6169e --- /dev/null +++ b/app/MindWork AI Studio/Tools/Rust/GetLogPathsResponse.cs @@ -0,0 +1,3 @@ +namespace AIStudio.Tools.Rust; + +public readonly record struct GetLogPathsResponse(string LogStartupPath, string LogAppPath); \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Rust/PreviousFile.cs b/app/MindWork AI Studio/Tools/Rust/PreviousFile.cs new file mode 100644 index 00000000..217ea064 --- /dev/null +++ b/app/MindWork AI Studio/Tools/Rust/PreviousFile.cs @@ -0,0 +1,7 @@ +namespace AIStudio.Tools.Rust; + +/// +/// Data structure for selecting a file when a previous file was selected. +/// +/// The path of the previous file. +public readonly record struct PreviousFile(string FilePath); \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/RustService.cs b/app/MindWork AI Studio/Tools/RustService.cs deleted file mode 100644 index 99476e52..00000000 --- a/app/MindWork AI Studio/Tools/RustService.cs +++ /dev/null @@ -1,347 +0,0 @@ -using System.Security.Cryptography; -using System.Text.Json; - -using AIStudio.Tools.Rust; - -// ReSharper disable NotAccessedPositionalProperty.Local - -namespace AIStudio.Tools; - -/// -/// Calling Rust functions. -/// -public sealed class RustService : IDisposable -{ - private readonly HttpClient http; - - private readonly JsonSerializerOptions jsonRustSerializerOptions = new() - { - PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower, - }; - - private ILogger? logger; - private Encryption? encryptor; - - private readonly string apiPort; - private readonly string certificateFingerprint; - - public RustService(string apiPort, string certificateFingerprint) - { - this.apiPort = apiPort; - this.certificateFingerprint = certificateFingerprint; - var certificateValidationHandler = new HttpClientHandler - { - ServerCertificateCustomValidationCallback = (_, certificate, _, _) => - { - if(certificate is null) - return false; - - var currentCertificateFingerprint = certificate.GetCertHashString(HashAlgorithmName.SHA256); - return currentCertificateFingerprint == certificateFingerprint; - }, - }; - - this.http = new HttpClient(certificateValidationHandler) - { - BaseAddress = new Uri($"https://127.0.0.1:{apiPort}"), - DefaultRequestVersion = Version.Parse("2.0"), - DefaultVersionPolicy = HttpVersionPolicy.RequestVersionOrHigher, - }; - - this.http.DefaultRequestHeaders.AddApiToken(); - } - - public void SetLogger(ILogger logService) - { - this.logger = logService; - } - - public void SetEncryptor(Encryption encryptionService) - { - this.encryptor = encryptionService; - } - - public async Task GetAppPort() - { - Console.WriteLine("Trying to get app port from Rust runtime..."); - - // - // Note I: In the production environment, the Rust runtime is already running - // and listening on the given port. In the development environment, the IDE - // starts the Rust runtime in parallel with the .NET runtime. Since the - // Rust runtime needs some time to start, we have to wait for it to be ready. - // - const int MAX_TRIES = 160; - var tris = 0; - var wait4Try = TimeSpan.FromMilliseconds(250); - var url = new Uri($"https://127.0.0.1:{this.apiPort}/system/dotnet/port"); - while (tris++ < MAX_TRIES) - { - // - // Note II: We use a new HttpClient instance for each try to avoid - // .NET is caching the result. When we use the same HttpClient - // instance, we would always get the same result (403 forbidden), - // without even trying to connect to the Rust server. - // - - using var initialHttp = new HttpClient(new HttpClientHandler - { - // - // Note III: We have to create also a new HttpClientHandler instance - // for each try to avoid .NET is caching the result. This is necessary - // because it gets disposed when the HttpClient instance gets disposed. - // - ServerCertificateCustomValidationCallback = (_, certificate, _, _) => - { - if(certificate is null) - return false; - - var currentCertificateFingerprint = certificate.GetCertHashString(HashAlgorithmName.SHA256); - return currentCertificateFingerprint == this.certificateFingerprint; - } - }); - - initialHttp.DefaultRequestVersion = Version.Parse("2.0"); - initialHttp.DefaultVersionPolicy = HttpVersionPolicy.RequestVersionOrHigher; - initialHttp.DefaultRequestHeaders.AddApiToken(); - - try - { - var response = await initialHttp.GetAsync(url); - if (!response.IsSuccessStatusCode) - { - Console.WriteLine($"Try {tris}/{MAX_TRIES} to get the app port from Rust runtime"); - await Task.Delay(wait4Try); - continue; - } - - var appPortContent = await response.Content.ReadAsStringAsync(); - var appPort = int.Parse(appPortContent); - Console.WriteLine($"Received app port from Rust runtime: '{appPort}'"); - return appPort; - } - catch (Exception e) - { - Console.WriteLine($"Error: Was not able to get the app port from Rust runtime: '{e.Message}'"); - Console.WriteLine(e.InnerException); - throw; - } - } - - Console.WriteLine("Failed to receive the app port from Rust runtime."); - return 0; - } - - public async Task AppIsReady() - { - const string URL = "/system/dotnet/ready"; - this.logger!.LogInformation("Notifying Rust runtime that the app is ready."); - try - { - var response = await this.http.GetAsync(URL); - if (!response.IsSuccessStatusCode) - { - this.logger!.LogError($"Failed to notify Rust runtime that the app is ready: '{response.StatusCode}'"); - } - } - catch (Exception e) - { - this.logger!.LogError(e, "Failed to notify the Rust runtime that the app is ready."); - throw; - } - } - - public async Task GetConfigDirectory() - { - var response = await this.http.GetAsync("/system/directories/config"); - if (!response.IsSuccessStatusCode) - { - this.logger!.LogError($"Failed to get the config directory from Rust: '{response.StatusCode}'"); - return string.Empty; - } - - return await response.Content.ReadAsStringAsync(); - } - - public async Task GetDataDirectory() - { - var response = await this.http.GetAsync("/system/directories/data"); - if (!response.IsSuccessStatusCode) - { - this.logger!.LogError($"Failed to get the data directory from Rust: '{response.StatusCode}'"); - return string.Empty; - } - - return await response.Content.ReadAsStringAsync(); - } - - /// - /// Tries to copy the given text to the clipboard. - /// - /// The snackbar to show the result. - /// The text to copy to the clipboard. - public async Task CopyText2Clipboard(ISnackbar snackbar, string text) - { - var message = "Successfully copied the text to your clipboard"; - var iconColor = Color.Error; - var severity = Severity.Error; - try - { - var encryptedText = await text.Encrypt(this.encryptor!); - var response = await this.http.PostAsync("/clipboard/set", new StringContent(encryptedText.EncryptedData)); - if (!response.IsSuccessStatusCode) - { - this.logger!.LogError($"Failed to copy the text to the clipboard due to an network error: '{response.StatusCode}'"); - message = "Failed to copy the text to your clipboard."; - return; - } - - var state = await response.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions); - if (!state.Success) - { - this.logger!.LogError("Failed to copy the text to the clipboard."); - message = "Failed to copy the text to your clipboard."; - return; - } - - iconColor = Color.Success; - severity = Severity.Success; - this.logger!.LogDebug("Successfully copied the text to the clipboard."); - } - finally - { - snackbar.Add(message, severity, config => - { - config.Icon = Icons.Material.Filled.ContentCopy; - config.IconSize = Size.Large; - config.IconColor = iconColor; - }); - } - } - - public async Task CheckForUpdate() - { - try - { - var cts = new CancellationTokenSource(TimeSpan.FromSeconds(45)); - var response = await this.http.GetFromJsonAsync("/updates/check", this.jsonRustSerializerOptions, cts.Token); - this.logger!.LogInformation($"Checked for an update: update available='{response.UpdateIsAvailable}'; error='{response.Error}'; next version='{response.NewVersion}'; changelog len='{response.Changelog.Length}'"); - return response; - } - catch (Exception e) - { - this.logger!.LogError(e, "Failed to check for an update."); - return new UpdateResponse - { - Error = true, - UpdateIsAvailable = false, - }; - } - } - - public async Task InstallUpdate() - { - try - { - var cts = new CancellationTokenSource(); - await this.http.GetAsync("/updates/install", cts.Token); - } - catch (Exception e) - { - Console.WriteLine(e); - throw; - } - } - - /// - /// Try to get the API key for the given secret ID. - /// - /// The secret ID to get the API key for. - /// Indicates if we are trying to get the API key. In that case, we don't log errors. - /// The requested secret. - public async Task GetAPIKey(ISecretId secretId, bool isTrying = false) - { - var secretRequest = new SelectSecretRequest($"provider::{secretId.SecretId}::{secretId.SecretName}::api_key", Environment.UserName, isTrying); - var result = await this.http.PostAsJsonAsync("/secrets/get", secretRequest, this.jsonRustSerializerOptions); - if (!result.IsSuccessStatusCode) - { - if(!isTrying) - this.logger!.LogError($"Failed to get the API key for secret ID '{secretId.SecretId}' due to an API issue: '{result.StatusCode}'"); - return new RequestedSecret(false, new EncryptedText(string.Empty), "Failed to get the API key due to an API issue."); - } - - var secret = await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions); - if (!secret.Success && !isTrying) - this.logger!.LogError($"Failed to get the API key for secret ID '{secretId.SecretId}': '{secret.Issue}'"); - - return secret; - } - - /// - /// Try to store the API key for the given secret ID. - /// - /// The secret ID to store the API key for. - /// The API key to store. - /// The store secret response. - public async Task SetAPIKey(ISecretId secretId, string key) - { - var encryptedKey = await this.encryptor!.Encrypt(key); - var request = new StoreSecretRequest($"provider::{secretId.SecretId}::{secretId.SecretName}::api_key", Environment.UserName, encryptedKey); - var result = await this.http.PostAsJsonAsync("/secrets/store", request, this.jsonRustSerializerOptions); - if (!result.IsSuccessStatusCode) - { - this.logger!.LogError($"Failed to store the API key for secret ID '{secretId.SecretId}' due to an API issue: '{result.StatusCode}'"); - return new StoreSecretResponse(false, "Failed to get the API key due to an API issue."); - } - - var state = await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions); - if (!state.Success) - this.logger!.LogError($"Failed to store the API key for secret ID '{secretId.SecretId}': '{state.Issue}'"); - - return state; - } - - /// - /// Tries to delete the API key for the given secret ID. - /// - /// The secret ID to delete the API key for. - /// The delete secret response. - public async Task DeleteAPIKey(ISecretId secretId) - { - var request = new SelectSecretRequest($"provider::{secretId.SecretId}::{secretId.SecretName}::api_key", Environment.UserName, false); - var result = await this.http.PostAsJsonAsync("/secrets/delete", request, this.jsonRustSerializerOptions); - if (!result.IsSuccessStatusCode) - { - this.logger!.LogError($"Failed to delete the API key for secret ID '{secretId.SecretId}' due to an API issue: '{result.StatusCode}'"); - return new DeleteSecretResponse{Success = false, WasEntryFound = false, Issue = "Failed to delete the API key due to an API issue."}; - } - - var state = await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions); - if (!state.Success) - this.logger!.LogError($"Failed to delete the API key for secret ID '{secretId.SecretId}': '{state.Issue}'"); - - return state; - } - - public async Task SelectDirectory(string title, string? initialDirectory = null) - { - PreviousDirectory? previousDirectory = initialDirectory is null ? null : new (initialDirectory); - var result = await this.http.PostAsJsonAsync($"/select/directory?title={title}", previousDirectory, this.jsonRustSerializerOptions); - if (!result.IsSuccessStatusCode) - { - this.logger!.LogError($"Failed to select a directory: '{result.StatusCode}'"); - return new DirectorySelectionResponse(true, string.Empty); - } - - return await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions); - } - - #region IDisposable - - public void Dispose() - { - this.http.Dispose(); - } - - #endregion -} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Services/DataSourceService.cs b/app/MindWork AI Studio/Tools/Services/DataSourceService.cs new file mode 100644 index 00000000..f545aca5 --- /dev/null +++ b/app/MindWork AI Studio/Tools/Services/DataSourceService.cs @@ -0,0 +1,209 @@ +using AIStudio.Assistants.ERI; +using AIStudio.Provider; +using AIStudio.Provider.SelfHosted; +using AIStudio.Settings; +using AIStudio.Settings.DataModel; +using AIStudio.Tools.ERIClient; +using AIStudio.Tools.ERIClient.DataModel; + +namespace AIStudio.Tools.Services; + +public sealed class DataSourceService +{ + private readonly RustService rustService; + private readonly SettingsManager settingsManager; + private readonly ILogger logger; + + public DataSourceService(SettingsManager settingsManager, ILogger logger, RustService rustService) + { + this.logger = logger; + this.rustService = rustService; + this.settingsManager = settingsManager; + + this.logger.LogInformation("The data source service has been initialized."); + } + + /// + /// Returns a list of data sources that are allowed for the selected LLM provider. + /// It also returns the data sources selected before when they are still allowed. + /// + /// The selected LLM provider. + /// The data sources selected before. + /// The allowed data sources and the data sources selected before -- when they are still allowed. + public async Task GetDataSources(AIStudio.Settings.Provider selectedLLMProvider, IReadOnlyCollection? previousSelectedDataSources = null) + { + // + // Case: Somehow the selected LLM provider was not set. The default provider + // does not mean anything. We cannot filter the data sources by any means. + // We return an empty list. Better safe than sorry. + // + if (selectedLLMProvider == default) + { + this.logger.LogWarning("The selected LLM provider is not set. We cannot filter the data sources by any means."); + return new([], []); + } + + return await this.GetDataSources(selectedLLMProvider.IsSelfHosted, previousSelectedDataSources); + } + + /// + /// Returns a list of data sources that are allowed for the selected LLM provider. + /// It also returns the data sources selected before when they are still allowed. + /// + /// The selected LLM provider. + /// The data sources selected before. + /// The allowed data sources and the data sources selected before -- when they are still allowed. + public async Task GetDataSources(IProvider selectedLLMProvider, IReadOnlyCollection? previousSelectedDataSources = null) + { + // + // Case: Somehow the selected LLM provider was not set. The default provider + // does not mean anything. We cannot filter the data sources by any means. + // We return an empty list. Better safe than sorry. + // + if (selectedLLMProvider is NoProvider) + { + this.logger.LogWarning("The selected LLM provider is the default provider. We cannot filter the data sources by any means."); + return new([], []); + } + + return await this.GetDataSources(selectedLLMProvider is ProviderSelfHosted, previousSelectedDataSources); + } + + private async Task GetDataSources(bool usingSelfHostedProvider, IReadOnlyCollection? previousSelectedDataSources = null) + { + var allDataSources = this.settingsManager.ConfigurationData.DataSources; + var filteredDataSources = new List(allDataSources.Count); + var filteredSelectedDataSources = new List(previousSelectedDataSources?.Count ?? 0); + var tasks = new List>(allDataSources.Count); + + // Start all checks in parallel: + foreach (var source in allDataSources) + tasks.Add(this.CheckOneDataSource(source, usingSelfHostedProvider)); + + // Wait for all checks and collect the results: + foreach (var task in tasks) + { + var source = await task; + if (source is not null) + { + filteredDataSources.Add(source); + if (previousSelectedDataSources is not null && previousSelectedDataSources.Contains(source)) + filteredSelectedDataSources.Add(source); + } + } + + return new(filteredDataSources, filteredSelectedDataSources); + } + + private async Task CheckOneDataSource(IDataSource source, bool usingSelfHostedProvider) + { + // + // Unfortunately, we have to live-check any ERI source for its security requirements. + // Because the ERI server operator might change the security requirements at any time. + // + SecurityRequirements? eriSourceRequirements = null; + if (source is DataSourceERI_V1 eriSource) + { + using var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(6)); + using var client = ERIClientFactory.Get(ERIVersion.V1, eriSource); + if(client is null) + { + this.logger.LogError($"Could not create ERI client for source '{source.Name}' (id={source.Id}). We skip this source."); + return null; + } + + this.logger.LogInformation($"Authenticating with ERI source '{source.Name}' (id={source.Id})..."); + var loginResult = await client.AuthenticateAsync(this.rustService, cancellationToken: cancellationTokenSource.Token); + if (!loginResult.Successful) + { + this.logger.LogWarning($"Authentication with ERI source '{source.Name}' (id={source.Id}) failed. We skip this source. Reason: {loginResult.Message}"); + return null; + } + + this.logger.LogInformation($"Checking security requirements for ERI source '{source.Name}' (id={source.Id})..."); + var securityRequest = await client.GetSecurityRequirementsAsync(cancellationTokenSource.Token); + if (!securityRequest.Successful) + { + this.logger.LogWarning($"Could not retrieve security requirements for ERI source '{source.Name}' (id={source.Id}). We skip this source. Reason: {loginResult.Message}"); + return null; + } + + eriSourceRequirements = securityRequest.Data; + this.logger.LogInformation($"Security requirements for ERI source '{source.Name}' (id={source.Id}) retrieved successfully."); + } + + switch (source.SecurityPolicy) + { + case DataSourceSecurity.ALLOW_ANY: + + // + // Case: The data source allows any provider type. We want to use a self-hosted provider. + // There is no issue with this source. Accept it. + // + if(usingSelfHostedProvider) + return source; + + // + // Case: This is a local data source. When the source allows any provider type, we can use it. + // Accept it. + // + if(eriSourceRequirements is null) + return source; + + // + // Case: The ERI source requires a self-hosted provider. This misconfiguration happens + // when the ERI server operator changes the security requirements. The ERI server + // operator owns the data -- we have to respect their rules. We skip this source. + // + if (eriSourceRequirements is { AllowedProviderType: ProviderType.SELF_HOSTED }) + { + this.logger.LogWarning($"The ERI source '{source.Name}' (id={source.Id}) requires a self-hosted provider. We skip this source."); + return null; + } + + // + // Case: The ERI source allows any provider type. The data source configuration is correct. + // Accept it. + // + if(eriSourceRequirements is { AllowedProviderType: ProviderType.ANY }) + return source; + + // + // Case: Missing rules. We skip this source. Better safe than sorry. + // + this.logger.LogDebug($"The ERI source '{source.Name}' (id={source.Id}) was filtered out due to missing rules."); + return null; + + // + // Case: The data source requires a self-hosted provider. We want to use a self-hosted provider. + // There is no issue with this source. Accept it. + // + case DataSourceSecurity.SELF_HOSTED when usingSelfHostedProvider: + return source; + + // + // Case: The data source requires a self-hosted provider. We want to use a cloud provider. + // We skip this source. + // + case DataSourceSecurity.SELF_HOSTED when !usingSelfHostedProvider: + this.logger.LogWarning($"The data source '{source.Name}' (id={source.Id}) requires a self-hosted provider. We skip this source."); + return null; + + // + // Case: The data source did not specify a security policy. We skip this source. + // Better safe than sorry. + // + case DataSourceSecurity.NOT_SPECIFIED: + this.logger.LogWarning($"The data source '{source.Name}' (id={source.Id}) has no security policy. We skip this source."); + return null; + + // + // Case: Some developer forgot to implement a security policy. We skip this source. + // Better safe than sorry. + // + default: + this.logger.LogWarning($"The data source '{source.Name}' (id={source.Id}) was filtered out due unknown security policy."); + return null; + } + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Services/RustService.APIKeys.cs b/app/MindWork AI Studio/Tools/Services/RustService.APIKeys.cs new file mode 100644 index 00000000..7b89fe9a --- /dev/null +++ b/app/MindWork AI Studio/Tools/Services/RustService.APIKeys.cs @@ -0,0 +1,76 @@ +using AIStudio.Tools.Rust; + +namespace AIStudio.Tools.Services; + +public sealed partial class RustService +{ + /// + /// Try to get the API key for the given secret ID. + /// + /// The secret ID to get the API key for. + /// Indicates if we are trying to get the API key. In that case, we don't log errors. + /// The requested secret. + public async Task GetAPIKey(ISecretId secretId, bool isTrying = false) + { + var secretRequest = new SelectSecretRequest($"provider::{secretId.SecretId}::{secretId.SecretName}::api_key", Environment.UserName, isTrying); + var result = await this.http.PostAsJsonAsync("/secrets/get", secretRequest, this.jsonRustSerializerOptions); + if (!result.IsSuccessStatusCode) + { + if(!isTrying) + this.logger!.LogError($"Failed to get the API key for secret ID '{secretId.SecretId}' due to an API issue: '{result.StatusCode}'"); + return new RequestedSecret(false, new EncryptedText(string.Empty), "Failed to get the API key due to an API issue."); + } + + var secret = await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions); + if (!secret.Success && !isTrying) + this.logger!.LogError($"Failed to get the API key for secret ID '{secretId.SecretId}': '{secret.Issue}'"); + + return secret; + } + + /// + /// Try to store the API key for the given secret ID. + /// + /// The secret ID to store the API key for. + /// The API key to store. + /// The store secret response. + public async Task SetAPIKey(ISecretId secretId, string key) + { + var encryptedKey = await this.encryptor!.Encrypt(key); + var request = new StoreSecretRequest($"provider::{secretId.SecretId}::{secretId.SecretName}::api_key", Environment.UserName, encryptedKey); + var result = await this.http.PostAsJsonAsync("/secrets/store", request, this.jsonRustSerializerOptions); + if (!result.IsSuccessStatusCode) + { + this.logger!.LogError($"Failed to store the API key for secret ID '{secretId.SecretId}' due to an API issue: '{result.StatusCode}'"); + return new StoreSecretResponse(false, "Failed to get the API key due to an API issue."); + } + + var state = await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions); + if (!state.Success) + this.logger!.LogError($"Failed to store the API key for secret ID '{secretId.SecretId}': '{state.Issue}'"); + + return state; + } + + /// + /// Tries to delete the API key for the given secret ID. + /// + /// The secret ID to delete the API key for. + /// The delete secret response. + public async Task DeleteAPIKey(ISecretId secretId) + { + var request = new SelectSecretRequest($"provider::{secretId.SecretId}::{secretId.SecretName}::api_key", Environment.UserName, false); + var result = await this.http.PostAsJsonAsync("/secrets/delete", request, this.jsonRustSerializerOptions); + if (!result.IsSuccessStatusCode) + { + this.logger!.LogError($"Failed to delete the API key for secret ID '{secretId.SecretId}' due to an API issue: '{result.StatusCode}'"); + return new DeleteSecretResponse{Success = false, WasEntryFound = false, Issue = "Failed to delete the API key due to an API issue."}; + } + + var state = await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions); + if (!state.Success) + this.logger!.LogError($"Failed to delete the API key for secret ID '{secretId.SecretId}': '{state.Issue}'"); + + return state; + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Services/RustService.App.cs b/app/MindWork AI Studio/Tools/Services/RustService.App.cs new file mode 100644 index 00000000..8671e897 --- /dev/null +++ b/app/MindWork AI Studio/Tools/Services/RustService.App.cs @@ -0,0 +1,120 @@ +using System.Security.Cryptography; + +namespace AIStudio.Tools.Services; + +public sealed partial class RustService +{ + public async Task GetAppPort() + { + Console.WriteLine("Trying to get app port from Rust runtime..."); + + // + // Note I: In the production environment, the Rust runtime is already running + // and listening on the given port. In the development environment, the IDE + // starts the Rust runtime in parallel with the .NET runtime. Since the + // Rust runtime needs some time to start, we have to wait for it to be ready. + // + const int MAX_TRIES = 160; + var tris = 0; + var wait4Try = TimeSpan.FromMilliseconds(250); + var url = new Uri($"https://127.0.0.1:{this.apiPort}/system/dotnet/port"); + while (tris++ < MAX_TRIES) + { + // + // Note II: We use a new HttpClient instance for each try to avoid + // .NET is caching the result. When we use the same HttpClient + // instance, we would always get the same result (403 forbidden), + // without even trying to connect to the Rust server. + // + + using var initialHttp = new HttpClient(new HttpClientHandler + { + // + // Note III: We have to create also a new HttpClientHandler instance + // for each try to avoid .NET is caching the result. This is necessary + // because it gets disposed when the HttpClient instance gets disposed. + // + ServerCertificateCustomValidationCallback = (_, certificate, _, _) => + { + if(certificate is null) + return false; + + var currentCertificateFingerprint = certificate.GetCertHashString(HashAlgorithmName.SHA256); + return currentCertificateFingerprint == this.certificateFingerprint; + } + }); + + initialHttp.DefaultRequestVersion = Version.Parse("2.0"); + initialHttp.DefaultVersionPolicy = HttpVersionPolicy.RequestVersionOrHigher; + initialHttp.DefaultRequestHeaders.AddApiToken(); + + try + { + var response = await initialHttp.GetAsync(url); + if (!response.IsSuccessStatusCode) + { + Console.WriteLine($"Try {tris}/{MAX_TRIES} to get the app port from Rust runtime"); + await Task.Delay(wait4Try); + continue; + } + + var appPortContent = await response.Content.ReadAsStringAsync(); + var appPort = int.Parse(appPortContent); + Console.WriteLine($"Received app port from Rust runtime: '{appPort}'"); + return appPort; + } + catch (Exception e) + { + Console.WriteLine($"Error: Was not able to get the app port from Rust runtime: '{e.Message}'"); + Console.WriteLine(e.InnerException); + throw; + } + } + + Console.WriteLine("Failed to receive the app port from Rust runtime."); + return 0; + } + + public async Task AppIsReady() + { + const string URL = "/system/dotnet/ready"; + this.logger!.LogInformation("Notifying Rust runtime that the app is ready."); + try + { + var response = await this.http.GetAsync(URL); + if (!response.IsSuccessStatusCode) + { + this.logger!.LogError($"Failed to notify Rust runtime that the app is ready: '{response.StatusCode}'"); + } + } + catch (Exception e) + { + this.logger!.LogError(e, "Failed to notify the Rust runtime that the app is ready."); + throw; + } + } + + public async Task GetConfigDirectory() + { + var response = await this.http.GetAsync("/system/directories/config"); + if (!response.IsSuccessStatusCode) + { + this.logger!.LogError($"Failed to get the config directory from Rust: '{response.StatusCode}'"); + return string.Empty; + } + + return await response.Content.ReadAsStringAsync(); + } + + public async Task GetDataDirectory() + { + var response = await this.http.GetAsync("/system/directories/data"); + if (!response.IsSuccessStatusCode) + { + this.logger!.LogError($"Failed to get the data directory from Rust: '{response.StatusCode}'"); + return string.Empty; + } + + return await response.Content.ReadAsStringAsync(); + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Services/RustService.Clipboard.cs b/app/MindWork AI Studio/Tools/Services/RustService.Clipboard.cs new file mode 100644 index 00000000..9a1b6017 --- /dev/null +++ b/app/MindWork AI Studio/Tools/Services/RustService.Clipboard.cs @@ -0,0 +1,50 @@ +using AIStudio.Tools.Rust; + +namespace AIStudio.Tools.Services; + +public sealed partial class RustService +{ + /// + /// Tries to copy the given text to the clipboard. + /// + /// The snackbar to show the result. + /// The text to copy to the clipboard. + public async Task CopyText2Clipboard(ISnackbar snackbar, string text) + { + var message = "Successfully copied the text to your clipboard"; + var iconColor = Color.Error; + var severity = Severity.Error; + try + { + var encryptedText = await text.Encrypt(this.encryptor!); + var response = await this.http.PostAsync("/clipboard/set", new StringContent(encryptedText.EncryptedData)); + if (!response.IsSuccessStatusCode) + { + this.logger!.LogError($"Failed to copy the text to the clipboard due to an network error: '{response.StatusCode}'"); + message = "Failed to copy the text to your clipboard."; + return; + } + + var state = await response.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions); + if (!state.Success) + { + this.logger!.LogError("Failed to copy the text to the clipboard."); + message = "Failed to copy the text to your clipboard."; + return; + } + + iconColor = Color.Success; + severity = Severity.Success; + this.logger!.LogDebug("Successfully copied the text to the clipboard."); + } + finally + { + snackbar.Add(message, severity, config => + { + config.Icon = Icons.Material.Filled.ContentCopy; + config.IconSize = Size.Large; + config.IconColor = iconColor; + }); + } + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Services/RustService.FileSystem.cs b/app/MindWork AI Studio/Tools/Services/RustService.FileSystem.cs new file mode 100644 index 00000000..411400f1 --- /dev/null +++ b/app/MindWork AI Studio/Tools/Services/RustService.FileSystem.cs @@ -0,0 +1,32 @@ +using AIStudio.Tools.Rust; + +namespace AIStudio.Tools.Services; + +public sealed partial class RustService +{ + public async Task SelectDirectory(string title, string? initialDirectory = null) + { + PreviousDirectory? previousDirectory = initialDirectory is null ? null : new (initialDirectory); + var result = await this.http.PostAsJsonAsync($"/select/directory?title={title}", previousDirectory, this.jsonRustSerializerOptions); + if (!result.IsSuccessStatusCode) + { + this.logger!.LogError($"Failed to select a directory: '{result.StatusCode}'"); + return new DirectorySelectionResponse(true, string.Empty); + } + + return await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions); + } + + public async Task SelectFile(string title, string? initialFile = null) + { + PreviousFile? previousFile = initialFile is null ? null : new (initialFile); + var result = await this.http.PostAsJsonAsync($"/select/file?title={title}", previousFile, this.jsonRustSerializerOptions); + if (!result.IsSuccessStatusCode) + { + this.logger!.LogError($"Failed to select a file: '{result.StatusCode}'"); + return new FileSelectionResponse(true, string.Empty); + } + + return await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions); + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Services/RustService.Log.cs b/app/MindWork AI Studio/Tools/Services/RustService.Log.cs new file mode 100644 index 00000000..e7b52438 --- /dev/null +++ b/app/MindWork AI Studio/Tools/Services/RustService.Log.cs @@ -0,0 +1,15 @@ +using AIStudio.Tools.Rust; + +namespace AIStudio.Tools.Services; + +public sealed partial class RustService +{ + /// + /// Get the paths of the log files. + /// + /// The paths of the log files. + public async Task GetLogPaths() + { + return await this.http.GetFromJsonAsync("/log/paths", this.jsonRustSerializerOptions); + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Services/RustService.Secrets.cs b/app/MindWork AI Studio/Tools/Services/RustService.Secrets.cs new file mode 100644 index 00000000..b41806e1 --- /dev/null +++ b/app/MindWork AI Studio/Tools/Services/RustService.Secrets.cs @@ -0,0 +1,76 @@ +using AIStudio.Tools.Rust; + +namespace AIStudio.Tools.Services; + +public sealed partial class RustService +{ + /// + /// Try to get the secret data for the given secret ID. + /// + /// The secret ID to get the data for. + /// Indicates if we are trying to get the data. In that case, we don't log errors. + /// The requested secret. + public async Task GetSecret(ISecretId secretId, bool isTrying = false) + { + var secretRequest = new SelectSecretRequest($"secret::{secretId.SecretId}::{secretId.SecretName}", Environment.UserName, isTrying); + var result = await this.http.PostAsJsonAsync("/secrets/get", secretRequest, this.jsonRustSerializerOptions); + if (!result.IsSuccessStatusCode) + { + if(!isTrying) + this.logger!.LogError($"Failed to get the secret data for secret ID '{secretId.SecretId}' due to an API issue: '{result.StatusCode}'"); + return new RequestedSecret(false, new EncryptedText(string.Empty), "Failed to get the secret data due to an API issue."); + } + + var secret = await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions); + if (!secret.Success && !isTrying) + this.logger!.LogError($"Failed to get the secret data for secret ID '{secretId.SecretId}': '{secret.Issue}'"); + + return secret; + } + + /// + /// Try to store the secret data for the given secret ID. + /// + /// The secret ID to store the data for. + /// The data to store. + /// The store secret response. + public async Task SetSecret(ISecretId secretId, string secretData) + { + var encryptedSecret = await this.encryptor!.Encrypt(secretData); + var request = new StoreSecretRequest($"secret::{secretId.SecretId}::{secretId.SecretName}", Environment.UserName, encryptedSecret); + var result = await this.http.PostAsJsonAsync("/secrets/store", request, this.jsonRustSerializerOptions); + if (!result.IsSuccessStatusCode) + { + this.logger!.LogError($"Failed to store the secret data for secret ID '{secretId.SecretId}' due to an API issue: '{result.StatusCode}'"); + return new StoreSecretResponse(false, "Failed to get the secret data due to an API issue."); + } + + var state = await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions); + if (!state.Success) + this.logger!.LogError($"Failed to store the secret data for secret ID '{secretId.SecretId}': '{state.Issue}'"); + + return state; + } + + /// + /// Tries to delete the secret data for the given secret ID. + /// + /// The secret ID to delete the data for. + /// The delete secret response. + public async Task DeleteSecret(ISecretId secretId) + { + var request = new SelectSecretRequest($"secret::{secretId.SecretId}::{secretId.SecretName}", Environment.UserName, false); + var result = await this.http.PostAsJsonAsync("/secrets/delete", request, this.jsonRustSerializerOptions); + if (!result.IsSuccessStatusCode) + { + this.logger!.LogError($"Failed to delete the secret data for secret ID '{secretId.SecretId}' due to an API issue: '{result.StatusCode}'"); + return new DeleteSecretResponse{Success = false, WasEntryFound = false, Issue = "Failed to delete the secret data due to an API issue."}; + } + + var state = await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions); + if (!state.Success) + this.logger!.LogError($"Failed to delete the secret data for secret ID '{secretId.SecretId}': '{state.Issue}'"); + + return state; + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Services/RustService.Updates.cs b/app/MindWork AI Studio/Tools/Services/RustService.Updates.cs new file mode 100644 index 00000000..1686b777 --- /dev/null +++ b/app/MindWork AI Studio/Tools/Services/RustService.Updates.cs @@ -0,0 +1,40 @@ +using AIStudio.Tools.Rust; + +namespace AIStudio.Tools.Services; + +public sealed partial class RustService +{ + public async Task CheckForUpdate() + { + try + { + var cts = new CancellationTokenSource(TimeSpan.FromSeconds(45)); + var response = await this.http.GetFromJsonAsync("/updates/check", this.jsonRustSerializerOptions, cts.Token); + this.logger!.LogInformation($"Checked for an update: update available='{response.UpdateIsAvailable}'; error='{response.Error}'; next version='{response.NewVersion}'; changelog len='{response.Changelog.Length}'"); + return response; + } + catch (Exception e) + { + this.logger!.LogError(e, "Failed to check for an update."); + return new UpdateResponse + { + Error = true, + UpdateIsAvailable = false, + }; + } + } + + public async Task InstallUpdate() + { + try + { + var cts = new CancellationTokenSource(); + await this.http.GetAsync("/updates/install", cts.Token); + } + catch (Exception e) + { + Console.WriteLine(e); + throw; + } + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Services/RustService.cs b/app/MindWork AI Studio/Tools/Services/RustService.cs new file mode 100644 index 00000000..38fab8cc --- /dev/null +++ b/app/MindWork AI Studio/Tools/Services/RustService.cs @@ -0,0 +1,70 @@ +using System.Security.Cryptography; +using System.Text.Json; + +// ReSharper disable NotAccessedPositionalProperty.Local + +namespace AIStudio.Tools.Services; + +/// +/// Calling Rust functions. +/// +public sealed partial class RustService : IDisposable +{ + private readonly HttpClient http; + + private readonly JsonSerializerOptions jsonRustSerializerOptions = new() + { + PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower, + }; + + private ILogger? logger; + private Encryption? encryptor; + + private readonly string apiPort; + private readonly string certificateFingerprint; + + public RustService(string apiPort, string certificateFingerprint) + { + this.apiPort = apiPort; + this.certificateFingerprint = certificateFingerprint; + var certificateValidationHandler = new HttpClientHandler + { + ServerCertificateCustomValidationCallback = (_, certificate, _, _) => + { + if(certificate is null) + return false; + + var currentCertificateFingerprint = certificate.GetCertHashString(HashAlgorithmName.SHA256); + return currentCertificateFingerprint == certificateFingerprint; + }, + }; + + this.http = new HttpClient(certificateValidationHandler) + { + BaseAddress = new Uri($"https://127.0.0.1:{apiPort}"), + DefaultRequestVersion = Version.Parse("2.0"), + DefaultVersionPolicy = HttpVersionPolicy.RequestVersionOrHigher, + }; + + this.http.DefaultRequestHeaders.AddApiToken(); + } + + public void SetLogger(ILogger logService) + { + this.logger = logService; + } + + public void SetEncryptor(Encryption encryptionService) + { + this.encryptor = encryptionService; + } + + #region IDisposable + + public void Dispose() + { + this.http.Dispose(); + } + + #endregion +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Services/TemporaryChatService.cs b/app/MindWork AI Studio/Tools/Services/TemporaryChatService.cs index f1e49d7f..ea7a26ee 100644 --- a/app/MindWork AI Studio/Tools/Services/TemporaryChatService.cs +++ b/app/MindWork AI Studio/Tools/Services/TemporaryChatService.cs @@ -62,7 +62,6 @@ public class TemporaryChatService(ILogger logger, Settings WorkspaceStorageTemporaryMaintenancePolicy.DELETE_OLDER_THAN_180_DAYS => DateTime.UtcNow - lastWriteTime > TimeSpan.FromDays(180), WorkspaceStorageTemporaryMaintenancePolicy.DELETE_OLDER_THAN_365_DAYS => DateTime.UtcNow - lastWriteTime > TimeSpan.FromDays(365), - WorkspaceStorageTemporaryMaintenancePolicy.NO_AUTOMATIC_MAINTENANCE => false, _ => false, }; diff --git a/app/MindWork AI Studio/Tools/Services/UpdateService.cs b/app/MindWork AI Studio/Tools/Services/UpdateService.cs index 8de0690d..ecabbd7e 100644 --- a/app/MindWork AI Studio/Tools/Services/UpdateService.cs +++ b/app/MindWork AI Studio/Tools/Services/UpdateService.cs @@ -30,9 +30,15 @@ public sealed class UpdateService : BackgroundService, IMessageBusReceiver protected override async Task ExecuteAsync(CancellationToken stoppingToken) { + // + // Wait until the app is fully initialized. + // while (!stoppingToken.IsCancellationRequested && !IS_INITIALIZED) await Task.Delay(TimeSpan.FromSeconds(3), stoppingToken); + // + // Set the update interval based on the user's settings. + // this.updateInterval = this.settingsManager.ConfigurationData.App.UpdateBehavior switch { UpdateBehavior.NO_CHECK => Timeout.InfiniteTimeSpan, @@ -45,21 +51,42 @@ public sealed class UpdateService : BackgroundService, IMessageBusReceiver _ => TimeSpan.FromHours(1) }; + // + // When the user doesn't want to check for updates, we can + // return early. + // if(this.settingsManager.ConfigurationData.App.UpdateBehavior is UpdateBehavior.NO_CHECK) return; + // + // Check for updates at the beginning. The user aspects this when the app + // is started. + // await this.CheckForUpdate(); + + // + // Start the update loop. This will check for updates based on the + // user's settings. + // while (!stoppingToken.IsCancellationRequested) { await Task.Delay(this.updateInterval, stoppingToken); await this.CheckForUpdate(); } } + + public override async Task StopAsync(CancellationToken cancellationToken) + { + this.messageBus.Unregister(this); + await base.StopAsync(cancellationToken); + } #endregion #region Implementation of IMessageBusReceiver + public string ComponentName => nameof(UpdateService); + public async Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) { switch (triggeredEvent) @@ -77,16 +104,6 @@ public sealed class UpdateService : BackgroundService, IMessageBusReceiver #endregion - #region Overrides of BackgroundService - - public override async Task StopAsync(CancellationToken cancellationToken) - { - this.messageBus.Unregister(this); - await base.StopAsync(cancellationToken); - } - - #endregion - private async Task CheckForUpdate(bool notifyUserWhenNoUpdate = false) { if(!IS_INITIALIZED) diff --git a/app/MindWork AI Studio/Tools/TargetWindow.cs b/app/MindWork AI Studio/Tools/TargetWindow.cs new file mode 100644 index 00000000..8530bacb --- /dev/null +++ b/app/MindWork AI Studio/Tools/TargetWindow.cs @@ -0,0 +1,38 @@ +namespace AIStudio.Tools; + +/// +/// Represents a target window for the number of items to match a threshold. +/// +/// The minimum number of items to match the threshold. Should be at least one and less than targetWindowMin. +/// The minimum number of items in the target window. Should be at least 2 and more than numMinItems. +/// The maximum number of items in the target window. +public readonly record struct TargetWindow(int NumMinItems, int TargetWindowMin, int TargetWindowMax, float MinThreshold) +{ + /// + /// Determines if the target window is valid. + /// + /// True when the target window is valid; otherwise, false. + public bool IsValid() + { + if(this.NumMinItems < 1) + return false; + + if(this.TargetWindowMin < this.NumMinItems) + return false; + + if(this.TargetWindowMax < this.TargetWindowMin) + return false; + + if(this.MinThreshold is < 0f or > 1f) + return false; + + return true; + } + + /// + /// Determines if the number of items is inside the target window. + /// + /// The number of items to check. + /// True when the number of items is inside the target window; otherwise, false. + public bool InsideWindow(int numItems) => numItems >= this.TargetWindowMin && numItems <= this.TargetWindowMax; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/TargetWindowStrategy.cs b/app/MindWork AI Studio/Tools/TargetWindowStrategy.cs new file mode 100644 index 00000000..90549842 --- /dev/null +++ b/app/MindWork AI Studio/Tools/TargetWindowStrategy.cs @@ -0,0 +1,19 @@ +namespace AIStudio.Tools; + +public enum TargetWindowStrategy +{ + /// + /// Means no target window strategy, which will effectively return all items. + /// + NONE, + + /// + /// Searches for two up-to-three items but at least one. + /// + A_FEW_GOOD_ONES, + + /// + /// Searches for the top 10% items that are better than guessing, i.e., with confidence greater than 0.5f. + /// + TOP10_BETTER_THAN_GUESSING, +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/TextColor.cs b/app/MindWork AI Studio/Tools/TextColor.cs new file mode 100644 index 00000000..d7531b56 --- /dev/null +++ b/app/MindWork AI Studio/Tools/TextColor.cs @@ -0,0 +1,11 @@ +namespace AIStudio.Tools; + +public enum TextColor +{ + DEFAULT, + + WARN, + ERROR, + SUCCESS, + INFO, +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/TextColorExtensions.cs b/app/MindWork AI Studio/Tools/TextColorExtensions.cs new file mode 100644 index 00000000..eb70213b --- /dev/null +++ b/app/MindWork AI Studio/Tools/TextColorExtensions.cs @@ -0,0 +1,18 @@ +using AIStudio.Settings; + +namespace AIStudio.Tools; + +public static class TextColorExtensions +{ + public static string GetHTMLColor(this TextColor color, SettingsManager settingsManager) => color switch + { + TextColor.DEFAULT => string.Empty, + + TextColor.ERROR => settingsManager.IsDarkMode ? "#ff6c6c" : "#ff0000", + TextColor.WARN => settingsManager.IsDarkMode ? "#c7a009" : "#c7c000", + TextColor.SUCCESS => settingsManager.IsDarkMode ? "#08b342" : "#009933", + TextColor.INFO => settingsManager.IsDarkMode ? "#5279b8" : "#2d67c4", + + _ => string.Empty, + }; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/ThreadSafeRandom.cs b/app/MindWork AI Studio/Tools/ThreadSafeRandom.cs index 27bb61ad..61aeca15 100644 --- a/app/MindWork AI Studio/Tools/ThreadSafeRandom.cs +++ b/app/MindWork AI Studio/Tools/ThreadSafeRandom.cs @@ -3,7 +3,7 @@ namespace AIStudio.Tools; /// public sealed class ThreadSafeRandom : Random { - private static readonly object LOCK = new(); + private static readonly Lock LOCK = new(); #region Overrides of Random diff --git a/app/MindWork AI Studio/Tools/Validation/DataSourceValidation.cs b/app/MindWork AI Studio/Tools/Validation/DataSourceValidation.cs new file mode 100644 index 00000000..d97edb31 --- /dev/null +++ b/app/MindWork AI Studio/Tools/Validation/DataSourceValidation.cs @@ -0,0 +1,175 @@ +using AIStudio.Settings.DataModel; +using AIStudio.Tools.ERIClient.DataModel; + +namespace AIStudio.Tools.Validation; + +public sealed class DataSourceValidation +{ + public Func GetSecretStorageIssue { get; init; } = () => string.Empty; + + public Func GetPreviousDataSourceName { get; init; } = () => string.Empty; + + public Func> GetUsedDataSourceNames { get; init; } = () => []; + + public Func GetAuthMethod { get; init; } = () => AuthMethod.NONE; + + public Func GetSecurityRequirements { get; init; } = () => null; + + public Func GetSelectedCloudEmbedding { get; init; } = () => false; + + public Func GetTestedConnection { get; init; } = () => false; + + public Func GetTestedConnectionResult { get; init; } = () => false; + + public Func> GetAvailableAuthMethods { get; init; } = () => []; + + public string? ValidatingHostname(string hostname) + { + if(string.IsNullOrWhiteSpace(hostname)) + return "Please enter a hostname, e.g., http://localhost"; + + if(!hostname.StartsWith("http://", StringComparison.InvariantCultureIgnoreCase) && !hostname.StartsWith("https://", StringComparison.InvariantCultureIgnoreCase)) + return "The hostname must start with either http:// or https://"; + + if(!Uri.TryCreate(hostname, UriKind.Absolute, out _)) + return "The hostname is not a valid HTTP(S) URL."; + + return null; + } + + public string? ValidatePort(int port) + { + if(port is < 1 or > 65535) + return "The port must be between 1 and 65535."; + + return null; + } + + public string? ValidateSecurityPolicy(DataSourceSecurity securityPolicy) + { + if(securityPolicy is DataSourceSecurity.NOT_SPECIFIED) + return "Please select your security policy."; + + var dataSourceSecurity = this.GetSecurityRequirements(); + if (dataSourceSecurity is null) + return null; + + if(dataSourceSecurity.Value.AllowedProviderType is ProviderType.SELF_HOSTED && securityPolicy is not DataSourceSecurity.SELF_HOSTED) + return "This data source can only be used with a self-hosted LLM provider. Please change the security policy."; + + return null; + } + + public string? ValidateUsername(string username) + { + if(this.GetAuthMethod() is not AuthMethod.USERNAME_PASSWORD) + return null; + + if(string.IsNullOrWhiteSpace(username)) + return "The username must not be empty."; + + return null; + } + + public string? ValidatingSecret(string secret) + { + var authMethod = this.GetAuthMethod(); + if(authMethod is AuthMethod.NONE or AuthMethod.KERBEROS) + return null; + + var secretStorageIssue = this.GetSecretStorageIssue(); + if(!string.IsNullOrWhiteSpace(secretStorageIssue)) + return secretStorageIssue; + + if (string.IsNullOrWhiteSpace(secret)) + return authMethod switch + { + AuthMethod.TOKEN => "Please enter your secure access token.", + AuthMethod.USERNAME_PASSWORD => "Please enter your password.", + + _ => "Please enter the secret necessary for authentication." + }; + + return null; + } + + public string? ValidateRetrievalProcess(RetrievalInfo retrievalInfo) + { + if(retrievalInfo == default) + return "Please select one retrieval process."; + + return null; + } + + public string? ValidatingName(string dataSourceName) + { + if(string.IsNullOrWhiteSpace(dataSourceName)) + return "The name must not be empty."; + + if (dataSourceName.Length > 40) + return "The name must not exceed 40 characters."; + + var lowerName = dataSourceName.ToLowerInvariant(); + if(lowerName != this.GetPreviousDataSourceName() && this.GetUsedDataSourceNames().Contains(lowerName)) + return "The name is already used by another data source. Please choose a different name."; + + return null; + } + + public string? ValidatePath(string path) + { + if(string.IsNullOrWhiteSpace(path)) + return "The path must not be empty. Please select a directory."; + + if(!Directory.Exists(path)) + return "The path does not exist. Please select a valid directory."; + + return null; + } + + public string? ValidateFilePath(string filePath) + { + if(string.IsNullOrWhiteSpace(filePath)) + return "The file path must not be empty. Please select a file."; + + if(!File.Exists(filePath)) + return "The file does not exist. Please select a valid file."; + + return null; + } + + public string? ValidateEmbeddingId(string embeddingId) + { + if(string.IsNullOrWhiteSpace(embeddingId)) + return "Please select an embedding provider."; + + return null; + } + + public string? ValidateUserAcknowledgedCloudEmbedding(bool value) + { + if(this.GetSelectedCloudEmbedding() && !value) + return "Please acknowledge that you are aware of the cloud embedding implications."; + + return null; + } + + public string? ValidateTestedConnection() + { + if(!this.GetTestedConnection()) + return "Please test the connection before saving."; + + if(!this.GetTestedConnectionResult()) + return "The connection test failed. Please check the connection settings."; + + return null; + } + + public string? ValidateAuthMethod(AuthMethod authMethod) + { + if(!this.GetAvailableAuthMethods().Contains(authMethod)) + return "Please select one valid authentication method."; + + return null; + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/build.nu b/app/MindWork AI Studio/build.nu index c37da507..3c9c2e4e 100755 --- a/app/MindWork AI Studio/build.nu +++ b/app/MindWork AI Studio/build.nu @@ -2,11 +2,11 @@ def main [] {} -def are_assets_exist [rid: string]: string -> bool { - $"bin/release/net8.0/($rid)/publish/wwwroot/_content/MudBlazor/MudBlazor.min.css" | path exists +def are_assets_exist [rid: string] { + $"bin/release/net9.0/($rid)/publish/wwwroot/_content/MudBlazor/MudBlazor.min.css" | path exists } -def "main help" []: nothing -> nothing { +def "main help" [] { print "Usage: nu build.nu [action]" print "" print "Optional Actions:" @@ -26,7 +26,7 @@ def "main help" []: nothing -> nothing { print "" } -def "main prepare" [action: string]: string -> nothing { +def "main prepare" [action: string] { if (update_app_version $action) { main fix_web_assets inc_build_number @@ -36,7 +36,7 @@ def "main prepare" [action: string]: string -> nothing { } } -def "main metadata" []: nothing -> nothing { +def "main metadata" [] { update_dotnet_version update_rust_version update_mudblazor_version @@ -46,7 +46,7 @@ def "main metadata" []: nothing -> nothing { update_license_year "Pages/About.razor.cs" } -def "main fix_web_assets" []: nothing -> nothing { +def "main fix_web_assets" [] { # Get the matching RIDs for the current OS: let rids = get_rids @@ -63,14 +63,14 @@ def "main fix_web_assets" []: nothing -> nothing { mkdir wwwroot/system # Copy the web assets from the first RID to the source project: - let source_paths = glob --depth 99 bin/release/net8.0/($rid)/publish/wwwroot/_content/* + let source_paths = glob --depth 99 bin/release/net9.0/($rid)/publish/wwwroot/_content/* for source_path in $source_paths { cp --recursive --force --update $source_path wwwroot/system/ } } -def "main publish" []: nothing -> nothing { +def "main publish" [] { main metadata @@ -112,7 +112,7 @@ def "main publish" []: nothing -> nothing { } } - let published_path = $"bin/release/net8.0/($rid)/publish/($published_filename_dotnet)" + let published_path = $"bin/release/net9.0/($rid)/publish/($published_filename_dotnet)" let final_path = $"bin/dist/($final_filename)" if ($published_path | path exists) { @@ -139,7 +139,7 @@ def "main publish" []: nothing -> nothing { print "Building done." } -def get_rids []: nothing -> list { +def get_rids [] { # Define the list of RIDs to build for, cf. https://learn.microsoft.com/en-us/dotnet/core/rid-catalog: let rids = ["win-x64", "win-arm64", "linux-x64", "linux-arm64", "osx-arm64", "osx-x64"] @@ -163,11 +163,15 @@ def get_rids []: nothing -> list { $rids } -def get_os []: nothing -> string { - (sys host).name | str downcase +def get_os [] { + let os = (sys host).name | str downcase + if $os =~ "linux" { + return "linux" + } + $os } -def update_build_time []: nothing -> nothing { +def update_build_time [] { mut meta_lines = open --raw ../../metadata.txt | lines mut build_time = $meta_lines.1 @@ -179,7 +183,7 @@ def update_build_time []: nothing -> nothing { $meta_lines | save --raw --force ../../metadata.txt } -def inc_build_number []: nothing -> nothing { +def inc_build_number [] { mut meta_lines = open --raw ../../metadata.txt | lines mut build_number = $meta_lines.2 | into int @@ -191,7 +195,7 @@ def inc_build_number []: nothing -> nothing { $meta_lines | save --raw --force ../../metadata.txt } -def update_dotnet_version []: nothing -> nothing { +def update_dotnet_version [] { mut meta_lines = open --raw ../../metadata.txt | lines mut dotnet_sdk_version = $meta_lines.3 mut dotnet_version = $meta_lines.4 @@ -211,11 +215,11 @@ def update_dotnet_version []: nothing -> nothing { $meta_lines | save --raw --force ../../metadata.txt } -def update_rust_version []: nothing -> nothing { +def update_rust_version [] { mut meta_lines = open --raw ../../metadata.txt | lines mut rust_version = $meta_lines.5 - let rust_data = (^rustc -Vv) | parse --regex 'rustc (?[0-9.]+) \((?[a-zA-Z0-9]+)' + let rust_data = (^rustc -Vv) | parse --regex 'rustc (?[0-9.]+)(?:-nightly)? \((?[a-zA-Z0-9]+)' let version = $rust_data.version.0 let commit = $rust_data.commit.0 @@ -225,7 +229,7 @@ def update_rust_version []: nothing -> nothing { $meta_lines | save --raw --force ../../metadata.txt } -def update_mudblazor_version []: nothing -> nothing { +def update_mudblazor_version [] { mut meta_lines = open --raw ../../metadata.txt | lines mut mudblazor_version = $meta_lines.6 @@ -238,7 +242,7 @@ def update_mudblazor_version []: nothing -> nothing { $meta_lines | save --raw --force ../../metadata.txt } -def update_tauri_version []: nothing -> nothing { +def update_tauri_version [] { mut meta_lines = open --raw ../../metadata.txt | lines mut tauri_version = $meta_lines.7 @@ -272,7 +276,7 @@ def update_license_year [licence_file: string] { $updated_license_text | save --raw --force $licence_file } -def update_app_version [action: string]: string -> bool { +def update_app_version [action: string] { mut meta_lines = open --raw ../../metadata.txt | lines mut app_version = $meta_lines.0 @@ -317,7 +321,7 @@ def update_app_version [action: string]: string -> bool { return true } -def update_project_commit_hash []: nothing -> nothing { +def update_project_commit_hash [] { mut meta_lines = open --raw ../../metadata.txt | lines mut commit_hash = $meta_lines.8 @@ -352,7 +356,7 @@ def update_project_commit_hash []: nothing -> nothing { $meta_lines | save --raw --force ../../metadata.txt } -def update_changelog []: nothing -> nothing { +def update_changelog [] { # Get all changelog files: let all_changelog_files = glob wwwroot/changelog/*.md diff --git a/app/MindWork AI Studio/packages.lock.json b/app/MindWork AI Studio/packages.lock.json index 8ad3bbb5..8020366c 100644 --- a/app/MindWork AI Studio/packages.lock.json +++ b/app/MindWork AI Studio/packages.lock.json @@ -1,61 +1,67 @@ { "version": 1, "dependencies": { - "net8.0": { + "net9.0": { "CodeBeam.MudBlazor.Extensions": { "type": "Direct", - "requested": "[7.1.0, )", - "resolved": "7.1.0", - "contentHash": "qbyCT4XMc/lbi2XdkUh9aSPu97RUPDisU7fpTCU0Q4nGywqJsAxrwcpaxJqoycq+uj3smwX5zOn6yzfsHUObeQ==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "MNxReFDmME1OLhHsD7lrfQZ9cMu5X60PIvidyFueq0ddDKHlagHS6CuYBZRQ62rHqmocdHWOLyJ73t2Im0NnWw==", "dependencies": { "BuildBundlerMinifier": "3.2.449", - "CsvHelper": "31.0.3", - "Microsoft.AspNetCore.Components": "8.0.11", - "Microsoft.AspNetCore.Components.Web": "8.0.11", - "MudBlazor": "7.15.0", + "CsvHelper": "33.0.1", + "Microsoft.AspNetCore.Components": "9.0.1", + "Microsoft.AspNetCore.Components.Web": "9.0.1", + "MudBlazor": "8.0.0", "ZXing.Net": "0.16.9" } }, "HtmlAgilityPack": { "type": "Direct", - "requested": "[1.11.72, )", - "resolved": "1.11.72", - "contentHash": "RNLgXxTFdIGFI+o5l8c2aJ2L5StIRn9Uv8HKR76p7QP4ZUL26wzpWUCWh08xWUdkL2kocl+Xhv6VUu0rA1npVg==" + "requested": "[1.12.0, )", + "resolved": "1.12.0", + "contentHash": "VHtVZmfoYhQyA/POvZRLuTpCz1zhzIDrdYRJIRV73e9wKAzjW71biYNOHOWx8MxEX3TE4TWVfx1QDRoZcj2AWw==" + }, + "LuaCSharp": { + "type": "Direct", + "requested": "[0.4.2, )", + "resolved": "0.4.2", + "contentHash": "wS0hp7EFx+llJ/U/7Ykz4FSmQf8DH4mNejwo5/h1KuFyguzGZbKhTO22X54pXnuqa5cIKfEfQ29dluHHnCX05Q==" }, "Microsoft.Extensions.FileProviders.Embedded": { "type": "Direct", - "requested": "[9.0.0, )", - "resolved": "9.0.0", - "contentHash": "6Ev1goLIvggLF6uCs6oZvdr9JM+2b1Zj+4FLdBWNW5iw3tm2BymVIb0yMsjnQTBWL7YUmqVWH3u45hSqOfvuqg==", + "requested": "[9.0.3, )", + "resolved": "9.0.3", + "contentHash": "UKfKGlZ7jKfe6v4rLsjnH/mGbD3e4YD9EK+Uobu+KIxwfhZuLLCtXm4CWTOf2s1t+ItmMs0QqbSJAXaMXCxLOw==", "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "9.0.0" + "Microsoft.Extensions.FileProviders.Abstractions": "9.0.3" } }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.11, )", - "resolved": "8.0.11", - "contentHash": "zk5lnZrYJgtuJG8L4v17Ej8rZ3PUcR2iweNV08BaO5LbYHIi2wNaVNcJoLxvqgQdnjLlKnCCfVGLDr6QHeAarQ==" + "requested": "[9.0.3, )", + "resolved": "9.0.3", + "contentHash": "1rqGTfubVg0qj2PsK6esyq3PIxtYJYrN3LsYUV9RrvH3anmt3fT3ozYdAZZH4U8JU/pt5pPIUk8NBSu26wtekA==" }, "MudBlazor": { "type": "Direct", - "requested": "[7.15.0, )", - "resolved": "7.15.0", - "contentHash": "b2+hO7ZTGwsGhu9SoowuNe2ETeF1GzExpg/hIYR++rSh+vy4v/QD0iOsrATWv3LdFJXSgk3d1+XIr5srW3jBiA==", + "requested": "[8.4.0, )", + "resolved": "8.4.0", + "contentHash": "JdpJXe13fhPElc4ajoDEr7tbzib+N1SVUaov21lZAVd0DgRWuVTJsfVyrEFCD/oSopRcvub5cpHSJM7MYUVCfQ==", "dependencies": { - "Microsoft.AspNetCore.Components": "8.0.8", - "Microsoft.AspNetCore.Components.Web": "8.0.8", - "Microsoft.Extensions.Localization": "8.0.8" + "Microsoft.AspNetCore.Components": "9.0.1", + "Microsoft.AspNetCore.Components.Web": "9.0.1", + "Microsoft.Extensions.Localization": "9.0.1" } }, "MudBlazor.Markdown": { "type": "Direct", - "requested": "[7.14.0, )", - "resolved": "7.14.0", - "contentHash": "c6kFfMgUxKxYK1AkGHRNg5B9jw+iwxelBuDpaI5N+guOleT37BxYetYlD0iOew/n1plhobynUJn3Kk4MXhv6RA==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "0DcXQFEIgKJsaMCDva0Ck3gempoctyc7s8GLK5VagozlZdXql6W4SKX/imM/NfyfV7SxLrUTRJyLJX0Te+02sQ==", "dependencies": { - "Markdig": "0.37.0", - "MudBlazor": "7.14.0" + "Markdig": "0.40.0", + "MudBlazor": "8.0.0" } }, "ReverseMarkdown": { @@ -74,132 +80,126 @@ }, "CsvHelper": { "type": "Transitive", - "resolved": "31.0.3", - "contentHash": "ygck8DR4mG/VDA/LgIVVGpEtXXPDVaaNZNJGrOAJ4pckVw4MbAQ3n/u6YFDv3bwlQhlxTmPhCyk5E4hxe96Crg==" + "resolved": "33.0.1", + "contentHash": "fev4lynklAU2A9GVMLtwarkwaanjSYB4wUqO2nOJX5hnzObORzUqVLe+bDYCUyIIRQM4o5Bsq3CcyJR89iMmEQ==" }, "Markdig": { "type": "Transitive", - "resolved": "0.37.0", - "contentHash": "biiu4MTPFjW55qw6v5Aphtj0MjDLJ14x8ndZwkJUHIeqvaSGKeqhLY7S7Vu/S3k7/c9KwhhnaCDP9hdFNUhcNA==" + "resolved": "0.40.0", + "contentHash": "4ve14zs+gt1irldTQE3y5FLAHuzmhW7T99lAAvVipe/q2LWT/nUCO0iICb9TXGvMX6n7Z1OZroFXkdSy91rO8w==" }, "Microsoft.AspNetCore.Authorization": { "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "ACaLyjBSz9WUzbaJe0Sv09/FihRNHYlRUIj3uQ8CZFFByf6Qwv3+PXnbltidFKz2iOyqdvppQias3emdQUY2nA==", + "resolved": "9.0.1", + "contentHash": "WgLlLBlMczb2+QLNG6sM95OUZ0EBztz60k/N75tjIgpyu0SdpIfYytAmX/7JJAjRTZF0c/CrWaQV+SH9FuGsrA==", "dependencies": { - "Microsoft.AspNetCore.Metadata": "8.0.11", - "Microsoft.Extensions.Logging.Abstractions": "8.0.2", - "Microsoft.Extensions.Options": "8.0.2" + "Microsoft.AspNetCore.Metadata": "9.0.1", + "Microsoft.Extensions.Logging.Abstractions": "9.0.1", + "Microsoft.Extensions.Options": "9.0.1" } }, "Microsoft.AspNetCore.Components": { "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "kyhSQcVEQvMnv2BNRn7JRgYCr+PIO5Uh1mhIFdCNycxE/k8NsI72sV693s1KVmVebMA8g3hTBmfBEheWb3hhww==", + "resolved": "9.0.1", + "contentHash": "6pwfbQKNtvPkbF4tCGiAKGyt6BVpu58xAXz7u2YXcUKTNmNxrymbG1mEyMc0EPzVdnquDDqTyfXM3mC1EJycxQ==", "dependencies": { - "Microsoft.AspNetCore.Authorization": "8.0.11", - "Microsoft.AspNetCore.Components.Analyzers": "8.0.11" + "Microsoft.AspNetCore.Authorization": "9.0.1", + "Microsoft.AspNetCore.Components.Analyzers": "9.0.1" } }, "Microsoft.AspNetCore.Components.Analyzers": { "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "4JtFt5IR0ixuFpwY6D2Xi5R+vZQ6iykd2EuG3puHETCOZOgYG8M538LCY1lbgQTkHOL04YKDjQTQu8PU/BaXRQ==" + "resolved": "9.0.1", + "contentHash": "I8Rs4LXT5UQxM5Nin2+Oj8aSY2heszSZ3EyTLgt3mxmfiRPrVO7D8NNSsf1voI2Gb0qFJceof/J5c9E+nfNuHw==" }, "Microsoft.AspNetCore.Components.Forms": { "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "60g+idqaiVhPVNOqauy/vH5lREpjcuKl3/w6zJhdU1PFWg4jtdoyIPQH+qxBKsUohkELhH3cRfzGRKElVuZuwg==", + "resolved": "9.0.1", + "contentHash": "KyULVU32bLz74LWDwPEwNUEllTehzWJuM7YAsz80rMKEzvR0K8cRjRzO0fnN/nfydMeLRRlbI0xj8wnEAymLVw==", "dependencies": { - "Microsoft.AspNetCore.Components": "8.0.11" + "Microsoft.AspNetCore.Components": "9.0.1" } }, "Microsoft.AspNetCore.Components.Web": { "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "IDmjQ/K7hv6zUEz2LsCkQBngZx6PMnty8OdSPf0hYGMpC+4Yi37pgCc/25fFu3CSBe8nDirqTrqKtfToHWCpbw==", + "resolved": "9.0.1", + "contentHash": "LI0vjYEd9MaDZPDQxPCn4gGYDkEC5U9rp1nWZo7rPozJxgTG2zU3WERujxTi2LeAC2ZzdXlOVCrUyPQ55LZV2A==", "dependencies": { - "Microsoft.AspNetCore.Components": "8.0.11", - "Microsoft.AspNetCore.Components.Forms": "8.0.11", - "Microsoft.Extensions.DependencyInjection": "8.0.1", - "Microsoft.Extensions.Primitives": "8.0.0", - "Microsoft.JSInterop": "8.0.11", - "System.IO.Pipelines": "8.0.0" + "Microsoft.AspNetCore.Components": "9.0.1", + "Microsoft.AspNetCore.Components.Forms": "9.0.1", + "Microsoft.Extensions.DependencyInjection": "9.0.1", + "Microsoft.Extensions.Primitives": "9.0.1", + "Microsoft.JSInterop": "9.0.1" } }, "Microsoft.AspNetCore.Metadata": { "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "cy04xnMSTXTkRPjEwseRz57R5zjR/CWsdEOHH6NhWbNl97k+U1w6dSjqIOC7kv08tyzmM30FzIilSDtE5HdL/A==" + "resolved": "9.0.1", + "contentHash": "EZnHifamF7IFEIyjAKMtJM3I/94OIe72i3P09v5oL0twmsmfQwal6Ni3m8lbB5mge3jWFhMozeW+rUdRSqnXRQ==" }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==", + "resolved": "9.0.1", + "contentHash": "qZI42ASAe3hr2zMSA6UjM92pO1LeDq5DcwkgSowXXPY8I56M76pEKrnmsKKbxagAf39AJxkH2DY4sb72ixyOrg==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "8.0.2", - "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==" + "resolved": "9.0.1", + "contentHash": "Tr74eP0oQ3AyC24ch17N8PuEkrPbD0JqIfENCYqmgKYNOmL8wQKzLJu3ObxTUDrjnn4rHoR1qKa37/eQyHmCDA==" }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "9.0.0", - "contentHash": "uK439QzYR0q2emLVtYzwyK3x+T5bTY4yWsd/k/ZUS9LR6Sflp8MIdhGXW8kQCd86dQD4tLqvcbLkku8qHY263Q==", + "resolved": "9.0.3", + "contentHash": "umczZ3+QPpzlrW/lkvy+IB0p52+qZ5w++aqx2lTCMOaPKzwcbVdrJgiQ3ajw5QWBp7gChLUiCYkSlWUpfjv24g==", "dependencies": { - "Microsoft.Extensions.Primitives": "9.0.0" + "Microsoft.Extensions.Primitives": "9.0.3" } }, "Microsoft.Extensions.Localization": { "type": "Transitive", - "resolved": "8.0.8", - "contentHash": "n32ZGmc2UOv9R/xsBHQPOxBsqCSAAJSoMtFqoQ8zOegB2P+H6+773OyCWg4jRBkO/3dmCyBJXB0yLAOVW2/C/w==", + "resolved": "9.0.1", + "contentHash": "UgvX4Yb2T3tEsKT30ktZr0H7kTRPapCgEH0bdTwxiEGSdA39/hAQMvvb+vgHpqmevDU5+puyI9ujRkmmbF946w==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.1", - "Microsoft.Extensions.Localization.Abstractions": "8.0.8", - "Microsoft.Extensions.Logging.Abstractions": "8.0.1", - "Microsoft.Extensions.Options": "8.0.2" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", + "Microsoft.Extensions.Localization.Abstractions": "9.0.1", + "Microsoft.Extensions.Logging.Abstractions": "9.0.1", + "Microsoft.Extensions.Options": "9.0.1" } }, "Microsoft.Extensions.Localization.Abstractions": { "type": "Transitive", - "resolved": "8.0.8", - "contentHash": "WYIsqP/A6dH/LWJznrvgoNPc7Q+CUJD0E78765GL3aonBtyFK1BKtPzBvvlnrr3SVqSO2r6xJCLgCEiCMG1gfA==" + "resolved": "9.0.1", + "contentHash": "CABog43lyaZQMjmlktuImCy6zmAzRBaXqN81uPaMQjlp//ISDVYItZPh6KWpWRF4MY/B67X5oDc3JTUpfdocZw==" }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "8.0.2", - "contentHash": "nroMDjS7hNBPtkZqVBbSiQaQjWRDxITI8Y7XnDs97rqG3EbzVTNLZQf7bIeUJcaHOV8bca47s1Uxq94+2oGdxA==", + "resolved": "9.0.1", + "contentHash": "w2gUqXN/jNIuvqYwX3lbXagsizVNXYyt6LlF57+tMve4JYCEgCMMAjRce6uKcDASJgpMbErRT1PfHy2OhbkqEA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1" } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "8.0.2", - "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==", + "resolved": "9.0.1", + "contentHash": "nggoNKnWcsBIAaOWHA+53XZWrslC7aGeok+aR+epDPRy7HI7GwMnGZE8yEsL2Onw7kMOHVHwKcsDls1INkNUJQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", + "Microsoft.Extensions.Primitives": "9.0.1" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "9.0.0", - "contentHash": "N3qEBzmLMYiASUlKxxFIISP4AiwuPTHF5uCh+2CWSwwzAJiIYx0kBJsS30cp1nvhSySFAVi30jecD307jV+8Kg==" + "resolved": "9.0.3", + "contentHash": "yCCJHvBcRyqapMSNzP+kTc57Eaavq2cr5Tmuil6/XVnipQf5xmskxakSQ1enU6S4+fNg3sJ27WcInV64q24JsA==" }, "Microsoft.JSInterop": { "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "UYSbAkNGTWVUne3I04/9IRQel3Bt1Ww6Y5cjvZEZ89rWhBD1yWu7YDotvQS62V6mgSfFaXXPGrCUm1VG824QXw==" - }, - "System.IO.Pipelines": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" + "resolved": "9.0.1", + "contentHash": "/xBwIfb0YoC2Muv6EsHjxpqZw2aKv94+i0g0FWZvqvGv3DeAy+8wipAuECVvKYEs2EIclRD41bjajHLoD6mTtw==" }, "ZXing.Net": { "type": "Transitive", @@ -207,6 +207,6 @@ "contentHash": "7WaVMHklpT3Ye2ragqRIwlFRsb6kOk63BOGADV0fan3ulVfGLUYkDi5yNUsZS/7FVNkWbtHAlDLmu4WnHGfqvQ==" } }, - "net8.0/osx-arm64": {} + "net9.0/osx-arm64": {} } } \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/app.css b/app/MindWork AI Studio/wwwroot/app.css index 6257c7c7..af0e139a 100644 --- a/app/MindWork AI Studio/wwwroot/app.css +++ b/app/MindWork AI Studio/wwwroot/app.css @@ -35,6 +35,20 @@ margin-top: 4px; } +.plugin-icon-container { + width: var(--mud-icon-size-large); + height: var(--mud-icon-size-large); +} + +.plugin-icon-container svg { + width: 100%; + height: 100%; +} + +.mud-popover-open.InnerScrollingFix { + left: 0 !important; +} + :root { --confidence-color: #000000; } @@ -71,7 +85,25 @@ text-decoration-thickness: 2px; } -/* Fixed for MudBlazor, tooltips inside of navmenu */ +/* Fix for MudBlazor, tooltips inside of navmenu */ .mud-navmenu .mud-tooltip-root { display: initial !important; } + +/* Context div for inner scrolling component */ +.inner-scrolling-context { + display: flex; + flex-direction: column; + height: 100vh; +} + +/* Fixed MudSplitter inside context div for inner scrolling component */ +.inner-scrolling-context > .mud-splitter { + flex-grow: 1; + overflow: hidden; +} + +/* Fixed the slider part of MudSplitter inside context div for inner scrolling component */ +.inner-scrolling-context > .mud-splitter > .mud-slider > .mud-slider-container { + padding-bottom: 12px; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/changelog/v0.9.26.md b/app/MindWork AI Studio/wwwroot/changelog/v0.9.26.md new file mode 100644 index 00000000..138a2392 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/changelog/v0.9.26.md @@ -0,0 +1,5 @@ +# v0.9.26, build 201 (2025-01-13 19:11 UTC) +- Added the ability to configure local and remote (ERI) data sources in the settings as a preview feature behind the RAG feature flag. +- Fixed the ERI server assistant to ask for confirmation before deleting a ERI server preset. +- Fixed a bug in the ERI server assistant that allowed an empty directory as a base directory for the code generation. +- Fixed the embedding dialog to store the selected embedding model when using LM Studio as host. \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/changelog/v0.9.27.md b/app/MindWork AI Studio/wwwroot/changelog/v0.9.27.md new file mode 100644 index 00000000..f333796b --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/changelog/v0.9.27.md @@ -0,0 +1,9 @@ +# v0.9.27, build 202 (2025-01-21 18:24 UTC) +- Improved the inner content scrolling to use the entire space available. +- Improved message process debugging. This helps to identify issues related to the message handling. +- Fixed the hostname validation message for ERI v1 data sources. +- Fixed a memory leak in the chat component. +- Fixed an issue with the workspace title not being updated when a chat was moved to another workspace. +- Fixed an issue with the chat component not loading the current workspace name when the component was refreshed. +- Fixed an issue with tooltips at the bottom of the app not being displayed as expected. +- Removed the "send to" button from the ERI server assistant, since it is not supported. \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/changelog/v0.9.28.md b/app/MindWork AI Studio/wwwroot/changelog/v0.9.28.md new file mode 100644 index 00000000..62e2a05c --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/changelog/v0.9.28.md @@ -0,0 +1,9 @@ +# v0.9.28, build 203 (2025-02-09 16:33 UTC) +- Added an information view to all data sources to the data source configuration page. The data source configuration is a preview feature behind the RAG feature flag. +- Added a ERI ((E)xternal (R)etrieval (I)nterface) client for communication with any ERI server. +- Added the option to select the default app provider in the assistant settings under provider selection. Thank you, Peer (`peerschuett`), for reporting the issue. +- Added `donework` as financial supporter. Thank you, Dominic! +- Added content contributors to the supporter page. We thank Luc (`DevNullx64`) for his build script contribution as well as Kerstin (`KeSah001`) for creating the Wiki pages. +- Improved the resource handling when loading models. +- Improved the build script to support Arch Linux and other Linux distributions, along with Rust nightly environments. Thanks `SolsticeSpectrum` for the contribution. +- Upgraded the dependencies Rust, .NET, OpenSSL, MudBlazor, `rand`, `rand_chacha`, and others to the latest usable versions. \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/changelog/v0.9.29.md b/app/MindWork AI Studio/wwwroot/changelog/v0.9.29.md new file mode 100644 index 00000000..02f0d51f --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/changelog/v0.9.29.md @@ -0,0 +1,13 @@ +# v0.9.29, build 204 (2025-02-24 13:48 UTC) +- Added the possibility to select data sources for chats. This preview feature is hidden behind the RAG feature flag, check your app options in case you want to enable it. +- Added an option to all data sources to select a local security policy. This preview feature is hidden behind the RAG feature flag. +- Added an option to preselect data sources and options for new chats. This preview feature is hidden behind the RAG feature flag. +- Added an agent to select the appropriate data sources for any prompt. This preview feature is hidden behind the RAG feature flag. +- Added an agent to validate whether a retrieval context makes sense for the given prompt. This preview feature is hidden behind the RAG feature flag. +- Added a generic RAG process to integrate possibly any data in your chats. Although the generic RAG process is now implemented, the retrieval part is working only with external data sources using the ERI interface. That means that you could integrate your company's data from the corporate network by now. The retrieval process for your local data is still under development and will take several weeks to be released. In order to use data through ERI, you (or your company) have to develop an ERI server. You might use the ERI server assistant within AI Studio to do so. This preview feature is hidden behind the RAG feature flag. +- Improved confidence card for small spaces. +- Improved data security by enforcing provider filtering based on the chosen confidence level. To ensure this in the future, source code analyzers have been added to warn developers about insecure code. +- Improved the readability of descriptions inside the ERI server assistant. +- Fixed a bug in which `APP_SETTINGS` appeared as a valid destination in the "send to" menu. +- Fixed a layout bug within the chat page, where the top part uses too much space. +- Upgraded to Rust 1.85.0 and .NET 8.0.13. \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/changelog/v0.9.30.md b/app/MindWork AI Studio/wwwroot/changelog/v0.9.30.md new file mode 100644 index 00000000..91092514 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/changelog/v0.9.30.md @@ -0,0 +1,2 @@ +# v0.9.30, build 205 (2025-02-24 19:55 UTC) +- Implemented the new models API for the Anthropic provider. This allows you to use the latest models, like Claude 3.7 Sonnet, which were released in the last hours. \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/changelog/v0.9.31.md b/app/MindWork AI Studio/wwwroot/changelog/v0.9.31.md new file mode 100644 index 00000000..b29c33a9 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/changelog/v0.9.31.md @@ -0,0 +1,5 @@ +# v0.9.31, build 206 (2025-03-03 15:33 UTC) +- Added Helmholtz (aka "Blablador") as provider. This provider is available to all researchers and employees of the 18 Helmholtz Centers as well as all eduGAIN organizations worldwide. +- Added GWDG SAIA as provider. This provider is available to all researchers and employees of the GWDG, the Max Planck Society, the 18 Helmholtz Centers, and most German universities. +- Added DeepSeek as provider. +- Added paths to log files in the "About" dialog for easier troubleshooting and support. \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/changelog/v0.9.32.md b/app/MindWork AI Studio/wwwroot/changelog/v0.9.32.md new file mode 100644 index 00000000..62a9a86c --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/changelog/v0.9.32.md @@ -0,0 +1,16 @@ +# v0.9.32, build 207 (2025-03-08 20:15 UTC) +- Added the "Community & Code" section to the about page. It includes links to the GitHub repositories and the project website. +- Added the retrieval process section for ERI data sources in the configuration dialog. Like all RAG functions, this is hidden behind the RAG feature flag in the app settings due to its preview status. +- Improved data security by preventing the use of cloud LLMs after confidential data has been retrieved previously. +- Improved the ERI client to expect JSON responses and send JSON requests using camel case. +- Improved the ERI client to raise an error when the server responds with additional JSON data that is not expected. +- Improved the error handling in the ERI data source info dialog in cases where servers respond with an invalid message. +- Improved the error handling for the entire RAG process. +- Improved chat thread persistence after modifications through the RAG process. +- Improved the augmentation and generation part of RAG by passing the augmented data into the system prompt. +- Fixed the chat thread we use for the data retrieval by removing the last block, which is meant to be for the final AI answer. +- Fixed the data source name for ERI data sources when performing data retrieval. +- Fixed the default data source selection when replacing the current chat with a new one. +- Fixed the state of the re-generate button in the chat thread, when no provider is selected or the data security is preventing the use of cloud LLMs. +- Updated the code contributions section in the supporter page. Thanks `peerschuett` for being our next contributor. +- Upgraded code dependencies. \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/changelog/v0.9.33.md b/app/MindWork AI Studio/wwwroot/changelog/v0.9.33.md new file mode 100644 index 00000000..49725cbe --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/changelog/v0.9.33.md @@ -0,0 +1,2 @@ +# v0.9.33, build 208 (2025-03-11 08:14 UTC) +- Fixed a bug where the authentication methods for added ERI servers were not applied correctly. Thanks Kerstin `KeSah001` for reporting this issue. \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/changelog/v0.9.34.md b/app/MindWork AI Studio/wwwroot/changelog/v0.9.34.md new file mode 100644 index 00000000..2793accb --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/changelog/v0.9.34.md @@ -0,0 +1,2 @@ +# v0.9.34, build 209 (2025-03-11 13:02 UTC) +- Fixed another bug related to ERI server authentication when adding new servers. \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/changelog/v0.9.35.md b/app/MindWork AI Studio/wwwroot/changelog/v0.9.35.md new file mode 100644 index 00000000..ea72c689 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/changelog/v0.9.35.md @@ -0,0 +1,5 @@ +# v0.9.35, build 210 (2025-03-13 08:44 UTC) +- A settings icon was added to all assistants and the assistants overview. The icon opens a dialog that displays all settings that can be changed. The settings aren't shown on the settings overview page anymore for a better overview. +- Migrated to .NET 9.0.3 +- Migrated to MudBlazor 8.3.0 +- Upgraded all dependencies to the latest versions \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/changelog/v0.9.36.md b/app/MindWork AI Studio/wwwroot/changelog/v0.9.36.md new file mode 100644 index 00000000..73dd3481 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/changelog/v0.9.36.md @@ -0,0 +1,2 @@ +# v0.9.36, build 211 (2025-03-15 10:42 UTC) +- Fixed a MudBlazor bug, where dropdown menus were not displayed correctly when used inside a dialog. \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/changelog/v0.9.37.md b/app/MindWork AI Studio/wwwroot/changelog/v0.9.37.md new file mode 100644 index 00000000..8be60bac --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/changelog/v0.9.37.md @@ -0,0 +1,8 @@ +# v0.9.37, build 212 (2025-03-16 20:32 UTC) +- Improved the experience of the data selection component when no data sources are configured yet. +- Improved the data source selection behavior when no data source is available or selected, for whatever reason. +- Moved the data source settings into the data selection component. +- Fixed the "send to" menu position, which was offset due to the MudBlazor 8 upgrade. +- Fixed a rare issue with the enum selection component, where the `SelectionUpdated` function was not called for the special `other` enum values. +- Fixed the new setting dialogs, which were not updated appropriately when settings were changed. +- Removed the link to the ERI server assistant from its settings page, as it is no longer necessary. \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/changelog/v0.9.38.md b/app/MindWork AI Studio/wwwroot/changelog/v0.9.38.md new file mode 100644 index 00000000..9766008f --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/changelog/v0.9.38.md @@ -0,0 +1,4 @@ +# v0.9.38, build 213 (2025-03-17 18:18 UTC) +- Added the "stop generation" button to all assistants. +- Upgraded MudBlazor to v8.4.0, which fixes some bugs we were experiencing. +- Upgraded the ERI v1 specification for the ERI server assistant & fixed spelling of the `UNKNOWN` role. \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/changelog/v0.9.39.md b/app/MindWork AI Studio/wwwroot/changelog/v0.9.39.md new file mode 100644 index 00000000..9f573df3 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/changelog/v0.9.39.md @@ -0,0 +1,7 @@ +# v0.9.39, build 214 (2025-03-xx xx:xx UTC) +- Added a feature flag for the plugin system. This flag is disabled by default and can be enabled inside the app settings. Please note that this feature is still in development; there are no plugins available yet. +- Added the Lua library we use for the plugin system to the about page. +- Added the plugin overview page. This page shows all installed plugins and allows you to enable or disable them. It is only available when the plugin preview feature is enabled. +- Added hot reloading for plugins. When any plugin is changed, the app will automatically reload the plugin without needing to restart the app. +- Fixed the preview tooltip component not showing the correct position when used inside a scrollable container. +- Upgraded to Rust 1.85.1 \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/specs/eri/v1.json b/app/MindWork AI Studio/wwwroot/specs/eri/v1.json index 4159bd79..dedc36f2 100644 --- a/app/MindWork AI Studio/wwwroot/specs/eri/v1.json +++ b/app/MindWork AI Studio/wwwroot/specs/eri/v1.json @@ -2,7 +2,7 @@ "openapi": "3.0.1", "info": { "title": "ERI - (E)xternal (R)etrieval (I)nterface", - "description": "This API serves as a contract between LLM tools like AI Studio and any external data sources for RAG\n(retrieval-augmented generation). The tool, e.g., AI Studio acts as the client (the augmentation and\ngeneration parts) and the data sources act as the server (the retrieval part). The data\nsources implement some form of data retrieval and return a suitable context to the LLM tool.\nThe LLM tool, in turn, handles the integration of appropriate LLMs (augmentation & generation).\nData sources can be document or graph databases, or even a file system, for example. They\nwill likely implement an appropriate retrieval process by using some kind of embedding.\nHowever, this API does not inherently require any embedding, as data processing is\nimplemented decentralized by the data sources.", + "description": "This API serves as a contract between LLM tools like AI Studio and any external data sources for RAG\n(retrieval-augmented generation). The tool, e.g., AI Studio acts as the client (the augmentation and\ngeneration parts) and the data sources act as the server (the retrieval part). The data\nsources implement some form of data retrieval and return a suitable context to the LLM tool.\nThe LLM tool, in turn, handles the integration of appropriate LLMs (augmentation & generation).\nData sources can be document or graph databases, or even a file system, for example. They\nwill likely implement an appropriate retrieval process by using some kind of embedding.\nHowever, this API does not inherently require any embedding, as data processing is\nimplemented decentralized by the data sources.\n\nThe client expects that all fields in the JSON responses from an ERI server are named according\nto camel case or Pascal case conventions. The client's JSON objects for requests use camel case\nfor the field names.", "version": "v1" }, "paths": { @@ -494,7 +494,7 @@ "Role": { "enum": [ "NONE", - "UNKNOW", + "UNKNOWN", "SYSTEM", "USER", "AI", diff --git a/app/MindWork AI Studio/wwwroot/system/CodeBeam.MudBlazor.Extensions/MudExtensions.min.css.br b/app/MindWork AI Studio/wwwroot/system/CodeBeam.MudBlazor.Extensions/MudExtensions.min.css.br new file mode 100644 index 00000000..03036b5d Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/CodeBeam.MudBlazor.Extensions/MudExtensions.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/CodeBeam.MudBlazor.Extensions/MudExtensions.min.css.gz b/app/MindWork AI Studio/wwwroot/system/CodeBeam.MudBlazor.Extensions/MudExtensions.min.css.gz new file mode 100644 index 00000000..8262136a Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/CodeBeam.MudBlazor.Extensions/MudExtensions.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/CodeBeam.MudBlazor.Extensions/MudExtensions.min.js.br b/app/MindWork AI Studio/wwwroot/system/CodeBeam.MudBlazor.Extensions/MudExtensions.min.js.br new file mode 100644 index 00000000..777ac7c6 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/CodeBeam.MudBlazor.Extensions/MudExtensions.min.js.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/CodeBeam.MudBlazor.Extensions/MudExtensions.min.js.gz b/app/MindWork AI Studio/wwwroot/system/CodeBeam.MudBlazor.Extensions/MudExtensions.min.js.gz new file mode 100644 index 00000000..f02909a7 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/CodeBeam.MudBlazor.Extensions/MudExtensions.min.js.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/MudBlazor.Markdown.MathJax.min.js.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/MudBlazor.Markdown.MathJax.min.js.br new file mode 100644 index 00000000..f6543780 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/MudBlazor.Markdown.MathJax.min.js.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/MudBlazor.Markdown.MathJax.min.js.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/MudBlazor.Markdown.MathJax.min.js.gz new file mode 100644 index 00000000..34ef187a Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/MudBlazor.Markdown.MathJax.min.js.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/MudBlazor.Markdown.min.css b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/MudBlazor.Markdown.min.css index 44da7757..51778ccc 100755 --- a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/MudBlazor.Markdown.min.css +++ b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/MudBlazor.Markdown.min.css @@ -1 +1 @@ -.mud-markdown-body code:not(.hljs){background:var(--mud-palette-action-disabled-background);color:var(--mud-palette-text-primary)!important;padding:2.5px 7.5px;border-radius:5px}pre code.hljs{display:block!important;overflow-x:auto;padding:1em}.mud-markdown-body .snippet-clipboard-content{position:relative!important}.mud-markdown-body .snippet-clipboard-content:hover>.snippet-clipboard-copy-icon{display:block!important}.mud-markdown-body .snippet-clipboard-content .snippet-clipboard-copy-icon{position:absolute;display:none;top:0;right:0}.mud-markdown-body blockquote{border-left:.25em solid var(--mud-palette-text-disabled);color:var(--mud-palette-text-secondary);background-color:var(--mud-palette-table-hover);padding:.25em 1em;margin:.5em 0 1.25em}.mud-markdown-body blockquote p{margin-bottom:0!important}.mud-markdown-body table{margin:1.25em 0}.mud-markdown-body .mud-link:hover{cursor:pointer!important}.mud-markdown-body ul{list-style-type:disc}.mud-markdown-body ol,.mud-markdown-body ul{padding-left:2em;margin-bottom:1.25em!important}.mud-markdown-body ul ul{list-style-type:circle;margin-bottom:0!important}.mud-markdown-body ul ul ul{list-style-type:square;margin-bottom:0!important}.mud-markdown-body li{display:list-item!important;text-align:-webkit-match-parent}.mud-markdown-body h1,.mud-markdown-body h2{border-bottom:1px solid var(--mud-palette-text-disabled);padding-bottom:.125em;margin-bottom:.4em}.mud-markdown-body h1,.mud-markdown-body h2,.mud-markdown-body h3,.mud-markdown-body h4,.mud-markdown-body h5,.mud-markdown-body h6{scroll-margin-top:5rem;margin-top:.25em;word-wrap:break-word;margin-bottom:.3em!important}.mud-markdown-body .mud-divider{margin:.5em 0;height:.25em}.mud-markdown-body p{margin-bottom:1.25em!important}.mud-markdown-body .mud-expand-panel p,.mud-markdown-body li p{margin-bottom:0!important}.mud-markdown-body p .markdown-error{white-space:pre}.mud-markdown-body img{max-width:100%} \ No newline at end of file +.mud-markdown-body code:not(.hljs){background:var(--mud-palette-action-disabled-background);color:var(--mud-palette-text-primary)!important;padding:2.5px 7.5px;border-radius:5px}pre code.hljs{display:block!important;overflow-x:auto;padding:1em}.mud-markdown-body .snippet-clipboard-content{position:relative!important}.mud-markdown-body .snippet-clipboard-content:hover>.snippet-clipboard-copy-icon{display:block!important}.mud-markdown-body .snippet-clipboard-content .snippet-clipboard-copy-icon{position:absolute;display:none;top:0;right:0}.mud-markdown-body blockquote{border-left:.25em solid var(--mud-palette-text-disabled);color:var(--mud-palette-text-secondary);background-color:var(--mud-palette-table-hover);padding:.25em 1em;margin:.5em 0 1.25em}.mud-markdown-body blockquote p{margin-bottom:0!important}.mud-markdown-body table{margin:1.25em 0}.mud-markdown-body .mud-link:hover{cursor:pointer!important}.mud-markdown-body ul{list-style-type:disc}.mud-markdown-body ol,.mud-markdown-body ul{padding-left:2em;margin-bottom:1.25em!important}.mud-markdown-body ul ul{list-style-type:circle;margin-bottom:0!important}.mud-markdown-body ul ul ul{list-style-type:square;margin-bottom:0!important}.mud-markdown-body li{display:list-item!important;text-align:-webkit-match-parent}.mud-markdown-body h1,.mud-markdown-body h2{border-bottom:1px solid var(--mud-palette-text-disabled);padding-bottom:.125em;margin-bottom:.4em}.mud-markdown-body h1,.mud-markdown-body h2,.mud-markdown-body h3,.mud-markdown-body h4,.mud-markdown-body h5,.mud-markdown-body h6{scroll-margin-top:5rem;margin-top:.25em;word-wrap:break-word;margin-bottom:.3em!important}.mud-markdown-body .mud-divider{margin:.5em 0;height:.25em}.mud-markdown-body p{margin-bottom:1.25em!important}.mud-markdown-body .mud-expand-panel p,.mud-markdown-body li p{margin-bottom:0!important}.mud-markdown-body p .mud-markdown-error{white-space:pre}.mud-markdown-body img{max-width:100%} \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/MudBlazor.Markdown.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/MudBlazor.Markdown.min.css.br new file mode 100644 index 00000000..4d6486c8 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/MudBlazor.Markdown.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/MudBlazor.Markdown.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/MudBlazor.Markdown.min.css.gz new file mode 100644 index 00000000..3715f81c Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/MudBlazor.Markdown.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/MudBlazor.Markdown.min.js.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/MudBlazor.Markdown.min.js.br new file mode 100644 index 00000000..86aeeef6 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/MudBlazor.Markdown.min.js.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/MudBlazor.Markdown.min.js.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/MudBlazor.Markdown.min.js.gz new file mode 100644 index 00000000..cf7e8314 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/MudBlazor.Markdown.min.js.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/a11y-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/a11y-dark.min.css.br new file mode 100644 index 00000000..867898ff Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/a11y-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/a11y-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/a11y-dark.min.css.gz new file mode 100644 index 00000000..6bb09d38 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/a11y-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/a11y-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/a11y-light.min.css.br new file mode 100644 index 00000000..700c5fd9 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/a11y-light.min.css.br @@ -0,0 +1,2 @@ +] vVy-O +/" $[l|1yVu.=7BxKY_ /I#x^X?a#Y5j*֌ A娾R'-8)EӸ9a#ݐ}Jt' )M 8p#3)38{Q ?[uXqa(WHΗ^Gb:S;3WB||Q9xap1{Ğ:wk'gn\q \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/a11y-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/a11y-light.min.css.gz new file mode 100644 index 00000000..73d10457 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/a11y-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/agate.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/agate.min.css.br new file mode 100644 index 00000000..24821158 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/agate.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/agate.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/agate.min.css.gz new file mode 100644 index 00000000..dc3758b7 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/agate.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/an-old-hope.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/an-old-hope.min.css.br new file mode 100644 index 00000000..99647bd4 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/an-old-hope.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/an-old-hope.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/an-old-hope.min.css.gz new file mode 100644 index 00000000..d192c948 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/an-old-hope.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/androidstudio.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/androidstudio.min.css.br new file mode 100644 index 00000000..f225acc9 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/androidstudio.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/androidstudio.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/androidstudio.min.css.gz new file mode 100644 index 00000000..7dcc44db Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/androidstudio.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/arduino-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/arduino-light.min.css.br new file mode 100644 index 00000000..2d8b1598 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/arduino-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/arduino-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/arduino-light.min.css.gz new file mode 100644 index 00000000..8fa598e1 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/arduino-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/arta.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/arta.min.css.br new file mode 100644 index 00000000..05d35576 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/arta.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/arta.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/arta.min.css.gz new file mode 100644 index 00000000..d35f5f09 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/arta.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/ascetic.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/ascetic.min.css.br new file mode 100644 index 00000000..c07165c6 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/ascetic.min.css.br @@ -0,0 +1 @@ +s@Dy>ڛ}bR>s["ݽϦ; ͔ Kj$裆fV#>X2&@+g+l@ pZ 7LeWL n{|'( \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/ascetic.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/ascetic.min.css.gz new file mode 100644 index 00000000..45615208 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/ascetic.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/atom-one-dark-reasonable.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/atom-one-dark-reasonable.min.css.br new file mode 100644 index 00000000..fde02980 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/atom-one-dark-reasonable.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/atom-one-dark-reasonable.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/atom-one-dark-reasonable.min.css.gz new file mode 100644 index 00000000..d879b633 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/atom-one-dark-reasonable.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/atom-one-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/atom-one-dark.min.css.br new file mode 100644 index 00000000..866c99fa Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/atom-one-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/atom-one-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/atom-one-dark.min.css.gz new file mode 100644 index 00000000..61090de4 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/atom-one-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/atom-one-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/atom-one-light.min.css.br new file mode 100644 index 00000000..80c1c611 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/atom-one-light.min.css.br @@ -0,0 +1,3 @@ +@dq[,9"]8l w2:`a͵-5^@iNW]3bNH_™bIk-4lL1 ]Rs-Ņ3.T+r.$7n,' 1#2 +(䖼̯ 1"hD= +Tqr#dd5߳1[|1aԀ\Л:,OM[_A邚zK*Z|55T;)߭w \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/atom-one-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/atom-one-light.min.css.gz new file mode 100644 index 00000000..8d812e4a Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/atom-one-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/apathy.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/apathy.min.css.br new file mode 100644 index 00000000..8f98cc3e Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/apathy.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/apathy.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/apathy.min.css.gz new file mode 100644 index 00000000..99969bb7 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/apathy.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/apprentice.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/apprentice.min.css.br new file mode 100644 index 00000000..661eb57c --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/apprentice.min.css.br @@ -0,0 +1,2 @@ +M dZ\&- }j:Њǁ0vMLׄqnwo9C5+NztpҫtlBËH,J ҧ,M"mɒzjBϹAo;J0wOzN\\hmt.pr 謢.^`'_] SZc!s(9zMbYhVbF|\o0e_z6ga,PPHa-ȒZS8(~va lr*8o+~MvT&~9>cPu1# \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/apprentice.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/apprentice.min.css.gz new file mode 100644 index 00000000..a22dddd5 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/apprentice.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ashes.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ashes.min.css.br new file mode 100644 index 00000000..6fba768f Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ashes.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ashes.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ashes.min.css.gz new file mode 100644 index 00000000..319a02ff Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ashes.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-cave-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-cave-light.min.css.br new file mode 100644 index 00000000..2672a8f8 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-cave-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-cave-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-cave-light.min.css.gz new file mode 100644 index 00000000..d08fa1ca Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-cave-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-cave.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-cave.min.css.br new file mode 100644 index 00000000..b999ca94 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-cave.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-cave.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-cave.min.css.gz new file mode 100644 index 00000000..3874bef2 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-cave.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-dune-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-dune-light.min.css.br new file mode 100644 index 00000000..898e0d14 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-dune-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-dune-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-dune-light.min.css.gz new file mode 100644 index 00000000..f4a0f70d Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-dune-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-dune.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-dune.min.css.br new file mode 100644 index 00000000..8a3bb42d Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-dune.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-dune.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-dune.min.css.gz new file mode 100644 index 00000000..0a7541df Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-dune.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-estuary-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-estuary-light.min.css.br new file mode 100644 index 00000000..71606650 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-estuary-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-estuary-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-estuary-light.min.css.gz new file mode 100644 index 00000000..0d32cd1c Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-estuary-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-estuary.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-estuary.min.css.br new file mode 100644 index 00000000..6584145f Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-estuary.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-estuary.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-estuary.min.css.gz new file mode 100644 index 00000000..ff0a8beb Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-estuary.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-forest-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-forest-light.min.css.br new file mode 100644 index 00000000..9d0bdef3 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-forest-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-forest-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-forest-light.min.css.gz new file mode 100644 index 00000000..c3b1a449 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-forest-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-forest.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-forest.min.css.br new file mode 100644 index 00000000..4e7b769e Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-forest.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-forest.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-forest.min.css.gz new file mode 100644 index 00000000..f8c7fcbd Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-forest.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-heath-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-heath-light.min.css.br new file mode 100644 index 00000000..b36223b1 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-heath-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-heath-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-heath-light.min.css.gz new file mode 100644 index 00000000..28268ec1 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-heath-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-heath.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-heath.min.css.br new file mode 100644 index 00000000..d2830657 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-heath.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-heath.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-heath.min.css.gz new file mode 100644 index 00000000..ec126f42 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-heath.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-lakeside-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-lakeside-light.min.css.br new file mode 100644 index 00000000..3e9b169d Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-lakeside-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-lakeside-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-lakeside-light.min.css.gz new file mode 100644 index 00000000..86d68825 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-lakeside-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-lakeside.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-lakeside.min.css.br new file mode 100644 index 00000000..44d0ae45 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-lakeside.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-lakeside.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-lakeside.min.css.gz new file mode 100644 index 00000000..a5b6d7c5 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-lakeside.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-plateau-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-plateau-light.min.css.br new file mode 100644 index 00000000..2190c3ad Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-plateau-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-plateau-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-plateau-light.min.css.gz new file mode 100644 index 00000000..deefe57c Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-plateau-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-plateau.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-plateau.min.css.br new file mode 100644 index 00000000..61f499e9 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-plateau.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-plateau.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-plateau.min.css.gz new file mode 100644 index 00000000..a1ac9a59 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-plateau.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-savanna-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-savanna-light.min.css.br new file mode 100644 index 00000000..8c3a0ccb Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-savanna-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-savanna-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-savanna-light.min.css.gz new file mode 100644 index 00000000..563b8569 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-savanna-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-savanna.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-savanna.min.css.br new file mode 100644 index 00000000..06ad42dc Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-savanna.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-savanna.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-savanna.min.css.gz new file mode 100644 index 00000000..be3b7ef4 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-savanna.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-seaside-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-seaside-light.min.css.br new file mode 100644 index 00000000..ffd3e106 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-seaside-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-seaside-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-seaside-light.min.css.gz new file mode 100644 index 00000000..b6218f4f Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-seaside-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-seaside.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-seaside.min.css.br new file mode 100644 index 00000000..11cea013 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-seaside.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-seaside.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-seaside.min.css.gz new file mode 100644 index 00000000..d3d63f67 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-seaside.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-sulphurpool-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-sulphurpool-light.min.css.br new file mode 100644 index 00000000..87cd77d0 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-sulphurpool-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-sulphurpool-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-sulphurpool-light.min.css.gz new file mode 100644 index 00000000..49136892 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-sulphurpool-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-sulphurpool.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-sulphurpool.min.css.br new file mode 100644 index 00000000..eb8e8699 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-sulphurpool.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-sulphurpool.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-sulphurpool.min.css.gz new file mode 100644 index 00000000..62ae969c Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atelier-sulphurpool.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atlas.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atlas.min.css.br new file mode 100644 index 00000000..cac76888 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atlas.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atlas.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atlas.min.css.gz new file mode 100644 index 00000000..e305bb1a Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/atlas.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/bespin.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/bespin.min.css.br new file mode 100644 index 00000000..c66f1ec3 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/bespin.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/bespin.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/bespin.min.css.gz new file mode 100644 index 00000000..b8e19a11 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/bespin.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-bathory.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-bathory.min.css.br new file mode 100644 index 00000000..838ac093 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-bathory.min.css.br @@ -0,0 +1 @@ +2@d\sSm B(wtG/ Ce8&rMwq<3W":6}+6V?-3z$z1R \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-bathory.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-bathory.min.css.gz new file mode 100644 index 00000000..5fba7bdb Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-bathory.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-burzum.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-burzum.min.css.br new file mode 100644 index 00000000..ea3bd9dc --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-burzum.min.css.br @@ -0,0 +1,2 @@ +)@\\GlSmwB!3;_ID*t$KfIEN8S< LIQACJDVYJnqI.O01akڇt۱Bwd`3˻ܢԏk_'zu $T³Mm@oCIxun8z%b#msldPv^@KaVv{u9S&/17!XٲK^TЫ?R0,{rE9Y]?|bDžӝ{1ϋp +F>?8\Uk$- Q(Mb \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-burzum.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-burzum.min.css.gz new file mode 100644 index 00000000..83251efe Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-burzum.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-dark-funeral.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-dark-funeral.min.css.br new file mode 100644 index 00000000..887bd314 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-dark-funeral.min.css.br @@ -0,0 +1,4 @@ +2@d\sSomP62E--$2MO7 Rқ>fIO.8RLȐIus@#.U+9lqINZkSƦ}Hg)7C7{wEWOŞMD@+Fwm+CΤINsk 'bJM_7)\@42&$\2P3V˜>@F"=[zi몂 +m/ڧ,y_S,~zgY)(L{=H1F1. +/}/,nS~.gyy?{$ +48\/dNΈZ q!Fr? \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-dark-funeral.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-dark-funeral.min.css.gz new file mode 100644 index 00000000..6d7ffa94 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-dark-funeral.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-gorgoroth.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-gorgoroth.min.css.br new file mode 100644 index 00000000..6e0433a4 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-gorgoroth.min.css.br @@ -0,0 +1,3 @@ +2@dTYo'y!PBy݋ZHdI]4$*ùݥ7T]¤M ?pj[?PG*5aJw즨"e[\RJ +>ێ S#&S7kwE?/Ş"%` %Ym%$L0׆Hq3Ĵ4㙹ѱiC:ȖmlPs{m[ 3a\P3V!m@ eX4WbL+WM +cǒ5Տ +8*C¹S*l˞zL1:hE!Ϸ8~/l\],yu<e*MW Q(M# \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-gorgoroth.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-gorgoroth.min.css.gz new file mode 100644 index 00000000..679e4efc Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-gorgoroth.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-immortal.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-immortal.min.css.br new file mode 100644 index 00000000..d73ac3cd Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-immortal.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-immortal.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-immortal.min.css.gz new file mode 100644 index 00000000..a72080a3 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-immortal.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-khold.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-khold.min.css.br new file mode 100644 index 00000000..c1db7e21 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-khold.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-khold.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-khold.min.css.gz new file mode 100644 index 00000000..fce2cc2c Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-khold.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-marduk.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-marduk.min.css.br new file mode 100644 index 00000000..eafee4c7 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-marduk.min.css.br @@ -0,0 +1,2 @@ +2@d\sSVx'B(jDBbP.u 9kV$ts5Ʉ496ph As-.qk-`CȴcC<;bsH6x.h㩯3H}hPda~m%0HЙ7iB#yƋ1EƋxfD61\ɦltS +m罌 d7V|2rU怯O1x]UPe_%/kWPO,2%IѲ')Ð1E!Ϸ8 Օ{e4/6?-Ǚ]z.vtZ0Bms1 \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-marduk.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-marduk.min.css.gz new file mode 100644 index 00000000..7e824798 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-marduk.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-mayhem.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-mayhem.min.css.br new file mode 100644 index 00000000..6cd9dfea Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-mayhem.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-mayhem.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-mayhem.min.css.gz new file mode 100644 index 00000000..6b61abd9 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-mayhem.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-nile.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-nile.min.css.br new file mode 100644 index 00000000..f5cb54fd --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-nile.min.css.br @@ -0,0 +1,3 @@ +)@d\sSVbPnQKx7n** +]&fIO.8R< LȐIsya}cJpλ[\ZTimdžfٻ$eʍwd!d3˻ܢ_bzh PRdax2pHЉ7if dBLɻq +eOn=Y8 cY]?|_y8ݹ\a?GRiq$p +HΈ-Z q):r? \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-nile.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-nile.min.css.gz new file mode 100644 index 00000000..c0745355 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-nile.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-venom.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-venom.min.css.br new file mode 100644 index 00000000..a0001540 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-venom.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-venom.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-venom.min.css.gz new file mode 100644 index 00000000..1abbc49a Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal-venom.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal.min.css.br new file mode 100644 index 00000000..f3af7c11 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal.min.css.gz new file mode 100644 index 00000000..c347954a Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/black-metal.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/brewer.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/brewer.min.css.br new file mode 100644 index 00000000..6de8fa09 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/brewer.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/brewer.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/brewer.min.css.gz new file mode 100644 index 00000000..52d76606 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/brewer.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/bright.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/bright.min.css.br new file mode 100644 index 00000000..782a58e5 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/bright.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/bright.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/bright.min.css.gz new file mode 100644 index 00000000..d189f4dd Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/bright.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/brogrammer.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/brogrammer.min.css.br new file mode 100644 index 00000000..1299ea7d Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/brogrammer.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/brogrammer.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/brogrammer.min.css.gz new file mode 100644 index 00000000..9acb2fab Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/brogrammer.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/brush-trees-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/brush-trees-dark.min.css.br new file mode 100644 index 00000000..9f5d0292 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/brush-trees-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/brush-trees-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/brush-trees-dark.min.css.gz new file mode 100644 index 00000000..718f0449 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/brush-trees-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/brush-trees.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/brush-trees.min.css.br new file mode 100644 index 00000000..2a1e5018 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/brush-trees.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/brush-trees.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/brush-trees.min.css.gz new file mode 100644 index 00000000..820c929c Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/brush-trees.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/chalk.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/chalk.min.css.br new file mode 100644 index 00000000..92c63260 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/chalk.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/chalk.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/chalk.min.css.gz new file mode 100644 index 00000000..692802d9 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/chalk.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/circus.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/circus.min.css.br new file mode 100644 index 00000000..f5a19f9b Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/circus.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/circus.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/circus.min.css.gz new file mode 100644 index 00000000..fb144fa9 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/circus.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/classic-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/classic-dark.min.css.br new file mode 100644 index 00000000..02d0c33b Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/classic-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/classic-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/classic-dark.min.css.gz new file mode 100644 index 00000000..b9bda203 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/classic-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/classic-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/classic-light.min.css.br new file mode 100644 index 00000000..32b40fc5 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/classic-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/classic-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/classic-light.min.css.gz new file mode 100644 index 00000000..07f567c5 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/classic-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/codeschool.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/codeschool.min.css.br new file mode 100644 index 00000000..55fc4f16 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/codeschool.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/codeschool.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/codeschool.min.css.gz new file mode 100644 index 00000000..a8d8c294 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/codeschool.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/colors.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/colors.min.css.br new file mode 100644 index 00000000..a48cd100 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/colors.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/colors.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/colors.min.css.gz new file mode 100644 index 00000000..70a0bfff Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/colors.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/cupcake.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/cupcake.min.css.br new file mode 100644 index 00000000..26b755e3 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/cupcake.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/cupcake.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/cupcake.min.css.gz new file mode 100644 index 00000000..7a2891c4 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/cupcake.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/cupertino.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/cupertino.min.css.br new file mode 100644 index 00000000..0c838814 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/cupertino.min.css.br @@ -0,0 +1,3 @@ +C r[?Z{_ d\`oЂ]9["jNYgU׬8)B3 wXӛ͐s@E2%M?KZT`?%xjximpވk1;r@39Ilgy)*9Pܤ%4ro[ h')cMд~<1)\Y00#p7KMHpab-)TmvB8L^6I/ +%/kǩv PXAƒۡ˞܊5/⇬. +'}1İk|ORbK2K^@ni%e+Gy4"ʂI FS \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/cupertino.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/cupertino.min.css.gz new file mode 100644 index 00000000..ad492cd1 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/cupertino.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/danqing.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/danqing.min.css.br new file mode 100644 index 00000000..b2ae4693 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/danqing.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/danqing.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/danqing.min.css.gz new file mode 100644 index 00000000..0afaddb2 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/danqing.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/darcula.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/darcula.min.css.br new file mode 100644 index 00000000..67669674 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/darcula.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/darcula.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/darcula.min.css.gz new file mode 100644 index 00000000..1ca662dd Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/darcula.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/dark-violet.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/dark-violet.min.css.br new file mode 100644 index 00000000..d3cc76c8 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/dark-violet.min.css.br @@ -0,0 +1,4 @@ +G dk[\Zxlݬ +Hê$ԦxT{E1lBC]n"G'.G~?cA +&~66ƶu(\() + 4ܤC)VmiIZ1SimW I/D~QtЁJI#iOùLCVan+B(憷X͂vNYuŬIEGCzek/ŘgzZ-P5oï\%KJϟRںdٳ[6sipWԈ\_z0BXൾ'e>蜗z?n+S?j fyiFs&6cT b \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/dark-violet.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/dark-violet.min.css.gz new file mode 100644 index 00000000..fd8a08e2 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/dark-violet.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/darkmoss.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/darkmoss.min.css.br new file mode 100644 index 00000000..b4754638 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/darkmoss.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/darkmoss.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/darkmoss.min.css.gz new file mode 100644 index 00000000..0f0bbb27 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/darkmoss.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/darktooth.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/darktooth.min.css.br new file mode 100644 index 00000000..c8bdaa2e Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/darktooth.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/darktooth.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/darktooth.min.css.gz new file mode 100644 index 00000000..91237535 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/darktooth.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/decaf.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/decaf.min.css.br new file mode 100644 index 00000000..5cc7f2ac Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/decaf.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/decaf.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/decaf.min.css.gz new file mode 100644 index 00000000..d7e7fdc9 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/decaf.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/default-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/default-dark.min.css.br new file mode 100644 index 00000000..7e059d93 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/default-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/default-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/default-dark.min.css.gz new file mode 100644 index 00000000..cdfd285c Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/default-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/default-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/default-light.min.css.br new file mode 100644 index 00000000..6b50f72c Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/default-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/default-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/default-light.min.css.gz new file mode 100644 index 00000000..b016932e Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/default-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/dirtysea.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/dirtysea.min.css.br new file mode 100644 index 00000000..942862b3 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/dirtysea.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/dirtysea.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/dirtysea.min.css.gz new file mode 100644 index 00000000..149f4498 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/dirtysea.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/dracula.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/dracula.min.css.br new file mode 100644 index 00000000..a66e60f1 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/dracula.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/dracula.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/dracula.min.css.gz new file mode 100644 index 00000000..951341e2 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/dracula.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/edge-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/edge-dark.min.css.br new file mode 100644 index 00000000..d612d868 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/edge-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/edge-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/edge-dark.min.css.gz new file mode 100644 index 00000000..a6e950a1 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/edge-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/edge-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/edge-light.min.css.br new file mode 100644 index 00000000..de4652dc Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/edge-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/edge-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/edge-light.min.css.gz new file mode 100644 index 00000000..7871384e Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/edge-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/eighties.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/eighties.min.css.br new file mode 100644 index 00000000..c6f47fc5 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/eighties.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/eighties.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/eighties.min.css.gz new file mode 100644 index 00000000..f6f2c828 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/eighties.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/embers.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/embers.min.css.br new file mode 100644 index 00000000..af9c2435 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/embers.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/embers.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/embers.min.css.gz new file mode 100644 index 00000000..47336921 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/embers.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/equilibrium-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/equilibrium-dark.min.css.br new file mode 100644 index 00000000..497ffaf8 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/equilibrium-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/equilibrium-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/equilibrium-dark.min.css.gz new file mode 100644 index 00000000..139382d5 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/equilibrium-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/equilibrium-gray-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/equilibrium-gray-dark.min.css.br new file mode 100644 index 00000000..cdab980e Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/equilibrium-gray-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/equilibrium-gray-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/equilibrium-gray-dark.min.css.gz new file mode 100644 index 00000000..1dffeaba Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/equilibrium-gray-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/equilibrium-gray-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/equilibrium-gray-light.min.css.br new file mode 100644 index 00000000..1310dbff Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/equilibrium-gray-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/equilibrium-gray-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/equilibrium-gray-light.min.css.gz new file mode 100644 index 00000000..40f28597 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/equilibrium-gray-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/equilibrium-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/equilibrium-light.min.css.br new file mode 100644 index 00000000..951e324f Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/equilibrium-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/equilibrium-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/equilibrium-light.min.css.gz new file mode 100644 index 00000000..6529fd36 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/equilibrium-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/espresso.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/espresso.min.css.br new file mode 100644 index 00000000..e42990f0 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/espresso.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/espresso.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/espresso.min.css.gz new file mode 100644 index 00000000..5a332060 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/espresso.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/eva-dim.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/eva-dim.min.css.br new file mode 100644 index 00000000..23b7fa28 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/eva-dim.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/eva-dim.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/eva-dim.min.css.gz new file mode 100644 index 00000000..b2884c87 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/eva-dim.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/eva.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/eva.min.css.br new file mode 100644 index 00000000..193a0278 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/eva.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/eva.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/eva.min.css.gz new file mode 100644 index 00000000..99a76e15 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/eva.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/flat.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/flat.min.css.br new file mode 100644 index 00000000..5fda4b82 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/flat.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/flat.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/flat.min.css.gz new file mode 100644 index 00000000..514c765d Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/flat.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/framer.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/framer.min.css.br new file mode 100644 index 00000000..a3a1ec30 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/framer.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/framer.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/framer.min.css.gz new file mode 100644 index 00000000..7311cc01 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/framer.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/fruit-soda.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/fruit-soda.min.css.br new file mode 100644 index 00000000..184157d2 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/fruit-soda.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/fruit-soda.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/fruit-soda.min.css.gz new file mode 100644 index 00000000..524e9fef Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/fruit-soda.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gigavolt.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gigavolt.min.css.br new file mode 100644 index 00000000..ca506400 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gigavolt.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gigavolt.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gigavolt.min.css.gz new file mode 100644 index 00000000..7296dc85 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gigavolt.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/github.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/github.min.css.br new file mode 100644 index 00000000..22163f8d Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/github.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/github.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/github.min.css.gz new file mode 100644 index 00000000..4efd4c08 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/github.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/google-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/google-dark.min.css.br new file mode 100644 index 00000000..45da67ee Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/google-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/google-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/google-dark.min.css.gz new file mode 100644 index 00000000..e6056515 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/google-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/google-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/google-light.min.css.br new file mode 100644 index 00000000..c7299031 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/google-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/google-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/google-light.min.css.gz new file mode 100644 index 00000000..29ee1370 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/google-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/grayscale-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/grayscale-dark.min.css.br new file mode 100644 index 00000000..f8c626ea Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/grayscale-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/grayscale-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/grayscale-dark.min.css.gz new file mode 100644 index 00000000..cc0114e4 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/grayscale-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/grayscale-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/grayscale-light.min.css.br new file mode 100644 index 00000000..01337550 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/grayscale-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/grayscale-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/grayscale-light.min.css.gz new file mode 100644 index 00000000..c3eb78fb Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/grayscale-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/green-screen.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/green-screen.min.css.br new file mode 100644 index 00000000..b957590a Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/green-screen.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/green-screen.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/green-screen.min.css.gz new file mode 100644 index 00000000..b4dc3498 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/green-screen.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-dark-hard.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-dark-hard.min.css.br new file mode 100644 index 00000000..2e2ed069 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-dark-hard.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-dark-hard.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-dark-hard.min.css.gz new file mode 100644 index 00000000..38904439 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-dark-hard.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-dark-medium.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-dark-medium.min.css.br new file mode 100644 index 00000000..f1d665ef Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-dark-medium.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-dark-medium.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-dark-medium.min.css.gz new file mode 100644 index 00000000..edc0bd12 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-dark-medium.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-dark-pale.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-dark-pale.min.css.br new file mode 100644 index 00000000..8f5cc1be Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-dark-pale.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-dark-pale.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-dark-pale.min.css.gz new file mode 100644 index 00000000..a8647bfe Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-dark-pale.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-dark-soft.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-dark-soft.min.css.br new file mode 100644 index 00000000..ba20c049 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-dark-soft.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-dark-soft.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-dark-soft.min.css.gz new file mode 100644 index 00000000..93ad9b86 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-dark-soft.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-light-hard.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-light-hard.min.css.br new file mode 100644 index 00000000..b6b81421 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-light-hard.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-light-hard.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-light-hard.min.css.gz new file mode 100644 index 00000000..0947141f Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-light-hard.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-light-medium.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-light-medium.min.css.br new file mode 100644 index 00000000..9bd20c3d Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-light-medium.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-light-medium.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-light-medium.min.css.gz new file mode 100644 index 00000000..aaf7d51e Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-light-medium.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-light-soft.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-light-soft.min.css.br new file mode 100644 index 00000000..0b1d87a0 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-light-soft.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-light-soft.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-light-soft.min.css.gz new file mode 100644 index 00000000..6327459b Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/gruvbox-light-soft.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/hardcore.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/hardcore.min.css.br new file mode 100644 index 00000000..eb4451ba Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/hardcore.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/hardcore.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/hardcore.min.css.gz new file mode 100644 index 00000000..cfc6a1a9 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/hardcore.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/harmonic16-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/harmonic16-dark.min.css.br new file mode 100644 index 00000000..54df9c02 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/harmonic16-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/harmonic16-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/harmonic16-dark.min.css.gz new file mode 100644 index 00000000..79e40581 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/harmonic16-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/harmonic16-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/harmonic16-light.min.css.br new file mode 100644 index 00000000..c01d9e6c Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/harmonic16-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/harmonic16-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/harmonic16-light.min.css.gz new file mode 100644 index 00000000..cc96ddf1 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/harmonic16-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/heetch-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/heetch-dark.min.css.br new file mode 100644 index 00000000..fa9578f5 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/heetch-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/heetch-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/heetch-dark.min.css.gz new file mode 100644 index 00000000..2a50c1da Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/heetch-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/heetch-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/heetch-light.min.css.br new file mode 100644 index 00000000..b389c4f7 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/heetch-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/heetch-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/heetch-light.min.css.gz new file mode 100644 index 00000000..4293b5fd Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/heetch-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/helios.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/helios.min.css.br new file mode 100644 index 00000000..432aed8c Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/helios.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/helios.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/helios.min.css.gz new file mode 100644 index 00000000..7f053692 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/helios.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/hopscotch.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/hopscotch.min.css.br new file mode 100644 index 00000000..f04be5eb Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/hopscotch.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/hopscotch.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/hopscotch.min.css.gz new file mode 100644 index 00000000..b2696a70 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/hopscotch.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/horizon-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/horizon-dark.min.css.br new file mode 100644 index 00000000..6913b16b Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/horizon-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/horizon-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/horizon-dark.min.css.gz new file mode 100644 index 00000000..2b3ba3a2 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/horizon-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/horizon-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/horizon-light.min.css.br new file mode 100644 index 00000000..c04198a2 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/horizon-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/horizon-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/horizon-light.min.css.gz new file mode 100644 index 00000000..d7f84ef9 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/horizon-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/humanoid-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/humanoid-dark.min.css.br new file mode 100644 index 00000000..35b53b4a Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/humanoid-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/humanoid-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/humanoid-dark.min.css.gz new file mode 100644 index 00000000..07de251a Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/humanoid-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/humanoid-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/humanoid-light.min.css.br new file mode 100644 index 00000000..944af188 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/humanoid-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/humanoid-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/humanoid-light.min.css.gz new file mode 100644 index 00000000..3fb041f1 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/humanoid-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ia-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ia-dark.min.css.br new file mode 100644 index 00000000..7c144a2a Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ia-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ia-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ia-dark.min.css.gz new file mode 100644 index 00000000..9fcf22dd Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ia-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ia-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ia-light.min.css.br new file mode 100644 index 00000000..1b18168a Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ia-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ia-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ia-light.min.css.gz new file mode 100644 index 00000000..38118a46 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ia-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/icy-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/icy-dark.min.css.br new file mode 100644 index 00000000..301ebf0a Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/icy-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/icy-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/icy-dark.min.css.gz new file mode 100644 index 00000000..bc28951e Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/icy-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ir-black.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ir-black.min.css.br new file mode 100644 index 00000000..0d289863 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ir-black.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ir-black.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ir-black.min.css.gz new file mode 100644 index 00000000..6c1abd6a Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ir-black.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/isotope.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/isotope.min.css.br new file mode 100644 index 00000000..18e9ad32 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/isotope.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/isotope.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/isotope.min.css.gz new file mode 100644 index 00000000..cee3dc52 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/isotope.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/kimber.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/kimber.min.css.br new file mode 100644 index 00000000..1b14ab33 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/kimber.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/kimber.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/kimber.min.css.gz new file mode 100644 index 00000000..89775ffe Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/kimber.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/london-tube.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/london-tube.min.css.br new file mode 100644 index 00000000..135bace7 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/london-tube.min.css.br @@ -0,0 +1,2 @@ +P j[2δlRbEJI\;*t`TLRK45g@f?H7 'Or{%zM7iI0Nj2"ذrˋlE]}]¬IsK}DM=bk;6YKf'$[ DBu`iVN*HgJ*tLN)O2/2[Ej4:'0-0sZc.a_`GA˥O kOK)yJz$j>B4Z_fJ7t +V7̄cL7|jL]UM,HX4*f8g`(fMrf \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/london-tube.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/london-tube.min.css.gz new file mode 100644 index 00000000..2c63ad05 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/london-tube.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/macintosh.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/macintosh.min.css.br new file mode 100644 index 00000000..e7f762d1 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/macintosh.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/macintosh.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/macintosh.min.css.gz new file mode 100644 index 00000000..5e914a0e Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/macintosh.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/marrakesh.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/marrakesh.min.css.br new file mode 100644 index 00000000..3b314b45 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/marrakesh.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/marrakesh.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/marrakesh.min.css.gz new file mode 100644 index 00000000..285b5c53 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/marrakesh.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/materia.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/materia.min.css.br new file mode 100644 index 00000000..83cd3c82 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/materia.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/materia.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/materia.min.css.gz new file mode 100644 index 00000000..3c9c3586 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/materia.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/material-darker.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/material-darker.min.css.br new file mode 100644 index 00000000..564c4f3e Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/material-darker.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/material-darker.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/material-darker.min.css.gz new file mode 100644 index 00000000..0cf43b56 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/material-darker.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/material-lighter.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/material-lighter.min.css.br new file mode 100644 index 00000000..dd996e8d Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/material-lighter.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/material-lighter.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/material-lighter.min.css.gz new file mode 100644 index 00000000..6766958c Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/material-lighter.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/material-palenight.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/material-palenight.min.css.br new file mode 100644 index 00000000..44680d15 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/material-palenight.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/material-palenight.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/material-palenight.min.css.gz new file mode 100644 index 00000000..32cedf06 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/material-palenight.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/material-vivid.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/material-vivid.min.css.br new file mode 100644 index 00000000..7f2ef052 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/material-vivid.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/material-vivid.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/material-vivid.min.css.gz new file mode 100644 index 00000000..1a7d566b Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/material-vivid.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/material.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/material.min.css.br new file mode 100644 index 00000000..131a1775 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/material.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/material.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/material.min.css.gz new file mode 100644 index 00000000..b9752e65 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/material.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/mellow-purple.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/mellow-purple.min.css.br new file mode 100644 index 00000000..fa504515 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/mellow-purple.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/mellow-purple.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/mellow-purple.min.css.gz new file mode 100644 index 00000000..1bb3e630 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/mellow-purple.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/mexico-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/mexico-light.min.css.br new file mode 100644 index 00000000..575f70e8 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/mexico-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/mexico-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/mexico-light.min.css.gz new file mode 100644 index 00000000..9b80c8aa Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/mexico-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/mocha.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/mocha.min.css.br new file mode 100644 index 00000000..3b0c30ab Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/mocha.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/mocha.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/mocha.min.css.gz new file mode 100644 index 00000000..46c93a21 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/mocha.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/monokai.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/monokai.min.css.br new file mode 100644 index 00000000..8cfb5097 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/monokai.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/monokai.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/monokai.min.css.gz new file mode 100644 index 00000000..ed491d3e Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/monokai.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/nebula.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/nebula.min.css.br new file mode 100644 index 00000000..3a82ad71 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/nebula.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/nebula.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/nebula.min.css.gz new file mode 100644 index 00000000..95762bb8 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/nebula.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/nord.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/nord.min.css.br new file mode 100644 index 00000000..d9140ccb Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/nord.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/nord.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/nord.min.css.gz new file mode 100644 index 00000000..2835f406 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/nord.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/nova.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/nova.min.css.br new file mode 100644 index 00000000..ebf1a33b Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/nova.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/nova.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/nova.min.css.gz new file mode 100644 index 00000000..f840bd5c Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/nova.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ocean.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ocean.min.css.br new file mode 100644 index 00000000..6dfc34a1 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ocean.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ocean.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ocean.min.css.gz new file mode 100644 index 00000000..1cf65d1c Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ocean.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/oceanicnext.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/oceanicnext.min.css.br new file mode 100644 index 00000000..5b6a8764 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/oceanicnext.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/oceanicnext.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/oceanicnext.min.css.gz new file mode 100644 index 00000000..dbf8f797 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/oceanicnext.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/one-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/one-light.min.css.br new file mode 100644 index 00000000..b95a2f06 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/one-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/one-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/one-light.min.css.gz new file mode 100644 index 00000000..dd95d233 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/one-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/onedark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/onedark.min.css.br new file mode 100644 index 00000000..d20a4894 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/onedark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/onedark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/onedark.min.css.gz new file mode 100644 index 00000000..ab9cdae4 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/onedark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/outrun-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/outrun-dark.min.css.br new file mode 100644 index 00000000..beda82b6 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/outrun-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/outrun-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/outrun-dark.min.css.gz new file mode 100644 index 00000000..9479ede2 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/outrun-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/papercolor-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/papercolor-dark.min.css.br new file mode 100644 index 00000000..dac9b4d9 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/papercolor-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/papercolor-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/papercolor-dark.min.css.gz new file mode 100644 index 00000000..882f0812 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/papercolor-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/papercolor-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/papercolor-light.min.css.br new file mode 100644 index 00000000..d0cf784a Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/papercolor-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/papercolor-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/papercolor-light.min.css.gz new file mode 100644 index 00000000..441a4575 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/papercolor-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/paraiso.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/paraiso.min.css.br new file mode 100644 index 00000000..0fc0c7c3 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/paraiso.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/paraiso.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/paraiso.min.css.gz new file mode 100644 index 00000000..eb99f643 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/paraiso.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/pasque.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/pasque.min.css.br new file mode 100644 index 00000000..e3fcb101 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/pasque.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/pasque.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/pasque.min.css.gz new file mode 100644 index 00000000..2b52e981 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/pasque.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/phd.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/phd.min.css.br new file mode 100644 index 00000000..f0f2ce52 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/phd.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/phd.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/phd.min.css.gz new file mode 100644 index 00000000..cfc836d9 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/phd.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/pico.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/pico.min.css.br new file mode 100644 index 00000000..a308b0d9 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/pico.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/pico.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/pico.min.css.gz new file mode 100644 index 00000000..bdb6fa4d Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/pico.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/pop.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/pop.min.css.br new file mode 100644 index 00000000..e181f529 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/pop.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/pop.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/pop.min.css.gz new file mode 100644 index 00000000..dd087487 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/pop.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/porple.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/porple.min.css.br new file mode 100644 index 00000000..4de68853 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/porple.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/porple.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/porple.min.css.gz new file mode 100644 index 00000000..34cc609b Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/porple.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/qualia.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/qualia.min.css.br new file mode 100644 index 00000000..e681b620 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/qualia.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/qualia.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/qualia.min.css.gz new file mode 100644 index 00000000..809d5c28 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/qualia.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/railscasts.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/railscasts.min.css.br new file mode 100644 index 00000000..1aa8af7f Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/railscasts.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/railscasts.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/railscasts.min.css.gz new file mode 100644 index 00000000..405981cb Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/railscasts.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/rebecca.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/rebecca.min.css.br new file mode 100644 index 00000000..5f0f5905 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/rebecca.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/rebecca.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/rebecca.min.css.gz new file mode 100644 index 00000000..8851e84e Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/rebecca.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ros-pine-dawn.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ros-pine-dawn.min.css.br new file mode 100644 index 00000000..27fc68de Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ros-pine-dawn.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ros-pine-dawn.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ros-pine-dawn.min.css.gz new file mode 100644 index 00000000..d69c59e8 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ros-pine-dawn.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ros-pine-moon.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ros-pine-moon.min.css.br new file mode 100644 index 00000000..6d72edc5 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ros-pine-moon.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ros-pine-moon.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ros-pine-moon.min.css.gz new file mode 100644 index 00000000..ca27e6bd Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ros-pine-moon.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ros-pine.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ros-pine.min.css.br new file mode 100644 index 00000000..96cee1d6 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ros-pine.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ros-pine.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ros-pine.min.css.gz new file mode 100644 index 00000000..1d2c471e Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/ros-pine.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/sagelight.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/sagelight.min.css.br new file mode 100644 index 00000000..02acbe06 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/sagelight.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/sagelight.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/sagelight.min.css.gz new file mode 100644 index 00000000..b2692d75 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/sagelight.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/sandcastle.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/sandcastle.min.css.br new file mode 100644 index 00000000..03b4b392 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/sandcastle.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/sandcastle.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/sandcastle.min.css.gz new file mode 100644 index 00000000..f0a63eed Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/sandcastle.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/seti-ui.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/seti-ui.min.css.br new file mode 100644 index 00000000..d6396a55 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/seti-ui.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/seti-ui.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/seti-ui.min.css.gz new file mode 100644 index 00000000..55b466c0 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/seti-ui.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/shapeshifter.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/shapeshifter.min.css.br new file mode 100644 index 00000000..2ac94b96 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/shapeshifter.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/shapeshifter.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/shapeshifter.min.css.gz new file mode 100644 index 00000000..3a5101bc Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/shapeshifter.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/silk-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/silk-dark.min.css.br new file mode 100644 index 00000000..05a0a00e Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/silk-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/silk-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/silk-dark.min.css.gz new file mode 100644 index 00000000..a3f4f164 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/silk-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/silk-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/silk-light.min.css.br new file mode 100644 index 00000000..07600c69 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/silk-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/silk-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/silk-light.min.css.gz new file mode 100644 index 00000000..712660a2 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/silk-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/snazzy.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/snazzy.min.css.br new file mode 100644 index 00000000..301d0ef0 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/snazzy.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/snazzy.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/snazzy.min.css.gz new file mode 100644 index 00000000..a725f9d4 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/snazzy.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/solar-flare-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/solar-flare-light.min.css.br new file mode 100644 index 00000000..829b8c34 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/solar-flare-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/solar-flare-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/solar-flare-light.min.css.gz new file mode 100644 index 00000000..bc8f80cc Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/solar-flare-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/solar-flare.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/solar-flare.min.css.br new file mode 100644 index 00000000..7d29f20c Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/solar-flare.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/solar-flare.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/solar-flare.min.css.gz new file mode 100644 index 00000000..9c3cf843 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/solar-flare.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/solarized-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/solarized-dark.min.css.br new file mode 100644 index 00000000..bff0d4aa Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/solarized-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/solarized-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/solarized-dark.min.css.gz new file mode 100644 index 00000000..866a2150 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/solarized-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/solarized-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/solarized-light.min.css.br new file mode 100644 index 00000000..c5edeec2 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/solarized-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/solarized-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/solarized-light.min.css.gz new file mode 100644 index 00000000..e6dd7b3d Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/solarized-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/spacemacs.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/spacemacs.min.css.br new file mode 100644 index 00000000..a75baab2 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/spacemacs.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/spacemacs.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/spacemacs.min.css.gz new file mode 100644 index 00000000..9f524216 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/spacemacs.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/summercamp.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/summercamp.min.css.br new file mode 100644 index 00000000..7e981023 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/summercamp.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/summercamp.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/summercamp.min.css.gz new file mode 100644 index 00000000..89787250 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/summercamp.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/summerfruit-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/summerfruit-dark.min.css.br new file mode 100644 index 00000000..de642a8f Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/summerfruit-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/summerfruit-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/summerfruit-dark.min.css.gz new file mode 100644 index 00000000..7292ba31 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/summerfruit-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/summerfruit-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/summerfruit-light.min.css.br new file mode 100644 index 00000000..27783e64 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/summerfruit-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/summerfruit-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/summerfruit-light.min.css.gz new file mode 100644 index 00000000..e3f6e508 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/summerfruit-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/synth-midnight-terminal-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/synth-midnight-terminal-dark.min.css.br new file mode 100644 index 00000000..576eabc0 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/synth-midnight-terminal-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/synth-midnight-terminal-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/synth-midnight-terminal-dark.min.css.gz new file mode 100644 index 00000000..77ddcc80 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/synth-midnight-terminal-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/synth-midnight-terminal-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/synth-midnight-terminal-light.min.css.br new file mode 100644 index 00000000..87a601ef Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/synth-midnight-terminal-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/synth-midnight-terminal-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/synth-midnight-terminal-light.min.css.gz new file mode 100644 index 00000000..2c9cf6da Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/synth-midnight-terminal-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/t3024.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/t3024.min.css.br new file mode 100644 index 00000000..7fa5208b Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/t3024.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/t3024.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/t3024.min.css.gz new file mode 100644 index 00000000..2b43e74b Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/t3024.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/tango.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/tango.min.css.br new file mode 100644 index 00000000..02c634ad Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/tango.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/tango.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/tango.min.css.gz new file mode 100644 index 00000000..10782803 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/tango.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/tender.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/tender.min.css.br new file mode 100644 index 00000000..8c2cefad Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/tender.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/tender.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/tender.min.css.gz new file mode 100644 index 00000000..8ee77e55 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/tender.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/tomorrow-night.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/tomorrow-night.min.css.br new file mode 100644 index 00000000..e304ee54 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/tomorrow-night.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/tomorrow-night.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/tomorrow-night.min.css.gz new file mode 100644 index 00000000..1a6c2a35 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/tomorrow-night.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/tomorrow.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/tomorrow.min.css.br new file mode 100644 index 00000000..8af9b901 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/tomorrow.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/tomorrow.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/tomorrow.min.css.gz new file mode 100644 index 00000000..a0b87497 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/tomorrow.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/twilight.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/twilight.min.css.br new file mode 100644 index 00000000..6122b053 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/twilight.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/twilight.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/twilight.min.css.gz new file mode 100644 index 00000000..94d8a0d3 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/twilight.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/unikitty-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/unikitty-dark.min.css.br new file mode 100644 index 00000000..8532e3e4 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/unikitty-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/unikitty-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/unikitty-dark.min.css.gz new file mode 100644 index 00000000..451c3b99 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/unikitty-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/unikitty-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/unikitty-light.min.css.br new file mode 100644 index 00000000..723c8308 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/unikitty-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/unikitty-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/unikitty-light.min.css.gz new file mode 100644 index 00000000..d5b92812 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/unikitty-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/vulcan.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/vulcan.min.css.br new file mode 100644 index 00000000..4341e3ab Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/vulcan.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/vulcan.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/vulcan.min.css.gz new file mode 100644 index 00000000..605eaebf Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/vulcan.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-10-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-10-light.min.css.br new file mode 100644 index 00000000..f13e5211 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-10-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-10-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-10-light.min.css.gz new file mode 100644 index 00000000..3bff27a5 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-10-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-10.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-10.min.css.br new file mode 100644 index 00000000..063251f0 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-10.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-10.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-10.min.css.gz new file mode 100644 index 00000000..02e830df Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-10.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-95-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-95-light.min.css.br new file mode 100644 index 00000000..0a2f6431 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-95-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-95-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-95-light.min.css.gz new file mode 100644 index 00000000..b171ec75 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-95-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-95.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-95.min.css.br new file mode 100644 index 00000000..89f7d18c Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-95.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-95.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-95.min.css.gz new file mode 100644 index 00000000..308b12a4 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-95.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-high-contrast-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-high-contrast-light.min.css.br new file mode 100644 index 00000000..229cfbbe Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-high-contrast-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-high-contrast-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-high-contrast-light.min.css.gz new file mode 100644 index 00000000..fbb85bf4 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-high-contrast-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-high-contrast.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-high-contrast.min.css.br new file mode 100644 index 00000000..3d56a374 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-high-contrast.min.css.br @@ -0,0 +1,3 @@ +G d\ + *~ϩBya{S3V\TʙT]eOP m?zfBHwƵ3|?H,mKg䡒# [\1aHT5>,=Y7͍Y%Yeczg0ej/cg;ELDiiC甸 ,{r b. +}a$){SuOZi[w?R ƢAސPRym"b? \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-high-contrast.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-high-contrast.min.css.gz new file mode 100644 index 00000000..5bb7376e Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-high-contrast.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-nt-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-nt-light.min.css.br new file mode 100644 index 00000000..0f9d1185 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-nt-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-nt-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-nt-light.min.css.gz new file mode 100644 index 00000000..54ec9892 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-nt-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-nt.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-nt.min.css.br new file mode 100644 index 00000000..4e6cadff Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-nt.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-nt.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-nt.min.css.gz new file mode 100644 index 00000000..66729b9d Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/windows-nt.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/woodland.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/woodland.min.css.br new file mode 100644 index 00000000..b724ae7b Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/woodland.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/woodland.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/woodland.min.css.gz new file mode 100644 index 00000000..bb4249a8 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/woodland.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/xcode-dusk.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/xcode-dusk.min.css.br new file mode 100644 index 00000000..1b0ae952 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/xcode-dusk.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/xcode-dusk.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/xcode-dusk.min.css.gz new file mode 100644 index 00000000..a844f44b Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/xcode-dusk.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/zenburn.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/zenburn.min.css.br new file mode 100644 index 00000000..572b9585 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/zenburn.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/zenburn.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/zenburn.min.css.gz new file mode 100644 index 00000000..a5975dd3 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/base16/zenburn.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/brown-paper.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/brown-paper.min.css.br new file mode 100644 index 00000000..35f761d4 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/brown-paper.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/brown-paper.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/brown-paper.min.css.gz new file mode 100644 index 00000000..6b7a6488 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/brown-paper.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/codepen-embed.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/codepen-embed.min.css.br new file mode 100644 index 00000000..789e49d8 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/codepen-embed.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/codepen-embed.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/codepen-embed.min.css.gz new file mode 100644 index 00000000..0167c3e7 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/codepen-embed.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/color-brewer.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/color-brewer.min.css.br new file mode 100644 index 00000000..16ae0b92 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/color-brewer.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/color-brewer.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/color-brewer.min.css.gz new file mode 100644 index 00000000..0f01c8b6 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/color-brewer.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/dark.min.css.br new file mode 100644 index 00000000..1c95753b Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/dark.min.css.gz new file mode 100644 index 00000000..b015bd41 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/default.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/default.min.css.br new file mode 100644 index 00000000..73873f22 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/default.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/default.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/default.min.css.gz new file mode 100644 index 00000000..8c33f9fa Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/default.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/devibeans.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/devibeans.min.css.br new file mode 100644 index 00000000..8d317c59 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/devibeans.min.css.br @@ -0,0 +1,3 @@ +0 dضu H;FAd>2htj7ei,jmkjpfuAc"D13I~m\VclL+d0#ɂ;lI0. +v糡wymDLW m"cF~BhBt6|FxDQHmX]egRZa0&5 xH/gJPxޕ%=YEơ +!tB7طFp<8lk5)ەxnM \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/devibeans.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/devibeans.min.css.gz new file mode 100644 index 00000000..984448f6 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/devibeans.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/docco.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/docco.min.css.br new file mode 100644 index 00000000..a96af395 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/docco.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/docco.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/docco.min.css.gz new file mode 100644 index 00000000..59334105 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/docco.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/far.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/far.min.css.br new file mode 100644 index 00000000..d34d7fce Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/far.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/far.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/far.min.css.gz new file mode 100644 index 00000000..e3fcc661 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/far.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/foundation.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/foundation.min.css.br new file mode 100644 index 00000000..e992a1ff Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/foundation.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/foundation.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/foundation.min.css.gz new file mode 100644 index 00000000..e45a26fc Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/foundation.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/github-dark-dimmed.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/github-dark-dimmed.min.css.br new file mode 100644 index 00000000..31fee91f Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/github-dark-dimmed.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/github-dark-dimmed.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/github-dark-dimmed.min.css.gz new file mode 100644 index 00000000..7635c2cb Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/github-dark-dimmed.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/github-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/github-dark.min.css.br new file mode 100644 index 00000000..51110cb4 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/github-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/github-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/github-dark.min.css.gz new file mode 100644 index 00000000..fd81bacf Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/github-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/github.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/github.min.css.br new file mode 100644 index 00000000..5a996167 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/github.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/github.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/github.min.css.gz new file mode 100644 index 00000000..c8c89cff Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/github.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/gml.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/gml.min.css.br new file mode 100644 index 00000000..0cc87d8c Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/gml.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/gml.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/gml.min.css.gz new file mode 100644 index 00000000..4c36f63b Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/gml.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/googlecode.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/googlecode.min.css.br new file mode 100644 index 00000000..cc218715 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/googlecode.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/googlecode.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/googlecode.min.css.gz new file mode 100644 index 00000000..f7774299 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/googlecode.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/gradient-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/gradient-dark.min.css.br new file mode 100644 index 00000000..daabefd4 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/gradient-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/gradient-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/gradient-dark.min.css.gz new file mode 100644 index 00000000..6eac1073 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/gradient-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/gradient-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/gradient-light.min.css.br new file mode 100644 index 00000000..700a2efc Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/gradient-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/gradient-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/gradient-light.min.css.gz new file mode 100644 index 00000000..54c9616a Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/gradient-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/grayscale.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/grayscale.min.css.br new file mode 100644 index 00000000..b3d25e08 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/grayscale.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/grayscale.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/grayscale.min.css.gz new file mode 100644 index 00000000..14fc3bcf Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/grayscale.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/hybrid.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/hybrid.min.css.br new file mode 100644 index 00000000..b23ab3f8 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/hybrid.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/hybrid.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/hybrid.min.css.gz new file mode 100644 index 00000000..4305c815 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/hybrid.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/idea.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/idea.min.css.br new file mode 100644 index 00000000..fa436e70 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/idea.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/idea.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/idea.min.css.gz new file mode 100644 index 00000000..88118b6d Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/idea.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/ir-black.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/ir-black.min.css.br new file mode 100644 index 00000000..47163955 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/ir-black.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/ir-black.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/ir-black.min.css.gz new file mode 100644 index 00000000..56092df6 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/ir-black.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/isbl-editor-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/isbl-editor-dark.min.css.br new file mode 100644 index 00000000..1eb7b506 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/isbl-editor-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/isbl-editor-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/isbl-editor-dark.min.css.gz new file mode 100644 index 00000000..2a6bc115 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/isbl-editor-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/isbl-editor-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/isbl-editor-light.min.css.br new file mode 100644 index 00000000..912f91d0 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/isbl-editor-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/isbl-editor-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/isbl-editor-light.min.css.gz new file mode 100644 index 00000000..e7a3d4fd Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/isbl-editor-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/kimbie-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/kimbie-dark.min.css.br new file mode 100644 index 00000000..061c8693 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/kimbie-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/kimbie-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/kimbie-dark.min.css.gz new file mode 100644 index 00000000..5fe8901f Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/kimbie-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/kimbie-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/kimbie-light.min.css.br new file mode 100644 index 00000000..39eda822 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/kimbie-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/kimbie-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/kimbie-light.min.css.gz new file mode 100644 index 00000000..7e48b60a Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/kimbie-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/lightfair.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/lightfair.min.css.br new file mode 100644 index 00000000..3e1cecb8 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/lightfair.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/lightfair.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/lightfair.min.css.gz new file mode 100644 index 00000000..cc258bee Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/lightfair.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/lioshi.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/lioshi.min.css.br new file mode 100644 index 00000000..8524f9e7 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/lioshi.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/lioshi.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/lioshi.min.css.gz new file mode 100644 index 00000000..8656cb08 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/lioshi.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/magula.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/magula.min.css.br new file mode 100644 index 00000000..15ab6608 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/magula.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/magula.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/magula.min.css.gz new file mode 100644 index 00000000..0d3efdac Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/magula.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/mono-blue.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/mono-blue.min.css.br new file mode 100644 index 00000000..33d64839 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/mono-blue.min.css.br @@ -0,0 +1 @@ +$`dض7T[Z2ąnnA7$|2~3DPSÂ)l?, f @. #!4?6Wۙ,8%{SCqPwMSbSLmmt&WgP) D_g]o.Q >%/kb_RÊ,oPN:!BJCO5Nϟ]~ \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/mono-blue.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/mono-blue.min.css.gz new file mode 100644 index 00000000..71adc075 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/mono-blue.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/monokai-sublime.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/monokai-sublime.min.css.br new file mode 100644 index 00000000..495f3576 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/monokai-sublime.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/monokai-sublime.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/monokai-sublime.min.css.gz new file mode 100644 index 00000000..6ea81255 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/monokai-sublime.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/monokai.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/monokai.min.css.br new file mode 100644 index 00000000..447515d6 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/monokai.min.css.br @@ -0,0 +1 @@ +@Ĺ喝2GnREƢ 1mY- ٣*m=aI\oE7 yb4ŌuY6B;%lC}K셱bQ%C<Dk}lDz؉t㈓@EF3.ZV=X4ר9u'I;*By $/@LhcX #uYZ$m*Zf|H;ji$Zm \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/monokai.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/monokai.min.css.gz new file mode 100644 index 00000000..0cd191e4 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/monokai.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/night-owl.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/night-owl.min.css.br new file mode 100644 index 00000000..da383e29 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/night-owl.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/night-owl.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/night-owl.min.css.gz new file mode 100644 index 00000000..fc466cba Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/night-owl.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/nnfx-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/nnfx-dark.min.css.br new file mode 100644 index 00000000..d7040787 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/nnfx-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/nnfx-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/nnfx-dark.min.css.gz new file mode 100644 index 00000000..9c8bf7f5 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/nnfx-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/nnfx-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/nnfx-light.min.css.br new file mode 100644 index 00000000..362dbe2a Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/nnfx-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/nnfx-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/nnfx-light.min.css.gz new file mode 100644 index 00000000..82085751 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/nnfx-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/nord.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/nord.min.css.br new file mode 100644 index 00000000..f32ecb5a Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/nord.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/nord.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/nord.min.css.gz new file mode 100644 index 00000000..9ff5a782 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/nord.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/obsidian.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/obsidian.min.css.br new file mode 100644 index 00000000..0ceceb64 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/obsidian.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/obsidian.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/obsidian.min.css.gz new file mode 100644 index 00000000..0b0e1d40 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/obsidian.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/paraiso-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/paraiso-dark.min.css.br new file mode 100644 index 00000000..91e4a0ed Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/paraiso-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/paraiso-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/paraiso-dark.min.css.gz new file mode 100644 index 00000000..207cf99a Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/paraiso-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/paraiso-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/paraiso-light.min.css.br new file mode 100644 index 00000000..75b97bc0 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/paraiso-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/paraiso-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/paraiso-light.min.css.gz new file mode 100644 index 00000000..23cfb97a Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/paraiso-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/pojoaque.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/pojoaque.min.css.br new file mode 100644 index 00000000..0bd61970 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/pojoaque.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/pojoaque.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/pojoaque.min.css.gz new file mode 100644 index 00000000..55169d3b Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/pojoaque.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/purebasic.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/purebasic.min.css.br new file mode 100644 index 00000000..6ce50770 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/purebasic.min.css.br @@ -0,0 +1 @@ + dp^,[yɴMŊ'1fYC0 (U@+9ͤ/K :E۶bGǪ4`u61ӫ?Sj b2&W0¨Òƕ4#$:ւA:%(=:^U_&ېtjƩ+ᎠC^lR2<,C JmUjp71[E.CTl/Y*ȳ \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/purebasic.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/purebasic.min.css.gz new file mode 100644 index 00000000..73119fdd Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/purebasic.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/qtcreator-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/qtcreator-dark.min.css.br new file mode 100644 index 00000000..e5d3137e Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/qtcreator-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/qtcreator-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/qtcreator-dark.min.css.gz new file mode 100644 index 00000000..237a5c76 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/qtcreator-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/qtcreator-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/qtcreator-light.min.css.br new file mode 100644 index 00000000..aadb68c5 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/qtcreator-light.min.css.br @@ -0,0 +1,2 @@ + dضygAMj_~_T` v;"64x~5Pcuf(CK424< yU(qew:9.sk"DaJ/f#0ck1UYhAQ͕s(gX +e[/RqjOH*(fG)f+2Qb\ 3)>4or;O5 $0$!h;ƃ\xk1 \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/qtcreator-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/qtcreator-light.min.css.gz new file mode 100644 index 00000000..1c4e11da Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/qtcreator-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/rainbow.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/rainbow.min.css.br new file mode 100644 index 00000000..8844d253 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/rainbow.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/rainbow.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/rainbow.min.css.gz new file mode 100644 index 00000000..0c793a9b Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/rainbow.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/routeros.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/routeros.min.css.br new file mode 100644 index 00000000..53950a44 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/routeros.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/routeros.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/routeros.min.css.gz new file mode 100644 index 00000000..c49bb64c Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/routeros.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/school-book.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/school-book.min.css.br new file mode 100644 index 00000000..f959d81f --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/school-book.min.css.br @@ -0,0 +1,3 @@ +U dp^,#Z!^l3]k stm,M!Ec5TuvKK? +ӆװhPW-.!5"=৚랬ۙmOA%W! e[LeSVD +SܣQoK1K 4wwy`b51n$R'rj=҈wC޾ \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/school-book.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/school-book.min.css.gz new file mode 100644 index 00000000..8d8be1cb Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/school-book.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/shades-of-purple.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/shades-of-purple.min.css.br new file mode 100644 index 00000000..9cde69b1 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/shades-of-purple.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/shades-of-purple.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/shades-of-purple.min.css.gz new file mode 100644 index 00000000..ba556c9a Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/shades-of-purple.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/srcery.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/srcery.min.css.br new file mode 100644 index 00000000..77d363e9 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/srcery.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/srcery.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/srcery.min.css.gz new file mode 100644 index 00000000..3f141ab8 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/srcery.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/stackoverflow-dark.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/stackoverflow-dark.min.css.br new file mode 100644 index 00000000..3197ccab Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/stackoverflow-dark.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/stackoverflow-dark.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/stackoverflow-dark.min.css.gz new file mode 100644 index 00000000..1bfc66a7 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/stackoverflow-dark.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/stackoverflow-light.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/stackoverflow-light.min.css.br new file mode 100644 index 00000000..84525355 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/stackoverflow-light.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/stackoverflow-light.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/stackoverflow-light.min.css.gz new file mode 100644 index 00000000..2bfe27c0 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/stackoverflow-light.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/sunburst.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/sunburst.min.css.br new file mode 100644 index 00000000..7711e0ac Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/sunburst.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/sunburst.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/sunburst.min.css.gz new file mode 100644 index 00000000..9f8d6e82 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/sunburst.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/tomorrow-night-blue.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/tomorrow-night-blue.min.css.br new file mode 100644 index 00000000..eb3efb3e Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/tomorrow-night-blue.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/tomorrow-night-blue.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/tomorrow-night-blue.min.css.gz new file mode 100644 index 00000000..cad89099 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/tomorrow-night-blue.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/tomorrow-night-bright.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/tomorrow-night-bright.min.css.br new file mode 100644 index 00000000..66d86e06 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/tomorrow-night-bright.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/tomorrow-night-bright.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/tomorrow-night-bright.min.css.gz new file mode 100644 index 00000000..bf399f1c Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/tomorrow-night-bright.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/vs.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/vs.min.css.br new file mode 100644 index 00000000..65b35387 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/vs.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/vs.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/vs.min.css.gz new file mode 100644 index 00000000..262d43ae Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/vs.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/vs2015.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/vs2015.min.css.br new file mode 100644 index 00000000..bf4f4799 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/vs2015.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/vs2015.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/vs2015.min.css.gz new file mode 100644 index 00000000..b99772c3 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/vs2015.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/xcode.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/xcode.min.css.br new file mode 100644 index 00000000..be1b05d9 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/xcode.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/xcode.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/xcode.min.css.gz new file mode 100644 index 00000000..2a6aec2a Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/xcode.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/xt256.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/xt256.min.css.br new file mode 100644 index 00000000..6db74021 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/xt256.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/xt256.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/xt256.min.css.gz new file mode 100644 index 00000000..dee0b746 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor.Markdown/code-styles/xt256.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor/MudBlazor.min.css b/app/MindWork AI Studio/wwwroot/system/MudBlazor/MudBlazor.min.css index e14e6c3a..13c10368 100755 --- a/app/MindWork AI Studio/wwwroot/system/MudBlazor/MudBlazor.min.css +++ b/app/MindWork AI Studio/wwwroot/system/MudBlazor/MudBlazor.min.css @@ -2,4 +2,4 @@ * MudBlazor (https://mudblazor.com/) * Copyright (c) 2021 MudBlazor * Licensed under MIT (https://github.com/MudBlazor/MudBlazor/blob/master/LICENSE) - */.mud-primary{background-color:var(--mud-palette-primary) !important}.mud-primary-text{color:var(--mud-palette-primary) !important;--mud-ripple-color: var(--mud-palette-primary) !important}.mud-primary-hover{background-color:var(--mud-palette-primary-hover) !important}@media(hover: hover)and (pointer: fine){.hover\:mud-primary-hover:hover{background-color:var(--mud-palette-primary-hover) !important}}.hover\:mud-primary-hover:focus-visible,.hover\:mud-primary-hover:active{background-color:var(--mud-palette-primary-hover) !important}.mud-border-primary{border-color:var(--mud-palette-primary) !important}.mud-theme-primary{color:var(--mud-palette-primary-text) !important;background-color:var(--mud-palette-primary) !important}.mud-secondary{background-color:var(--mud-palette-secondary) !important}.mud-secondary-text{color:var(--mud-palette-secondary) !important;--mud-ripple-color: var(--mud-palette-secondary) !important}.mud-secondary-hover{background-color:var(--mud-palette-secondary-hover) !important}@media(hover: hover)and (pointer: fine){.hover\:mud-secondary-hover:hover{background-color:var(--mud-palette-secondary-hover) !important}}.hover\:mud-secondary-hover:focus-visible,.hover\:mud-secondary-hover:active{background-color:var(--mud-palette-secondary-hover) !important}.mud-border-secondary{border-color:var(--mud-palette-secondary) !important}.mud-theme-secondary{color:var(--mud-palette-secondary-text) !important;background-color:var(--mud-palette-secondary) !important}.mud-tertiary{background-color:var(--mud-palette-tertiary) !important}.mud-tertiary-text{color:var(--mud-palette-tertiary) !important;--mud-ripple-color: var(--mud-palette-tertiary) !important}.mud-tertiary-hover{background-color:var(--mud-palette-tertiary-hover) !important}@media(hover: hover)and (pointer: fine){.hover\:mud-tertiary-hover:hover{background-color:var(--mud-palette-tertiary-hover) !important}}.hover\:mud-tertiary-hover:focus-visible,.hover\:mud-tertiary-hover:active{background-color:var(--mud-palette-tertiary-hover) !important}.mud-border-tertiary{border-color:var(--mud-palette-tertiary) !important}.mud-theme-tertiary{color:var(--mud-palette-tertiary-text) !important;background-color:var(--mud-palette-tertiary) !important}.mud-info{background-color:var(--mud-palette-info) !important}.mud-info-text{color:var(--mud-palette-info) !important;--mud-ripple-color: var(--mud-palette-info) !important}.mud-info-hover{background-color:var(--mud-palette-info-hover) !important}@media(hover: hover)and (pointer: fine){.hover\:mud-info-hover:hover{background-color:var(--mud-palette-info-hover) !important}}.hover\:mud-info-hover:focus-visible,.hover\:mud-info-hover:active{background-color:var(--mud-palette-info-hover) !important}.mud-border-info{border-color:var(--mud-palette-info) !important}.mud-theme-info{color:var(--mud-palette-info-text) !important;background-color:var(--mud-palette-info) !important}.mud-success{background-color:var(--mud-palette-success) !important}.mud-success-text{color:var(--mud-palette-success) !important;--mud-ripple-color: var(--mud-palette-success) !important}.mud-success-hover{background-color:var(--mud-palette-success-hover) !important}@media(hover: hover)and (pointer: fine){.hover\:mud-success-hover:hover{background-color:var(--mud-palette-success-hover) !important}}.hover\:mud-success-hover:focus-visible,.hover\:mud-success-hover:active{background-color:var(--mud-palette-success-hover) !important}.mud-border-success{border-color:var(--mud-palette-success) !important}.mud-theme-success{color:var(--mud-palette-success-text) !important;background-color:var(--mud-palette-success) !important}.mud-warning{background-color:var(--mud-palette-warning) !important}.mud-warning-text{color:var(--mud-palette-warning) !important;--mud-ripple-color: var(--mud-palette-warning) !important}.mud-warning-hover{background-color:var(--mud-palette-warning-hover) !important}@media(hover: hover)and (pointer: fine){.hover\:mud-warning-hover:hover{background-color:var(--mud-palette-warning-hover) !important}}.hover\:mud-warning-hover:focus-visible,.hover\:mud-warning-hover:active{background-color:var(--mud-palette-warning-hover) !important}.mud-border-warning{border-color:var(--mud-palette-warning) !important}.mud-theme-warning{color:var(--mud-palette-warning-text) !important;background-color:var(--mud-palette-warning) !important}.mud-error{background-color:var(--mud-palette-error) !important}.mud-error-text{color:var(--mud-palette-error) !important;--mud-ripple-color: var(--mud-palette-error) !important}.mud-error-hover{background-color:var(--mud-palette-error-hover) !important}@media(hover: hover)and (pointer: fine){.hover\:mud-error-hover:hover{background-color:var(--mud-palette-error-hover) !important}}.hover\:mud-error-hover:focus-visible,.hover\:mud-error-hover:active{background-color:var(--mud-palette-error-hover) !important}.mud-border-error{border-color:var(--mud-palette-error) !important}.mud-theme-error{color:var(--mud-palette-error-text) !important;background-color:var(--mud-palette-error) !important}.mud-dark{background-color:var(--mud-palette-dark) !important}.mud-dark-text{color:var(--mud-palette-dark) !important;--mud-ripple-color: var(--mud-palette-dark) !important}.mud-dark-hover{background-color:var(--mud-palette-dark-hover) !important}@media(hover: hover)and (pointer: fine){.hover\:mud-dark-hover:hover{background-color:var(--mud-palette-dark-hover) !important}}.hover\:mud-dark-hover:focus-visible,.hover\:mud-dark-hover:active{background-color:var(--mud-palette-dark-hover) !important}.mud-border-dark{border-color:var(--mud-palette-dark) !important}.mud-theme-dark{color:var(--mud-palette-dark-text) !important;background-color:var(--mud-palette-dark) !important}.mud-inherit-text{color:inherit !important}.mud-border-lines-default{border-color:var(--mud-palette-lines-default)}.mud-background{background-color:var(--mud-palette-background) !important}.mud-background-gray{background-color:var(--mud-palette-background-gray) !important}.mud-theme-transparent{color:inherit !important;background-color:rgba(0,0,0,0) !important}.mud-transparent{background-color:rgba(0,0,0,0) !important}.mud-transparent-text{color:rgba(0,0,0,0) !important}.mud-text-primary{color:var(--mud-palette-text-primary)}.mud-text-secondary{color:var(--mud-palette-text-secondary)}.mud-text-disabled{color:var(--mud-palette-text-disabled)}.white{background-color:#fff !important}.white-text{color:#fff !important}.black{background-color:#000 !important}.black-text{color:#000 !important}*{box-sizing:border-box;margin:0;padding:0;border-width:0;border-style:solid;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-tap-highlight-color:rgba(0,0,0,0)}strong,b{font-weight:700}body{color:var(--mud-palette-text-primary);font-family:var(--mud-typography-default-family);font-size:var(--mud-typography-default-size);font-weight:var(--mud-typography-default-weight);line-height:var(--mud-typography-default-lineheight);letter-spacing:var(--mud-typography-default-letterspacing);text-transform:var(--mud-typography-default-text-transform);background-color:var(--mud-palette-background)}a{color:var(--mud-palette-text-primary)}.mud-layout{height:100%;width:100%;position:relative}#blazor-error-ui{background-color:var(--mud-palette-error);color:var(--mud-palette-error-text);bottom:0;box-shadow:0 -1px 2px rgba(0,0,0,.2);display:none;left:0;padding:.6rem 1.75rem .7rem 1.25rem;position:fixed;width:100%;z-index:9999}#blazor-error-ui .reload{color:inherit;text-decoration:underline}#blazor-error-ui .dismiss{color:inherit;cursor:pointer;position:absolute;right:.75rem;top:.5rem}#components-reconnect-modal{z-index:9999 !important;background-color:var(--mud-palette-background) !important}#components-reconnect-modal h5{font-size:18px}#components-reconnect-modal button{color:var(--mud-palette-text-primary);padding:8px 16px;font-size:.875rem;min-width:64px;box-sizing:border-box;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;font-weight:500;line-height:1;border-radius:var(--mud-default-borderradius);letter-spacing:.02857em;text-transform:uppercase;margin:40px auto !important}@media(hover: hover)and (pointer: fine){#components-reconnect-modal button:hover{background-color:var(--mud-palette-action-default-hover)}}@keyframes mud-animation-fadein{0%{opacity:0}100%{opacity:1}}@-moz-keyframes mud-animation-fadein{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes mud-animation-fadein{0%{opacity:0}100%{opacity:1}}@-o-keyframes mud-animation-fadein{0%{opacity:0}100%{opacity:1}}@-ms-keyframes mud-animation-fadein{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes mud-scale-up-center{0%{-webkit-transform:scale(0.5);transform:scale(0.5)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes mud-scale-up-center{0%{-webkit-transform:scale(0.5);transform:scale(0.5)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes mud-skeleton-keyframes-pulse{0%{opacity:1}50%{opacity:.4}100%{opacity:1}}@-webkit-keyframes mud-skeleton-keyframes-wave{0%{transform:translateX(-100%)}60%{transform:translateX(100%)}100%{transform:translateX(100%)}}@-webkit-keyframes mud-progress-circular-keyframes-circular-rotate{0%{transform-origin:50% 50%}100%{transform:rotate(360deg)}}@-webkit-keyframes mud-progress-circular-keyframes-circular-dash{0%{stroke-dasharray:1px,200px;stroke-dashoffset:0px}50%{stroke-dasharray:100px,200px;stroke-dashoffset:-15px}100%{stroke-dasharray:100px,200px;stroke-dashoffset:-125px}}@-webkit-keyframes mud-progress-linear-horizontal-keyframes-indeterminate1{0%{left:-35%;right:100%}60%{left:100%;right:-90%}100%{left:100%;right:-90%}}@-webkit-keyframes mud-progress-linear-horizontal-keyframes-indeterminate2{0%{left:-200%;right:100%}60%{left:107%;right:-8%}100%{left:107%;right:-8%}}@-webkit-keyframes mud-progress-linear-horizontal-keyframes-buffer{0%{opacity:1;background-position:0 -23px}50%{opacity:0;background-position:0 -23px}100%{opacity:1;background-position:-200px -23px}}@-webkit-keyframes mud-progress-linear-vertical-keyframes-indeterminate1{0%{bottom:-35%;top:100%}60%{bottom:100%;top:-90%}100%{bottom:100%;top:-90%}}@-webkit-keyframes mud-progress-linear-vertical-keyframes-indeterminate2{0%{bottom:-200%;top:100%}60%{bottom:107%;top:-8%}100%{bottom:107%;top:-8%}}@-webkit-keyframes mud-progress-linear-vertical-keyframes-buffer{0%{opacity:1;background-position:-23px 0}50%{opacity:0;background-position:-23px 0}100%{opacity:1;background-position:-23px -200px}}@keyframes mud-progress-linear-striped-loading{0%{background-position:0 0}100%{background-position:300px 0}}a{text-decoration:none}a:focus-visible{outline:none}label{display:inline-block}button{color:inherit;border:0;cursor:pointer;margin:0;display:inline-flex;outline:0;padding:0;position:relative;align-items:center;user-select:none;border-radius:0;vertical-align:middle;-moz-appearance:none;justify-content:center;text-decoration:none;background-color:rgba(0,0,0,0);-webkit-appearance:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}button:focus{outline:none}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}iframe{border:none;height:100%;width:100%}ul{margin:0;padding:0;list-style:none}.mud-elevation-0{box-shadow:var(--mud-elevation-0)}.mud-elevation-1{box-shadow:var(--mud-elevation-1)}.mud-elevation-2{box-shadow:var(--mud-elevation-2)}.mud-elevation-3{box-shadow:var(--mud-elevation-3)}.mud-elevation-4{box-shadow:var(--mud-elevation-4)}.mud-elevation-5{box-shadow:var(--mud-elevation-5)}.mud-elevation-6{box-shadow:var(--mud-elevation-6)}.mud-elevation-7{box-shadow:var(--mud-elevation-7)}.mud-elevation-8{box-shadow:var(--mud-elevation-8)}.mud-elevation-9{box-shadow:var(--mud-elevation-9)}.mud-elevation-10{box-shadow:var(--mud-elevation-10)}.mud-elevation-11{box-shadow:var(--mud-elevation-11)}.mud-elevation-12{box-shadow:var(--mud-elevation-12)}.mud-elevation-13{box-shadow:var(--mud-elevation-13)}.mud-elevation-14{box-shadow:var(--mud-elevation-14)}.mud-elevation-15{box-shadow:var(--mud-elevation-15)}.mud-elevation-16{box-shadow:var(--mud-elevation-16)}.mud-elevation-17{box-shadow:var(--mud-elevation-17)}.mud-elevation-18{box-shadow:var(--mud-elevation-18)}.mud-elevation-19{box-shadow:var(--mud-elevation-19)}.mud-elevation-20{box-shadow:var(--mud-elevation-20)}.mud-elevation-21{box-shadow:var(--mud-elevation-21)}.mud-elevation-22{box-shadow:var(--mud-elevation-22)}.mud-elevation-23{box-shadow:var(--mud-elevation-23)}.mud-elevation-24{box-shadow:var(--mud-elevation-24)}.mud-elevation-25{box-shadow:var(--mud-elevation-25)}.mud-alert{display:flex;padding:6px 16px;border-radius:var(--mud-default-borderradius);background-color:rgba(0,0,0,0);transition:box-shadow 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-alert.mud-square{border-radius:0px}.mud-alert.mud-dense{padding:0px 12px}.mud-alert-text-normal{color:var(--mud-palette-text-primary);background-color:var(--mud-palette-dark-hover)}.mud-alert-text-primary{color:var(--mud-palette-primary-darken);background-color:var(--mud-palette-primary-hover)}.mud-alert-text-primary .mud-alert-icon{color:var(--mud-palette-primary)}.mud-alert-text-secondary{color:var(--mud-palette-secondary-darken);background-color:var(--mud-palette-secondary-hover)}.mud-alert-text-secondary .mud-alert-icon{color:var(--mud-palette-secondary)}.mud-alert-text-tertiary{color:var(--mud-palette-tertiary-darken);background-color:var(--mud-palette-tertiary-hover)}.mud-alert-text-tertiary .mud-alert-icon{color:var(--mud-palette-tertiary)}.mud-alert-text-info{color:var(--mud-palette-info-darken);background-color:var(--mud-palette-info-hover)}.mud-alert-text-info .mud-alert-icon{color:var(--mud-palette-info)}.mud-alert-text-success{color:var(--mud-palette-success-darken);background-color:var(--mud-palette-success-hover)}.mud-alert-text-success .mud-alert-icon{color:var(--mud-palette-success)}.mud-alert-text-warning{color:var(--mud-palette-warning-darken);background-color:var(--mud-palette-warning-hover)}.mud-alert-text-warning .mud-alert-icon{color:var(--mud-palette-warning)}.mud-alert-text-error{color:var(--mud-palette-error-darken);background-color:var(--mud-palette-error-hover)}.mud-alert-text-error .mud-alert-icon{color:var(--mud-palette-error)}.mud-alert-text-dark{color:var(--mud-palette-dark-darken);background-color:var(--mud-palette-dark-hover)}.mud-alert-text-dark .mud-alert-icon{color:var(--mud-palette-dark)}.mud-alert-outlined-normal{color:var(--mud-palette-text-primary);border:1px solid var(--mud-palette-text-primary)}.mud-alert-outlined-primary{color:var(--mud-palette-primary-darken);border:1px solid var(--mud-palette-primary)}.mud-alert-outlined-primary .mud-alert-icon{color:var(--mud-palette-primary)}.mud-alert-outlined-secondary{color:var(--mud-palette-secondary-darken);border:1px solid var(--mud-palette-secondary)}.mud-alert-outlined-secondary .mud-alert-icon{color:var(--mud-palette-secondary)}.mud-alert-outlined-tertiary{color:var(--mud-palette-tertiary-darken);border:1px solid var(--mud-palette-tertiary)}.mud-alert-outlined-tertiary .mud-alert-icon{color:var(--mud-palette-tertiary)}.mud-alert-outlined-info{color:var(--mud-palette-info-darken);border:1px solid var(--mud-palette-info)}.mud-alert-outlined-info .mud-alert-icon{color:var(--mud-palette-info)}.mud-alert-outlined-success{color:var(--mud-palette-success-darken);border:1px solid var(--mud-palette-success)}.mud-alert-outlined-success .mud-alert-icon{color:var(--mud-palette-success)}.mud-alert-outlined-warning{color:var(--mud-palette-warning-darken);border:1px solid var(--mud-palette-warning)}.mud-alert-outlined-warning .mud-alert-icon{color:var(--mud-palette-warning)}.mud-alert-outlined-error{color:var(--mud-palette-error-darken);border:1px solid var(--mud-palette-error)}.mud-alert-outlined-error .mud-alert-icon{color:var(--mud-palette-error)}.mud-alert-outlined-dark{color:var(--mud-palette-dark-darken);border:1px solid var(--mud-palette-dark)}.mud-alert-outlined-dark .mud-alert-icon{color:var(--mud-palette-dark)}.mud-alert-filled-normal{color:var(--mud-palette-dark-text);font-weight:500;background-color:var(--mud-palette-dark)}.mud-alert-filled-normal .mud-alert-close .mud-button-root{color:currentColor}.mud-alert-filled-primary{color:var(--mud-palette-primary-text);font-weight:500;background-color:var(--mud-palette-primary)}.mud-alert-filled-primary .mud-button-root{color:currentColor}.mud-alert-filled-secondary{color:var(--mud-palette-secondary-text);font-weight:500;background-color:var(--mud-palette-secondary)}.mud-alert-filled-secondary .mud-button-root{color:currentColor}.mud-alert-filled-tertiary{color:var(--mud-palette-tertiary-text);font-weight:500;background-color:var(--mud-palette-tertiary)}.mud-alert-filled-tertiary .mud-button-root{color:currentColor}.mud-alert-filled-info{color:var(--mud-palette-info-text);font-weight:500;background-color:var(--mud-palette-info)}.mud-alert-filled-info .mud-button-root{color:currentColor}.mud-alert-filled-success{color:var(--mud-palette-success-text);font-weight:500;background-color:var(--mud-palette-success)}.mud-alert-filled-success .mud-button-root{color:currentColor}.mud-alert-filled-warning{color:var(--mud-palette-warning-text);font-weight:500;background-color:var(--mud-palette-warning)}.mud-alert-filled-warning .mud-button-root{color:currentColor}.mud-alert-filled-error{color:var(--mud-palette-error-text);font-weight:500;background-color:var(--mud-palette-error)}.mud-alert-filled-error .mud-button-root{color:currentColor}.mud-alert-filled-dark{color:var(--mud-palette-dark-text);font-weight:500;background-color:var(--mud-palette-dark)}.mud-alert-filled-dark .mud-button-root{color:currentColor}.mud-alert-icon{display:flex;opacity:.9;padding:7px 0;font-size:22px;margin-right:12px;margin-inline-end:12px;margin-inline-start:unset}.mud-alert-icon.mud-alert-icon-left{margin-right:12px;margin-inline-end:12px;margin-inline-start:unset}.mud-alert-icon.mud-alert-icon-right{margin-left:12px;margin-inline-start:12px;margin-inline-end:unset}.mud-alert-message{padding:9px 0}.mud-alert-position{flex:1;display:flex;align-items:start}.mud-alert-close{display:flex;flex:0;align-items:center;margin-left:8px}.mud-badge-root{position:relative;display:inline-block}.mud-badge-root .mud-badge-wrapper{top:0;left:0;flex:0 1;width:100%;height:100%;display:flex;pointer-events:none;position:absolute}.mud-badge-root .mud-badge-wrapper.mud-badge-top{align-items:flex-start}.mud-badge-root .mud-badge-wrapper.mud-badge-top.left{justify-content:flex-start}.mud-badge-root .mud-badge-wrapper.mud-badge-top.center{justify-content:center}.mud-badge-root .mud-badge-wrapper.mud-badge-top.right{justify-content:flex-end}.mud-badge-root .mud-badge-wrapper.mud-badge-center{align-items:center}.mud-badge-root .mud-badge-wrapper.mud-badge-center.left{justify-content:flex-start}.mud-badge-root .mud-badge-wrapper.mud-badge-center.center{justify-content:center}.mud-badge-root .mud-badge-wrapper.mud-badge-center.right{justify-content:flex-end}.mud-badge-root .mud-badge-wrapper.mud-badge-bottom{align-items:flex-end}.mud-badge-root .mud-badge-wrapper.mud-badge-bottom.left{justify-content:flex-start}.mud-badge-root .mud-badge-wrapper.mud-badge-bottom.center{justify-content:center}.mud-badge-root .mud-badge-wrapper.mud-badge-bottom.right{justify-content:flex-end}.mud-badge{border-radius:10px;font-size:12px;height:20px;letter-spacing:0;min-width:20px;padding:4px 6px;pointer-events:auto;line-height:1;position:absolute;text-align:center;text-indent:0;top:auto;transition:.3s cubic-bezier(0.25, 0.8, 0.5, 1);white-space:nowrap}.mud-badge.mud-badge-default{color:var(--mud-palette-text-primary);background-color:var(--mud-palette-gray-light)}.mud-badge.mud-badge-bordered{border-color:var(--mud-palette-surface);border-style:solid;border-width:2px;padding:3px 4px}.mud-badge.mud-badge-bordered.mud-badge-icon{padding:4px 6px}.mud-badge.mud-badge-icon{width:20px;height:20px}.mud-badge.mud-badge-icon .mud-icon-badge{color:inherit;font-size:12px}.mud-badge.mud-badge-dot{border-radius:50%;height:9px;min-width:0;padding:0;width:9px}.mud-badge.mud-badge{display:flex;align-items:center;justify-content:center}.mud-badge.mud-badge-top.left{inset:auto calc(100% - 4px) calc(100% - 4px) auto}.mud-badge.mud-badge-top.left.mud-badge-overlap{inset:auto calc(100% - 12px) calc(100% - 12px) auto}.mud-badge.mud-badge-top.center{bottom:calc(100% - 4px)}.mud-badge.mud-badge-top.center.mud-badge-overlap{bottom:calc(100% - 12px)}.mud-badge.mud-badge-top.right{inset:auto auto calc(100% - 4px) calc(100% - 4px)}.mud-badge.mud-badge-top.right.mud-badge-overlap{inset:auto auto calc(100% - 12px) calc(100% - 12px)}.mud-badge.mud-badge-center.left{right:calc(100% - 4px)}.mud-badge.mud-badge-center.left.mud-badge-overlap{right:calc(100% - 12px)}.mud-badge.mud-badge-center.right{left:calc(100% - 4px)}.mud-badge.mud-badge-center.right.mud-badge-overlap{left:calc(100% - 12px)}.mud-badge.mud-badge-bottom.left{inset:calc(100% - 4px) calc(100% - 4px) auto auto}.mud-badge.mud-badge-bottom.left.mud-badge-overlap{inset:calc(100% - 12px) calc(100% - 12px) auto auto}.mud-badge.mud-badge-bottom.center{top:calc(100% - 4px)}.mud-badge.mud-badge-bottom.center.mud-badge-overlap{top:calc(100% - 12px)}.mud-badge.mud-badge-bottom.right{inset:calc(100% - 4px) auto auto calc(100% - 4px)}.mud-badge.mud-badge-bottom.right.mud-badge-overlap{inset:calc(100% - 12px) auto auto calc(100% - 12px)}.mud-toolbar{display:flex;position:relative;align-items:center;--mud-internal-toolbar-height: 56px;height:var(--mud-internal-toolbar-height)}.mud-toolbar-gutters{padding-left:16px;padding-right:16px}@media(min-width: 0px)and (orientation: landscape){.mud-toolbar{--mud-internal-toolbar-height: 48px}}@media(min-width: 600px){.mud-toolbar{--mud-internal-toolbar-height: 64px}.mud-toolbar-gutters{padding-left:24px;padding-right:24px}}.mud-toolbar-dense{--mud-internal-toolbar-height: 48px}.mud-toolbar.mud-toolbar-wrap-content{height:auto;min-height:var(--mud-internal-toolbar-height);flex-wrap:wrap}.mud-toolbar.mud-toolbar-wrap-content.mud-toolbar-appbar{min-height:min(var(--mud-appbar-height),var(--mud-internal-toolbar-height))}.mud-tooltip-root{width:fit-content}.mud-tooltip-root.mud-tooltip-inline{display:inline-block}.mud-tooltip{padding:4px 8px;text-align:center;align-items:center;justify-content:center;font-weight:500;font-size:12px;line-height:1.4em;border-radius:var(--mud-default-borderradius);z-index:var(--mud-zindex-tooltip)}.mud-tooltip.mud-tooltip-default{color:var(--mud-palette-dark-text);background-color:var(--mud-palette-gray-darker)}.mud-tooltip.mud-tooltip-default.mud-tooltip-arrow::after{border-color:var(--mud-palette-gray-darker) rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0)}.mud-tooltip.mud-tooltip-center-left:not([data-mudpopover-flip]),.mud-tooltip.mud-tooltip-center-right[data-mudpopover-flip]{transform:translateX(-10px)}.mud-tooltip.mud-tooltip-center-left:not([data-mudpopover-flip]).mud-tooltip-arrow::after,.mud-tooltip.mud-tooltip-center-right[data-mudpopover-flip].mud-tooltip-arrow::after{left:100%;transform:rotate(270deg)}.mud-tooltip.mud-tooltip-center-right:not([data-mudpopover-flip]),.mud-tooltip.mud-tooltip-center-left[data-mudpopover-flip]{transform:translateX(10px)}.mud-tooltip.mud-tooltip-center-right:not([data-mudpopover-flip]).mud-tooltip-arrow::after,.mud-tooltip.mud-tooltip-center-left[data-mudpopover-flip].mud-tooltip-arrow::after{right:100%;transform:rotate(90deg)}.mud-tooltip.mud-tooltip-top-center:not([data-mudpopover-flip]),.mud-tooltip.mud-tooltip-bottom-center[data-mudpopover-flip]{transform:translateY(-10px)}.mud-tooltip.mud-tooltip-top-center:not([data-mudpopover-flip]).mud-tooltip-arrow::after,.mud-tooltip.mud-tooltip-bottom-center[data-mudpopover-flip].mud-tooltip-arrow::after{top:100%;transform:rotate(0deg)}.mud-tooltip.mud-tooltip-bottom-center:not([data-mudpopover-flip]),.mud-tooltip.mud-tooltip-top-center[data-mudpopover-flip]{transform:translateY(10px)}.mud-tooltip.mud-tooltip-bottom-center:not([data-mudpopover-flip]).mud-tooltip-arrow::after,.mud-tooltip.mud-tooltip-top-center[data-mudpopover-flip].mud-tooltip-arrow::after{bottom:100%;transform:rotate(180deg)}.mud-tooltip.mud-tooltip-arrow::after{content:"";position:absolute;border-width:6px;border-style:solid;border-color:rgba(0,0,0,0);border-top-color:inherit}.mud-avatar{display:inline-flex;overflow:hidden;position:relative;align-items:center;flex-shrink:0;line-height:1;user-select:none;border-radius:50%;justify-content:center;color:var(--mud-palette-white);background-color:var(--mud-palette-gray-light)}.mud-avatar.mud-avatar-small{width:24px;height:24px;font-size:.75rem}.mud-avatar.mud-avatar-medium{width:40px;height:40px;font-size:1.25rem}.mud-avatar.mud-avatar-large{width:56px;height:56px;font-size:1.5rem}.mud-avatar-rounded{border-radius:var(--mud-default-borderradius)}.mud-avatar-square{border-radius:0}.mud-avatar>.mud-image{color:rgba(0,0,0,0);width:100%;height:100%;object-fit:cover;text-align:center;text-indent:10000px}.mud-avatar-fallback{width:75%;height:75%}.mud-avatar-outlined{color:var(--mud-palette-text-primary);background-color:unset;border:1px solid var(--mud-palette-text-primary)}.mud-avatar-outlined.mud-avatar-outlined-primary{color:var(--mud-palette-primary);border:1px solid var(--mud-palette-primary)}.mud-avatar-outlined.mud-avatar-outlined-secondary{color:var(--mud-palette-secondary);border:1px solid var(--mud-palette-secondary)}.mud-avatar-outlined.mud-avatar-outlined-tertiary{color:var(--mud-palette-tertiary);border:1px solid var(--mud-palette-tertiary)}.mud-avatar-outlined.mud-avatar-outlined-info{color:var(--mud-palette-info);border:1px solid var(--mud-palette-info)}.mud-avatar-outlined.mud-avatar-outlined-success{color:var(--mud-palette-success);border:1px solid var(--mud-palette-success)}.mud-avatar-outlined.mud-avatar-outlined-warning{color:var(--mud-palette-warning);border:1px solid var(--mud-palette-warning)}.mud-avatar-outlined.mud-avatar-outlined-error{color:var(--mud-palette-error);border:1px solid var(--mud-palette-error)}.mud-avatar-outlined.mud-avatar-outlined-dark{color:var(--mud-palette-dark);border:1px solid var(--mud-palette-dark)}.mud-avatar-filled{color:var(--mud-palette-text-primary);background-color:var(--mud-palette-lines-inputs)}.mud-avatar-filled.mud-avatar-filled-primary{color:var(--mud-palette-primary-text);background-color:var(--mud-palette-primary)}.mud-avatar-filled.mud-avatar-filled-secondary{color:var(--mud-palette-secondary-text);background-color:var(--mud-palette-secondary)}.mud-avatar-filled.mud-avatar-filled-tertiary{color:var(--mud-palette-tertiary-text);background-color:var(--mud-palette-tertiary)}.mud-avatar-filled.mud-avatar-filled-info{color:var(--mud-palette-info-text);background-color:var(--mud-palette-info)}.mud-avatar-filled.mud-avatar-filled-success{color:var(--mud-palette-success-text);background-color:var(--mud-palette-success)}.mud-avatar-filled.mud-avatar-filled-warning{color:var(--mud-palette-warning-text);background-color:var(--mud-palette-warning)}.mud-avatar-filled.mud-avatar-filled-error{color:var(--mud-palette-error-text);background-color:var(--mud-palette-error)}.mud-avatar-filled.mud-avatar-filled-dark{color:var(--mud-palette-dark-text);background-color:var(--mud-palette-dark)}.mud-avatar-group{display:flex}.mud-avatar-group .mud-avatar:first-child{margin-inline-start:0px !important}.mud-avatar-group.mud-avatar-group-outlined.mud-avatar-group-outlined-transparent .mud-avatar:not(.mud-avatar-outlined){border-color:rgba(0,0,0,0)}.mud-avatar-group.mud-avatar-group-outlined.mud-avatar-group-outlined-surface .mud-avatar:not(.mud-avatar-outlined){border-color:var(--mud-palette-surface)}.mud-avatar-group.mud-avatar-group-outlined.mud-avatar-group-outlined-primary .mud-avatar:not(.mud-avatar-outlined){border-color:var(--mud-palette-primary)}.mud-avatar-group.mud-avatar-group-outlined.mud-avatar-group-outlined-secondary .mud-avatar:not(.mud-avatar-outlined){border-color:var(--mud-palette-secondary)}.mud-avatar-group.mud-avatar-group-outlined.mud-avatar-group-outlined-tertiary .mud-avatar:not(.mud-avatar-outlined){border-color:var(--mud-palette-tertiary)}.mud-avatar-group.mud-avatar-group-outlined.mud-avatar-group-outlined-info .mud-avatar:not(.mud-avatar-outlined){border-color:var(--mud-palette-info)}.mud-avatar-group.mud-avatar-group-outlined.mud-avatar-group-outlined-success .mud-avatar:not(.mud-avatar-outlined){border-color:var(--mud-palette-success)}.mud-avatar-group.mud-avatar-group-outlined.mud-avatar-group-outlined-warning .mud-avatar:not(.mud-avatar-outlined){border-color:var(--mud-palette-warning)}.mud-avatar-group.mud-avatar-group-outlined.mud-avatar-group-outlined-error .mud-avatar:not(.mud-avatar-outlined){border-color:var(--mud-palette-error)}.mud-avatar-group.mud-avatar-group-outlined.mud-avatar-group-outlined-dark .mud-avatar:not(.mud-avatar-outlined){border-color:var(--mud-palette-dark)}.mud-avatar-group.mud-avatar-group-outlined .mud-avatar{border:2px solid}.mud-avatar-group.mud-avatar-group-outlined .mud-avatar.mud-avatar-small{width:28px;height:28px}.mud-avatar-group.mud-avatar-group-outlined .mud-avatar.mud-avatar-medium{width:44px;height:44px}.mud-avatar-group.mud-avatar-group-outlined .mud-avatar.mud-avatar-large{width:60px;height:60px}.mud-breadcrumbs{display:flex;flex-wrap:wrap;flex:0 1 auto;align-items:center;list-style-type:none;margin:0;padding:16px 12px}.mud-breadcrumb-separator{padding:0 12px}.mud-breadcrumb-separator>span{color:var(--mud-palette-text-primary);opacity:.38}.mud-breadcrumb-item>a{display:flex;align-items:center}.mud-breadcrumb-item>a>svg.mud-icon-root{margin-right:4px;margin-inline-end:4px;margin-inline-start:unset}.mud-breadcrumb-item.mud-disabled>a{pointer-events:none;color:var(--mud-palette-action-disabled)}.mud-breadcrumbs-expander{cursor:pointer;display:flex;background-color:#eee}@media(hover: hover)and (pointer: fine){.mud-breadcrumbs-expander:hover{background-color:#e0e0e0}}.mud-breadcrumbs-expander>svg{width:26px}.mud-button-root{color:inherit;border:0;cursor:pointer;margin:0;display:inline-flex;outline:0;padding:0;position:relative;align-items:center;user-select:none;border-radius:0;vertical-align:middle;-moz-appearance:none;justify-content:center;text-decoration:none;background-color:rgba(0,0,0,0);-webkit-appearance:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mud-button-root::-moz-focus-inner{border-style:none}.mud-button-root:disabled{color:var(--mud-palette-action-disabled) !important;cursor:default;pointer-events:none}.mud-button{padding:6px 16px;font-family:var(--mud-typography-button-family);font-size:var(--mud-typography-button-size);font-weight:var(--mud-typography-button-weight);line-height:var(--mud-typography-button-lineheight);letter-spacing:var(--mud-typography-button-letterspacing);text-transform:var(--mud-typography-button-text-transform);min-width:64px;box-sizing:border-box;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;border-radius:var(--mud-default-borderradius);color:var(--mud-palette-text-primary);--mud-ripple-color: var(--mud-palette-text-primary)}@media(hover: hover)and (pointer: fine){.mud-button:hover{background-color:var(--mud-palette-action-default-hover)}}.mud-button:focus-visible,.mud-button:active{background-color:var(--mud-palette-action-default-hover)}.mud-button-label{width:100%;display:inherit;align-items:inherit;justify-content:inherit}.mud-button-text{padding:6px 8px}.mud-button-text.mud-button-text-inherit{color:inherit}.mud-button-text.mud-button-text-primary{color:var(--mud-palette-primary);--mud-ripple-color: var(--mud-palette-primary)}@media(hover: hover)and (pointer: fine){.mud-button-text.mud-button-text-primary:hover{background-color:var(--mud-palette-primary-hover)}}.mud-button-text.mud-button-text-primary:focus-visible,.mud-button-text.mud-button-text-primary:active{background-color:var(--mud-palette-primary-hover)}.mud-button-text.mud-button-text-secondary{color:var(--mud-palette-secondary);--mud-ripple-color: var(--mud-palette-secondary)}@media(hover: hover)and (pointer: fine){.mud-button-text.mud-button-text-secondary:hover{background-color:var(--mud-palette-secondary-hover)}}.mud-button-text.mud-button-text-secondary:focus-visible,.mud-button-text.mud-button-text-secondary:active{background-color:var(--mud-palette-secondary-hover)}.mud-button-text.mud-button-text-tertiary{color:var(--mud-palette-tertiary);--mud-ripple-color: var(--mud-palette-tertiary)}@media(hover: hover)and (pointer: fine){.mud-button-text.mud-button-text-tertiary:hover{background-color:var(--mud-palette-tertiary-hover)}}.mud-button-text.mud-button-text-tertiary:focus-visible,.mud-button-text.mud-button-text-tertiary:active{background-color:var(--mud-palette-tertiary-hover)}.mud-button-text.mud-button-text-info{color:var(--mud-palette-info);--mud-ripple-color: var(--mud-palette-info)}@media(hover: hover)and (pointer: fine){.mud-button-text.mud-button-text-info:hover{background-color:var(--mud-palette-info-hover)}}.mud-button-text.mud-button-text-info:focus-visible,.mud-button-text.mud-button-text-info:active{background-color:var(--mud-palette-info-hover)}.mud-button-text.mud-button-text-success{color:var(--mud-palette-success);--mud-ripple-color: var(--mud-palette-success)}@media(hover: hover)and (pointer: fine){.mud-button-text.mud-button-text-success:hover{background-color:var(--mud-palette-success-hover)}}.mud-button-text.mud-button-text-success:focus-visible,.mud-button-text.mud-button-text-success:active{background-color:var(--mud-palette-success-hover)}.mud-button-text.mud-button-text-warning{color:var(--mud-palette-warning);--mud-ripple-color: var(--mud-palette-warning)}@media(hover: hover)and (pointer: fine){.mud-button-text.mud-button-text-warning:hover{background-color:var(--mud-palette-warning-hover)}}.mud-button-text.mud-button-text-warning:focus-visible,.mud-button-text.mud-button-text-warning:active{background-color:var(--mud-palette-warning-hover)}.mud-button-text.mud-button-text-error{color:var(--mud-palette-error);--mud-ripple-color: var(--mud-palette-error)}@media(hover: hover)and (pointer: fine){.mud-button-text.mud-button-text-error:hover{background-color:var(--mud-palette-error-hover)}}.mud-button-text.mud-button-text-error:focus-visible,.mud-button-text.mud-button-text-error:active{background-color:var(--mud-palette-error-hover)}.mud-button-text.mud-button-text-dark{color:var(--mud-palette-dark);--mud-ripple-color: var(--mud-palette-dark)}@media(hover: hover)and (pointer: fine){.mud-button-text.mud-button-text-dark:hover{background-color:var(--mud-palette-dark-hover)}}.mud-button-text.mud-button-text-dark:focus-visible,.mud-button-text.mud-button-text-dark:active{background-color:var(--mud-palette-dark-hover)}.mud-button-outlined{color:var(--mud-palette-text-primary);border:1px solid var(--mud-palette-text-primary);padding:5px 15px}.mud-button-outlined.mud-button-outlined-inherit{color:inherit;border-color:currentColor}.mud-button-outlined.mud-icon-button{padding:5px}@media(hover: hover)and (pointer: fine){.mud-button-outlined:hover{background-color:var(--mud-palette-action-default-hover)}}.mud-button-outlined:focus-visible,.mud-button-outlined:active{background-color:var(--mud-palette-action-default-hover)}.mud-button-outlined.mud-button-outlined-primary{color:var(--mud-palette-primary);--mud-ripple-color: var(--mud-palette-primary);border:1px solid var(--mud-palette-primary)}@media(hover: hover)and (pointer: fine){.mud-button-outlined.mud-button-outlined-primary:hover{border:1px solid var(--mud-palette-primary);background-color:var(--mud-palette-primary-hover)}}.mud-button-outlined.mud-button-outlined-primary:focus-visible,.mud-button-outlined.mud-button-outlined-primary:active{border:1px solid var(--mud-palette-primary);background-color:var(--mud-palette-primary-hover)}.mud-button-outlined.mud-button-outlined-secondary{color:var(--mud-palette-secondary);--mud-ripple-color: var(--mud-palette-secondary);border:1px solid var(--mud-palette-secondary)}@media(hover: hover)and (pointer: fine){.mud-button-outlined.mud-button-outlined-secondary:hover{border:1px solid var(--mud-palette-secondary);background-color:var(--mud-palette-secondary-hover)}}.mud-button-outlined.mud-button-outlined-secondary:focus-visible,.mud-button-outlined.mud-button-outlined-secondary:active{border:1px solid var(--mud-palette-secondary);background-color:var(--mud-palette-secondary-hover)}.mud-button-outlined.mud-button-outlined-tertiary{color:var(--mud-palette-tertiary);--mud-ripple-color: var(--mud-palette-tertiary);border:1px solid var(--mud-palette-tertiary)}@media(hover: hover)and (pointer: fine){.mud-button-outlined.mud-button-outlined-tertiary:hover{border:1px solid var(--mud-palette-tertiary);background-color:var(--mud-palette-tertiary-hover)}}.mud-button-outlined.mud-button-outlined-tertiary:focus-visible,.mud-button-outlined.mud-button-outlined-tertiary:active{border:1px solid var(--mud-palette-tertiary);background-color:var(--mud-palette-tertiary-hover)}.mud-button-outlined.mud-button-outlined-info{color:var(--mud-palette-info);--mud-ripple-color: var(--mud-palette-info);border:1px solid var(--mud-palette-info)}@media(hover: hover)and (pointer: fine){.mud-button-outlined.mud-button-outlined-info:hover{border:1px solid var(--mud-palette-info);background-color:var(--mud-palette-info-hover)}}.mud-button-outlined.mud-button-outlined-info:focus-visible,.mud-button-outlined.mud-button-outlined-info:active{border:1px solid var(--mud-palette-info);background-color:var(--mud-palette-info-hover)}.mud-button-outlined.mud-button-outlined-success{color:var(--mud-palette-success);--mud-ripple-color: var(--mud-palette-success);border:1px solid var(--mud-palette-success)}@media(hover: hover)and (pointer: fine){.mud-button-outlined.mud-button-outlined-success:hover{border:1px solid var(--mud-palette-success);background-color:var(--mud-palette-success-hover)}}.mud-button-outlined.mud-button-outlined-success:focus-visible,.mud-button-outlined.mud-button-outlined-success:active{border:1px solid var(--mud-palette-success);background-color:var(--mud-palette-success-hover)}.mud-button-outlined.mud-button-outlined-warning{color:var(--mud-palette-warning);--mud-ripple-color: var(--mud-palette-warning);border:1px solid var(--mud-palette-warning)}@media(hover: hover)and (pointer: fine){.mud-button-outlined.mud-button-outlined-warning:hover{border:1px solid var(--mud-palette-warning);background-color:var(--mud-palette-warning-hover)}}.mud-button-outlined.mud-button-outlined-warning:focus-visible,.mud-button-outlined.mud-button-outlined-warning:active{border:1px solid var(--mud-palette-warning);background-color:var(--mud-palette-warning-hover)}.mud-button-outlined.mud-button-outlined-error{color:var(--mud-palette-error);--mud-ripple-color: var(--mud-palette-error);border:1px solid var(--mud-palette-error)}@media(hover: hover)and (pointer: fine){.mud-button-outlined.mud-button-outlined-error:hover{border:1px solid var(--mud-palette-error);background-color:var(--mud-palette-error-hover)}}.mud-button-outlined.mud-button-outlined-error:focus-visible,.mud-button-outlined.mud-button-outlined-error:active{border:1px solid var(--mud-palette-error);background-color:var(--mud-palette-error-hover)}.mud-button-outlined.mud-button-outlined-dark{color:var(--mud-palette-dark);--mud-ripple-color: var(--mud-palette-dark);border:1px solid var(--mud-palette-dark)}@media(hover: hover)and (pointer: fine){.mud-button-outlined.mud-button-outlined-dark:hover{border:1px solid var(--mud-palette-dark);background-color:var(--mud-palette-dark-hover)}}.mud-button-outlined.mud-button-outlined-dark:focus-visible,.mud-button-outlined.mud-button-outlined-dark:active{border:1px solid var(--mud-palette-dark);background-color:var(--mud-palette-dark-hover)}.mud-button-outlined:disabled{border:1px solid var(--mud-palette-action-disabled-background)}.mud-button-filled{color:var(--mud-palette-text-primary);--mud-ripple-color: var(--mud-palette-text-primary);--mud-ripple-opacity: var(--mud-ripple-opacity-secondary) !important;box-shadow:0px 3px 1px -2px rgba(0,0,0,.2),0px 2px 2px 0px rgba(0,0,0,.14),0px 1px 5px 0px rgba(0,0,0,.12);background-color:var(--mud-palette-action-default-hover)}.mud-button-filled.mud-icon-button{padding:6px}@media(hover: hover)and (pointer: fine){.mud-button-filled:hover{box-shadow:0px 2px 4px -1px rgba(0,0,0,.2),0px 4px 5px 0px rgba(0,0,0,.14),0px 1px 10px 0px rgba(0,0,0,.12);background-color:var(--mud-palette-action-disabled-background)}}.mud-button-filled:focus-visible{box-shadow:0px 2px 4px -1px rgba(0,0,0,.2),0px 4px 5px 0px rgba(0,0,0,.14),0px 1px 10px 0px rgba(0,0,0,.12);background-color:var(--mud-palette-action-disabled-background)}.mud-button-filled:active{box-shadow:0px 5px 5px -3px rgba(0,0,0,.2),0px 8px 10px 1px rgba(0,0,0,.14),0px 3px 14px 2px rgba(0,0,0,.12);background-color:var(--mud-palette-action-disabled-background)}.mud-button-filled:disabled{color:var(--mud-palette-action-disabled);box-shadow:none;background-color:var(--mud-palette-action-disabled-background) !important}.mud-button-filled.mud-button-filled-primary{color:var(--mud-palette-primary-text);--mud-ripple-color: var(--mud-palette-primary-text);background-color:var(--mud-palette-primary)}@media(hover: hover)and (pointer: fine){.mud-button-filled.mud-button-filled-primary:hover{background-color:var(--mud-palette-primary-darken)}}.mud-button-filled.mud-button-filled-primary:focus-visible,.mud-button-filled.mud-button-filled-primary:active{background-color:var(--mud-palette-primary-darken)}.mud-button-filled.mud-button-filled-secondary{color:var(--mud-palette-secondary-text);--mud-ripple-color: var(--mud-palette-secondary-text);background-color:var(--mud-palette-secondary)}@media(hover: hover)and (pointer: fine){.mud-button-filled.mud-button-filled-secondary:hover{background-color:var(--mud-palette-secondary-darken)}}.mud-button-filled.mud-button-filled-secondary:focus-visible,.mud-button-filled.mud-button-filled-secondary:active{background-color:var(--mud-palette-secondary-darken)}.mud-button-filled.mud-button-filled-tertiary{color:var(--mud-palette-tertiary-text);--mud-ripple-color: var(--mud-palette-tertiary-text);background-color:var(--mud-palette-tertiary)}@media(hover: hover)and (pointer: fine){.mud-button-filled.mud-button-filled-tertiary:hover{background-color:var(--mud-palette-tertiary-darken)}}.mud-button-filled.mud-button-filled-tertiary:focus-visible,.mud-button-filled.mud-button-filled-tertiary:active{background-color:var(--mud-palette-tertiary-darken)}.mud-button-filled.mud-button-filled-info{color:var(--mud-palette-info-text);--mud-ripple-color: var(--mud-palette-info-text);background-color:var(--mud-palette-info)}@media(hover: hover)and (pointer: fine){.mud-button-filled.mud-button-filled-info:hover{background-color:var(--mud-palette-info-darken)}}.mud-button-filled.mud-button-filled-info:focus-visible,.mud-button-filled.mud-button-filled-info:active{background-color:var(--mud-palette-info-darken)}.mud-button-filled.mud-button-filled-success{color:var(--mud-palette-success-text);--mud-ripple-color: var(--mud-palette-success-text);background-color:var(--mud-palette-success)}@media(hover: hover)and (pointer: fine){.mud-button-filled.mud-button-filled-success:hover{background-color:var(--mud-palette-success-darken)}}.mud-button-filled.mud-button-filled-success:focus-visible,.mud-button-filled.mud-button-filled-success:active{background-color:var(--mud-palette-success-darken)}.mud-button-filled.mud-button-filled-warning{color:var(--mud-palette-warning-text);--mud-ripple-color: var(--mud-palette-warning-text);background-color:var(--mud-palette-warning)}@media(hover: hover)and (pointer: fine){.mud-button-filled.mud-button-filled-warning:hover{background-color:var(--mud-palette-warning-darken)}}.mud-button-filled.mud-button-filled-warning:focus-visible,.mud-button-filled.mud-button-filled-warning:active{background-color:var(--mud-palette-warning-darken)}.mud-button-filled.mud-button-filled-error{color:var(--mud-palette-error-text);--mud-ripple-color: var(--mud-palette-error-text);background-color:var(--mud-palette-error)}@media(hover: hover)and (pointer: fine){.mud-button-filled.mud-button-filled-error:hover{background-color:var(--mud-palette-error-darken)}}.mud-button-filled.mud-button-filled-error:focus-visible,.mud-button-filled.mud-button-filled-error:active{background-color:var(--mud-palette-error-darken)}.mud-button-filled.mud-button-filled-dark{color:var(--mud-palette-dark-text);--mud-ripple-color: var(--mud-palette-dark-text);background-color:var(--mud-palette-dark)}@media(hover: hover)and (pointer: fine){.mud-button-filled.mud-button-filled-dark:hover{background-color:var(--mud-palette-dark-darken)}}.mud-button-filled.mud-button-filled-dark:focus-visible,.mud-button-filled.mud-button-filled-dark:active{background-color:var(--mud-palette-dark-darken)}.mud-button-disable-elevation{box-shadow:none}@media(hover: hover)and (pointer: fine){.mud-button-disable-elevation:hover{box-shadow:none}}.mud-button-disable-elevation:active{box-shadow:none}.mud-button-disable-elevation.mud-focus-visible{box-shadow:none}.mud-button-disable-elevation:disabled{box-shadow:none}.mud-button-color-inherit{color:inherit;border-color:currentColor}.mud-button-text-size-small{padding:4px 5px;font-size:.8125rem}.mud-button-text-size-large{padding:8px 11px;font-size:.9375rem}.mud-button-outlined-size-small{padding:3px 9px;font-size:.8125rem}.mud-button-outlined-size-small.mud-icon-button{padding:4px}.mud-button-outlined-size-large{padding:7px 21px;font-size:.9375rem}.mud-button-outlined-size-large.mud-icon-button{padding:4px}.mud-button-filled-size-small{padding:4px 10px;font-size:.8125rem}.mud-button-filled-size-small.mud-icon-button{padding:5px}.mud-button-filled-size-large{padding:8px 22px;font-size:.9375rem}.mud-button-filled-size-large.mud-icon-button{padding:5px}.mud-button-full-width{width:100%}.mud-button-label .mud-button-icon-start{display:inherit;margin-left:-4px;margin-right:8px;margin-inline-start:-4px;margin-inline-end:8px}.mud-button-label .mud-button-icon-start.mud-button-icon-size-small{margin-left:-2px;margin-inline-start:-2px;margin-inline-end:8px}.mud-button-label .mud-button-icon-end{display:inherit;margin-left:8px;margin-right:-4px;margin-inline-start:8px;margin-inline-end:-4px}.mud-button-label .mud-button-icon-end.mud-button-icon-size-small{margin-right:-2px;margin-inline-end:-2px;margin-inline-start:8px}.mud-button-icon-size-small>*:first-child{font-size:18px}.mud-button-icon-size-medium>*:first-child{font-size:20px}.mud-button-icon-size-large>*:first-child{font-size:22px}.mud-button-group-root{border-radius:var(--mud-default-borderradius);display:inline-flex}.mud-button-group-root .mud-button-root{border-radius:var(--mud-default-borderradius)}.mud-button-group-root.mud-button-group-override-styles .mud-button{color:var(--mud-palette-text-primary);--mud-ripple-color: var(--mud-palette-text-primary)}.mud-button-group-root.mud-button-group-override-styles .mud-button-root{background-color:inherit;box-shadow:none;border:none}@media(hover: hover)and (pointer: fine){.mud-button-group-root.mud-button-group-override-styles .mud-button-root:hover{background-color:var(--mud-palette-action-default-hover)}}.mud-button-group-root.mud-button-group-override-styles .mud-button-root:focus-visible,.mud-button-group-root.mud-button-group-override-styles .mud-button-root:active{background-color:var(--mud-palette-action-default-hover)}.mud-button-group-horizontal:not(.mud-button-group-rtl)>.mud-button-root:not(:last-child),.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:last-child) .mud-button-root{border-top-right-radius:0;border-bottom-right-radius:0}.mud-button-group-horizontal:not(.mud-button-group-rtl)>.mud-button-root:not(:first-child),.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-top-left-radius:0;border-bottom-left-radius:0;margin-left:-1px}.mud-button-group-horizontal.mud-button-group-rtl>.mud-button-root:not(:last-child),.mud-button-group-horizontal.mud-button-group-rtl>:not(:last-child) .mud-button-root{border-top-left-radius:0;border-bottom-left-radius:0;margin-left:-1px}.mud-button-group-horizontal.mud-button-group-rtl>.mud-button-root:not(:first-child),.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-top-right-radius:0;border-bottom-right-radius:0}.mud-button-group-vertical{flex-direction:column}.mud-button-group-vertical .mud-icon-button{width:100%}.mud-button-group-vertical>.mud-button-root:not(:last-child),.mud-button-group-vertical>:not(:last-child) .mud-button-root{border-bottom-right-radius:0;border-bottom-left-radius:0}.mud-button-group-vertical>.mud-button-root:not(:first-child),.mud-button-group-vertical>:not(:first-child) .mud-button-root{border-top-right-radius:0;border-top-left-radius:0;margin-top:-1px}.mud-button-group-text.mud-button-group-override-styles .mud-button-root{padding:6px 8px}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-text-primary)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-text-primary)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-vertical .mud-button-root:not(:last-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-vertical>:not(:last-child) .mud-button-root{border-bottom:1px solid var(--mud-palette-text-primary)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-primary .mud-button-root{color:var(--mud-palette-primary);--mud-ripple-color: var(--mud-palette-primary)}@media(hover: hover)and (pointer: fine){.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-primary .mud-button-root:hover{background-color:var(--mud-palette-primary-hover)}}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-primary .mud-button-root:focus-visible,.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-primary .mud-button-root:active{background-color:var(--mud-palette-primary-hover)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-primary.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-primary.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-primary)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-primary.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-primary.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-primary)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-primary.mud-button-group-vertical .mud-button-root:not(:last-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-primary.mud-button-group-vertical>:not(:last-child) .mud-button-root{border-bottom:1px solid var(--mud-palette-primary)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-secondary .mud-button-root{color:var(--mud-palette-secondary);--mud-ripple-color: var(--mud-palette-secondary)}@media(hover: hover)and (pointer: fine){.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-secondary .mud-button-root:hover{background-color:var(--mud-palette-secondary-hover)}}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-secondary .mud-button-root:focus-visible,.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-secondary .mud-button-root:active{background-color:var(--mud-palette-secondary-hover)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-secondary.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-secondary.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-secondary)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-secondary.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-secondary.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-secondary)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-secondary.mud-button-group-vertical .mud-button-root:not(:last-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-secondary.mud-button-group-vertical>:not(:last-child) .mud-button-root{border-bottom:1px solid var(--mud-palette-secondary)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-tertiary .mud-button-root{color:var(--mud-palette-tertiary);--mud-ripple-color: var(--mud-palette-tertiary)}@media(hover: hover)and (pointer: fine){.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-tertiary .mud-button-root:hover{background-color:var(--mud-palette-tertiary-hover)}}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-tertiary .mud-button-root:focus-visible,.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-tertiary .mud-button-root:active{background-color:var(--mud-palette-tertiary-hover)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-tertiary.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-tertiary.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-tertiary)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-tertiary.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-tertiary.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-tertiary)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-tertiary.mud-button-group-vertical .mud-button-root:not(:last-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-tertiary.mud-button-group-vertical>:not(:last-child) .mud-button-root{border-bottom:1px solid var(--mud-palette-tertiary)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-info .mud-button-root{color:var(--mud-palette-info);--mud-ripple-color: var(--mud-palette-info)}@media(hover: hover)and (pointer: fine){.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-info .mud-button-root:hover{background-color:var(--mud-palette-info-hover)}}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-info .mud-button-root:focus-visible,.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-info .mud-button-root:active{background-color:var(--mud-palette-info-hover)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-info.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-info.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-info)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-info.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-info.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-info)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-info.mud-button-group-vertical .mud-button-root:not(:last-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-info.mud-button-group-vertical>:not(:last-child) .mud-button-root{border-bottom:1px solid var(--mud-palette-info)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-success .mud-button-root{color:var(--mud-palette-success);--mud-ripple-color: var(--mud-palette-success)}@media(hover: hover)and (pointer: fine){.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-success .mud-button-root:hover{background-color:var(--mud-palette-success-hover)}}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-success .mud-button-root:focus-visible,.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-success .mud-button-root:active{background-color:var(--mud-palette-success-hover)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-success.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-success.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-success)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-success.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-success.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-success)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-success.mud-button-group-vertical .mud-button-root:not(:last-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-success.mud-button-group-vertical>:not(:last-child) .mud-button-root{border-bottom:1px solid var(--mud-palette-success)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-warning .mud-button-root{color:var(--mud-palette-warning);--mud-ripple-color: var(--mud-palette-warning)}@media(hover: hover)and (pointer: fine){.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-warning .mud-button-root:hover{background-color:var(--mud-palette-warning-hover)}}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-warning .mud-button-root:focus-visible,.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-warning .mud-button-root:active{background-color:var(--mud-palette-warning-hover)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-warning.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-warning.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-warning)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-warning.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-warning.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-warning)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-warning.mud-button-group-vertical .mud-button-root:not(:last-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-warning.mud-button-group-vertical>:not(:last-child) .mud-button-root{border-bottom:1px solid var(--mud-palette-warning)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-error .mud-button-root{color:var(--mud-palette-error);--mud-ripple-color: var(--mud-palette-error)}@media(hover: hover)and (pointer: fine){.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-error .mud-button-root:hover{background-color:var(--mud-palette-error-hover)}}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-error .mud-button-root:focus-visible,.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-error .mud-button-root:active{background-color:var(--mud-palette-error-hover)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-error.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-error.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-error)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-error.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-error.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-error)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-error.mud-button-group-vertical .mud-button-root:not(:last-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-error.mud-button-group-vertical>:not(:last-child) .mud-button-root{border-bottom:1px solid var(--mud-palette-error)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-dark .mud-button-root{color:var(--mud-palette-dark);--mud-ripple-color: var(--mud-palette-dark)}@media(hover: hover)and (pointer: fine){.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-dark .mud-button-root:hover{background-color:var(--mud-palette-dark-hover)}}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-dark .mud-button-root:focus-visible,.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-dark .mud-button-root:active{background-color:var(--mud-palette-dark-hover)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-dark.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-dark.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-dark)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-dark.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-dark.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-dark)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-dark.mud-button-group-vertical .mud-button-root:not(:last-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-dark.mud-button-group-vertical>:not(:last-child) .mud-button-root{border-bottom:1px solid var(--mud-palette-dark)}.mud-button-group-outlined.mud-button-group-override-styles .mud-button-root{padding:5px 15px;border:1px solid var(--mud-palette-text-primary)}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-primary .mud-button-root{color:var(--mud-palette-primary);border:1px solid var(--mud-palette-primary);--mud-ripple-color: var(--mud-palette-primary)}@media(hover: hover)and (pointer: fine){.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-primary .mud-button-root:hover{background-color:var(--mud-palette-primary-hover)}}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-primary .mud-button-root:focus-visible,.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-primary .mud-button-root:active{background-color:var(--mud-palette-primary-hover)}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-secondary .mud-button-root{color:var(--mud-palette-secondary);border:1px solid var(--mud-palette-secondary);--mud-ripple-color: var(--mud-palette-secondary)}@media(hover: hover)and (pointer: fine){.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-secondary .mud-button-root:hover{background-color:var(--mud-palette-secondary-hover)}}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-secondary .mud-button-root:focus-visible,.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-secondary .mud-button-root:active{background-color:var(--mud-palette-secondary-hover)}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-tertiary .mud-button-root{color:var(--mud-palette-tertiary);border:1px solid var(--mud-palette-tertiary);--mud-ripple-color: var(--mud-palette-tertiary)}@media(hover: hover)and (pointer: fine){.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-tertiary .mud-button-root:hover{background-color:var(--mud-palette-tertiary-hover)}}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-tertiary .mud-button-root:focus-visible,.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-tertiary .mud-button-root:active{background-color:var(--mud-palette-tertiary-hover)}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-info .mud-button-root{color:var(--mud-palette-info);border:1px solid var(--mud-palette-info);--mud-ripple-color: var(--mud-palette-info)}@media(hover: hover)and (pointer: fine){.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-info .mud-button-root:hover{background-color:var(--mud-palette-info-hover)}}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-info .mud-button-root:focus-visible,.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-info .mud-button-root:active{background-color:var(--mud-palette-info-hover)}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-success .mud-button-root{color:var(--mud-palette-success);border:1px solid var(--mud-palette-success);--mud-ripple-color: var(--mud-palette-success)}@media(hover: hover)and (pointer: fine){.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-success .mud-button-root:hover{background-color:var(--mud-palette-success-hover)}}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-success .mud-button-root:focus-visible,.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-success .mud-button-root:active{background-color:var(--mud-palette-success-hover)}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-warning .mud-button-root{color:var(--mud-palette-warning);border:1px solid var(--mud-palette-warning);--mud-ripple-color: var(--mud-palette-warning)}@media(hover: hover)and (pointer: fine){.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-warning .mud-button-root:hover{background-color:var(--mud-palette-warning-hover)}}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-warning .mud-button-root:focus-visible,.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-warning .mud-button-root:active{background-color:var(--mud-palette-warning-hover)}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-error .mud-button-root{color:var(--mud-palette-error);border:1px solid var(--mud-palette-error);--mud-ripple-color: var(--mud-palette-error)}@media(hover: hover)and (pointer: fine){.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-error .mud-button-root:hover{background-color:var(--mud-palette-error-hover)}}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-error .mud-button-root:focus-visible,.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-error .mud-button-root:active{background-color:var(--mud-palette-error-hover)}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-dark .mud-button-root{color:var(--mud-palette-dark);border:1px solid var(--mud-palette-dark);--mud-ripple-color: var(--mud-palette-dark)}@media(hover: hover)and (pointer: fine){.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-dark .mud-button-root:hover{background-color:var(--mud-palette-dark-hover)}}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-dark .mud-button-root:focus-visible,.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-dark .mud-button-root:active{background-color:var(--mud-palette-dark-hover)}.mud-button-group-filled{box-shadow:var(--mud-elevation-2)}.mud-button-group-filled .mud-button-root{box-shadow:none}@media(hover: hover)and (pointer: fine){.mud-button-group-filled .mud-button-root:hover{box-shadow:var(--mud-elevation-4)}}.mud-button-group-filled .mud-button-root:focus-visible,.mud-button-group-filled .mud-button-root:active{box-shadow:var(--mud-elevation-4)}.mud-button-group-filled.mud-button-group-override-styles .mud-button-root{background-color:var(--mud-palette-action-default-hover);padding:6px 16px}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-divider)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-divider)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-vertical .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-vertical>:not(:first-child) .mud-button-root{border-top:1px solid var(--mud-palette-divider)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-primary .mud-button-root{background-color:var(--mud-palette-primary);color:var(--mud-palette-primary-text);--mud-ripple-color: var(--mud-palette-primary-text);--mud-ripple-opacity: var(--mud-ripple-opacity-secondary)}@media(hover: hover)and (pointer: fine){.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-primary .mud-button-root:hover{background-color:var(--mud-palette-primary-darken)}}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-primary .mud-button-root:focus-visible,.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-primary .mud-button-root:active{background-color:var(--mud-palette-primary-darken)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-primary.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-primary.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-primary-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-primary.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-primary.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-primary-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-primary.mud-button-group-vertical .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-primary.mud-button-group-vertical>:not(:first-child) .mud-button-root{border-top:1px solid var(--mud-palette-primary-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-secondary .mud-button-root{background-color:var(--mud-palette-secondary);color:var(--mud-palette-secondary-text);--mud-ripple-color: var(--mud-palette-secondary-text);--mud-ripple-opacity: var(--mud-ripple-opacity-secondary)}@media(hover: hover)and (pointer: fine){.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-secondary .mud-button-root:hover{background-color:var(--mud-palette-secondary-darken)}}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-secondary .mud-button-root:focus-visible,.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-secondary .mud-button-root:active{background-color:var(--mud-palette-secondary-darken)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-secondary.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-secondary.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-secondary-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-secondary.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-secondary.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-secondary-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-secondary.mud-button-group-vertical .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-secondary.mud-button-group-vertical>:not(:first-child) .mud-button-root{border-top:1px solid var(--mud-palette-secondary-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-tertiary .mud-button-root{background-color:var(--mud-palette-tertiary);color:var(--mud-palette-tertiary-text);--mud-ripple-color: var(--mud-palette-tertiary-text);--mud-ripple-opacity: var(--mud-ripple-opacity-secondary)}@media(hover: hover)and (pointer: fine){.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-tertiary .mud-button-root:hover{background-color:var(--mud-palette-tertiary-darken)}}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-tertiary .mud-button-root:focus-visible,.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-tertiary .mud-button-root:active{background-color:var(--mud-palette-tertiary-darken)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-tertiary.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-tertiary.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-tertiary-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-tertiary.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-tertiary.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-tertiary-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-tertiary.mud-button-group-vertical .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-tertiary.mud-button-group-vertical>:not(:first-child) .mud-button-root{border-top:1px solid var(--mud-palette-tertiary-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-info .mud-button-root{background-color:var(--mud-palette-info);color:var(--mud-palette-info-text);--mud-ripple-color: var(--mud-palette-info-text);--mud-ripple-opacity: var(--mud-ripple-opacity-secondary)}@media(hover: hover)and (pointer: fine){.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-info .mud-button-root:hover{background-color:var(--mud-palette-info-darken)}}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-info .mud-button-root:focus-visible,.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-info .mud-button-root:active{background-color:var(--mud-palette-info-darken)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-info.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-info.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-info-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-info.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-info.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-info-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-info.mud-button-group-vertical .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-info.mud-button-group-vertical>:not(:first-child) .mud-button-root{border-top:1px solid var(--mud-palette-info-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-success .mud-button-root{background-color:var(--mud-palette-success);color:var(--mud-palette-success-text);--mud-ripple-color: var(--mud-palette-success-text);--mud-ripple-opacity: var(--mud-ripple-opacity-secondary)}@media(hover: hover)and (pointer: fine){.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-success .mud-button-root:hover{background-color:var(--mud-palette-success-darken)}}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-success .mud-button-root:focus-visible,.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-success .mud-button-root:active{background-color:var(--mud-palette-success-darken)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-success.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-success.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-success-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-success.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-success.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-success-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-success.mud-button-group-vertical .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-success.mud-button-group-vertical>:not(:first-child) .mud-button-root{border-top:1px solid var(--mud-palette-success-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-warning .mud-button-root{background-color:var(--mud-palette-warning);color:var(--mud-palette-warning-text);--mud-ripple-color: var(--mud-palette-warning-text);--mud-ripple-opacity: var(--mud-ripple-opacity-secondary)}@media(hover: hover)and (pointer: fine){.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-warning .mud-button-root:hover{background-color:var(--mud-palette-warning-darken)}}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-warning .mud-button-root:focus-visible,.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-warning .mud-button-root:active{background-color:var(--mud-palette-warning-darken)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-warning.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-warning.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-warning-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-warning.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-warning.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-warning-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-warning.mud-button-group-vertical .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-warning.mud-button-group-vertical>:not(:first-child) .mud-button-root{border-top:1px solid var(--mud-palette-warning-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-error .mud-button-root{background-color:var(--mud-palette-error);color:var(--mud-palette-error-text);--mud-ripple-color: var(--mud-palette-error-text);--mud-ripple-opacity: var(--mud-ripple-opacity-secondary)}@media(hover: hover)and (pointer: fine){.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-error .mud-button-root:hover{background-color:var(--mud-palette-error-darken)}}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-error .mud-button-root:focus-visible,.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-error .mud-button-root:active{background-color:var(--mud-palette-error-darken)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-error.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-error.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-error-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-error.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-error.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-error-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-error.mud-button-group-vertical .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-error.mud-button-group-vertical>:not(:first-child) .mud-button-root{border-top:1px solid var(--mud-palette-error-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-dark .mud-button-root{background-color:var(--mud-palette-dark);color:var(--mud-palette-dark-text);--mud-ripple-color: var(--mud-palette-dark-text);--mud-ripple-opacity: var(--mud-ripple-opacity-secondary)}@media(hover: hover)and (pointer: fine){.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-dark .mud-button-root:hover{background-color:var(--mud-palette-dark-darken)}}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-dark .mud-button-root:focus-visible,.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-dark .mud-button-root:active{background-color:var(--mud-palette-dark-darken)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-dark.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-dark.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-dark-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-dark.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-dark.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-dark-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-dark.mud-button-group-vertical .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-dark.mud-button-group-vertical>:not(:first-child) .mud-button-root{border-top:1px solid var(--mud-palette-dark-lighten)}.mud-button-group-disable-elevation{box-shadow:none}.mud-button-group-root.mud-button-group-text-size-small .mud-button-root{padding:4px 5px;font-size:.8125rem}.mud-button-group-root.mud-button-group-text-size-small .mud-button-root.mud-icon-button .mud-icon-root{font-size:1.422rem}.mud-button-group-root.mud-button-group-text-size-large .mud-button-root{padding:8px 11px;font-size:.9375rem}.mud-button-group-root.mud-button-group-text-size-large .mud-button-root.mud-icon-button .mud-icon-root{font-size:1.641rem}.mud-button-group-root.mud-button-group-outlined-size-small .mud-button-root{padding:3px 9px;font-size:.8125rem}.mud-button-group-root.mud-button-group-outlined-size-small .mud-button-root.mud-icon-button{padding:3px 9px}.mud-button-group-root.mud-button-group-outlined-size-small .mud-button-root.mud-icon-button .mud-icon-root{font-size:1.422rem}.mud-button-group-root.mud-button-group-outlined-size-large .mud-button-root{padding:7px 21px;font-size:.9375rem}.mud-button-group-root.mud-button-group-outlined-size-large .mud-button-root.mud-icon-button{padding:7px 15px}.mud-button-group-root.mud-button-group-outlined-size-large .mud-button-root.mud-icon-button .mud-icon-root{font-size:1.641rem}.mud-button-group-root.mud-button-group-filled-size-small .mud-button-root{padding:4px 10px;font-size:.8125rem}.mud-button-group-root.mud-button-group-filled-size-small .mud-button-root.mud-icon-button{padding:4px 10px}.mud-button-group-root.mud-button-group-filled-size-small .mud-button-root.mud-icon-button .mud-icon-root{font-size:1.422rem}.mud-button-group-root.mud-button-group-filled-size-large .mud-button-root{padding:8px 22px;font-size:.9375rem}.mud-button-group-root.mud-button-group-filled-size-large .mud-button-root.mud-icon-button{padding:8px 16px}.mud-button-group-root.mud-button-group-filled-size-large .mud-button-root.mud-icon-button .mud-icon-root{font-size:1.641rem}.mud-button-group-root .mud-button-root.mud-icon-button{padding-right:12px;padding-left:12px}.mud-button-group-root .mud-button-root.mud-icon-button .mud-icon-root{font-size:1.516rem}.mud-button-group-root .mud-button-root.mud-icon-button.mud-ripple-icon:after{transform:scale(10, 10)}.mud-button-group-root .mud-button-root.mud-icon-button.mud-ripple-icon:active:after{transform:scale(0, 0);opacity:.1;transition:0s}.mud-icon-button{flex:0 0 auto;padding:12px;overflow:visible;font-size:1.5rem;text-align:center;transition:background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;border-radius:50%;color:var(--mud-palette-action-default)}.mud-icon-button.mud-button{min-width:unset;border-radius:var(--mud-default-borderradius)}@media(hover: hover)and (pointer: fine){.mud-icon-button:hover{background-color:var(--mud-palette-action-default-hover)}}.mud-icon-button:focus-visible,.mud-icon-button:active{background-color:var(--mud-palette-action-default-hover)}.mud-icon-button:disabled{color:var(--mud-palette-action-disabled);background-color:rgba(0,0,0,0)}.mud-icon-button.mud-readonly,.mud-icon-button .mud-readonly:hover{cursor:default}.mud-icon-button-color-inherit{color:inherit}@media(hover: hover)and (pointer: fine){.mud-icon-button-color-inherit:hover{background-color:var(--mud-palette-action-default-hover)}}.mud-icon-button-color-inherit:focus-visible,.mud-icon-button-color-inherit:active{background-color:var(--mud-palette-action-default-hover)}.mud-icon-button-label{width:100%;display:flex;align-items:inherit;justify-content:inherit}.mud-icon-button-edge-start{margin-left:-12px;margin-inline-start:-12px;margin-inline-end:unset}.mud-icon-button-edge-end{margin-right:-12px;margin-inline-end:-12px;margin-inline-start:unset}.mud-icon-button-edge-margin-end{margin-right:8px;margin-inline-end:8px;margin-inline-start:unset}.mud-icon-button-size-small{padding:3px;font-size:1.125rem}.mud-icon-button-size-small.mud-icon-button-edge-start{margin-left:-3px;margin-inline-start:-3px;margin-inline-end:unset}.mud-icon-button-size-small.mud-icon-button-edge-end{margin-right:-3px;margin-inline-end:-3px;margin-inline-start:unset}.mud-icon-button-size-large.mud-button>.mud-icon-button-label>.mud-icon-size-large{font-size:2rem}.mud-card{display:flex;flex-direction:column}.mud-card-header{display:flex;padding:16px;align-items:center;border-top-left-radius:inherit;border-top-right-radius:inherit}.mud-card-header .mud-card-header-avatar{flex:0 0 auto;margin-right:16px;margin-inline-end:16px;margin-inline-start:unset}.mud-card-header .mud-card-header-content{flex:1 1 auto}.mud-card-header .mud-card-header-content .mud-typography{margin-bottom:0}.mud-card-header .mud-card-header-actions{flex:0 0 auto;align-self:flex-start;margin-top:-8px;margin-right:-8px;margin-inline-end:-8px;margin-inline-start:unset}.mud-card-media{display:block;background-size:cover;background-repeat:no-repeat;background-position:center;border-top-left-radius:inherit;border-top-right-radius:inherit}.mud-card-header+.mud-card-media{border-top-left-radius:0px;border-top-right-radius:0px}.mud-card-content{flex-grow:1;padding:16px}.mud-card-actions{display:flex;padding:8px;align-items:center}.mud-carousel{display:flex !important;position:relative;margin:0px !important;clip-path:inset(0px 0px 0px 0px);overflow:hidden}.mud-carousel.mud-carousel-primary{color:var(--mud-palette-primary-text)}.mud-carousel.mud-carousel-secondary{color:var(--mud-palette-secondary-text)}.mud-carousel.mud-carousel-tertiary{color:var(--mud-palette-tertiary-text)}.mud-carousel.mud-carousel-info{color:var(--mud-palette-info-text)}.mud-carousel.mud-carousel-success{color:var(--mud-palette-success-text)}.mud-carousel.mud-carousel-warning{color:var(--mud-palette-warning-text)}.mud-carousel.mud-carousel-error{color:var(--mud-palette-error-text)}.mud-carousel.mud-carousel-dark{color:var(--mud-palette-dark-text)}.mud-carousel-elements-rtl{transform:rotate(180deg) !important}.mud-carousel-item{position:absolute;left:0px;right:0px;top:0px;bottom:0px;margin:inherit;padding:inherit;z-index:2}.mud-carousel-item.mud-carousel-item-primary{color:var(--mud-palette-primary-text);background-color:var(--mud-palette-primary)}.mud-carousel-item.mud-carousel-item-secondary{color:var(--mud-palette-secondary-text);background-color:var(--mud-palette-secondary)}.mud-carousel-item.mud-carousel-item-tertiary{color:var(--mud-palette-tertiary-text);background-color:var(--mud-palette-tertiary)}.mud-carousel-item.mud-carousel-item-info{color:var(--mud-palette-info-text);background-color:var(--mud-palette-info)}.mud-carousel-item.mud-carousel-item-success{color:var(--mud-palette-success-text);background-color:var(--mud-palette-success)}.mud-carousel-item.mud-carousel-item-warning{color:var(--mud-palette-warning-text);background-color:var(--mud-palette-warning)}.mud-carousel-item.mud-carousel-item-error{color:var(--mud-palette-error-text);background-color:var(--mud-palette-error)}.mud-carousel-item.mud-carousel-item-dark{color:var(--mud-palette-dark-text);background-color:var(--mud-palette-dark)}.mud-carousel-item-exit{z-index:1}@keyframes mud-carousel-transition-fade-in-keyframe{from{opacity:0}to{opacity:1}}@keyframes mud-carousel-transition-fade-out-keyframe{from{opacity:1}to{opacity:0}}.mud-carousel-transition-fade-in{animation:.5s mud-carousel-transition-fade-in-keyframe}.mud-carousel-transition-fade-out{animation:.5s mud-carousel-transition-fade-out-keyframe;animation-fill-mode:forwards}.mud-carousel-transition-none{display:none}@keyframes mud-carousel-transition-slide-next-enter-keyframe{from{transform:translate3d(100%, 0, 0);visibility:visible}to{transform:translate3d(0, 0, 0)}}@keyframes mud-carousel-transition-slide-next-rtl-enter-keyframe{from{transform:translate3d(-100%, 0, 0);visibility:visible}to{transform:translate3d(0, 0, 0)}}@keyframes mud-carousel-transition-slide-next-exit-keyframe{from{transform:translate3d(0, 0, 0);visibility:visible}to{transform:translate3d(-100%, 0, 0)}}@keyframes mud-carousel-transition-slide-next-rtl-exit-keyframe{from{transform:translate3d(0, 0, 0);visibility:visible}to{transform:translate3d(100%, 0, 0)}}.mud-carousel-transition-slide-next-enter{animation:.5s mud-carousel-transition-slide-next-enter-keyframe}.mud-carousel-transition-slide-next-rtl-enter{animation:.5s mud-carousel-transition-slide-next-rtl-enter-keyframe}.mud-carousel-transition-slide-next-exit{animation:.5s mud-carousel-transition-slide-next-exit-keyframe;animation-fill-mode:forwards}.mud-carousel-transition-slide-next-rtl-exit{animation:.5s mud-carousel-transition-slide-next-rtl-exit-keyframe;animation-fill-mode:forwards}@keyframes mud-carousel-transition-slide-prev-enter-keyframe{from{transform:translate3d(-100%, 0, 0);visibility:visible}to{transform:translate3d(0, 0, 0)}}@keyframes mud-carousel-transition-slide-prev-rtl-enter-keyframe{from{transform:translate3d(100%, 0, 0);visibility:visible}to{transform:translate3d(0, 0, 0)}}@keyframes mud-carousel-transition-slide-prev-exit-keyframe{from{transform:translate3d(0, 0, 0);visibility:visible}to{transform:translate3d(100%, 0, 0)}}@keyframes mud-carousel-transition-slide-prev-rtl-exit-keyframe{from{transform:translate3d(0, 0, 0);visibility:visible}to{transform:translate3d(-100%, 0, 0)}}.mud-carousel-transition-slide-prev-enter{animation:.5s mud-carousel-transition-slide-prev-enter-keyframe}.mud-carousel-transition-slide-prev-rtl-enter{animation:.5s mud-carousel-transition-slide-prev-rtl-enter-keyframe}.mud-carousel-transition-slide-prev-exit{animation:.5s mud-carousel-transition-slide-prev-exit-keyframe;animation-fill-mode:forwards}.mud-carousel-transition-slide-prev-rtl-exit{animation:.5s mud-carousel-transition-slide-prev-rtl-exit-keyframe;animation-fill-mode:forwards}.mud-chart{display:flex}.mud-chart.mud-chart-legend-bottom{flex-direction:column}.mud-chart.mud-chart-legend-bottom .mud-chart-legend{margin-top:10px;justify-content:center;width:100%}.mud-chart.mud-chart-legend-top{flex-direction:column-reverse}.mud-chart.mud-chart-legend-top .mud-chart-legend{justify-content:center;width:100%}.mud-chart.mud-chart-legend-right{flex-direction:row}.mud-chart.mud-chart-legend-right .mud-chart-legend{flex-direction:column}.mud-chart.mud-chart-legend-left{flex-direction:row-reverse}.mud-chart.mud-chart-legend-left .mud-chart-legend{flex-direction:column}.mud-chart .mud-chart-donut,.mud-chart .mud-chart-pie,.mud-chart mud-chart-line{display:flex;margin:auto}.mud-chart .mud-chart-legend{display:flex;padding:10px 0px;margin:auto;flex-wrap:wrap}.mud-chart .mud-chart-legend .mud-chart-legend-item{display:block;margin:2px 5px}.mud-chart .mud-chart-legend .mud-chart-legend-item .mud-chart-legend-marker{height:12px;width:12px;border-radius:50%;position:relative;display:inline-flex}.mud-chart .mud-chart-legend .mud-chart-legend-item .mud-chart-legend-text{display:inline-flex}.mud-chart .mud-chart-legend .mud-chart-legend-item .mud-chart-legend-checkbox{display:flex;align-items:center}.mud-chart .mud-chart-legend .mud-chart-legend-item .mud-input-control{width:35px !important}.mud-charts-yaxis{fill:var(--mud-palette-text-primary)}.mud-charts-xaxis{fill:var(--mud-palette-text-primary)}.mud-chart-donut .mud-donut-hole{fill:rgba(0,0,0,0);user-select:none;pointer-events:unset}.mud-chart-donut .mud-donut-ring{fill:rgba(0,0,0,0);stroke-width:5;stroke:#fff;pointer-events:unset}.mud-chart-donut .mud-donut-segment{stroke-width:5;fill:rgba(0,0,0,0);pointer-events:stroke;-webkit-transition:stroke .2s ease;-moz-transition:stroke .2s ease;-o-transition:stroke .2s ease;transition:stroke .2s ease}.mud-chart-legend-marker{height:12px;width:12px;border-radius:50%;position:relative;display:inline-block}.mud-chart-marker-color-0{background-color:#008ffb}.mud-chart-marker-color-1{background-color:#00e396}.mud-chart-marker-color-2{background-color:#feb019}.mud-chart-marker-color-3{background-color:#ff4560}.mud-chart-marker-color-4{background-color:#594ae2}.mud-checkbox{cursor:pointer;display:inline-flex;align-items:center;vertical-align:middle;-webkit-tap-highlight-color:rgba(0,0,0,0)}@media(hover: hover)and (pointer: fine){.mud-checkbox .mud-disabled:hover{cursor:default;background-color:rgba(0,0,0,0) !important}.mud-checkbox .mud-disabled:hover *{cursor:default;color:var(--mud-palette-text-disabled)}}.mud-checkbox .mud-disabled:focus-visible,.mud-checkbox .mud-disabled:active{cursor:default;background-color:rgba(0,0,0,0) !important}.mud-checkbox .mud-disabled:focus-visible *,.mud-checkbox .mud-disabled:active *{cursor:default;color:var(--mud-palette-text-disabled)}.mud-checkbox.mud-readonly,.mud-checkbox .mud-readonly:hover{cursor:default;background-color:rgba(0,0,0,0) !important}.mud-checkbox .mud-checkbox-dense{padding:4px}.mud-checkbox-input{top:0;left:0;width:100%;cursor:inherit;height:100%;margin:0;opacity:0;padding:0;z-index:1;position:absolute}.mud-checkbox-span{display:inline-block;width:100%;cursor:pointer}.mud-chart-legend-checkbox .mud-checkbox svg path:last-child{fill:var(--checkbox-color) !important}.mud-chip-container{display:contents}.mud-chip{border:none;display:inline-flex;max-width:100%;outline:0;padding:0 12px;position:relative;box-sizing:border-box;transition:background-color 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;align-items:center;white-space:nowrap;vertical-align:middle;justify-content:center;text-decoration:none;line-height:normal;margin:4px}.mud-chip.mud-disabled{opacity:.5;pointer-events:none}.mud-chip.mud-chip-size-small{border-radius:12px;font-size:12px;height:24px;padding:0 8px}.mud-chip.mud-chip-size-small .mud-avatar{margin-left:-4px;margin-right:4px;margin-inline-start:-4px;margin-inline-end:4px;width:18px;height:18px;font-size:.625rem}.mud-chip.mud-chip-size-small .mud-icon-root{font-size:1.125rem}.mud-chip.mud-chip-size-small .mud-chip-close-button{margin-right:-4px;margin-left:4px;margin-inline-end:-4px;margin-inline-start:4px}.mud-chip.mud-chip-size-medium{height:32px;font-size:14px;border-radius:16px}.mud-chip.mud-chip-size-medium .mud-avatar{margin-left:-8px;margin-right:8px;margin-inline-start:-8px;margin-inline-end:8px;width:24px;height:24px;font-size:.75rem}.mud-chip.mud-chip-size-large{height:40px;font-size:16px;border-radius:20px;padding:0 16px}.mud-chip.mud-chip-size-large .mud-avatar{margin-left:-12px;margin-right:8px;margin-inline-start:-12px;margin-inline-end:8px;width:32px;height:32px;font-size:1rem}.mud-chip.mud-chip-size-large .mud-chip-icon{font-size:1.5rem;margin-left:-6px;margin-right:6px;margin-inline-start:-6px;margin-inline-end:6px}.mud-chip.mud-chip-label{border-radius:var(--mud-default-borderradius)}.mud-chip.mud-clickable{cursor:pointer;user-select:none}.mud-chip .mud-chip-icon{margin-left:-4px;margin-right:4px;margin-inline-start:-4px;margin-inline-end:4px;color:inherit}.mud-chip .mud-chip-close-button{padding:1px;margin-right:-4px;margin-left:6px;margin-inline-end:-4px;margin-inline-start:6px;height:18px;width:18px;color:inherit;transition:.3s cubic-bezier(0.25, 0.8, 0.5, 1),visibility 0s}.mud-chip .mud-chip-close-button .mud-icon-size-small{font-size:1.15rem}@media(hover: hover)and (pointer: fine){.mud-chip .mud-chip-close-button:hover:not(.mud-disabled){opacity:.7}}.mud-chip .mud-chip-close-button:focus-visible:not(.mud-disabled),.mud-chip .mud-chip-close-button:active:not(.mud-disabled){opacity:.7}.mud-chip>.mud-chip-content{align-items:center;display:inline-flex;height:100%;max-width:100%}.mud-chip-filled{color:var(--mud-palette-text-primary);background-color:var(--mud-palette-action-disabled-background);--mud-ripple-opacity: var(--mud-ripple-opacity-secondary)}@media(hover: hover)and (pointer: fine){.mud-chip-filled.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-action-disabled)}}.mud-chip-filled.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-filled.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-action-disabled)}.mud-chip-filled.mud-chip-color-primary{color:var(--mud-palette-primary-text);--mud-ripple-color: var(--mud-palette-primary-text) !important;background-color:var(--mud-palette-primary)}@media(hover: hover)and (pointer: fine){.mud-chip-filled.mud-chip-color-primary.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-primary-darken)}}.mud-chip-filled.mud-chip-color-primary.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-filled.mud-chip-color-primary.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-primary-darken)}.mud-chip-filled.mud-chip-color-secondary{color:var(--mud-palette-secondary-text);--mud-ripple-color: var(--mud-palette-secondary-text) !important;background-color:var(--mud-palette-secondary)}@media(hover: hover)and (pointer: fine){.mud-chip-filled.mud-chip-color-secondary.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-secondary-darken)}}.mud-chip-filled.mud-chip-color-secondary.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-filled.mud-chip-color-secondary.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-secondary-darken)}.mud-chip-filled.mud-chip-color-tertiary{color:var(--mud-palette-tertiary-text);--mud-ripple-color: var(--mud-palette-tertiary-text) !important;background-color:var(--mud-palette-tertiary)}@media(hover: hover)and (pointer: fine){.mud-chip-filled.mud-chip-color-tertiary.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-tertiary-darken)}}.mud-chip-filled.mud-chip-color-tertiary.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-filled.mud-chip-color-tertiary.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-tertiary-darken)}.mud-chip-filled.mud-chip-color-info{color:var(--mud-palette-info-text);--mud-ripple-color: var(--mud-palette-info-text) !important;background-color:var(--mud-palette-info)}@media(hover: hover)and (pointer: fine){.mud-chip-filled.mud-chip-color-info.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-info-darken)}}.mud-chip-filled.mud-chip-color-info.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-filled.mud-chip-color-info.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-info-darken)}.mud-chip-filled.mud-chip-color-success{color:var(--mud-palette-success-text);--mud-ripple-color: var(--mud-palette-success-text) !important;background-color:var(--mud-palette-success)}@media(hover: hover)and (pointer: fine){.mud-chip-filled.mud-chip-color-success.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-success-darken)}}.mud-chip-filled.mud-chip-color-success.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-filled.mud-chip-color-success.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-success-darken)}.mud-chip-filled.mud-chip-color-warning{color:var(--mud-palette-warning-text);--mud-ripple-color: var(--mud-palette-warning-text) !important;background-color:var(--mud-palette-warning)}@media(hover: hover)and (pointer: fine){.mud-chip-filled.mud-chip-color-warning.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-warning-darken)}}.mud-chip-filled.mud-chip-color-warning.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-filled.mud-chip-color-warning.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-warning-darken)}.mud-chip-filled.mud-chip-color-error{color:var(--mud-palette-error-text);--mud-ripple-color: var(--mud-palette-error-text) !important;background-color:var(--mud-palette-error)}@media(hover: hover)and (pointer: fine){.mud-chip-filled.mud-chip-color-error.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-error-darken)}}.mud-chip-filled.mud-chip-color-error.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-filled.mud-chip-color-error.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-error-darken)}.mud-chip-filled.mud-chip-color-dark{color:var(--mud-palette-dark-text);--mud-ripple-color: var(--mud-palette-dark-text) !important;background-color:var(--mud-palette-dark)}@media(hover: hover)and (pointer: fine){.mud-chip-filled.mud-chip-color-dark.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-dark-darken)}}.mud-chip-filled.mud-chip-color-dark.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-filled.mud-chip-color-dark.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-dark-darken)}.mud-chip-outlined{color:var(--mud-palette-text-primary);border:1px solid var(--mud-palette-lines-inputs)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-action-default-hover)}}.mud-chip-outlined.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-action-default-hover)}.mud-chip-outlined.mud-chip-color-primary{color:var(--mud-palette-primary);--mud-ripple-color: var(--mud-palette-primary) !important;border:1px solid var(--mud-palette-primary)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-primary.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-primary-hover)}}.mud-chip-outlined.mud-chip-color-primary.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-primary.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-primary-hover)}.mud-chip-outlined.mud-chip-color-primary.mud-chip-selected{background-color:var(--mud-palette-primary-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-primary.mud-chip-selected:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-primary-rgb), 0.12)}}.mud-chip-outlined.mud-chip-color-primary.mud-chip-selected:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-primary.mud-chip-selected:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-primary-rgb), 0.12)}.mud-chip-outlined.mud-chip-color-secondary{color:var(--mud-palette-secondary);--mud-ripple-color: var(--mud-palette-secondary) !important;border:1px solid var(--mud-palette-secondary)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-secondary.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-secondary-hover)}}.mud-chip-outlined.mud-chip-color-secondary.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-secondary.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-secondary-hover)}.mud-chip-outlined.mud-chip-color-secondary.mud-chip-selected{background-color:var(--mud-palette-secondary-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-secondary.mud-chip-selected:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-secondary-rgb), 0.12)}}.mud-chip-outlined.mud-chip-color-secondary.mud-chip-selected:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-secondary.mud-chip-selected:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-secondary-rgb), 0.12)}.mud-chip-outlined.mud-chip-color-tertiary{color:var(--mud-palette-tertiary);--mud-ripple-color: var(--mud-palette-tertiary) !important;border:1px solid var(--mud-palette-tertiary)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-tertiary.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-tertiary-hover)}}.mud-chip-outlined.mud-chip-color-tertiary.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-tertiary.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-tertiary-hover)}.mud-chip-outlined.mud-chip-color-tertiary.mud-chip-selected{background-color:var(--mud-palette-tertiary-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-tertiary.mud-chip-selected:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-tertiary-rgb), 0.12)}}.mud-chip-outlined.mud-chip-color-tertiary.mud-chip-selected:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-tertiary.mud-chip-selected:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-tertiary-rgb), 0.12)}.mud-chip-outlined.mud-chip-color-info{color:var(--mud-palette-info);--mud-ripple-color: var(--mud-palette-info) !important;border:1px solid var(--mud-palette-info)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-info.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-info-hover)}}.mud-chip-outlined.mud-chip-color-info.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-info.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-info-hover)}.mud-chip-outlined.mud-chip-color-info.mud-chip-selected{background-color:var(--mud-palette-info-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-info.mud-chip-selected:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-info-rgb), 0.12)}}.mud-chip-outlined.mud-chip-color-info.mud-chip-selected:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-info.mud-chip-selected:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-info-rgb), 0.12)}.mud-chip-outlined.mud-chip-color-success{color:var(--mud-palette-success);--mud-ripple-color: var(--mud-palette-success) !important;border:1px solid var(--mud-palette-success)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-success.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-success-hover)}}.mud-chip-outlined.mud-chip-color-success.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-success.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-success-hover)}.mud-chip-outlined.mud-chip-color-success.mud-chip-selected{background-color:var(--mud-palette-success-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-success.mud-chip-selected:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-success-rgb), 0.12)}}.mud-chip-outlined.mud-chip-color-success.mud-chip-selected:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-success.mud-chip-selected:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-success-rgb), 0.12)}.mud-chip-outlined.mud-chip-color-warning{color:var(--mud-palette-warning);--mud-ripple-color: var(--mud-palette-warning) !important;border:1px solid var(--mud-palette-warning)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-warning.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-warning-hover)}}.mud-chip-outlined.mud-chip-color-warning.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-warning.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-warning-hover)}.mud-chip-outlined.mud-chip-color-warning.mud-chip-selected{background-color:var(--mud-palette-warning-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-warning.mud-chip-selected:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-warning-rgb), 0.12)}}.mud-chip-outlined.mud-chip-color-warning.mud-chip-selected:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-warning.mud-chip-selected:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-warning-rgb), 0.12)}.mud-chip-outlined.mud-chip-color-error{color:var(--mud-palette-error);--mud-ripple-color: var(--mud-palette-error) !important;border:1px solid var(--mud-palette-error)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-error.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-error-hover)}}.mud-chip-outlined.mud-chip-color-error.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-error.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-error-hover)}.mud-chip-outlined.mud-chip-color-error.mud-chip-selected{background-color:var(--mud-palette-error-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-error.mud-chip-selected:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-error-rgb), 0.12)}}.mud-chip-outlined.mud-chip-color-error.mud-chip-selected:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-error.mud-chip-selected:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-error-rgb), 0.12)}.mud-chip-outlined.mud-chip-color-dark{color:var(--mud-palette-dark);--mud-ripple-color: var(--mud-palette-dark) !important;border:1px solid var(--mud-palette-dark)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-dark.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-dark-hover)}}.mud-chip-outlined.mud-chip-color-dark.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-dark.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-dark-hover)}.mud-chip-outlined.mud-chip-color-dark.mud-chip-selected{background-color:var(--mud-palette-dark-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-dark.mud-chip-selected:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-dark-rgb), 0.12)}}.mud-chip-outlined.mud-chip-color-dark.mud-chip-selected:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-dark.mud-chip-selected:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-dark-rgb), 0.12)}.mud-chip-text{color:var(--mud-palette-text-primary);background-color:var(--mud-palette-action-default-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-text.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-action-disabled-background)}}.mud-chip-text.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-text.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-action-disabled-background)}.mud-chip-text.mud-chip-color-primary{color:var(--mud-palette-primary);--mud-ripple-color: var(--mud-palette-primary) !important;background-color:var(--mud-palette-primary-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-text.mud-chip-color-primary.mud-clickable:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-primary-rgb), 0.12)}}.mud-chip-text.mud-chip-color-primary.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-text.mud-chip-color-primary.mud-clickable:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-primary-rgb), 0.12)}.mud-chip-text.mud-chip-color-secondary{color:var(--mud-palette-secondary);--mud-ripple-color: var(--mud-palette-secondary) !important;background-color:var(--mud-palette-secondary-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-text.mud-chip-color-secondary.mud-clickable:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-secondary-rgb), 0.12)}}.mud-chip-text.mud-chip-color-secondary.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-text.mud-chip-color-secondary.mud-clickable:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-secondary-rgb), 0.12)}.mud-chip-text.mud-chip-color-tertiary{color:var(--mud-palette-tertiary);--mud-ripple-color: var(--mud-palette-tertiary) !important;background-color:var(--mud-palette-tertiary-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-text.mud-chip-color-tertiary.mud-clickable:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-tertiary-rgb), 0.12)}}.mud-chip-text.mud-chip-color-tertiary.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-text.mud-chip-color-tertiary.mud-clickable:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-tertiary-rgb), 0.12)}.mud-chip-text.mud-chip-color-info{color:var(--mud-palette-info);--mud-ripple-color: var(--mud-palette-info) !important;background-color:var(--mud-palette-info-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-text.mud-chip-color-info.mud-clickable:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-info-rgb), 0.12)}}.mud-chip-text.mud-chip-color-info.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-text.mud-chip-color-info.mud-clickable:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-info-rgb), 0.12)}.mud-chip-text.mud-chip-color-success{color:var(--mud-palette-success);--mud-ripple-color: var(--mud-palette-success) !important;background-color:var(--mud-palette-success-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-text.mud-chip-color-success.mud-clickable:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-success-rgb), 0.12)}}.mud-chip-text.mud-chip-color-success.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-text.mud-chip-color-success.mud-clickable:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-success-rgb), 0.12)}.mud-chip-text.mud-chip-color-warning{color:var(--mud-palette-warning);--mud-ripple-color: var(--mud-palette-warning) !important;background-color:var(--mud-palette-warning-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-text.mud-chip-color-warning.mud-clickable:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-warning-rgb), 0.12)}}.mud-chip-text.mud-chip-color-warning.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-text.mud-chip-color-warning.mud-clickable:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-warning-rgb), 0.12)}.mud-chip-text.mud-chip-color-error{color:var(--mud-palette-error);--mud-ripple-color: var(--mud-palette-error) !important;background-color:var(--mud-palette-error-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-text.mud-chip-color-error.mud-clickable:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-error-rgb), 0.12)}}.mud-chip-text.mud-chip-color-error.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-text.mud-chip-color-error.mud-clickable:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-error-rgb), 0.12)}.mud-chip-text.mud-chip-color-dark{color:var(--mud-palette-dark);--mud-ripple-color: var(--mud-palette-dark) !important;background-color:var(--mud-palette-dark-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-text.mud-chip-color-dark.mud-clickable:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-dark-rgb), 0.12)}}.mud-chip-text.mud-chip-color-dark.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-text.mud-chip-color-dark.mud-clickable:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-dark-rgb), 0.12)}.mud-collapse-container{height:0px;overflow:hidden}@keyframes mud-expand-anim{from{height:0}}.mud-collapse-entering{animation:mud-expand-anim 1s ease-in-out 0ms 1 forwards}.mud-collapse-entering.mud-navgroup-collapse{animation-duration:300ms !important}.mud-collapse-entered{overflow:initial}@keyframes mud-collapse-anim{to{height:0}}.mud-collapse-exiting{animation:mud-collapse-anim .5s cubic-bezier(0, 1, 0, 1) 0ms 1 forwards}.mud-collapse-exiting.mud-navgroup-collapse{animation-duration:300ms}.mud-collapse-hidden{visibility:hidden}.mud-collapse-wrapper{display:flex}.mud-collapse-wrapper-inner{width:100%}.mud-dialog-container{display:flex;position:fixed;top:0;left:0;width:100%;height:100%;z-index:var(--mud-zindex-dialog)}.mud-dialog-container.mud-dialog-center{align-items:center;justify-content:center}.mud-dialog-container.mud-dialog-topcenter{align-items:flex-start;justify-content:center;padding-top:32px}.mud-dialog-container.mud-dialog-bottomcenter{align-items:flex-end;justify-content:center;padding-bottom:32px}.mud-dialog-container.mud-dialog-centerright{align-items:center;justify-content:flex-end;padding-right:32px}.mud-dialog-container.mud-dialog-centerleft{align-items:center;justify-content:flex-start;padding-left:32px}.mud-dialog-container.mud-dialog-topleft .mud-dialog{position:absolute;top:32px;left:32px}.mud-dialog-container.mud-dialog-topright .mud-dialog{position:absolute;top:32px;right:32px}.mud-dialog-container.mud-dialog-bottomleft .mud-dialog{position:absolute;bottom:32px;left:32px}.mud-dialog-container.mud-dialog-bottomright .mud-dialog{position:absolute;bottom:32px;right:32px}.mud-dialog{display:flex;z-index:calc(var(--mud-zindex-dialog) + 2);flex-direction:column;color:var(--mud-palette-text-primary);background-color:var(--mud-palette-surface);border-radius:var(--mud-default-borderradius);-webkit-animation:mud-open-dialog-center .1s cubic-bezier(0.39, 0.575, 0.565, 1) both;animation:mud-open-dialog-center .1s cubic-bezier(0.39, 0.575, 0.565, 1) both;box-shadow:0px 11px 15px -7px rgba(0,0,0,.2),0px 24px 38px 3px rgba(0,0,0,.14),0px 9px 46px 8px rgba(0,0,0,.12);max-height:calc(100vh - var(--mud-appbar-height));max-height:calc(100dvh - var(--mud-appbar-height));overflow-y:auto}.mud-dialog.mud-dialog-rtl .mud-dialog-title .mud-button-close{right:unset;left:8px}.mud-dialog .mud-dialog-title{z-index:1;flex:0 0 auto;margin:0;padding:16px 24px;border-top-left-radius:var(--mud-default-borderradius);border-top-right-radius:var(--mud-default-borderradius)}.mud-dialog .mud-dialog-title+*>.mud-dialog-content{border-radius:0}.mud-dialog .mud-dialog-title .mud-button-close{top:8px;right:8px;position:absolute}.mud-dialog .mud-dialog-content{position:relative;flex:1 1 auto;overflow:auto;padding:0px 24px;margin:8px 0px;-webkit-overflow-scrolling:touch;border-top-left-radius:var(--mud-default-borderradius);border-top-right-radius:var(--mud-default-borderradius)}.mud-dialog .mud-dialog-content.mud-dialog-no-side-padding{padding:0px;margin:12px 0px}.mud-dialog .mud-dialog-actions{flex:0 0 auto;display:flex;padding:8px;align-items:center;justify-content:flex-end;border-bottom-left-radius:var(--mud-default-borderradius);border-bottom-right-radius:var(--mud-default-borderradius)}.mud-dialog .mud-dialog-actions>:not(:first-child){margin-left:8px;margin-inline-start:8px;margin-inline-end:unset}.mud-dialog-width-false{max-width:calc(100% - 64px)}.mud-dialog-width-xs{max-width:444px}.mud-dialog-width-sm{max-width:600px}.mud-dialog-width-md{max-width:960px}.mud-dialog-width-lg{max-width:1280px}.mud-dialog-width-xl{max-width:1920px}.mud-dialog-width-xxl{max-width:2560px}.mud-dialog-width-full{width:calc(100% - 64px)}.mud-dialog-fullscreen{width:100%;height:100%;margin:0;max-width:100%;max-height:none;border-radius:0;overflow-y:hidden}@-webkit-keyframes mud-open-dialog-center{0%{opacity:0}1%{-webkit-transform:scale(0.5);transform:scale(0.5);opacity:1}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes mud-open-dialog-center{0%{opacity:0}1%{-webkit-transform:scale(0.5);transform:scale(0.5);opacity:1}100%{-webkit-transform:scale(1);transform:scale(1)}}.mud-focus-trap{display:contents}.mud-focus-trap .mud-focus-trap-child-container{display:contents}.mud-input-control.mud-field .mud-input-slot{height:auto;min-height:19px}.mud-input-control.mud-field .mud-input-slot.mud-input-root-outlined.mud-input-adorned-start{padding-left:0;padding-inline-start:0;padding-inline-end:14px}.mud-input-control.mud-field .mud-input-slot.mud-input-root-filled.mud-input-adorned-start{padding-left:0;padding-inline-start:0;padding-inline-end:12px}.mud-input-control.mud-field .mud-input-slot.mud-input-slot-nopadding{padding-top:0px;padding-bottom:0px}.mud-input-control.mud-field .mud-input-slot.mud-input-slot-nopadding.mud-input-root-filled{padding-top:21px;padding-bottom:2px}.mud-input-control.mud-field .mud-input-slot.mud-input-slot-nopadding.mud-input-root-outlined{padding-top:7px;padding-bottom:2px}.mud-flex-break{flex-basis:100%;width:0}.mud-grid{width:100%;display:flex;flex-wrap:wrap;box-sizing:border-box}.mud-grid-item{margin:0;box-sizing:border-box}.mud-grid-spacing-xs-1{width:calc(100% + 4px);margin-left:-4px;margin-top:-4px}.mud-grid-spacing-xs-1>.mud-grid-item{padding-left:4px;padding-top:4px}.mud-grid-spacing-xs-2{width:calc(100% + 8px);margin-left:-8px;margin-top:-8px}.mud-grid-spacing-xs-2>.mud-grid-item{padding-left:8px;padding-top:8px}.mud-grid-spacing-xs-3{width:calc(100% + 12px);margin-left:-12px;margin-top:-12px}.mud-grid-spacing-xs-3>.mud-grid-item{padding-left:12px;padding-top:12px}.mud-grid-spacing-xs-4{width:calc(100% + 16px);margin-left:-16px;margin-top:-16px}.mud-grid-spacing-xs-4>.mud-grid-item{padding-left:16px;padding-top:16px}.mud-grid-spacing-xs-5{width:calc(100% + 20px);margin-left:-20px;margin-top:-20px}.mud-grid-spacing-xs-5>.mud-grid-item{padding-left:20px;padding-top:20px}.mud-grid-spacing-xs-6{width:calc(100% + 24px);margin-left:-24px;margin-top:-24px}.mud-grid-spacing-xs-6>.mud-grid-item{padding-left:24px;padding-top:24px}.mud-grid-spacing-xs-7{width:calc(100% + 28px);margin-left:-28px;margin-top:-28px}.mud-grid-spacing-xs-7>.mud-grid-item{padding-left:28px;padding-top:28px}.mud-grid-spacing-xs-8{width:calc(100% + 32px);margin-left:-32px;margin-top:-32px}.mud-grid-spacing-xs-8>.mud-grid-item{padding-left:32px;padding-top:32px}.mud-grid-spacing-xs-9{width:calc(100% + 36px);margin-left:-36px;margin-top:-36px}.mud-grid-spacing-xs-9>.mud-grid-item{padding-left:36px;padding-top:36px}.mud-grid-spacing-xs-10{width:calc(100% + 40px);margin-left:-40px;margin-top:-40px}.mud-grid-spacing-xs-10>.mud-grid-item{padding-left:40px;padding-top:40px}.mud-grid-spacing-xs-11{width:calc(100% + 44px);margin-left:-44px;margin-top:-44px}.mud-grid-spacing-xs-11>.mud-grid-item{padding-left:44px;padding-top:44px}.mud-grid-spacing-xs-12{width:calc(100% + 48px);margin-left:-48px;margin-top:-48px}.mud-grid-spacing-xs-12>.mud-grid-item{padding-left:48px;padding-top:48px}.mud-grid-spacing-xs-13{width:calc(100% + 52px);margin-left:-52px;margin-top:-52px}.mud-grid-spacing-xs-13>.mud-grid-item{padding-left:52px;padding-top:52px}.mud-grid-spacing-xs-14{width:calc(100% + 56px);margin-left:-56px;margin-top:-56px}.mud-grid-spacing-xs-14>.mud-grid-item{padding-left:56px;padding-top:56px}.mud-grid-spacing-xs-15{width:calc(100% + 60px);margin-left:-60px;margin-top:-60px}.mud-grid-spacing-xs-15>.mud-grid-item{padding-left:60px;padding-top:60px}.mud-grid-spacing-xs-16{width:calc(100% + 64px);margin-left:-64px;margin-top:-64px}.mud-grid-spacing-xs-16>.mud-grid-item{padding-left:64px;padding-top:64px}.mud-grid-spacing-xs-17{width:calc(100% + 68px);margin-left:-68px;margin-top:-68px}.mud-grid-spacing-xs-17>.mud-grid-item{padding-left:68px;padding-top:68px}.mud-grid-spacing-xs-18{width:calc(100% + 72px);margin-left:-72px;margin-top:-72px}.mud-grid-spacing-xs-18>.mud-grid-item{padding-left:72px;padding-top:72px}.mud-grid-spacing-xs-19{width:calc(100% + 76px);margin-left:-76px;margin-top:-76px}.mud-grid-spacing-xs-19>.mud-grid-item{padding-left:76px;padding-top:76px}.mud-grid-spacing-xs-20{width:calc(100% + 80px);margin-left:-80px;margin-top:-80px}.mud-grid-spacing-xs-20>.mud-grid-item{padding-left:80px;padding-top:80px}@media(min-width: 0px){.mud-grid-item-xs-1{flex-grow:0;max-width:calc(100%/12*1);flex-basis:calc(100%/12*1)}.mud-grid-item-xs-2{flex-grow:0;max-width:calc(100%/12*2);flex-basis:calc(100%/12*2)}.mud-grid-item-xs-3{flex-grow:0;max-width:calc(100%/12*3);flex-basis:calc(100%/12*3)}.mud-grid-item-xs-4{flex-grow:0;max-width:calc(100%/12*4);flex-basis:calc(100%/12*4)}.mud-grid-item-xs-5{flex-grow:0;max-width:calc(100%/12*5);flex-basis:calc(100%/12*5)}.mud-grid-item-xs-6{flex-grow:0;max-width:calc(100%/12*6);flex-basis:calc(100%/12*6)}.mud-grid-item-xs-7{flex-grow:0;max-width:calc(100%/12*7);flex-basis:calc(100%/12*7)}.mud-grid-item-xs-8{flex-grow:0;max-width:calc(100%/12*8);flex-basis:calc(100%/12*8)}.mud-grid-item-xs-9{flex-grow:0;max-width:calc(100%/12*9);flex-basis:calc(100%/12*9)}.mud-grid-item-xs-10{flex-grow:0;max-width:calc(100%/12*10);flex-basis:calc(100%/12*10)}.mud-grid-item-xs-11{flex-grow:0;max-width:calc(100%/12*11);flex-basis:calc(100%/12*11)}.mud-grid-item-xs-12{flex-grow:0;max-width:calc(100%/12*12);flex-basis:calc(100%/12*12)}.mud-grid-item-xs-auto{flex-grow:0;max-width:none;flex-basis:auto}.mud-grid-item-xs-true{flex-grow:1;max-width:100%;flex-basis:0}}@media(min-width: 600px){.mud-grid-item-sm-1{flex-grow:0;max-width:calc(100%/12*1);flex-basis:calc(100%/12*1)}.mud-grid-item-sm-2{flex-grow:0;max-width:calc(100%/12*2);flex-basis:calc(100%/12*2)}.mud-grid-item-sm-3{flex-grow:0;max-width:calc(100%/12*3);flex-basis:calc(100%/12*3)}.mud-grid-item-sm-4{flex-grow:0;max-width:calc(100%/12*4);flex-basis:calc(100%/12*4)}.mud-grid-item-sm-5{flex-grow:0;max-width:calc(100%/12*5);flex-basis:calc(100%/12*5)}.mud-grid-item-sm-6{flex-grow:0;max-width:calc(100%/12*6);flex-basis:calc(100%/12*6)}.mud-grid-item-sm-7{flex-grow:0;max-width:calc(100%/12*7);flex-basis:calc(100%/12*7)}.mud-grid-item-sm-8{flex-grow:0;max-width:calc(100%/12*8);flex-basis:calc(100%/12*8)}.mud-grid-item-sm-9{flex-grow:0;max-width:calc(100%/12*9);flex-basis:calc(100%/12*9)}.mud-grid-item-sm-10{flex-grow:0;max-width:calc(100%/12*10);flex-basis:calc(100%/12*10)}.mud-grid-item-sm-11{flex-grow:0;max-width:calc(100%/12*11);flex-basis:calc(100%/12*11)}.mud-grid-item-sm-12{flex-grow:0;max-width:calc(100%/12*12);flex-basis:calc(100%/12*12)}.mud-grid-item-sm-auto{flex-grow:0;max-width:none;flex-basis:auto}.mud-grid-item-sm-true{flex-grow:1;max-width:100%;flex-basis:0}}@media(min-width: 960px){.mud-grid-item-md-1{flex-grow:0;max-width:calc(100%/12*1);flex-basis:calc(100%/12*1)}.mud-grid-item-md-2{flex-grow:0;max-width:calc(100%/12*2);flex-basis:calc(100%/12*2)}.mud-grid-item-md-3{flex-grow:0;max-width:calc(100%/12*3);flex-basis:calc(100%/12*3)}.mud-grid-item-md-4{flex-grow:0;max-width:calc(100%/12*4);flex-basis:calc(100%/12*4)}.mud-grid-item-md-5{flex-grow:0;max-width:calc(100%/12*5);flex-basis:calc(100%/12*5)}.mud-grid-item-md-6{flex-grow:0;max-width:calc(100%/12*6);flex-basis:calc(100%/12*6)}.mud-grid-item-md-7{flex-grow:0;max-width:calc(100%/12*7);flex-basis:calc(100%/12*7)}.mud-grid-item-md-8{flex-grow:0;max-width:calc(100%/12*8);flex-basis:calc(100%/12*8)}.mud-grid-item-md-9{flex-grow:0;max-width:calc(100%/12*9);flex-basis:calc(100%/12*9)}.mud-grid-item-md-10{flex-grow:0;max-width:calc(100%/12*10);flex-basis:calc(100%/12*10)}.mud-grid-item-md-11{flex-grow:0;max-width:calc(100%/12*11);flex-basis:calc(100%/12*11)}.mud-grid-item-md-12{flex-grow:0;max-width:calc(100%/12*12);flex-basis:calc(100%/12*12)}.mud-grid-item-md-auto{flex-grow:0;max-width:none;flex-basis:auto}.mud-grid-item-md-true{flex-grow:1;max-width:100%;flex-basis:0}}@media(min-width: 1280px){.mud-grid-item-lg-1{flex-grow:0;max-width:calc(100%/12*1);flex-basis:calc(100%/12*1)}.mud-grid-item-lg-2{flex-grow:0;max-width:calc(100%/12*2);flex-basis:calc(100%/12*2)}.mud-grid-item-lg-3{flex-grow:0;max-width:calc(100%/12*3);flex-basis:calc(100%/12*3)}.mud-grid-item-lg-4{flex-grow:0;max-width:calc(100%/12*4);flex-basis:calc(100%/12*4)}.mud-grid-item-lg-5{flex-grow:0;max-width:calc(100%/12*5);flex-basis:calc(100%/12*5)}.mud-grid-item-lg-6{flex-grow:0;max-width:calc(100%/12*6);flex-basis:calc(100%/12*6)}.mud-grid-item-lg-7{flex-grow:0;max-width:calc(100%/12*7);flex-basis:calc(100%/12*7)}.mud-grid-item-lg-8{flex-grow:0;max-width:calc(100%/12*8);flex-basis:calc(100%/12*8)}.mud-grid-item-lg-9{flex-grow:0;max-width:calc(100%/12*9);flex-basis:calc(100%/12*9)}.mud-grid-item-lg-10{flex-grow:0;max-width:calc(100%/12*10);flex-basis:calc(100%/12*10)}.mud-grid-item-lg-11{flex-grow:0;max-width:calc(100%/12*11);flex-basis:calc(100%/12*11)}.mud-grid-item-lg-12{flex-grow:0;max-width:calc(100%/12*12);flex-basis:calc(100%/12*12)}.mud-grid-item-lg-auto{flex-grow:0;max-width:none;flex-basis:auto}.mud-grid-item-lg-true{flex-grow:1;max-width:100%;flex-basis:0}}@media(min-width: 1920px){.mud-grid-item-xl-1{flex-grow:0;max-width:calc(100%/12*1);flex-basis:calc(100%/12*1)}.mud-grid-item-xl-2{flex-grow:0;max-width:calc(100%/12*2);flex-basis:calc(100%/12*2)}.mud-grid-item-xl-3{flex-grow:0;max-width:calc(100%/12*3);flex-basis:calc(100%/12*3)}.mud-grid-item-xl-4{flex-grow:0;max-width:calc(100%/12*4);flex-basis:calc(100%/12*4)}.mud-grid-item-xl-5{flex-grow:0;max-width:calc(100%/12*5);flex-basis:calc(100%/12*5)}.mud-grid-item-xl-6{flex-grow:0;max-width:calc(100%/12*6);flex-basis:calc(100%/12*6)}.mud-grid-item-xl-7{flex-grow:0;max-width:calc(100%/12*7);flex-basis:calc(100%/12*7)}.mud-grid-item-xl-8{flex-grow:0;max-width:calc(100%/12*8);flex-basis:calc(100%/12*8)}.mud-grid-item-xl-9{flex-grow:0;max-width:calc(100%/12*9);flex-basis:calc(100%/12*9)}.mud-grid-item-xl-10{flex-grow:0;max-width:calc(100%/12*10);flex-basis:calc(100%/12*10)}.mud-grid-item-xl-11{flex-grow:0;max-width:calc(100%/12*11);flex-basis:calc(100%/12*11)}.mud-grid-item-xl-12{flex-grow:0;max-width:calc(100%/12*12);flex-basis:calc(100%/12*12)}.mud-grid-item-xl-auto{flex-grow:0;max-width:none;flex-basis:auto}.mud-grid-item-xl-true{flex-grow:1;max-width:100%;flex-basis:0}}@media(min-width: 2560px){.mud-grid-item-xxl-1{flex-grow:0;max-width:calc(100%/12*1);flex-basis:calc(100%/12*1)}.mud-grid-item-xxl-2{flex-grow:0;max-width:calc(100%/12*2);flex-basis:calc(100%/12*2)}.mud-grid-item-xxl-3{flex-grow:0;max-width:calc(100%/12*3);flex-basis:calc(100%/12*3)}.mud-grid-item-xxl-4{flex-grow:0;max-width:calc(100%/12*4);flex-basis:calc(100%/12*4)}.mud-grid-item-xxl-5{flex-grow:0;max-width:calc(100%/12*5);flex-basis:calc(100%/12*5)}.mud-grid-item-xxl-6{flex-grow:0;max-width:calc(100%/12*6);flex-basis:calc(100%/12*6)}.mud-grid-item-xxl-7{flex-grow:0;max-width:calc(100%/12*7);flex-basis:calc(100%/12*7)}.mud-grid-item-xxl-8{flex-grow:0;max-width:calc(100%/12*8);flex-basis:calc(100%/12*8)}.mud-grid-item-xxl-9{flex-grow:0;max-width:calc(100%/12*9);flex-basis:calc(100%/12*9)}.mud-grid-item-xxl-10{flex-grow:0;max-width:calc(100%/12*10);flex-basis:calc(100%/12*10)}.mud-grid-item-xxl-11{flex-grow:0;max-width:calc(100%/12*11);flex-basis:calc(100%/12*11)}.mud-grid-item-xxl-12{flex-grow:0;max-width:calc(100%/12*12);flex-basis:calc(100%/12*12)}.mud-grid-item-xxl-auto{flex-grow:0;max-width:none;flex-basis:auto}.mud-grid-item-xxl-true{flex-grow:1;max-width:100%;flex-basis:0}}.mud-paper{color:var(--mud-palette-text-primary);background-color:var(--mud-palette-surface);border-radius:var(--mud-default-borderradius);transition:box-shadow 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-paper-square{border-radius:0px}.mud-paper-outlined{border:1px solid var(--mud-palette-lines-default)}.mud-icon-default{color:var(--mud-palette-text-secondary)}.mud-disabled .mud-icon-root,.mud-disabled .mud-svg-icon,.mud-disabled .mud-icon-default{color:var(--mud-palette-text-disabled)}.mud-icon-root{width:1em;height:1em;display:inline-block;transition:fill 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;flex-shrink:0;user-select:none}.mud-icon-root:focus{outline:none}.mud-icon-root.mud-svg-icon{fill:currentColor}.mud-icon-size-small{font-size:1.25rem}.mud-icon-size-medium{font-size:1.5rem}.mud-icon-size-large{font-size:2.25rem}.mud-divider{margin:0;flex-shrink:0;border-color:var(--mud-palette-divider);border-width:1px;border-style:solid none none none}.mud-divider-absolute{left:0;width:100%;bottom:0;position:absolute}.mud-divider-inset{margin-left:72px;margin-inline-start:72px;margin-inline-end:unset}.mud-divider-light{border-color:var(--mud-palette-divider-light)}.mud-divider-middle{margin-left:16px;margin-right:16px}.mud-divider-vertical{border-style:none solid none none;height:100%}.mud-divider-flexitem{height:auto;align-self:stretch}.mud-divider-fullwidth{flex-grow:1;width:100%}.mud-drop-zone{position:relative;transition:all 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-drop-zone-drag-block>*{pointer-events:none}.mud-drop-zone-can-drop{background-color:var(--mud-palette-success-hover)}.mud-drop-zone-no-drop{background-color:var(--mud-palette-error-hover)}.mud-drop-item:not(.mud-drop-item-preview-start){cursor:grab;user-select:none}.mud-drop-item:not(.mud-drop-item-preview-start):active{cursor:grabbing}.mud-drop-item-preview-start{height:20px;width:100%;position:absolute;top:0;left:0;z-index:1}.mud-expansion-panels{flex:0 1 auto;position:relative;max-width:100%;transition:.3s cubic-bezier(0.25, 0.8, 0.5, 1);border-radius:var(--mud-default-borderradius)}.mud-expansion-panels.mud-expansion-panels-square{border-radius:0px}.mud-expansion-panels.mud-expansion-panels-borders .mud-expand-panel{border-bottom:1px solid var(--mud-palette-lines-default)}.mud-expand-panel{flex:1 0 100%;max-width:100%;position:relative;transition:margin .3s cubic-bezier(0.25, 0.8, 0.5, 1);transition-delay:100ms;color:var(--mud-palette-text-primary);background-color:var(--mud-palette-surface)}.mud-expand-panel.mud-expand-panel-border{border-bottom:1px solid var(--mud-palette-lines-default)}.mud-expand-panel:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.mud-expand-panel:last-child{border-bottom:none;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.mud-expand-panel.mud-panel-expanded{margin:16px 0;border-radius:inherit;border-bottom:none;transition-delay:0ms}.mud-expand-panel.mud-panel-expanded:first-child{margin-top:0}.mud-expand-panel.mud-panel-expanded:last-child{margin-bottom:0}.mud-expand-panel.mud-panel-expanded+.mud-expand-panel{border-top-left-radius:inherit;border-top-right-radius:inherit}.mud-expand-panel.mud-panel-next-expanded{border-bottom:none;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.mud-expand-panel .mud-expand-panel-header{width:100%;align-items:center;display:flex;font-size:.9375rem;line-height:1;min-height:48px;outline:none;padding:16px 24px;position:relative;transition:min-height .3s cubic-bezier(0.25, 0.8, 0.5, 1);user-select:none}.mud-expand-panel .mud-expand-panel-header:hover{cursor:pointer}.mud-expand-panel .mud-expand-panel-header .mud-expand-panel-text{flex:1 1 auto}.mud-expand-panel .mud-expand-panel-header .mud-expand-panel-icon{transition:.3s cubic-bezier(0.25, 0.8, 0.5, 1),visibility 0s}.mud-expand-panel .mud-expand-panel-header .mud-expand-panel-icon.mud-transform{transform:rotate(-180deg)}.mud-expand-panel .mud-expand-panel-content{padding-bottom:16px;flex:1 1 auto;max-width:100%}.mud-expand-panel .mud-expand-panel-content.mud-expand-panel-gutters{padding-left:24px;padding-right:24px}.mud-expand-panel .mud-expand-panel-content.mud-expand-panel-dense{padding-top:0px;padding-bottom:0px}.mud-disabled>.mud-expand-panel-header{color:var(--mud-palette-text-disabled)}.mud-disabled>.mud-expand-panel-header:hover{cursor:default}.mud-fab{padding:0;font-family:var(--mud-typography-button-family);font-size:var(--mud-typography-button-size);font-weight:var(--mud-typography-button-weight);line-height:var(--mud-typography-button-lineheight);letter-spacing:var(--mud-typography-button-letterspacing);text-transform:var(--mud-typography-button-text-transform);min-width:0;box-shadow:0px 3px 5px -1px rgba(0,0,0,.2),0px 6px 10px 0px rgba(0,0,0,.14),0px 1px 18px 0px rgba(0,0,0,.12);box-sizing:border-box;min-height:36px;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;border-radius:50%;color:var(--mud-palette-text-primary);--mud-ripple-color: var(--mud-palette-text-primary);background-color:var(--mud-palette-action-default-hover)}@media(hover: hover)and (pointer: fine){.mud-fab:hover{box-shadow:0px 5px 5px -3px rgba(0,0,0,.2),0px 8px 10px 1px rgba(0,0,0,.14),0px 3px 14px 2px rgba(0,0,0,.12);text-decoration:none;background-color:var(--mud-palette-action-disabled-background)}}.mud-fab:focus-visible{box-shadow:0px 5px 5px -3px rgba(0,0,0,.2),0px 8px 10px 1px rgba(0,0,0,.14),0px 3px 14px 2px rgba(0,0,0,.12);text-decoration:none;background-color:var(--mud-palette-action-disabled-background)}.mud-fab:active{box-shadow:0px 7px 8px -4px rgba(0,0,0,.2),0px 12px 17px 2px rgba(0,0,0,.14),0px 5px 22px 4px rgba(0,0,0,.12);text-decoration:none;background-color:var(--mud-palette-action-disabled-background)}.mud-fab:disabled{color:var(--mud-palette-action-disabled);box-shadow:none;background-color:var(--mud-palette-action-disabled-background);cursor:default;pointer-events:none}@media(hover: hover)and (pointer: fine){.mud-fab:disabled:hover{background-color:var(--mud-palette-action-disabled-background)}}.mud-fab-disable-elevation{box-shadow:none}@media(hover: hover)and (pointer: fine){.mud-fab-disable-elevation:hover{box-shadow:none}}.mud-fab-disable-elevation:active{box-shadow:none}.mud-fab-disable-elevation.mud-focus-visible{box-shadow:none}.mud-fab-disable-elevation:disabled{box-shadow:none}.mud-fab-label{width:100%;display:inherit;align-items:inherit;justify-content:inherit}.mud-fab-primary{color:var(--mud-palette-primary-text);--mud-ripple-color: var(--mud-palette-primary-text) !important;--mud-ripple-opacity: var(--mud-ripple-opacity-secondary) !important;background-color:var(--mud-palette-primary)}@media(hover: hover)and (pointer: fine){.mud-fab-primary:hover{background-color:var(--mud-palette-primary-darken)}}.mud-fab-primary:focus-visible,.mud-fab-primary:active{background-color:var(--mud-palette-primary-darken)}.mud-fab-secondary{color:var(--mud-palette-secondary-text);--mud-ripple-color: var(--mud-palette-secondary-text) !important;--mud-ripple-opacity: var(--mud-ripple-opacity-secondary) !important;background-color:var(--mud-palette-secondary)}@media(hover: hover)and (pointer: fine){.mud-fab-secondary:hover{background-color:var(--mud-palette-secondary-darken)}}.mud-fab-secondary:focus-visible,.mud-fab-secondary:active{background-color:var(--mud-palette-secondary-darken)}.mud-fab-tertiary{color:var(--mud-palette-tertiary-text);--mud-ripple-color: var(--mud-palette-tertiary-text) !important;--mud-ripple-opacity: var(--mud-ripple-opacity-secondary) !important;background-color:var(--mud-palette-tertiary)}@media(hover: hover)and (pointer: fine){.mud-fab-tertiary:hover{background-color:var(--mud-palette-tertiary-darken)}}.mud-fab-tertiary:focus-visible,.mud-fab-tertiary:active{background-color:var(--mud-palette-tertiary-darken)}.mud-fab-info{color:var(--mud-palette-info-text);--mud-ripple-color: var(--mud-palette-info-text) !important;--mud-ripple-opacity: var(--mud-ripple-opacity-secondary) !important;background-color:var(--mud-palette-info)}@media(hover: hover)and (pointer: fine){.mud-fab-info:hover{background-color:var(--mud-palette-info-darken)}}.mud-fab-info:focus-visible,.mud-fab-info:active{background-color:var(--mud-palette-info-darken)}.mud-fab-success{color:var(--mud-palette-success-text);--mud-ripple-color: var(--mud-palette-success-text) !important;--mud-ripple-opacity: var(--mud-ripple-opacity-secondary) !important;background-color:var(--mud-palette-success)}@media(hover: hover)and (pointer: fine){.mud-fab-success:hover{background-color:var(--mud-palette-success-darken)}}.mud-fab-success:focus-visible,.mud-fab-success:active{background-color:var(--mud-palette-success-darken)}.mud-fab-warning{color:var(--mud-palette-warning-text);--mud-ripple-color: var(--mud-palette-warning-text) !important;--mud-ripple-opacity: var(--mud-ripple-opacity-secondary) !important;background-color:var(--mud-palette-warning)}@media(hover: hover)and (pointer: fine){.mud-fab-warning:hover{background-color:var(--mud-palette-warning-darken)}}.mud-fab-warning:focus-visible,.mud-fab-warning:active{background-color:var(--mud-palette-warning-darken)}.mud-fab-error{color:var(--mud-palette-error-text);--mud-ripple-color: var(--mud-palette-error-text) !important;--mud-ripple-opacity: var(--mud-ripple-opacity-secondary) !important;background-color:var(--mud-palette-error)}@media(hover: hover)and (pointer: fine){.mud-fab-error:hover{background-color:var(--mud-palette-error-darken)}}.mud-fab-error:focus-visible,.mud-fab-error:active{background-color:var(--mud-palette-error-darken)}.mud-fab-dark{color:var(--mud-palette-dark-text);--mud-ripple-color: var(--mud-palette-dark-text) !important;--mud-ripple-opacity: var(--mud-ripple-opacity-secondary) !important;background-color:var(--mud-palette-dark)}@media(hover: hover)and (pointer: fine){.mud-fab-dark:hover{background-color:var(--mud-palette-dark-darken)}}.mud-fab-dark:focus-visible,.mud-fab-dark:active{background-color:var(--mud-palette-dark-darken)}.mud-fab-extended.mud-fab-size-large{width:auto;height:48px;padding:0 16px;min-width:48px;min-height:auto;border-radius:24px}.mud-fab-extended.mud-fab-size-large .mud-fab-label{gap:8px}.mud-fab-extended.mud-fab-size-small{width:auto;height:34px;padding:0 12px;min-width:34px;border-radius:17px}.mud-fab-extended.mud-fab-size-small .mud-fab-label{gap:4px}.mud-fab-extended.mud-fab-size-medium{width:auto;height:40px;padding:0 16px;min-width:40px;border-radius:20px}.mud-fab-extended.mud-fab-size-medium .mud-fab-label{gap:8px}.mud-fab-color-inherit{color:inherit}.mud-fab-size-small{width:40px;height:40px}.mud-fab-size-medium{width:48px;height:48px}.mud-fab-size-large{width:56px;height:56px}.mud-form{display:flex;flex-direction:column}.mud-list{margin:0;padding:0;position:relative;list-style:none}.mud-list.mud-list-padding{padding-top:8px;padding-bottom:8px}.mud-list-item{width:100%;display:flex;position:relative;box-sizing:border-box;text-align:start;align-items:center;padding-top:8px;padding-bottom:8px;justify-content:flex-start;text-decoration:none}.mud-list-item.mud-list-item-dense{padding-top:4px;padding-bottom:4px}.mud-list-item.mud-list-item-disabled{color:var(--mud-palette-action-disabled) !important;cursor:default !important;pointer-events:none !important}.mud-list-item.mud-list-item-disabled .mud-list-item-icon{color:var(--mud-palette-action-disabled) !important}.mud-list-item.mud-list-item-disabled .mud-list-item-secondary-text{color:var(--mud-palette-action-disabled) !important}.mud-list-item-clickable{color:inherit;border:0;cursor:pointer;margin:0;outline:0;user-select:none;border-radius:0;vertical-align:middle;background-color:rgba(0,0,0,0);-webkit-appearance:none;-webkit-tap-highlight-color:rgba(0,0,0,0);transition:background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}@media(hover: hover)and (pointer: fine){.mud-list-item-clickable:hover{background-color:var(--mud-palette-action-default-hover)}}.mud-list-item-clickable:focus:not(.mud-selected-item),.mud-list-item-clickable:active{background-color:var(--mud-palette-action-default-hover)}.mud-list-item-gutters{padding-left:16px;padding-right:16px}.mud-list-item-text{flex:1 1 auto;min-width:0;margin-top:4px;margin-bottom:4px}.mud-list-item-text-inset{padding-left:56px;padding-inline-start:56px;padding-inline-end:unset}.mud-list-item-icon{color:var(--mud-palette-action-default);display:inline-flex;min-width:56px;flex-shrink:0}.mud-list-subheader{color:var(--mud-palette-action-default);font-size:.875rem;box-sizing:border-box;list-style:none;font-weight:500;padding-top:8px;padding-bottom:20px}.mud-list-subheader-gutters{padding-left:16px;padding-right:16px}.mud-list-subheader-inset{padding-left:72px;padding-inline-start:72px;padding-inline-end:unset}.mud-list-subheader-sticky{top:0;z-index:1;position:sticky;background-color:inherit}.mud-list-item-avatar{min-width:56px;flex-shrink:0}.mud-nested-list>.mud-list-item{padding-left:32px;padding-inline-start:32px;padding-inline-end:unset}.mud-list-item-secondary-text{font-weight:500;color:var(--mud-palette-text-secondary)}.mud-application-layout-rtl{direction:rtl}.mud-menu{display:inline-flex;align-self:center;position:relative}.mud-menu *{cursor:pointer}.mud-menu>div.mud-disabled{cursor:default}.mud-menu>div.mud-disabled *{cursor:default}.mud-menu>div.mud-menu-activator{display:contents;user-select:none}.mud-link.mud-link-underline-none{text-decoration:none}.mud-link.mud-link-underline-hover{text-decoration:none}@media(hover: hover)and (pointer: fine){.mud-link.mud-link-underline-hover:hover{text-decoration:underline}}.mud-link.mud-link-underline-hover:focus-visible,.mud-link.mud-link-underline-hover:active{text-decoration:underline}.mud-link.mud-link-underline-always{text-decoration:underline}.mud-link.mud-link-disabled{cursor:default;color:var(--mud-palette-action-disabled) !important}.mud-link.mud-link-disabled:not(.mud-link-underline-always){text-decoration:none}.mud-navmenu{margin:0;position:relative;list-style:none;overscroll-behavior-y:contain}.mud-nav-group{width:100%;display:block;justify-content:flex-start}.mud-nav-group>.mud-nav-link>.mud-nav-link-text{font-weight:500}.mud-nav-group * .mud-nav-group>.mud-nav-link>.mud-nav-link-text{font-weight:400}.mud-nav-group * .mud-nav-group>.mud-nav-link.mud-expanded>.mud-nav-link-text{font-weight:500}.mud-nav-group * .mud-navmenu .mud-nav-item .mud-nav-link{padding-left:36px;padding-inline-start:36px;padding-inline-end:unset}.mud-nav-group-disabled,.mud-nav-group-disabled .mud-nav-link-text,.mud-nav-group-disabled .mud-nav-link-expand-icon,.mud-nav-group-disabled .mud-nav-link-icon{color:var(--mud-palette-text-disabled) !important;cursor:default;pointer-events:none}.mud-nav-item{width:100%;display:flex;justify-content:flex-start;text-decoration:none}.mud-nav-link{width:100%;font-weight:400;padding:8px 16px 8px 16px;color:inherit;line-height:1.75;display:inline-flex;align-items:center;justify-content:flex-start;text-transform:inherit;background-color:rgba(0,0,0,0);transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,padding 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;align-items:flex-start}.mud-nav-link.mud-nav-link-disabled{color:var(--mud-palette-text-disabled) !important;cursor:default;pointer-events:none}@media(hover: hover)and (pointer: fine){.mud-nav-link:hover:not(.mud-nav-link-disabled){cursor:pointer;text-decoration:none;background-color:var(--mud-palette-action-default-hover)}}.mud-nav-link:focus:not(.mud-nav-link-disabled){background-color:var(--mud-palette-action-default-hover)}.mud-nav-link.active:not(.mud-nav-link-disabled){font-weight:500 !important}.mud-nav-link:not(.mud-nav-link-disabled) .mud-nav-link-icon.mud-nav-link-icon-default{color:var(--mud-palette-drawer-icon)}.mud-nav-link.mud-nav-link-disabled .mud-nav-link-icon{color:var(--mud-palette-text-disabled)}.mud-nav-link .mud-nav-link-expand-icon{color:var(--mud-palette-drawer-icon);transition:.3s cubic-bezier(0.25, 0.8, 0.5, 1),visibility 0s}.mud-nav-link .mud-nav-link-expand-icon.mud-transform{transform:rotate(-180deg)}.mud-nav-link .mud-nav-link-expand-icon.mud-transform-disabled{transform:rotate(-180deg)}.mud-nav-link .mud-nav-link-text{width:100%;text-align:start;margin-left:12px;margin-inline-start:12px;margin-inline-end:unset;letter-spacing:0}.mud-navmenu.mud-navmenu-dense .mud-nav-link{padding:4px 16px 4px 16px}.mud-navmenu.mud-navmenu-margin-dense .mud-nav-link{margin:2px 0}.mud-navmenu.mud-navmenu-margin-normal .mud-nav-link{margin:4px 0}.mud-navmenu.mud-navmenu-rounded .mud-nav-link{border-radius:var(--mud-default-borderradius)}.mud-navmenu.mud-navmenu-bordered .mud-nav-link.active:not(.mud-nav-link-disabled){border-inline-end-style:solid;border-inline-end-width:2px}.mud-navmenu.mud-navmenu-default .mud-nav-link.active:not(.mud-nav-link-disabled){color:var(--mud-palette-primary);background-color:var(--mud-palette-action-default-hover)}@media(hover: hover)and (pointer: fine){.mud-navmenu.mud-navmenu-default .mud-nav-link.active:not(.mud-nav-link-disabled):hover:not(.mud-nav-link-disabled){background-color:var(--mud-palette-action-default-hover)}}.mud-navmenu.mud-navmenu-default .mud-nav-link.active:not(.mud-nav-link-disabled):focus-visible:not(.mud-nav-link-disabled),.mud-navmenu.mud-navmenu-default .mud-nav-link.active:not(.mud-nav-link-disabled):active:not(.mud-nav-link-disabled){background-color:var(--mud-palette-action-default-hover)}.mud-navmenu.mud-navmenu-default .mud-nav-link-expand-icon.mud-transform{fill:var(--mud-palette-primary)}.mud-navmenu.mud-navmenu-primary .mud-nav-link.active:not(.mud-nav-link-disabled){color:var(--mud-palette-primary);--mud-ripple-color: var(--mud-palette-primary);background-color:var(--mud-palette-primary-hover)}@media(hover: hover)and (pointer: fine){.mud-navmenu.mud-navmenu-primary .mud-nav-link.active:not(.mud-nav-link-disabled):hover:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-primary-rgb), 0.12)}}.mud-navmenu.mud-navmenu-primary .mud-nav-link.active:not(.mud-nav-link-disabled):focus-visible:not(.mud-nav-link-disabled),.mud-navmenu.mud-navmenu-primary .mud-nav-link.active:not(.mud-nav-link-disabled):active:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-primary-rgb), 0.12)}.mud-navmenu.mud-navmenu-primary .mud-nav-link.active:not(.mud-nav-link-disabled) .mud-nav-link-icon{color:var(--mud-palette-primary)}.mud-navmenu.mud-navmenu-primary .mud-nav-link-expand-icon.mud-transform{fill:var(--mud-palette-primary)}.mud-navmenu.mud-navmenu-secondary .mud-nav-link.active:not(.mud-nav-link-disabled){color:var(--mud-palette-secondary);--mud-ripple-color: var(--mud-palette-secondary);background-color:var(--mud-palette-secondary-hover)}@media(hover: hover)and (pointer: fine){.mud-navmenu.mud-navmenu-secondary .mud-nav-link.active:not(.mud-nav-link-disabled):hover:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-secondary-rgb), 0.12)}}.mud-navmenu.mud-navmenu-secondary .mud-nav-link.active:not(.mud-nav-link-disabled):focus-visible:not(.mud-nav-link-disabled),.mud-navmenu.mud-navmenu-secondary .mud-nav-link.active:not(.mud-nav-link-disabled):active:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-secondary-rgb), 0.12)}.mud-navmenu.mud-navmenu-secondary .mud-nav-link.active:not(.mud-nav-link-disabled) .mud-nav-link-icon{color:var(--mud-palette-secondary)}.mud-navmenu.mud-navmenu-secondary .mud-nav-link-expand-icon.mud-transform{fill:var(--mud-palette-secondary)}.mud-navmenu.mud-navmenu-tertiary .mud-nav-link.active:not(.mud-nav-link-disabled){color:var(--mud-palette-tertiary);--mud-ripple-color: var(--mud-palette-tertiary);background-color:var(--mud-palette-tertiary-hover)}@media(hover: hover)and (pointer: fine){.mud-navmenu.mud-navmenu-tertiary .mud-nav-link.active:not(.mud-nav-link-disabled):hover:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-tertiary-rgb), 0.12)}}.mud-navmenu.mud-navmenu-tertiary .mud-nav-link.active:not(.mud-nav-link-disabled):focus-visible:not(.mud-nav-link-disabled),.mud-navmenu.mud-navmenu-tertiary .mud-nav-link.active:not(.mud-nav-link-disabled):active:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-tertiary-rgb), 0.12)}.mud-navmenu.mud-navmenu-tertiary .mud-nav-link.active:not(.mud-nav-link-disabled) .mud-nav-link-icon{color:var(--mud-palette-tertiary)}.mud-navmenu.mud-navmenu-tertiary .mud-nav-link-expand-icon.mud-transform{fill:var(--mud-palette-tertiary)}.mud-navmenu.mud-navmenu-info .mud-nav-link.active:not(.mud-nav-link-disabled){color:var(--mud-palette-info);--mud-ripple-color: var(--mud-palette-info);background-color:var(--mud-palette-info-hover)}@media(hover: hover)and (pointer: fine){.mud-navmenu.mud-navmenu-info .mud-nav-link.active:not(.mud-nav-link-disabled):hover:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-info-rgb), 0.12)}}.mud-navmenu.mud-navmenu-info .mud-nav-link.active:not(.mud-nav-link-disabled):focus-visible:not(.mud-nav-link-disabled),.mud-navmenu.mud-navmenu-info .mud-nav-link.active:not(.mud-nav-link-disabled):active:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-info-rgb), 0.12)}.mud-navmenu.mud-navmenu-info .mud-nav-link.active:not(.mud-nav-link-disabled) .mud-nav-link-icon{color:var(--mud-palette-info)}.mud-navmenu.mud-navmenu-info .mud-nav-link-expand-icon.mud-transform{fill:var(--mud-palette-info)}.mud-navmenu.mud-navmenu-success .mud-nav-link.active:not(.mud-nav-link-disabled){color:var(--mud-palette-success);--mud-ripple-color: var(--mud-palette-success);background-color:var(--mud-palette-success-hover)}@media(hover: hover)and (pointer: fine){.mud-navmenu.mud-navmenu-success .mud-nav-link.active:not(.mud-nav-link-disabled):hover:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-success-rgb), 0.12)}}.mud-navmenu.mud-navmenu-success .mud-nav-link.active:not(.mud-nav-link-disabled):focus-visible:not(.mud-nav-link-disabled),.mud-navmenu.mud-navmenu-success .mud-nav-link.active:not(.mud-nav-link-disabled):active:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-success-rgb), 0.12)}.mud-navmenu.mud-navmenu-success .mud-nav-link.active:not(.mud-nav-link-disabled) .mud-nav-link-icon{color:var(--mud-palette-success)}.mud-navmenu.mud-navmenu-success .mud-nav-link-expand-icon.mud-transform{fill:var(--mud-palette-success)}.mud-navmenu.mud-navmenu-warning .mud-nav-link.active:not(.mud-nav-link-disabled){color:var(--mud-palette-warning);--mud-ripple-color: var(--mud-palette-warning);background-color:var(--mud-palette-warning-hover)}@media(hover: hover)and (pointer: fine){.mud-navmenu.mud-navmenu-warning .mud-nav-link.active:not(.mud-nav-link-disabled):hover:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-warning-rgb), 0.12)}}.mud-navmenu.mud-navmenu-warning .mud-nav-link.active:not(.mud-nav-link-disabled):focus-visible:not(.mud-nav-link-disabled),.mud-navmenu.mud-navmenu-warning .mud-nav-link.active:not(.mud-nav-link-disabled):active:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-warning-rgb), 0.12)}.mud-navmenu.mud-navmenu-warning .mud-nav-link.active:not(.mud-nav-link-disabled) .mud-nav-link-icon{color:var(--mud-palette-warning)}.mud-navmenu.mud-navmenu-warning .mud-nav-link-expand-icon.mud-transform{fill:var(--mud-palette-warning)}.mud-navmenu.mud-navmenu-error .mud-nav-link.active:not(.mud-nav-link-disabled){color:var(--mud-palette-error);--mud-ripple-color: var(--mud-palette-error);background-color:var(--mud-palette-error-hover)}@media(hover: hover)and (pointer: fine){.mud-navmenu.mud-navmenu-error .mud-nav-link.active:not(.mud-nav-link-disabled):hover:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-error-rgb), 0.12)}}.mud-navmenu.mud-navmenu-error .mud-nav-link.active:not(.mud-nav-link-disabled):focus-visible:not(.mud-nav-link-disabled),.mud-navmenu.mud-navmenu-error .mud-nav-link.active:not(.mud-nav-link-disabled):active:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-error-rgb), 0.12)}.mud-navmenu.mud-navmenu-error .mud-nav-link.active:not(.mud-nav-link-disabled) .mud-nav-link-icon{color:var(--mud-palette-error)}.mud-navmenu.mud-navmenu-error .mud-nav-link-expand-icon.mud-transform{fill:var(--mud-palette-error)}.mud-navmenu.mud-navmenu-dark .mud-nav-link.active:not(.mud-nav-link-disabled){color:var(--mud-palette-dark);--mud-ripple-color: var(--mud-palette-dark);background-color:var(--mud-palette-dark-hover)}@media(hover: hover)and (pointer: fine){.mud-navmenu.mud-navmenu-dark .mud-nav-link.active:not(.mud-nav-link-disabled):hover:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-dark-rgb), 0.12)}}.mud-navmenu.mud-navmenu-dark .mud-nav-link.active:not(.mud-nav-link-disabled):focus-visible:not(.mud-nav-link-disabled),.mud-navmenu.mud-navmenu-dark .mud-nav-link.active:not(.mud-nav-link-disabled):active:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-dark-rgb), 0.12)}.mud-navmenu.mud-navmenu-dark .mud-nav-link.active:not(.mud-nav-link-disabled) .mud-nav-link-icon{color:var(--mud-palette-dark)}.mud-navmenu.mud-navmenu-dark .mud-nav-link-expand-icon.mud-transform{fill:var(--mud-palette-dark)}.mud-nav-group * .mud-navmenu>.mud-nav-group .mud-nav-link{padding-left:36px;padding-inline-start:36px;padding-inline-end:16px}.mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu .mud-nav-item .mud-nav-link{padding-left:48px;padding-inline-start:48px}.mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu>.mud-nav-group .mud-nav-link{padding-left:48px;padding-inline-start:48px;padding-inline-end:16px}.mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu .mud-nav-item .mud-nav-link{padding-left:60px;padding-inline-start:60px;padding-inline-end:0}.mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu>.mud-nav-group .mud-nav-link{padding-left:60px;padding-inline-start:60px;padding-inline-end:16px}.mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu .mud-nav-item .mud-nav-link{padding-left:72px;padding-inline-start:72px;padding-inline-end:0}.mud-drawer-mini .mud-nav-link{line-height:1;display:flex;align-items:center}.mud-drawer--closed.mud-drawer-mini>.mud-drawer-content>.mud-navmenu .mud-nav-link .mud-icon-root:first-child+.mud-nav-link-text{display:none}.mud-drawer--closed.mud-drawer-mini .mud-nav-group * .mud-navmenu .mud-nav-item .mud-nav-link{padding:8px 16px 8px 16px}.mud-drawer--closed.mud-drawer-mini .mud-nav-group * .mud-navmenu>.mud-nav-group .mud-nav-link{padding:8px 16px 8px 16px}.mud-drawer--closed.mud-drawer-mini .mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu .mud-nav-item .mud-nav-link{padding:8px 16px 8px 16px}.mud-drawer--closed.mud-drawer-mini .mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu>.mud-nav-group .mud-nav-link{padding:8px 16px 8px 16px}.mud-drawer--closed.mud-drawer-mini .mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu .mud-nav-item .mud-nav-link{padding:8px 16px 8px 16px}.mud-drawer--closed.mud-drawer-mini .mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu>.mud-nav-group .mud-nav-link{padding:8px 16px 8px 16px}.mud-drawer--closed.mud-drawer-mini .mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu .mud-nav-item .mud-nav-link{padding:8px 16px 8px 16px}.page-content-navigation .page-content-navigation-navlink.active .mud-nav-link{color:var(--mud-palette-primary);border-color:var(--mud-palette-primary);background-color:rgba(0,0,0,0)}.page-content-navigation .page-content-navigation-navlink .mud-nav-link{padding:4px 16px 4px 16px;color:var(--mud-palette-text-secondary);border-left:2px solid var(--mud-palette-action-disabled-background)}.page-content-navigation .page-content-navigation-navlink .mud-nav-link.active{color:var(--mud-palette-primary);border-color:var(--mud-palette-primary);background-color:rgba(0,0,0,0)}.page-content-navigation .page-content-navigation-navlink .mud-nav-link .mud-nav-link-text{margin-left:0px;margin-inline-start:0px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mud-pagination{display:inline-flex;flex-wrap:wrap;gap:6px;align-items:center;margin:0}.mud-pagination .mud-pagination-item>*{height:32px;min-width:32px;margin:0 3px;padding:0 6px;text-align:center;border-radius:16px}.mud-pagination .mud-pagination-item :not(mud-pagination-item-selected)>*{box-shadow:none}.mud-pagination .mud-pagination-item .mud-button{line-height:normal}.mud-pagination .mud-pagination-item .mud-icon-button{padding:0}.mud-pagination .mud-pagination-item-rectangular .mud-button{border-radius:var(--mud-default-borderradius)}.mud-pagination .mud-pagination-item .mud-typography[disabled]{color:var(--mud-palette-action-disabled) !important}.mud-pagination-outlined .mud-pagination-item-selected .mud-button-outlined-default{background-color:var(--mud-palette-action-default-hover)}.mud-pagination-outlined .mud-pagination-item-selected .mud-button-outlined-primary{background-color:var(--mud-palette-primary-hover)}.mud-pagination-outlined .mud-pagination-item-selected .mud-button-outlined-secondary{background-color:var(--mud-palette-secondary-hover)}.mud-pagination-outlined .mud-pagination-item-selected .mud-button-outlined-tertiary{background-color:var(--mud-palette-tertiary-hover)}.mud-pagination-outlined .mud-pagination-item-selected .mud-button-outlined-info{background-color:var(--mud-palette-info-hover)}.mud-pagination-outlined .mud-pagination-item-selected .mud-button-outlined-success{background-color:var(--mud-palette-success-hover)}.mud-pagination-outlined .mud-pagination-item-selected .mud-button-outlined-warning{background-color:var(--mud-palette-warning-hover)}.mud-pagination-outlined .mud-pagination-item-selected .mud-button-outlined-error{background-color:var(--mud-palette-error-hover)}.mud-pagination-outlined .mud-pagination-item-selected .mud-button-outlined-dark{background-color:var(--mud-palette-dark-hover)}.mud-pagination-filled .mud-pagination-item:not(.mud-pagination-item-selected) .mud-button{background-color:var(--mud-palette-surface)}.mud-pagination-filled .mud-pagination-item .mud-button{box-shadow:var(--mud-elevation-1)}.mud-pagination-small .mud-pagination-item>*{height:26px;min-width:26px;margin:0 1px;padding:0 4px;border-radius:13px}.mud-pagination-large .mud-pagination-item>*{height:40px;min-width:40px;padding:0 10px;border-radius:20px}.mud-pagination-disable-elevation .mud-pagination-item .mud-button{box-shadow:none}.mud-pagination-rtl .mud-pagination-item .mud-icon-root{transform:scaleX(-1)}.mud-picker.mud-rounded{border-radius:var(--mud-default-borderradius)}.mud-picker .mud-picker-actions{flex:0 0 auto;display:flex;padding:8px;align-items:center;justify-content:flex-end}.mud-picker .mud-picker-actions>:not(:first-child){margin-left:8px;margin-inline-start:8px;margin-inline-end:unset}.mud-picker-inline{display:flex;flex:1 1 auto;position:relative;max-width:100%}.mud-picker-inline.mud-picker-input-button .mud-input,.mud-picker-inline.mud-picker-input-button .mud-input .mud-input-root{cursor:pointer}.mud-picker-inline.mud-picker-input-button.mud-disabled .mud-input,.mud-picker-inline.mud-picker-input-button.mud-disabled .mud-input .mud-input-root{cursor:default}.mud-picker-inline.mud-picker-input-text{cursor:text}.mud-picker-inline.mud-picker-input-text:hover{cursor:text}.mud-picker-inline.mud-picker-input-text.mud-disabled{cursor:default}.mud-picker-inline.mud-picker-input-text.mud-disabled:hover{cursor:default}.mud-picker-static{display:flex;overflow:hidden;min-width:310px;flex-direction:column}.mud-picker-container{display:flex;flex-direction:column;border-radius:inherit}.mud-picker-container.mud-picker-container-landscape{flex-direction:row}.mud-picker-container .mud-toolbar{border-top-left-radius:inherit;border-top-right-radius:inherit}.mud-picker-popover-paper{outline:0;z-index:calc(var(--mud-zindex-popover) + 1);position:absolute;min-width:16px;min-height:16px;overflow-x:hidden;overflow-y:auto}.mud-picker-view{display:none;margin-top:20px}.mud-picker-view.mud-picker-open{display:block}.mud-picker-content{display:flex;max-width:100%;min-width:310px;min-height:305px;overflow:hidden;flex-direction:column;justify-content:center}.mud-picker-content.mud-picker-content-landscape{padding:0 8px}.mud-picker-toolbar{height:100px;display:flex;align-items:center;flex-direction:row;justify-content:center}.mud-picker-toolbar.mud-picker-toolbar-landscape{height:auto;padding:8px;max-width:150px;justify-content:flex-start}.mud-picker-toolbar.mud-button-root{padding:0;min-width:16px;text-transform:none}.mud-picker-inline-paper .mud-paper{position:relative !important}.mud-picker-hidden{visibility:hidden}.mud-picker-pos-top{top:0px;position:fixed;visibility:visible}.mud-picker-pos-top.mud-picker-pos-left{left:10px}.mud-picker-pos-top.mud-picker-pos-right{right:10px}.mud-picker-pos-above{bottom:0px;visibility:visible}.mud-picker-pos-above.mud-picker-pos-left{left:50%;transform:translateX(-50%)}.mud-picker-pos-above.mud-picker-pos-right{right:0px}.mud-picker-pos-bottom{bottom:10px;position:fixed;visibility:visible}.mud-picker-pos-bottom.mud-picker-pos-left{left:10px}.mud-picker-pos-bottom.mud-picker-pos-right{right:10px}.mud-picker-pos-below{visibility:visible}.mud-picker-pos-below.mud-picker-pos-left{left:50%;transform:translateX(-50%)}.mud-picker-pos-below.mud-picker-pos-right{right:0px}.mud-picker-datepicker-toolbar{align-items:flex-start;flex-direction:column}.mud-picker-datepicker-toolbar .mud-button-year{font-size:1rem;font-weight:400;line-height:1.75;letter-spacing:.00938em}.mud-picker-datepicker-toolbar .mud-button-date{font-size:2.125rem;font-weight:400;line-height:1.17;letter-spacing:.00735em;text-transform:none}.mud-picker-datepicker-toolbar-landscape{padding:16px}.mud-picker-datepicker-date-landscape{margin-right:16px;margin-inline-end:16px;margin-inline-start:unset}.mud-picker-calendar-header-switch{display:flex;margin-top:4px;align-items:center;margin-bottom:8px;justify-content:space-between}.mud-picker-calendar-header-switch>.mud-icon-button{z-index:1;padding:8px;margin:6px;background-color:var(--mud-palette-surface)}@media(hover: hover)and (pointer: fine){.mud-picker-calendar-header-switch>.mud-icon-button:hover{background-color:var(--mud-palette-action-default-hover)}}.mud-picker-calendar-header-switch .mud-picker-calendar-header-transition{width:100%;height:23px;overflow:hidden}@media(hover: hover)and (pointer: fine){.mud-picker-calendar-header-switch .mud-picker-calendar-header-transition:hover .mud-typography{cursor:pointer;font-weight:500}}.mud-picker-calendar-header-day{display:flex;max-height:16px;align-items:center;justify-content:center}.mud-picker-calendar-header-day .mud-day-label{color:var(--mud-palette-text-secondary);width:36px;margin:0 2px;text-align:center}.mud-picker-year-container{height:300px;overflow-y:auto}.mud-picker-year-container .mud-picker-year{cursor:pointer;height:40px;display:flex;outline:none;align-items:center;justify-content:center;user-select:none;animation:mud-animation-fadein 500ms;transition:background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}@media(hover: hover)and (pointer: fine){.mud-picker-year-container .mud-picker-year:hover{background-color:var(--mud-palette-action-default-hover)}}.mud-picker-year-container .mud-picker-year .mud-picker-year-selected{margin:10px 0;font-weight:500}.mud-picker-month-container{width:310px;display:flex;flex-wrap:wrap;align-content:stretch}.mud-picker-month-container .mud-picker-month{flex:1 0 33.33%;cursor:pointer;height:60px;display:flex;outline:none;transition:font-size 100ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;align-items:center;justify-content:center;transition:background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}@media(hover: hover)and (pointer: fine){.mud-picker-month-container .mud-picker-month:hover{background-color:var(--mud-palette-action-default-hover)}}.mud-picker-month-container .mud-picker-month .mud-picker-month-selected{font-weight:500}.mud-picker-month-container .mud-picker-month.mud-disabled{color:var(--mud-palette-text-disabled);pointer-events:none}.mud-picker-slide-transition{display:block;position:relative}.mud-picker-slide-transition>*{top:0;left:0;right:0;position:absolute}.mud-picker-calendar-transition{margin-top:12px;min-height:216px}.mud-picker-calendar-progress-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.mud-picker-calendar-content{display:grid;--selected-day: 0;grid-column-gap:10px;grid-template-columns:auto}@media(min-width: 600px){.mud-picker-calendar-content:not(.mud-picker-calendar-content-1){grid-template-columns:repeat(2, minmax(auto, 1fr))}.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-1 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-3 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-5 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-7 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-9 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-11 .mud-picker-nav-button-next{visibility:hidden}.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-1 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-3 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-5 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-7 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-9 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-11 .mud-picker-nav-button-prev{visibility:visible}.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-2 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-4 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-6 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-8 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-10 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-12 .mud-picker-nav-button-next{visibility:visible}.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-2 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-4 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-6 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-8 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-10 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-12 .mud-picker-nav-button-prev{visibility:hidden}}@media(min-width: 960px){.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2){grid-template-columns:repeat(3, minmax(auto, 1fr))}.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-1 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-4 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-7 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-10 .mud-picker-nav-button-next{visibility:hidden}.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-1 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-4 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-7 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-10 .mud-picker-nav-button-prev{visibility:visible}.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-2 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-2 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-5 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-5 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-8 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-8 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-11 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-11 .mud-picker-nav-button-prev{visibility:hidden}.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-3 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-6 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-9 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-12 .mud-picker-nav-button-next{visibility:visible}.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-3 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-6 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-9 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-12 .mud-picker-nav-button-prev{visibility:hidden}}:not(.mud-picker-hidden) .mud-picker-calendar-header-last .mud-picker-nav-button-next{visibility:inherit !important}.mud-picker-hidden .mud-picker-nav-button-next,.mud-picker-hidden .mud-picker-nav-button-prev{visibility:hidden !important}.mud-picker-calendar-container{display:flex;width:310px;flex-direction:column}.mud-picker-calendar{display:flex;flex-wrap:wrap;justify-content:center}.mud-picker-calendar .mud-day{color:var(--mud-palette-text-primary);width:36px;height:36px;margin:0 2px;padding:0;font-size:.75rem;font-weight:500}@media(hover: hover)and (pointer: fine){.mud-picker-calendar .mud-day:hover{background-color:var(--mud-palette-action-default-hover)}}.mud-picker-calendar .mud-day.mud-hidden{opacity:0;pointer-events:none}.mud-picker-calendar .mud-day.mud-current{font-weight:600}.mud-picker-calendar .mud-day.mud-selected{font-weight:500}.mud-picker-calendar .mud-day .mud-typography{margin-top:2px}.mud-picker-calendar .mud-day.mud-disabled{color:var(--mud-palette-text-disabled);pointer-events:none}.mud-picker-calendar .mud-day.mud-range{margin:0;width:40px;transition:none}.mud-picker-calendar .mud-day.mud-range.mud-range-start-selected{border-radius:50% 0% 0% 50%}.mud-picker-calendar .mud-day.mud-range.mud-range-end-selected{border-radius:0% 50% 50% 0%}.mud-picker-calendar .mud-day.mud-range.mud-range-between{border-radius:0;background-color:var(--mud-palette-action-default-hover)}@media(hover: hover)and (pointer: fine){.mud-picker-calendar .mud-day.mud-range.mud-range-selection:hover.mud-range-start-selected{border-radius:50%}.mud-picker-calendar .mud-day.mud-range.mud-range-selection:hover:not(.mud-range-start-selected){border-radius:0% 50% 50% 0%}}.mud-picker-calendar .mud-day.mud-range.mud-range-selection:not(:hover):not(.mud-range-start-selected){border-radius:0;background:linear-gradient(var(--mud-palette-action-default-hover) 100%, var(--mud-palette-action-default-hover) 100%, transparent 0%);background-size:100% calc(100%*(var(--selected-day) - var(--day-id)))}@media(hover: hover)and (pointer: fine){.mud-range-selection-primary:hover{color:var(--mud-palette-primary-text) !important;background-color:var(--mud-palette-primary) !important}}@media(hover: hover)and (pointer: fine){.mud-range-selection-secondary:hover{color:var(--mud-palette-secondary-text) !important;background-color:var(--mud-palette-secondary) !important}}@media(hover: hover)and (pointer: fine){.mud-range-selection-tertiary:hover{color:var(--mud-palette-tertiary-text) !important;background-color:var(--mud-palette-tertiary) !important}}@media(hover: hover)and (pointer: fine){.mud-range-selection-info:hover{color:var(--mud-palette-info-text) !important;background-color:var(--mud-palette-info) !important}}@media(hover: hover)and (pointer: fine){.mud-range-selection-success:hover{color:var(--mud-palette-success-text) !important;background-color:var(--mud-palette-success) !important}}@media(hover: hover)and (pointer: fine){.mud-range-selection-warning:hover{color:var(--mud-palette-warning-text) !important;background-color:var(--mud-palette-warning) !important}}@media(hover: hover)and (pointer: fine){.mud-range-selection-error:hover{color:var(--mud-palette-error-text) !important;background-color:var(--mud-palette-error) !important}}@media(hover: hover)and (pointer: fine){.mud-range-selection-dark:hover{color:var(--mud-palette-dark-text) !important;background-color:var(--mud-palette-dark) !important}}.mud-picker-calendar-week{display:flex;margin:0 5px;justify-content:center;align-items:center}.mud-picker-calendar-week .mud-picker-calendar-week-text{width:15px;margin-top:2px !important;color:var(--mud-palette-text-disabled)}.mud-application-layout-rtl .mud-picker-calendar .mud-day.mud-range.mud-range-start-selected{border-radius:0% 50% 50% 0%}.mud-application-layout-rtl .mud-picker-calendar .mud-day.mud-range.mud-range-end-selected{border-radius:50% 0% 0% 50%}@media(hover: hover)and (pointer: fine){.mud-application-layout-rtl .mud-picker-calendar .mud-day.mud-range.mud-range-selection:hover:not(.mud-range-start-selected){border-radius:50% 0% 0% 50%}}.mud-picker-timepicker-toolbar .mud-timepicker-button{padding:0;min-width:16px;text-transform:none}.mud-picker-timepicker-toolbar .mud-timepicker-button.mud-timepicker-toolbar-text{color:rgba(255,255,255,.54)}@media(hover: hover)and (pointer: fine){.mud-picker-timepicker-toolbar .mud-timepicker-button:hover{background-color:var(--mud-theme-default-hover)}}.mud-picker-timepicker-toolbar .mud-timepicker-hourminute{display:flex;align-items:baseline;justify-content:flex-end}.mud-picker-timepicker-toolbar .mud-timepicker-hourminute .mud-timepicker-button{font-size:3.75rem;font-weight:300;line-height:1;letter-spacing:-0.00833em}.mud-picker-timepicker-toolbar .mud-timepicker-ampm{display:flex;margin-left:20px;margin-right:-20px;margin-inline-start:20px;margin-inline-end:-20px;flex-direction:column}.mud-picker-timepicker-toolbar .mud-timepicker-ampm .mud-timepicker-button{font-size:18px;font-weight:400;line-height:1.75;letter-spacing:.00938em}.mud-picker-timepicker-toolbar .mud-timepicker-separator{cursor:default;margin:0 4px 0 2px;margin-inline-start:2px;margin-inline-end:4px}.mud-picker-timepicker-toolbar.mud-picker-timepicker-toolbar-landscape{flex-wrap:wrap;width:150px;justify-content:center}.mud-picker-timepicker-toolbar.mud-picker-timepicker-toolbar-landscape .mud-timepicker-hourminute .mud-timepicker-button{font-size:3rem;font-weight:400;line-height:1.04;letter-spacing:0em}.mud-picker-timepicker-toolbar.mud-picker-timepicker-toolbar-landscape .mud-timepicker-ampm{display:flex;margin-left:20px;margin-right:-20px;margin-inline-start:20px;margin-inline-end:-20px;flex-direction:column}.mud-picker-timepicker-toolbar.mud-picker-timepicker-toolbar-landscape .mud-timepicker-ampm .mud-timepicker-button{font-size:18px;font-weight:400;line-height:1.75;letter-spacing:.00938em}.mud-picker-timepicker-toolbar.mud-picker-timepicker-toolbar-landscape .mud-timepicker-separator{font-size:3rem;font-weight:400;line-height:1.04;letter-spacing:0em}.mud-picker-time-container{margin:16px 0 8px;display:flex;align-items:flex-end;justify-content:center}.mud-picker-time-container .mud-picker-time-clock{width:260px;height:260px;position:relative;border-radius:50%;pointer-events:none;touch-action:pinch-zoom;background-color:rgba(0,0,0,.07)}.mud-picker-time-container .mud-picker-time-clock .mud-picker-time-clock-mask{width:100%;height:100%;outline:none;position:absolute;user-select:none;pointer-events:auto}.mud-picker-time-container .mud-picker-time-clock .mud-picker-time-clock-pin{top:50%;left:50%;width:6px;height:6px;position:absolute;transform:translate(-50%, -50%);border-radius:50%}.mud-picker-time-container .mud-picker-time-clock .mud-picker-stick-inner{left:calc(50% - 1px);width:3px;height:35%;bottom:0;position:absolute;transform-origin:center bottom 0px}.mud-picker-time-container .mud-picker-time-clock .mud-picker-stick-inner.mud-hour:after{content:"";position:absolute;left:50%;transform:translate(-50%, -50%);height:48px;width:48px;top:-60%;border-radius:50%;background-color:inherit}.mud-picker-time-container .mud-picker-time-clock .mud-picker-stick-outer{left:calc(50% - 1px);width:0;height:35%;bottom:35%;position:absolute;transform-origin:center bottom 0px}.mud-picker-time-container .mud-picker-time-clock .mud-picker-stick-outer.mud-hour:after{content:"";position:absolute;left:50%;transform:translate(-50%, -50%);height:48px;width:62px;top:-20px;border-radius:50%;background-color:inherit}.mud-picker-time-container .mud-picker-time-clock .mud-picker-stick{left:calc(50% - 1px);width:3px;height:50%;bottom:50%;position:absolute;transform-origin:center bottom 0px}.mud-picker-time-container .mud-picker-time-clock .mud-picker-stick.mud-hour:after{content:"";position:absolute;left:50%;transform:translate(-50%, -50%);height:62px;width:62px;top:20px;border-radius:50%;background-color:inherit}.mud-picker-time-container .mud-picker-time-clock .mud-picker-stick.mud-minute:after{content:"";position:absolute;left:50%;transform:translate(-50%, -50%);height:44px;width:15px;top:20px;border-radius:50%;background-color:inherit}.mud-picker-time-container .mud-picker-time-clock .mud-picker-time-clock-pointer{left:calc(50% - 1px);width:2px;bottom:50%;position:absolute;transform-origin:center bottom 0px}.mud-picker-time-container .mud-picker-time-clock .mud-picker-time-clock-pointer.mud-picker-time-clock-pointer-animation{transition:transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,height 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-picker-time-container .mud-picker-time-clock .mud-picker-time-clock-pointer .mud-picker-time-clock-pointer-thumb{position:absolute;border-radius:100%}.mud-picker-time-container .mud-picker-time-clock .mud-picker-time-clock-pointer .mud-picker-time-clock-pointer-thumb.mud-onclock-text{top:-19px;left:-13px;width:28px;height:28px;border:none;background-color:inherit}.mud-picker-time-container .mud-picker-time-clock .mud-picker-time-clock-pointer .mud-picker-time-clock-pointer-thumb.mud-onclock-minute{background:rgba(0,0,0,0);border:2px solid;width:10px;height:10px;top:-9px;left:-4px}.mud-picker-time-container .mud-picker-time-clock .mud-clock-number{left:calc((100% - 32px)/2);color:var(--mud-palette-text-primary);background-color:rgba(0,0,0,0) !important;width:32px;height:32px;display:inline-flex;position:absolute;align-items:center;user-select:none;border-radius:50%;justify-content:center;transition-duration:120ms;transition-property:color}.mud-time-picker-dial{width:100%;height:100%;position:absolute;transition:transform 350ms,opacity 350ms}.mud-time-picker-dial-out{opacity:0}.mud-time-picker-hour.mud-time-picker-dial-out{transform:scale(1.2, 1.2);transform-origin:center}.mud-time-picker-minute.mud-time-picker-dial-out{transform:scale(0.8, 0.8);transform-origin:center}.mud-time-picker-dial-hidden{visibility:hidden}.mud-picker-container+.mud-picker-color-toolbar{border-top-left-radius:inherit;border-top-right-radius:inherit}.mud-picker-container+.mud-picker-color-content{border-top-left-radius:inherit;border-top-right-radius:inherit}.mud-picker-color-toolbar{height:32px;padding-right:2px;padding-left:2px}.mud-picker-color-content{min-height:unset;position:relative}.mud-picker-color-picker{width:312px;height:250px;position:relative;overflow:hidden;touch-action:pinch-zoom}.mud-picker-color-picker .mud-picker-color-overlay{width:100%;height:100%;user-select:none}.mud-picker-color-picker .mud-picker-color-overlay.mud-picker-color-overlay-white{background:linear-gradient(to right, white 0%, rgba(255, 255, 255, 0) 100%)}.mud-picker-color-picker .mud-picker-color-overlay.mud-picker-color-overlay-black{background:linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, black 100%)}.mud-picker-color-picker .mud-picker-color-selector{position:absolute;top:-13px;left:-13px;pointer-events:none}.mud-picker-color-controls{width:312px;padding:16px;display:flex;flex-direction:column}.mud-picker-color-controls .mud-picker-color-controls-row{display:flex;align-items:center}.mud-picker-color-controls .mud-picker-color-controls-row+.mud-picker-color-controls-row{margin-top:24px}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-sliders{display:flex;flex:1 0 auto;flex-direction:column}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-sliders .mud-picker-color-slider{min-width:224px;border-radius:var(--mud-default-borderradius)}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-sliders .mud-picker-color-slider .mud-slider-input{height:10px;border-radius:var(--mud-default-borderradius)}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-sliders .mud-picker-color-slider .mud-slider-input::-webkit-slider-runnable-track{background:initial}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-sliders .mud-picker-color-slider .mud-slider-input::-moz-range-track{background:initial}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-sliders .mud-picker-color-slider .mud-slider-input::-webkit-slider-thumb{appearance:none;margin-top:-6px;height:14px;width:14px;transform:none;transition:none;background:#f0f0f0;box-shadow:rgba(0,0,0,.37) 0px 1px 4px 0px}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-sliders .mud-picker-color-slider .mud-slider-input::-moz-range-thumb{appearance:none;margin-top:-6px;height:14px;width:14px;transform:none;transition:none;background:#f0f0f0;box-shadow:rgba(0,0,0,.37) 0px 1px 4px 0px}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-sliders .mud-picker-color-slider .mud-slider-input:active::-webkit-slider-thumb{box-shadow:0 0 0 2px var(--mud-palette-action-default-hover) !important}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-sliders .mud-picker-color-slider .mud-slider-input:active::-moz-range-thumb{box-shadow:0 0 0 2px var(--mud-palette-action-default-hover) !important}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-sliders .mud-picker-color-slider.hue+.alpha{margin-top:18px}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-sliders .mud-picker-color-slider.hue .mud-slider-input{background:linear-gradient(90deg, #FF0000, #ff0 16.66%, #0f0 33.33%, #0ff 50%, #00f 66.66%, #f0f 83.33%, #FF0000)}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-sliders .mud-picker-color-slider.alpha .mud-slider-input{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAGElEQVQYlWNgYGCQwoKxgqGgcJA5h3yFAAs8BRWVSwooAAAAAElFTkSuQmCC) repeat}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-inputs{display:flex;flex:1 1 auto}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-inputs .mud-picker-color-inputfield{width:100%;margin-right:8px;margin-inline-end:8px;margin-inline-start:unset}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-inputs .mud-picker-color-inputfield:last-of-type{margin-right:0;margin-inline-end:0;margin-inline-start:unset}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-inputs .mud-picker-color-inputfield .mud-input input{padding:6px;height:1em;text-align:center;font-size:14px}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-inputs .mud-picker-color-inputfield .mud-input-helper-text{text-align:center}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-inputs .mud-picker-color-inputfield .mud-input-helper-text div div{margin:auto}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-control-switch{margin-left:8px;margin-inline-start:8px;margin-inline-end:unset;padding-bottom:16px}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-collection{display:flex;min-width:230px;justify-content:space-between}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-collection .mud-picker-color-dot{max-width:38px}.mud-picker-color-dot{height:38px;min-width:38px;width:100%;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-radius 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;border-radius:var(--mud-default-borderradius);box-shadow:0 0 6px rgba(127,130,134,.18)}@media(hover: hover)and (pointer: fine){.mud-picker-color-dot:hover{cursor:pointer;box-shadow:0px 3px 1px -2px rgba(0,0,0,.2),0px 2px 2px 0px rgba(0,0,0,.14),0px 1px 5px 0px rgba(0,0,0,.12)}}.mud-picker-color-dot.mud-picker-color-dot-current{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAGElEQVQYlWNgYGCQwoKxgqGgcJA5h3yFAAs8BRWVSwooAAAAAElFTkSuQmCC) repeat}.mud-picker-color-dot .mud-picker-color-fill{width:100%;height:100%;border-radius:inherit}.mud-picker-color-dot+.mud-picker-color-sliders{margin-left:16px;margin-inline-start:16px;margin-inline-end:unset}.mud-picker-color-dot+.mud-picker-color-collection{margin-left:10px;margin-inline-start:10px;margin-inline-end:unset}.mud-picker-color-view{position:absolute;width:100%;height:100%;overflow:auto;padding:6px;background-color:var(--mud-palette-surface)}.mud-picker-color-view .mud-picker-color-view-collection{display:flex;flex-wrap:wrap;justify-content:space-evenly}.mud-picker-color-view .mud-picker-color-view-collection .mud-picker-color-dot{max-width:38px;margin:8px}.mud-picker-color-view .mud-picker-color-view-collection .mud-picker-color-dot.selected{border-radius:50%;box-shadow:0px 3px 1px -2px rgba(0,0,0,.2),0px 2px 2px 0px rgba(0,0,0,.14),0px 1px 5px 0px rgba(0,0,0,.12)}.mud-picker-color-picker .mud-picker-color-grid{display:flex;flex-wrap:wrap}.mud-picker-color-picker .mud-picker-color-grid .mud-picker-color-dot{height:25px;min-width:26px;max-width:26px;border-radius:0px;box-shadow:none}.mud-popover{outline:0;z-index:calc(var(--mud-zindex-popover) + 1);position:absolute;opacity:0}.mud-popover.mud-popover-fixed{position:fixed}.mud-popover.mud-popover-relative-width{width:100%}.mud-popover.mud-popover-open{opacity:1;transition:opacity}.mud-popover:not(.mud-popover-open){pointer-events:none;transition-duration:0ms !important;transition-delay:0ms !important}.mud-appbar .mud-popover-cascading-value{z-index:calc(var(--mud-zindex-appbar) + 2)}.mud-drawer:not(.mud-drawer-temporary) .mud-popover-cascading-value{z-index:calc(var(--mud-zindex-drawer) + 2)}.mud-drawer.mud-drawer-temporary .mud-popover-cascading-value,.mud-drawer.mud-drawer-responsive .mud-popover-cascading-value{z-index:calc(var(--mud-zindex-appbar) + 4)}.mud-dialog .mud-popover-cascading-value{z-index:calc(var(--mud-zindex-dialog) + 3)}.mud-popover .mud-list{max-height:inherit;overflow-y:auto}.mud-simple-table table{width:100%;display:table;border-spacing:0;border-collapse:collapse}.mud-simple-table table thead{display:table-header-group}.mud-simple-table table tbody{display:table-row-group}.mud-simple-table table * tr{color:inherit;display:table-row;outline:0;vertical-align:middle}.mud-simple-table table * tr>td,.mud-simple-table table * tr th{display:table-cell;padding:16px;font-size:.875rem;text-align:start;font-weight:400;line-height:1.43;border-bottom:1px solid var(--mud-palette-table-lines);letter-spacing:.01071em;vertical-align:inherit}.mud-simple-table table * tr>th{font-weight:500;line-height:1.5rem}.mud-simple-table table tbody tr:last-child td{border-bottom:none}.mud-simple-table.mud-table-dense * tr td,.mud-simple-table.mud-table-dense * tr th{padding:6px 16px}@media(hover: hover)and (pointer: fine){.mud-simple-table.mud-table-hover .mud-table-container table tbody tr:hover{background-color:var(--mud-palette-table-hover)}}.mud-simple-table.mud-table-bordered .mud-table-container table tbody tr td{border-right:1px solid var(--mud-palette-table-lines)}.mud-simple-table.mud-table-bordered .mud-table-container table tbody tr td:last-child{border-right:none}.mud-simple-table.mud-table-striped .mud-table-container table tbody tr:nth-of-type(odd){background-color:var(--mud-palette-table-striped)}@media(hover: hover)and (pointer: fine){.mud-table-hover.mud-table-striped .mud-table-container table tbody tr:nth-of-type(odd):nth-of-type(odd):hover{background-color:var(--mud-palette-table-hover)}}.mud-simple-table.mud-table-sticky-header .mud-table-container{overflow-x:auto;max-height:100%}.mud-simple-table.mud-table-sticky-header * table{border-collapse:separate}.mud-simple-table.mud-table-sticky-header * table thead * th:first-child{border-radius:var(--mud-default-borderradius) 0 0 0}.mud-simple-table.mud-table-sticky-header * table thead * th:last-child{border-radius:0 var(--mud-default-borderradius) 0 0}.mud-simple-table.mud-table-sticky-header * table thead * th{background-color:var(--mud-palette-surface);position:sticky;z-index:1;top:0}.mud-simple-table.mud-table-sticky-footer .mud-table-container{overflow-x:auto;max-height:100%}.mud-simple-table.mud-table-sticky-footer * table{border-collapse:separate}.mud-simple-table.mud-table-sticky-footer * table tfoot * td{background-color:var(--mud-palette-surface);position:sticky;z-index:1;bottom:0}.mud-skeleton{height:1.2em;display:block;background-color:var(--mud-palette-skeleton)}.mud-skeleton-text{height:auto;transform:scale(1, 0.6);margin-top:0;border-radius:var(--mud-default-borderradius);margin-bottom:0;transform-origin:0 60%}.mud-skeleton-text:empty:before{content:" "}.mud-skeleton-circle{border-radius:50%}.mud-skeleton-pulse{animation:mud-skeleton-keyframes-pulse 1.5s ease-in-out .5s infinite}.mud-skeleton-wave{overflow:hidden;position:relative}.mud-skeleton-wave::after{top:0;left:0;right:0;bottom:0;content:"";position:absolute;animation:mud-skeleton-keyframes-wave 1.6s linear .5s infinite;transform:translateX(-100%);background:linear-gradient(90deg, transparent, rgba(0, 0, 0, 0.04), transparent)}.mud-slider{color:var(--mud-palette-text-primary);display:inline-block;width:100%;user-select:none;touch-action:pinch-zoom}.mud-slider>.mud-typography{margin-top:10px}.mud-slider.mud-slider-vertical{transform:rotate(270deg);height:100%;width:unset}.mud-slider .mud-slider-input{-webkit-appearance:none;-moz-appearance:none;position:relative;display:block;width:100%;background-color:rgba(0,0,0,0);cursor:pointer}.mud-slider .mud-slider-input:focus{outline:none}.mud-slider .mud-slider-input:active+.mud-slider-value-label{opacity:1}.mud-slider .mud-slider-input::-webkit-slider-runnable-track{border-radius:var(--mud-default-borderradius);width:100%}.mud-slider .mud-slider-input::-moz-range-track{border-radius:var(--mud-default-borderradius);width:100%}.mud-slider .mud-slider-input::-webkit-slider-thumb{appearance:none;-webkit-appearance:none;border:none;border-radius:50%;cursor:pointer;transition:box-shadow 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-slider .mud-slider-input::-moz-range-thumb{appearance:none;-webkit-appearance:none;border:none;border-radius:50%;cursor:pointer;transition:box-shadow 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-slider .mud-slider-input:disabled{cursor:default;opacity:.38}.mud-slider .mud-slider-input:disabled::-webkit-slider-runnable-track{background-color:var(--mud-palette-text-disabled)}.mud-slider .mud-slider-input:disabled::-moz-range-track{background-color:var(--mud-palette-text-disabled)}.mud-slider .mud-slider-input:disabled::-webkit-slider-thumb{background-color:#000;color:#fff;box-shadow:0 0 0 1px #fff !important;transform:scale(4, 4)}@media(hover: hover)and (pointer: fine){.mud-slider .mud-slider-input:disabled::-webkit-slider-thumb:hover{box-shadow:0 0 0 1px #fff !important}}.mud-slider .mud-slider-input:disabled::-moz-range-thumb{background-color:#000;color:#fff;box-shadow:0 0 0 1px #fff !important;transform:scale(4, 4)}@media(hover: hover)and (pointer: fine){.mud-slider .mud-slider-input:disabled::-moz-range-thumb:hover{box-shadow:0 0 0 1px #fff !important}}.mud-slider.mud-slider-primary .mud-slider-filled{background-color:var(--mud-palette-primary)}.mud-slider.mud-slider-primary .mud-slider-track-tick{background-color:var(--mud-palette-primary)}.mud-slider.mud-slider-primary .mud-slider-value-label{color:var(--mud-palette-primary-text);background-color:var(--mud-palette-primary)}.mud-slider.mud-slider-primary .mud-slider-input::-webkit-slider-runnable-track{background-color:rgba(var(--mud-palette-primary-rgb), 0.3)}.mud-slider.mud-slider-primary .mud-slider-input::-moz-range-track{background-color:rgba(var(--mud-palette-primary-rgb), 0.3)}.mud-slider.mud-slider-primary .mud-slider-input::-webkit-slider-thumb{background-color:var(--mud-palette-primary);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-primary-rgb), 0.3)}.mud-slider.mud-slider-primary .mud-slider-input::-moz-range-thumb{background-color:var(--mud-palette-primary);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-primary-rgb), 0.3)}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-primary .mud-slider-input::-webkit-slider-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-primary-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-primary-rgb), 0.24)}}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-primary .mud-slider-input::-moz-range-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-primary-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-primary-rgb), 0.24)}}.mud-slider.mud-slider-primary .mud-slider-input:focus-visible::-webkit-slider-thumb,.mud-slider.mud-slider-primary .mud-slider-input:active::-webkit-slider-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-primary-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-primary-rgb), 0.24)}.mud-slider.mud-slider-primary .mud-slider-input:focus-visible::-moz-range-thumb,.mud-slider.mud-slider-primary .mud-slider-input:active::-moz-range-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-primary-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-primary-rgb), 0.24)}.mud-slider.mud-slider-secondary .mud-slider-filled{background-color:var(--mud-palette-secondary)}.mud-slider.mud-slider-secondary .mud-slider-track-tick{background-color:var(--mud-palette-secondary)}.mud-slider.mud-slider-secondary .mud-slider-value-label{color:var(--mud-palette-secondary-text);background-color:var(--mud-palette-secondary)}.mud-slider.mud-slider-secondary .mud-slider-input::-webkit-slider-runnable-track{background-color:rgba(var(--mud-palette-secondary-rgb), 0.3)}.mud-slider.mud-slider-secondary .mud-slider-input::-moz-range-track{background-color:rgba(var(--mud-palette-secondary-rgb), 0.3)}.mud-slider.mud-slider-secondary .mud-slider-input::-webkit-slider-thumb{background-color:var(--mud-palette-secondary);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-secondary-rgb), 0.3)}.mud-slider.mud-slider-secondary .mud-slider-input::-moz-range-thumb{background-color:var(--mud-palette-secondary);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-secondary-rgb), 0.3)}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-secondary .mud-slider-input::-webkit-slider-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-secondary-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-secondary-rgb), 0.24)}}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-secondary .mud-slider-input::-moz-range-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-secondary-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-secondary-rgb), 0.24)}}.mud-slider.mud-slider-secondary .mud-slider-input:focus-visible::-webkit-slider-thumb,.mud-slider.mud-slider-secondary .mud-slider-input:active::-webkit-slider-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-secondary-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-secondary-rgb), 0.24)}.mud-slider.mud-slider-secondary .mud-slider-input:focus-visible::-moz-range-thumb,.mud-slider.mud-slider-secondary .mud-slider-input:active::-moz-range-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-secondary-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-secondary-rgb), 0.24)}.mud-slider.mud-slider-tertiary .mud-slider-filled{background-color:var(--mud-palette-tertiary)}.mud-slider.mud-slider-tertiary .mud-slider-track-tick{background-color:var(--mud-palette-tertiary)}.mud-slider.mud-slider-tertiary .mud-slider-value-label{color:var(--mud-palette-tertiary-text);background-color:var(--mud-palette-tertiary)}.mud-slider.mud-slider-tertiary .mud-slider-input::-webkit-slider-runnable-track{background-color:rgba(var(--mud-palette-tertiary-rgb), 0.3)}.mud-slider.mud-slider-tertiary .mud-slider-input::-moz-range-track{background-color:rgba(var(--mud-palette-tertiary-rgb), 0.3)}.mud-slider.mud-slider-tertiary .mud-slider-input::-webkit-slider-thumb{background-color:var(--mud-palette-tertiary);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-tertiary-rgb), 0.3)}.mud-slider.mud-slider-tertiary .mud-slider-input::-moz-range-thumb{background-color:var(--mud-palette-tertiary);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-tertiary-rgb), 0.3)}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-tertiary .mud-slider-input::-webkit-slider-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-tertiary-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-tertiary-rgb), 0.24)}}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-tertiary .mud-slider-input::-moz-range-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-tertiary-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-tertiary-rgb), 0.24)}}.mud-slider.mud-slider-tertiary .mud-slider-input:focus-visible::-webkit-slider-thumb,.mud-slider.mud-slider-tertiary .mud-slider-input:active::-webkit-slider-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-tertiary-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-tertiary-rgb), 0.24)}.mud-slider.mud-slider-tertiary .mud-slider-input:focus-visible::-moz-range-thumb,.mud-slider.mud-slider-tertiary .mud-slider-input:active::-moz-range-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-tertiary-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-tertiary-rgb), 0.24)}.mud-slider.mud-slider-info .mud-slider-filled{background-color:var(--mud-palette-info)}.mud-slider.mud-slider-info .mud-slider-track-tick{background-color:var(--mud-palette-info)}.mud-slider.mud-slider-info .mud-slider-value-label{color:var(--mud-palette-info-text);background-color:var(--mud-palette-info)}.mud-slider.mud-slider-info .mud-slider-input::-webkit-slider-runnable-track{background-color:rgba(var(--mud-palette-info-rgb), 0.3)}.mud-slider.mud-slider-info .mud-slider-input::-moz-range-track{background-color:rgba(var(--mud-palette-info-rgb), 0.3)}.mud-slider.mud-slider-info .mud-slider-input::-webkit-slider-thumb{background-color:var(--mud-palette-info);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-info-rgb), 0.3)}.mud-slider.mud-slider-info .mud-slider-input::-moz-range-thumb{background-color:var(--mud-palette-info);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-info-rgb), 0.3)}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-info .mud-slider-input::-webkit-slider-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-info-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-info-rgb), 0.24)}}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-info .mud-slider-input::-moz-range-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-info-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-info-rgb), 0.24)}}.mud-slider.mud-slider-info .mud-slider-input:focus-visible::-webkit-slider-thumb,.mud-slider.mud-slider-info .mud-slider-input:active::-webkit-slider-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-info-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-info-rgb), 0.24)}.mud-slider.mud-slider-info .mud-slider-input:focus-visible::-moz-range-thumb,.mud-slider.mud-slider-info .mud-slider-input:active::-moz-range-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-info-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-info-rgb), 0.24)}.mud-slider.mud-slider-success .mud-slider-filled{background-color:var(--mud-palette-success)}.mud-slider.mud-slider-success .mud-slider-track-tick{background-color:var(--mud-palette-success)}.mud-slider.mud-slider-success .mud-slider-value-label{color:var(--mud-palette-success-text);background-color:var(--mud-palette-success)}.mud-slider.mud-slider-success .mud-slider-input::-webkit-slider-runnable-track{background-color:rgba(var(--mud-palette-success-rgb), 0.3)}.mud-slider.mud-slider-success .mud-slider-input::-moz-range-track{background-color:rgba(var(--mud-palette-success-rgb), 0.3)}.mud-slider.mud-slider-success .mud-slider-input::-webkit-slider-thumb{background-color:var(--mud-palette-success);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-success-rgb), 0.3)}.mud-slider.mud-slider-success .mud-slider-input::-moz-range-thumb{background-color:var(--mud-palette-success);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-success-rgb), 0.3)}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-success .mud-slider-input::-webkit-slider-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-success-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-success-rgb), 0.24)}}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-success .mud-slider-input::-moz-range-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-success-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-success-rgb), 0.24)}}.mud-slider.mud-slider-success .mud-slider-input:focus-visible::-webkit-slider-thumb,.mud-slider.mud-slider-success .mud-slider-input:active::-webkit-slider-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-success-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-success-rgb), 0.24)}.mud-slider.mud-slider-success .mud-slider-input:focus-visible::-moz-range-thumb,.mud-slider.mud-slider-success .mud-slider-input:active::-moz-range-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-success-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-success-rgb), 0.24)}.mud-slider.mud-slider-warning .mud-slider-filled{background-color:var(--mud-palette-warning)}.mud-slider.mud-slider-warning .mud-slider-track-tick{background-color:var(--mud-palette-warning)}.mud-slider.mud-slider-warning .mud-slider-value-label{color:var(--mud-palette-warning-text);background-color:var(--mud-palette-warning)}.mud-slider.mud-slider-warning .mud-slider-input::-webkit-slider-runnable-track{background-color:rgba(var(--mud-palette-warning-rgb), 0.3)}.mud-slider.mud-slider-warning .mud-slider-input::-moz-range-track{background-color:rgba(var(--mud-palette-warning-rgb), 0.3)}.mud-slider.mud-slider-warning .mud-slider-input::-webkit-slider-thumb{background-color:var(--mud-palette-warning);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-warning-rgb), 0.3)}.mud-slider.mud-slider-warning .mud-slider-input::-moz-range-thumb{background-color:var(--mud-palette-warning);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-warning-rgb), 0.3)}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-warning .mud-slider-input::-webkit-slider-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-warning-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-warning-rgb), 0.24)}}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-warning .mud-slider-input::-moz-range-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-warning-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-warning-rgb), 0.24)}}.mud-slider.mud-slider-warning .mud-slider-input:focus-visible::-webkit-slider-thumb,.mud-slider.mud-slider-warning .mud-slider-input:active::-webkit-slider-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-warning-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-warning-rgb), 0.24)}.mud-slider.mud-slider-warning .mud-slider-input:focus-visible::-moz-range-thumb,.mud-slider.mud-slider-warning .mud-slider-input:active::-moz-range-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-warning-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-warning-rgb), 0.24)}.mud-slider.mud-slider-error .mud-slider-filled{background-color:var(--mud-palette-error)}.mud-slider.mud-slider-error .mud-slider-track-tick{background-color:var(--mud-palette-error)}.mud-slider.mud-slider-error .mud-slider-value-label{color:var(--mud-palette-error-text);background-color:var(--mud-palette-error)}.mud-slider.mud-slider-error .mud-slider-input::-webkit-slider-runnable-track{background-color:rgba(var(--mud-palette-error-rgb), 0.3)}.mud-slider.mud-slider-error .mud-slider-input::-moz-range-track{background-color:rgba(var(--mud-palette-error-rgb), 0.3)}.mud-slider.mud-slider-error .mud-slider-input::-webkit-slider-thumb{background-color:var(--mud-palette-error);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-error-rgb), 0.3)}.mud-slider.mud-slider-error .mud-slider-input::-moz-range-thumb{background-color:var(--mud-palette-error);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-error-rgb), 0.3)}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-error .mud-slider-input::-webkit-slider-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-error-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-error-rgb), 0.24)}}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-error .mud-slider-input::-moz-range-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-error-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-error-rgb), 0.24)}}.mud-slider.mud-slider-error .mud-slider-input:focus-visible::-webkit-slider-thumb,.mud-slider.mud-slider-error .mud-slider-input:active::-webkit-slider-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-error-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-error-rgb), 0.24)}.mud-slider.mud-slider-error .mud-slider-input:focus-visible::-moz-range-thumb,.mud-slider.mud-slider-error .mud-slider-input:active::-moz-range-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-error-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-error-rgb), 0.24)}.mud-slider.mud-slider-dark .mud-slider-filled{background-color:var(--mud-palette-dark)}.mud-slider.mud-slider-dark .mud-slider-track-tick{background-color:var(--mud-palette-dark)}.mud-slider.mud-slider-dark .mud-slider-value-label{color:var(--mud-palette-dark-text);background-color:var(--mud-palette-dark)}.mud-slider.mud-slider-dark .mud-slider-input::-webkit-slider-runnable-track{background-color:rgba(var(--mud-palette-dark-rgb), 0.3)}.mud-slider.mud-slider-dark .mud-slider-input::-moz-range-track{background-color:rgba(var(--mud-palette-dark-rgb), 0.3)}.mud-slider.mud-slider-dark .mud-slider-input::-webkit-slider-thumb{background-color:var(--mud-palette-dark);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-dark-rgb), 0.3)}.mud-slider.mud-slider-dark .mud-slider-input::-moz-range-thumb{background-color:var(--mud-palette-dark);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-dark-rgb), 0.3)}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-dark .mud-slider-input::-webkit-slider-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-dark-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-dark-rgb), 0.24)}}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-dark .mud-slider-input::-moz-range-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-dark-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-dark-rgb), 0.24)}}.mud-slider.mud-slider-dark .mud-slider-input:focus-visible::-webkit-slider-thumb,.mud-slider.mud-slider-dark .mud-slider-input:active::-webkit-slider-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-dark-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-dark-rgb), 0.24)}.mud-slider.mud-slider-dark .mud-slider-input:focus-visible::-moz-range-thumb,.mud-slider.mud-slider-dark .mud-slider-input:active::-moz-range-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-dark-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-dark-rgb), 0.24)}.mud-slider.mud-slider-small .mud-slider-filled{height:2px}.mud-slider.mud-slider-small .mud-slider-track-tick{width:2px;height:2px}.mud-slider.mud-slider-small .mud-slider-track-tick-label{transform:translateX(-50%) translateY(50%)}.mud-slider.mud-slider-small .mud-slider-input::-webkit-slider-runnable-track{height:2px;margin:10px 0}.mud-slider.mud-slider-small .mud-slider-input::-moz-range-track{height:2px;margin:10px 0}.mud-slider.mud-slider-small .mud-slider-input::-webkit-slider-thumb{height:2px;width:2px;transform:scale(6, 6)}.mud-slider.mud-slider-small .mud-slider-input::-moz-range-thumb{height:2px;width:2px;transform:scale(6, 6)}.mud-slider.mud-slider-medium .mud-slider-filled{height:4px}.mud-slider.mud-slider-medium .mud-slider-track-tick{width:4px;height:4px}.mud-slider.mud-slider-medium .mud-slider-track-tick-label{transform:translateX(-50%) translateY(80%)}.mud-slider.mud-slider-medium .mud-slider-input::-webkit-slider-runnable-track{height:4px;margin:12px 0}.mud-slider.mud-slider-medium .mud-slider-input::-moz-range-track{height:4px;margin:12px 0}.mud-slider.mud-slider-medium .mud-slider-input::-webkit-slider-thumb{height:4px;width:4px;transform:scale(5, 5)}.mud-slider.mud-slider-medium .mud-slider-input::-moz-range-thumb{height:4px;width:4px;transform:scale(5, 5)}.mud-slider.mud-slider-large .mud-slider-filled{height:6px}.mud-slider.mud-slider-large .mud-slider-track-tick{width:6px;height:6px}.mud-slider.mud-slider-large .mud-slider-track-tick-label{transform:translateX(-50%) translateY(110%)}.mud-slider.mud-slider-large .mud-slider-input::-webkit-slider-runnable-track{height:6px;margin:14px 0}.mud-slider.mud-slider-large .mud-slider-input::-moz-range-track{height:6px;margin:14px 0}.mud-slider.mud-slider-large .mud-slider-input::-webkit-slider-thumb{height:6px;width:6px;transform:scale(4, 4)}.mud-slider.mud-slider-large .mud-slider-input::-moz-range-thumb{height:6px;width:6px;transform:scale(4, 4)}.mud-slider .mud-slider-container{position:relative;width:100%;display:flex;align-content:center}.mud-slider .mud-slider-filled{border-radius:var(--mud-default-borderradius)}.mud-slider .mud-slider-inner-container{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;align-items:center}.mud-slider .mud-slider-value-label{position:absolute;top:0;transform:translateX(-50%) translateY(-125%);padding:4px 8px;text-align:center;align-items:center;justify-content:center;font-size:12px;border-radius:2px;line-height:normal;opacity:0;transition:opacity .2s ease-in-out;pointer-events:none;user-select:none}.mud-slider .mud-slider-tickmarks{display:flex;justify-content:space-between;flex-grow:1}.mud-slider .mud-slider-track-tick{border-radius:9999%;background-color:var(--mud-palette-primary)}.mud-slider .mud-slider-track-tick-label{position:absolute;top:0;left:50%}.mud-progress-circular{display:inline-block;color:var(--mud-palette-text-secondary)}.mud-progress-circular.mud-progress-indeterminate{animation:mud-progress-circular-keyframes-circular-rotate 1.4s linear infinite}.mud-progress-circular.mud-progress-static{transition:transform 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-progress-circular.mud-progress-small{height:24px;width:24px}.mud-progress-circular.mud-progress-medium{height:40px;width:40px}.mud-progress-circular.mud-progress-large{height:56px;width:56px}.mud-progress-circular-svg{display:block;transform:rotate(-90deg)}.mud-progress-circular-circle{stroke:currentColor}.mud-progress-circular-circle.mud-progress-indeterminate{animation:mud-progress-circular-keyframes-circular-dash 1.4s ease-in-out infinite;stroke-dasharray:80px,200px;stroke-dashoffset:0px}.mud-progress-circular-circle.mud-progress-static{transition:stroke-dashoffset 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-progress-circular-disable-shrink{animation:none}.mud-progress-linear{position:relative}.mud-progress-linear::before{content:"";position:absolute;top:0;left:0;height:100%;width:100%;display:block;opacity:.2}.mud-progress-linear.horizontal{width:100%}.mud-progress-linear.horizontal.mud-progress-linear-small{height:4px}.mud-progress-linear.horizontal.mud-progress-linear-medium{height:8px}.mud-progress-linear.horizontal.mud-progress-linear-large{height:12px}.mud-progress-linear.horizontal .mud-progress-linear-dashed{animation:mud-progress-linear-horizontal-keyframes-buffer 3s infinite linear}.mud-progress-linear.vertical{height:100%}.mud-progress-linear.vertical.mud-progress-linear-small{width:4px}.mud-progress-linear.vertical.mud-progress-linear-medium{width:8px}.mud-progress-linear.vertical.mud-progress-linear-large{width:12px}.mud-progress-linear .mud-progress-linear-content{position:absolute;height:100%;width:100%;display:flex;justify-content:center;align-items:center}.mud-progress-linear .mud-progress-linear-bars{position:absolute;height:100%;width:100%;overflow:hidden}.mud-progress-linear .mud-progress-linear-bar{top:0;left:0;width:100%;bottom:0;position:absolute;transition:transform .2s linear;transform-origin:left}.mud-progress-linear .mud-progress-linear-bar.mud-progress-linear-1-indeterminate.horizontal{width:auto;animation:mud-progress-linear-horizontal-keyframes-indeterminate1 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite}.mud-progress-linear .mud-progress-linear-bar.mud-progress-linear-1-indeterminate.vertical{height:auto;animation:mud-progress-linear-vertical-keyframes-indeterminate1 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite}.mud-progress-linear .mud-progress-linear-bar.mud-progress-linear-2-indeterminate.horizontal{width:auto;animation:mud-progress-linear-horizontal-keyframes-indeterminate2 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) 1.15s infinite}.mud-progress-linear .mud-progress-linear-bar.mud-progress-linear-2-indeterminate.vertical{height:auto;animation:mud-progress-linear-vertical-keyframes-indeterminate2 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) 1.15s infinite}.mud-progress-linear.mud-progress-linear-color-default:not(.mud-progress-linear-buffer)::before{background-color:var(--mud-palette-action-disabled)}.mud-progress-linear.mud-progress-linear-color-default:not(.mud-progress-linear-buffer) .mud-progress-linear-bar{background-color:var(--mud-palette-action-default)}.mud-progress-linear.mud-progress-linear-color-default.mud-progress-linear-buffer .mud-progress-linear-bar:first-child{background-size:10px 10px;background-image:radial-gradient(var(--mud-palette-action-disabled) 0%, var(--mud-palette-action-disabled) 16%, transparent 42%);background-position:0 -23px}.mud-progress-linear.mud-progress-linear-color-default.mud-progress-linear-buffer .mud-progress-linear-bar:nth-child(2){background-color:var(--mud-palette-action-default)}.mud-progress-linear.mud-progress-linear-color-default.mud-progress-linear-buffer .mud-progress-linear-bar:last-child{transition:transform .4s linear}.mud-progress-linear.mud-progress-linear-color-default.mud-progress-linear-buffer .mud-progress-linear-bar:last-child::before{content:"";position:absolute;top:0;left:0;height:100%;width:100%;display:block;opacity:.4;background-color:var(--mud-palette-action-disabled)}.mud-progress-linear.mud-progress-linear-color-primary:not(.mud-progress-linear-buffer)::before{background-color:var(--mud-palette-primary)}.mud-progress-linear.mud-progress-linear-color-primary:not(.mud-progress-linear-buffer) .mud-progress-linear-bar{background-color:var(--mud-palette-primary)}.mud-progress-linear.mud-progress-linear-color-primary.mud-progress-linear-buffer .mud-progress-linear-bar:first-child{background-size:10px 10px;background-image:radial-gradient(var(--mud-palette-primary) 0%, var(--mud-palette-primary) 16%, transparent 42%);background-position:0 -23px}.mud-progress-linear.mud-progress-linear-color-primary.mud-progress-linear-buffer .mud-progress-linear-bar:nth-child(2){background-color:var(--mud-palette-primary)}.mud-progress-linear.mud-progress-linear-color-primary.mud-progress-linear-buffer .mud-progress-linear-bar:last-child{transition:transform .4s linear}.mud-progress-linear.mud-progress-linear-color-primary.mud-progress-linear-buffer .mud-progress-linear-bar:last-child::before{content:"";position:absolute;top:0;left:0;height:100%;width:100%;display:block;opacity:.4;background-color:var(--mud-palette-primary)}.mud-progress-linear.mud-progress-linear-color-secondary:not(.mud-progress-linear-buffer)::before{background-color:var(--mud-palette-secondary)}.mud-progress-linear.mud-progress-linear-color-secondary:not(.mud-progress-linear-buffer) .mud-progress-linear-bar{background-color:var(--mud-palette-secondary)}.mud-progress-linear.mud-progress-linear-color-secondary.mud-progress-linear-buffer .mud-progress-linear-bar:first-child{background-size:10px 10px;background-image:radial-gradient(var(--mud-palette-secondary) 0%, var(--mud-palette-secondary) 16%, transparent 42%);background-position:0 -23px}.mud-progress-linear.mud-progress-linear-color-secondary.mud-progress-linear-buffer .mud-progress-linear-bar:nth-child(2){background-color:var(--mud-palette-secondary)}.mud-progress-linear.mud-progress-linear-color-secondary.mud-progress-linear-buffer .mud-progress-linear-bar:last-child{transition:transform .4s linear}.mud-progress-linear.mud-progress-linear-color-secondary.mud-progress-linear-buffer .mud-progress-linear-bar:last-child::before{content:"";position:absolute;top:0;left:0;height:100%;width:100%;display:block;opacity:.4;background-color:var(--mud-palette-secondary)}.mud-progress-linear.mud-progress-linear-color-tertiary:not(.mud-progress-linear-buffer)::before{background-color:var(--mud-palette-tertiary)}.mud-progress-linear.mud-progress-linear-color-tertiary:not(.mud-progress-linear-buffer) .mud-progress-linear-bar{background-color:var(--mud-palette-tertiary)}.mud-progress-linear.mud-progress-linear-color-tertiary.mud-progress-linear-buffer .mud-progress-linear-bar:first-child{background-size:10px 10px;background-image:radial-gradient(var(--mud-palette-tertiary) 0%, var(--mud-palette-tertiary) 16%, transparent 42%);background-position:0 -23px}.mud-progress-linear.mud-progress-linear-color-tertiary.mud-progress-linear-buffer .mud-progress-linear-bar:nth-child(2){background-color:var(--mud-palette-tertiary)}.mud-progress-linear.mud-progress-linear-color-tertiary.mud-progress-linear-buffer .mud-progress-linear-bar:last-child{transition:transform .4s linear}.mud-progress-linear.mud-progress-linear-color-tertiary.mud-progress-linear-buffer .mud-progress-linear-bar:last-child::before{content:"";position:absolute;top:0;left:0;height:100%;width:100%;display:block;opacity:.4;background-color:var(--mud-palette-tertiary)}.mud-progress-linear.mud-progress-linear-color-info:not(.mud-progress-linear-buffer)::before{background-color:var(--mud-palette-info)}.mud-progress-linear.mud-progress-linear-color-info:not(.mud-progress-linear-buffer) .mud-progress-linear-bar{background-color:var(--mud-palette-info)}.mud-progress-linear.mud-progress-linear-color-info.mud-progress-linear-buffer .mud-progress-linear-bar:first-child{background-size:10px 10px;background-image:radial-gradient(var(--mud-palette-info) 0%, var(--mud-palette-info) 16%, transparent 42%);background-position:0 -23px}.mud-progress-linear.mud-progress-linear-color-info.mud-progress-linear-buffer .mud-progress-linear-bar:nth-child(2){background-color:var(--mud-palette-info)}.mud-progress-linear.mud-progress-linear-color-info.mud-progress-linear-buffer .mud-progress-linear-bar:last-child{transition:transform .4s linear}.mud-progress-linear.mud-progress-linear-color-info.mud-progress-linear-buffer .mud-progress-linear-bar:last-child::before{content:"";position:absolute;top:0;left:0;height:100%;width:100%;display:block;opacity:.4;background-color:var(--mud-palette-info)}.mud-progress-linear.mud-progress-linear-color-success:not(.mud-progress-linear-buffer)::before{background-color:var(--mud-palette-success)}.mud-progress-linear.mud-progress-linear-color-success:not(.mud-progress-linear-buffer) .mud-progress-linear-bar{background-color:var(--mud-palette-success)}.mud-progress-linear.mud-progress-linear-color-success.mud-progress-linear-buffer .mud-progress-linear-bar:first-child{background-size:10px 10px;background-image:radial-gradient(var(--mud-palette-success) 0%, var(--mud-palette-success) 16%, transparent 42%);background-position:0 -23px}.mud-progress-linear.mud-progress-linear-color-success.mud-progress-linear-buffer .mud-progress-linear-bar:nth-child(2){background-color:var(--mud-palette-success)}.mud-progress-linear.mud-progress-linear-color-success.mud-progress-linear-buffer .mud-progress-linear-bar:last-child{transition:transform .4s linear}.mud-progress-linear.mud-progress-linear-color-success.mud-progress-linear-buffer .mud-progress-linear-bar:last-child::before{content:"";position:absolute;top:0;left:0;height:100%;width:100%;display:block;opacity:.4;background-color:var(--mud-palette-success)}.mud-progress-linear.mud-progress-linear-color-warning:not(.mud-progress-linear-buffer)::before{background-color:var(--mud-palette-warning)}.mud-progress-linear.mud-progress-linear-color-warning:not(.mud-progress-linear-buffer) .mud-progress-linear-bar{background-color:var(--mud-palette-warning)}.mud-progress-linear.mud-progress-linear-color-warning.mud-progress-linear-buffer .mud-progress-linear-bar:first-child{background-size:10px 10px;background-image:radial-gradient(var(--mud-palette-warning) 0%, var(--mud-palette-warning) 16%, transparent 42%);background-position:0 -23px}.mud-progress-linear.mud-progress-linear-color-warning.mud-progress-linear-buffer .mud-progress-linear-bar:nth-child(2){background-color:var(--mud-palette-warning)}.mud-progress-linear.mud-progress-linear-color-warning.mud-progress-linear-buffer .mud-progress-linear-bar:last-child{transition:transform .4s linear}.mud-progress-linear.mud-progress-linear-color-warning.mud-progress-linear-buffer .mud-progress-linear-bar:last-child::before{content:"";position:absolute;top:0;left:0;height:100%;width:100%;display:block;opacity:.4;background-color:var(--mud-palette-warning)}.mud-progress-linear.mud-progress-linear-color-error:not(.mud-progress-linear-buffer)::before{background-color:var(--mud-palette-error)}.mud-progress-linear.mud-progress-linear-color-error:not(.mud-progress-linear-buffer) .mud-progress-linear-bar{background-color:var(--mud-palette-error)}.mud-progress-linear.mud-progress-linear-color-error.mud-progress-linear-buffer .mud-progress-linear-bar:first-child{background-size:10px 10px;background-image:radial-gradient(var(--mud-palette-error) 0%, var(--mud-palette-error) 16%, transparent 42%);background-position:0 -23px}.mud-progress-linear.mud-progress-linear-color-error.mud-progress-linear-buffer .mud-progress-linear-bar:nth-child(2){background-color:var(--mud-palette-error)}.mud-progress-linear.mud-progress-linear-color-error.mud-progress-linear-buffer .mud-progress-linear-bar:last-child{transition:transform .4s linear}.mud-progress-linear.mud-progress-linear-color-error.mud-progress-linear-buffer .mud-progress-linear-bar:last-child::before{content:"";position:absolute;top:0;left:0;height:100%;width:100%;display:block;opacity:.4;background-color:var(--mud-palette-error)}.mud-progress-linear.mud-progress-linear-color-dark:not(.mud-progress-linear-buffer)::before{background-color:var(--mud-palette-dark)}.mud-progress-linear.mud-progress-linear-color-dark:not(.mud-progress-linear-buffer) .mud-progress-linear-bar{background-color:var(--mud-palette-dark)}.mud-progress-linear.mud-progress-linear-color-dark.mud-progress-linear-buffer .mud-progress-linear-bar:first-child{background-size:10px 10px;background-image:radial-gradient(var(--mud-palette-dark) 0%, var(--mud-palette-dark) 16%, transparent 42%);background-position:0 -23px}.mud-progress-linear.mud-progress-linear-color-dark.mud-progress-linear-buffer .mud-progress-linear-bar:nth-child(2){background-color:var(--mud-palette-dark)}.mud-progress-linear.mud-progress-linear-color-dark.mud-progress-linear-buffer .mud-progress-linear-bar:last-child{transition:transform .4s linear}.mud-progress-linear.mud-progress-linear-color-dark.mud-progress-linear-buffer .mud-progress-linear-bar:last-child::before{content:"";position:absolute;top:0;left:0;height:100%;width:100%;display:block;opacity:.4;background-color:var(--mud-palette-dark)}.mud-progress-linear.mud-progress-indeterminate.horizontal .mud-progress-linear-bar:first-child{width:auto;animation:mud-progress-linear-horizontal-keyframes-indeterminate1 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite}.mud-progress-linear.mud-progress-indeterminate.horizontal .mud-progress-linear-bar:last-child{width:auto;animation:mud-progress-linear-horizontal-keyframes-indeterminate2 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) 1.15s infinite}.mud-progress-linear.mud-progress-indeterminate.vertical .mud-progress-linear-bar:first-child{height:auto;animation:mud-progress-linear-vertical-keyframes-indeterminate1 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite}.mud-progress-linear.mud-progress-indeterminate.vertical .mud-progress-linear-bar:last-child{height:auto;animation:mud-progress-linear-vertical-keyframes-indeterminate2 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) 1.15s infinite}.mud-progress-linear.mud-progress-linear-buffer .mud-progress-linear-bar:first-child{width:100%;height:100%;position:absolute;margin-top:0}.mud-progress-linear.mud-progress-linear-buffer .mud-progress-linear-bar:nth-child(2){z-index:1;transition:transform .4s linear}.mud-progress-linear.mud-progress-linear-buffer.horizontal .mud-progress-linear-bar:first-child{animation:mud-progress-linear-horizontal-keyframes-buffer 3s infinite linear}.mud-progress-linear.mud-progress-linear-buffer.vertical .mud-progress-linear-bar:first-child{animation:mud-progress-linear-vertical-keyframes-buffer 3s infinite linear}.mud-progress-linear.mud-progress-linear-striped .mud-progress-linear-bar{background-image:linear-gradient(135deg, hsla(0, 0%, 100%, 0.25) 25%, transparent 0, transparent 50%, hsla(0, 0%, 100%, 0.25) 0, hsla(0, 0%, 100%, 0.25) 75%, transparent 0, transparent);background-size:40px 40px;background-repeat:repeat;animation:mud-progress-linear-striped-loading 10s linear infinite}.mud-progress-linear.mud-progress-linear-rounded{border-radius:var(--mud-default-borderradius)}.mud-progress-linear.mud-progress-linear-rounded .mud-progress-linear-bars{border-radius:var(--mud-default-borderradius)}.mud-progress-linear.mud-progress-linear-rounded .mud-progress-linear-bar{border-radius:var(--mud-default-borderradius)}.mud-progress-linear.mud-progress-linear-rounded::before{border-radius:var(--mud-default-borderradius)}.mud-radio{cursor:pointer;display:inline-flex;align-items:center;vertical-align:middle;-webkit-tap-highlight-color:rgba(0,0,0,0);color:var(--mud-palette-action-default)}.mud-radio>.mud-radio-content{color:var(--mud-palette-text-primary)}@media(hover: hover)and (pointer: fine){.mud-radio .mud-disabled:hover{cursor:default;background-color:rgba(0,0,0,0) !important}.mud-radio .mud-disabled:hover>.mud-radio-content{color:var(--mud-palette-text-disabled)}.mud-radio .mud-disabled:hover *{cursor:default;color:var(--mud-palette-text-disabled)}}.mud-radio.mud-disabled,.mud-radio .mud-disabled:focus-visible,.mud-radio .mud-disabled:active{cursor:default;background-color:rgba(0,0,0,0) !important}.mud-radio.mud-disabled>.mud-radio-content,.mud-radio .mud-disabled:focus-visible>.mud-radio-content,.mud-radio .mud-disabled:active>.mud-radio-content{color:var(--mud-palette-text-disabled)}.mud-radio.mud-disabled *,.mud-radio .mud-disabled:focus-visible *,.mud-radio .mud-disabled:active *{cursor:default;color:var(--mud-palette-text-disabled)}.mud-radio.mud-readonly,.mud-radio .mud-readonly:hover{cursor:default;background-color:rgba(0,0,0,0) !important}.mud-radio .mud-radio-dense{padding:4px}.mud-radio.mud-checked{color:var(--mud-palette-action-default)}@media(hover: hover)and (pointer: fine){.mud-radio.mud-checked:hover{background-color:var(--mud-palette-action-default-hover)}}.mud-radio-button{width:100%;display:flex;align-items:inherit;justify-content:inherit}.mud-radio-button .mud-radio-input{top:0;left:0;width:100%;cursor:inherit;height:100%;margin:0;opacity:0;padding:0;z-index:1;position:absolute}.mud-radio-button .mud-radio-icons{display:flex;position:relative}.mud-radio-icons.mud-checked .mud-radio-icon-checked{transform:scale(1);transition:transform 150ms cubic-bezier(0, 0, 0.2, 1) 0ms}.mud-radio-icon-checked{left:0;position:absolute;transform:scale(0);transition:transform 150ms cubic-bezier(0.4, 0, 1, 1) 0ms}.mud-radio-content-placement-start{margin-right:-11px;margin-inline-end:-11px;flex-direction:row-reverse}.mud-radio-content-placement-start.mud-radio-with-content{margin-left:16px;margin-inline-start:16px}.mud-radio-content-placement-end{margin-left:-11px;margin-inline-start:-11px;flex-direction:row}.mud-radio-content-placement-end.mud-radio-with-content{margin-right:16px;margin-inline-end:16px}.mud-radio-content-placement-top{margin-inline-end:unset;flex-direction:column-reverse}.mud-radio-content-placement-top.mud-radio-with-content{margin-left:16px;margin-inline-start:16px}.mud-radio-content-placement-bottom{margin-inline-end:unset;flex-direction:column}.mud-radio-content-placement-bottom.mud-radio-with-content{margin-left:16px;margin-inline-start:16px}.mud-rating-root{display:inline-flex;color:#ffb400}.mud-rating-root:focus-visible,.mud-rating-root:active{outline:none}.mud-rating-root:focus-visible:not(.mud-disabled),.mud-rating-root:active:not(.mud-disabled){background-color:var(--mud-palette-action-default-hover)}.mud-rating-item{cursor:pointer;transition:transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-rating-item.mud-rating-item-active{transform:scale(1.2)}.mud-rating-item.mud-disabled{cursor:default;pointer-events:none}.mud-rating-item.mud-disabled *{cursor:default;color:var(--mud-palette-text-disabled)}@media(hover: hover)and (pointer: fine){.mud-rating-item .mud-disabled:hover{cursor:default;pointer-events:none}.mud-rating-item .mud-disabled:hover *{cursor:default;color:var(--mud-palette-text-disabled)}}.mud-rating-item.mud-readonly{cursor:default}.mud-rating-item .mud-rating-input{clip:rect(0, 0, 0, 0);margin:0;opacity:0;padding:0;z-index:1;position:absolute;cursor:inherit;overflow:hidden}.mud-rating-item svg{pointer-events:none}.mud-rating-item svg path{pointer-events:none}.mud-snackbar{display:flex;flex-grow:initial;padding:6px 16px;align-items:center;position:relative;pointer-events:auto;font-weight:400;line-height:1.43;overflow:hidden;margin-top:16px;min-width:288px;max-width:500px;border-radius:var(--mud-default-borderradius);box-shadow:0px 3px 5px -1px rgba(0,0,0,.2),0px 6px 10px 0px rgba(0,0,0,.14),0px 1px 18px 0px rgba(0,0,0,.12);touch-action:pinch-zoom}.mud-snackbar.force-cursor{cursor:pointer}.mud-snackbar.mud-snackbar-blurred{backdrop-filter:blur(18px)}.mud-snackbar.mud-snackbar-surface{background:var(--mud-palette-surface)}.mud-snackbar .mud-snackbar-content-message{padding:8px 0;overflow-wrap:anywhere}.mud-snackbar .mud-snackbar-content-action{display:flex;align-items:center;margin-left:auto;margin-right:-8px;padding-left:16px;margin-inline-start:auto;margin-inline-end:-8px;padding-inline-start:16px;padding-inline-end:unset}.mud-snackbar .mud-snackbar-content-action>button{color:inherit}.mud-snackbar-location-top-left{top:24px;left:24px}.mud-snackbar-location-top-center{top:24px;left:50%;transform:translateX(-50%)}.mud-snackbar-location-top-right{top:24px;right:24px}.mud-snackbar-location-bottom-right{right:24px;bottom:24px}.mud-snackbar-location-bottom-center{bottom:24px;left:50%;transform:translateX(-50%)}.mud-snackbar-location-bottom-left{bottom:24px;left:24px}#mud-snackbar-container{position:fixed;z-index:var(--mud-zindex-snackbar);pointer-events:none}.mud-snackbar-icon{display:flex;opacity:.9;padding:7px 0;font-size:22px;margin-right:12px;margin-inline-end:12px;margin-inline-start:unset}.mud-switch{cursor:pointer;display:inline-flex;align-items:center;margin-left:-11px;margin-right:16px;margin-inline-start:-11px;margin-inline-end:16px;vertical-align:middle;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mud-switch.mud-disabled{color:var(--mud-palette-text-disabled) !important;cursor:default}.mud-switch.mud-readonly{cursor:default;background-color:rgba(0,0,0,0) !important}@media(hover: hover)and (pointer: fine){.mud-switch .mud-readonly:hover{cursor:default;background-color:rgba(0,0,0,0) !important}}.mud-switch-span{width:58px;height:38px;display:inline-flex;padding:12px;z-index:0;overflow:hidden;position:relative;box-sizing:border-box;flex-shrink:0;vertical-align:middle}.mud-switch-span .mud-switch-track{width:100%;height:100%;opacity:.48;z-index:-1;transition:opacity 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;border-radius:9px;background-color:var(--mud-palette-black)}.mud-switch-base{padding:9px;top:0;left:0;color:#fafafa;z-index:1;position:absolute;transition:left 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-switch-base.mud-checked{transform:translateX(20px)}.mud-switch-base.mud-checked+.mud-switch-track{opacity:.5}@media(hover: hover)and (pointer: fine){.mud-switch-base:hover{background-color:var(--mud-palette-action-default-hover)}}.mud-switch-base.mud-switch-disabled{color:var(--mud-palette-gray-default) !important}.mud-switch-base.mud-switch-disabled+.mud-switch-track{opacity:.12 !important}@media(hover: hover)and (pointer: fine){.mud-switch-base.mud-switch-disabled:hover{cursor:default;background-color:rgba(0,0,0,0) !important}}.mud-switch-base.mud-switch-disabled:focus-visible,.mud-switch-base.mud-switch-disabled:active{cursor:default;background-color:rgba(0,0,0,0) !important}.mud-switch-button{display:flex;align-items:inherit;justify-content:inherit}.mud-switch-button .mud-switch-input{top:0;left:0;width:100%;cursor:inherit;height:100%;margin:0;opacity:0;padding:0;z-index:1;position:absolute}.mud-switch-button .mud-switch-thumb-small{width:14px;height:14px;box-shadow:0px 2px 1px -1px rgba(0,0,0,.2),0px 1px 1px 0px rgba(0,0,0,.14),0px 1px 3px 0px rgba(0,0,0,.12);border-radius:50%;background-color:currentColor}.mud-switch-button .mud-switch-thumb-medium{width:20px;height:20px;box-shadow:0px 2px 1px -1px rgba(0,0,0,.2),0px 1px 1px 0px rgba(0,0,0,.14),0px 1px 3px 0px rgba(0,0,0,.12);border-radius:50%;background-color:currentColor}.mud-switch-button .mud-switch-thumb-large{width:26px;height:26px;box-shadow:0px 2px 1px -1px rgba(0,0,0,.2),0px 1px 1px 0px rgba(0,0,0,.14),0px 1px 3px 0px rgba(0,0,0,.12);border-radius:50%;background-color:currentColor}.mud-switch-base-small.mud-switch-base{padding:5px}.mud-switch-base-medium.mud-switch-base{padding:9px}.mud-switch-base-large.mud-switch-base{padding:13px}.mud-switch-span-small.mud-switch-span{padding:7px;width:44px;height:24px}.mud-switch-span-medium.mud-switch-span{padding:12px;width:58px;height:38px}.mud-switch-span-large.mud-switch-span{padding:17px;width:72px;height:52px}.mud-switch-label-small{font-size:.8125rem !important}.mud-switch-label-medium{font-size:1rem !important}.mud-switch-label-large{font-size:1.1875rem !important}.mud-timeline{position:relative;display:flex}.mud-timeline-vertical{padding-top:24px;flex-direction:column}.mud-timeline-vertical::before{top:0;bottom:0;content:"";height:100%;position:absolute;width:2px;background:var(--mud-palette-divider)}.mud-timeline-vertical .mud-timeline-item{padding-bottom:24px}.mud-timeline-vertical .mud-timeline-item .mud-timeline-item-content{max-width:calc(50% - 48px)}.mud-timeline-vertical .mud-timeline-item .mud-timeline-item-divider{min-width:96px}.mud-timeline-vertical .mud-timeline-item .mud-timeline-item-opposite{flex:1 1 auto;max-width:calc(50% - 48px)}.mud-timeline-horizontal{flex-direction:row}.mud-timeline-horizontal::before{top:0;bottom:0;content:"";height:2px;position:absolute;width:100%;background:var(--mud-palette-divider)}.mud-timeline-horizontal .mud-timeline-item{padding-left:24px;padding-right:24px;width:100%;min-width:0}.mud-timeline-horizontal .mud-timeline-item .mud-timeline-item-content{max-height:calc(50% - 48px)}.mud-timeline-horizontal .mud-timeline-item .mud-timeline-item-divider{min-height:96px}.mud-timeline-item{display:flex}.mud-timeline-item .mud-timeline-item-content{position:relative;height:100%;flex:1 1 auto}.mud-timeline-item .mud-timeline-item-divider{position:relative;display:flex;align-items:center;justify-content:center}.mud-timeline-item .mud-timeline-item-opposite{align-self:center}.mud-timeline-vertical.mud-timeline-align-start .mud-timeline-item-divider{align-items:flex-start}.mud-timeline-vertical.mud-timeline-align-start .mud-timeline-item-opposite{align-self:flex-start}.mud-timeline-vertical.mud-timeline-align-end .mud-timeline-item-divider{align-items:flex-end}.mud-timeline-vertical.mud-timeline-align-end .mud-timeline-item-opposite{align-self:flex-end}.mud-timeline-vertical.mud-timeline-position-alternate::before{left:auto;right:calc(50% - 1px)}.mud-timeline-vertical.mud-timeline-position-alternate .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-start),.mud-timeline-vertical.mud-timeline-position-alternate .mud-timeline-item.mud-timeline-item-end{flex-direction:row-reverse}.mud-timeline-vertical.mud-timeline-position-alternate .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-start) .mud-timeline-item-opposite,.mud-timeline-vertical.mud-timeline-position-alternate .mud-timeline-item.mud-timeline-item-end .mud-timeline-item-opposite{text-align:end}.mud-timeline-vertical.mud-timeline-position-alternate .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-end){flex-direction:row}.mud-timeline-vertical.mud-timeline-position-alternate .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-end) .mud-timeline-item-opposite{text-align:start}.mud-timeline-vertical.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-end),.mud-timeline-vertical.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item.mud-timeline-item-start{flex-direction:row}.mud-timeline-vertical.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-end) .mud-timeline-item-opposite,.mud-timeline-vertical.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item.mud-timeline-item-start .mud-timeline-item-opposite{text-align:start}.mud-timeline-vertical.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-start){flex-direction:row-reverse}.mud-timeline-vertical.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-start) .mud-timeline-item-opposite{text-align:end}.mud-timeline-vertical.mud-timeline-position-start::before{right:auto;left:47px}.mud-timeline-vertical.mud-timeline-position-start.mud-timeline-rtl::before{right:47px;left:auto}.mud-timeline-vertical.mud-timeline-position-start .mud-timeline-item{flex-direction:row-reverse}.mud-timeline-vertical.mud-timeline-position-end::before{right:47px;left:auto}.mud-timeline-vertical.mud-timeline-position-end.mud-timeline-rtl::before{left:47px;right:auto}.mud-timeline-vertical.mud-timeline-position-end .mud-timeline-item{flex-direction:row}.mud-timeline-vertical.mud-timeline-position-start .mud-timeline-item-content,.mud-timeline-vertical.mud-timeline-position-end .mud-timeline-item-content{max-width:calc(100% - 96px)}.mud-timeline-vertical.mud-timeline-position-start .mud-timeline-item-opposite,.mud-timeline-vertical.mud-timeline-position-end .mud-timeline-item-opposite{display:none}.mud-timeline-horizontal.mud-timeline-align-start .mud-timeline-item-divider{justify-content:flex-start}.mud-timeline-horizontal.mud-timeline-align-start .mud-timeline-item-opposite{align-self:flex-start}.mud-timeline-horizontal.mud-timeline-align-end .mud-timeline-item-divider{justify-content:flex-end}.mud-timeline-horizontal.mud-timeline-align-end .mud-timeline-item-opposite{align-self:flex-end}.mud-timeline-horizontal.mud-timeline-position-alternate::before{top:auto;bottom:calc(50% - 1px)}.mud-timeline-horizontal.mud-timeline-position-alternate .mud-timeline-item:nth-child(odd),.mud-timeline-horizontal.mud-timeline-position-alternate .mud-timeline-item.mud-timeline-item-end{flex-direction:column-reverse}.mud-timeline-horizontal.mud-timeline-position-alternate .mud-timeline-item:nth-child(2n),.mud-timeline-horizontal.mud-timeline-position-alternate .mud-timeline-item.mud-timeline-item-start{flex-direction:column}.mud-timeline-horizontal.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item:nth-child(odd),.mud-timeline-horizontal.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item.mud-timeline-item-end{flex-direction:column}.mud-timeline-horizontal.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item:nth-child(2n),.mud-timeline-horizontal.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item.mud-timeline-item-start{flex-direction:column-reverse}.mud-timeline-horizontal.mud-timeline-position-top::before{top:47px;bottom:auto}.mud-timeline-horizontal.mud-timeline-position-top .mud-timeline-item{flex-direction:column-reverse}.mud-timeline-horizontal.mud-timeline-position-bottom::before{top:auto;bottom:47px}.mud-timeline-horizontal.mud-timeline-position-bottom .mud-timeline-item{flex-direction:column}.mud-timeline-horizontal.mud-timeline-position-top .mud-timeline-item-content,.mud-timeline-horizontal.mud-timeline-position-bottom .mud-timeline-item-content{max-height:calc(100% - 96px)}.mud-timeline-horizontal.mud-timeline-position-top .mud-timeline-item-opposite,.mud-timeline-horizontal.mud-timeline-position-bottom .mud-timeline-item-opposite{display:none}.mud-timeline-item-dot{display:flex;justify-content:center;align-items:center;background:var(--mud-palette-surface);border-radius:50%;left:calc(50% - 19px)}.mud-timeline-item-dot.mud-timeline-dot-size-small{width:24px;height:24px}.mud-timeline-item-dot.mud-timeline-dot-size-small .mud-timeline-item-dot-inner{height:18px;width:18px}.mud-timeline-item-dot.mud-timeline-dot-size-medium{width:38px;height:38px}.mud-timeline-item-dot.mud-timeline-dot-size-medium .mud-timeline-item-dot-inner{height:30px;width:30px}.mud-timeline-item-dot.mud-timeline-dot-size-large{width:52px;height:52px}.mud-timeline-item-dot.mud-timeline-dot-size-large .mud-timeline-item-dot-inner{height:42px;width:42px}.mud-timeline-item-dot .mud-timeline-item-dot-inner{border-radius:50%;display:flex;justify-content:center;align-items:center}.mud-timeline-item-dot .mud-timeline-item-dot-inner.mud-timeline-dot-fill{height:inherit;width:inherit}.mud-timeline-item-dot .mud-timeline-item-dot-inner.mud-timeline-dot-default{background-color:var(--mud-palette-gray-light)}.mud-timeline-item-dot .mud-timeline-item-dot-inner.mud-timeline-dot-primary{color:var(--mud-palette-primary-text);background-color:var(--mud-palette-primary)}.mud-timeline-item-dot .mud-timeline-item-dot-inner.mud-timeline-dot-secondary{color:var(--mud-palette-secondary-text);background-color:var(--mud-palette-secondary)}.mud-timeline-item-dot .mud-timeline-item-dot-inner.mud-timeline-dot-tertiary{color:var(--mud-palette-tertiary-text);background-color:var(--mud-palette-tertiary)}.mud-timeline-item-dot .mud-timeline-item-dot-inner.mud-timeline-dot-info{color:var(--mud-palette-info-text);background-color:var(--mud-palette-info)}.mud-timeline-item-dot .mud-timeline-item-dot-inner.mud-timeline-dot-success{color:var(--mud-palette-success-text);background-color:var(--mud-palette-success)}.mud-timeline-item-dot .mud-timeline-item-dot-inner.mud-timeline-dot-warning{color:var(--mud-palette-warning-text);background-color:var(--mud-palette-warning)}.mud-timeline-item-dot .mud-timeline-item-dot-inner.mud-timeline-dot-error{color:var(--mud-palette-error-text);background-color:var(--mud-palette-error)}.mud-timeline-item-dot .mud-timeline-item-dot-inner.mud-timeline-dot-dark{color:var(--mud-palette-dark-text);background-color:var(--mud-palette-dark)}.mud-timeline-modifiers .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers .mud-timeline-item-content .mud-card::after{content:"";position:absolute}.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-start:not(.mud-timeline-rtl) .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-start:not(.mud-timeline-rtl) .mud-timeline-item-content .mud-card::after,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-end.mud-timeline-rtl .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-end.mud-timeline-rtl .mud-timeline-item-content .mud-card::after{transform:rotate(0);left:-16px;right:auto}.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-start:not(.mud-timeline-rtl) .mud-timeline-item-content .mud-card.mud-paper-outlined::after,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-end.mud-timeline-rtl .mud-timeline-item-content .mud-card.mud-paper-outlined::after{left:-15px}.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-end:not(.mud-timeline-rtl) .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-end:not(.mud-timeline-rtl) .mud-timeline-item-content .mud-card::after,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-start.mud-timeline-rtl .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-start.mud-timeline-rtl .mud-timeline-item-content .mud-card::after{transform:rotate(180deg);right:-16px;left:auto}.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-end:not(.mud-timeline-rtl) .mud-timeline-item-content .mud-card.mud-paper-outlined::after,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-start.mud-timeline-rtl .mud-timeline-item-content .mud-card.mud-paper-outlined::after{right:-15px}.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-start) .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-start) .mud-timeline-item-content .mud-card::after,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate .mud-timeline-item.mud-timeline-item-end .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate .mud-timeline-item.mud-timeline-item-end .mud-timeline-item-content .mud-card::after{transform:rotate(0);left:-16px;right:auto}.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-start) .mud-timeline-item-content .mud-card.mud-paper-outlined::after,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate .mud-timeline-item.mud-timeline-item-end .mud-timeline-item-content .mud-card.mud-paper-outlined::after{left:-15px}.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-end) .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-end) .mud-timeline-item-content .mud-card::after{transform:rotate(180deg);right:-16px;left:auto}.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-end) .mud-timeline-item-content .mud-card.mud-paper-outlined::after{right:-15px}.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-reverse:not(.mud-timeline-rtl) .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-end) .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-reverse:not(.mud-timeline-rtl) .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-end) .mud-timeline-item-content .mud-card::after,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-reverse:not(.mud-timeline-rtl) .mud-timeline-item.mud-timeline-item-start .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-reverse:not(.mud-timeline-rtl) .mud-timeline-item.mud-timeline-item-start .mud-timeline-item-content .mud-card::after,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate.mud-timeline-rtl:not(.mud-timeline-reverse) .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-end) .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate.mud-timeline-rtl:not(.mud-timeline-reverse) .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-end) .mud-timeline-item-content .mud-card::after,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate.mud-timeline-rtl:not(.mud-timeline-reverse) .mud-timeline-item.mud-timeline-item-start .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate.mud-timeline-rtl:not(.mud-timeline-reverse) .mud-timeline-item.mud-timeline-item-start .mud-timeline-item-content .mud-card::after{transform:rotate(180deg);right:-16px;left:auto}.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-reverse:not(.mud-timeline-rtl) .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-end) .mud-timeline-item-content .mud-card.mud-paper-outlined::after,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-reverse:not(.mud-timeline-rtl) .mud-timeline-item.mud-timeline-item-start .mud-timeline-item-content .mud-card.mud-paper-outlined::after,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate.mud-timeline-rtl:not(.mud-timeline-reverse) .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-end) .mud-timeline-item-content .mud-card.mud-paper-outlined::after,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate.mud-timeline-rtl:not(.mud-timeline-reverse) .mud-timeline-item.mud-timeline-item-start .mud-timeline-item-content .mud-card.mud-paper-outlined::after{right:-15px}.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-reverse:not(.mud-timeline-rtl) .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-start) .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-reverse:not(.mud-timeline-rtl) .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-start) .mud-timeline-item-content .mud-card::after,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate.mud-timeline-rtl:not(.mud-timeline-reverse) .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-start) .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate.mud-timeline-rtl:not(.mud-timeline-reverse) .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-start) .mud-timeline-item-content .mud-card::after{transform:rotate(0);left:-16px;right:auto}.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-reverse:not(.mud-timeline-rtl) .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-start) .mud-timeline-item-content .mud-card.mud-paper-outlined::after,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate.mud-timeline-rtl:not(.mud-timeline-reverse) .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-start) .mud-timeline-item-content .mud-card.mud-paper-outlined::after{left:-15px}.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-top .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-top .mud-timeline-item-content .mud-card::after{transform:rotate(90deg);top:-24px;bottom:auto;left:calc(50% - 8px)}.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-top .mud-timeline-item-content .mud-card.mud-paper-outlined::after{top:-23px}.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-bottom .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-bottom .mud-timeline-item-content .mud-card::after{transform:rotate(270deg);bottom:-24px;top:auto;left:calc(50% - 8px)}.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-bottom .mud-timeline-item-content .mud-card.mud-paper-outlined::after{bottom:-23px}.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-start) .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-start) .mud-timeline-item-content .mud-card::after,.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate .mud-timeline-item.mud-timeline-item-end .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate .mud-timeline-item.mud-timeline-item-end .mud-timeline-item-content .mud-card::after{transform:rotate(90deg);top:-24px;bottom:auto;left:calc(50% - 8px)}.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-start) .mud-timeline-item-content .mud-card.mud-paper-outlined::after,.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate .mud-timeline-item.mud-timeline-item-end .mud-timeline-item-content .mud-card.mud-paper-outlined::after{top:-23px}.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-end) .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-end) .mud-timeline-item-content .mud-card::after{transform:rotate(270deg);bottom:-24px;top:auto;left:calc(50% - 8px)}.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-end) .mud-timeline-item-content .mud-card.mud-paper-outlined::after{bottom:-23px}.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-start) .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-start) .mud-timeline-item-content .mud-card::after,.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item.mud-timeline-item-end .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item.mud-timeline-item-end .mud-timeline-item-content .mud-card::after{transform:rotate(270deg);bottom:-24px;top:auto;left:calc(50% - 8px)}.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-start) .mud-timeline-item-content .mud-card.mud-paper-outlined::after,.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item.mud-timeline-item-end .mud-timeline-item-content .mud-card.mud-paper-outlined::after{bottom:-23px}.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-end) .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-end) .mud-timeline-item-content .mud-card::after{transform:rotate(90deg);top:-24px;bottom:auto;left:calc(50% - 8px)}.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-end) .mud-timeline-item-content .mud-card.mud-paper-outlined::after{top:-23px}.mud-timeline-modifiers .mud-timeline-item-content .mud-card::before{border-top:16px solid rgba(0,0,0,0);border-bottom:16px solid rgba(0,0,0,0);border-right:16px solid rgba(0,0,0,.1);top:calc(50% - 14px)}.mud-timeline-modifiers .mud-timeline-item-content .mud-card::after{border-top:16px solid rgba(0,0,0,0);border-bottom:16px solid rgba(0,0,0,0);border-right:16px solid var(--mud-palette-surface);top:calc(50% - 16px)}.mud-timeline-modifiers .mud-timeline-item-content .mud-card.mud-paper-outlined::before{top:calc(50% - 16px);border-right-color:var(--mud-palette-lines-default)}.mud-typography{margin:0}.mud-typography-h1{font-size:var(--mud-typography-h1-size);font-family:var(--mud-typography-h1-family);font-weight:var(--mud-typography-h1-weight);line-height:var(--mud-typography-h1-lineheight);letter-spacing:var(--mud-typography-h1-letterspacing);text-transform:var(--mud-typography-h1-text-transform)}.mud-typography-h2{font-size:var(--mud-typography-h2-size);font-family:var(--mud-typography-h2-family);font-weight:var(--mud-typography-h2-weight);line-height:var(--mud-typography-h2-lineheight);letter-spacing:var(--mud-typography-h2-letterspacing);text-transform:var(--mud-typography-h2-text-transform)}.mud-typography-h3{font-size:var(--mud-typography-h3-size);font-family:var(--mud-typography-h3-family);font-weight:var(--mud-typography-h3-weight);line-height:var(--mud-typography-h3-lineheight);letter-spacing:var(--mud-typography-h3-letterspacing);text-transform:var(--mud-typography-h3-text-transform)}.mud-typography-h4{font-size:var(--mud-typography-h4-size);font-family:var(--mud-typography-h4-family);font-weight:var(--mud-typography-h4-weight);line-height:var(--mud-typography-h4-lineheight);letter-spacing:var(--mud-typography-h4-letterspacing);text-transform:var(--mud-typography-h4-text-transform)}.mud-typography-h5{font-size:var(--mud-typography-h5-size);font-family:var(--mud-typography-h5-family);font-weight:var(--mud-typography-h5-weight);line-height:var(--mud-typography-h5-lineheight);letter-spacing:var(--mud-typography-h5-letterspacing);text-transform:var(--mud-typography-h5-text-transform)}.mud-typography-h6{font-size:var(--mud-typography-h6-size);font-family:var(--mud-typography-h6-family);font-weight:var(--mud-typography-h6-weight);line-height:var(--mud-typography-h6-lineheight);letter-spacing:var(--mud-typography-h6-letterspacing);text-transform:var(--mud-typography-h6-text-transform)}.mud-typography-subtitle1{font-size:var(--mud-typography-subtitle1-size);font-family:var(--mud-typography-subtitle1-family);font-weight:var(--mud-typography-subtitle1-weight);line-height:var(--mud-typography-subtitle1-lineheight);letter-spacing:var(--mud-typography-subtitle1-letterspacing);text-transform:var(--mud-typography-subtitle1-text-transform)}.mud-typography-subtitle2{font-size:var(--mud-typography-subtitle2-size);font-family:var(--mud-typography-subtitle2-family);font-weight:var(--mud-typography-subtitle2-weight);line-height:var(--mud-typography-subtitle2-lineheight);letter-spacing:var(--mud-typography-subtitle2-letterspacing);text-transform:var(--mud-typography-subtitle2-text-transform)}.mud-typography-body1{font-size:var(--mud-typography-body1-size);font-family:var(--mud-typography-body1-family);font-weight:var(--mud-typography-body1-weight);line-height:var(--mud-typography-body1-lineheight);letter-spacing:var(--mud-typography-body1-letterspacing);text-transform:var(--mud-typography-body1-text-transform)}.mud-typography-body2{font-size:var(--mud-typography-body2-size);font-family:var(--mud-typography-body2-family);font-weight:var(--mud-typography-body2-weight);line-height:var(--mud-typography-body2-lineheight);letter-spacing:var(--mud-typography-body2-letterspacing);text-transform:var(--mud-typography-body2-text-transform)}.mud-typography-input{font-size:var(--mud-typography-input-size);font-family:var(--mud-typography-input-family);font-weight:var(--mud-typography-input-weight);line-height:var(--mud-typography-input-lineheight);letter-spacing:var(--mud-typography-input-letterspacing);text-transform:var(--mud-typography-input-text-transform)}.mud-typography-button{font-size:var(--mud-typography-button-size);font-family:var(--mud-typography-button-family);font-weight:var(--mud-typography-button-weight);line-height:var(--mud-typography-button-lineheight);letter-spacing:var(--mud-typography-button-letterspacing);text-transform:var(--mud-typography-button-text-transform)}.mud-typography-caption{font-size:var(--mud-typography-caption-size);font-family:var(--mud-typography-caption-family);font-weight:var(--mud-typography-caption-weight);line-height:var(--mud-typography-caption-lineheight);letter-spacing:var(--mud-typography-caption-letterspacing);text-transform:var(--mud-typography-caption-text-transform)}.mud-typography-overline{font-size:var(--mud-typography-overline-size);font-family:var(--mud-typography-overline-family);font-weight:var(--mud-typography-overline-weight);line-height:var(--mud-typography-overline-lineheight);letter-spacing:var(--mud-typography-overline-letterspacing);text-transform:var(--mud-typography-overline-text-transform)}.mud-typography-srOnly{width:1px;height:1px;overflow:hidden;position:absolute}.mud-typography-align-left{text-align:left}.mud-typography-align-center{text-align:center}.mud-typography-align-right{text-align:right}.mud-typography-align-justify{text-align:justify}.mud-typography-nowrap{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.mud-typography-gutterbottom{margin-bottom:.35em}.mud-typography-paragraph{margin-bottom:16px}.mud-table{color:var(--mud-palette-text-primary);background-color:var(--mud-palette-surface);border-radius:var(--mud-default-borderradius);transition:box-shadow 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-table.mud-table-square{border-radius:0px}.mud-table.mud-table-outlined{border:1px solid var(--mud-palette-lines-default)}.mud-table-container{width:100%;overflow-y:auto}.mud-table-root{width:100%;border-spacing:0}.mud-table-root .mud-table-head{display:table-header-group}.mud-table-root .mud-table-head .mud-table-cell{color:var(--mud-palette-text-primary);font-weight:500;line-height:1.5rem}.mud-table-root .mud-table-body{display:table-row-group}.mud-table-root .mud-table-body .mud-table-cell{color:var(--mud-palette-text-primary)}.mud-table-root>.mud-table-body:last-child>.mud-table-row:last-child>.mud-table-cell,.mud-table-root>.mud-table-foot:last-child>.mud-table-row:last-child>.mud-table-cell{border-bottom:none}.mud-table-sort-label{cursor:pointer;display:inline-flex;align-items:center;flex-direction:inherit;justify-content:flex-start}@media(hover: hover)and (pointer: fine){.mud-table-sort-label:hover{color:var(--mud-palette-action-default)}.mud-table-sort-label:hover .mud-table-sort-label-icon{opacity:.8}}.mud-table-sort-label .mud-table-sort-label-icon{font-size:18px;transition:opacity 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,transform 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;margin-left:4px;user-select:none;margin-right:4px;opacity:0}.mud-table-sort-label .mud-table-sort-label-icon.mud-direction-desc{opacity:1;transform:rotate(180deg)}.mud-table-sort-label .mud-table-sort-label-icon.mud-direction-asc{opacity:1;transform:rotate(0deg)}.mud-table-toolbar{padding-left:16px;padding-right:8px;padding-inline-start:16px;padding-inline-end:8px}.mud-table-cell{display:table-cell;padding:16px;font-size:.875rem;text-align:start;font-weight:400;line-height:1.43;border-bottom:1px solid var(--mud-palette-table-lines);letter-spacing:.01071em;vertical-align:inherit}.mud-table-cell .mud-checkbox{margin:-12px}.mud-table-cell-footer{color:var(--mud-palette-text-secondary);font-size:.75rem;line-height:1.3125rem}.mud-table-dense * .mud-table-row .mud-table-cell{padding:6px 24px 6px 16px;padding-inline-start:16px;padding-inline-end:24px}.mud-table-dense * .mud-table-row .mud-table-cell .mud-table-cell-checkbox .mud-button-root{padding:4px}.mud-table-dense * .mud-table-row .mud-table-cell .mud-table-row-expander{padding:4px}.mud-table-dense * .mud-table-row .mud-table-cell:last-child{padding-right:16px;padding-inline-end:16px}.mud-table-bordered .mud-table-container .mud-table-root .mud-table-body .mud-table-row .mud-table-cell:not(:last-child){border-right:1px solid var(--mud-palette-table-lines)}.mud-table-bordered .mud-table-container .mud-table-root .mud-table-head.table-head-bordered .mud-table-row .mud-table-cell:not(:last-child){border-right:1px solid var(--mud-palette-table-lines)}.mud-table-bordered .mud-table-container .mud-table-root .mud-table-foot.table-foot-bordered .mud-table-row .mud-table-cell:not(:last-child){border-right:1px solid var(--mud-palette-table-lines)}.mud-application-layout-rtl .mud-table-bordered .mud-table-container .mud-table-root .mud-table-body .mud-table-row .mud-table-cell:last-child{border-right:1px solid var(--mud-palette-table-lines);border-top-right-radius:0px}.mud-application-layout-rtl .mud-table-bordered .mud-table-container .mud-table-root .mud-table-body .mud-table-row .mud-table-cell:first-child{border-right:none;border-top-right-radius:0px}.mud-application-layout-rtl .mud-table-bordered .mud-table-container .mud-table-root .mud-table-head.table-head-bordered .mud-table-row .mud-table-cell:last-child{border-right:1px solid var(--mud-palette-table-lines);border-top-right-radius:0px}.mud-application-layout-rtl .mud-table-bordered .mud-table-container .mud-table-root .mud-table-head.table-head-bordered .mud-table-row .mud-table-cell:only-child{border-right:none;border-top-right-radius:var(--mud-default-borderradius)}.mud-application-layout-rtl .mud-table-bordered .mud-table-container .mud-table-root .mud-table-head .mud-table-row th.mud-table-cell:first-child{border-right:none;border-top-right-radius:var(--mud-default-borderradius)}.mud-application-layout-rtl .mud-table-bordered .mud-table-container .mud-table-root .mud-table-foot.table-foot-bordered .mud-table-row .mud-table-cell:last-child{border-right:1px solid var(--mud-palette-table-lines);border-top-right-radius:0px}.mud-application-layout-rtl .mud-table-bordered .mud-table-container .mud-table-root .mud-table-foot .mud-table-row .mud-table-cell:first-child{border-right:none}.mud-table-sticky-header .mud-table-container{overflow-x:auto}.mud-table-sticky-header * .mud-table-root .mud-table-head * .mud-table-cell:first-child{border-radius:var(--mud-default-borderradius) 0px 0px 0px}.mud-table-sticky-header * .mud-table-root .mud-table-head * .mud-table-cell:last-child{border-radius:0px var(--mud-default-borderradius) 0px 0px}.mud-table-sticky-header * .mud-table-root .mud-table-head * .mud-table-cell{background-color:var(--mud-palette-surface);position:sticky;z-index:2;top:0}.mud-table-sticky-footer .mud-table-container{overflow-x:auto}.mud-table-sticky-footer * .mud-table-root .mud-table-foot{position:sticky;z-index:2;bottom:0}.mud-table-sticky-footer * .mud-table-root .mud-table-foot * .mud-table-cell{background-color:var(--mud-palette-surface)}.mud-table-row{color:inherit;display:table-row;outline:0;vertical-align:middle}@media(hover: hover)and (pointer: fine){.mud-table-hover .mud-table-container .mud-table-root .mud-table-body .mud-table-row:hover{background-color:var(--mud-palette-table-hover)}}.mud-table-striped .mud-table-container .mud-table-root .mud-table-body .mud-table-row:nth-of-type(odd){background-color:var(--mud-palette-table-striped)}@media(hover: hover)and (pointer: fine){.mud-table-hover.mud-table-striped .mud-table-container .mud-table-root .mud-table-body .mud-table-row:nth-of-type(odd):hover{background-color:var(--mud-palette-table-hover)}}.mud-table-cell>.mud-input-control>div.mud-input.mud-input-text{color:var(--mud-theme-on-surface);font-size:.875rem;margin-top:-14px;margin-bottom:-8px}.mud-table-cell>.mud-select>.mud-input-control>div.mud-input.mud-input-text{color:var(--mud-theme-on-surface);font-size:.875rem;margin-top:-14px;margin-bottom:-8px}.mud-table-cell-align-left{text-align:left}.mud-table-cell-align-center{text-align:center}.mud-table-cell-align-right{text-align:right;flex-direction:row-reverse}.mud-table-cell-align-justify{text-align:justify}.mud-table-pagination-display{display:flex;flex-shrink:0}.mud-table-pagination-display .mud-tablepager-left{flex-direction:row !important}.mud-table-pagination-display .mud-tablepager-right{flex-direction:row-reverse !important}.mud-table-pagination-information{white-space:nowrap;direction:initial}.mud-table-page-number-information{white-space:nowrap;direction:initial}.mud-table-pagination{color:var(--mud-theme-on-surface);overflow:auto;font-size:.875rem;display:initial}.mud-table-pagination:last-child{padding:0}.mud-table-pagination-toolbar{border-top:1px solid var(--mud-palette-table-lines);height:52px;padding-right:2px;padding-inline-end:2px;padding-inline-start:unset;flex-wrap:nowrap}.mud-table-pagination-toolbar .mud-tablepager-left{flex-direction:row !important}.mud-table-pagination-toolbar .mud-tablepager-right{flex-direction:row-reverse !important}.mud-table-pagination-spacer{flex:1 1 100%}.mud-table-pagination-caption{display:flex;flex-shrink:0;align-items:center;padding-left:10px;padding-right:10px}.mud-table-pagination-select{cursor:pointer;margin-left:10px !important;margin-right:10px !important;margin-top:0px !important;min-width:52px}.mud-table-pagination-select .mud-select-input{margin-top:0px !important;padding:0 7px !important}.mud-table-pagination-select .mud-input .mud-input-root{max-width:80px;cursor:pointer;margin-top:2px;border:none;font-size:.875rem;font-weight:400;line-height:1.43;letter-spacing:.01071em;color:var(--mud-theme-on-surface)}.mud-table-pagination-actions{flex-shrink:0;align-items:center;margin-left:10px;margin-inline-start:10px;margin-inline-end:unset}.mud-table-smalldevices-sortselect{display:none}.mud-table-loading{position:relative}.mud-table-loading .mud-table-loading-progress{width:100%}.mud-table-empty-row{background-color:var(--mud-palette-surface);vertical-align:middle;text-align:center}tr.mud-table-row-group-indented-1 td:first-child{padding-left:48px !important}tr.mud-table-row-group-indented-2 td:first-child{padding-left:96px !important}tr.mud-table-row-group-indented-3 td:first-child{padding-left:144px !important}tr.mud-table-row-group-indented-4 td:first-child{padding-left:192px !important}tr.mud-table-row-group-indented-5 td:first-child{padding-left:240px !important}.mud-table-row-expander{margin:-12px -2px -12px -12px}@media(max-width: 360px){.mud-table .mud-table-pagination .mud-select{margin-left:auto;margin-right:-14px;margin-inline-start:auto;margin-inline-end:-14px}.mud-table .mud-table-pagination .mud-select~.mud-table-pagination-caption{margin-left:unset !important;margin-inline-start:unset !important}}@media(max-width: 416px){.mud-table .mud-table-pagination .mud-table-pagination-toolbar{flex-wrap:wrap;padding-top:16px;padding-right:16px;padding-inline-end:16px;padding-inline-start:unset;min-height:100px}.mud-table .mud-table-pagination .mud-table-pagination-toolbar .mud-table-pagination-actions{margin-left:auto;margin-right:-14px;margin-inline-start:auto;margin-inline-end:-14px}}@media(max-width: 600px){.mud-xs-table .mud-table-root .mud-table-head,.mud-xs-table .mud-table-root .mud-table-foot{display:none}.mud-xs-table .mud-table-smalldevices-sortselect{display:block;padding:4px 16px 8px}.mud-xs-table .mud-table-body{border-top:1px solid var(--mud-palette-table-lines)}.mud-xs-table .mud-table-row{display:revert}.mud-xs-table .mud-table-row .mud-table-cell:last-child{border-bottom:1px solid var(--mud-palette-table-lines)}.mud-xs-table .mud-table-cell{display:flex;justify-content:space-between;align-items:center;border:none;padding:14px 16px;text-align:start !important}.mud-xs-table.mud-table-dense .mud-table-cell{padding:6px 16px}.mud-xs-table .mud-table-cell:before{content:attr(data-label);font-weight:500;padding-right:16px;padding-inline-end:16px;padding-inline-start:unset}.mud-xs-table.mud-table-small-alignright .mud-table-cell:before{margin-right:auto}.mud-xs-table .mud-table-cell-hide{visibility:collapse;height:0;padding:0;margin:0}.mud-xs-table .mud-table-pagination .mud-table-pagination-spacer{flex:none}.mud-xs-table .mud-table-pagination .mud-table-pagination-actions .mud-button-root:first-child{display:none}.mud-xs-table .mud-table-pagination .mud-table-pagination-actions .mud-button-root:last-child{display:none}.mud-xs-table .mud-table-pagination .mud-select~.mud-table-pagination-caption{margin-left:auto;margin-inline-start:auto}.mud-xs-table.mud-table-bordered .mud-table-container .mud-table-root colgroup~.mud-table-body .mud-table-row .mud-table-cell{border-right:1px solid var(--mud-palette-table-lines) !important}.mud-xs-table.mud-table-bordered .mud-table-container .mud-table-root .mud-table-body .mud-table-row .mud-table-cell{border-right:none !important}}@media(max-width: 960px){.mud-sm-table .mud-table-root .mud-table-head,.mud-sm-table .mud-table-root .mud-table-foot{display:none}.mud-sm-table .mud-table-smalldevices-sortselect{display:block;padding:4px 16px 8px}.mud-sm-table .mud-table-body{border-top:1px solid var(--mud-palette-table-lines)}.mud-sm-table .mud-table-row{display:revert}.mud-sm-table .mud-table-row .mud-table-cell:last-child{border-bottom:1px solid var(--mud-palette-table-lines)}.mud-sm-table .mud-table-cell{display:flex;justify-content:space-between;align-items:center;border:none;padding:14px 16px;text-align:start !important}.mud-sm-table.mud-table-dense .mud-table-cell{padding:6px 16px}.mud-sm-table .mud-table-cell:before{content:attr(data-label);font-weight:500;padding-right:16px;padding-inline-end:16px;padding-inline-start:unset}.mud-sm-table.mud-table-small-alignright .mud-table-cell:before{margin-right:auto}.mud-sm-table .mud-table-cell-hide{visibility:collapse;height:0;padding:0;margin:0}.mud-sm-table .mud-table-pagination .mud-table-pagination-spacer{flex:none}.mud-sm-table .mud-table-pagination .mud-table-pagination-actions .mud-button-root:first-child{display:none}.mud-sm-table .mud-table-pagination .mud-table-pagination-actions .mud-button-root:last-child{display:none}.mud-sm-table .mud-table-pagination .mud-select~.mud-table-pagination-caption{margin-left:auto;margin-inline-start:auto}.mud-sm-table.mud-table-bordered .mud-table-container .mud-table-root colgroup~.mud-table-body .mud-table-row .mud-table-cell{border-right:1px solid var(--mud-palette-table-lines) !important}.mud-sm-table.mud-table-bordered .mud-table-container .mud-table-root .mud-table-body .mud-table-row .mud-table-cell{border-right:none !important}}@media(max-width: 1280px){.mud-md-table .mud-table-root .mud-table-head,.mud-md-table .mud-table-root .mud-table-foot{display:none}.mud-md-table .mud-table-smalldevices-sortselect{display:block;padding:4px 16px 8px}.mud-md-table .mud-table-body{border-top:1px solid var(--mud-palette-table-lines)}.mud-md-table .mud-table-row{display:revert}.mud-md-table .mud-table-row .mud-table-cell:last-child{border-bottom:1px solid var(--mud-palette-table-lines)}.mud-md-table .mud-table-cell{display:flex;justify-content:space-between;align-items:center;border:none;padding:14px 16px;text-align:start !important}.mud-md-table.mud-table-dense .mud-table-cell{padding:6px 16px}.mud-md-table .mud-table-cell:before{content:attr(data-label);font-weight:500;padding-right:16px;padding-inline-end:16px;padding-inline-start:unset}.mud-md-table.mud-table-small-alignright .mud-table-cell:before{margin-right:auto}.mud-md-table .mud-table-cell-hide{visibility:collapse;height:0;padding:0;margin:0}.mud-md-table .mud-table-pagination .mud-table-pagination-spacer{flex:none}.mud-md-table .mud-table-pagination .mud-table-pagination-actions .mud-button-root:first-child{display:none}.mud-md-table .mud-table-pagination .mud-table-pagination-actions .mud-button-root:last-child{display:none}.mud-md-table .mud-table-pagination .mud-select~.mud-table-pagination-caption{margin-left:auto;margin-inline-start:auto}.mud-md-table.mud-table-bordered .mud-table-container .mud-table-root colgroup~.mud-table-body .mud-table-row .mud-table-cell{border-right:1px solid var(--mud-palette-table-lines) !important}.mud-md-table.mud-table-bordered .mud-table-container .mud-table-root .mud-table-body .mud-table-row .mud-table-cell{border-right:none !important}}@media(max-width: 1920px){.mud-lg-table .mud-table-root .mud-table-head,.mud-lg-table .mud-table-root .mud-table-foot{display:none}.mud-lg-table .mud-table-smalldevices-sortselect{display:block;padding:4px 16px 8px}.mud-lg-table .mud-table-body{border-top:1px solid var(--mud-palette-table-lines)}.mud-lg-table .mud-table-row{display:revert}.mud-lg-table .mud-table-row .mud-table-cell:last-child{border-bottom:1px solid var(--mud-palette-table-lines)}.mud-lg-table .mud-table-cell{display:flex;justify-content:space-between;align-items:center;border:none;padding:14px 16px;text-align:start !important}.mud-lg-table.mud-table-dense .mud-table-cell{padding:6px 16px}.mud-lg-table .mud-table-cell:before{content:attr(data-label);font-weight:500;padding-right:16px;padding-inline-end:16px;padding-inline-start:unset}.mud-lg-table.mud-table-small-alignright .mud-table-cell:before{margin-right:auto}.mud-lg-table .mud-table-cell-hide{visibility:collapse;height:0;padding:0;margin:0}.mud-lg-table .mud-table-pagination .mud-table-pagination-spacer{flex:none}.mud-lg-table .mud-table-pagination .mud-table-pagination-actions .mud-button-root:first-child{display:none}.mud-lg-table .mud-table-pagination .mud-table-pagination-actions .mud-button-root:last-child{display:none}.mud-lg-table .mud-table-pagination .mud-select~.mud-table-pagination-caption{margin-left:auto;margin-inline-start:auto}.mud-lg-table.mud-table-bordered .mud-table-container .mud-table-root colgroup~.mud-table-body .mud-table-row .mud-table-cell{border-right:1px solid var(--mud-palette-table-lines) !important}.mud-lg-table.mud-table-bordered .mud-table-container .mud-table-root .mud-table-body .mud-table-row .mud-table-cell{border-right:none !important}}@media(max-width: 2560px){.mud-xl-table .mud-table-root .mud-table-head,.mud-xl-table .mud-table-root .mud-table-foot{display:none}.mud-xl-table .mud-table-smalldevices-sortselect{display:block;padding:4px 16px 8px}.mud-xl-table .mud-table-body{border-top:1px solid var(--mud-palette-table-lines)}.mud-xl-table .mud-table-row{display:revert}.mud-xl-table .mud-table-row .mud-table-cell:last-child{border-bottom:1px solid var(--mud-palette-table-lines)}.mud-xl-table .mud-table-cell{display:flex;justify-content:space-between;align-items:center;border:none;padding:14px 16px;text-align:start !important}.mud-xl-table.mud-table-dense .mud-table-cell{padding:6px 16px}.mud-xl-table .mud-table-cell:before{content:attr(data-label);font-weight:500;padding-right:16px;padding-inline-end:16px;padding-inline-start:unset}.mud-xl-table.mud-table-small-alignright .mud-table-cell:before{margin-right:auto}.mud-xl-table .mud-table-cell-hide{visibility:collapse;height:0;padding:0;margin:0}.mud-xl-table .mud-table-pagination .mud-table-pagination-spacer{flex:none}.mud-xl-table .mud-table-pagination .mud-table-pagination-actions .mud-button-root:first-child{display:none}.mud-xl-table .mud-table-pagination .mud-table-pagination-actions .mud-button-root:last-child{display:none}.mud-xl-table .mud-table-pagination .mud-select~.mud-table-pagination-caption{margin-left:auto;margin-inline-start:auto}.mud-xl-table.mud-table-bordered .mud-table-container .mud-table-root colgroup~.mud-table-body .mud-table-row .mud-table-cell{border-right:1px solid var(--mud-palette-table-lines) !important}.mud-xl-table.mud-table-bordered .mud-table-container .mud-table-root .mud-table-body .mud-table-row .mud-table-cell{border-right:none !important}}@media(min-width: 2560px){.mud-xxl-table .mud-table-root .mud-table-head,.mud-xxl-table .mud-table-root .mud-table-foot{display:none}.mud-xxl-table .mud-table-smalldevices-sortselect{display:block;padding:4px 16px 8px}.mud-xxl-table .mud-table-body{border-top:1px solid var(--mud-palette-table-lines)}.mud-xxl-table .mud-table-row{display:revert}.mud-xxl-table .mud-table-row .mud-table-cell:last-child{border-bottom:1px solid var(--mud-palette-table-lines)}.mud-xxl-table .mud-table-cell{display:flex;justify-content:space-between;align-items:center;border:none;padding:14px 16px;text-align:start !important}.mud-xxl-table.mud-table-dense .mud-table-cell{padding:6px 16px}.mud-xxl-table .mud-table-cell:before{content:attr(data-label);font-weight:500;padding-right:16px;padding-inline-end:16px;padding-inline-start:unset}.mud-xxl-table.mud-table-small-alignright .mud-table-cell:before{margin-right:auto}.mud-xxl-table .mud-table-cell-hide{visibility:collapse;height:0;padding:0;margin:0}.mud-xxl-table .mud-table-pagination .mud-table-pagination-spacer{flex:none}.mud-xxl-table .mud-table-pagination .mud-table-pagination-actions .mud-button-root:first-child{display:none}.mud-xxl-table .mud-table-pagination .mud-table-pagination-actions .mud-button-root:last-child{display:none}.mud-xxl-table .mud-table-pagination .mud-select~.mud-table-pagination-caption{margin-left:auto;margin-inline-start:auto}.mud-xxl-table.mud-table-bordered .mud-table-container .mud-table-root colgroup~.mud-table-body .mud-table-row .mud-table-cell{border-right:1px solid var(--mud-palette-table-lines) !important}.mud-xxl-table.mud-table-bordered .mud-table-container .mud-table-root .mud-table-body .mud-table-row .mud-table-cell{border-right:none !important}}.mud-tabs{display:flex;flex-direction:column}.mud-tabs.mud-tabs-reverse{flex-direction:column-reverse}.mud-tabs.mud-tabs-vertical{flex-direction:row}.mud-tabs.mud-tabs-vertical .mud-tooltip-root{width:auto}.mud-tabs.mud-tabs-vertical-reverse{flex-direction:row-reverse}.mud-tabs.mud-tabs-rounded{border-radius:var(--mud-default-borderradius);overflow:hidden}.mud-tabs.mud-tabs-rounded .mud-tabs-tabbar{border-radius:var(--mud-default-borderradius)}.mud-tabs.mud-tabs-rounded .mud-tabs-panels{border-radius:var(--mud-default-borderradius)}.mud-tabs-tabbar{position:relative;background-color:var(--mud-palette-surface)}.mud-tabs-tabbar.mud-tabs-border-left{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important;border-right:1px solid var(--mud-palette-lines-default)}.mud-tabs-tabbar.mud-tabs-border-right{border-top-left-radius:0 !important;border-bottom-left-radius:0 !important;border-left:1px solid var(--mud-palette-lines-default)}.mud-tabs-tabbar.mud-tabs-border-top{border-bottom-left-radius:0 !important;border-bottom-right-radius:0 !important;border-bottom:1px solid var(--mud-palette-lines-default)}.mud-tabs-tabbar.mud-tabs-border-bottom{border-top-left-radius:0 !important;border-top-right-radius:0 !important;border-top:1px solid var(--mud-palette-lines-default)}.mud-tabs-tabbar.mud-tabs-rounded{border-radius:var(--mud-default-borderradius)}.mud-tabs-tabbar.mud-tabs-vertical .mud-tabs-tabbar-inner{flex-direction:column}.mud-tabs-tabbar.mud-tabs-vertical .mud-tabs-tabbar-inner .mud-tabs-scroll-button .mud-button-root{width:100%;border-radius:0px;height:32px}.mud-tabs-tabbar.mud-tabs-vertical .mud-tabs-tabbar-inner .mud-tabs-scroll-button .mud-button-root .mud-icon-button-label .mud-icon-root{transform:rotate(90deg)}.mud-tabs-tabbar .mud-tabs-tabbar-inner{display:flex;min-height:48px}.mud-tabs-tabbar-content{width:100%;flex:1 1 auto;display:inline-block;position:relative;white-space:nowrap;overflow:hidden}.mud-tabs-tabbar-content .mud-tabs-tabbar-wrapper{width:max-content;position:inherit;display:flex;transition:.3s cubic-bezier(0.25, 0.8, 0.5, 1)}.mud-tabs-tabbar-content .mud-tabs-tabbar-wrapper.mud-tabs-centered{margin:auto}.mud-tabs-tabbar-content .mud-tabs-tabbar-wrapper.mud-tabs-vertical{flex-direction:column}.mud-tabs-panels{position:relative;transition:.3s cubic-bezier(0.25, 0.8, 0.5, 1)}.mud-tabs-panels.mud-tabs-vertical{display:flex;flex-grow:1}.mud-tab{width:100%;display:inline-flex;padding:6px 12px;min-height:48px;flex-shrink:0;font-weight:500;line-height:1.75;user-select:none;white-space:normal;letter-spacing:.02857em;text-transform:uppercase;text-align:center;align-items:center;justify-content:center;transition:background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}@media(hover: hover)and (pointer: fine){.mud-tab:hover{cursor:pointer;background-color:var(--mud-palette-action-default-hover)}}.mud-tab.mud-tab-active{color:var(--mud-palette-primary)}@media(hover: hover)and (pointer: fine){.mud-tab.mud-tab-active:hover{background-color:var(--mud-palette-primary-hover)}}.mud-tab.mud-disabled{cursor:default;pointer-events:none;color:var(--mud-palette-text-disabled)}.mud-tab .mud-tab-icon-text{margin-right:8px;margin-inline-end:8px;margin-inline-start:unset}.mud-tab-slider{position:absolute;background:var(--mud-palette-primary)}.mud-tab-slider.mud-tab-slider-horizontal{height:2px;bottom:0;transition:left .3s cubic-bezier(0.64, 0.09, 0.08, 1);will-change:left}.mud-tab-slider.mud-tab-slider-horizontal.mud-tab-slider-horizontal-reverse{top:0;bottom:unset}.mud-tab-slider.mud-tab-slider-vertical{width:2px;right:0;transition:top .3s cubic-bezier(0.64, 0.09, 0.08, 1);will-change:top}.mud-tab-slider.mud-tab-slider-vertical.mud-tab-slider-vertical-reverse{left:0;right:unset}.mud-tab-badge{margin-left:8px;margin-inline-start:8px;margin-inline-end:unset}.mud-tabs-tabbar-primary{background-color:var(--mud-palette-primary);color:var(--mud-palette-primary-text)}.mud-tabs-tabbar-primary .mud-tab-slider{background:var(--mud-palette-primary-text)}.mud-tabs-tabbar-primary .mud-tab.mud-tab-active{color:var(--mud-palette-primary-text)}@media(hover: hover)and (pointer: fine){.mud-tabs-tabbar-primary .mud-tab.mud-tab-active:hover{background-color:var(--mud-palette-primary-lighten)}}.mud-tabs-tabbar-secondary{background-color:var(--mud-palette-secondary);color:var(--mud-palette-secondary-text)}.mud-tabs-tabbar-secondary .mud-tab-slider{background:var(--mud-palette-secondary-text)}.mud-tabs-tabbar-secondary .mud-tab.mud-tab-active{color:var(--mud-palette-secondary-text)}@media(hover: hover)and (pointer: fine){.mud-tabs-tabbar-secondary .mud-tab.mud-tab-active:hover{background-color:var(--mud-palette-secondary-lighten)}}.mud-tabs-tabbar-tertiary{background-color:var(--mud-palette-tertiary);color:var(--mud-palette-tertiary-text)}.mud-tabs-tabbar-tertiary .mud-tab-slider{background:var(--mud-palette-tertiary-text)}.mud-tabs-tabbar-tertiary .mud-tab.mud-tab-active{color:var(--mud-palette-tertiary-text)}@media(hover: hover)and (pointer: fine){.mud-tabs-tabbar-tertiary .mud-tab.mud-tab-active:hover{background-color:var(--mud-palette-tertiary-lighten)}}.mud-tabs-tabbar-info{background-color:var(--mud-palette-info);color:var(--mud-palette-info-text)}.mud-tabs-tabbar-info .mud-tab-slider{background:var(--mud-palette-info-text)}.mud-tabs-tabbar-info .mud-tab.mud-tab-active{color:var(--mud-palette-info-text)}@media(hover: hover)and (pointer: fine){.mud-tabs-tabbar-info .mud-tab.mud-tab-active:hover{background-color:var(--mud-palette-info-lighten)}}.mud-tabs-tabbar-success{background-color:var(--mud-palette-success);color:var(--mud-palette-success-text)}.mud-tabs-tabbar-success .mud-tab-slider{background:var(--mud-palette-success-text)}.mud-tabs-tabbar-success .mud-tab.mud-tab-active{color:var(--mud-palette-success-text)}@media(hover: hover)and (pointer: fine){.mud-tabs-tabbar-success .mud-tab.mud-tab-active:hover{background-color:var(--mud-palette-success-lighten)}}.mud-tabs-tabbar-warning{background-color:var(--mud-palette-warning);color:var(--mud-palette-warning-text)}.mud-tabs-tabbar-warning .mud-tab-slider{background:var(--mud-palette-warning-text)}.mud-tabs-tabbar-warning .mud-tab.mud-tab-active{color:var(--mud-palette-warning-text)}@media(hover: hover)and (pointer: fine){.mud-tabs-tabbar-warning .mud-tab.mud-tab-active:hover{background-color:var(--mud-palette-warning-lighten)}}.mud-tabs-tabbar-error{background-color:var(--mud-palette-error);color:var(--mud-palette-error-text)}.mud-tabs-tabbar-error .mud-tab-slider{background:var(--mud-palette-error-text)}.mud-tabs-tabbar-error .mud-tab.mud-tab-active{color:var(--mud-palette-error-text)}@media(hover: hover)and (pointer: fine){.mud-tabs-tabbar-error .mud-tab.mud-tab-active:hover{background-color:var(--mud-palette-error-lighten)}}.mud-tabs-tabbar-dark{background-color:var(--mud-palette-dark);color:var(--mud-palette-dark-text)}.mud-tabs-tabbar-dark .mud-tab-slider{background:var(--mud-palette-dark-text)}.mud-tabs-tabbar-dark .mud-tab.mud-tab-active{color:var(--mud-palette-dark-text)}@media(hover: hover)and (pointer: fine){.mud-tabs-tabbar-dark .mud-tab.mud-tab-active:hover{background-color:var(--mud-palette-dark-lighten)}}.tab-transition-enter{transform:translate(100%, 0)}.tab-transition-leave,.tab-transition-leave-active{position:absolute;top:0}.tab-transition-leave-to{position:absolute;transform:translate(-100%, 0)}.tab-reverse-transition-enter{transform:translate(-100%, 0)}.tab-reverse-transition-leave,.tab-reverse-transition-leave-to{top:0;position:absolute;transform:translate(100%, 0)}.mud-dynamic-tabs .mud-tabs-tabbar .mud-tab{padding:6px 14px}.mud-dynamic-tabs .mud-tabs-tabbar .mud-tab .mud-icon-button{padding:4px;margin-right:-4px;margin-inline-end:-4px;margin-inline-start:unset}.mud-dynamic-tabs .mud-tabs-tabbar .mud-tab .mud-tabs-panel-header-before{padding-right:8px;padding-inline-end:8px;padding-inline-start:unset}.mud-dynamic-tabs .mud-tabs-tabbar .mud-tab .mud-tabs-panel-header-after{padding-left:8px;padding-inline-start:8px;padding-inline-end:unset}.mud-tabs-header.mud-tabs-header-before{display:inherit}.mud-tabs-header.mud-tabs-header-after{display:inherit}.mud-tabs-panel-header{display:flex;flex:1 1 auto}.mud-tabs-panel-header.mud-tabs-panel-header-before{justify-content:flex-start}.mud-tabs-panel-header.mud-tabs-panel-header-after{justify-content:flex-end}.mud-select{display:flex;flex-grow:1;position:relative}.mud-select.mud-autocomplete{display:block}.mud-select.mud-autocomplete .mud-select-input{cursor:text}.mud-select.mud-autocomplete .mud-input-adornment{cursor:pointer}.mud-select.mud-autocomplete--with-progress .mud-select-input input{padding-right:3.5rem !important}.mud-select.mud-autocomplete--with-progress .mud-input-adorned-end input{padding-right:4.5rem !important}.mud-select.mud-autocomplete--with-progress .mud-select-input .mud-icon-button{display:none !important}.mud-select.mud-autocomplete--with-progress .progress-indicator-circular{position:absolute;width:100%;top:0;bottom:0;display:flex;align-items:center;justify-content:flex-end;padding-top:.25rem;padding-bottom:.25rem;padding-right:1rem}.mud-select.mud-autocomplete--with-progress .mud-progress-linear{position:absolute;bottom:-1px;height:2px}.mud-select .mud-select-input{cursor:pointer}.mud-select .mud-select-input .mud-input-slot{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.mud-select .mud-select-input .mud-input-adornment-end{margin-left:0}.mud-select .mud-select-input:disabled{cursor:default}.mud-select .mud-disabled .mud-select-input{cursor:default}.mud-rtl-provider .mud-select .progress-indicator-circular--with-adornment{padding-right:1rem}.mud-rtl-provider.mud-application-layout-rtl .mud-select .progress-indicator-circular--with-adornment{padding-right:0rem !important;padding-left:1rem !important}.mud-select>.mud-form-helpertext{margin-top:-21px}.mud-select-all{margin-top:10px;border-bottom:1px solid #d3d3d3;padding-bottom:18px}.mud-input{position:relative;color:var(--mud-palette-text-primary);cursor:text;display:inline-flex;box-sizing:border-box;align-items:center;color-scheme:var(--mud-native-html-color-scheme)}.mud-input.mud-input-full-width{width:100%}.mud-input.mud-disabled{color:var(--mud-palette-text-disabled);cursor:default}.mud-input.mud-disabled>.mud-input-adornment{color:var(--mud-palette-text-disabled);pointer-events:none}.mud-input.mud-input-underline:before{left:0;right:0;bottom:0;content:" ";position:absolute;transition:border-bottom .2s,background-color .2s;border-bottom:1px solid var(--mud-palette-lines-inputs);pointer-events:none}@media(hover: hover)and (pointer: fine){.mud-input.mud-input-underline:hover:not(.mud-disabled):before{border-bottom:1px solid var(--mud-palette-action-default)}}.mud-input.mud-input-underline:after{left:0;right:0;bottom:0;content:"";position:absolute;transform:scaleX(0);transition:transform 200ms cubic-bezier(0, 0, 0.2, 1) 0ms;border-bottom:2px solid var(--mud-palette-primary);pointer-events:none}.mud-input.mud-input-underline.mud-disabled:before{border-bottom-style:dotted}.mud-input.mud-input-underline.mud-input-error:after{transform:scaleX(1);border-bottom-color:var(--mud-palette-error)}.mud-input.mud-input-filled{position:relative;transition:background-color 200ms cubic-bezier(0, 0, 0.2, 1) 0ms;background-color:rgba(0,0,0,.09);border-top-left-radius:4px;border-top-right-radius:4px}@media(hover: hover)and (pointer: fine){.mud-input.mud-input-filled:hover{background-color:rgba(0,0,0,.13)}}.mud-input.mud-input-filled.mud-focused{background-color:rgba(0,0,0,.09)}.mud-input.mud-input-filled.mud-disabled{background-color:rgba(0,0,0,.12)}.mud-input.mud-input-filled.mud-input-adorned-start{padding-left:12px;padding-inline-start:12px;padding-inline-end:unset}.mud-input.mud-input-filled.mud-input-adorned-end{padding-right:12px;padding-inline-end:12px;padding-inline-start:unset}.mud-input.mud-input-filled.mud-input-underline:before{left:0;right:0;bottom:0;content:" ";position:absolute;transition:border-bottom-color 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;border-bottom:1px solid var(--mud-palette-lines-inputs);pointer-events:none}.mud-input.mud-input-filled.mud-input-underline:after{left:0;right:0;bottom:0;content:"";position:absolute;transform:scaleX(0);transition:transform 200ms cubic-bezier(0, 0, 0.2, 1) 0ms;border-bottom:2px solid var(--mud-palette-primary);pointer-events:none}@media(hover: hover)and (pointer: fine){.mud-input.mud-input-filled.mud-input-underline:hover:before{border-bottom:1px solid var(--mud-palette-action-default)}}.mud-input.mud-input-filled.mud-input-underline.mud-disabled:before{border-bottom-style:dotted}.mud-input.mud-input-filled.mud-input-underline.mud-input-error:after{transform:scaleX(1);border-bottom-color:var(--mud-palette-error)}.mud-input.mud-input-outlined{position:relative;border-width:0px}.mud-input.mud-input-outlined .mud-input-outlined-border{display:flex;position:absolute;top:0;right:0;left:0;box-sizing:border-box;width:100%;max-width:100%;height:100%;text-align:start;pointer-events:none;border-radius:var(--mud-default-borderradius);border-color:var(--mud-palette-lines-inputs);border-width:1px;border-style:solid;transition:border-width,border-color 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}@media(hover: hover)and (pointer: fine){.mud-input.mud-input-outlined:not(.mud-disabled):not(:focus-within):hover .mud-input-outlined-border{border-color:var(--mud-palette-action-default)}}.mud-input.mud-input-outlined:focus-within .mud-input-outlined-border{border-width:2px;border-color:var(--mud-palette-primary)}.mud-input.mud-input-outlined.mud-disabled .mud-input-outlined-border{border-color:var(--mud-palette-action-disabled)}.mud-input.mud-input-outlined.mud-input-adorned-start{padding-left:14px;padding-inline-start:14px;padding-inline-end:unset}.mud-input.mud-input-outlined.mud-input-adorned-end{padding-right:14px;padding-inline-end:14px;padding-inline-start:unset}.mud-input-error .mud-input-outlined-border{border-color:var(--mud-palette-error) !important}.mud-input:focus-within.mud-input-underline:after{transform:scaleX(1)}.mud-input>input.mud-input-root,div.mud-input-slot.mud-input-root{font:inherit;color:currentColor;width:100%;border:0;height:1lh;margin:0;display:block;padding:6px 0 7px;min-width:0;background:none;position:relative;box-sizing:content-box;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mud-input>input.mud-input-root::placeholder,div.mud-input-slot.mud-input-root::placeholder{color:currentColor;opacity:.42;transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-input>input.mud-input-root::-webkit-input-placeholder,div.mud-input-slot.mud-input-root::-webkit-input-placeholder{color:currentColor;opacity:.42;transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-input>input.mud-input-root:-moz-placeholder,div.mud-input-slot.mud-input-root:-moz-placeholder{color:currentColor;opacity:.42;transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-input>input.mud-input-root::-moz-placeholder,div.mud-input-slot.mud-input-root::-moz-placeholder{color:currentColor;opacity:.42;transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-input>input.mud-input-root:-ms-input-placeholder,div.mud-input-slot.mud-input-root:-ms-input-placeholder{color:currentColor;opacity:.42;transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-input>input.mud-input-root::-ms-input-placeholder,div.mud-input-slot.mud-input-root::-ms-input-placeholder{color:currentColor;opacity:.42;transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-input>input.mud-input-root.mud-input-root-margin-dense,div.mud-input-slot.mud-input-root.mud-input-root-margin-dense{padding-top:3px}.mud-input>input.mud-input-root.mud-input-root-multiline,div.mud-input-slot.mud-input-root.mud-input-root-multiline{height:auto;resize:none;padding:0}.mud-input>input.mud-input-root.mud-input-root-type-search,div.mud-input-slot.mud-input-root.mud-input-root-type-search{-moz-appearance:textfield;-webkit-appearance:textfield}.mud-input>input.mud-input-root:focus,.mud-input>input.mud-input-root:active,div.mud-input-slot.mud-input-root:focus,div.mud-input-slot.mud-input-root:active{outline:0}.mud-input>input.mud-input-root:invalid,div.mud-input-slot.mud-input-root:invalid{box-shadow:none}.mud-input>input.mud-input-root:disabled,div.mud-input-slot.mud-input-root:disabled{opacity:1}.mud-input>input.mud-input-root.mud-input-root-filled,div.mud-input-slot.mud-input-root.mud-input-root-filled{padding:27px 12px 10px}.mud-input>input.mud-input-root.mud-input-root-filled.mud-input-root-margin-dense,div.mud-input-slot.mud-input-root.mud-input-root-filled.mud-input-root-margin-dense{padding-top:23px;padding-bottom:6px}.mud-input>input.mud-input-root.mud-input-root-filled:-webkit-autofill,div.mud-input-slot.mud-input-root.mud-input-root-filled:-webkit-autofill{border-top-left-radius:inherit;border-top-right-radius:inherit}.mud-input>input.mud-input-root.mud-input-root-filled.mud-input-root-hidden-label,div.mud-input-slot.mud-input-root.mud-input-root-filled.mud-input-root-hidden-label{padding-top:18px;padding-bottom:19px}.mud-input>input.mud-input-root.mud-input-root-filled.mud-input-root-hidden-label.mud-input-root-margin-dense,div.mud-input-slot.mud-input-root.mud-input-root-filled.mud-input-root-hidden-label.mud-input-root-margin-dense{padding-top:10px;padding-bottom:11px}.mud-input>input.mud-input-root.mud-input-root-filled.mud-input-root-multiline,div.mud-input-slot.mud-input-root.mud-input-root-filled.mud-input-root-multiline{padding:0}.mud-input>input.mud-input-root.mud-input-root-filled.mud-input-root-adorned-start,div.mud-input-slot.mud-input-root.mud-input-root-filled.mud-input-root-adorned-start{padding-left:0;padding-inline-start:0;padding-inline-end:12px}.mud-input>input.mud-input-root.mud-input-root-filled.mud-input-root-adorned-end,div.mud-input-slot.mud-input-root.mud-input-root-filled.mud-input-root-adorned-end{padding-right:0;padding-inline-end:0;padding-inline-start:12px}.mud-input>input.mud-input-root-outlined,div.mud-input-slot.mud-input-root-outlined{padding:18.5px 14px}.mud-input>input.mud-input-root-outlined.mud-input-root:-webkit-autofill,div.mud-input-slot.mud-input-root-outlined.mud-input-root:-webkit-autofill{border-radius:inherit}.mud-input>input.mud-input-root-outlined.mud-input-root-margin-dense,div.mud-input-slot.mud-input-root-outlined.mud-input-root-margin-dense{padding-top:10.5px;padding-bottom:10.5px}.mud-input>input.mud-input-root-outlined.mud-input-root-adorned-start,div.mud-input-slot.mud-input-root-outlined.mud-input-root-adorned-start{padding-left:0;padding-inline-start:0;padding-inline-end:14px}.mud-input>input.mud-input-root-outlined.mud-input-root-adorned-end,div.mud-input-slot.mud-input-root-outlined.mud-input-root-adorned-end{padding-right:0;padding-inline-end:0;padding-inline-start:14px}.mud-input>input::-ms-reveal,.mud-input>input::-ms-clear,div.mud-input-slot::-ms-reveal,div.mud-input-slot::-ms-clear{display:none !important}.mud-input>textarea.mud-input-root{font:inherit;color:currentColor;width:100%;border:0;height:auto;margin:6px 0 7px;padding:0;display:block;min-width:0;background:none;position:relative;box-sizing:content-box;letter-spacing:inherit;-webkit-tap-highlight-color:rgba(0,0,0,0);height:auto;resize:none;cursor:auto}.mud-input>textarea.mud-input-root::placeholder{color:currentColor;opacity:.42;transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-input>textarea.mud-input-root::-webkit-input-placeholder{color:currentColor;opacity:.42;transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-input>textarea.mud-input-root:-moz-placeholder{color:currentColor;opacity:.42;transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-input>textarea.mud-input-root::-moz-placeholder{color:currentColor;opacity:.42;transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-input>textarea.mud-input-root:-ms-input-placeholder{color:currentColor;opacity:.42;transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-input>textarea.mud-input-root::-ms-input-placeholder{color:currentColor;opacity:.42;transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-input>textarea.mud-input-root.mud-input-root-margin-dense{margin-top:3px}.mud-input>textarea.mud-input-root.mud-input-root-type-search{-moz-appearance:textfield;-webkit-appearance:textfield}.mud-input>textarea.mud-input-root:focus,.mud-input>textarea.mud-input-root:active{outline:0}.mud-input>textarea.mud-input-root:invalid{box-shadow:none}.mud-input>textarea.mud-input-root:disabled{opacity:1}.mud-input>textarea.mud-input-root.mud-input-root-filled{margin:27px 12px 10px}.mud-input>textarea.mud-input-root.mud-input-root-filled.mud-input-root-margin-dense{margin-top:23px;margin-bottom:6px}.mud-input>textarea.mud-input-root.mud-input-root-filled:-webkit-autofill{border-top-left-radius:inherit;border-top-right-radius:inherit}.mud-input>textarea.mud-input-root.mud-input-root-filled.mud-input-root-hidden-label{margin-top:18px;margin-bottom:19px}.mud-input>textarea.mud-input-root.mud-input-root-filled.mud-input-root-hidden-label.mud-input-root-margin-dense{margin-top:10px;margin-bottom:11px}.mud-input>textarea.mud-input-root.mud-input-root-filled.mud-input-root-adorned-start{margin-left:0;margin-inline-start:0;margin-inline-end:12px}.mud-input>textarea.mud-input-root.mud-input-root-filled.mud-input-root-adorned-end{margin-right:0;margin-inline-end:unset;margin-inline-start:12px}.mud-input>textarea.mud-input-root::-webkit-scrollbar{width:8px;height:8px;z-index:1;cursor:crosshair}.mud-input>textarea.mud-input-root::-webkit-scrollbar-thumb{background:var(--mud-palette-lines-inputs);border-radius:1px}.mud-input>textarea.mud-input-root::-webkit-scrollbar-track{background:rgba(0,0,0,0)}.mud-input>textarea.mud-input-root-outlined{margin:18.5px 14px}.mud-input>textarea.mud-input-root-outlined.mud-input-root:-webkit-autofill{border-radius:inherit}.mud-input>textarea.mud-input-root-outlined.mud-input-root-margin-dense{margin-top:10.5px;margin-bottom:10.5px}.mud-input>textarea.mud-input-root-outlined.mud-input-root-adorned-start{margin-left:0;margin-inline-start:0;margin-inline-end:14px}.mud-input>textarea.mud-input-root-outlined.mud-input-root-adorned-end{margin-right:0;margin-inline-end:0;margin-inline-start:14px}.mud-input-adornment{height:.01em;display:flex;max-height:2em;align-items:center;white-space:nowrap}.mud-input-adornment-start.mud-input-root-filled-shrink{margin-top:16px}.mud-input-adornment-start{margin-right:8px;margin-inline-end:8px;margin-inline-start:unset}.mud-input-adornment-end{margin-left:8px;margin-inline-start:8px;margin-inline-end:unset}.mud-input-number-control.mud-input-showspin .mud-input-adornment-end{margin-right:12px;margin-inline-end:12px;margin-inline-start:unset}.mud-input-number-control.mud-input-showspin .mud-input-underline:not(.mud-input-filled) .mud-input-adornment-end{margin-right:24px;margin-inline-end:24px;margin-inline-start:unset}.mud-input-adornment-disable-pointerevents{pointer-events:none}.mud-range-input-separator{visibility:hidden;margin:0 4px}.mud-input:focus-within .mud-range-input-separator{visibility:visible}.mud-picker .mud-shrink .mud-range-input-separator{visibility:visible}.mud-input-control{border:0;margin:0;padding:0;display:flex;flex:1 1 auto;max-width:100%;position:relative;flex-direction:column;vertical-align:top}.mud-input-control.mud-input-control-full-width{width:100%}.mud-input-control.mud-input-control-boolean-input{flex:none;margin:0}.mud-input-control.mud-input-outlined-with-label{margin-top:8px;margin-bottom:4px}.mud-input-control.mud-input-control-margin-dense{margin:4px 0px}.mud-input-control.mud-input-control-margin-dense.mud-input-outlined-with-label{margin-top:8px;margin-bottom:4px}.mud-input-control.mud-input-control-margin-normal{margin:8px 0px}.mud-input-control.mud-input-control-margin-normal.mud-input-outlined-with-label{margin-top:16px;margin-bottom:8px}.mud-input-control>.mud-input-control-input-container{position:relative;display:flex;flex-direction:column}.mud-input-control>.mud-input-control-input-container>div.mud-input.mud-input-text.mud-input-text-with-label{margin-top:16px}.mud-input-control>.mud-input-control-input-container>.mud-input-label-outlined.mud-input-label-inputcontrol{line-height:18px}.mud-input-control>.mud-input-control-input-container>.mud-input-label-inputcontrol{color:var(--mud-palette-text-secondary);padding:0;font-size:1rem;font-weight:400;line-height:1;letter-spacing:.00938em;z-index:0;pointer-events:none}.mud-input-control>.mud-input-control-input-container>.mud-input-label-inputcontrol.mud-disabled{color:var(--mud-palette-text-disabled)}.mud-input-control>.mud-input-control-input-container>.mud-input-label-inputcontrol.mud-input-error{color:var(--mud-palette-error) !important}.mud-input-control.mud-input-required>.mud-input-control-input-container>.mud-input-label::after{content:"*"}.mud-input-control.mud-input-number-control input::-webkit-outer-spin-button,.mud-input-control.mud-input-number-control input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.mud-input-control.mud-input-number-control input[type=number]{-moz-appearance:textfield}.mud-input-control.mud-input-number-control.mud-input-showspin .mud-input:not(.mud-input-adorned-end) input{padding-right:24px;padding-inline-end:24px}.mud-input-control.mud-input-number-control.mud-input-showspin .mud-input:not(.mud-input-adorned-end) input.mud-input-root-margin-dense{padding-right:20px;padding-inline-end:20px}.mud-input-control.mud-input-number-control.mud-input-showspin .mud-input:not(.mud-input-adorned-end).mud-input-text input{padding-inline-start:0}.mud-input-control.mud-input-number-control.mud-input-showspin .mud-input:not(.mud-input-adorned-end).mud-input-text input.mud-input-root-margin-dense{padding-inline-start:0}.mud-input-control.mud-input-number-control.mud-input-showspin .mud-input:not(.mud-input-adorned-end).mud-input-filled input{padding-inline-start:12px}.mud-input-control.mud-input-number-control.mud-input-showspin .mud-input:not(.mud-input-adorned-end).mud-input-filled input.mud-input-root-margin-dense{padding-inline-start:12px}.mud-input-control.mud-input-number-control.mud-input-showspin .mud-input:not(.mud-input-adorned-end).mud-input-outlined input{padding-inline-start:14px}.mud-input-control.mud-input-number-control.mud-input-showspin .mud-input:not(.mud-input-adorned-end).mud-input-outlined input.mud-input-root-margin-dense{padding-inline-start:14px}.mud-input-control.mud-input-number-control .mud-input-numeric-spin{display:inline-flex;flex-direction:column;justify-content:space-between;position:absolute;right:0;top:0;bottom:0}.mud-input-control.mud-input-number-control .mud-input-numeric-spin button{padding:2px;min-width:unset;min-height:unset}.mud-input-control.mud-input-number-control .mud-input-numeric-spin button{padding:2px 0}.mud-input-control-helper-container{overflow:hidden;margin-top:3px}.mud-input-helper-text{color:var(--mud-palette-text-secondary);margin:0;font-size:.75rem;text-align:start;font-weight:400;line-height:1.66;letter-spacing:.03333em}.mud-input-helper-text.mud-input-helper-onfocus{transform:translateY(-100%);transition:color 200ms cubic-bezier(0, 0, 0.2, 1) 0ms,transform 200ms cubic-bezier(0, 0, 0.2, 1) 0ms}.mud-input-control:focus-within .mud-input-helper-text.mud-input-helper-onfocus,.mud-input-control.mud-input-error .mud-input-helper-text.mud-input-helper-onfocus{transform:translateY(0)}.mud-input-helper-text.mud-disabled{color:var(--mud-palette-text-disabled)}.mud-input-helper-text.mud-input-error{color:var(--mud-palette-error) !important}.mud-input-helper-text-margin-dense{margin-top:4px}.mud-input-helper-text-contained{margin-left:14px;margin-right:14px}.mud-application-layout-rtl .mud-input-control.mud-input-number-control .mud-input-numeric-spin{left:0;right:unset}.mud-input-label{display:block;transform-origin:top left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.mud-input-label-inputcontrol{top:0;left:0;position:absolute;transform:translate(0, 24px) scale(1)}.mud-input-label-margindense{transform:translate(0, 21px) scale(1)}.mud-input-label-shrink{transform:translate(0, 1.5px) scale(0.75);transform-origin:top left}.mud-input-label-animated{transition:color 200ms cubic-bezier(0, 0, 0.2, 1) 0ms,transform 200ms cubic-bezier(0, 0, 0.2, 1) 0ms}.mud-input-label-filled{z-index:1;transform:translate(12px, 20px) scale(1);max-width:calc(100% - 12px);pointer-events:none}.mud-input-label-filled.mud-input-label-margin-dense{transform:translate(12px, 17px) scale(1)}.mud-input-label-outlined{transform:translate(14px, 20px) scale(1);max-width:calc(100% - 14px);pointer-events:none;background-color:var(--mud-palette-surface);padding:0px 5px !important}.mud-input-label-outlined.mud-input-label-margin-dense{transform:translate(14px, 12px) scale(1)}.mud-shrink~label.mud-input-label.mud-input-label-inputcontrol{color:var(--mud-palette-text-primary)}.mud-input:focus-within~label.mud-input-label.mud-input-label-inputcontrol{color:var(--mud-palette-primary)}.mud-shrink~label.mud-input-label.mud-input-label-inputcontrol,.mud-input:focus-within~label.mud-input-label.mud-input-label-inputcontrol{transform:translate(0, 1.5px) scale(0.75);transform-origin:top left}.mud-shrink~label.mud-input-label.mud-input-label-inputcontrol.mud-input-label-filled,.mud-input:focus-within~label.mud-input-label.mud-input-label-inputcontrol.mud-input-label-filled{transform:translate(12px, 10px) scale(0.75);max-width:calc(100% - 12px)}.mud-shrink~label.mud-input-label.mud-input-label-inputcontrol.mud-input-label-filled.mud-input-label-margin-dense,.mud-input:focus-within~label.mud-input-label.mud-input-label-inputcontrol.mud-input-label-filled.mud-input-label-margin-dense{transform:translate(12px, 7px) scale(0.75)}.mud-shrink~label.mud-input-label.mud-input-label-inputcontrol.mud-input-label-outlined,.mud-input:focus-within~label.mud-input-label.mud-input-label-inputcontrol.mud-input-label-outlined{transform:translate(14px, -6px) scale(0.75);max-width:calc(100% - 14px)}.mud-input:focus-within~label.mud-input-label.mud-input-label-inputcontrol.mud-input-error{color:var(--mud-palette-error)}.mud-application-layout-rtl .mud-input-label{transform-origin:top right}.mud-application-layout-rtl .mud-input-label-inputcontrol{left:unset;right:0}.mud-application-layout-rtl .mud-input-label-shrink{transform-origin:top right}.mud-application-layout-rtl .mud-input-label-filled{transform:translate(-12px, 20px) scale(1)}.mud-application-layout-rtl .mud-input-label-filled.mud-input-label-margin-dense{transform:translate(-12px, 17px) scale(1)}.mud-application-layout-rtl .mud-input-label-outlined{transform:translate(-14px, 20px) scale(1)}.mud-application-layout-rtl .mud-input-label-outlined.mud-input-label-margin-dense{transform:translate(-14px, 12px) scale(1)}.mud-application-layout-rtl .mud-shrink~label.mud-input-label.mud-input-label-inputcontrol,.mud-application-layout-rtl .mud-input:focus-within~label.mud-input-label.mud-input-label-inputcontrol{transform-origin:top right}.mud-application-layout-rtl .mud-shrink~label.mud-input-label.mud-input-label-inputcontrol.mud-input-label-filled,.mud-application-layout-rtl .mud-input:focus-within~label.mud-input-label.mud-input-label-inputcontrol.mud-input-label-filled{transform:translate(-12px, 10px) scale(0.75)}.mud-application-layout-rtl .mud-shrink~label.mud-input-label.mud-input-label-inputcontrol.mud-input-label-filled.mud-input-label-margin-dense,.mud-application-layout-rtl .mud-input:focus-within~label.mud-input-label.mud-input-label-inputcontrol.mud-input-label-filled.mud-input-label-margin-dense{transform:translate(-12px, 7px) scale(0.75)}.mud-application-layout-rtl .mud-shrink~label.mud-input-label.mud-input-label-inputcontrol.mud-input-label-outlined,.mud-application-layout-rtl .mud-input:focus-within~label.mud-input-label.mud-input-label-inputcontrol.mud-input-label-outlined{transform:translate(-14px, -6px) scale(0.75)}.mud-file-upload{flex-grow:0}.mud-file-upload>.mud-input-control-input-container{display:initial !important}.mud-file-upload.mud-input-control{margin-top:0}.mud-image.fluid{max-width:100%;height:auto}.mud-overlay{top:0;left:0;right:0;bottom:0;margin:0 !important;align-items:center;justify-content:center;border-radius:inherit;display:flex;position:fixed;transition:.3s cubic-bezier(0.25, 0.8, 0.5, 1),z-index 1ms;z-index:5}.mud-overlay.mud-overlay-absolute{position:absolute}.mud-overlay .mud-overlay-scrim{top:0;left:0;right:0;bottom:0;border-radius:inherit;position:absolute;height:100%;width:100%;border-color:rgba(0,0,0,0);background-color:rgba(0,0,0,0);animation:mud-animation-fadein ease .15s;-webkit-animation:mud-animation-fadein ease .15s;-moz-animation:mud-animation-fadein ease .15s;-o-animation:mud-animation-fadein ease .15s}.mud-overlay .mud-overlay-scrim.mud-overlay-dark{border-color:var(--mud-palette-overlay-dark);background-color:var(--mud-palette-overlay-dark)}.mud-overlay .mud-overlay-scrim.mud-overlay-light{border-color:var(--mud-palette-overlay-light);background-color:var(--mud-palette-overlay-light)}.mud-overlay .mud-overlay-scrim:hover{cursor:default}.mud-overlay .mud-overlay-content{position:relative}.mud-overlay.mud-overlay-popover{z-index:var(--mud-zindex-popover)}.mud-overlay.mud-overlay-dialog{z-index:calc(var(--mud-zindex-dialog) + 1)}.mud-overlay.mud-overlay-drawer{z-index:calc(var(--mud-zindex-appbar) + 1)}.mud-treeview{margin:0px;padding:0px;list-style:none;overflow:auto}.mud-treeview.mud-treeview-selected-primary .mud-treeview-item-content.mud-treeview-item-selected{color:var(--mud-palette-primary);--mud-ripple-color: var(--mud-palette-primary);background-color:var(--mud-palette-primary-hover)}.mud-treeview.mud-treeview-selected-secondary .mud-treeview-item-content.mud-treeview-item-selected{color:var(--mud-palette-secondary);--mud-ripple-color: var(--mud-palette-secondary);background-color:var(--mud-palette-secondary-hover)}.mud-treeview.mud-treeview-selected-tertiary .mud-treeview-item-content.mud-treeview-item-selected{color:var(--mud-palette-tertiary);--mud-ripple-color: var(--mud-palette-tertiary);background-color:var(--mud-palette-tertiary-hover)}.mud-treeview.mud-treeview-selected-info .mud-treeview-item-content.mud-treeview-item-selected{color:var(--mud-palette-info);--mud-ripple-color: var(--mud-palette-info);background-color:var(--mud-palette-info-hover)}.mud-treeview.mud-treeview-selected-success .mud-treeview-item-content.mud-treeview-item-selected{color:var(--mud-palette-success);--mud-ripple-color: var(--mud-palette-success);background-color:var(--mud-palette-success-hover)}.mud-treeview.mud-treeview-selected-warning .mud-treeview-item-content.mud-treeview-item-selected{color:var(--mud-palette-warning);--mud-ripple-color: var(--mud-palette-warning);background-color:var(--mud-palette-warning-hover)}.mud-treeview.mud-treeview-selected-error .mud-treeview-item-content.mud-treeview-item-selected{color:var(--mud-palette-error);--mud-ripple-color: var(--mud-palette-error);background-color:var(--mud-palette-error-hover)}.mud-treeview.mud-treeview-selected-dark .mud-treeview-item-content.mud-treeview-item-selected{color:var(--mud-palette-dark);--mud-ripple-color: var(--mud-palette-dark);background-color:var(--mud-palette-dark-hover)}.mud-treeview.mud-treeview-checked-primary .mud-treeview-item-checkbox .mud-button-root.mud-icon-button{color:var(--mud-palette-primary)}.mud-treeview.mud-treeview-checked-secondary .mud-treeview-item-checkbox .mud-button-root.mud-icon-button{color:var(--mud-palette-secondary)}.mud-treeview.mud-treeview-checked-tertiary .mud-treeview-item-checkbox .mud-button-root.mud-icon-button{color:var(--mud-palette-tertiary)}.mud-treeview.mud-treeview-checked-info .mud-treeview-item-checkbox .mud-button-root.mud-icon-button{color:var(--mud-palette-info)}.mud-treeview.mud-treeview-checked-success .mud-treeview-item-checkbox .mud-button-root.mud-icon-button{color:var(--mud-palette-success)}.mud-treeview.mud-treeview-checked-warning .mud-treeview-item-checkbox .mud-button-root.mud-icon-button{color:var(--mud-palette-warning)}.mud-treeview.mud-treeview-checked-error .mud-treeview-item-checkbox .mud-button-root.mud-icon-button{color:var(--mud-palette-error)}.mud-treeview.mud-treeview-checked-dark .mud-treeview-item-checkbox .mud-button-root.mud-icon-button{color:var(--mud-palette-dark)}.mud-treeview-group{margin:0px;padding:0px;margin-left:17px;margin-inline-start:17px;margin-inline-end:unset;list-style:none}.mud-treeview-item{margin:0;outline:0;padding:0;cursor:default;list-style:none;min-height:2rem;align-items:center;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mud-treeview-item .mud-treeview-item-arrow .mud-icon-button,.mud-treeview-item .mud-treeview-item-checkbox .mud-icon-button{padding:4px}.mud-treeview-item.mud-treeview-item-disabled{color:var(--mud-palette-action-disabled) !important;cursor:default !important;pointer-events:none !important}.mud-treeview-item-content{width:100%;display:flex;padding:4px 8px;align-items:center;transition:background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}@media(hover: hover)and (pointer: fine){.mud-treeview-hover .mud-treeview-item-content:hover{background-color:var(--mud-palette-action-default-hover)}}.mud-treeview-item-arrow{width:2rem;display:flex;flex-shrink:0;margin:0 4px;min-height:32px;justify-content:center}.mud-treeview-item-arrow .mud-treeview-item-arrow-expand{transition:.3s cubic-bezier(0.25, 0.8, 0.5, 1),visibility 0s}.mud-treeview-item-arrow .mud-treeview-item-arrow-expand.mud-transform{transform:rotate(90deg)}.mud-treeview-item-arrow .mud-treeview-item-arrow-load{animation:rotation 1s infinite linear}.mud-treeview-item-icon{width:32px;display:flex;flex-shrink:0;margin-right:4px;margin-inline-end:4px;margin-inline-start:unset;justify-content:center}.mud-treeview-item-label{flex-grow:1;padding-left:4px;padding-right:4px}.mud-treeview-dense .mud-treeview-item{min-height:unset}.mud-treeview-dense .mud-treeview-item-content{padding:1px 4px}.mud-treeview-dense .mud-treeview-item-arrow{min-height:unset}.mud-treeview-dense .mud-icon-button{padding:0}.mud-treeview-select-none{user-select:none}@keyframes rotation{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}.mud-application-layout-rtl .mud-treeview-item-arrow{transform:scaleX(-1)}.mud-data-grid th{position:relative}.mud-data-grid .drop-allowed{color:var(--mud-palette-success)}.mud-data-grid .drop-not-allowed{color:var(--mud-palette-error)}.mud-data-grid .drag-icon-options{transition:opacity 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,transform 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;opacity:0;cursor:grab}.mud-data-grid .mud-table-cell.edit-mode-cell .mud-input-control{margin:0 !important}.mud-data-grid .mud-table-cell.edit-mode-cell .mud-input{font-size:inherit}.mud-data-grid .mud-table-cell.edit-mode-cell .mud-input:before{content:none}.mud-data-grid .mud-table-cell.edit-mode-cell .mud-inputafter{content:none}.mud-data-grid .mud-table-cell.edit-mode-cell .mud-input .mud-input-outlined-border{border:none}.mud-data-grid .mud-table-cell.filter-header-cell{padding:6px 24px 6px 16px;padding-inline-start:16px;padding-inline-end:24px}.mud-data-grid .mud-table-cell.sticky-left{left:0px;position:sticky;background-color:var(--mud-palette-background-gray);z-index:1}.mud-data-grid .mud-table-cell.sticky-right{right:0px;position:sticky;background-color:var(--mud-palette-background-gray);z-index:1}.mud-data-grid .mud-table-cell .mud-input-text{margin-top:0 !important}.mud-data-grid .mud-table-cell .column-header{display:flex;align-items:center;justify-content:space-between}.mud-data-grid .mud-table-cell .column-header .sortable-column-header{width:100%}@media(hover: hover)and (pointer: fine){.mud-data-grid .mud-table-cell .column-header:hover .column-options .sort-direction-icon,.mud-data-grid .mud-table-cell .column-header:hover .column-options .column-options-icon,.mud-data-grid .mud-table-cell .column-header:hover .column-options .drag-icon-options{opacity:.8;color:var(--mud-palette-action-default)}.mud-data-grid .mud-table-cell .column-header:hover .column-options .mud-menu .mud-icon-button-label{opacity:1;color:var(--mud-palette-action-default)}}.mud-data-grid .mud-table-cell .column-header .column-options{display:inline-flex;align-items:center;flex-direction:inherit;justify-content:flex-start}.mud-data-grid .mud-table-cell .column-header .sort-direction-icon{font-size:18px;margin-left:4px;margin-left:4px;margin-inline-start:4px;margin-inline-end:unset;user-select:none;transition:opacity 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,transform 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;opacity:0}.mud-data-grid .mud-table-cell .column-header .sort-direction-icon.mud-direction-desc{opacity:1;transform:rotate(180deg)}.mud-data-grid .mud-table-cell .column-header .sort-direction-icon.mud-direction-asc{opacity:1;transform:rotate(0deg)}.mud-data-grid .mud-table-cell .column-header .mud-sort-index{transform:scale(0.9) translate(-2px, -2px)}.mud-data-grid .mud-table-cell .column-header .column-options .mud-menu .mud-icon-button-label{user-select:none;transition:opacity 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,transform 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;opacity:0}.mud-data-grid .mud-table-cell .mud-resizer{position:absolute;top:0;right:0;width:8px;cursor:col-resize;user-select:none}.mud-application-layout-rtl .mud-data-grid .mud-table-cell .mud-resizer{right:auto;left:0}@media(hover: hover)and (pointer: fine){.mud-data-grid .mud-table-cell .mud-resizer:hover{border-right:2px solid var(--mud-palette-primary)}}.mud-data-grid .mud-table-cell .mud-resizing{border-right:2px solid var(--mud-palette-primary)}@media(hover: hover)and (pointer: fine){.mud-data-grid-columns-panel:hover .column-options .sort-direction-icon,.mud-data-grid-columns-panel:hover .column-options .column-options-icon,.mud-data-grid-columns-panel:hover .column-options .drag-icon-options{opacity:.8;color:var(--mud-palette-action-default)}.mud-data-grid-columns-panel:hover .column-options .mud-menu .mud-icon-button-label{opacity:1;color:var(--mud-palette-action-default)}}.mud-data-grid-columns-panel .sort-direction-icon{font-size:18px;margin-left:4px;margin-left:4px;margin-inline-start:4px;margin-inline-end:unset;user-select:none;transition:opacity 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,transform 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-data-grid-columns-panel .sort-direction-icon.mud-direction-desc{opacity:1;transform:rotate(180deg)}.mud-data-grid-columns-panel .sort-direction-icon.mud-direction-asc{opacity:1;transform:rotate(0deg)}.mud-data-grid-columns-panel .mud-sort-index{transform:scale(0.9) translate(-2px, -2px)}.mud-data-grid-columns-panel .drag-icon-options{transition:opacity 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,transform 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;opacity:1;cursor:grab}.mud-data-grid-columns-panel .mud-drop-item-preview-start{z-index:0}.mud-toggle-group{display:grid;overflow:hidden;box-sizing:border-box;border-width:0}.mud-toggle-group>.mud-toggle-item{box-shadow:none;border-width:inherit;border-style:none;border-color:inherit;border-radius:0}.mud-toggle-group-horizontal:not(.mud-toggle-group-rtl)>.mud-toggle-item:not(:first-child),.mud-toggle-group-horizontal:not(.mud-toggle-group-rtl)>:not(:first-child) .mud-toggle-item{margin-left:-1px}.mud-toggle-group-horizontal:not(.mud-toggle-group-rtl)>.mud-toggle-item:not(:first-child).mud-toggle-item-delimiter,.mud-toggle-group-horizontal:not(.mud-toggle-group-rtl)>:not(:first-child) .mud-toggle-item.mud-toggle-item-delimiter{border-left-style:solid !important}.mud-toggle-group-horizontal.mud-toggle-group-rtl>.mud-toggle-item:not(:last-child),.mud-toggle-group-horizontal.mud-toggle-group-rtl>:not(:last-child) .mud-toggle-item{margin-left:-1px}.mud-toggle-group-horizontal.mud-toggle-group-rtl>.mud-toggle-item:not(:last-child).mud-toggle-item-delimiter,.mud-toggle-group-horizontal.mud-toggle-group-rtl>:not(:last-child) .mud-toggle-item.mud-toggle-item-delimiter{border-left-style:solid !important}.mud-toggle-group-vertical>.mud-toggle-item:not(:first-child),.mud-toggle-group-vertical>:not(:first-child) .mud-toggle-item{margin-top:-1px}.mud-toggle-group-vertical>.mud-toggle-item:not(:first-child).mud-toggle-item-delimiter,.mud-toggle-group-vertical>:not(:first-child) .mud-toggle-item.mud-toggle-item-delimiter{border-top-style:solid !important}.mud-toggle-item{padding:6px;min-width:auto;border-style:none !important}.mud-toggle-item>.mud-button-label{min-height:20px}.mud-toggle-item-size-small{padding:4px}.mud-toggle-item-size-large{padding:8px}.mud-toggle-item-fixed>.mud-button-label:has(>.mud-toggle-item-check-icon){display:grid;grid-template-columns:1fr auto 1fr}.mud-toggle-item-check-icon{justify-self:end}.mud-toggle-item-content{display:contents}.mud-stepper .mud-stepper-nav .mud-step{padding:24px;position:relative;cursor:default}.mud-stepper .mud-stepper-nav .mud-step.mud-ripple{transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;cursor:pointer;user-select:none}.mud-stepper .mud-stepper-nav .mud-step.mud-ripple:hover{background-color:var(--mud-palette-action-default-hover)}.mud-stepper .mud-stepper-nav .mud-step.mud-step-disabled .mud-step-label-icon{background-color:var(--mud-palette-lines-default) !important;color:var(--mud-palette-text-disabled) !important}.mud-stepper .mud-stepper-nav .mud-step.mud-step-disabled .mud-step-label-content{color:var(--mud-palette-text-disabled) !important}.mud-stepper .mud-stepper-nav .mud-step .mud-step-label{display:flex;align-items:center;flex-direction:row;height:100%;gap:8px}.mud-stepper .mud-stepper-nav .mud-step .mud-step-label .mud-step-label-icon{display:flex;flex-shrink:0;color:var(--mud-palette-white);border-radius:50%;background-color:var(--mud-palette-text-disabled);height:24px;width:24px;align-items:center;justify-content:center;font-size:12px;letter-spacing:0;text-indent:0;white-space:nowrap}.mud-stepper .mud-stepper-nav .mud-step .mud-step-label .mud-step-label-icon .mud-typography{line-height:1}.mud-stepper .mud-stepper-nav .mud-step .mud-step-label .mud-step-label-content{width:100%;color:var(--mud-palette-text-secondary);text-align:start}.mud-stepper .mud-stepper-nav .mud-step .mud-step-label .mud-step-label-content-title{line-height:var(--mud-typography-body2-lineheight)}.mud-stepper .mud-stepper-nav .mud-step.active .mud-step-label-content{color:var(--mud-palette-text-primary)}.mud-stepper .mud-stepper-nav.mud-stepper-nav-scrollable{overflow:auto}.mud-stepper .mud-stepper-nav.mud-stepper-nav-scrollable .mud-step{min-width:fit-content}.mud-stepper .mud-stepper-nav.mud-stepper-nav-scrollable .mud-stepper-nav-connector{min-width:32px}.mud-stepper .mud-stepper-content{padding:0 24px}.mud-stepper .mud-stepper-nav-connector{flex:1 1 auto}.mud-stepper .mud-stepper-nav-connector .mud-stepper-nav-connector-line{display:block;border-color:var(--mud-palette-lines-inputs)}.mud-stepper.mud-stepper__horizontal .mud-stepper-nav{display:flex}.mud-stepper.mud-stepper__horizontal.mud-stepper__center-labels .mud-step{flex-basis:175px}.mud-stepper.mud-stepper__horizontal.mud-stepper__center-labels .mud-step-label{flex-direction:column;justify-content:flex-start;align-items:center}.mud-stepper.mud-stepper__horizontal.mud-stepper__center-labels .mud-step-label .mud-step-label-icon{margin-inline-end:0px !important}.mud-stepper.mud-stepper__horizontal.mud-stepper__center-labels .mud-step-label .mud-step-label-content{margin-top:12px;text-align:center}.mud-stepper.mud-stepper__horizontal.mud-stepper__center-labels .mud-stepper-nav-connector{margin:35px -67px 0;align-self:flex-start}.mud-stepper.mud-stepper__horizontal .mud-stepper-nav-connector{align-self:center;margin:0 -16px}.mud-stepper.mud-stepper__horizontal .mud-stepper-nav-connector .mud-stepper-nav-connector-line{border-top-style:solid;border-top-width:1px}.mud-stepper.mud-stepper__vertical .mud-stepper-nav{padding:8px 0px}.mud-stepper.mud-stepper__vertical .mud-step{padding:0 16px}.mud-stepper.mud-stepper__vertical .mud-step .mud-step-label{padding:8px 0px}.mud-stepper.mud-stepper__vertical .mud-stepper-nav-connector{margin-inline-start:28px;margin-inline-end:0}.mud-stepper.mud-stepper__vertical .mud-stepper-nav-connector .mud-stepper-nav-connector-line{border-inline-start:1px solid #bdbdbd;min-height:24px}.mud-stepper.mud-stepper__vertical .mud-stepper-content{margin-inline-start:28px;margin-inline-end:0;padding-inline-start:20px;padding-inline-end:0;border-inline-start:1px solid var(--mud-palette-lines-inputs)}.mud-stepper-step-button{display:inline-flex;-moz-box-align:center;align-items:center;-moz-box-pack:center;justify-content:center;position:relative;background-color:rgba(0,0,0,0);outline:0px;border:0px;border-radius:0px;cursor:pointer;user-select:none;vertical-align:middle;appearance:none;text-decoration:none;color:inherit;width:100%;padding:24px 16px;margin:-24px -16px;box-sizing:content-box}.rounded-0{border-radius:0 !important}.rounded-t-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-r-0,.rounded-e-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-b-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-l-0,.rounded-s-0{border-top-left-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-tl-0,.rounded-ts-0{border-top-left-radius:0 !important}.rounded-tr-0,.rounded-te-0{border-top-right-radius:0 !important}.rounded-br-0,.rounded-be-0{border-bottom-right-radius:0 !important}.rounded-bl-0,.rounded-bs-0{border-bottom-left-radius:0 !important}.mud-application-layout-rtl .rounded-s-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important;border-top-left-radius:0 !important;border-bottom-left-radius:0 !important}.mud-application-layout-rtl .rounded-e-0{border-top-left-radius:0 !important;border-bottom-left-radius:0 !important;border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.mud-application-layout-rtl .rounded-ts-0{border-top-right-radius:0 !important;border-top-left-radius:0 !important}.mud-application-layout-rtl .rounded-te-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.mud-application-layout-rtl .rounded-bs-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.mud-application-layout-rtl .rounded-be-0{border-bottom-left-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-sm{border-radius:2px !important}.rounded-t-sm{border-top-left-radius:2px !important;border-top-right-radius:2px !important}.rounded-r-sm,.rounded-e-sm{border-top-right-radius:2px !important;border-bottom-right-radius:2px !important}.rounded-b-sm{border-bottom-right-radius:2px !important;border-bottom-left-radius:2px !important}.rounded-l-sm,.rounded-s-sm{border-top-left-radius:2px !important;border-bottom-left-radius:2px !important}.rounded-tl-sm,.rounded-ts-sm{border-top-left-radius:2px !important}.rounded-tr-sm,.rounded-te-sm{border-top-right-radius:2px !important}.rounded-br-sm,.rounded-be-sm{border-bottom-right-radius:2px !important}.rounded-bl-sm,.rounded-bs-sm{border-bottom-left-radius:2px !important}.mud-application-layout-rtl .rounded-s-sm{border-top-right-radius:2px !important;border-bottom-right-radius:2px !important;border-top-left-radius:0 !important;border-bottom-left-radius:0 !important}.mud-application-layout-rtl .rounded-e-sm{border-top-left-radius:2px !important;border-bottom-left-radius:2px !important;border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.mud-application-layout-rtl .rounded-ts-sm{border-top-right-radius:2px !important;border-top-left-radius:0 !important}.mud-application-layout-rtl .rounded-te-sm{border-top-left-radius:2px !important;border-top-right-radius:0 !important}.mud-application-layout-rtl .rounded-bs-sm{border-bottom-right-radius:2px !important;border-bottom-left-radius:0 !important}.mud-application-layout-rtl .rounded-be-sm{border-bottom-left-radius:2px !important;border-bottom-right-radius:0 !important}.rounded-lg{border-radius:8px !important}.rounded-t-lg{border-top-left-radius:8px !important;border-top-right-radius:8px !important}.rounded-r-lg,.rounded-e-lg{border-top-right-radius:8px !important;border-bottom-right-radius:8px !important}.rounded-b-lg{border-bottom-right-radius:8px !important;border-bottom-left-radius:8px !important}.rounded-l-lg,.rounded-s-lg{border-top-left-radius:8px !important;border-bottom-left-radius:8px !important}.rounded-tl-lg,.rounded-ts-lg{border-top-left-radius:8px !important}.rounded-tr-lg,.rounded-te-lg{border-top-right-radius:8px !important}.rounded-br-lg,.rounded-be-lg{border-bottom-right-radius:8px !important}.rounded-bl-lg,.rounded-bs-lg{border-bottom-left-radius:8px !important}.mud-application-layout-rtl .rounded-s-lg{border-top-right-radius:8px !important;border-bottom-right-radius:8px !important;border-top-left-radius:0 !important;border-bottom-left-radius:0 !important}.mud-application-layout-rtl .rounded-e-lg{border-top-left-radius:8px !important;border-bottom-left-radius:8px !important;border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.mud-application-layout-rtl .rounded-ts-lg{border-top-right-radius:8px !important;border-top-left-radius:0 !important}.mud-application-layout-rtl .rounded-te-lg{border-top-left-radius:8px !important;border-top-right-radius:0 !important}.mud-application-layout-rtl .rounded-bs-lg{border-bottom-right-radius:8px !important;border-bottom-left-radius:0 !important}.mud-application-layout-rtl .rounded-be-lg{border-bottom-left-radius:8px !important;border-bottom-right-radius:0 !important}.rounded-xl{border-radius:24px !important}.rounded-t-xl{border-top-left-radius:24px !important;border-top-right-radius:24px !important}.rounded-r-xl,.rounded-e-xl{border-top-right-radius:24px !important;border-bottom-right-radius:24px !important}.rounded-b-xl{border-bottom-right-radius:24px !important;border-bottom-left-radius:24px !important}.rounded-l-xl,.rounded-s-xl{border-top-left-radius:24px !important;border-bottom-left-radius:24px !important}.rounded-tl-xl,.rounded-ts-xl{border-top-left-radius:24px !important}.rounded-tr-xl,.rounded-te-xl{border-top-right-radius:24px !important}.rounded-br-xl,.rounded-be-xl{border-bottom-right-radius:24px !important}.rounded-bl-xl,.rounded-bs-xl{border-bottom-left-radius:24px !important}.mud-application-layout-rtl .rounded-s-xl{border-top-right-radius:24px !important;border-bottom-right-radius:24px !important;border-top-left-radius:0 !important;border-bottom-left-radius:0 !important}.mud-application-layout-rtl .rounded-e-xl{border-top-left-radius:24px !important;border-bottom-left-radius:24px !important;border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.mud-application-layout-rtl .rounded-ts-xl{border-top-right-radius:24px !important;border-top-left-radius:0 !important}.mud-application-layout-rtl .rounded-te-xl{border-top-left-radius:24px !important;border-top-right-radius:0 !important}.mud-application-layout-rtl .rounded-bs-xl{border-bottom-right-radius:24px !important;border-bottom-left-radius:0 !important}.mud-application-layout-rtl .rounded-be-xl{border-bottom-left-radius:24px !important;border-bottom-right-radius:0 !important}.rounded{border-radius:var(--mud-default-borderradius) !important}.rounded-t{border-top-left-radius:var(--mud-default-borderradius) !important;border-top-right-radius:var(--mud-default-borderradius) !important}.rounded-r,.rounded-e{border-top-right-radius:var(--mud-default-borderradius) !important;border-bottom-right-radius:var(--mud-default-borderradius) !important}.rounded-b{border-bottom-right-radius:var(--mud-default-borderradius) !important;border-bottom-left-radius:var(--mud-default-borderradius) !important}.rounded-l,.rounded-s{border-top-left-radius:var(--mud-default-borderradius) !important;border-bottom-left-radius:var(--mud-default-borderradius) !important}.rounded-tl,.rounded-ts{border-top-left-radius:var(--mud-default-borderradius) !important}.rounded-tr,.rounded-te{border-top-right-radius:var(--mud-default-borderradius) !important}.rounded-br,.rounded-be{border-bottom-right-radius:var(--mud-default-borderradius) !important}.rounded-bl,.rounded-bs{border-bottom-left-radius:var(--mud-default-borderradius) !important}.mud-application-layout-rtl .rounded-s{border-top-right-radius:var(--mud-default-borderradius) !important;border-bottom-right-radius:var(--mud-default-borderradius) !important;border-top-left-radius:0 !important;border-bottom-left-radius:0 !important}.mud-application-layout-rtl .rounded-e{border-top-left-radius:var(--mud-default-borderradius) !important;border-bottom-left-radius:var(--mud-default-borderradius) !important;border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.mud-application-layout-rtl .rounded-ts{border-top-right-radius:var(--mud-default-borderradius) !important;border-top-left-radius:0 !important}.mud-application-layout-rtl .rounded-te{border-top-left-radius:var(--mud-default-borderradius) !important;border-top-right-radius:0 !important}.mud-application-layout-rtl .rounded-bs{border-bottom-right-radius:var(--mud-default-borderradius) !important;border-bottom-left-radius:0 !important}.mud-application-layout-rtl .rounded-be{border-bottom-left-radius:var(--mud-default-borderradius) !important;border-bottom-right-radius:0 !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:9999px !important}.border-solid{border-style:solid !important}.border-dashed{border-style:dashed !important}.border-dotted{border-style:dotted !important}.border-double{border-style:double !important}.border-hidden{border-style:hidden !important}.border-none{border-style:none !important}.border-0{border-width:0px !important}.border-t-0{border-top-width:0px !important}.border-r-0{border-right-width:0px !important}.border-b-0{border-bottom-width:0px !important}.border-l-0{border-left-width:0px !important}.border-x-0{border-left-width:0px !important;border-right-width:0px !important}.border-y-0{border-top-width:0px !important;border-bottom-width:0px !important}.border{border-width:1px !important}.border-t{border-top-width:1px !important}.border-r{border-right-width:1px !important}.border-b{border-bottom-width:1px !important}.border-l{border-left-width:1px !important}.border-x{border-left-width:1px !important;border-right-width:1px !important}.border-y{border-top-width:1px !important;border-bottom-width:1px !important}.border-2{border-width:2px !important}.border-t-2{border-top-width:2px !important}.border-r-2{border-right-width:2px !important}.border-b-2{border-bottom-width:2px !important}.border-l-2{border-left-width:2px !important}.border-x-2{border-left-width:2px !important;border-right-width:2px !important}.border-y-2{border-top-width:2px !important;border-bottom-width:2px !important}.border-4{border-width:4px !important}.border-t-4{border-top-width:4px !important}.border-r-4{border-right-width:4px !important}.border-b-4{border-bottom-width:4px !important}.border-l-4{border-left-width:4px !important}.border-x-4{border-left-width:4px !important;border-right-width:4px !important}.border-y-4{border-top-width:4px !important;border-bottom-width:4px !important}.border-8{border-width:8px !important}.border-t-8{border-top-width:8px !important}.border-r-8{border-right-width:8px !important}.border-b-8{border-bottom-width:8px !important}.border-l-8{border-left-width:8px !important}.border-x-8{border-left-width:8px !important;border-right-width:8px !important}.border-y-8{border-top-width:8px !important;border-bottom-width:8px !important}.outline-none{outline-style:none}.outline-solid{outline-style:solid}.outline-dashed{outline-style:dashed}.outline-dotted{outline-style:dotted}.outline-double{outline-style:double}.outline-hidden{outline-style:hidden}.flex-1{flex:1 1 0% !important}.flex-auto{flex:1 1 auto !important}.flex-initial{flex:0 1 auto !important}.flex-none{flex:none !important}.flex-row{flex-direction:row !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column{flex-direction:column !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-grow-start>*:first-child{flex-grow:1 !important}.flex-grow-end>*:last-child{flex-grow:1 !important}.flex-grow-start-and-end>:first-child,.flex-grow-start-and-end>:last-child{flex-grow:1 !important}.flex-grow-middle>*:not(:first-child):not(:last-child){flex-grow:1 !important}.flex-grow-all>*{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-start{justify-content:flex-start !important}.justify-end{justify-content:flex-end !important}.justify-center{justify-content:center !important}.justify-space-between{justify-content:space-between !important}.justify-space-around{justify-content:space-around !important}.justify-space-evenly{justify-content:space-evenly !important}.order-first{order:-9999 !important}.order-last{order:9999 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-6{order:6 !important}.order-7{order:7 !important}.order-8{order:8 !important}.order-9{order:9 !important}.order-10{order:10 !important}.order-11{order:11 !important}.order-12{order:12 !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-space-between{align-content:space-between !important}.align-content-space-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-start{align-items:flex-start !important}.align-end{align-items:flex-end !important}.align-center{align-items:center !important}.align-baseline{align-items:baseline !important}.align-stretch{align-items:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-stretch{align-self:stretch !important}.gap-0{gap:0px}.gap-x-0{column-gap:0px}.gap-y-0{row-gap:0px}.gap-1{gap:4px}.gap-x-1{column-gap:4px}.gap-y-1{row-gap:4px}.gap-2{gap:8px}.gap-x-2{column-gap:8px}.gap-y-2{row-gap:8px}.gap-3{gap:12px}.gap-x-3{column-gap:12px}.gap-y-3{row-gap:12px}.gap-4{gap:16px}.gap-x-4{column-gap:16px}.gap-y-4{row-gap:16px}.gap-5{gap:20px}.gap-x-5{column-gap:20px}.gap-y-5{row-gap:20px}.gap-6{gap:24px}.gap-x-6{column-gap:24px}.gap-y-6{row-gap:24px}.gap-7{gap:28px}.gap-x-7{column-gap:28px}.gap-y-7{row-gap:28px}.gap-8{gap:32px}.gap-x-8{column-gap:32px}.gap-y-8{row-gap:32px}.gap-9{gap:36px}.gap-x-9{column-gap:36px}.gap-y-9{row-gap:36px}.gap-10{gap:40px}.gap-x-10{column-gap:40px}.gap-y-10{row-gap:40px}.gap-11{gap:44px}.gap-x-11{column-gap:44px}.gap-y-11{row-gap:44px}.gap-12{gap:48px}.gap-x-12{column-gap:48px}.gap-y-12{row-gap:48px}.gap-13{gap:52px}.gap-x-13{column-gap:52px}.gap-y-13{row-gap:52px}.gap-14{gap:56px}.gap-x-14{column-gap:56px}.gap-y-14{row-gap:56px}.gap-15{gap:60px}.gap-x-15{column-gap:60px}.gap-y-15{row-gap:60px}.gap-16{gap:64px}.gap-x-16{column-gap:64px}.gap-y-16{row-gap:64px}.gap-17{gap:68px}.gap-x-17{column-gap:68px}.gap-y-17{row-gap:68px}.gap-18{gap:72px}.gap-x-18{column-gap:72px}.gap-y-18{row-gap:72px}.gap-19{gap:76px}.gap-x-19{column-gap:76px}.gap-y-19{row-gap:76px}.gap-20{gap:80px}.gap-x-20{column-gap:80px}.gap-y-20{row-gap:80px}@media(min-width: 600px){.flex-sm-1{flex:1 1 0% !important}.flex-sm-auto{flex:1 1 auto !important}.flex-sm-initial{flex:0 1 auto !important}.flex-sm-none{flex:none !important}.flex-sm-row{flex-direction:row !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column{flex-direction:column !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-grow-start>*:first-child{flex-grow:1 !important}.flex-sm-grow-end>*:last-child{flex-grow:1 !important}.flex-sm-grow-start-and-end>:first-child,.flex-sm-grow-start-and-end>:last-child{flex-grow:1 !important}.flex-sm-grow-middle>*:not(:first-child):not(:last-child){flex-grow:1 !important}.flex-sm-grow-all>*{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-sm-start{justify-content:flex-start !important}.justify-sm-end{justify-content:flex-end !important}.justify-sm-center{justify-content:center !important}.justify-sm-space-between{justify-content:space-between !important}.justify-sm-space-around{justify-content:space-around !important}.justify-sm-space-evenly{justify-content:space-evenly !important}.order-sm-first{order:-9999 !important}.order-sm-last{order:9999 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-6{order:6 !important}.order-sm-7{order:7 !important}.order-sm-8{order:8 !important}.order-sm-9{order:9 !important}.order-sm-10{order:10 !important}.order-sm-11{order:11 !important}.order-sm-12{order:12 !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-space-between{align-content:space-between !important}.align-content-sm-space-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-sm-start{align-items:flex-start !important}.align-sm-end{align-items:flex-end !important}.align-sm-center{align-items:center !important}.align-sm-baseline{align-items:baseline !important}.align-sm-stretch{align-items:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-stretch{align-self:stretch !important}.gap-sm-0{gap:0px}.gap-x-sm-0{column-gap:0px}.gap-y-sm-0{row-gap:0px}.gap-sm-1{gap:4px}.gap-x-sm-1{column-gap:4px}.gap-y-sm-1{row-gap:4px}.gap-sm-2{gap:8px}.gap-x-sm-2{column-gap:8px}.gap-y-sm-2{row-gap:8px}.gap-sm-3{gap:12px}.gap-x-sm-3{column-gap:12px}.gap-y-sm-3{row-gap:12px}.gap-sm-4{gap:16px}.gap-x-sm-4{column-gap:16px}.gap-y-sm-4{row-gap:16px}.gap-sm-5{gap:20px}.gap-x-sm-5{column-gap:20px}.gap-y-sm-5{row-gap:20px}.gap-sm-6{gap:24px}.gap-x-sm-6{column-gap:24px}.gap-y-sm-6{row-gap:24px}.gap-sm-7{gap:28px}.gap-x-sm-7{column-gap:28px}.gap-y-sm-7{row-gap:28px}.gap-sm-8{gap:32px}.gap-x-sm-8{column-gap:32px}.gap-y-sm-8{row-gap:32px}.gap-sm-9{gap:36px}.gap-x-sm-9{column-gap:36px}.gap-y-sm-9{row-gap:36px}.gap-sm-10{gap:40px}.gap-x-sm-10{column-gap:40px}.gap-y-sm-10{row-gap:40px}.gap-sm-11{gap:44px}.gap-x-sm-11{column-gap:44px}.gap-y-sm-11{row-gap:44px}.gap-sm-12{gap:48px}.gap-x-sm-12{column-gap:48px}.gap-y-sm-12{row-gap:48px}.gap-sm-13{gap:52px}.gap-x-sm-13{column-gap:52px}.gap-y-sm-13{row-gap:52px}.gap-sm-14{gap:56px}.gap-x-sm-14{column-gap:56px}.gap-y-sm-14{row-gap:56px}.gap-sm-15{gap:60px}.gap-x-sm-15{column-gap:60px}.gap-y-sm-15{row-gap:60px}.gap-sm-16{gap:64px}.gap-x-sm-16{column-gap:64px}.gap-y-sm-16{row-gap:64px}.gap-sm-17{gap:68px}.gap-x-sm-17{column-gap:68px}.gap-y-sm-17{row-gap:68px}.gap-sm-18{gap:72px}.gap-x-sm-18{column-gap:72px}.gap-y-sm-18{row-gap:72px}.gap-sm-19{gap:76px}.gap-x-sm-19{column-gap:76px}.gap-y-sm-19{row-gap:76px}.gap-sm-20{gap:80px}.gap-x-sm-20{column-gap:80px}.gap-y-sm-20{row-gap:80px}}@media(min-width: 960px){.flex-md-1{flex:1 1 0% !important}.flex-md-auto{flex:1 1 auto !important}.flex-md-initial{flex:0 1 auto !important}.flex-md-none{flex:none !important}.flex-md-row{flex-direction:row !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column{flex-direction:column !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-grow-start>*:first-child{flex-grow:1 !important}.flex-md-grow-end>*:last-child{flex-grow:1 !important}.flex-md-grow-start-and-end>:first-child,.flex-md-grow-start-and-end>:last-child{flex-grow:1 !important}.flex-md-grow-middle>*:not(:first-child):not(:last-child){flex-grow:1 !important}.flex-md-grow-all>*{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-md-start{justify-content:flex-start !important}.justify-md-end{justify-content:flex-end !important}.justify-md-center{justify-content:center !important}.justify-md-space-between{justify-content:space-between !important}.justify-md-space-around{justify-content:space-around !important}.justify-md-space-evenly{justify-content:space-evenly !important}.order-md-first{order:-9999 !important}.order-md-last{order:9999 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-6{order:6 !important}.order-md-7{order:7 !important}.order-md-8{order:8 !important}.order-md-9{order:9 !important}.order-md-10{order:10 !important}.order-md-11{order:11 !important}.order-md-12{order:12 !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-space-between{align-content:space-between !important}.align-content-md-space-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-md-start{align-items:flex-start !important}.align-md-end{align-items:flex-end !important}.align-md-center{align-items:center !important}.align-md-baseline{align-items:baseline !important}.align-md-stretch{align-items:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-stretch{align-self:stretch !important}.gap-md-0{gap:0px}.gap-x-md-0{column-gap:0px}.gap-y-md-0{row-gap:0px}.gap-md-1{gap:4px}.gap-x-md-1{column-gap:4px}.gap-y-md-1{row-gap:4px}.gap-md-2{gap:8px}.gap-x-md-2{column-gap:8px}.gap-y-md-2{row-gap:8px}.gap-md-3{gap:12px}.gap-x-md-3{column-gap:12px}.gap-y-md-3{row-gap:12px}.gap-md-4{gap:16px}.gap-x-md-4{column-gap:16px}.gap-y-md-4{row-gap:16px}.gap-md-5{gap:20px}.gap-x-md-5{column-gap:20px}.gap-y-md-5{row-gap:20px}.gap-md-6{gap:24px}.gap-x-md-6{column-gap:24px}.gap-y-md-6{row-gap:24px}.gap-md-7{gap:28px}.gap-x-md-7{column-gap:28px}.gap-y-md-7{row-gap:28px}.gap-md-8{gap:32px}.gap-x-md-8{column-gap:32px}.gap-y-md-8{row-gap:32px}.gap-md-9{gap:36px}.gap-x-md-9{column-gap:36px}.gap-y-md-9{row-gap:36px}.gap-md-10{gap:40px}.gap-x-md-10{column-gap:40px}.gap-y-md-10{row-gap:40px}.gap-md-11{gap:44px}.gap-x-md-11{column-gap:44px}.gap-y-md-11{row-gap:44px}.gap-md-12{gap:48px}.gap-x-md-12{column-gap:48px}.gap-y-md-12{row-gap:48px}.gap-md-13{gap:52px}.gap-x-md-13{column-gap:52px}.gap-y-md-13{row-gap:52px}.gap-md-14{gap:56px}.gap-x-md-14{column-gap:56px}.gap-y-md-14{row-gap:56px}.gap-md-15{gap:60px}.gap-x-md-15{column-gap:60px}.gap-y-md-15{row-gap:60px}.gap-md-16{gap:64px}.gap-x-md-16{column-gap:64px}.gap-y-md-16{row-gap:64px}.gap-md-17{gap:68px}.gap-x-md-17{column-gap:68px}.gap-y-md-17{row-gap:68px}.gap-md-18{gap:72px}.gap-x-md-18{column-gap:72px}.gap-y-md-18{row-gap:72px}.gap-md-19{gap:76px}.gap-x-md-19{column-gap:76px}.gap-y-md-19{row-gap:76px}.gap-md-20{gap:80px}.gap-x-md-20{column-gap:80px}.gap-y-md-20{row-gap:80px}}@media(min-width: 1280px){.flex-lg-1{flex:1 1 0% !important}.flex-lg-auto{flex:1 1 auto !important}.flex-lg-initial{flex:0 1 auto !important}.flex-lg-none{flex:none !important}.flex-lg-row{flex-direction:row !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column{flex-direction:column !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-grow-start>*:first-child{flex-grow:1 !important}.flex-lg-grow-end>*:last-child{flex-grow:1 !important}.flex-lg-grow-start-and-end>:first-child,.flex-lg-grow-start-and-end>:last-child{flex-grow:1 !important}.flex-lg-grow-middle>*:not(:first-child):not(:last-child){flex-grow:1 !important}.flex-lg-grow-all>*{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-lg-start{justify-content:flex-start !important}.justify-lg-end{justify-content:flex-end !important}.justify-lg-center{justify-content:center !important}.justify-lg-space-between{justify-content:space-between !important}.justify-lg-space-around{justify-content:space-around !important}.justify-lg-space-evenly{justify-content:space-evenly !important}.order-lg-first{order:-9999 !important}.order-lg-last{order:9999 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-6{order:6 !important}.order-lg-7{order:7 !important}.order-lg-8{order:8 !important}.order-lg-9{order:9 !important}.order-lg-10{order:10 !important}.order-lg-11{order:11 !important}.order-lg-12{order:12 !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-space-between{align-content:space-between !important}.align-content-lg-space-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-lg-start{align-items:flex-start !important}.align-lg-end{align-items:flex-end !important}.align-lg-center{align-items:center !important}.align-lg-baseline{align-items:baseline !important}.align-lg-stretch{align-items:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-stretch{align-self:stretch !important}.gap-lg-0{gap:0px}.gap-x-lg-0{column-gap:0px}.gap-y-lg-0{row-gap:0px}.gap-lg-1{gap:4px}.gap-x-lg-1{column-gap:4px}.gap-y-lg-1{row-gap:4px}.gap-lg-2{gap:8px}.gap-x-lg-2{column-gap:8px}.gap-y-lg-2{row-gap:8px}.gap-lg-3{gap:12px}.gap-x-lg-3{column-gap:12px}.gap-y-lg-3{row-gap:12px}.gap-lg-4{gap:16px}.gap-x-lg-4{column-gap:16px}.gap-y-lg-4{row-gap:16px}.gap-lg-5{gap:20px}.gap-x-lg-5{column-gap:20px}.gap-y-lg-5{row-gap:20px}.gap-lg-6{gap:24px}.gap-x-lg-6{column-gap:24px}.gap-y-lg-6{row-gap:24px}.gap-lg-7{gap:28px}.gap-x-lg-7{column-gap:28px}.gap-y-lg-7{row-gap:28px}.gap-lg-8{gap:32px}.gap-x-lg-8{column-gap:32px}.gap-y-lg-8{row-gap:32px}.gap-lg-9{gap:36px}.gap-x-lg-9{column-gap:36px}.gap-y-lg-9{row-gap:36px}.gap-lg-10{gap:40px}.gap-x-lg-10{column-gap:40px}.gap-y-lg-10{row-gap:40px}.gap-lg-11{gap:44px}.gap-x-lg-11{column-gap:44px}.gap-y-lg-11{row-gap:44px}.gap-lg-12{gap:48px}.gap-x-lg-12{column-gap:48px}.gap-y-lg-12{row-gap:48px}.gap-lg-13{gap:52px}.gap-x-lg-13{column-gap:52px}.gap-y-lg-13{row-gap:52px}.gap-lg-14{gap:56px}.gap-x-lg-14{column-gap:56px}.gap-y-lg-14{row-gap:56px}.gap-lg-15{gap:60px}.gap-x-lg-15{column-gap:60px}.gap-y-lg-15{row-gap:60px}.gap-lg-16{gap:64px}.gap-x-lg-16{column-gap:64px}.gap-y-lg-16{row-gap:64px}.gap-lg-17{gap:68px}.gap-x-lg-17{column-gap:68px}.gap-y-lg-17{row-gap:68px}.gap-lg-18{gap:72px}.gap-x-lg-18{column-gap:72px}.gap-y-lg-18{row-gap:72px}.gap-lg-19{gap:76px}.gap-x-lg-19{column-gap:76px}.gap-y-lg-19{row-gap:76px}.gap-lg-20{gap:80px}.gap-x-lg-20{column-gap:80px}.gap-y-lg-20{row-gap:80px}}@media(min-width: 1920px){.flex-xl-1{flex:1 1 0% !important}.flex-xl-auto{flex:1 1 auto !important}.flex-xl-initial{flex:0 1 auto !important}.flex-xl-none{flex:none !important}.flex-xl-row{flex-direction:row !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column{flex-direction:column !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-grow-start>*:first-child{flex-grow:1 !important}.flex-xl-grow-end>*:last-child{flex-grow:1 !important}.flex-xl-grow-start-and-end>:first-child,.flex-xl-grow-start-and-end>:last-child{flex-grow:1 !important}.flex-xl-grow-middle>*:not(:first-child):not(:last-child){flex-grow:1 !important}.flex-xl-grow-all>*{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-xl-start{justify-content:flex-start !important}.justify-xl-end{justify-content:flex-end !important}.justify-xl-center{justify-content:center !important}.justify-xl-space-between{justify-content:space-between !important}.justify-xl-space-around{justify-content:space-around !important}.justify-xl-space-evenly{justify-content:space-evenly !important}.order-xl-first{order:-9999 !important}.order-xl-last{order:9999 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-6{order:6 !important}.order-xl-7{order:7 !important}.order-xl-8{order:8 !important}.order-xl-9{order:9 !important}.order-xl-10{order:10 !important}.order-xl-11{order:11 !important}.order-xl-12{order:12 !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-space-between{align-content:space-between !important}.align-content-xl-space-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-xl-start{align-items:flex-start !important}.align-xl-end{align-items:flex-end !important}.align-xl-center{align-items:center !important}.align-xl-baseline{align-items:baseline !important}.align-xl-stretch{align-items:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-stretch{align-self:stretch !important}.gap-xl-0{gap:0px}.gap-x-xl-0{column-gap:0px}.gap-y-xl-0{row-gap:0px}.gap-xl-1{gap:4px}.gap-x-xl-1{column-gap:4px}.gap-y-xl-1{row-gap:4px}.gap-xl-2{gap:8px}.gap-x-xl-2{column-gap:8px}.gap-y-xl-2{row-gap:8px}.gap-xl-3{gap:12px}.gap-x-xl-3{column-gap:12px}.gap-y-xl-3{row-gap:12px}.gap-xl-4{gap:16px}.gap-x-xl-4{column-gap:16px}.gap-y-xl-4{row-gap:16px}.gap-xl-5{gap:20px}.gap-x-xl-5{column-gap:20px}.gap-y-xl-5{row-gap:20px}.gap-xl-6{gap:24px}.gap-x-xl-6{column-gap:24px}.gap-y-xl-6{row-gap:24px}.gap-xl-7{gap:28px}.gap-x-xl-7{column-gap:28px}.gap-y-xl-7{row-gap:28px}.gap-xl-8{gap:32px}.gap-x-xl-8{column-gap:32px}.gap-y-xl-8{row-gap:32px}.gap-xl-9{gap:36px}.gap-x-xl-9{column-gap:36px}.gap-y-xl-9{row-gap:36px}.gap-xl-10{gap:40px}.gap-x-xl-10{column-gap:40px}.gap-y-xl-10{row-gap:40px}.gap-xl-11{gap:44px}.gap-x-xl-11{column-gap:44px}.gap-y-xl-11{row-gap:44px}.gap-xl-12{gap:48px}.gap-x-xl-12{column-gap:48px}.gap-y-xl-12{row-gap:48px}.gap-xl-13{gap:52px}.gap-x-xl-13{column-gap:52px}.gap-y-xl-13{row-gap:52px}.gap-xl-14{gap:56px}.gap-x-xl-14{column-gap:56px}.gap-y-xl-14{row-gap:56px}.gap-xl-15{gap:60px}.gap-x-xl-15{column-gap:60px}.gap-y-xl-15{row-gap:60px}.gap-xl-16{gap:64px}.gap-x-xl-16{column-gap:64px}.gap-y-xl-16{row-gap:64px}.gap-xl-17{gap:68px}.gap-x-xl-17{column-gap:68px}.gap-y-xl-17{row-gap:68px}.gap-xl-18{gap:72px}.gap-x-xl-18{column-gap:72px}.gap-y-xl-18{row-gap:72px}.gap-xl-19{gap:76px}.gap-x-xl-19{column-gap:76px}.gap-y-xl-19{row-gap:76px}.gap-xl-20{gap:80px}.gap-x-xl-20{column-gap:80px}.gap-y-xl-20{row-gap:80px}}@media(min-width: 2560px){.flex-xxl-1{flex:1 1 0% !important}.flex-xxl-auto{flex:1 1 auto !important}.flex-xxl-initial{flex:0 1 auto !important}.flex-xxl-none{flex:none !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-grow-start>*:first-child{flex-grow:1 !important}.flex-xxl-grow-end>*:last-child{flex-grow:1 !important}.flex-xxl-grow-start-and-end>:first-child,.flex-xxl-grow-start-and-end>:last-child{flex-grow:1 !important}.flex-xxl-grow-middle>*:not(:first-child):not(:last-child){flex-grow:1 !important}.flex-xxl-grow-all>*{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-xxl-start{justify-content:flex-start !important}.justify-xxl-end{justify-content:flex-end !important}.justify-xxl-center{justify-content:center !important}.justify-xxl-space-between{justify-content:space-between !important}.justify-xxl-space-around{justify-content:space-around !important}.justify-xxl-space-evenly{justify-content:space-evenly !important}.order-xxl-first{order:-9999 !important}.order-xxl-last{order:9999 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-6{order:6 !important}.order-xxl-7{order:7 !important}.order-xxl-8{order:8 !important}.order-xxl-9{order:9 !important}.order-xxl-10{order:10 !important}.order-xxl-11{order:11 !important}.order-xxl-12{order:12 !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-space-between{align-content:space-between !important}.align-content-xxl-space-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-xxl-start{align-items:flex-start !important}.align-xxl-end{align-items:flex-end !important}.align-xxl-center{align-items:center !important}.align-xxl-baseline{align-items:baseline !important}.align-xxl-stretch{align-items:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-stretch{align-self:stretch !important}.gap-xxl-0{gap:0px}.gap-x-xxl-0{column-gap:0px}.gap-y-xxl-0{row-gap:0px}.gap-xxl-1{gap:4px}.gap-x-xxl-1{column-gap:4px}.gap-y-xxl-1{row-gap:4px}.gap-xxl-2{gap:8px}.gap-x-xxl-2{column-gap:8px}.gap-y-xxl-2{row-gap:8px}.gap-xxl-3{gap:12px}.gap-x-xxl-3{column-gap:12px}.gap-y-xxl-3{row-gap:12px}.gap-xxl-4{gap:16px}.gap-x-xxl-4{column-gap:16px}.gap-y-xxl-4{row-gap:16px}.gap-xxl-5{gap:20px}.gap-x-xxl-5{column-gap:20px}.gap-y-xxl-5{row-gap:20px}.gap-xxl-6{gap:24px}.gap-x-xxl-6{column-gap:24px}.gap-y-xxl-6{row-gap:24px}.gap-xxl-7{gap:28px}.gap-x-xxl-7{column-gap:28px}.gap-y-xxl-7{row-gap:28px}.gap-xxl-8{gap:32px}.gap-x-xxl-8{column-gap:32px}.gap-y-xxl-8{row-gap:32px}.gap-xxl-9{gap:36px}.gap-x-xxl-9{column-gap:36px}.gap-y-xxl-9{row-gap:36px}.gap-xxl-10{gap:40px}.gap-x-xxl-10{column-gap:40px}.gap-y-xxl-10{row-gap:40px}.gap-xxl-11{gap:44px}.gap-x-xxl-11{column-gap:44px}.gap-y-xxl-11{row-gap:44px}.gap-xxl-12{gap:48px}.gap-x-xxl-12{column-gap:48px}.gap-y-xxl-12{row-gap:48px}.gap-xxl-13{gap:52px}.gap-x-xxl-13{column-gap:52px}.gap-y-xxl-13{row-gap:52px}.gap-xxl-14{gap:56px}.gap-x-xxl-14{column-gap:56px}.gap-y-xxl-14{row-gap:56px}.gap-xxl-15{gap:60px}.gap-x-xxl-15{column-gap:60px}.gap-y-xxl-15{row-gap:60px}.gap-xxl-16{gap:64px}.gap-x-xxl-16{column-gap:64px}.gap-y-xxl-16{row-gap:64px}.gap-xxl-17{gap:68px}.gap-x-xxl-17{column-gap:68px}.gap-y-xxl-17{row-gap:68px}.gap-xxl-18{gap:72px}.gap-x-xxl-18{column-gap:72px}.gap-y-xxl-18{row-gap:72px}.gap-xxl-19{gap:76px}.gap-x-xxl-19{column-gap:76px}.gap-y-xxl-19{row-gap:76px}.gap-xxl-20{gap:80px}.gap-x-xxl-20{column-gap:80px}.gap-y-xxl-20{row-gap:80px}}.cursor-auto{cursor:auto !important}.cursor-default{cursor:default !important}.cursor-pointer{cursor:pointer !important}.cursor-wait{cursor:wait !important}.cursor-text{cursor:text !important}.cursor-move{cursor:move !important}.cursor-help{cursor:help !important}.cursor-not-allowed{cursor:not-allowed !important}.cursor-none{cursor:none !important}.cursor-progress{cursor:progress !important}.cursor-cell{cursor:cell !important}.cursor-crosshair{cursor:crosshair !important}.cursor-vertical-text{cursor:vertical-text !important}.cursor-alias{cursor:alias !important}.cursor-copy{cursor:copy !important}.cursor-no-drop{cursor:no-drop !important}.cursor-grab{cursor:grab !important}.cursor-grabbing{cursor:grabbing !important}.cursor-all-scroll{cursor:all-scroll !important}.cursor-col-resize{cursor:col-resize !important}.cursor-row-resize{cursor:row-resize !important}.cursor-n-resize{cursor:n-resize !important}.cursor-w-resize{cursor:w-resize !important}.cursor-zoom-in{cursor:zoom-in !important}.cursor-zoom-out{cursor:zoom-out !important}.cursor-url{cursor:url !important}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.d-none{display:none !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}@media(min-width: 600px){.d-sm-none{display:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}}@media(min-width: 960px){.d-md-none{display:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}}@media(min-width: 1280px){.d-lg-none{display:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}}@media(min-width: 1920px){.d-xl-none{display:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}}@media(min-width: 2560px){.d-xxl-none{display:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}}.object-none{object-fit:none !important}.object-cover{object-fit:cover !important}.object-contain{object-fit:contain !important}.object-fill{object-fit:fill !important}.object-scale-down{object-fit:scale-down !important}.object-center{object-position:center !important}.object-top{object-position:top !important}.object-bottom{object-position:bottom !important}.object-left{object-position:left !important}.object-left-top{object-position:left top !important}.object-left-bottom{object-position:left bottom !important}.object-right{object-position:right !important}.object-right-top{object-position:right top !important}.object-right-bottom{object-position:right bottom !important}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-scroll{overflow:scroll}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-hidden{overflow-y:hidden}.overflow-x-visible{overflow-x:visible}.overflow-y-visible{overflow-y:visible}.overflow-x-scroll{overflow-x:scroll}.overflow-y-scroll{overflow-y:scroll}.absolute{position:absolute !important}.fixed{position:fixed !important}.relative{position:relative !important}.static{position:static !important}.sticky{position:sticky !important}.visible{visibility:visible}.invisible{visibility:hidden}[hidden]{display:none !important}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-60{z-index:60}.z-70{z-index:70}.z-80{z-index:80}.z-90{z-index:90}.z-100{z-index:100}.z-auto{z-index:auto}.mt-0,.my-0{margin-top:0 !important}.mr-0,.mx-0{margin-right:0 !important}.ml-0,.mx-0{margin-left:0 !important}.mb-0,.my-0{margin-bottom:0 !important}.ms-0{margin-inline-start:0 !important}.me-0{margin-inline-end:0 !important}.ma-0{margin:0 !important}.mt-1,.my-1{margin-top:4px !important}.mr-1,.mx-1{margin-right:4px !important}.ml-1,.mx-1{margin-left:4px !important}.mb-1,.my-1{margin-bottom:4px !important}.ms-1{margin-inline-start:4px !important}.me-1{margin-inline-end:4px !important}.ma-1{margin:4px !important}.mt-2,.my-2{margin-top:8px !important}.mr-2,.mx-2{margin-right:8px !important}.ml-2,.mx-2{margin-left:8px !important}.mb-2,.my-2{margin-bottom:8px !important}.ms-2{margin-inline-start:8px !important}.me-2{margin-inline-end:8px !important}.ma-2{margin:8px !important}.mt-3,.my-3{margin-top:12px !important}.mr-3,.mx-3{margin-right:12px !important}.ml-3,.mx-3{margin-left:12px !important}.mb-3,.my-3{margin-bottom:12px !important}.ms-3{margin-inline-start:12px !important}.me-3{margin-inline-end:12px !important}.ma-3{margin:12px !important}.mt-4,.my-4{margin-top:16px !important}.mr-4,.mx-4{margin-right:16px !important}.ml-4,.mx-4{margin-left:16px !important}.mb-4,.my-4{margin-bottom:16px !important}.ms-4{margin-inline-start:16px !important}.me-4{margin-inline-end:16px !important}.ma-4{margin:16px !important}.mt-5,.my-5{margin-top:20px !important}.mr-5,.mx-5{margin-right:20px !important}.ml-5,.mx-5{margin-left:20px !important}.mb-5,.my-5{margin-bottom:20px !important}.ms-5{margin-inline-start:20px !important}.me-5{margin-inline-end:20px !important}.ma-5{margin:20px !important}.mt-6,.my-6{margin-top:24px !important}.mr-6,.mx-6{margin-right:24px !important}.ml-6,.mx-6{margin-left:24px !important}.mb-6,.my-6{margin-bottom:24px !important}.ms-6{margin-inline-start:24px !important}.me-6{margin-inline-end:24px !important}.ma-6{margin:24px !important}.mt-7,.my-7{margin-top:28px !important}.mr-7,.mx-7{margin-right:28px !important}.ml-7,.mx-7{margin-left:28px !important}.mb-7,.my-7{margin-bottom:28px !important}.ms-7{margin-inline-start:28px !important}.me-7{margin-inline-end:28px !important}.ma-7{margin:28px !important}.mt-8,.my-8{margin-top:32px !important}.mr-8,.mx-8{margin-right:32px !important}.ml-8,.mx-8{margin-left:32px !important}.mb-8,.my-8{margin-bottom:32px !important}.ms-8{margin-inline-start:32px !important}.me-8{margin-inline-end:32px !important}.ma-8{margin:32px !important}.mt-9,.my-9{margin-top:36px !important}.mr-9,.mx-9{margin-right:36px !important}.ml-9,.mx-9{margin-left:36px !important}.mb-9,.my-9{margin-bottom:36px !important}.ms-9{margin-inline-start:36px !important}.me-9{margin-inline-end:36px !important}.ma-9{margin:36px !important}.mt-10,.my-10{margin-top:40px !important}.mr-10,.mx-10{margin-right:40px !important}.ml-10,.mx-10{margin-left:40px !important}.mb-10,.my-10{margin-bottom:40px !important}.ms-10{margin-inline-start:40px !important}.me-10{margin-inline-end:40px !important}.ma-10{margin:40px !important}.mt-11,.my-11{margin-top:44px !important}.mr-11,.mx-11{margin-right:44px !important}.ml-11,.mx-11{margin-left:44px !important}.mb-11,.my-11{margin-bottom:44px !important}.ms-11{margin-inline-start:44px !important}.me-11{margin-inline-end:44px !important}.ma-11{margin:44px !important}.mt-12,.my-12{margin-top:48px !important}.mr-12,.mx-12{margin-right:48px !important}.ml-12,.mx-12{margin-left:48px !important}.mb-12,.my-12{margin-bottom:48px !important}.ms-12{margin-inline-start:48px !important}.me-12{margin-inline-end:48px !important}.ma-12{margin:48px !important}.mt-13,.my-13{margin-top:52px !important}.mr-13,.mx-13{margin-right:52px !important}.ml-13,.mx-13{margin-left:52px !important}.mb-13,.my-13{margin-bottom:52px !important}.ms-13{margin-inline-start:52px !important}.me-13{margin-inline-end:52px !important}.ma-13{margin:52px !important}.mt-14,.my-14{margin-top:56px !important}.mr-14,.mx-14{margin-right:56px !important}.ml-14,.mx-14{margin-left:56px !important}.mb-14,.my-14{margin-bottom:56px !important}.ms-14{margin-inline-start:56px !important}.me-14{margin-inline-end:56px !important}.ma-14{margin:56px !important}.mt-15,.my-15{margin-top:60px !important}.mr-15,.mx-15{margin-right:60px !important}.ml-15,.mx-15{margin-left:60px !important}.mb-15,.my-15{margin-bottom:60px !important}.ms-15{margin-inline-start:60px !important}.me-15{margin-inline-end:60px !important}.ma-15{margin:60px !important}.mt-16,.my-16{margin-top:64px !important}.mr-16,.mx-16{margin-right:64px !important}.ml-16,.mx-16{margin-left:64px !important}.mb-16,.my-16{margin-bottom:64px !important}.ms-16{margin-inline-start:64px !important}.me-16{margin-inline-end:64px !important}.ma-16{margin:64px !important}.mt-17,.my-17{margin-top:68px !important}.mr-17,.mx-17{margin-right:68px !important}.ml-17,.mx-17{margin-left:68px !important}.mb-17,.my-17{margin-bottom:68px !important}.ms-17{margin-inline-start:68px !important}.me-17{margin-inline-end:68px !important}.ma-17{margin:68px !important}.mt-18,.my-18{margin-top:72px !important}.mr-18,.mx-18{margin-right:72px !important}.ml-18,.mx-18{margin-left:72px !important}.mb-18,.my-18{margin-bottom:72px !important}.ms-18{margin-inline-start:72px !important}.me-18{margin-inline-end:72px !important}.ma-18{margin:72px !important}.mt-19,.my-19{margin-top:76px !important}.mr-19,.mx-19{margin-right:76px !important}.ml-19,.mx-19{margin-left:76px !important}.mb-19,.my-19{margin-bottom:76px !important}.ms-19{margin-inline-start:76px !important}.me-19{margin-inline-end:76px !important}.ma-19{margin:76px !important}.mt-20,.my-20{margin-top:80px !important}.mr-20,.mx-20{margin-right:80px !important}.ml-20,.mx-20{margin-left:80px !important}.mb-20,.my-20{margin-bottom:80px !important}.ms-20{margin-inline-start:80px !important}.me-20{margin-inline-end:80px !important}.ma-20{margin:80px !important}.mt-auto,.my-auto{margin-top:auto !important}.mr-auto,.mx-auto{margin-right:auto !important}.ml-auto,.mx-auto{margin-left:auto !important}.mb-auto,.my-auto{margin-bottom:auto !important}.ms-auto{margin-inline-start:auto !important}.me-auto{margin-inline-end:auto !important}.ma-auto{margin:auto !important}.pt-0,.py-0{padding-top:0 !important}.pr-0,.px-0{padding-right:0 !important}.pl-0,.px-0{padding-left:0 !important}.pb-0,.py-0{padding-bottom:0 !important}.ps-0{padding-inline-start:0 !important}.pe-0{padding-inline-end:0 !important}.pa-0{padding:0 !important}.pt-1,.py-1{padding-top:4px !important}.pr-1,.px-1{padding-right:4px !important}.pl-1,.px-1{padding-left:4px !important}.pb-1,.py-1{padding-bottom:4px !important}.ps-1{padding-inline-start:4px !important}.pe-1{padding-inline-end:4px !important}.pa-1{padding:4px !important}.pt-2,.py-2{padding-top:8px !important}.pr-2,.px-2{padding-right:8px !important}.pl-2,.px-2{padding-left:8px !important}.pb-2,.py-2{padding-bottom:8px !important}.ps-2{padding-inline-start:8px !important}.pe-2{padding-inline-end:8px !important}.pa-2{padding:8px !important}.pt-3,.py-3{padding-top:12px !important}.pr-3,.px-3{padding-right:12px !important}.pl-3,.px-3{padding-left:12px !important}.pb-3,.py-3{padding-bottom:12px !important}.ps-3{padding-inline-start:12px !important}.pe-3{padding-inline-end:12px !important}.pa-3{padding:12px !important}.pt-4,.py-4{padding-top:16px !important}.pr-4,.px-4{padding-right:16px !important}.pl-4,.px-4{padding-left:16px !important}.pb-4,.py-4{padding-bottom:16px !important}.ps-4{padding-inline-start:16px !important}.pe-4{padding-inline-end:16px !important}.pa-4{padding:16px !important}.pt-5,.py-5{padding-top:20px !important}.pr-5,.px-5{padding-right:20px !important}.pl-5,.px-5{padding-left:20px !important}.pb-5,.py-5{padding-bottom:20px !important}.ps-5{padding-inline-start:20px !important}.pe-5{padding-inline-end:20px !important}.pa-5{padding:20px !important}.pt-6,.py-6{padding-top:24px !important}.pr-6,.px-6{padding-right:24px !important}.pl-6,.px-6{padding-left:24px !important}.pb-6,.py-6{padding-bottom:24px !important}.ps-6{padding-inline-start:24px !important}.pe-6{padding-inline-end:24px !important}.pa-6{padding:24px !important}.pt-7,.py-7{padding-top:28px !important}.pr-7,.px-7{padding-right:28px !important}.pl-7,.px-7{padding-left:28px !important}.pb-7,.py-7{padding-bottom:28px !important}.ps-7{padding-inline-start:28px !important}.pe-7{padding-inline-end:28px !important}.pa-7{padding:28px !important}.pt-8,.py-8{padding-top:32px !important}.pr-8,.px-8{padding-right:32px !important}.pl-8,.px-8{padding-left:32px !important}.pb-8,.py-8{padding-bottom:32px !important}.ps-8{padding-inline-start:32px !important}.pe-8{padding-inline-end:32px !important}.pa-8{padding:32px !important}.pt-9,.py-9{padding-top:36px !important}.pr-9,.px-9{padding-right:36px !important}.pl-9,.px-9{padding-left:36px !important}.pb-9,.py-9{padding-bottom:36px !important}.ps-9{padding-inline-start:36px !important}.pe-9{padding-inline-end:36px !important}.pa-9{padding:36px !important}.pt-10,.py-10{padding-top:40px !important}.pr-10,.px-10{padding-right:40px !important}.pl-10,.px-10{padding-left:40px !important}.pb-10,.py-10{padding-bottom:40px !important}.ps-10{padding-inline-start:40px !important}.pe-10{padding-inline-end:40px !important}.pa-10{padding:40px !important}.pt-11,.py-11{padding-top:44px !important}.pr-11,.px-11{padding-right:44px !important}.pl-11,.px-11{padding-left:44px !important}.pb-11,.py-11{padding-bottom:44px !important}.ps-11{padding-inline-start:44px !important}.pe-11{padding-inline-end:44px !important}.pa-11{padding:44px !important}.pt-12,.py-12{padding-top:48px !important}.pr-12,.px-12{padding-right:48px !important}.pl-12,.px-12{padding-left:48px !important}.pb-12,.py-12{padding-bottom:48px !important}.ps-12{padding-inline-start:48px !important}.pe-12{padding-inline-end:48px !important}.pa-12{padding:48px !important}.pt-13,.py-13{padding-top:52px !important}.pr-13,.px-13{padding-right:52px !important}.pl-13,.px-13{padding-left:52px !important}.pb-13,.py-13{padding-bottom:52px !important}.ps-13{padding-inline-start:52px !important}.pe-13{padding-inline-end:52px !important}.pa-13{padding:52px !important}.pt-14,.py-14{padding-top:56px !important}.pr-14,.px-14{padding-right:56px !important}.pl-14,.px-14{padding-left:56px !important}.pb-14,.py-14{padding-bottom:56px !important}.ps-14{padding-inline-start:56px !important}.pe-14{padding-inline-end:56px !important}.pa-14{padding:56px !important}.pt-15,.py-15{padding-top:60px !important}.pr-15,.px-15{padding-right:60px !important}.pl-15,.px-15{padding-left:60px !important}.pb-15,.py-15{padding-bottom:60px !important}.ps-15{padding-inline-start:60px !important}.pe-15{padding-inline-end:60px !important}.pa-15{padding:60px !important}.pt-16,.py-16{padding-top:64px !important}.pr-16,.px-16{padding-right:64px !important}.pl-16,.px-16{padding-left:64px !important}.pb-16,.py-16{padding-bottom:64px !important}.ps-16{padding-inline-start:64px !important}.pe-16{padding-inline-end:64px !important}.pa-16{padding:64px !important}.pt-17,.py-17{padding-top:68px !important}.pr-17,.px-17{padding-right:68px !important}.pl-17,.px-17{padding-left:68px !important}.pb-17,.py-17{padding-bottom:68px !important}.ps-17{padding-inline-start:68px !important}.pe-17{padding-inline-end:68px !important}.pa-17{padding:68px !important}.pt-18,.py-18{padding-top:72px !important}.pr-18,.px-18{padding-right:72px !important}.pl-18,.px-18{padding-left:72px !important}.pb-18,.py-18{padding-bottom:72px !important}.ps-18{padding-inline-start:72px !important}.pe-18{padding-inline-end:72px !important}.pa-18{padding:72px !important}.pt-19,.py-19{padding-top:76px !important}.pr-19,.px-19{padding-right:76px !important}.pl-19,.px-19{padding-left:76px !important}.pb-19,.py-19{padding-bottom:76px !important}.ps-19{padding-inline-start:76px !important}.pe-19{padding-inline-end:76px !important}.pa-19{padding:76px !important}.pt-20,.py-20{padding-top:80px !important}.pr-20,.px-20{padding-right:80px !important}.pl-20,.px-20{padding-left:80px !important}.pb-20,.py-20{padding-bottom:80px !important}.ps-20{padding-inline-start:80px !important}.pe-20{padding-inline-end:80px !important}.pa-20{padding:80px !important}.pt-auto,.py-auto{padding-top:auto !important}.pr-auto,.px-auto{padding-right:auto !important}.pl-auto,.px-auto{padding-left:auto !important}.pb-auto,.py-auto{padding-bottom:auto !important}.ps-auto{padding-inline-start:auto !important}.pe-auto{padding-inline-end:auto !important}.pa-auto{padding:auto !important}.mt-n1,.my-n1{margin-top:-4px !important}.mr-n1,.mx-n1{margin-right:-4px !important}.ml-n1,.mx-n1{margin-left:-4px !important}.mb-n1,.my-n1{margin-bottom:-4px !important}.ms-n1{margin-inline-start:-4px !important}.me-n1{margin-inline-end:-4px !important}.ma-n1{margin:-4px !important}.mt-n2,.my-n2{margin-top:-8px !important}.mr-n2,.mx-n2{margin-right:-8px !important}.ml-n2,.mx-n2{margin-left:-8px !important}.mb-n2,.my-n2{margin-bottom:-8px !important}.ms-n2{margin-inline-start:-8px !important}.me-n2{margin-inline-end:-8px !important}.ma-n2{margin:-8px !important}.mt-n3,.my-n3{margin-top:-12px !important}.mr-n3,.mx-n3{margin-right:-12px !important}.ml-n3,.mx-n3{margin-left:-12px !important}.mb-n3,.my-n3{margin-bottom:-12px !important}.ms-n3{margin-inline-start:-12px !important}.me-n3{margin-inline-end:-12px !important}.ma-n3{margin:-12px !important}.mt-n4,.my-n4{margin-top:-16px !important}.mr-n4,.mx-n4{margin-right:-16px !important}.ml-n4,.mx-n4{margin-left:-16px !important}.mb-n4,.my-n4{margin-bottom:-16px !important}.ms-n4{margin-inline-start:-16px !important}.me-n4{margin-inline-end:-16px !important}.ma-n4{margin:-16px !important}.mt-n5,.my-n5{margin-top:-20px !important}.mr-n5,.mx-n5{margin-right:-20px !important}.ml-n5,.mx-n5{margin-left:-20px !important}.mb-n5,.my-n5{margin-bottom:-20px !important}.ms-n5{margin-inline-start:-20px !important}.me-n5{margin-inline-end:-20px !important}.ma-n5{margin:-20px !important}.mt-n6,.my-n6{margin-top:-24px !important}.mr-n6,.mx-n6{margin-right:-24px !important}.ml-n6,.mx-n6{margin-left:-24px !important}.mb-n6,.my-n6{margin-bottom:-24px !important}.ms-n6{margin-inline-start:-24px !important}.me-n6{margin-inline-end:-24px !important}.ma-n6{margin:-24px !important}.mt-n7,.my-n7{margin-top:-28px !important}.mr-n7,.mx-n7{margin-right:-28px !important}.ml-n7,.mx-n7{margin-left:-28px !important}.mb-n7,.my-n7{margin-bottom:-28px !important}.ms-n7{margin-inline-start:-28px !important}.me-n7{margin-inline-end:-28px !important}.ma-n7{margin:-28px !important}.mt-n8,.my-n8{margin-top:-32px !important}.mr-n8,.mx-n8{margin-right:-32px !important}.ml-n8,.mx-n8{margin-left:-32px !important}.mb-n8,.my-n8{margin-bottom:-32px !important}.ms-n8{margin-inline-start:-32px !important}.me-n8{margin-inline-end:-32px !important}.ma-n8{margin:-32px !important}.mt-n9,.my-n9{margin-top:-36px !important}.mr-n9,.mx-n9{margin-right:-36px !important}.ml-n9,.mx-n9{margin-left:-36px !important}.mb-n9,.my-n9{margin-bottom:-36px !important}.ms-n9{margin-inline-start:-36px !important}.me-n9{margin-inline-end:-36px !important}.ma-n9{margin:-36px !important}.mt-n10,.my-n10{margin-top:-40px !important}.mr-n10,.mx-n10{margin-right:-40px !important}.ml-n10,.mx-n10{margin-left:-40px !important}.mb-n10,.my-n10{margin-bottom:-40px !important}.ms-n10{margin-inline-start:-40px !important}.me-n10{margin-inline-end:-40px !important}.ma-n10{margin:-40px !important}.mt-n11,.my-n11{margin-top:-44px !important}.mr-n11,.mx-n11{margin-right:-44px !important}.ml-n11,.mx-n11{margin-left:-44px !important}.mb-n11,.my-n11{margin-bottom:-44px !important}.ms-n11{margin-inline-start:-44px !important}.me-n11{margin-inline-end:-44px !important}.ma-n11{margin:-44px !important}.mt-n12,.my-n12{margin-top:-48px !important}.mr-n12,.mx-n12{margin-right:-48px !important}.ml-n12,.mx-n12{margin-left:-48px !important}.mb-n12,.my-n12{margin-bottom:-48px !important}.ms-n12{margin-inline-start:-48px !important}.me-n12{margin-inline-end:-48px !important}.ma-n12{margin:-48px !important}.mt-n13,.my-n13{margin-top:-52px !important}.mr-n13,.mx-n13{margin-right:-52px !important}.ml-n13,.mx-n13{margin-left:-52px !important}.mb-n13,.my-n13{margin-bottom:-52px !important}.ms-n13{margin-inline-start:-52px !important}.me-n13{margin-inline-end:-52px !important}.ma-n13{margin:-52px !important}.mt-n14,.my-n14{margin-top:-56px !important}.mr-n14,.mx-n14{margin-right:-56px !important}.ml-n14,.mx-n14{margin-left:-56px !important}.mb-n14,.my-n14{margin-bottom:-56px !important}.ms-n14{margin-inline-start:-56px !important}.me-n14{margin-inline-end:-56px !important}.ma-n14{margin:-56px !important}.mt-n15,.my-n15{margin-top:-60px !important}.mr-n15,.mx-n15{margin-right:-60px !important}.ml-n15,.mx-n15{margin-left:-60px !important}.mb-n15,.my-n15{margin-bottom:-60px !important}.ms-n15{margin-inline-start:-60px !important}.me-n15{margin-inline-end:-60px !important}.ma-n15{margin:-60px !important}.mt-n16,.my-n16{margin-top:-64px !important}.mr-n16,.mx-n16{margin-right:-64px !important}.ml-n16,.mx-n16{margin-left:-64px !important}.mb-n16,.my-n16{margin-bottom:-64px !important}.ms-n16{margin-inline-start:-64px !important}.me-n16{margin-inline-end:-64px !important}.ma-n16{margin:-64px !important}.mt-n17,.my-n17{margin-top:-68px !important}.mr-n17,.mx-n17{margin-right:-68px !important}.ml-n17,.mx-n17{margin-left:-68px !important}.mb-n17,.my-n17{margin-bottom:-68px !important}.ms-n17{margin-inline-start:-68px !important}.me-n17{margin-inline-end:-68px !important}.ma-n17{margin:-68px !important}.mt-n18,.my-n18{margin-top:-72px !important}.mr-n18,.mx-n18{margin-right:-72px !important}.ml-n18,.mx-n18{margin-left:-72px !important}.mb-n18,.my-n18{margin-bottom:-72px !important}.ms-n18{margin-inline-start:-72px !important}.me-n18{margin-inline-end:-72px !important}.ma-n18{margin:-72px !important}.mt-n19,.my-n19{margin-top:-76px !important}.mr-n19,.mx-n19{margin-right:-76px !important}.ml-n19,.mx-n19{margin-left:-76px !important}.mb-n19,.my-n19{margin-bottom:-76px !important}.ms-n19{margin-inline-start:-76px !important}.me-n19{margin-inline-end:-76px !important}.ma-n19{margin:-76px !important}.mt-n20,.my-n20{margin-top:-80px !important}.mr-n20,.mx-n20{margin-right:-80px !important}.ml-n20,.mx-n20{margin-left:-80px !important}.mb-n20,.my-n20{margin-bottom:-80px !important}.ms-n20{margin-inline-start:-80px !important}.me-n20{margin-inline-end:-80px !important}.ma-n20{margin:-80px !important}@media screen and (min-width: 600px){.mt-sm-0,.my-sm-0{margin-top:0 !important}.mr-sm-0,.mx-sm-0{margin-right:0 !important}.ml-sm-0,.mx-sm-0{margin-left:0 !important}.mb-sm-0,.my-sm-0{margin-bottom:0 !important}.ms-sm-0{margin-inline-start:0 !important}.me-sm-0{margin-inline-end:0 !important}.ma-sm-0{margin:0 !important}.mt-sm-1,.my-sm-1{margin-top:4px !important}.mr-sm-1,.mx-sm-1{margin-right:4px !important}.ml-sm-1,.mx-sm-1{margin-left:4px !important}.mb-sm-1,.my-sm-1{margin-bottom:4px !important}.ms-sm-1{margin-inline-start:4px !important}.me-sm-1{margin-inline-end:4px !important}.ma-sm-1{margin:4px !important}.mt-sm-2,.my-sm-2{margin-top:8px !important}.mr-sm-2,.mx-sm-2{margin-right:8px !important}.ml-sm-2,.mx-sm-2{margin-left:8px !important}.mb-sm-2,.my-sm-2{margin-bottom:8px !important}.ms-sm-2{margin-inline-start:8px !important}.me-sm-2{margin-inline-end:8px !important}.ma-sm-2{margin:8px !important}.mt-sm-3,.my-sm-3{margin-top:12px !important}.mr-sm-3,.mx-sm-3{margin-right:12px !important}.ml-sm-3,.mx-sm-3{margin-left:12px !important}.mb-sm-3,.my-sm-3{margin-bottom:12px !important}.ms-sm-3{margin-inline-start:12px !important}.me-sm-3{margin-inline-end:12px !important}.ma-sm-3{margin:12px !important}.mt-sm-4,.my-sm-4{margin-top:16px !important}.mr-sm-4,.mx-sm-4{margin-right:16px !important}.ml-sm-4,.mx-sm-4{margin-left:16px !important}.mb-sm-4,.my-sm-4{margin-bottom:16px !important}.ms-sm-4{margin-inline-start:16px !important}.me-sm-4{margin-inline-end:16px !important}.ma-sm-4{margin:16px !important}.mt-sm-5,.my-sm-5{margin-top:20px !important}.mr-sm-5,.mx-sm-5{margin-right:20px !important}.ml-sm-5,.mx-sm-5{margin-left:20px !important}.mb-sm-5,.my-sm-5{margin-bottom:20px !important}.ms-sm-5{margin-inline-start:20px !important}.me-sm-5{margin-inline-end:20px !important}.ma-sm-5{margin:20px !important}.mt-sm-6,.my-sm-6{margin-top:24px !important}.mr-sm-6,.mx-sm-6{margin-right:24px !important}.ml-sm-6,.mx-sm-6{margin-left:24px !important}.mb-sm-6,.my-sm-6{margin-bottom:24px !important}.ms-sm-6{margin-inline-start:24px !important}.me-sm-6{margin-inline-end:24px !important}.ma-sm-6{margin:24px !important}.mt-sm-7,.my-sm-7{margin-top:28px !important}.mr-sm-7,.mx-sm-7{margin-right:28px !important}.ml-sm-7,.mx-sm-7{margin-left:28px !important}.mb-sm-7,.my-sm-7{margin-bottom:28px !important}.ms-sm-7{margin-inline-start:28px !important}.me-sm-7{margin-inline-end:28px !important}.ma-sm-7{margin:28px !important}.mt-sm-8,.my-sm-8{margin-top:32px !important}.mr-sm-8,.mx-sm-8{margin-right:32px !important}.ml-sm-8,.mx-sm-8{margin-left:32px !important}.mb-sm-8,.my-sm-8{margin-bottom:32px !important}.ms-sm-8{margin-inline-start:32px !important}.me-sm-8{margin-inline-end:32px !important}.ma-sm-8{margin:32px !important}.mt-sm-9,.my-sm-9{margin-top:36px !important}.mr-sm-9,.mx-sm-9{margin-right:36px !important}.ml-sm-9,.mx-sm-9{margin-left:36px !important}.mb-sm-9,.my-sm-9{margin-bottom:36px !important}.ms-sm-9{margin-inline-start:36px !important}.me-sm-9{margin-inline-end:36px !important}.ma-sm-9{margin:36px !important}.mt-sm-10,.my-sm-10{margin-top:40px !important}.mr-sm-10,.mx-sm-10{margin-right:40px !important}.ml-sm-10,.mx-sm-10{margin-left:40px !important}.mb-sm-10,.my-sm-10{margin-bottom:40px !important}.ms-sm-10{margin-inline-start:40px !important}.me-sm-10{margin-inline-end:40px !important}.ma-sm-10{margin:40px !important}.mt-sm-11,.my-sm-11{margin-top:44px !important}.mr-sm-11,.mx-sm-11{margin-right:44px !important}.ml-sm-11,.mx-sm-11{margin-left:44px !important}.mb-sm-11,.my-sm-11{margin-bottom:44px !important}.ms-sm-11{margin-inline-start:44px !important}.me-sm-11{margin-inline-end:44px !important}.ma-sm-11{margin:44px !important}.mt-sm-12,.my-sm-12{margin-top:48px !important}.mr-sm-12,.mx-sm-12{margin-right:48px !important}.ml-sm-12,.mx-sm-12{margin-left:48px !important}.mb-sm-12,.my-sm-12{margin-bottom:48px !important}.ms-sm-12{margin-inline-start:48px !important}.me-sm-12{margin-inline-end:48px !important}.ma-sm-12{margin:48px !important}.mt-sm-13,.my-sm-13{margin-top:52px !important}.mr-sm-13,.mx-sm-13{margin-right:52px !important}.ml-sm-13,.mx-sm-13{margin-left:52px !important}.mb-sm-13,.my-sm-13{margin-bottom:52px !important}.ms-sm-13{margin-inline-start:52px !important}.me-sm-13{margin-inline-end:52px !important}.ma-sm-13{margin:52px !important}.mt-sm-14,.my-sm-14{margin-top:56px !important}.mr-sm-14,.mx-sm-14{margin-right:56px !important}.ml-sm-14,.mx-sm-14{margin-left:56px !important}.mb-sm-14,.my-sm-14{margin-bottom:56px !important}.ms-sm-14{margin-inline-start:56px !important}.me-sm-14{margin-inline-end:56px !important}.ma-sm-14{margin:56px !important}.mt-sm-15,.my-sm-15{margin-top:60px !important}.mr-sm-15,.mx-sm-15{margin-right:60px !important}.ml-sm-15,.mx-sm-15{margin-left:60px !important}.mb-sm-15,.my-sm-15{margin-bottom:60px !important}.ms-sm-15{margin-inline-start:60px !important}.me-sm-15{margin-inline-end:60px !important}.ma-sm-15{margin:60px !important}.mt-sm-16,.my-sm-16{margin-top:64px !important}.mr-sm-16,.mx-sm-16{margin-right:64px !important}.ml-sm-16,.mx-sm-16{margin-left:64px !important}.mb-sm-16,.my-sm-16{margin-bottom:64px !important}.ms-sm-16{margin-inline-start:64px !important}.me-sm-16{margin-inline-end:64px !important}.ma-sm-16{margin:64px !important}.mt-sm-17,.my-sm-17{margin-top:68px !important}.mr-sm-17,.mx-sm-17{margin-right:68px !important}.ml-sm-17,.mx-sm-17{margin-left:68px !important}.mb-sm-17,.my-sm-17{margin-bottom:68px !important}.ms-sm-17{margin-inline-start:68px !important}.me-sm-17{margin-inline-end:68px !important}.ma-sm-17{margin:68px !important}.mt-sm-18,.my-sm-18{margin-top:72px !important}.mr-sm-18,.mx-sm-18{margin-right:72px !important}.ml-sm-18,.mx-sm-18{margin-left:72px !important}.mb-sm-18,.my-sm-18{margin-bottom:72px !important}.ms-sm-18{margin-inline-start:72px !important}.me-sm-18{margin-inline-end:72px !important}.ma-sm-18{margin:72px !important}.mt-sm-19,.my-sm-19{margin-top:76px !important}.mr-sm-19,.mx-sm-19{margin-right:76px !important}.ml-sm-19,.mx-sm-19{margin-left:76px !important}.mb-sm-19,.my-sm-19{margin-bottom:76px !important}.ms-sm-19{margin-inline-start:76px !important}.me-sm-19{margin-inline-end:76px !important}.ma-sm-19{margin:76px !important}.mt-sm-20,.my-sm-20{margin-top:80px !important}.mr-sm-20,.mx-sm-20{margin-right:80px !important}.ml-sm-20,.mx-sm-20{margin-left:80px !important}.mb-sm-20,.my-sm-20{margin-bottom:80px !important}.ms-sm-20{margin-inline-start:80px !important}.me-sm-20{margin-inline-end:80px !important}.ma-sm-20{margin:80px !important}.mt-sm-auto,.my-sm-auto{margin-top:auto !important}.mr-sm-auto,.mx-sm-auto{margin-right:auto !important}.ml-sm-auto,.mx-sm-auto{margin-left:auto !important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto !important}.ms-sm-auto{margin-inline-start:auto !important}.me-sm-auto{margin-inline-end:auto !important}.ma-sm-auto{margin:auto !important}.pt-sm-0,.py-sm-0{padding-top:0 !important}.pr-sm-0,.px-sm-0{padding-right:0 !important}.pl-sm-0,.px-sm-0{padding-left:0 !important}.pb-sm-0,.py-sm-0{padding-bottom:0 !important}.ps-sm-0{padding-inline-start:0 !important}.pe-sm-0{padding-inline-end:0 !important}.pa-sm-0{padding:0 !important}.pt-sm-1,.py-sm-1{padding-top:4px !important}.pr-sm-1,.px-sm-1{padding-right:4px !important}.pl-sm-1,.px-sm-1{padding-left:4px !important}.pb-sm-1,.py-sm-1{padding-bottom:4px !important}.ps-sm-1{padding-inline-start:4px !important}.pe-sm-1{padding-inline-end:4px !important}.pa-sm-1{padding:4px !important}.pt-sm-2,.py-sm-2{padding-top:8px !important}.pr-sm-2,.px-sm-2{padding-right:8px !important}.pl-sm-2,.px-sm-2{padding-left:8px !important}.pb-sm-2,.py-sm-2{padding-bottom:8px !important}.ps-sm-2{padding-inline-start:8px !important}.pe-sm-2{padding-inline-end:8px !important}.pa-sm-2{padding:8px !important}.pt-sm-3,.py-sm-3{padding-top:12px !important}.pr-sm-3,.px-sm-3{padding-right:12px !important}.pl-sm-3,.px-sm-3{padding-left:12px !important}.pb-sm-3,.py-sm-3{padding-bottom:12px !important}.ps-sm-3{padding-inline-start:12px !important}.pe-sm-3{padding-inline-end:12px !important}.pa-sm-3{padding:12px !important}.pt-sm-4,.py-sm-4{padding-top:16px !important}.pr-sm-4,.px-sm-4{padding-right:16px !important}.pl-sm-4,.px-sm-4{padding-left:16px !important}.pb-sm-4,.py-sm-4{padding-bottom:16px !important}.ps-sm-4{padding-inline-start:16px !important}.pe-sm-4{padding-inline-end:16px !important}.pa-sm-4{padding:16px !important}.pt-sm-5,.py-sm-5{padding-top:20px !important}.pr-sm-5,.px-sm-5{padding-right:20px !important}.pl-sm-5,.px-sm-5{padding-left:20px !important}.pb-sm-5,.py-sm-5{padding-bottom:20px !important}.ps-sm-5{padding-inline-start:20px !important}.pe-sm-5{padding-inline-end:20px !important}.pa-sm-5{padding:20px !important}.pt-sm-6,.py-sm-6{padding-top:24px !important}.pr-sm-6,.px-sm-6{padding-right:24px !important}.pl-sm-6,.px-sm-6{padding-left:24px !important}.pb-sm-6,.py-sm-6{padding-bottom:24px !important}.ps-sm-6{padding-inline-start:24px !important}.pe-sm-6{padding-inline-end:24px !important}.pa-sm-6{padding:24px !important}.pt-sm-7,.py-sm-7{padding-top:28px !important}.pr-sm-7,.px-sm-7{padding-right:28px !important}.pl-sm-7,.px-sm-7{padding-left:28px !important}.pb-sm-7,.py-sm-7{padding-bottom:28px !important}.ps-sm-7{padding-inline-start:28px !important}.pe-sm-7{padding-inline-end:28px !important}.pa-sm-7{padding:28px !important}.pt-sm-8,.py-sm-8{padding-top:32px !important}.pr-sm-8,.px-sm-8{padding-right:32px !important}.pl-sm-8,.px-sm-8{padding-left:32px !important}.pb-sm-8,.py-sm-8{padding-bottom:32px !important}.ps-sm-8{padding-inline-start:32px !important}.pe-sm-8{padding-inline-end:32px !important}.pa-sm-8{padding:32px !important}.pt-sm-9,.py-sm-9{padding-top:36px !important}.pr-sm-9,.px-sm-9{padding-right:36px !important}.pl-sm-9,.px-sm-9{padding-left:36px !important}.pb-sm-9,.py-sm-9{padding-bottom:36px !important}.ps-sm-9{padding-inline-start:36px !important}.pe-sm-9{padding-inline-end:36px !important}.pa-sm-9{padding:36px !important}.pt-sm-10,.py-sm-10{padding-top:40px !important}.pr-sm-10,.px-sm-10{padding-right:40px !important}.pl-sm-10,.px-sm-10{padding-left:40px !important}.pb-sm-10,.py-sm-10{padding-bottom:40px !important}.ps-sm-10{padding-inline-start:40px !important}.pe-sm-10{padding-inline-end:40px !important}.pa-sm-10{padding:40px !important}.pt-sm-11,.py-sm-11{padding-top:44px !important}.pr-sm-11,.px-sm-11{padding-right:44px !important}.pl-sm-11,.px-sm-11{padding-left:44px !important}.pb-sm-11,.py-sm-11{padding-bottom:44px !important}.ps-sm-11{padding-inline-start:44px !important}.pe-sm-11{padding-inline-end:44px !important}.pa-sm-11{padding:44px !important}.pt-sm-12,.py-sm-12{padding-top:48px !important}.pr-sm-12,.px-sm-12{padding-right:48px !important}.pl-sm-12,.px-sm-12{padding-left:48px !important}.pb-sm-12,.py-sm-12{padding-bottom:48px !important}.ps-sm-12{padding-inline-start:48px !important}.pe-sm-12{padding-inline-end:48px !important}.pa-sm-12{padding:48px !important}.pt-sm-13,.py-sm-13{padding-top:52px !important}.pr-sm-13,.px-sm-13{padding-right:52px !important}.pl-sm-13,.px-sm-13{padding-left:52px !important}.pb-sm-13,.py-sm-13{padding-bottom:52px !important}.ps-sm-13{padding-inline-start:52px !important}.pe-sm-13{padding-inline-end:52px !important}.pa-sm-13{padding:52px !important}.pt-sm-14,.py-sm-14{padding-top:56px !important}.pr-sm-14,.px-sm-14{padding-right:56px !important}.pl-sm-14,.px-sm-14{padding-left:56px !important}.pb-sm-14,.py-sm-14{padding-bottom:56px !important}.ps-sm-14{padding-inline-start:56px !important}.pe-sm-14{padding-inline-end:56px !important}.pa-sm-14{padding:56px !important}.pt-sm-15,.py-sm-15{padding-top:60px !important}.pr-sm-15,.px-sm-15{padding-right:60px !important}.pl-sm-15,.px-sm-15{padding-left:60px !important}.pb-sm-15,.py-sm-15{padding-bottom:60px !important}.ps-sm-15{padding-inline-start:60px !important}.pe-sm-15{padding-inline-end:60px !important}.pa-sm-15{padding:60px !important}.pt-sm-16,.py-sm-16{padding-top:64px !important}.pr-sm-16,.px-sm-16{padding-right:64px !important}.pl-sm-16,.px-sm-16{padding-left:64px !important}.pb-sm-16,.py-sm-16{padding-bottom:64px !important}.ps-sm-16{padding-inline-start:64px !important}.pe-sm-16{padding-inline-end:64px !important}.pa-sm-16{padding:64px !important}.pt-sm-17,.py-sm-17{padding-top:68px !important}.pr-sm-17,.px-sm-17{padding-right:68px !important}.pl-sm-17,.px-sm-17{padding-left:68px !important}.pb-sm-17,.py-sm-17{padding-bottom:68px !important}.ps-sm-17{padding-inline-start:68px !important}.pe-sm-17{padding-inline-end:68px !important}.pa-sm-17{padding:68px !important}.pt-sm-18,.py-sm-18{padding-top:72px !important}.pr-sm-18,.px-sm-18{padding-right:72px !important}.pl-sm-18,.px-sm-18{padding-left:72px !important}.pb-sm-18,.py-sm-18{padding-bottom:72px !important}.ps-sm-18{padding-inline-start:72px !important}.pe-sm-18{padding-inline-end:72px !important}.pa-sm-18{padding:72px !important}.pt-sm-19,.py-sm-19{padding-top:76px !important}.pr-sm-19,.px-sm-19{padding-right:76px !important}.pl-sm-19,.px-sm-19{padding-left:76px !important}.pb-sm-19,.py-sm-19{padding-bottom:76px !important}.ps-sm-19{padding-inline-start:76px !important}.pe-sm-19{padding-inline-end:76px !important}.pa-sm-19{padding:76px !important}.pt-sm-20,.py-sm-20{padding-top:80px !important}.pr-sm-20,.px-sm-20{padding-right:80px !important}.pl-sm-20,.px-sm-20{padding-left:80px !important}.pb-sm-20,.py-sm-20{padding-bottom:80px !important}.ps-sm-20{padding-inline-start:80px !important}.pe-sm-20{padding-inline-end:80px !important}.pa-sm-20{padding:80px !important}.pt-sm-auto,.py-sm-auto{padding-top:auto !important}.pr-sm-auto,.px-sm-auto{padding-right:auto !important}.pl-sm-auto,.px-sm-auto{padding-left:auto !important}.pb-sm-auto,.py-sm-auto{padding-bottom:auto !important}.ps-sm-auto{padding-inline-start:auto !important}.pe-sm-auto{padding-inline-end:auto !important}.pa-sm-auto{padding:auto !important}.mt-sm-n1,.my-sm-n1{margin-top:-4px !important}.mr-sm-n1,.mx-sm-n1{margin-right:-4px !important}.ml-sm-n1,.mx-sm-n1{margin-left:-4px !important}.mb-sm-n1,.my-sm-n1{margin-bottom:-4px !important}.ms-sm-n1{margin-inline-start:-4px !important}.me-sm-n1{margin-inline-end:-4px !important}.ma-sm-n1{margin:-4px !important}.mt-sm-n2,.my-sm-n2{margin-top:-8px !important}.mr-sm-n2,.mx-sm-n2{margin-right:-8px !important}.ml-sm-n2,.mx-sm-n2{margin-left:-8px !important}.mb-sm-n2,.my-sm-n2{margin-bottom:-8px !important}.ms-sm-n2{margin-inline-start:-8px !important}.me-sm-n2{margin-inline-end:-8px !important}.ma-sm-n2{margin:-8px !important}.mt-sm-n3,.my-sm-n3{margin-top:-12px !important}.mr-sm-n3,.mx-sm-n3{margin-right:-12px !important}.ml-sm-n3,.mx-sm-n3{margin-left:-12px !important}.mb-sm-n3,.my-sm-n3{margin-bottom:-12px !important}.ms-sm-n3{margin-inline-start:-12px !important}.me-sm-n3{margin-inline-end:-12px !important}.ma-sm-n3{margin:-12px !important}.mt-sm-n4,.my-sm-n4{margin-top:-16px !important}.mr-sm-n4,.mx-sm-n4{margin-right:-16px !important}.ml-sm-n4,.mx-sm-n4{margin-left:-16px !important}.mb-sm-n4,.my-sm-n4{margin-bottom:-16px !important}.ms-sm-n4{margin-inline-start:-16px !important}.me-sm-n4{margin-inline-end:-16px !important}.ma-sm-n4{margin:-16px !important}.mt-sm-n5,.my-sm-n5{margin-top:-20px !important}.mr-sm-n5,.mx-sm-n5{margin-right:-20px !important}.ml-sm-n5,.mx-sm-n5{margin-left:-20px !important}.mb-sm-n5,.my-sm-n5{margin-bottom:-20px !important}.ms-sm-n5{margin-inline-start:-20px !important}.me-sm-n5{margin-inline-end:-20px !important}.ma-sm-n5{margin:-20px !important}.mt-sm-n6,.my-sm-n6{margin-top:-24px !important}.mr-sm-n6,.mx-sm-n6{margin-right:-24px !important}.ml-sm-n6,.mx-sm-n6{margin-left:-24px !important}.mb-sm-n6,.my-sm-n6{margin-bottom:-24px !important}.ms-sm-n6{margin-inline-start:-24px !important}.me-sm-n6{margin-inline-end:-24px !important}.ma-sm-n6{margin:-24px !important}.mt-sm-n7,.my-sm-n7{margin-top:-28px !important}.mr-sm-n7,.mx-sm-n7{margin-right:-28px !important}.ml-sm-n7,.mx-sm-n7{margin-left:-28px !important}.mb-sm-n7,.my-sm-n7{margin-bottom:-28px !important}.ms-sm-n7{margin-inline-start:-28px !important}.me-sm-n7{margin-inline-end:-28px !important}.ma-sm-n7{margin:-28px !important}.mt-sm-n8,.my-sm-n8{margin-top:-32px !important}.mr-sm-n8,.mx-sm-n8{margin-right:-32px !important}.ml-sm-n8,.mx-sm-n8{margin-left:-32px !important}.mb-sm-n8,.my-sm-n8{margin-bottom:-32px !important}.ms-sm-n8{margin-inline-start:-32px !important}.me-sm-n8{margin-inline-end:-32px !important}.ma-sm-n8{margin:-32px !important}.mt-sm-n9,.my-sm-n9{margin-top:-36px !important}.mr-sm-n9,.mx-sm-n9{margin-right:-36px !important}.ml-sm-n9,.mx-sm-n9{margin-left:-36px !important}.mb-sm-n9,.my-sm-n9{margin-bottom:-36px !important}.ms-sm-n9{margin-inline-start:-36px !important}.me-sm-n9{margin-inline-end:-36px !important}.ma-sm-n9{margin:-36px !important}.mt-sm-n10,.my-sm-n10{margin-top:-40px !important}.mr-sm-n10,.mx-sm-n10{margin-right:-40px !important}.ml-sm-n10,.mx-sm-n10{margin-left:-40px !important}.mb-sm-n10,.my-sm-n10{margin-bottom:-40px !important}.ms-sm-n10{margin-inline-start:-40px !important}.me-sm-n10{margin-inline-end:-40px !important}.ma-sm-n10{margin:-40px !important}.mt-sm-n11,.my-sm-n11{margin-top:-44px !important}.mr-sm-n11,.mx-sm-n11{margin-right:-44px !important}.ml-sm-n11,.mx-sm-n11{margin-left:-44px !important}.mb-sm-n11,.my-sm-n11{margin-bottom:-44px !important}.ms-sm-n11{margin-inline-start:-44px !important}.me-sm-n11{margin-inline-end:-44px !important}.ma-sm-n11{margin:-44px !important}.mt-sm-n12,.my-sm-n12{margin-top:-48px !important}.mr-sm-n12,.mx-sm-n12{margin-right:-48px !important}.ml-sm-n12,.mx-sm-n12{margin-left:-48px !important}.mb-sm-n12,.my-sm-n12{margin-bottom:-48px !important}.ms-sm-n12{margin-inline-start:-48px !important}.me-sm-n12{margin-inline-end:-48px !important}.ma-sm-n12{margin:-48px !important}.mt-sm-n13,.my-sm-n13{margin-top:-52px !important}.mr-sm-n13,.mx-sm-n13{margin-right:-52px !important}.ml-sm-n13,.mx-sm-n13{margin-left:-52px !important}.mb-sm-n13,.my-sm-n13{margin-bottom:-52px !important}.ms-sm-n13{margin-inline-start:-52px !important}.me-sm-n13{margin-inline-end:-52px !important}.ma-sm-n13{margin:-52px !important}.mt-sm-n14,.my-sm-n14{margin-top:-56px !important}.mr-sm-n14,.mx-sm-n14{margin-right:-56px !important}.ml-sm-n14,.mx-sm-n14{margin-left:-56px !important}.mb-sm-n14,.my-sm-n14{margin-bottom:-56px !important}.ms-sm-n14{margin-inline-start:-56px !important}.me-sm-n14{margin-inline-end:-56px !important}.ma-sm-n14{margin:-56px !important}.mt-sm-n15,.my-sm-n15{margin-top:-60px !important}.mr-sm-n15,.mx-sm-n15{margin-right:-60px !important}.ml-sm-n15,.mx-sm-n15{margin-left:-60px !important}.mb-sm-n15,.my-sm-n15{margin-bottom:-60px !important}.ms-sm-n15{margin-inline-start:-60px !important}.me-sm-n15{margin-inline-end:-60px !important}.ma-sm-n15{margin:-60px !important}.mt-sm-n16,.my-sm-n16{margin-top:-64px !important}.mr-sm-n16,.mx-sm-n16{margin-right:-64px !important}.ml-sm-n16,.mx-sm-n16{margin-left:-64px !important}.mb-sm-n16,.my-sm-n16{margin-bottom:-64px !important}.ms-sm-n16{margin-inline-start:-64px !important}.me-sm-n16{margin-inline-end:-64px !important}.ma-sm-n16{margin:-64px !important}.mt-sm-n17,.my-sm-n17{margin-top:-68px !important}.mr-sm-n17,.mx-sm-n17{margin-right:-68px !important}.ml-sm-n17,.mx-sm-n17{margin-left:-68px !important}.mb-sm-n17,.my-sm-n17{margin-bottom:-68px !important}.ms-sm-n17{margin-inline-start:-68px !important}.me-sm-n17{margin-inline-end:-68px !important}.ma-sm-n17{margin:-68px !important}.mt-sm-n18,.my-sm-n18{margin-top:-72px !important}.mr-sm-n18,.mx-sm-n18{margin-right:-72px !important}.ml-sm-n18,.mx-sm-n18{margin-left:-72px !important}.mb-sm-n18,.my-sm-n18{margin-bottom:-72px !important}.ms-sm-n18{margin-inline-start:-72px !important}.me-sm-n18{margin-inline-end:-72px !important}.ma-sm-n18{margin:-72px !important}.mt-sm-n19,.my-sm-n19{margin-top:-76px !important}.mr-sm-n19,.mx-sm-n19{margin-right:-76px !important}.ml-sm-n19,.mx-sm-n19{margin-left:-76px !important}.mb-sm-n19,.my-sm-n19{margin-bottom:-76px !important}.ms-sm-n19{margin-inline-start:-76px !important}.me-sm-n19{margin-inline-end:-76px !important}.ma-sm-n19{margin:-76px !important}.mt-sm-n20,.my-sm-n20{margin-top:-80px !important}.mr-sm-n20,.mx-sm-n20{margin-right:-80px !important}.ml-sm-n20,.mx-sm-n20{margin-left:-80px !important}.mb-sm-n20,.my-sm-n20{margin-bottom:-80px !important}.ms-sm-n20{margin-inline-start:-80px !important}.me-sm-n20{margin-inline-end:-80px !important}.ma-sm-n20{margin:-80px !important}}@media screen and (min-width: 960px){.mt-md-0,.my-md-0{margin-top:0 !important}.mr-md-0,.mx-md-0{margin-right:0 !important}.ml-md-0,.mx-md-0{margin-left:0 !important}.mb-md-0,.my-md-0{margin-bottom:0 !important}.ms-md-0{margin-inline-start:0 !important}.me-md-0{margin-inline-end:0 !important}.ma-md-0{margin:0 !important}.mt-md-1,.my-md-1{margin-top:4px !important}.mr-md-1,.mx-md-1{margin-right:4px !important}.ml-md-1,.mx-md-1{margin-left:4px !important}.mb-md-1,.my-md-1{margin-bottom:4px !important}.ms-md-1{margin-inline-start:4px !important}.me-md-1{margin-inline-end:4px !important}.ma-md-1{margin:4px !important}.mt-md-2,.my-md-2{margin-top:8px !important}.mr-md-2,.mx-md-2{margin-right:8px !important}.ml-md-2,.mx-md-2{margin-left:8px !important}.mb-md-2,.my-md-2{margin-bottom:8px !important}.ms-md-2{margin-inline-start:8px !important}.me-md-2{margin-inline-end:8px !important}.ma-md-2{margin:8px !important}.mt-md-3,.my-md-3{margin-top:12px !important}.mr-md-3,.mx-md-3{margin-right:12px !important}.ml-md-3,.mx-md-3{margin-left:12px !important}.mb-md-3,.my-md-3{margin-bottom:12px !important}.ms-md-3{margin-inline-start:12px !important}.me-md-3{margin-inline-end:12px !important}.ma-md-3{margin:12px !important}.mt-md-4,.my-md-4{margin-top:16px !important}.mr-md-4,.mx-md-4{margin-right:16px !important}.ml-md-4,.mx-md-4{margin-left:16px !important}.mb-md-4,.my-md-4{margin-bottom:16px !important}.ms-md-4{margin-inline-start:16px !important}.me-md-4{margin-inline-end:16px !important}.ma-md-4{margin:16px !important}.mt-md-5,.my-md-5{margin-top:20px !important}.mr-md-5,.mx-md-5{margin-right:20px !important}.ml-md-5,.mx-md-5{margin-left:20px !important}.mb-md-5,.my-md-5{margin-bottom:20px !important}.ms-md-5{margin-inline-start:20px !important}.me-md-5{margin-inline-end:20px !important}.ma-md-5{margin:20px !important}.mt-md-6,.my-md-6{margin-top:24px !important}.mr-md-6,.mx-md-6{margin-right:24px !important}.ml-md-6,.mx-md-6{margin-left:24px !important}.mb-md-6,.my-md-6{margin-bottom:24px !important}.ms-md-6{margin-inline-start:24px !important}.me-md-6{margin-inline-end:24px !important}.ma-md-6{margin:24px !important}.mt-md-7,.my-md-7{margin-top:28px !important}.mr-md-7,.mx-md-7{margin-right:28px !important}.ml-md-7,.mx-md-7{margin-left:28px !important}.mb-md-7,.my-md-7{margin-bottom:28px !important}.ms-md-7{margin-inline-start:28px !important}.me-md-7{margin-inline-end:28px !important}.ma-md-7{margin:28px !important}.mt-md-8,.my-md-8{margin-top:32px !important}.mr-md-8,.mx-md-8{margin-right:32px !important}.ml-md-8,.mx-md-8{margin-left:32px !important}.mb-md-8,.my-md-8{margin-bottom:32px !important}.ms-md-8{margin-inline-start:32px !important}.me-md-8{margin-inline-end:32px !important}.ma-md-8{margin:32px !important}.mt-md-9,.my-md-9{margin-top:36px !important}.mr-md-9,.mx-md-9{margin-right:36px !important}.ml-md-9,.mx-md-9{margin-left:36px !important}.mb-md-9,.my-md-9{margin-bottom:36px !important}.ms-md-9{margin-inline-start:36px !important}.me-md-9{margin-inline-end:36px !important}.ma-md-9{margin:36px !important}.mt-md-10,.my-md-10{margin-top:40px !important}.mr-md-10,.mx-md-10{margin-right:40px !important}.ml-md-10,.mx-md-10{margin-left:40px !important}.mb-md-10,.my-md-10{margin-bottom:40px !important}.ms-md-10{margin-inline-start:40px !important}.me-md-10{margin-inline-end:40px !important}.ma-md-10{margin:40px !important}.mt-md-11,.my-md-11{margin-top:44px !important}.mr-md-11,.mx-md-11{margin-right:44px !important}.ml-md-11,.mx-md-11{margin-left:44px !important}.mb-md-11,.my-md-11{margin-bottom:44px !important}.ms-md-11{margin-inline-start:44px !important}.me-md-11{margin-inline-end:44px !important}.ma-md-11{margin:44px !important}.mt-md-12,.my-md-12{margin-top:48px !important}.mr-md-12,.mx-md-12{margin-right:48px !important}.ml-md-12,.mx-md-12{margin-left:48px !important}.mb-md-12,.my-md-12{margin-bottom:48px !important}.ms-md-12{margin-inline-start:48px !important}.me-md-12{margin-inline-end:48px !important}.ma-md-12{margin:48px !important}.mt-md-13,.my-md-13{margin-top:52px !important}.mr-md-13,.mx-md-13{margin-right:52px !important}.ml-md-13,.mx-md-13{margin-left:52px !important}.mb-md-13,.my-md-13{margin-bottom:52px !important}.ms-md-13{margin-inline-start:52px !important}.me-md-13{margin-inline-end:52px !important}.ma-md-13{margin:52px !important}.mt-md-14,.my-md-14{margin-top:56px !important}.mr-md-14,.mx-md-14{margin-right:56px !important}.ml-md-14,.mx-md-14{margin-left:56px !important}.mb-md-14,.my-md-14{margin-bottom:56px !important}.ms-md-14{margin-inline-start:56px !important}.me-md-14{margin-inline-end:56px !important}.ma-md-14{margin:56px !important}.mt-md-15,.my-md-15{margin-top:60px !important}.mr-md-15,.mx-md-15{margin-right:60px !important}.ml-md-15,.mx-md-15{margin-left:60px !important}.mb-md-15,.my-md-15{margin-bottom:60px !important}.ms-md-15{margin-inline-start:60px !important}.me-md-15{margin-inline-end:60px !important}.ma-md-15{margin:60px !important}.mt-md-16,.my-md-16{margin-top:64px !important}.mr-md-16,.mx-md-16{margin-right:64px !important}.ml-md-16,.mx-md-16{margin-left:64px !important}.mb-md-16,.my-md-16{margin-bottom:64px !important}.ms-md-16{margin-inline-start:64px !important}.me-md-16{margin-inline-end:64px !important}.ma-md-16{margin:64px !important}.mt-md-17,.my-md-17{margin-top:68px !important}.mr-md-17,.mx-md-17{margin-right:68px !important}.ml-md-17,.mx-md-17{margin-left:68px !important}.mb-md-17,.my-md-17{margin-bottom:68px !important}.ms-md-17{margin-inline-start:68px !important}.me-md-17{margin-inline-end:68px !important}.ma-md-17{margin:68px !important}.mt-md-18,.my-md-18{margin-top:72px !important}.mr-md-18,.mx-md-18{margin-right:72px !important}.ml-md-18,.mx-md-18{margin-left:72px !important}.mb-md-18,.my-md-18{margin-bottom:72px !important}.ms-md-18{margin-inline-start:72px !important}.me-md-18{margin-inline-end:72px !important}.ma-md-18{margin:72px !important}.mt-md-19,.my-md-19{margin-top:76px !important}.mr-md-19,.mx-md-19{margin-right:76px !important}.ml-md-19,.mx-md-19{margin-left:76px !important}.mb-md-19,.my-md-19{margin-bottom:76px !important}.ms-md-19{margin-inline-start:76px !important}.me-md-19{margin-inline-end:76px !important}.ma-md-19{margin:76px !important}.mt-md-20,.my-md-20{margin-top:80px !important}.mr-md-20,.mx-md-20{margin-right:80px !important}.ml-md-20,.mx-md-20{margin-left:80px !important}.mb-md-20,.my-md-20{margin-bottom:80px !important}.ms-md-20{margin-inline-start:80px !important}.me-md-20{margin-inline-end:80px !important}.ma-md-20{margin:80px !important}.mt-md-auto,.my-md-auto{margin-top:auto !important}.mr-md-auto,.mx-md-auto{margin-right:auto !important}.ml-md-auto,.mx-md-auto{margin-left:auto !important}.mb-md-auto,.my-md-auto{margin-bottom:auto !important}.ms-md-auto{margin-inline-start:auto !important}.me-md-auto{margin-inline-end:auto !important}.ma-md-auto{margin:auto !important}.pt-md-0,.py-md-0{padding-top:0 !important}.pr-md-0,.px-md-0{padding-right:0 !important}.pl-md-0,.px-md-0{padding-left:0 !important}.pb-md-0,.py-md-0{padding-bottom:0 !important}.ps-md-0{padding-inline-start:0 !important}.pe-md-0{padding-inline-end:0 !important}.pa-md-0{padding:0 !important}.pt-md-1,.py-md-1{padding-top:4px !important}.pr-md-1,.px-md-1{padding-right:4px !important}.pl-md-1,.px-md-1{padding-left:4px !important}.pb-md-1,.py-md-1{padding-bottom:4px !important}.ps-md-1{padding-inline-start:4px !important}.pe-md-1{padding-inline-end:4px !important}.pa-md-1{padding:4px !important}.pt-md-2,.py-md-2{padding-top:8px !important}.pr-md-2,.px-md-2{padding-right:8px !important}.pl-md-2,.px-md-2{padding-left:8px !important}.pb-md-2,.py-md-2{padding-bottom:8px !important}.ps-md-2{padding-inline-start:8px !important}.pe-md-2{padding-inline-end:8px !important}.pa-md-2{padding:8px !important}.pt-md-3,.py-md-3{padding-top:12px !important}.pr-md-3,.px-md-3{padding-right:12px !important}.pl-md-3,.px-md-3{padding-left:12px !important}.pb-md-3,.py-md-3{padding-bottom:12px !important}.ps-md-3{padding-inline-start:12px !important}.pe-md-3{padding-inline-end:12px !important}.pa-md-3{padding:12px !important}.pt-md-4,.py-md-4{padding-top:16px !important}.pr-md-4,.px-md-4{padding-right:16px !important}.pl-md-4,.px-md-4{padding-left:16px !important}.pb-md-4,.py-md-4{padding-bottom:16px !important}.ps-md-4{padding-inline-start:16px !important}.pe-md-4{padding-inline-end:16px !important}.pa-md-4{padding:16px !important}.pt-md-5,.py-md-5{padding-top:20px !important}.pr-md-5,.px-md-5{padding-right:20px !important}.pl-md-5,.px-md-5{padding-left:20px !important}.pb-md-5,.py-md-5{padding-bottom:20px !important}.ps-md-5{padding-inline-start:20px !important}.pe-md-5{padding-inline-end:20px !important}.pa-md-5{padding:20px !important}.pt-md-6,.py-md-6{padding-top:24px !important}.pr-md-6,.px-md-6{padding-right:24px !important}.pl-md-6,.px-md-6{padding-left:24px !important}.pb-md-6,.py-md-6{padding-bottom:24px !important}.ps-md-6{padding-inline-start:24px !important}.pe-md-6{padding-inline-end:24px !important}.pa-md-6{padding:24px !important}.pt-md-7,.py-md-7{padding-top:28px !important}.pr-md-7,.px-md-7{padding-right:28px !important}.pl-md-7,.px-md-7{padding-left:28px !important}.pb-md-7,.py-md-7{padding-bottom:28px !important}.ps-md-7{padding-inline-start:28px !important}.pe-md-7{padding-inline-end:28px !important}.pa-md-7{padding:28px !important}.pt-md-8,.py-md-8{padding-top:32px !important}.pr-md-8,.px-md-8{padding-right:32px !important}.pl-md-8,.px-md-8{padding-left:32px !important}.pb-md-8,.py-md-8{padding-bottom:32px !important}.ps-md-8{padding-inline-start:32px !important}.pe-md-8{padding-inline-end:32px !important}.pa-md-8{padding:32px !important}.pt-md-9,.py-md-9{padding-top:36px !important}.pr-md-9,.px-md-9{padding-right:36px !important}.pl-md-9,.px-md-9{padding-left:36px !important}.pb-md-9,.py-md-9{padding-bottom:36px !important}.ps-md-9{padding-inline-start:36px !important}.pe-md-9{padding-inline-end:36px !important}.pa-md-9{padding:36px !important}.pt-md-10,.py-md-10{padding-top:40px !important}.pr-md-10,.px-md-10{padding-right:40px !important}.pl-md-10,.px-md-10{padding-left:40px !important}.pb-md-10,.py-md-10{padding-bottom:40px !important}.ps-md-10{padding-inline-start:40px !important}.pe-md-10{padding-inline-end:40px !important}.pa-md-10{padding:40px !important}.pt-md-11,.py-md-11{padding-top:44px !important}.pr-md-11,.px-md-11{padding-right:44px !important}.pl-md-11,.px-md-11{padding-left:44px !important}.pb-md-11,.py-md-11{padding-bottom:44px !important}.ps-md-11{padding-inline-start:44px !important}.pe-md-11{padding-inline-end:44px !important}.pa-md-11{padding:44px !important}.pt-md-12,.py-md-12{padding-top:48px !important}.pr-md-12,.px-md-12{padding-right:48px !important}.pl-md-12,.px-md-12{padding-left:48px !important}.pb-md-12,.py-md-12{padding-bottom:48px !important}.ps-md-12{padding-inline-start:48px !important}.pe-md-12{padding-inline-end:48px !important}.pa-md-12{padding:48px !important}.pt-md-13,.py-md-13{padding-top:52px !important}.pr-md-13,.px-md-13{padding-right:52px !important}.pl-md-13,.px-md-13{padding-left:52px !important}.pb-md-13,.py-md-13{padding-bottom:52px !important}.ps-md-13{padding-inline-start:52px !important}.pe-md-13{padding-inline-end:52px !important}.pa-md-13{padding:52px !important}.pt-md-14,.py-md-14{padding-top:56px !important}.pr-md-14,.px-md-14{padding-right:56px !important}.pl-md-14,.px-md-14{padding-left:56px !important}.pb-md-14,.py-md-14{padding-bottom:56px !important}.ps-md-14{padding-inline-start:56px !important}.pe-md-14{padding-inline-end:56px !important}.pa-md-14{padding:56px !important}.pt-md-15,.py-md-15{padding-top:60px !important}.pr-md-15,.px-md-15{padding-right:60px !important}.pl-md-15,.px-md-15{padding-left:60px !important}.pb-md-15,.py-md-15{padding-bottom:60px !important}.ps-md-15{padding-inline-start:60px !important}.pe-md-15{padding-inline-end:60px !important}.pa-md-15{padding:60px !important}.pt-md-16,.py-md-16{padding-top:64px !important}.pr-md-16,.px-md-16{padding-right:64px !important}.pl-md-16,.px-md-16{padding-left:64px !important}.pb-md-16,.py-md-16{padding-bottom:64px !important}.ps-md-16{padding-inline-start:64px !important}.pe-md-16{padding-inline-end:64px !important}.pa-md-16{padding:64px !important}.pt-md-17,.py-md-17{padding-top:68px !important}.pr-md-17,.px-md-17{padding-right:68px !important}.pl-md-17,.px-md-17{padding-left:68px !important}.pb-md-17,.py-md-17{padding-bottom:68px !important}.ps-md-17{padding-inline-start:68px !important}.pe-md-17{padding-inline-end:68px !important}.pa-md-17{padding:68px !important}.pt-md-18,.py-md-18{padding-top:72px !important}.pr-md-18,.px-md-18{padding-right:72px !important}.pl-md-18,.px-md-18{padding-left:72px !important}.pb-md-18,.py-md-18{padding-bottom:72px !important}.ps-md-18{padding-inline-start:72px !important}.pe-md-18{padding-inline-end:72px !important}.pa-md-18{padding:72px !important}.pt-md-19,.py-md-19{padding-top:76px !important}.pr-md-19,.px-md-19{padding-right:76px !important}.pl-md-19,.px-md-19{padding-left:76px !important}.pb-md-19,.py-md-19{padding-bottom:76px !important}.ps-md-19{padding-inline-start:76px !important}.pe-md-19{padding-inline-end:76px !important}.pa-md-19{padding:76px !important}.pt-md-20,.py-md-20{padding-top:80px !important}.pr-md-20,.px-md-20{padding-right:80px !important}.pl-md-20,.px-md-20{padding-left:80px !important}.pb-md-20,.py-md-20{padding-bottom:80px !important}.ps-md-20{padding-inline-start:80px !important}.pe-md-20{padding-inline-end:80px !important}.pa-md-20{padding:80px !important}.pt-md-auto,.py-md-auto{padding-top:auto !important}.pr-md-auto,.px-md-auto{padding-right:auto !important}.pl-md-auto,.px-md-auto{padding-left:auto !important}.pb-md-auto,.py-md-auto{padding-bottom:auto !important}.ps-md-auto{padding-inline-start:auto !important}.pe-md-auto{padding-inline-end:auto !important}.pa-md-auto{padding:auto !important}.mt-md-n1,.my-md-n1{margin-top:-4px !important}.mr-md-n1,.mx-md-n1{margin-right:-4px !important}.ml-md-n1,.mx-md-n1{margin-left:-4px !important}.mb-md-n1,.my-md-n1{margin-bottom:-4px !important}.ms-md-n1{margin-inline-start:-4px !important}.me-md-n1{margin-inline-end:-4px !important}.ma-md-n1{margin:-4px !important}.mt-md-n2,.my-md-n2{margin-top:-8px !important}.mr-md-n2,.mx-md-n2{margin-right:-8px !important}.ml-md-n2,.mx-md-n2{margin-left:-8px !important}.mb-md-n2,.my-md-n2{margin-bottom:-8px !important}.ms-md-n2{margin-inline-start:-8px !important}.me-md-n2{margin-inline-end:-8px !important}.ma-md-n2{margin:-8px !important}.mt-md-n3,.my-md-n3{margin-top:-12px !important}.mr-md-n3,.mx-md-n3{margin-right:-12px !important}.ml-md-n3,.mx-md-n3{margin-left:-12px !important}.mb-md-n3,.my-md-n3{margin-bottom:-12px !important}.ms-md-n3{margin-inline-start:-12px !important}.me-md-n3{margin-inline-end:-12px !important}.ma-md-n3{margin:-12px !important}.mt-md-n4,.my-md-n4{margin-top:-16px !important}.mr-md-n4,.mx-md-n4{margin-right:-16px !important}.ml-md-n4,.mx-md-n4{margin-left:-16px !important}.mb-md-n4,.my-md-n4{margin-bottom:-16px !important}.ms-md-n4{margin-inline-start:-16px !important}.me-md-n4{margin-inline-end:-16px !important}.ma-md-n4{margin:-16px !important}.mt-md-n5,.my-md-n5{margin-top:-20px !important}.mr-md-n5,.mx-md-n5{margin-right:-20px !important}.ml-md-n5,.mx-md-n5{margin-left:-20px !important}.mb-md-n5,.my-md-n5{margin-bottom:-20px !important}.ms-md-n5{margin-inline-start:-20px !important}.me-md-n5{margin-inline-end:-20px !important}.ma-md-n5{margin:-20px !important}.mt-md-n6,.my-md-n6{margin-top:-24px !important}.mr-md-n6,.mx-md-n6{margin-right:-24px !important}.ml-md-n6,.mx-md-n6{margin-left:-24px !important}.mb-md-n6,.my-md-n6{margin-bottom:-24px !important}.ms-md-n6{margin-inline-start:-24px !important}.me-md-n6{margin-inline-end:-24px !important}.ma-md-n6{margin:-24px !important}.mt-md-n7,.my-md-n7{margin-top:-28px !important}.mr-md-n7,.mx-md-n7{margin-right:-28px !important}.ml-md-n7,.mx-md-n7{margin-left:-28px !important}.mb-md-n7,.my-md-n7{margin-bottom:-28px !important}.ms-md-n7{margin-inline-start:-28px !important}.me-md-n7{margin-inline-end:-28px !important}.ma-md-n7{margin:-28px !important}.mt-md-n8,.my-md-n8{margin-top:-32px !important}.mr-md-n8,.mx-md-n8{margin-right:-32px !important}.ml-md-n8,.mx-md-n8{margin-left:-32px !important}.mb-md-n8,.my-md-n8{margin-bottom:-32px !important}.ms-md-n8{margin-inline-start:-32px !important}.me-md-n8{margin-inline-end:-32px !important}.ma-md-n8{margin:-32px !important}.mt-md-n9,.my-md-n9{margin-top:-36px !important}.mr-md-n9,.mx-md-n9{margin-right:-36px !important}.ml-md-n9,.mx-md-n9{margin-left:-36px !important}.mb-md-n9,.my-md-n9{margin-bottom:-36px !important}.ms-md-n9{margin-inline-start:-36px !important}.me-md-n9{margin-inline-end:-36px !important}.ma-md-n9{margin:-36px !important}.mt-md-n10,.my-md-n10{margin-top:-40px !important}.mr-md-n10,.mx-md-n10{margin-right:-40px !important}.ml-md-n10,.mx-md-n10{margin-left:-40px !important}.mb-md-n10,.my-md-n10{margin-bottom:-40px !important}.ms-md-n10{margin-inline-start:-40px !important}.me-md-n10{margin-inline-end:-40px !important}.ma-md-n10{margin:-40px !important}.mt-md-n11,.my-md-n11{margin-top:-44px !important}.mr-md-n11,.mx-md-n11{margin-right:-44px !important}.ml-md-n11,.mx-md-n11{margin-left:-44px !important}.mb-md-n11,.my-md-n11{margin-bottom:-44px !important}.ms-md-n11{margin-inline-start:-44px !important}.me-md-n11{margin-inline-end:-44px !important}.ma-md-n11{margin:-44px !important}.mt-md-n12,.my-md-n12{margin-top:-48px !important}.mr-md-n12,.mx-md-n12{margin-right:-48px !important}.ml-md-n12,.mx-md-n12{margin-left:-48px !important}.mb-md-n12,.my-md-n12{margin-bottom:-48px !important}.ms-md-n12{margin-inline-start:-48px !important}.me-md-n12{margin-inline-end:-48px !important}.ma-md-n12{margin:-48px !important}.mt-md-n13,.my-md-n13{margin-top:-52px !important}.mr-md-n13,.mx-md-n13{margin-right:-52px !important}.ml-md-n13,.mx-md-n13{margin-left:-52px !important}.mb-md-n13,.my-md-n13{margin-bottom:-52px !important}.ms-md-n13{margin-inline-start:-52px !important}.me-md-n13{margin-inline-end:-52px !important}.ma-md-n13{margin:-52px !important}.mt-md-n14,.my-md-n14{margin-top:-56px !important}.mr-md-n14,.mx-md-n14{margin-right:-56px !important}.ml-md-n14,.mx-md-n14{margin-left:-56px !important}.mb-md-n14,.my-md-n14{margin-bottom:-56px !important}.ms-md-n14{margin-inline-start:-56px !important}.me-md-n14{margin-inline-end:-56px !important}.ma-md-n14{margin:-56px !important}.mt-md-n15,.my-md-n15{margin-top:-60px !important}.mr-md-n15,.mx-md-n15{margin-right:-60px !important}.ml-md-n15,.mx-md-n15{margin-left:-60px !important}.mb-md-n15,.my-md-n15{margin-bottom:-60px !important}.ms-md-n15{margin-inline-start:-60px !important}.me-md-n15{margin-inline-end:-60px !important}.ma-md-n15{margin:-60px !important}.mt-md-n16,.my-md-n16{margin-top:-64px !important}.mr-md-n16,.mx-md-n16{margin-right:-64px !important}.ml-md-n16,.mx-md-n16{margin-left:-64px !important}.mb-md-n16,.my-md-n16{margin-bottom:-64px !important}.ms-md-n16{margin-inline-start:-64px !important}.me-md-n16{margin-inline-end:-64px !important}.ma-md-n16{margin:-64px !important}.mt-md-n17,.my-md-n17{margin-top:-68px !important}.mr-md-n17,.mx-md-n17{margin-right:-68px !important}.ml-md-n17,.mx-md-n17{margin-left:-68px !important}.mb-md-n17,.my-md-n17{margin-bottom:-68px !important}.ms-md-n17{margin-inline-start:-68px !important}.me-md-n17{margin-inline-end:-68px !important}.ma-md-n17{margin:-68px !important}.mt-md-n18,.my-md-n18{margin-top:-72px !important}.mr-md-n18,.mx-md-n18{margin-right:-72px !important}.ml-md-n18,.mx-md-n18{margin-left:-72px !important}.mb-md-n18,.my-md-n18{margin-bottom:-72px !important}.ms-md-n18{margin-inline-start:-72px !important}.me-md-n18{margin-inline-end:-72px !important}.ma-md-n18{margin:-72px !important}.mt-md-n19,.my-md-n19{margin-top:-76px !important}.mr-md-n19,.mx-md-n19{margin-right:-76px !important}.ml-md-n19,.mx-md-n19{margin-left:-76px !important}.mb-md-n19,.my-md-n19{margin-bottom:-76px !important}.ms-md-n19{margin-inline-start:-76px !important}.me-md-n19{margin-inline-end:-76px !important}.ma-md-n19{margin:-76px !important}.mt-md-n20,.my-md-n20{margin-top:-80px !important}.mr-md-n20,.mx-md-n20{margin-right:-80px !important}.ml-md-n20,.mx-md-n20{margin-left:-80px !important}.mb-md-n20,.my-md-n20{margin-bottom:-80px !important}.ms-md-n20{margin-inline-start:-80px !important}.me-md-n20{margin-inline-end:-80px !important}.ma-md-n20{margin:-80px !important}}@media screen and (min-width: 1280px){.mt-lg-0,.my-lg-0{margin-top:0 !important}.mr-lg-0,.mx-lg-0{margin-right:0 !important}.ml-lg-0,.mx-lg-0{margin-left:0 !important}.mb-lg-0,.my-lg-0{margin-bottom:0 !important}.ms-lg-0{margin-inline-start:0 !important}.me-lg-0{margin-inline-end:0 !important}.ma-lg-0{margin:0 !important}.mt-lg-1,.my-lg-1{margin-top:4px !important}.mr-lg-1,.mx-lg-1{margin-right:4px !important}.ml-lg-1,.mx-lg-1{margin-left:4px !important}.mb-lg-1,.my-lg-1{margin-bottom:4px !important}.ms-lg-1{margin-inline-start:4px !important}.me-lg-1{margin-inline-end:4px !important}.ma-lg-1{margin:4px !important}.mt-lg-2,.my-lg-2{margin-top:8px !important}.mr-lg-2,.mx-lg-2{margin-right:8px !important}.ml-lg-2,.mx-lg-2{margin-left:8px !important}.mb-lg-2,.my-lg-2{margin-bottom:8px !important}.ms-lg-2{margin-inline-start:8px !important}.me-lg-2{margin-inline-end:8px !important}.ma-lg-2{margin:8px !important}.mt-lg-3,.my-lg-3{margin-top:12px !important}.mr-lg-3,.mx-lg-3{margin-right:12px !important}.ml-lg-3,.mx-lg-3{margin-left:12px !important}.mb-lg-3,.my-lg-3{margin-bottom:12px !important}.ms-lg-3{margin-inline-start:12px !important}.me-lg-3{margin-inline-end:12px !important}.ma-lg-3{margin:12px !important}.mt-lg-4,.my-lg-4{margin-top:16px !important}.mr-lg-4,.mx-lg-4{margin-right:16px !important}.ml-lg-4,.mx-lg-4{margin-left:16px !important}.mb-lg-4,.my-lg-4{margin-bottom:16px !important}.ms-lg-4{margin-inline-start:16px !important}.me-lg-4{margin-inline-end:16px !important}.ma-lg-4{margin:16px !important}.mt-lg-5,.my-lg-5{margin-top:20px !important}.mr-lg-5,.mx-lg-5{margin-right:20px !important}.ml-lg-5,.mx-lg-5{margin-left:20px !important}.mb-lg-5,.my-lg-5{margin-bottom:20px !important}.ms-lg-5{margin-inline-start:20px !important}.me-lg-5{margin-inline-end:20px !important}.ma-lg-5{margin:20px !important}.mt-lg-6,.my-lg-6{margin-top:24px !important}.mr-lg-6,.mx-lg-6{margin-right:24px !important}.ml-lg-6,.mx-lg-6{margin-left:24px !important}.mb-lg-6,.my-lg-6{margin-bottom:24px !important}.ms-lg-6{margin-inline-start:24px !important}.me-lg-6{margin-inline-end:24px !important}.ma-lg-6{margin:24px !important}.mt-lg-7,.my-lg-7{margin-top:28px !important}.mr-lg-7,.mx-lg-7{margin-right:28px !important}.ml-lg-7,.mx-lg-7{margin-left:28px !important}.mb-lg-7,.my-lg-7{margin-bottom:28px !important}.ms-lg-7{margin-inline-start:28px !important}.me-lg-7{margin-inline-end:28px !important}.ma-lg-7{margin:28px !important}.mt-lg-8,.my-lg-8{margin-top:32px !important}.mr-lg-8,.mx-lg-8{margin-right:32px !important}.ml-lg-8,.mx-lg-8{margin-left:32px !important}.mb-lg-8,.my-lg-8{margin-bottom:32px !important}.ms-lg-8{margin-inline-start:32px !important}.me-lg-8{margin-inline-end:32px !important}.ma-lg-8{margin:32px !important}.mt-lg-9,.my-lg-9{margin-top:36px !important}.mr-lg-9,.mx-lg-9{margin-right:36px !important}.ml-lg-9,.mx-lg-9{margin-left:36px !important}.mb-lg-9,.my-lg-9{margin-bottom:36px !important}.ms-lg-9{margin-inline-start:36px !important}.me-lg-9{margin-inline-end:36px !important}.ma-lg-9{margin:36px !important}.mt-lg-10,.my-lg-10{margin-top:40px !important}.mr-lg-10,.mx-lg-10{margin-right:40px !important}.ml-lg-10,.mx-lg-10{margin-left:40px !important}.mb-lg-10,.my-lg-10{margin-bottom:40px !important}.ms-lg-10{margin-inline-start:40px !important}.me-lg-10{margin-inline-end:40px !important}.ma-lg-10{margin:40px !important}.mt-lg-11,.my-lg-11{margin-top:44px !important}.mr-lg-11,.mx-lg-11{margin-right:44px !important}.ml-lg-11,.mx-lg-11{margin-left:44px !important}.mb-lg-11,.my-lg-11{margin-bottom:44px !important}.ms-lg-11{margin-inline-start:44px !important}.me-lg-11{margin-inline-end:44px !important}.ma-lg-11{margin:44px !important}.mt-lg-12,.my-lg-12{margin-top:48px !important}.mr-lg-12,.mx-lg-12{margin-right:48px !important}.ml-lg-12,.mx-lg-12{margin-left:48px !important}.mb-lg-12,.my-lg-12{margin-bottom:48px !important}.ms-lg-12{margin-inline-start:48px !important}.me-lg-12{margin-inline-end:48px !important}.ma-lg-12{margin:48px !important}.mt-lg-13,.my-lg-13{margin-top:52px !important}.mr-lg-13,.mx-lg-13{margin-right:52px !important}.ml-lg-13,.mx-lg-13{margin-left:52px !important}.mb-lg-13,.my-lg-13{margin-bottom:52px !important}.ms-lg-13{margin-inline-start:52px !important}.me-lg-13{margin-inline-end:52px !important}.ma-lg-13{margin:52px !important}.mt-lg-14,.my-lg-14{margin-top:56px !important}.mr-lg-14,.mx-lg-14{margin-right:56px !important}.ml-lg-14,.mx-lg-14{margin-left:56px !important}.mb-lg-14,.my-lg-14{margin-bottom:56px !important}.ms-lg-14{margin-inline-start:56px !important}.me-lg-14{margin-inline-end:56px !important}.ma-lg-14{margin:56px !important}.mt-lg-15,.my-lg-15{margin-top:60px !important}.mr-lg-15,.mx-lg-15{margin-right:60px !important}.ml-lg-15,.mx-lg-15{margin-left:60px !important}.mb-lg-15,.my-lg-15{margin-bottom:60px !important}.ms-lg-15{margin-inline-start:60px !important}.me-lg-15{margin-inline-end:60px !important}.ma-lg-15{margin:60px !important}.mt-lg-16,.my-lg-16{margin-top:64px !important}.mr-lg-16,.mx-lg-16{margin-right:64px !important}.ml-lg-16,.mx-lg-16{margin-left:64px !important}.mb-lg-16,.my-lg-16{margin-bottom:64px !important}.ms-lg-16{margin-inline-start:64px !important}.me-lg-16{margin-inline-end:64px !important}.ma-lg-16{margin:64px !important}.mt-lg-17,.my-lg-17{margin-top:68px !important}.mr-lg-17,.mx-lg-17{margin-right:68px !important}.ml-lg-17,.mx-lg-17{margin-left:68px !important}.mb-lg-17,.my-lg-17{margin-bottom:68px !important}.ms-lg-17{margin-inline-start:68px !important}.me-lg-17{margin-inline-end:68px !important}.ma-lg-17{margin:68px !important}.mt-lg-18,.my-lg-18{margin-top:72px !important}.mr-lg-18,.mx-lg-18{margin-right:72px !important}.ml-lg-18,.mx-lg-18{margin-left:72px !important}.mb-lg-18,.my-lg-18{margin-bottom:72px !important}.ms-lg-18{margin-inline-start:72px !important}.me-lg-18{margin-inline-end:72px !important}.ma-lg-18{margin:72px !important}.mt-lg-19,.my-lg-19{margin-top:76px !important}.mr-lg-19,.mx-lg-19{margin-right:76px !important}.ml-lg-19,.mx-lg-19{margin-left:76px !important}.mb-lg-19,.my-lg-19{margin-bottom:76px !important}.ms-lg-19{margin-inline-start:76px !important}.me-lg-19{margin-inline-end:76px !important}.ma-lg-19{margin:76px !important}.mt-lg-20,.my-lg-20{margin-top:80px !important}.mr-lg-20,.mx-lg-20{margin-right:80px !important}.ml-lg-20,.mx-lg-20{margin-left:80px !important}.mb-lg-20,.my-lg-20{margin-bottom:80px !important}.ms-lg-20{margin-inline-start:80px !important}.me-lg-20{margin-inline-end:80px !important}.ma-lg-20{margin:80px !important}.mt-lg-auto,.my-lg-auto{margin-top:auto !important}.mr-lg-auto,.mx-lg-auto{margin-right:auto !important}.ml-lg-auto,.mx-lg-auto{margin-left:auto !important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto !important}.ms-lg-auto{margin-inline-start:auto !important}.me-lg-auto{margin-inline-end:auto !important}.ma-lg-auto{margin:auto !important}.pt-lg-0,.py-lg-0{padding-top:0 !important}.pr-lg-0,.px-lg-0{padding-right:0 !important}.pl-lg-0,.px-lg-0{padding-left:0 !important}.pb-lg-0,.py-lg-0{padding-bottom:0 !important}.ps-lg-0{padding-inline-start:0 !important}.pe-lg-0{padding-inline-end:0 !important}.pa-lg-0{padding:0 !important}.pt-lg-1,.py-lg-1{padding-top:4px !important}.pr-lg-1,.px-lg-1{padding-right:4px !important}.pl-lg-1,.px-lg-1{padding-left:4px !important}.pb-lg-1,.py-lg-1{padding-bottom:4px !important}.ps-lg-1{padding-inline-start:4px !important}.pe-lg-1{padding-inline-end:4px !important}.pa-lg-1{padding:4px !important}.pt-lg-2,.py-lg-2{padding-top:8px !important}.pr-lg-2,.px-lg-2{padding-right:8px !important}.pl-lg-2,.px-lg-2{padding-left:8px !important}.pb-lg-2,.py-lg-2{padding-bottom:8px !important}.ps-lg-2{padding-inline-start:8px !important}.pe-lg-2{padding-inline-end:8px !important}.pa-lg-2{padding:8px !important}.pt-lg-3,.py-lg-3{padding-top:12px !important}.pr-lg-3,.px-lg-3{padding-right:12px !important}.pl-lg-3,.px-lg-3{padding-left:12px !important}.pb-lg-3,.py-lg-3{padding-bottom:12px !important}.ps-lg-3{padding-inline-start:12px !important}.pe-lg-3{padding-inline-end:12px !important}.pa-lg-3{padding:12px !important}.pt-lg-4,.py-lg-4{padding-top:16px !important}.pr-lg-4,.px-lg-4{padding-right:16px !important}.pl-lg-4,.px-lg-4{padding-left:16px !important}.pb-lg-4,.py-lg-4{padding-bottom:16px !important}.ps-lg-4{padding-inline-start:16px !important}.pe-lg-4{padding-inline-end:16px !important}.pa-lg-4{padding:16px !important}.pt-lg-5,.py-lg-5{padding-top:20px !important}.pr-lg-5,.px-lg-5{padding-right:20px !important}.pl-lg-5,.px-lg-5{padding-left:20px !important}.pb-lg-5,.py-lg-5{padding-bottom:20px !important}.ps-lg-5{padding-inline-start:20px !important}.pe-lg-5{padding-inline-end:20px !important}.pa-lg-5{padding:20px !important}.pt-lg-6,.py-lg-6{padding-top:24px !important}.pr-lg-6,.px-lg-6{padding-right:24px !important}.pl-lg-6,.px-lg-6{padding-left:24px !important}.pb-lg-6,.py-lg-6{padding-bottom:24px !important}.ps-lg-6{padding-inline-start:24px !important}.pe-lg-6{padding-inline-end:24px !important}.pa-lg-6{padding:24px !important}.pt-lg-7,.py-lg-7{padding-top:28px !important}.pr-lg-7,.px-lg-7{padding-right:28px !important}.pl-lg-7,.px-lg-7{padding-left:28px !important}.pb-lg-7,.py-lg-7{padding-bottom:28px !important}.ps-lg-7{padding-inline-start:28px !important}.pe-lg-7{padding-inline-end:28px !important}.pa-lg-7{padding:28px !important}.pt-lg-8,.py-lg-8{padding-top:32px !important}.pr-lg-8,.px-lg-8{padding-right:32px !important}.pl-lg-8,.px-lg-8{padding-left:32px !important}.pb-lg-8,.py-lg-8{padding-bottom:32px !important}.ps-lg-8{padding-inline-start:32px !important}.pe-lg-8{padding-inline-end:32px !important}.pa-lg-8{padding:32px !important}.pt-lg-9,.py-lg-9{padding-top:36px !important}.pr-lg-9,.px-lg-9{padding-right:36px !important}.pl-lg-9,.px-lg-9{padding-left:36px !important}.pb-lg-9,.py-lg-9{padding-bottom:36px !important}.ps-lg-9{padding-inline-start:36px !important}.pe-lg-9{padding-inline-end:36px !important}.pa-lg-9{padding:36px !important}.pt-lg-10,.py-lg-10{padding-top:40px !important}.pr-lg-10,.px-lg-10{padding-right:40px !important}.pl-lg-10,.px-lg-10{padding-left:40px !important}.pb-lg-10,.py-lg-10{padding-bottom:40px !important}.ps-lg-10{padding-inline-start:40px !important}.pe-lg-10{padding-inline-end:40px !important}.pa-lg-10{padding:40px !important}.pt-lg-11,.py-lg-11{padding-top:44px !important}.pr-lg-11,.px-lg-11{padding-right:44px !important}.pl-lg-11,.px-lg-11{padding-left:44px !important}.pb-lg-11,.py-lg-11{padding-bottom:44px !important}.ps-lg-11{padding-inline-start:44px !important}.pe-lg-11{padding-inline-end:44px !important}.pa-lg-11{padding:44px !important}.pt-lg-12,.py-lg-12{padding-top:48px !important}.pr-lg-12,.px-lg-12{padding-right:48px !important}.pl-lg-12,.px-lg-12{padding-left:48px !important}.pb-lg-12,.py-lg-12{padding-bottom:48px !important}.ps-lg-12{padding-inline-start:48px !important}.pe-lg-12{padding-inline-end:48px !important}.pa-lg-12{padding:48px !important}.pt-lg-13,.py-lg-13{padding-top:52px !important}.pr-lg-13,.px-lg-13{padding-right:52px !important}.pl-lg-13,.px-lg-13{padding-left:52px !important}.pb-lg-13,.py-lg-13{padding-bottom:52px !important}.ps-lg-13{padding-inline-start:52px !important}.pe-lg-13{padding-inline-end:52px !important}.pa-lg-13{padding:52px !important}.pt-lg-14,.py-lg-14{padding-top:56px !important}.pr-lg-14,.px-lg-14{padding-right:56px !important}.pl-lg-14,.px-lg-14{padding-left:56px !important}.pb-lg-14,.py-lg-14{padding-bottom:56px !important}.ps-lg-14{padding-inline-start:56px !important}.pe-lg-14{padding-inline-end:56px !important}.pa-lg-14{padding:56px !important}.pt-lg-15,.py-lg-15{padding-top:60px !important}.pr-lg-15,.px-lg-15{padding-right:60px !important}.pl-lg-15,.px-lg-15{padding-left:60px !important}.pb-lg-15,.py-lg-15{padding-bottom:60px !important}.ps-lg-15{padding-inline-start:60px !important}.pe-lg-15{padding-inline-end:60px !important}.pa-lg-15{padding:60px !important}.pt-lg-16,.py-lg-16{padding-top:64px !important}.pr-lg-16,.px-lg-16{padding-right:64px !important}.pl-lg-16,.px-lg-16{padding-left:64px !important}.pb-lg-16,.py-lg-16{padding-bottom:64px !important}.ps-lg-16{padding-inline-start:64px !important}.pe-lg-16{padding-inline-end:64px !important}.pa-lg-16{padding:64px !important}.pt-lg-17,.py-lg-17{padding-top:68px !important}.pr-lg-17,.px-lg-17{padding-right:68px !important}.pl-lg-17,.px-lg-17{padding-left:68px !important}.pb-lg-17,.py-lg-17{padding-bottom:68px !important}.ps-lg-17{padding-inline-start:68px !important}.pe-lg-17{padding-inline-end:68px !important}.pa-lg-17{padding:68px !important}.pt-lg-18,.py-lg-18{padding-top:72px !important}.pr-lg-18,.px-lg-18{padding-right:72px !important}.pl-lg-18,.px-lg-18{padding-left:72px !important}.pb-lg-18,.py-lg-18{padding-bottom:72px !important}.ps-lg-18{padding-inline-start:72px !important}.pe-lg-18{padding-inline-end:72px !important}.pa-lg-18{padding:72px !important}.pt-lg-19,.py-lg-19{padding-top:76px !important}.pr-lg-19,.px-lg-19{padding-right:76px !important}.pl-lg-19,.px-lg-19{padding-left:76px !important}.pb-lg-19,.py-lg-19{padding-bottom:76px !important}.ps-lg-19{padding-inline-start:76px !important}.pe-lg-19{padding-inline-end:76px !important}.pa-lg-19{padding:76px !important}.pt-lg-20,.py-lg-20{padding-top:80px !important}.pr-lg-20,.px-lg-20{padding-right:80px !important}.pl-lg-20,.px-lg-20{padding-left:80px !important}.pb-lg-20,.py-lg-20{padding-bottom:80px !important}.ps-lg-20{padding-inline-start:80px !important}.pe-lg-20{padding-inline-end:80px !important}.pa-lg-20{padding:80px !important}.pt-lg-auto,.py-lg-auto{padding-top:auto !important}.pr-lg-auto,.px-lg-auto{padding-right:auto !important}.pl-lg-auto,.px-lg-auto{padding-left:auto !important}.pb-lg-auto,.py-lg-auto{padding-bottom:auto !important}.ps-lg-auto{padding-inline-start:auto !important}.pe-lg-auto{padding-inline-end:auto !important}.pa-lg-auto{padding:auto !important}.mt-lg-n1,.my-lg-n1{margin-top:-4px !important}.mr-lg-n1,.mx-lg-n1{margin-right:-4px !important}.ml-lg-n1,.mx-lg-n1{margin-left:-4px !important}.mb-lg-n1,.my-lg-n1{margin-bottom:-4px !important}.ms-lg-n1{margin-inline-start:-4px !important}.me-lg-n1{margin-inline-end:-4px !important}.ma-lg-n1{margin:-4px !important}.mt-lg-n2,.my-lg-n2{margin-top:-8px !important}.mr-lg-n2,.mx-lg-n2{margin-right:-8px !important}.ml-lg-n2,.mx-lg-n2{margin-left:-8px !important}.mb-lg-n2,.my-lg-n2{margin-bottom:-8px !important}.ms-lg-n2{margin-inline-start:-8px !important}.me-lg-n2{margin-inline-end:-8px !important}.ma-lg-n2{margin:-8px !important}.mt-lg-n3,.my-lg-n3{margin-top:-12px !important}.mr-lg-n3,.mx-lg-n3{margin-right:-12px !important}.ml-lg-n3,.mx-lg-n3{margin-left:-12px !important}.mb-lg-n3,.my-lg-n3{margin-bottom:-12px !important}.ms-lg-n3{margin-inline-start:-12px !important}.me-lg-n3{margin-inline-end:-12px !important}.ma-lg-n3{margin:-12px !important}.mt-lg-n4,.my-lg-n4{margin-top:-16px !important}.mr-lg-n4,.mx-lg-n4{margin-right:-16px !important}.ml-lg-n4,.mx-lg-n4{margin-left:-16px !important}.mb-lg-n4,.my-lg-n4{margin-bottom:-16px !important}.ms-lg-n4{margin-inline-start:-16px !important}.me-lg-n4{margin-inline-end:-16px !important}.ma-lg-n4{margin:-16px !important}.mt-lg-n5,.my-lg-n5{margin-top:-20px !important}.mr-lg-n5,.mx-lg-n5{margin-right:-20px !important}.ml-lg-n5,.mx-lg-n5{margin-left:-20px !important}.mb-lg-n5,.my-lg-n5{margin-bottom:-20px !important}.ms-lg-n5{margin-inline-start:-20px !important}.me-lg-n5{margin-inline-end:-20px !important}.ma-lg-n5{margin:-20px !important}.mt-lg-n6,.my-lg-n6{margin-top:-24px !important}.mr-lg-n6,.mx-lg-n6{margin-right:-24px !important}.ml-lg-n6,.mx-lg-n6{margin-left:-24px !important}.mb-lg-n6,.my-lg-n6{margin-bottom:-24px !important}.ms-lg-n6{margin-inline-start:-24px !important}.me-lg-n6{margin-inline-end:-24px !important}.ma-lg-n6{margin:-24px !important}.mt-lg-n7,.my-lg-n7{margin-top:-28px !important}.mr-lg-n7,.mx-lg-n7{margin-right:-28px !important}.ml-lg-n7,.mx-lg-n7{margin-left:-28px !important}.mb-lg-n7,.my-lg-n7{margin-bottom:-28px !important}.ms-lg-n7{margin-inline-start:-28px !important}.me-lg-n7{margin-inline-end:-28px !important}.ma-lg-n7{margin:-28px !important}.mt-lg-n8,.my-lg-n8{margin-top:-32px !important}.mr-lg-n8,.mx-lg-n8{margin-right:-32px !important}.ml-lg-n8,.mx-lg-n8{margin-left:-32px !important}.mb-lg-n8,.my-lg-n8{margin-bottom:-32px !important}.ms-lg-n8{margin-inline-start:-32px !important}.me-lg-n8{margin-inline-end:-32px !important}.ma-lg-n8{margin:-32px !important}.mt-lg-n9,.my-lg-n9{margin-top:-36px !important}.mr-lg-n9,.mx-lg-n9{margin-right:-36px !important}.ml-lg-n9,.mx-lg-n9{margin-left:-36px !important}.mb-lg-n9,.my-lg-n9{margin-bottom:-36px !important}.ms-lg-n9{margin-inline-start:-36px !important}.me-lg-n9{margin-inline-end:-36px !important}.ma-lg-n9{margin:-36px !important}.mt-lg-n10,.my-lg-n10{margin-top:-40px !important}.mr-lg-n10,.mx-lg-n10{margin-right:-40px !important}.ml-lg-n10,.mx-lg-n10{margin-left:-40px !important}.mb-lg-n10,.my-lg-n10{margin-bottom:-40px !important}.ms-lg-n10{margin-inline-start:-40px !important}.me-lg-n10{margin-inline-end:-40px !important}.ma-lg-n10{margin:-40px !important}.mt-lg-n11,.my-lg-n11{margin-top:-44px !important}.mr-lg-n11,.mx-lg-n11{margin-right:-44px !important}.ml-lg-n11,.mx-lg-n11{margin-left:-44px !important}.mb-lg-n11,.my-lg-n11{margin-bottom:-44px !important}.ms-lg-n11{margin-inline-start:-44px !important}.me-lg-n11{margin-inline-end:-44px !important}.ma-lg-n11{margin:-44px !important}.mt-lg-n12,.my-lg-n12{margin-top:-48px !important}.mr-lg-n12,.mx-lg-n12{margin-right:-48px !important}.ml-lg-n12,.mx-lg-n12{margin-left:-48px !important}.mb-lg-n12,.my-lg-n12{margin-bottom:-48px !important}.ms-lg-n12{margin-inline-start:-48px !important}.me-lg-n12{margin-inline-end:-48px !important}.ma-lg-n12{margin:-48px !important}.mt-lg-n13,.my-lg-n13{margin-top:-52px !important}.mr-lg-n13,.mx-lg-n13{margin-right:-52px !important}.ml-lg-n13,.mx-lg-n13{margin-left:-52px !important}.mb-lg-n13,.my-lg-n13{margin-bottom:-52px !important}.ms-lg-n13{margin-inline-start:-52px !important}.me-lg-n13{margin-inline-end:-52px !important}.ma-lg-n13{margin:-52px !important}.mt-lg-n14,.my-lg-n14{margin-top:-56px !important}.mr-lg-n14,.mx-lg-n14{margin-right:-56px !important}.ml-lg-n14,.mx-lg-n14{margin-left:-56px !important}.mb-lg-n14,.my-lg-n14{margin-bottom:-56px !important}.ms-lg-n14{margin-inline-start:-56px !important}.me-lg-n14{margin-inline-end:-56px !important}.ma-lg-n14{margin:-56px !important}.mt-lg-n15,.my-lg-n15{margin-top:-60px !important}.mr-lg-n15,.mx-lg-n15{margin-right:-60px !important}.ml-lg-n15,.mx-lg-n15{margin-left:-60px !important}.mb-lg-n15,.my-lg-n15{margin-bottom:-60px !important}.ms-lg-n15{margin-inline-start:-60px !important}.me-lg-n15{margin-inline-end:-60px !important}.ma-lg-n15{margin:-60px !important}.mt-lg-n16,.my-lg-n16{margin-top:-64px !important}.mr-lg-n16,.mx-lg-n16{margin-right:-64px !important}.ml-lg-n16,.mx-lg-n16{margin-left:-64px !important}.mb-lg-n16,.my-lg-n16{margin-bottom:-64px !important}.ms-lg-n16{margin-inline-start:-64px !important}.me-lg-n16{margin-inline-end:-64px !important}.ma-lg-n16{margin:-64px !important}.mt-lg-n17,.my-lg-n17{margin-top:-68px !important}.mr-lg-n17,.mx-lg-n17{margin-right:-68px !important}.ml-lg-n17,.mx-lg-n17{margin-left:-68px !important}.mb-lg-n17,.my-lg-n17{margin-bottom:-68px !important}.ms-lg-n17{margin-inline-start:-68px !important}.me-lg-n17{margin-inline-end:-68px !important}.ma-lg-n17{margin:-68px !important}.mt-lg-n18,.my-lg-n18{margin-top:-72px !important}.mr-lg-n18,.mx-lg-n18{margin-right:-72px !important}.ml-lg-n18,.mx-lg-n18{margin-left:-72px !important}.mb-lg-n18,.my-lg-n18{margin-bottom:-72px !important}.ms-lg-n18{margin-inline-start:-72px !important}.me-lg-n18{margin-inline-end:-72px !important}.ma-lg-n18{margin:-72px !important}.mt-lg-n19,.my-lg-n19{margin-top:-76px !important}.mr-lg-n19,.mx-lg-n19{margin-right:-76px !important}.ml-lg-n19,.mx-lg-n19{margin-left:-76px !important}.mb-lg-n19,.my-lg-n19{margin-bottom:-76px !important}.ms-lg-n19{margin-inline-start:-76px !important}.me-lg-n19{margin-inline-end:-76px !important}.ma-lg-n19{margin:-76px !important}.mt-lg-n20,.my-lg-n20{margin-top:-80px !important}.mr-lg-n20,.mx-lg-n20{margin-right:-80px !important}.ml-lg-n20,.mx-lg-n20{margin-left:-80px !important}.mb-lg-n20,.my-lg-n20{margin-bottom:-80px !important}.ms-lg-n20{margin-inline-start:-80px !important}.me-lg-n20{margin-inline-end:-80px !important}.ma-lg-n20{margin:-80px !important}}@media screen and (min-width: 1920px){.mt-xl-0,.my-xl-0{margin-top:0 !important}.mr-xl-0,.mx-xl-0{margin-right:0 !important}.ml-xl-0,.mx-xl-0{margin-left:0 !important}.mb-xl-0,.my-xl-0{margin-bottom:0 !important}.ms-xl-0{margin-inline-start:0 !important}.me-xl-0{margin-inline-end:0 !important}.ma-xl-0{margin:0 !important}.mt-xl-1,.my-xl-1{margin-top:4px !important}.mr-xl-1,.mx-xl-1{margin-right:4px !important}.ml-xl-1,.mx-xl-1{margin-left:4px !important}.mb-xl-1,.my-xl-1{margin-bottom:4px !important}.ms-xl-1{margin-inline-start:4px !important}.me-xl-1{margin-inline-end:4px !important}.ma-xl-1{margin:4px !important}.mt-xl-2,.my-xl-2{margin-top:8px !important}.mr-xl-2,.mx-xl-2{margin-right:8px !important}.ml-xl-2,.mx-xl-2{margin-left:8px !important}.mb-xl-2,.my-xl-2{margin-bottom:8px !important}.ms-xl-2{margin-inline-start:8px !important}.me-xl-2{margin-inline-end:8px !important}.ma-xl-2{margin:8px !important}.mt-xl-3,.my-xl-3{margin-top:12px !important}.mr-xl-3,.mx-xl-3{margin-right:12px !important}.ml-xl-3,.mx-xl-3{margin-left:12px !important}.mb-xl-3,.my-xl-3{margin-bottom:12px !important}.ms-xl-3{margin-inline-start:12px !important}.me-xl-3{margin-inline-end:12px !important}.ma-xl-3{margin:12px !important}.mt-xl-4,.my-xl-4{margin-top:16px !important}.mr-xl-4,.mx-xl-4{margin-right:16px !important}.ml-xl-4,.mx-xl-4{margin-left:16px !important}.mb-xl-4,.my-xl-4{margin-bottom:16px !important}.ms-xl-4{margin-inline-start:16px !important}.me-xl-4{margin-inline-end:16px !important}.ma-xl-4{margin:16px !important}.mt-xl-5,.my-xl-5{margin-top:20px !important}.mr-xl-5,.mx-xl-5{margin-right:20px !important}.ml-xl-5,.mx-xl-5{margin-left:20px !important}.mb-xl-5,.my-xl-5{margin-bottom:20px !important}.ms-xl-5{margin-inline-start:20px !important}.me-xl-5{margin-inline-end:20px !important}.ma-xl-5{margin:20px !important}.mt-xl-6,.my-xl-6{margin-top:24px !important}.mr-xl-6,.mx-xl-6{margin-right:24px !important}.ml-xl-6,.mx-xl-6{margin-left:24px !important}.mb-xl-6,.my-xl-6{margin-bottom:24px !important}.ms-xl-6{margin-inline-start:24px !important}.me-xl-6{margin-inline-end:24px !important}.ma-xl-6{margin:24px !important}.mt-xl-7,.my-xl-7{margin-top:28px !important}.mr-xl-7,.mx-xl-7{margin-right:28px !important}.ml-xl-7,.mx-xl-7{margin-left:28px !important}.mb-xl-7,.my-xl-7{margin-bottom:28px !important}.ms-xl-7{margin-inline-start:28px !important}.me-xl-7{margin-inline-end:28px !important}.ma-xl-7{margin:28px !important}.mt-xl-8,.my-xl-8{margin-top:32px !important}.mr-xl-8,.mx-xl-8{margin-right:32px !important}.ml-xl-8,.mx-xl-8{margin-left:32px !important}.mb-xl-8,.my-xl-8{margin-bottom:32px !important}.ms-xl-8{margin-inline-start:32px !important}.me-xl-8{margin-inline-end:32px !important}.ma-xl-8{margin:32px !important}.mt-xl-9,.my-xl-9{margin-top:36px !important}.mr-xl-9,.mx-xl-9{margin-right:36px !important}.ml-xl-9,.mx-xl-9{margin-left:36px !important}.mb-xl-9,.my-xl-9{margin-bottom:36px !important}.ms-xl-9{margin-inline-start:36px !important}.me-xl-9{margin-inline-end:36px !important}.ma-xl-9{margin:36px !important}.mt-xl-10,.my-xl-10{margin-top:40px !important}.mr-xl-10,.mx-xl-10{margin-right:40px !important}.ml-xl-10,.mx-xl-10{margin-left:40px !important}.mb-xl-10,.my-xl-10{margin-bottom:40px !important}.ms-xl-10{margin-inline-start:40px !important}.me-xl-10{margin-inline-end:40px !important}.ma-xl-10{margin:40px !important}.mt-xl-11,.my-xl-11{margin-top:44px !important}.mr-xl-11,.mx-xl-11{margin-right:44px !important}.ml-xl-11,.mx-xl-11{margin-left:44px !important}.mb-xl-11,.my-xl-11{margin-bottom:44px !important}.ms-xl-11{margin-inline-start:44px !important}.me-xl-11{margin-inline-end:44px !important}.ma-xl-11{margin:44px !important}.mt-xl-12,.my-xl-12{margin-top:48px !important}.mr-xl-12,.mx-xl-12{margin-right:48px !important}.ml-xl-12,.mx-xl-12{margin-left:48px !important}.mb-xl-12,.my-xl-12{margin-bottom:48px !important}.ms-xl-12{margin-inline-start:48px !important}.me-xl-12{margin-inline-end:48px !important}.ma-xl-12{margin:48px !important}.mt-xl-13,.my-xl-13{margin-top:52px !important}.mr-xl-13,.mx-xl-13{margin-right:52px !important}.ml-xl-13,.mx-xl-13{margin-left:52px !important}.mb-xl-13,.my-xl-13{margin-bottom:52px !important}.ms-xl-13{margin-inline-start:52px !important}.me-xl-13{margin-inline-end:52px !important}.ma-xl-13{margin:52px !important}.mt-xl-14,.my-xl-14{margin-top:56px !important}.mr-xl-14,.mx-xl-14{margin-right:56px !important}.ml-xl-14,.mx-xl-14{margin-left:56px !important}.mb-xl-14,.my-xl-14{margin-bottom:56px !important}.ms-xl-14{margin-inline-start:56px !important}.me-xl-14{margin-inline-end:56px !important}.ma-xl-14{margin:56px !important}.mt-xl-15,.my-xl-15{margin-top:60px !important}.mr-xl-15,.mx-xl-15{margin-right:60px !important}.ml-xl-15,.mx-xl-15{margin-left:60px !important}.mb-xl-15,.my-xl-15{margin-bottom:60px !important}.ms-xl-15{margin-inline-start:60px !important}.me-xl-15{margin-inline-end:60px !important}.ma-xl-15{margin:60px !important}.mt-xl-16,.my-xl-16{margin-top:64px !important}.mr-xl-16,.mx-xl-16{margin-right:64px !important}.ml-xl-16,.mx-xl-16{margin-left:64px !important}.mb-xl-16,.my-xl-16{margin-bottom:64px !important}.ms-xl-16{margin-inline-start:64px !important}.me-xl-16{margin-inline-end:64px !important}.ma-xl-16{margin:64px !important}.mt-xl-17,.my-xl-17{margin-top:68px !important}.mr-xl-17,.mx-xl-17{margin-right:68px !important}.ml-xl-17,.mx-xl-17{margin-left:68px !important}.mb-xl-17,.my-xl-17{margin-bottom:68px !important}.ms-xl-17{margin-inline-start:68px !important}.me-xl-17{margin-inline-end:68px !important}.ma-xl-17{margin:68px !important}.mt-xl-18,.my-xl-18{margin-top:72px !important}.mr-xl-18,.mx-xl-18{margin-right:72px !important}.ml-xl-18,.mx-xl-18{margin-left:72px !important}.mb-xl-18,.my-xl-18{margin-bottom:72px !important}.ms-xl-18{margin-inline-start:72px !important}.me-xl-18{margin-inline-end:72px !important}.ma-xl-18{margin:72px !important}.mt-xl-19,.my-xl-19{margin-top:76px !important}.mr-xl-19,.mx-xl-19{margin-right:76px !important}.ml-xl-19,.mx-xl-19{margin-left:76px !important}.mb-xl-19,.my-xl-19{margin-bottom:76px !important}.ms-xl-19{margin-inline-start:76px !important}.me-xl-19{margin-inline-end:76px !important}.ma-xl-19{margin:76px !important}.mt-xl-20,.my-xl-20{margin-top:80px !important}.mr-xl-20,.mx-xl-20{margin-right:80px !important}.ml-xl-20,.mx-xl-20{margin-left:80px !important}.mb-xl-20,.my-xl-20{margin-bottom:80px !important}.ms-xl-20{margin-inline-start:80px !important}.me-xl-20{margin-inline-end:80px !important}.ma-xl-20{margin:80px !important}.mt-xl-auto,.my-xl-auto{margin-top:auto !important}.mr-xl-auto,.mx-xl-auto{margin-right:auto !important}.ml-xl-auto,.mx-xl-auto{margin-left:auto !important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto !important}.ms-xl-auto{margin-inline-start:auto !important}.me-xl-auto{margin-inline-end:auto !important}.ma-xl-auto{margin:auto !important}.pt-xl-0,.py-xl-0{padding-top:0 !important}.pr-xl-0,.px-xl-0{padding-right:0 !important}.pl-xl-0,.px-xl-0{padding-left:0 !important}.pb-xl-0,.py-xl-0{padding-bottom:0 !important}.ps-xl-0{padding-inline-start:0 !important}.pe-xl-0{padding-inline-end:0 !important}.pa-xl-0{padding:0 !important}.pt-xl-1,.py-xl-1{padding-top:4px !important}.pr-xl-1,.px-xl-1{padding-right:4px !important}.pl-xl-1,.px-xl-1{padding-left:4px !important}.pb-xl-1,.py-xl-1{padding-bottom:4px !important}.ps-xl-1{padding-inline-start:4px !important}.pe-xl-1{padding-inline-end:4px !important}.pa-xl-1{padding:4px !important}.pt-xl-2,.py-xl-2{padding-top:8px !important}.pr-xl-2,.px-xl-2{padding-right:8px !important}.pl-xl-2,.px-xl-2{padding-left:8px !important}.pb-xl-2,.py-xl-2{padding-bottom:8px !important}.ps-xl-2{padding-inline-start:8px !important}.pe-xl-2{padding-inline-end:8px !important}.pa-xl-2{padding:8px !important}.pt-xl-3,.py-xl-3{padding-top:12px !important}.pr-xl-3,.px-xl-3{padding-right:12px !important}.pl-xl-3,.px-xl-3{padding-left:12px !important}.pb-xl-3,.py-xl-3{padding-bottom:12px !important}.ps-xl-3{padding-inline-start:12px !important}.pe-xl-3{padding-inline-end:12px !important}.pa-xl-3{padding:12px !important}.pt-xl-4,.py-xl-4{padding-top:16px !important}.pr-xl-4,.px-xl-4{padding-right:16px !important}.pl-xl-4,.px-xl-4{padding-left:16px !important}.pb-xl-4,.py-xl-4{padding-bottom:16px !important}.ps-xl-4{padding-inline-start:16px !important}.pe-xl-4{padding-inline-end:16px !important}.pa-xl-4{padding:16px !important}.pt-xl-5,.py-xl-5{padding-top:20px !important}.pr-xl-5,.px-xl-5{padding-right:20px !important}.pl-xl-5,.px-xl-5{padding-left:20px !important}.pb-xl-5,.py-xl-5{padding-bottom:20px !important}.ps-xl-5{padding-inline-start:20px !important}.pe-xl-5{padding-inline-end:20px !important}.pa-xl-5{padding:20px !important}.pt-xl-6,.py-xl-6{padding-top:24px !important}.pr-xl-6,.px-xl-6{padding-right:24px !important}.pl-xl-6,.px-xl-6{padding-left:24px !important}.pb-xl-6,.py-xl-6{padding-bottom:24px !important}.ps-xl-6{padding-inline-start:24px !important}.pe-xl-6{padding-inline-end:24px !important}.pa-xl-6{padding:24px !important}.pt-xl-7,.py-xl-7{padding-top:28px !important}.pr-xl-7,.px-xl-7{padding-right:28px !important}.pl-xl-7,.px-xl-7{padding-left:28px !important}.pb-xl-7,.py-xl-7{padding-bottom:28px !important}.ps-xl-7{padding-inline-start:28px !important}.pe-xl-7{padding-inline-end:28px !important}.pa-xl-7{padding:28px !important}.pt-xl-8,.py-xl-8{padding-top:32px !important}.pr-xl-8,.px-xl-8{padding-right:32px !important}.pl-xl-8,.px-xl-8{padding-left:32px !important}.pb-xl-8,.py-xl-8{padding-bottom:32px !important}.ps-xl-8{padding-inline-start:32px !important}.pe-xl-8{padding-inline-end:32px !important}.pa-xl-8{padding:32px !important}.pt-xl-9,.py-xl-9{padding-top:36px !important}.pr-xl-9,.px-xl-9{padding-right:36px !important}.pl-xl-9,.px-xl-9{padding-left:36px !important}.pb-xl-9,.py-xl-9{padding-bottom:36px !important}.ps-xl-9{padding-inline-start:36px !important}.pe-xl-9{padding-inline-end:36px !important}.pa-xl-9{padding:36px !important}.pt-xl-10,.py-xl-10{padding-top:40px !important}.pr-xl-10,.px-xl-10{padding-right:40px !important}.pl-xl-10,.px-xl-10{padding-left:40px !important}.pb-xl-10,.py-xl-10{padding-bottom:40px !important}.ps-xl-10{padding-inline-start:40px !important}.pe-xl-10{padding-inline-end:40px !important}.pa-xl-10{padding:40px !important}.pt-xl-11,.py-xl-11{padding-top:44px !important}.pr-xl-11,.px-xl-11{padding-right:44px !important}.pl-xl-11,.px-xl-11{padding-left:44px !important}.pb-xl-11,.py-xl-11{padding-bottom:44px !important}.ps-xl-11{padding-inline-start:44px !important}.pe-xl-11{padding-inline-end:44px !important}.pa-xl-11{padding:44px !important}.pt-xl-12,.py-xl-12{padding-top:48px !important}.pr-xl-12,.px-xl-12{padding-right:48px !important}.pl-xl-12,.px-xl-12{padding-left:48px !important}.pb-xl-12,.py-xl-12{padding-bottom:48px !important}.ps-xl-12{padding-inline-start:48px !important}.pe-xl-12{padding-inline-end:48px !important}.pa-xl-12{padding:48px !important}.pt-xl-13,.py-xl-13{padding-top:52px !important}.pr-xl-13,.px-xl-13{padding-right:52px !important}.pl-xl-13,.px-xl-13{padding-left:52px !important}.pb-xl-13,.py-xl-13{padding-bottom:52px !important}.ps-xl-13{padding-inline-start:52px !important}.pe-xl-13{padding-inline-end:52px !important}.pa-xl-13{padding:52px !important}.pt-xl-14,.py-xl-14{padding-top:56px !important}.pr-xl-14,.px-xl-14{padding-right:56px !important}.pl-xl-14,.px-xl-14{padding-left:56px !important}.pb-xl-14,.py-xl-14{padding-bottom:56px !important}.ps-xl-14{padding-inline-start:56px !important}.pe-xl-14{padding-inline-end:56px !important}.pa-xl-14{padding:56px !important}.pt-xl-15,.py-xl-15{padding-top:60px !important}.pr-xl-15,.px-xl-15{padding-right:60px !important}.pl-xl-15,.px-xl-15{padding-left:60px !important}.pb-xl-15,.py-xl-15{padding-bottom:60px !important}.ps-xl-15{padding-inline-start:60px !important}.pe-xl-15{padding-inline-end:60px !important}.pa-xl-15{padding:60px !important}.pt-xl-16,.py-xl-16{padding-top:64px !important}.pr-xl-16,.px-xl-16{padding-right:64px !important}.pl-xl-16,.px-xl-16{padding-left:64px !important}.pb-xl-16,.py-xl-16{padding-bottom:64px !important}.ps-xl-16{padding-inline-start:64px !important}.pe-xl-16{padding-inline-end:64px !important}.pa-xl-16{padding:64px !important}.pt-xl-17,.py-xl-17{padding-top:68px !important}.pr-xl-17,.px-xl-17{padding-right:68px !important}.pl-xl-17,.px-xl-17{padding-left:68px !important}.pb-xl-17,.py-xl-17{padding-bottom:68px !important}.ps-xl-17{padding-inline-start:68px !important}.pe-xl-17{padding-inline-end:68px !important}.pa-xl-17{padding:68px !important}.pt-xl-18,.py-xl-18{padding-top:72px !important}.pr-xl-18,.px-xl-18{padding-right:72px !important}.pl-xl-18,.px-xl-18{padding-left:72px !important}.pb-xl-18,.py-xl-18{padding-bottom:72px !important}.ps-xl-18{padding-inline-start:72px !important}.pe-xl-18{padding-inline-end:72px !important}.pa-xl-18{padding:72px !important}.pt-xl-19,.py-xl-19{padding-top:76px !important}.pr-xl-19,.px-xl-19{padding-right:76px !important}.pl-xl-19,.px-xl-19{padding-left:76px !important}.pb-xl-19,.py-xl-19{padding-bottom:76px !important}.ps-xl-19{padding-inline-start:76px !important}.pe-xl-19{padding-inline-end:76px !important}.pa-xl-19{padding:76px !important}.pt-xl-20,.py-xl-20{padding-top:80px !important}.pr-xl-20,.px-xl-20{padding-right:80px !important}.pl-xl-20,.px-xl-20{padding-left:80px !important}.pb-xl-20,.py-xl-20{padding-bottom:80px !important}.ps-xl-20{padding-inline-start:80px !important}.pe-xl-20{padding-inline-end:80px !important}.pa-xl-20{padding:80px !important}.pt-xl-auto,.py-xl-auto{padding-top:auto !important}.pr-xl-auto,.px-xl-auto{padding-right:auto !important}.pl-xl-auto,.px-xl-auto{padding-left:auto !important}.pb-xl-auto,.py-xl-auto{padding-bottom:auto !important}.ps-xl-auto{padding-inline-start:auto !important}.pe-xl-auto{padding-inline-end:auto !important}.pa-xl-auto{padding:auto !important}.mt-xl-n1,.my-xl-n1{margin-top:-4px !important}.mr-xl-n1,.mx-xl-n1{margin-right:-4px !important}.ml-xl-n1,.mx-xl-n1{margin-left:-4px !important}.mb-xl-n1,.my-xl-n1{margin-bottom:-4px !important}.ms-xl-n1{margin-inline-start:-4px !important}.me-xl-n1{margin-inline-end:-4px !important}.ma-xl-n1{margin:-4px !important}.mt-xl-n2,.my-xl-n2{margin-top:-8px !important}.mr-xl-n2,.mx-xl-n2{margin-right:-8px !important}.ml-xl-n2,.mx-xl-n2{margin-left:-8px !important}.mb-xl-n2,.my-xl-n2{margin-bottom:-8px !important}.ms-xl-n2{margin-inline-start:-8px !important}.me-xl-n2{margin-inline-end:-8px !important}.ma-xl-n2{margin:-8px !important}.mt-xl-n3,.my-xl-n3{margin-top:-12px !important}.mr-xl-n3,.mx-xl-n3{margin-right:-12px !important}.ml-xl-n3,.mx-xl-n3{margin-left:-12px !important}.mb-xl-n3,.my-xl-n3{margin-bottom:-12px !important}.ms-xl-n3{margin-inline-start:-12px !important}.me-xl-n3{margin-inline-end:-12px !important}.ma-xl-n3{margin:-12px !important}.mt-xl-n4,.my-xl-n4{margin-top:-16px !important}.mr-xl-n4,.mx-xl-n4{margin-right:-16px !important}.ml-xl-n4,.mx-xl-n4{margin-left:-16px !important}.mb-xl-n4,.my-xl-n4{margin-bottom:-16px !important}.ms-xl-n4{margin-inline-start:-16px !important}.me-xl-n4{margin-inline-end:-16px !important}.ma-xl-n4{margin:-16px !important}.mt-xl-n5,.my-xl-n5{margin-top:-20px !important}.mr-xl-n5,.mx-xl-n5{margin-right:-20px !important}.ml-xl-n5,.mx-xl-n5{margin-left:-20px !important}.mb-xl-n5,.my-xl-n5{margin-bottom:-20px !important}.ms-xl-n5{margin-inline-start:-20px !important}.me-xl-n5{margin-inline-end:-20px !important}.ma-xl-n5{margin:-20px !important}.mt-xl-n6,.my-xl-n6{margin-top:-24px !important}.mr-xl-n6,.mx-xl-n6{margin-right:-24px !important}.ml-xl-n6,.mx-xl-n6{margin-left:-24px !important}.mb-xl-n6,.my-xl-n6{margin-bottom:-24px !important}.ms-xl-n6{margin-inline-start:-24px !important}.me-xl-n6{margin-inline-end:-24px !important}.ma-xl-n6{margin:-24px !important}.mt-xl-n7,.my-xl-n7{margin-top:-28px !important}.mr-xl-n7,.mx-xl-n7{margin-right:-28px !important}.ml-xl-n7,.mx-xl-n7{margin-left:-28px !important}.mb-xl-n7,.my-xl-n7{margin-bottom:-28px !important}.ms-xl-n7{margin-inline-start:-28px !important}.me-xl-n7{margin-inline-end:-28px !important}.ma-xl-n7{margin:-28px !important}.mt-xl-n8,.my-xl-n8{margin-top:-32px !important}.mr-xl-n8,.mx-xl-n8{margin-right:-32px !important}.ml-xl-n8,.mx-xl-n8{margin-left:-32px !important}.mb-xl-n8,.my-xl-n8{margin-bottom:-32px !important}.ms-xl-n8{margin-inline-start:-32px !important}.me-xl-n8{margin-inline-end:-32px !important}.ma-xl-n8{margin:-32px !important}.mt-xl-n9,.my-xl-n9{margin-top:-36px !important}.mr-xl-n9,.mx-xl-n9{margin-right:-36px !important}.ml-xl-n9,.mx-xl-n9{margin-left:-36px !important}.mb-xl-n9,.my-xl-n9{margin-bottom:-36px !important}.ms-xl-n9{margin-inline-start:-36px !important}.me-xl-n9{margin-inline-end:-36px !important}.ma-xl-n9{margin:-36px !important}.mt-xl-n10,.my-xl-n10{margin-top:-40px !important}.mr-xl-n10,.mx-xl-n10{margin-right:-40px !important}.ml-xl-n10,.mx-xl-n10{margin-left:-40px !important}.mb-xl-n10,.my-xl-n10{margin-bottom:-40px !important}.ms-xl-n10{margin-inline-start:-40px !important}.me-xl-n10{margin-inline-end:-40px !important}.ma-xl-n10{margin:-40px !important}.mt-xl-n11,.my-xl-n11{margin-top:-44px !important}.mr-xl-n11,.mx-xl-n11{margin-right:-44px !important}.ml-xl-n11,.mx-xl-n11{margin-left:-44px !important}.mb-xl-n11,.my-xl-n11{margin-bottom:-44px !important}.ms-xl-n11{margin-inline-start:-44px !important}.me-xl-n11{margin-inline-end:-44px !important}.ma-xl-n11{margin:-44px !important}.mt-xl-n12,.my-xl-n12{margin-top:-48px !important}.mr-xl-n12,.mx-xl-n12{margin-right:-48px !important}.ml-xl-n12,.mx-xl-n12{margin-left:-48px !important}.mb-xl-n12,.my-xl-n12{margin-bottom:-48px !important}.ms-xl-n12{margin-inline-start:-48px !important}.me-xl-n12{margin-inline-end:-48px !important}.ma-xl-n12{margin:-48px !important}.mt-xl-n13,.my-xl-n13{margin-top:-52px !important}.mr-xl-n13,.mx-xl-n13{margin-right:-52px !important}.ml-xl-n13,.mx-xl-n13{margin-left:-52px !important}.mb-xl-n13,.my-xl-n13{margin-bottom:-52px !important}.ms-xl-n13{margin-inline-start:-52px !important}.me-xl-n13{margin-inline-end:-52px !important}.ma-xl-n13{margin:-52px !important}.mt-xl-n14,.my-xl-n14{margin-top:-56px !important}.mr-xl-n14,.mx-xl-n14{margin-right:-56px !important}.ml-xl-n14,.mx-xl-n14{margin-left:-56px !important}.mb-xl-n14,.my-xl-n14{margin-bottom:-56px !important}.ms-xl-n14{margin-inline-start:-56px !important}.me-xl-n14{margin-inline-end:-56px !important}.ma-xl-n14{margin:-56px !important}.mt-xl-n15,.my-xl-n15{margin-top:-60px !important}.mr-xl-n15,.mx-xl-n15{margin-right:-60px !important}.ml-xl-n15,.mx-xl-n15{margin-left:-60px !important}.mb-xl-n15,.my-xl-n15{margin-bottom:-60px !important}.ms-xl-n15{margin-inline-start:-60px !important}.me-xl-n15{margin-inline-end:-60px !important}.ma-xl-n15{margin:-60px !important}.mt-xl-n16,.my-xl-n16{margin-top:-64px !important}.mr-xl-n16,.mx-xl-n16{margin-right:-64px !important}.ml-xl-n16,.mx-xl-n16{margin-left:-64px !important}.mb-xl-n16,.my-xl-n16{margin-bottom:-64px !important}.ms-xl-n16{margin-inline-start:-64px !important}.me-xl-n16{margin-inline-end:-64px !important}.ma-xl-n16{margin:-64px !important}.mt-xl-n17,.my-xl-n17{margin-top:-68px !important}.mr-xl-n17,.mx-xl-n17{margin-right:-68px !important}.ml-xl-n17,.mx-xl-n17{margin-left:-68px !important}.mb-xl-n17,.my-xl-n17{margin-bottom:-68px !important}.ms-xl-n17{margin-inline-start:-68px !important}.me-xl-n17{margin-inline-end:-68px !important}.ma-xl-n17{margin:-68px !important}.mt-xl-n18,.my-xl-n18{margin-top:-72px !important}.mr-xl-n18,.mx-xl-n18{margin-right:-72px !important}.ml-xl-n18,.mx-xl-n18{margin-left:-72px !important}.mb-xl-n18,.my-xl-n18{margin-bottom:-72px !important}.ms-xl-n18{margin-inline-start:-72px !important}.me-xl-n18{margin-inline-end:-72px !important}.ma-xl-n18{margin:-72px !important}.mt-xl-n19,.my-xl-n19{margin-top:-76px !important}.mr-xl-n19,.mx-xl-n19{margin-right:-76px !important}.ml-xl-n19,.mx-xl-n19{margin-left:-76px !important}.mb-xl-n19,.my-xl-n19{margin-bottom:-76px !important}.ms-xl-n19{margin-inline-start:-76px !important}.me-xl-n19{margin-inline-end:-76px !important}.ma-xl-n19{margin:-76px !important}.mt-xl-n20,.my-xl-n20{margin-top:-80px !important}.mr-xl-n20,.mx-xl-n20{margin-right:-80px !important}.ml-xl-n20,.mx-xl-n20{margin-left:-80px !important}.mb-xl-n20,.my-xl-n20{margin-bottom:-80px !important}.ms-xl-n20{margin-inline-start:-80px !important}.me-xl-n20{margin-inline-end:-80px !important}.ma-xl-n20{margin:-80px !important}}@media screen and (min-width: 2560px){.mt-xxl-0,.my-xxl-0{margin-top:0 !important}.mr-xxl-0,.mx-xxl-0{margin-right:0 !important}.ml-xxl-0,.mx-xxl-0{margin-left:0 !important}.mb-xxl-0,.my-xxl-0{margin-bottom:0 !important}.ms-xxl-0{margin-inline-start:0 !important}.me-xxl-0{margin-inline-end:0 !important}.ma-xxl-0{margin:0 !important}.mt-xxl-1,.my-xxl-1{margin-top:4px !important}.mr-xxl-1,.mx-xxl-1{margin-right:4px !important}.ml-xxl-1,.mx-xxl-1{margin-left:4px !important}.mb-xxl-1,.my-xxl-1{margin-bottom:4px !important}.ms-xxl-1{margin-inline-start:4px !important}.me-xxl-1{margin-inline-end:4px !important}.ma-xxl-1{margin:4px !important}.mt-xxl-2,.my-xxl-2{margin-top:8px !important}.mr-xxl-2,.mx-xxl-2{margin-right:8px !important}.ml-xxl-2,.mx-xxl-2{margin-left:8px !important}.mb-xxl-2,.my-xxl-2{margin-bottom:8px !important}.ms-xxl-2{margin-inline-start:8px !important}.me-xxl-2{margin-inline-end:8px !important}.ma-xxl-2{margin:8px !important}.mt-xxl-3,.my-xxl-3{margin-top:12px !important}.mr-xxl-3,.mx-xxl-3{margin-right:12px !important}.ml-xxl-3,.mx-xxl-3{margin-left:12px !important}.mb-xxl-3,.my-xxl-3{margin-bottom:12px !important}.ms-xxl-3{margin-inline-start:12px !important}.me-xxl-3{margin-inline-end:12px !important}.ma-xxl-3{margin:12px !important}.mt-xxl-4,.my-xxl-4{margin-top:16px !important}.mr-xxl-4,.mx-xxl-4{margin-right:16px !important}.ml-xxl-4,.mx-xxl-4{margin-left:16px !important}.mb-xxl-4,.my-xxl-4{margin-bottom:16px !important}.ms-xxl-4{margin-inline-start:16px !important}.me-xxl-4{margin-inline-end:16px !important}.ma-xxl-4{margin:16px !important}.mt-xxl-5,.my-xxl-5{margin-top:20px !important}.mr-xxl-5,.mx-xxl-5{margin-right:20px !important}.ml-xxl-5,.mx-xxl-5{margin-left:20px !important}.mb-xxl-5,.my-xxl-5{margin-bottom:20px !important}.ms-xxl-5{margin-inline-start:20px !important}.me-xxl-5{margin-inline-end:20px !important}.ma-xxl-5{margin:20px !important}.mt-xxl-6,.my-xxl-6{margin-top:24px !important}.mr-xxl-6,.mx-xxl-6{margin-right:24px !important}.ml-xxl-6,.mx-xxl-6{margin-left:24px !important}.mb-xxl-6,.my-xxl-6{margin-bottom:24px !important}.ms-xxl-6{margin-inline-start:24px !important}.me-xxl-6{margin-inline-end:24px !important}.ma-xxl-6{margin:24px !important}.mt-xxl-7,.my-xxl-7{margin-top:28px !important}.mr-xxl-7,.mx-xxl-7{margin-right:28px !important}.ml-xxl-7,.mx-xxl-7{margin-left:28px !important}.mb-xxl-7,.my-xxl-7{margin-bottom:28px !important}.ms-xxl-7{margin-inline-start:28px !important}.me-xxl-7{margin-inline-end:28px !important}.ma-xxl-7{margin:28px !important}.mt-xxl-8,.my-xxl-8{margin-top:32px !important}.mr-xxl-8,.mx-xxl-8{margin-right:32px !important}.ml-xxl-8,.mx-xxl-8{margin-left:32px !important}.mb-xxl-8,.my-xxl-8{margin-bottom:32px !important}.ms-xxl-8{margin-inline-start:32px !important}.me-xxl-8{margin-inline-end:32px !important}.ma-xxl-8{margin:32px !important}.mt-xxl-9,.my-xxl-9{margin-top:36px !important}.mr-xxl-9,.mx-xxl-9{margin-right:36px !important}.ml-xxl-9,.mx-xxl-9{margin-left:36px !important}.mb-xxl-9,.my-xxl-9{margin-bottom:36px !important}.ms-xxl-9{margin-inline-start:36px !important}.me-xxl-9{margin-inline-end:36px !important}.ma-xxl-9{margin:36px !important}.mt-xxl-10,.my-xxl-10{margin-top:40px !important}.mr-xxl-10,.mx-xxl-10{margin-right:40px !important}.ml-xxl-10,.mx-xxl-10{margin-left:40px !important}.mb-xxl-10,.my-xxl-10{margin-bottom:40px !important}.ms-xxl-10{margin-inline-start:40px !important}.me-xxl-10{margin-inline-end:40px !important}.ma-xxl-10{margin:40px !important}.mt-xxl-11,.my-xxl-11{margin-top:44px !important}.mr-xxl-11,.mx-xxl-11{margin-right:44px !important}.ml-xxl-11,.mx-xxl-11{margin-left:44px !important}.mb-xxl-11,.my-xxl-11{margin-bottom:44px !important}.ms-xxl-11{margin-inline-start:44px !important}.me-xxl-11{margin-inline-end:44px !important}.ma-xxl-11{margin:44px !important}.mt-xxl-12,.my-xxl-12{margin-top:48px !important}.mr-xxl-12,.mx-xxl-12{margin-right:48px !important}.ml-xxl-12,.mx-xxl-12{margin-left:48px !important}.mb-xxl-12,.my-xxl-12{margin-bottom:48px !important}.ms-xxl-12{margin-inline-start:48px !important}.me-xxl-12{margin-inline-end:48px !important}.ma-xxl-12{margin:48px !important}.mt-xxl-13,.my-xxl-13{margin-top:52px !important}.mr-xxl-13,.mx-xxl-13{margin-right:52px !important}.ml-xxl-13,.mx-xxl-13{margin-left:52px !important}.mb-xxl-13,.my-xxl-13{margin-bottom:52px !important}.ms-xxl-13{margin-inline-start:52px !important}.me-xxl-13{margin-inline-end:52px !important}.ma-xxl-13{margin:52px !important}.mt-xxl-14,.my-xxl-14{margin-top:56px !important}.mr-xxl-14,.mx-xxl-14{margin-right:56px !important}.ml-xxl-14,.mx-xxl-14{margin-left:56px !important}.mb-xxl-14,.my-xxl-14{margin-bottom:56px !important}.ms-xxl-14{margin-inline-start:56px !important}.me-xxl-14{margin-inline-end:56px !important}.ma-xxl-14{margin:56px !important}.mt-xxl-15,.my-xxl-15{margin-top:60px !important}.mr-xxl-15,.mx-xxl-15{margin-right:60px !important}.ml-xxl-15,.mx-xxl-15{margin-left:60px !important}.mb-xxl-15,.my-xxl-15{margin-bottom:60px !important}.ms-xxl-15{margin-inline-start:60px !important}.me-xxl-15{margin-inline-end:60px !important}.ma-xxl-15{margin:60px !important}.mt-xxl-16,.my-xxl-16{margin-top:64px !important}.mr-xxl-16,.mx-xxl-16{margin-right:64px !important}.ml-xxl-16,.mx-xxl-16{margin-left:64px !important}.mb-xxl-16,.my-xxl-16{margin-bottom:64px !important}.ms-xxl-16{margin-inline-start:64px !important}.me-xxl-16{margin-inline-end:64px !important}.ma-xxl-16{margin:64px !important}.mt-xxl-17,.my-xxl-17{margin-top:68px !important}.mr-xxl-17,.mx-xxl-17{margin-right:68px !important}.ml-xxl-17,.mx-xxl-17{margin-left:68px !important}.mb-xxl-17,.my-xxl-17{margin-bottom:68px !important}.ms-xxl-17{margin-inline-start:68px !important}.me-xxl-17{margin-inline-end:68px !important}.ma-xxl-17{margin:68px !important}.mt-xxl-18,.my-xxl-18{margin-top:72px !important}.mr-xxl-18,.mx-xxl-18{margin-right:72px !important}.ml-xxl-18,.mx-xxl-18{margin-left:72px !important}.mb-xxl-18,.my-xxl-18{margin-bottom:72px !important}.ms-xxl-18{margin-inline-start:72px !important}.me-xxl-18{margin-inline-end:72px !important}.ma-xxl-18{margin:72px !important}.mt-xxl-19,.my-xxl-19{margin-top:76px !important}.mr-xxl-19,.mx-xxl-19{margin-right:76px !important}.ml-xxl-19,.mx-xxl-19{margin-left:76px !important}.mb-xxl-19,.my-xxl-19{margin-bottom:76px !important}.ms-xxl-19{margin-inline-start:76px !important}.me-xxl-19{margin-inline-end:76px !important}.ma-xxl-19{margin:76px !important}.mt-xxl-20,.my-xxl-20{margin-top:80px !important}.mr-xxl-20,.mx-xxl-20{margin-right:80px !important}.ml-xxl-20,.mx-xxl-20{margin-left:80px !important}.mb-xxl-20,.my-xxl-20{margin-bottom:80px !important}.ms-xxl-20{margin-inline-start:80px !important}.me-xxl-20{margin-inline-end:80px !important}.ma-xxl-20{margin:80px !important}.mt-xxl-auto,.my-xxl-auto{margin-top:auto !important}.mr-xxl-auto,.mx-xxl-auto{margin-right:auto !important}.ml-xxl-auto,.mx-xxl-auto{margin-left:auto !important}.mb-xxl-auto,.my-xxl-auto{margin-bottom:auto !important}.ms-xxl-auto{margin-inline-start:auto !important}.me-xxl-auto{margin-inline-end:auto !important}.ma-xxl-auto{margin:auto !important}.pt-xxl-0,.py-xxl-0{padding-top:0 !important}.pr-xxl-0,.px-xxl-0{padding-right:0 !important}.pl-xxl-0,.px-xxl-0{padding-left:0 !important}.pb-xxl-0,.py-xxl-0{padding-bottom:0 !important}.ps-xxl-0{padding-inline-start:0 !important}.pe-xxl-0{padding-inline-end:0 !important}.pa-xxl-0{padding:0 !important}.pt-xxl-1,.py-xxl-1{padding-top:4px !important}.pr-xxl-1,.px-xxl-1{padding-right:4px !important}.pl-xxl-1,.px-xxl-1{padding-left:4px !important}.pb-xxl-1,.py-xxl-1{padding-bottom:4px !important}.ps-xxl-1{padding-inline-start:4px !important}.pe-xxl-1{padding-inline-end:4px !important}.pa-xxl-1{padding:4px !important}.pt-xxl-2,.py-xxl-2{padding-top:8px !important}.pr-xxl-2,.px-xxl-2{padding-right:8px !important}.pl-xxl-2,.px-xxl-2{padding-left:8px !important}.pb-xxl-2,.py-xxl-2{padding-bottom:8px !important}.ps-xxl-2{padding-inline-start:8px !important}.pe-xxl-2{padding-inline-end:8px !important}.pa-xxl-2{padding:8px !important}.pt-xxl-3,.py-xxl-3{padding-top:12px !important}.pr-xxl-3,.px-xxl-3{padding-right:12px !important}.pl-xxl-3,.px-xxl-3{padding-left:12px !important}.pb-xxl-3,.py-xxl-3{padding-bottom:12px !important}.ps-xxl-3{padding-inline-start:12px !important}.pe-xxl-3{padding-inline-end:12px !important}.pa-xxl-3{padding:12px !important}.pt-xxl-4,.py-xxl-4{padding-top:16px !important}.pr-xxl-4,.px-xxl-4{padding-right:16px !important}.pl-xxl-4,.px-xxl-4{padding-left:16px !important}.pb-xxl-4,.py-xxl-4{padding-bottom:16px !important}.ps-xxl-4{padding-inline-start:16px !important}.pe-xxl-4{padding-inline-end:16px !important}.pa-xxl-4{padding:16px !important}.pt-xxl-5,.py-xxl-5{padding-top:20px !important}.pr-xxl-5,.px-xxl-5{padding-right:20px !important}.pl-xxl-5,.px-xxl-5{padding-left:20px !important}.pb-xxl-5,.py-xxl-5{padding-bottom:20px !important}.ps-xxl-5{padding-inline-start:20px !important}.pe-xxl-5{padding-inline-end:20px !important}.pa-xxl-5{padding:20px !important}.pt-xxl-6,.py-xxl-6{padding-top:24px !important}.pr-xxl-6,.px-xxl-6{padding-right:24px !important}.pl-xxl-6,.px-xxl-6{padding-left:24px !important}.pb-xxl-6,.py-xxl-6{padding-bottom:24px !important}.ps-xxl-6{padding-inline-start:24px !important}.pe-xxl-6{padding-inline-end:24px !important}.pa-xxl-6{padding:24px !important}.pt-xxl-7,.py-xxl-7{padding-top:28px !important}.pr-xxl-7,.px-xxl-7{padding-right:28px !important}.pl-xxl-7,.px-xxl-7{padding-left:28px !important}.pb-xxl-7,.py-xxl-7{padding-bottom:28px !important}.ps-xxl-7{padding-inline-start:28px !important}.pe-xxl-7{padding-inline-end:28px !important}.pa-xxl-7{padding:28px !important}.pt-xxl-8,.py-xxl-8{padding-top:32px !important}.pr-xxl-8,.px-xxl-8{padding-right:32px !important}.pl-xxl-8,.px-xxl-8{padding-left:32px !important}.pb-xxl-8,.py-xxl-8{padding-bottom:32px !important}.ps-xxl-8{padding-inline-start:32px !important}.pe-xxl-8{padding-inline-end:32px !important}.pa-xxl-8{padding:32px !important}.pt-xxl-9,.py-xxl-9{padding-top:36px !important}.pr-xxl-9,.px-xxl-9{padding-right:36px !important}.pl-xxl-9,.px-xxl-9{padding-left:36px !important}.pb-xxl-9,.py-xxl-9{padding-bottom:36px !important}.ps-xxl-9{padding-inline-start:36px !important}.pe-xxl-9{padding-inline-end:36px !important}.pa-xxl-9{padding:36px !important}.pt-xxl-10,.py-xxl-10{padding-top:40px !important}.pr-xxl-10,.px-xxl-10{padding-right:40px !important}.pl-xxl-10,.px-xxl-10{padding-left:40px !important}.pb-xxl-10,.py-xxl-10{padding-bottom:40px !important}.ps-xxl-10{padding-inline-start:40px !important}.pe-xxl-10{padding-inline-end:40px !important}.pa-xxl-10{padding:40px !important}.pt-xxl-11,.py-xxl-11{padding-top:44px !important}.pr-xxl-11,.px-xxl-11{padding-right:44px !important}.pl-xxl-11,.px-xxl-11{padding-left:44px !important}.pb-xxl-11,.py-xxl-11{padding-bottom:44px !important}.ps-xxl-11{padding-inline-start:44px !important}.pe-xxl-11{padding-inline-end:44px !important}.pa-xxl-11{padding:44px !important}.pt-xxl-12,.py-xxl-12{padding-top:48px !important}.pr-xxl-12,.px-xxl-12{padding-right:48px !important}.pl-xxl-12,.px-xxl-12{padding-left:48px !important}.pb-xxl-12,.py-xxl-12{padding-bottom:48px !important}.ps-xxl-12{padding-inline-start:48px !important}.pe-xxl-12{padding-inline-end:48px !important}.pa-xxl-12{padding:48px !important}.pt-xxl-13,.py-xxl-13{padding-top:52px !important}.pr-xxl-13,.px-xxl-13{padding-right:52px !important}.pl-xxl-13,.px-xxl-13{padding-left:52px !important}.pb-xxl-13,.py-xxl-13{padding-bottom:52px !important}.ps-xxl-13{padding-inline-start:52px !important}.pe-xxl-13{padding-inline-end:52px !important}.pa-xxl-13{padding:52px !important}.pt-xxl-14,.py-xxl-14{padding-top:56px !important}.pr-xxl-14,.px-xxl-14{padding-right:56px !important}.pl-xxl-14,.px-xxl-14{padding-left:56px !important}.pb-xxl-14,.py-xxl-14{padding-bottom:56px !important}.ps-xxl-14{padding-inline-start:56px !important}.pe-xxl-14{padding-inline-end:56px !important}.pa-xxl-14{padding:56px !important}.pt-xxl-15,.py-xxl-15{padding-top:60px !important}.pr-xxl-15,.px-xxl-15{padding-right:60px !important}.pl-xxl-15,.px-xxl-15{padding-left:60px !important}.pb-xxl-15,.py-xxl-15{padding-bottom:60px !important}.ps-xxl-15{padding-inline-start:60px !important}.pe-xxl-15{padding-inline-end:60px !important}.pa-xxl-15{padding:60px !important}.pt-xxl-16,.py-xxl-16{padding-top:64px !important}.pr-xxl-16,.px-xxl-16{padding-right:64px !important}.pl-xxl-16,.px-xxl-16{padding-left:64px !important}.pb-xxl-16,.py-xxl-16{padding-bottom:64px !important}.ps-xxl-16{padding-inline-start:64px !important}.pe-xxl-16{padding-inline-end:64px !important}.pa-xxl-16{padding:64px !important}.pt-xxl-17,.py-xxl-17{padding-top:68px !important}.pr-xxl-17,.px-xxl-17{padding-right:68px !important}.pl-xxl-17,.px-xxl-17{padding-left:68px !important}.pb-xxl-17,.py-xxl-17{padding-bottom:68px !important}.ps-xxl-17{padding-inline-start:68px !important}.pe-xxl-17{padding-inline-end:68px !important}.pa-xxl-17{padding:68px !important}.pt-xxl-18,.py-xxl-18{padding-top:72px !important}.pr-xxl-18,.px-xxl-18{padding-right:72px !important}.pl-xxl-18,.px-xxl-18{padding-left:72px !important}.pb-xxl-18,.py-xxl-18{padding-bottom:72px !important}.ps-xxl-18{padding-inline-start:72px !important}.pe-xxl-18{padding-inline-end:72px !important}.pa-xxl-18{padding:72px !important}.pt-xxl-19,.py-xxl-19{padding-top:76px !important}.pr-xxl-19,.px-xxl-19{padding-right:76px !important}.pl-xxl-19,.px-xxl-19{padding-left:76px !important}.pb-xxl-19,.py-xxl-19{padding-bottom:76px !important}.ps-xxl-19{padding-inline-start:76px !important}.pe-xxl-19{padding-inline-end:76px !important}.pa-xxl-19{padding:76px !important}.pt-xxl-20,.py-xxl-20{padding-top:80px !important}.pr-xxl-20,.px-xxl-20{padding-right:80px !important}.pl-xxl-20,.px-xxl-20{padding-left:80px !important}.pb-xxl-20,.py-xxl-20{padding-bottom:80px !important}.ps-xxl-20{padding-inline-start:80px !important}.pe-xxl-20{padding-inline-end:80px !important}.pa-xxl-20{padding:80px !important}.pt-xxl-auto,.py-xxl-auto{padding-top:auto !important}.pr-xxl-auto,.px-xxl-auto{padding-right:auto !important}.pl-xxl-auto,.px-xxl-auto{padding-left:auto !important}.pb-xxl-auto,.py-xxl-auto{padding-bottom:auto !important}.ps-xxl-auto{padding-inline-start:auto !important}.pe-xxl-auto{padding-inline-end:auto !important}.pa-xxl-auto{padding:auto !important}.mt-xxl-n1,.my-xxl-n1{margin-top:-4px !important}.mr-xxl-n1,.mx-xxl-n1{margin-right:-4px !important}.ml-xxl-n1,.mx-xxl-n1{margin-left:-4px !important}.mb-xxl-n1,.my-xxl-n1{margin-bottom:-4px !important}.ms-xxl-n1{margin-inline-start:-4px !important}.me-xxl-n1{margin-inline-end:-4px !important}.ma-xxl-n1{margin:-4px !important}.mt-xxl-n2,.my-xxl-n2{margin-top:-8px !important}.mr-xxl-n2,.mx-xxl-n2{margin-right:-8px !important}.ml-xxl-n2,.mx-xxl-n2{margin-left:-8px !important}.mb-xxl-n2,.my-xxl-n2{margin-bottom:-8px !important}.ms-xxl-n2{margin-inline-start:-8px !important}.me-xxl-n2{margin-inline-end:-8px !important}.ma-xxl-n2{margin:-8px !important}.mt-xxl-n3,.my-xxl-n3{margin-top:-12px !important}.mr-xxl-n3,.mx-xxl-n3{margin-right:-12px !important}.ml-xxl-n3,.mx-xxl-n3{margin-left:-12px !important}.mb-xxl-n3,.my-xxl-n3{margin-bottom:-12px !important}.ms-xxl-n3{margin-inline-start:-12px !important}.me-xxl-n3{margin-inline-end:-12px !important}.ma-xxl-n3{margin:-12px !important}.mt-xxl-n4,.my-xxl-n4{margin-top:-16px !important}.mr-xxl-n4,.mx-xxl-n4{margin-right:-16px !important}.ml-xxl-n4,.mx-xxl-n4{margin-left:-16px !important}.mb-xxl-n4,.my-xxl-n4{margin-bottom:-16px !important}.ms-xxl-n4{margin-inline-start:-16px !important}.me-xxl-n4{margin-inline-end:-16px !important}.ma-xxl-n4{margin:-16px !important}.mt-xxl-n5,.my-xxl-n5{margin-top:-20px !important}.mr-xxl-n5,.mx-xxl-n5{margin-right:-20px !important}.ml-xxl-n5,.mx-xxl-n5{margin-left:-20px !important}.mb-xxl-n5,.my-xxl-n5{margin-bottom:-20px !important}.ms-xxl-n5{margin-inline-start:-20px !important}.me-xxl-n5{margin-inline-end:-20px !important}.ma-xxl-n5{margin:-20px !important}.mt-xxl-n6,.my-xxl-n6{margin-top:-24px !important}.mr-xxl-n6,.mx-xxl-n6{margin-right:-24px !important}.ml-xxl-n6,.mx-xxl-n6{margin-left:-24px !important}.mb-xxl-n6,.my-xxl-n6{margin-bottom:-24px !important}.ms-xxl-n6{margin-inline-start:-24px !important}.me-xxl-n6{margin-inline-end:-24px !important}.ma-xxl-n6{margin:-24px !important}.mt-xxl-n7,.my-xxl-n7{margin-top:-28px !important}.mr-xxl-n7,.mx-xxl-n7{margin-right:-28px !important}.ml-xxl-n7,.mx-xxl-n7{margin-left:-28px !important}.mb-xxl-n7,.my-xxl-n7{margin-bottom:-28px !important}.ms-xxl-n7{margin-inline-start:-28px !important}.me-xxl-n7{margin-inline-end:-28px !important}.ma-xxl-n7{margin:-28px !important}.mt-xxl-n8,.my-xxl-n8{margin-top:-32px !important}.mr-xxl-n8,.mx-xxl-n8{margin-right:-32px !important}.ml-xxl-n8,.mx-xxl-n8{margin-left:-32px !important}.mb-xxl-n8,.my-xxl-n8{margin-bottom:-32px !important}.ms-xxl-n8{margin-inline-start:-32px !important}.me-xxl-n8{margin-inline-end:-32px !important}.ma-xxl-n8{margin:-32px !important}.mt-xxl-n9,.my-xxl-n9{margin-top:-36px !important}.mr-xxl-n9,.mx-xxl-n9{margin-right:-36px !important}.ml-xxl-n9,.mx-xxl-n9{margin-left:-36px !important}.mb-xxl-n9,.my-xxl-n9{margin-bottom:-36px !important}.ms-xxl-n9{margin-inline-start:-36px !important}.me-xxl-n9{margin-inline-end:-36px !important}.ma-xxl-n9{margin:-36px !important}.mt-xxl-n10,.my-xxl-n10{margin-top:-40px !important}.mr-xxl-n10,.mx-xxl-n10{margin-right:-40px !important}.ml-xxl-n10,.mx-xxl-n10{margin-left:-40px !important}.mb-xxl-n10,.my-xxl-n10{margin-bottom:-40px !important}.ms-xxl-n10{margin-inline-start:-40px !important}.me-xxl-n10{margin-inline-end:-40px !important}.ma-xxl-n10{margin:-40px !important}.mt-xxl-n11,.my-xxl-n11{margin-top:-44px !important}.mr-xxl-n11,.mx-xxl-n11{margin-right:-44px !important}.ml-xxl-n11,.mx-xxl-n11{margin-left:-44px !important}.mb-xxl-n11,.my-xxl-n11{margin-bottom:-44px !important}.ms-xxl-n11{margin-inline-start:-44px !important}.me-xxl-n11{margin-inline-end:-44px !important}.ma-xxl-n11{margin:-44px !important}.mt-xxl-n12,.my-xxl-n12{margin-top:-48px !important}.mr-xxl-n12,.mx-xxl-n12{margin-right:-48px !important}.ml-xxl-n12,.mx-xxl-n12{margin-left:-48px !important}.mb-xxl-n12,.my-xxl-n12{margin-bottom:-48px !important}.ms-xxl-n12{margin-inline-start:-48px !important}.me-xxl-n12{margin-inline-end:-48px !important}.ma-xxl-n12{margin:-48px !important}.mt-xxl-n13,.my-xxl-n13{margin-top:-52px !important}.mr-xxl-n13,.mx-xxl-n13{margin-right:-52px !important}.ml-xxl-n13,.mx-xxl-n13{margin-left:-52px !important}.mb-xxl-n13,.my-xxl-n13{margin-bottom:-52px !important}.ms-xxl-n13{margin-inline-start:-52px !important}.me-xxl-n13{margin-inline-end:-52px !important}.ma-xxl-n13{margin:-52px !important}.mt-xxl-n14,.my-xxl-n14{margin-top:-56px !important}.mr-xxl-n14,.mx-xxl-n14{margin-right:-56px !important}.ml-xxl-n14,.mx-xxl-n14{margin-left:-56px !important}.mb-xxl-n14,.my-xxl-n14{margin-bottom:-56px !important}.ms-xxl-n14{margin-inline-start:-56px !important}.me-xxl-n14{margin-inline-end:-56px !important}.ma-xxl-n14{margin:-56px !important}.mt-xxl-n15,.my-xxl-n15{margin-top:-60px !important}.mr-xxl-n15,.mx-xxl-n15{margin-right:-60px !important}.ml-xxl-n15,.mx-xxl-n15{margin-left:-60px !important}.mb-xxl-n15,.my-xxl-n15{margin-bottom:-60px !important}.ms-xxl-n15{margin-inline-start:-60px !important}.me-xxl-n15{margin-inline-end:-60px !important}.ma-xxl-n15{margin:-60px !important}.mt-xxl-n16,.my-xxl-n16{margin-top:-64px !important}.mr-xxl-n16,.mx-xxl-n16{margin-right:-64px !important}.ml-xxl-n16,.mx-xxl-n16{margin-left:-64px !important}.mb-xxl-n16,.my-xxl-n16{margin-bottom:-64px !important}.ms-xxl-n16{margin-inline-start:-64px !important}.me-xxl-n16{margin-inline-end:-64px !important}.ma-xxl-n16{margin:-64px !important}.mt-xxl-n17,.my-xxl-n17{margin-top:-68px !important}.mr-xxl-n17,.mx-xxl-n17{margin-right:-68px !important}.ml-xxl-n17,.mx-xxl-n17{margin-left:-68px !important}.mb-xxl-n17,.my-xxl-n17{margin-bottom:-68px !important}.ms-xxl-n17{margin-inline-start:-68px !important}.me-xxl-n17{margin-inline-end:-68px !important}.ma-xxl-n17{margin:-68px !important}.mt-xxl-n18,.my-xxl-n18{margin-top:-72px !important}.mr-xxl-n18,.mx-xxl-n18{margin-right:-72px !important}.ml-xxl-n18,.mx-xxl-n18{margin-left:-72px !important}.mb-xxl-n18,.my-xxl-n18{margin-bottom:-72px !important}.ms-xxl-n18{margin-inline-start:-72px !important}.me-xxl-n18{margin-inline-end:-72px !important}.ma-xxl-n18{margin:-72px !important}.mt-xxl-n19,.my-xxl-n19{margin-top:-76px !important}.mr-xxl-n19,.mx-xxl-n19{margin-right:-76px !important}.ml-xxl-n19,.mx-xxl-n19{margin-left:-76px !important}.mb-xxl-n19,.my-xxl-n19{margin-bottom:-76px !important}.ms-xxl-n19{margin-inline-start:-76px !important}.me-xxl-n19{margin-inline-end:-76px !important}.ma-xxl-n19{margin:-76px !important}.mt-xxl-n20,.my-xxl-n20{margin-top:-80px !important}.mr-xxl-n20,.mx-xxl-n20{margin-right:-80px !important}.ml-xxl-n20,.mx-xxl-n20{margin-left:-80px !important}.mb-xxl-n20,.my-xxl-n20{margin-bottom:-80px !important}.ms-xxl-n20{margin-inline-start:-80px !important}.me-xxl-n20{margin-inline-end:-80px !important}.ma-xxl-n20{margin:-80px !important}}.mud-width-full{width:100%}.mud-height-full{height:100%}.w-max{width:max-content}.mud-appbar{width:100%;display:flex;z-index:var(--mud-zindex-appbar);position:relative;box-sizing:border-box;flex-shrink:0;flex-direction:column;color:var(--mud-palette-appbar-text);background-color:var(--mud-palette-appbar-background);transition:margin 225ms cubic-bezier(0, 0, 0.2, 1) 0ms,width 225ms cubic-bezier(0, 0, 0.2, 1) 0ms}.mud-appbar.mud-appbar-fixed-top{position:fixed;top:0;right:0;left:0}.mud-appbar.mud-appbar-fixed-top .mud-popover-cascading-value{position:fixed}.mud-appbar.mud-appbar-fixed-bottom{position:fixed;bottom:0;right:0;left:0}.mud-appbar.mud-appbar-fixed-bottom .mud-popover-cascading-value{position:fixed}.mud-appbar .mud-toolbar-appbar{height:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/8)}@media(min-width: 0px)and (orientation: landscape){.mud-appbar .mud-toolbar-appbar{height:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/4)}}@media(min-width: 600px){.mud-appbar .mud-toolbar-appbar{height:var(--mud-appbar-height)}}.mud-appbar.mud-appbar-dense .mud-toolbar-appbar{height:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/4)}@media(min-width: 0px){.mud-drawer-open-responsive-xs-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);width:calc(100% - var(--mud-drawer-width-left))}.mud-drawer-open-responsive-xs-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-right))}.mud-drawer-open-responsive-xs-left.mud-drawer-left-clipped-never.mud-drawer-open-responsive-xs-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-left) - var(--mud-drawer-width-right))}}@media(min-width: 600px){.mud-drawer-open-responsive-sm-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);width:calc(100% - var(--mud-drawer-width-left))}.mud-drawer-open-responsive-sm-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-right))}.mud-drawer-open-responsive-sm-left.mud-drawer-left-clipped-never.mud-drawer-open-responsive-sm-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-left) - var(--mud-drawer-width-right))}}@media(min-width: 960px){.mud-drawer-open-responsive-md-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);width:calc(100% - var(--mud-drawer-width-left))}.mud-drawer-open-responsive-md-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-right))}.mud-drawer-open-responsive-md-left.mud-drawer-left-clipped-never.mud-drawer-open-responsive-md-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-left) - var(--mud-drawer-width-right))}}@media(min-width: 1280px){.mud-drawer-open-responsive-lg-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);width:calc(100% - var(--mud-drawer-width-left))}.mud-drawer-open-responsive-lg-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-right))}.mud-drawer-open-responsive-lg-left.mud-drawer-left-clipped-never.mud-drawer-open-responsive-lg-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-left) - var(--mud-drawer-width-right))}}@media(min-width: 1920px){.mud-drawer-open-responsive-xl-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);width:calc(100% - var(--mud-drawer-width-left))}.mud-drawer-open-responsive-xl-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-right))}.mud-drawer-open-responsive-xl-left.mud-drawer-left-clipped-never.mud-drawer-open-responsive-xl-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-left) - var(--mud-drawer-width-right))}}@media(min-width: 2560px){.mud-drawer-open-responsive-xxl-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);width:calc(100% - var(--mud-drawer-width-left))}.mud-drawer-open-responsive-xxl-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-right))}.mud-drawer-open-responsive-xxl-left.mud-drawer-left-clipped-never.mud-drawer-open-responsive-xxl-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-left) - var(--mud-drawer-width-right))}}.mud-drawer-open-persistent-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);width:calc(100% - var(--mud-drawer-width-left))}.mud-drawer-open-persistent-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-right))}.mud-drawer-open-persistent-left.mud-drawer-left-clipped-never.mud-drawer-open-persistent-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-left) - var(--mud-drawer-width-right))}@media(min-width: 0px){.mud-drawer-open-mini-xs-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);width:calc(100% - var(--mud-drawer-width-left))}.mud-drawer-open-mini-xs-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-right))}.mud-drawer-open-mini-xs-left.mud-drawer-left-clipped-never.mud-drawer-open-mini-xs-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-left) - var(--mud-drawer-width-right))}}@media(min-width: 600px){.mud-drawer-open-mini-sm-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);width:calc(100% - var(--mud-drawer-width-left))}.mud-drawer-open-mini-sm-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-right))}.mud-drawer-open-mini-sm-left.mud-drawer-left-clipped-never.mud-drawer-open-mini-sm-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-left) - var(--mud-drawer-width-right))}}@media(min-width: 960px){.mud-drawer-open-mini-md-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);width:calc(100% - var(--mud-drawer-width-left))}.mud-drawer-open-mini-md-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-right))}.mud-drawer-open-mini-md-left.mud-drawer-left-clipped-never.mud-drawer-open-mini-md-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-left) - var(--mud-drawer-width-right))}}@media(min-width: 1280px){.mud-drawer-open-mini-lg-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);width:calc(100% - var(--mud-drawer-width-left))}.mud-drawer-open-mini-lg-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-right))}.mud-drawer-open-mini-lg-left.mud-drawer-left-clipped-never.mud-drawer-open-mini-lg-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-left) - var(--mud-drawer-width-right))}}@media(min-width: 1920px){.mud-drawer-open-mini-xl-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);width:calc(100% - var(--mud-drawer-width-left))}.mud-drawer-open-mini-xl-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-right))}.mud-drawer-open-mini-xl-left.mud-drawer-left-clipped-never.mud-drawer-open-mini-xl-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-left) - var(--mud-drawer-width-right))}}@media(min-width: 2560px){.mud-drawer-open-mini-xxl-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);width:calc(100% - var(--mud-drawer-width-left))}.mud-drawer-open-mini-xxl-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-right))}.mud-drawer-open-mini-xxl-left.mud-drawer-left-clipped-never.mud-drawer-open-mini-xxl-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-left) - var(--mud-drawer-width-right))}}.mud-drawer-close-mini-xs-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);width:calc(100% - var(--mud-drawer-width-mini-left))}.mud-drawer-close-mini-xs-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-right))}.mud-drawer-close-mini-xs-left.mud-drawer-left-clipped-never.mud-drawer-close-mini-xs-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-left) - var(--mud-drawer-width-mini-right))}@media(max-width: 0px){.mud-drawer-close-mini-xs-left.mud-drawer-left-clipped-docked .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);width:calc(100% - var(--mud-drawer-width-mini-left))}.mud-drawer-close-mini-xs-right.mud-drawer-right-clipped-docked .mud-appbar{margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-right))}.mud-drawer-close-mini-xs-left.mud-drawer-left-clipped-docked.mud-drawer-close-mini-xs-right.mud-drawer-right-clipped-docked .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-left) - var(--mud-drawer-width-mini-right))}}.mud-drawer-close-mini-sm-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);width:calc(100% - var(--mud-drawer-width-mini-left))}.mud-drawer-close-mini-sm-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-right))}.mud-drawer-close-mini-sm-left.mud-drawer-left-clipped-never.mud-drawer-close-mini-sm-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-left) - var(--mud-drawer-width-mini-right))}@media(max-width: 600px){.mud-drawer-close-mini-sm-left.mud-drawer-left-clipped-docked .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);width:calc(100% - var(--mud-drawer-width-mini-left))}.mud-drawer-close-mini-sm-right.mud-drawer-right-clipped-docked .mud-appbar{margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-right))}.mud-drawer-close-mini-sm-left.mud-drawer-left-clipped-docked.mud-drawer-close-mini-sm-right.mud-drawer-right-clipped-docked .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-left) - var(--mud-drawer-width-mini-right))}}.mud-drawer-close-mini-md-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);width:calc(100% - var(--mud-drawer-width-mini-left))}.mud-drawer-close-mini-md-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-right))}.mud-drawer-close-mini-md-left.mud-drawer-left-clipped-never.mud-drawer-close-mini-md-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-left) - var(--mud-drawer-width-mini-right))}@media(max-width: 960px){.mud-drawer-close-mini-md-left.mud-drawer-left-clipped-docked .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);width:calc(100% - var(--mud-drawer-width-mini-left))}.mud-drawer-close-mini-md-right.mud-drawer-right-clipped-docked .mud-appbar{margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-right))}.mud-drawer-close-mini-md-left.mud-drawer-left-clipped-docked.mud-drawer-close-mini-md-right.mud-drawer-right-clipped-docked .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-left) - var(--mud-drawer-width-mini-right))}}.mud-drawer-close-mini-lg-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);width:calc(100% - var(--mud-drawer-width-mini-left))}.mud-drawer-close-mini-lg-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-right))}.mud-drawer-close-mini-lg-left.mud-drawer-left-clipped-never.mud-drawer-close-mini-lg-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-left) - var(--mud-drawer-width-mini-right))}@media(max-width: 1280px){.mud-drawer-close-mini-lg-left.mud-drawer-left-clipped-docked .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);width:calc(100% - var(--mud-drawer-width-mini-left))}.mud-drawer-close-mini-lg-right.mud-drawer-right-clipped-docked .mud-appbar{margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-right))}.mud-drawer-close-mini-lg-left.mud-drawer-left-clipped-docked.mud-drawer-close-mini-lg-right.mud-drawer-right-clipped-docked .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-left) - var(--mud-drawer-width-mini-right))}}.mud-drawer-close-mini-xl-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);width:calc(100% - var(--mud-drawer-width-mini-left))}.mud-drawer-close-mini-xl-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-right))}.mud-drawer-close-mini-xl-left.mud-drawer-left-clipped-never.mud-drawer-close-mini-xl-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-left) - var(--mud-drawer-width-mini-right))}@media(max-width: 1920px){.mud-drawer-close-mini-xl-left.mud-drawer-left-clipped-docked .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);width:calc(100% - var(--mud-drawer-width-mini-left))}.mud-drawer-close-mini-xl-right.mud-drawer-right-clipped-docked .mud-appbar{margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-right))}.mud-drawer-close-mini-xl-left.mud-drawer-left-clipped-docked.mud-drawer-close-mini-xl-right.mud-drawer-right-clipped-docked .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-left) - var(--mud-drawer-width-mini-right))}}.mud-drawer-close-mini-xxl-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);width:calc(100% - var(--mud-drawer-width-mini-left))}.mud-drawer-close-mini-xxl-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-right))}.mud-drawer-close-mini-xxl-left.mud-drawer-left-clipped-never.mud-drawer-close-mini-xxl-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-left) - var(--mud-drawer-width-mini-right))}@media(max-width: 2560px){.mud-drawer-close-mini-xxl-left.mud-drawer-left-clipped-docked .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);width:calc(100% - var(--mud-drawer-width-mini-left))}.mud-drawer-close-mini-xxl-right.mud-drawer-right-clipped-docked .mud-appbar{margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-right))}.mud-drawer-close-mini-xxl-left.mud-drawer-left-clipped-docked.mud-drawer-close-mini-xxl-right.mud-drawer-right-clipped-docked .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-left) - var(--mud-drawer-width-mini-right))}}.mud-drawer{display:flex;flex-shrink:0;flex-grow:1;flex:0 0 auto;outline:0;position:fixed;z-index:var(--mud-zindex-drawer);overflow-y:auto;flex-direction:column;color:var(--mud-palette-drawer-text);background-color:var(--mud-palette-drawer-background);--mud-drawer-content-height: 0}.mud-drawer .mud-drawer-content{height:100%;max-height:100%;display:flex;flex-shrink:0;flex-grow:1;flex:0 0 auto;flex-direction:column}.mud-drawer:not(.mud-drawer-fixed){position:absolute}@media(max-width: -1px){.mud-drawer.mud-drawer-mini.mud-drawer-xs:not(.mud-drawer--closed),.mud-drawer.mud-drawer-responsive.mud-drawer-xs{z-index:calc(var(--mud-zindex-appbar) + 2)}.mud-drawer.mud-drawer-mini.mud-drawer-xs:not(.mud-drawer--closed).mud-drawer--initial:not(.mud-drawer-mini),.mud-drawer.mud-drawer-responsive.mud-drawer-xs.mud-drawer--initial:not(.mud-drawer-mini){display:none !important}}@media(max-width: 599px){.mud-drawer.mud-drawer-mini.mud-drawer-sm:not(.mud-drawer--closed),.mud-drawer.mud-drawer-responsive.mud-drawer-sm{z-index:calc(var(--mud-zindex-appbar) + 2)}.mud-drawer.mud-drawer-mini.mud-drawer-sm:not(.mud-drawer--closed).mud-drawer--initial:not(.mud-drawer-mini),.mud-drawer.mud-drawer-responsive.mud-drawer-sm.mud-drawer--initial:not(.mud-drawer-mini){display:none !important}}@media(max-width: 959px){.mud-drawer.mud-drawer-mini.mud-drawer-md:not(.mud-drawer--closed),.mud-drawer.mud-drawer-responsive.mud-drawer-md{z-index:calc(var(--mud-zindex-appbar) + 2)}.mud-drawer.mud-drawer-mini.mud-drawer-md:not(.mud-drawer--closed).mud-drawer--initial:not(.mud-drawer-mini),.mud-drawer.mud-drawer-responsive.mud-drawer-md.mud-drawer--initial:not(.mud-drawer-mini){display:none !important}}@media(max-width: 1279px){.mud-drawer.mud-drawer-mini.mud-drawer-lg:not(.mud-drawer--closed),.mud-drawer.mud-drawer-responsive.mud-drawer-lg{z-index:calc(var(--mud-zindex-appbar) + 2)}.mud-drawer.mud-drawer-mini.mud-drawer-lg:not(.mud-drawer--closed).mud-drawer--initial:not(.mud-drawer-mini),.mud-drawer.mud-drawer-responsive.mud-drawer-lg.mud-drawer--initial:not(.mud-drawer-mini){display:none !important}}@media(max-width: 1919px){.mud-drawer.mud-drawer-mini.mud-drawer-xl:not(.mud-drawer--closed),.mud-drawer.mud-drawer-responsive.mud-drawer-xl{z-index:calc(var(--mud-zindex-appbar) + 2)}.mud-drawer.mud-drawer-mini.mud-drawer-xl:not(.mud-drawer--closed).mud-drawer--initial:not(.mud-drawer-mini),.mud-drawer.mud-drawer-responsive.mud-drawer-xl.mud-drawer--initial:not(.mud-drawer-mini){display:none !important}}@media(max-width: 2559px){.mud-drawer.mud-drawer-mini.mud-drawer-xxl:not(.mud-drawer--closed),.mud-drawer.mud-drawer-responsive.mud-drawer-xxl{z-index:calc(var(--mud-zindex-appbar) + 2)}.mud-drawer.mud-drawer-mini.mud-drawer-xxl:not(.mud-drawer--closed).mud-drawer--initial:not(.mud-drawer-mini),.mud-drawer.mud-drawer-responsive.mud-drawer-xxl.mud-drawer--initial:not(.mud-drawer-mini){display:none !important}}.mud-drawer.mud-drawer-responsive,.mud-drawer.mud-drawer-persistent{height:100%}.mud-drawer.mud-drawer-responsive.mud-drawer-pos-left,.mud-drawer.mud-drawer-persistent.mud-drawer-pos-left{right:auto;width:var(--mud-drawer-width, var(--mud-drawer-width-left))}.mud-drawer.mud-drawer-responsive.mud-drawer-pos-left.mud-drawer--open,.mud-drawer.mud-drawer-persistent.mud-drawer-pos-left.mud-drawer--open{left:0}.mud-drawer.mud-drawer-responsive.mud-drawer-pos-left.mud-drawer--open:not(.mud-drawer--initial),.mud-drawer.mud-drawer-persistent.mud-drawer-pos-left.mud-drawer--open:not(.mud-drawer--initial){animation:mud-drawer-slide-in-left 225ms cubic-bezier(0, 0, 0.2, 1)}.mud-drawer.mud-drawer-responsive.mud-drawer-pos-left.mud-drawer--closed,.mud-drawer.mud-drawer-persistent.mud-drawer-pos-left.mud-drawer--closed{box-shadow:none;left:calc(-1*var(--mud-drawer-width, var(--mud-drawer-width-left)))}.mud-drawer.mud-drawer-responsive.mud-drawer-pos-left.mud-drawer--closed:not(.mud-drawer--initial),.mud-drawer.mud-drawer-persistent.mud-drawer-pos-left.mud-drawer--closed:not(.mud-drawer--initial){animation:mud-drawer-slide-out-left 225ms cubic-bezier(0, 0, 0.2, 1)}.mud-drawer.mud-drawer-responsive.mud-drawer-pos-right,.mud-drawer.mud-drawer-persistent.mud-drawer-pos-right{left:auto;width:var(--mud-drawer-width, var(--mud-drawer-width-right))}.mud-drawer.mud-drawer-responsive.mud-drawer-pos-right.mud-drawer--open,.mud-drawer.mud-drawer-persistent.mud-drawer-pos-right.mud-drawer--open{right:0}.mud-drawer.mud-drawer-responsive.mud-drawer-pos-right.mud-drawer--open:not(.mud-drawer--initial),.mud-drawer.mud-drawer-persistent.mud-drawer-pos-right.mud-drawer--open:not(.mud-drawer--initial){animation:mud-drawer-slide-in-right 225ms cubic-bezier(0, 0, 0.2, 1)}.mud-drawer.mud-drawer-responsive.mud-drawer-pos-right.mud-drawer--closed,.mud-drawer.mud-drawer-persistent.mud-drawer-pos-right.mud-drawer--closed{box-shadow:none;right:calc(-1*var(--mud-drawer-width, var(--mud-drawer-width-right)))}.mud-drawer.mud-drawer-responsive.mud-drawer-pos-right.mud-drawer--closed:not(.mud-drawer--initial),.mud-drawer.mud-drawer-persistent.mud-drawer-pos-right.mud-drawer--closed:not(.mud-drawer--initial){animation:mud-drawer-slide-out-right 225ms cubic-bezier(0, 0, 0.2, 1)}.mud-drawer.mud-drawer-mini{height:100%;transition:width 225ms cubic-bezier(0, 0, 0.2, 1)}.mud-drawer.mud-drawer-mini.mud-drawer-pos-left{left:0;right:auto}.mud-drawer.mud-drawer-mini.mud-drawer-pos-left.mud-drawer--closed{width:var(--mud-drawer-width-mini-left)}.mud-drawer.mud-drawer-mini.mud-drawer-pos-left.mud-drawer--open{width:var(--mud-drawer-width-left)}.mud-drawer.mud-drawer-mini.mud-drawer-pos-right{left:auto;right:0}.mud-drawer.mud-drawer-mini.mud-drawer-pos-right.mud-drawer--closed{width:var(--mud-drawer-width-mini-right)}.mud-drawer.mud-drawer-mini.mud-drawer-pos-right.mud-drawer--open{width:var(--mud-drawer-width-right)}.mud-drawer.mud-drawer-temporary{margin:0 !important;z-index:calc(var(--mud-zindex-appbar) + 2);transition:transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-left{right:auto;top:0;height:100%;width:var(--mud-drawer-width, var(--mud-drawer-width-left))}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-left.mud-drawer--open{left:0}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-left.mud-drawer--open:not(.mud-drawer--initial){animation:mud-drawer-slide-in-left 225ms cubic-bezier(0, 0, 0.2, 1) forwards}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-left.mud-drawer--closed{left:calc(-1*var(--mud-drawer-width, var(--mud-drawer-width-left)))}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-left.mud-drawer--closed:not(.mud-drawer--initial){animation:mud-drawer-slide-out-left 225ms cubic-bezier(0, 0, 0.2, 1) forwards}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-right{left:auto;top:0;height:100%;width:var(--mud-drawer-width, var(--mud-drawer-width-right))}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-right.mud-drawer--open{right:0}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-right.mud-drawer--open:not(.mud-drawer--initial){animation:mud-drawer-slide-in-right 225ms cubic-bezier(0, 0, 0.2, 1) forwards}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-right.mud-drawer--closed{right:calc(-1*var(--mud-drawer-width, var(--mud-drawer-width-right)))}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-right.mud-drawer--closed:not(.mud-drawer--initial){animation:mud-drawer-slide-out-right 225ms cubic-bezier(0, 0, 0.2, 1) forwards}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-bottom{left:0;top:auto;width:100%}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-bottom.mud-drawer--open{bottom:0}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-bottom.mud-drawer--open:not(.mud-drawer--initial){animation:mud-drawer-slide-in-bottom 225ms cubic-bezier(0, 0, 0.2, 1) 0ms 1}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-bottom.mud-drawer--closed{bottom:calc(-1*var(--mud-drawer-content-height))}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-bottom.mud-drawer--closed:not(.mud-drawer--initial){animation:mud-drawer-slide-out-bottom 225ms cubic-bezier(0, 0, 0.2, 1) 0ms 1}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-top{left:0;bottom:auto;width:100%}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-top.mud-drawer--open{top:0}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-top.mud-drawer--open:not(.mud-drawer--initial){animation:mud-drawer-slide-in-top 225ms cubic-bezier(0, 0, 0.2, 1) 0ms 1}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-top.mud-drawer--closed{top:calc(-1*var(--mud-drawer-content-height))}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-top.mud-drawer--closed:not(.mud-drawer--initial){animation:mud-drawer-slide-out-top 225ms cubic-bezier(0, 0, 0.2, 1) 0ms 1}.mud-drawer.mud-drawer-mini.mud-drawer-pos-left~div:not(.mud-main-content),.mud-drawer.mud-drawer-mini.mud-drawer-pos-right~div:not(.mud-main-content),.mud-drawer.mud-drawer-persistent.mud-drawer-pos-left~div:not(.mud-main-content),.mud-drawer.mud-drawer-persistent.mud-drawer-pos-right~div:not(.mud-main-content){transition:margin 225ms cubic-bezier(0, 0, 0.2, 1) 0ms}.mud-drawer.mud-drawer-mini.mud-drawer-pos-left.mud-drawer--open~div:not(.mud-main-content),.mud-drawer.mud-drawer-persistent.mud-drawer-pos-left.mud-drawer--open~div:not(.mud-main-content){margin-left:var(--mud-drawer-width, var(--mud-drawer-width-left))}.mud-drawer.mud-drawer-mini.mud-drawer-pos-right.mud-drawer--open~div:not(.mud-main-content),.mud-drawer.mud-drawer-persistent.mud-drawer-pos-right.mud-drawer--open~div:not(.mud-main-content){margin-right:var(--mud-drawer-width, var(--mud-drawer-width-right))}.mud-drawer.mud-drawer-mini.mud-drawer-pos-left.mud-drawer--closed~div:not(.mud-main-content){margin-left:var(--mud-drawer-width, var(--mud-drawer-width-mini-left))}.mud-drawer.mud-drawer-mini.mud-drawer-pos-right.mud-drawer--closed~div:not(.mud-main-content){margin-right:var(--mud-drawer-width, var(--mud-drawer-width-mini-right))}.mud-drawer-header{display:flex;min-height:var(--mud-appbar-height);padding:12px 24px 12px 24px}.mud-drawer-header.mud-drawer-header-dense{min-height:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/4);padding:8px 24px 8px 24px}.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-always,.mud-drawer-fixed.mud-drawer-persistent:not(.mud-drawer-clipped-never),.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-always,.mud-drawer-fixed.mud-drawer-temporary.mud-drawer-clipped-always{top:var(--mud-appbar-height);height:calc(100% - var(--mud-appbar-height))}@media(max-width: 599px)and (orientation: landscape){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-always,.mud-drawer-fixed.mud-drawer-persistent:not(.mud-drawer-clipped-never),.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-always,.mud-drawer-fixed.mud-drawer-temporary.mud-drawer-clipped-always{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/4);height:calc(100% - (var(--mud-appbar-height) - var(--mud-appbar-height)/4))}}@media(max-width: 599px)and (orientation: portrait){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-always,.mud-drawer-fixed.mud-drawer-persistent:not(.mud-drawer-clipped-never),.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-always,.mud-drawer-fixed.mud-drawer-temporary.mud-drawer-clipped-always{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/8);height:calc(100% - (var(--mud-appbar-height) - var(--mud-appbar-height)/8))}}@media(min-width: 0px){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-xs,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-xs{top:var(--mud-appbar-height);height:calc(100% - var(--mud-appbar-height))}}@media(min-width: 0px)and (max-width: 599px)and (orientation: landscape){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-xs,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-xs{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height) - var(--mud-appbar-height)/4);height:calc(100% - var(--mud-appbar-height) + var(--mud-appbar-height) - var(--mud-appbar-height)/4)}}@media(min-width: 0px)and (max-width: 599px)and (orientation: portrait){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-xs,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-xs{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/8);height:calc(100% - var(--mud-appbar-height)/8)}}@media(min-width: 600px){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-sm,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-sm{top:var(--mud-appbar-height);height:calc(100% - var(--mud-appbar-height))}}@media(min-width: 600px)and (max-width: 599px)and (orientation: landscape){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-sm,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-sm{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height) - var(--mud-appbar-height)/4);height:calc(100% - var(--mud-appbar-height) + var(--mud-appbar-height) - var(--mud-appbar-height)/4)}}@media(min-width: 600px)and (max-width: 599px)and (orientation: portrait){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-sm,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-sm{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/8);height:calc(100% - var(--mud-appbar-height)/8)}}@media(min-width: 960px){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-md,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-md{top:var(--mud-appbar-height);height:calc(100% - var(--mud-appbar-height))}}@media(min-width: 960px)and (max-width: 599px)and (orientation: landscape){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-md,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-md{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height) - var(--mud-appbar-height)/4);height:calc(100% - var(--mud-appbar-height) + var(--mud-appbar-height) - var(--mud-appbar-height)/4)}}@media(min-width: 960px)and (max-width: 599px)and (orientation: portrait){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-md,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-md{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/8);height:calc(100% - var(--mud-appbar-height)/8)}}@media(min-width: 1280px){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-lg,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-lg{top:var(--mud-appbar-height);height:calc(100% - var(--mud-appbar-height))}}@media(min-width: 1280px)and (max-width: 599px)and (orientation: landscape){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-lg,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-lg{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height) - var(--mud-appbar-height)/4);height:calc(100% - var(--mud-appbar-height) + var(--mud-appbar-height) - var(--mud-appbar-height)/4)}}@media(min-width: 1280px)and (max-width: 599px)and (orientation: portrait){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-lg,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-lg{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/8);height:calc(100% - var(--mud-appbar-height)/8)}}@media(min-width: 1920px){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-xl,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-xl{top:var(--mud-appbar-height);height:calc(100% - var(--mud-appbar-height))}}@media(min-width: 1920px)and (max-width: 599px)and (orientation: landscape){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-xl,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-xl{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height) - var(--mud-appbar-height)/4);height:calc(100% - var(--mud-appbar-height) + var(--mud-appbar-height) - var(--mud-appbar-height)/4)}}@media(min-width: 1920px)and (max-width: 599px)and (orientation: portrait){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-xl,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-xl{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/8);height:calc(100% - var(--mud-appbar-height)/8)}}@media(min-width: 2560px){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-xxl,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-xxl{top:var(--mud-appbar-height);height:calc(100% - var(--mud-appbar-height))}}@media(min-width: 2560px)and (max-width: 599px)and (orientation: landscape){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-xxl,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-xxl{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height) - var(--mud-appbar-height)/4);height:calc(100% - var(--mud-appbar-height) + var(--mud-appbar-height) - var(--mud-appbar-height)/4)}}@media(min-width: 2560px)and (max-width: 599px)and (orientation: portrait){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-xxl,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-xxl{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/8);height:calc(100% - var(--mud-appbar-height)/8)}}.mud-appbar-dense~.mud-drawer-fixed.mud-drawer-mini:not(.mud-drawer-clipped-never),.mud-appbar-dense~.mud-drawer-fixed.mud-drawer-persistent:not(.mud-drawer-clipped-never),.mud-appbar-dense~.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-always,.mud-appbar-dense~.mud-drawer-fixed.mud-drawer-temporary.mud-drawer-clipped-always{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/4);height:calc(100% - var(--mud-appbar-height) + var(--mud-appbar-height)/4)}@media(min-width: 0px){.mud-appbar-dense~.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-xs{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/4);height:calc(100% - var(--mud-appbar-height) + var(--mud-appbar-height)/4)}}@media(min-width: 600px){.mud-appbar-dense~.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-sm{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/4);height:calc(100% - var(--mud-appbar-height) + var(--mud-appbar-height)/4)}}@media(min-width: 960px){.mud-appbar-dense~.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-md{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/4);height:calc(100% - var(--mud-appbar-height) + var(--mud-appbar-height)/4)}}@media(min-width: 1280px){.mud-appbar-dense~.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-lg{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/4);height:calc(100% - var(--mud-appbar-height) + var(--mud-appbar-height)/4)}}@media(min-width: 1920px){.mud-appbar-dense~.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-xl{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/4);height:calc(100% - var(--mud-appbar-height) + var(--mud-appbar-height)/4)}}@media(min-width: 2560px){.mud-appbar-dense~.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-xxl{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/4);height:calc(100% - var(--mud-appbar-height) + var(--mud-appbar-height)/4)}}.mud-drawer-overlay{display:none}@media(max-width: -1px){.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-responsive.mud-drawer-overlay-xs{display:block}.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-responsive.mud-drawer-overlay-xs.mud-drawer--initial{display:none}}@media(max-width: -1px){.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-mini.mud-drawer-overlay-xs{display:block}}@media(max-width: 599px){.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-responsive.mud-drawer-overlay-sm{display:block}.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-responsive.mud-drawer-overlay-sm.mud-drawer--initial{display:none}}@media(max-width: 599px){.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-mini.mud-drawer-overlay-sm{display:block}}@media(max-width: 959px){.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-responsive.mud-drawer-overlay-md{display:block}.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-responsive.mud-drawer-overlay-md.mud-drawer--initial{display:none}}@media(max-width: 959px){.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-mini.mud-drawer-overlay-md{display:block}}@media(max-width: 1279px){.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-responsive.mud-drawer-overlay-lg{display:block}.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-responsive.mud-drawer-overlay-lg.mud-drawer--initial{display:none}}@media(max-width: 1279px){.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-mini.mud-drawer-overlay-lg{display:block}}@media(max-width: 1919px){.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-responsive.mud-drawer-overlay-xl{display:block}.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-responsive.mud-drawer-overlay-xl.mud-drawer--initial{display:none}}@media(max-width: 1919px){.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-mini.mud-drawer-overlay-xl{display:block}}@media(max-width: 2559px){.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-responsive.mud-drawer-overlay-xxl{display:block}.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-responsive.mud-drawer-overlay-xxl.mud-drawer--initial{display:none}}@media(max-width: 2559px){.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-mini.mud-drawer-overlay-xxl{display:block}}.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-temporary{display:block}@keyframes mud-drawer-slide-in-left{from{left:calc(-1*var(--mud-drawer-width, var(--mud-drawer-width-left)))}}@keyframes mud-drawer-slide-out-left{from{left:0}}@keyframes mud-drawer-slide-in-right{from{right:calc(-1*var(--mud-drawer-width, var(--mud-drawer-width-right)))}}@keyframes mud-drawer-slide-out-right{from{right:0}}@keyframes mud-drawer-slide-in-bottom{from{bottom:calc(-1*var(--mud-drawer-content-height))}}@keyframes mud-drawer-slide-out-bottom{from{bottom:0}}@keyframes mud-drawer-slide-in-top{from{top:calc(-1*var(--mud-drawer-content-height))}}@keyframes mud-drawer-slide-out-top{from{top:0}}.mud-main-content{margin:0;flex:1 1 auto;padding-top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/8);transition:margin 225ms cubic-bezier(0, 0, 0.2, 1) 0ms}@media(min-width: 0px)and (orientation: landscape){.mud-main-content{padding-top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/4)}}@media(min-width: 600px){.mud-main-content{padding-top:var(--mud-appbar-height)}}.mud-appbar-dense~.mud-main-content{padding-top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/4)}@media(min-width: 0px){.mud-drawer-open-responsive-xs-left .mud-main-content{margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-responsive-xs-right .mud-main-content{margin-right:var(--mud-drawer-width-right)}.mud-drawer-open-responsive-xs-left.mud-drawer-open-responsive-xs-right .mud-main-content{margin-right:var(--mud-drawer-width-right);margin-left:var(--mud-drawer-width-left)}}@media(min-width: 600px){.mud-drawer-open-responsive-sm-left .mud-main-content{margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-responsive-sm-right .mud-main-content{margin-right:var(--mud-drawer-width-right)}.mud-drawer-open-responsive-sm-left.mud-drawer-open-responsive-sm-right .mud-main-content{margin-right:var(--mud-drawer-width-right);margin-left:var(--mud-drawer-width-left)}}@media(min-width: 960px){.mud-drawer-open-responsive-md-left .mud-main-content{margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-responsive-md-right .mud-main-content{margin-right:var(--mud-drawer-width-right)}.mud-drawer-open-responsive-md-left.mud-drawer-open-responsive-md-right .mud-main-content{margin-right:var(--mud-drawer-width-right);margin-left:var(--mud-drawer-width-left)}}@media(min-width: 1280px){.mud-drawer-open-responsive-lg-left .mud-main-content{margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-responsive-lg-right .mud-main-content{margin-right:var(--mud-drawer-width-right)}.mud-drawer-open-responsive-lg-left.mud-drawer-open-responsive-lg-right .mud-main-content{margin-right:var(--mud-drawer-width-right);margin-left:var(--mud-drawer-width-left)}}@media(min-width: 1920px){.mud-drawer-open-responsive-xl-left .mud-main-content{margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-responsive-xl-right .mud-main-content{margin-right:var(--mud-drawer-width-right)}.mud-drawer-open-responsive-xl-left.mud-drawer-open-responsive-xl-right .mud-main-content{margin-right:var(--mud-drawer-width-right);margin-left:var(--mud-drawer-width-left)}}@media(min-width: 2560px){.mud-drawer-open-responsive-xxl-left .mud-main-content{margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-responsive-xxl-right .mud-main-content{margin-right:var(--mud-drawer-width-right)}.mud-drawer-open-responsive-xxl-left.mud-drawer-open-responsive-xxl-right .mud-main-content{margin-right:var(--mud-drawer-width-right);margin-left:var(--mud-drawer-width-left)}}.mud-drawer-open-persistent-left:not(.mud-drawer-open-persistent-right) .mud-main-content{margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-persistent-right:not(.mud-drawer-open-persistent-left) .mud-main-content{margin-right:var(--mud-drawer-width-right)}.mud-drawer-open-persistent-left.mud-drawer-open-persistent-right .mud-main-content{margin-right:var(--mud-drawer-width-right);margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-mini-xs-left .mud-main-content{margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-mini-xs-right .mud-main-content{margin-right:var(--mud-drawer-width-right)}.mud-drawer-open-mini-xs-left.mud-drawer-open-mini-xs-right .mud-main-content{margin-right:var(--mud-drawer-width-right);margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-mini-sm-left .mud-main-content{margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-mini-sm-right .mud-main-content{margin-right:var(--mud-drawer-width-right)}.mud-drawer-open-mini-sm-left.mud-drawer-open-mini-sm-right .mud-main-content{margin-right:var(--mud-drawer-width-right);margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-mini-md-left .mud-main-content{margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-mini-md-right .mud-main-content{margin-right:var(--mud-drawer-width-right)}.mud-drawer-open-mini-md-left.mud-drawer-open-mini-md-right .mud-main-content{margin-right:var(--mud-drawer-width-right);margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-mini-lg-left .mud-main-content{margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-mini-lg-right .mud-main-content{margin-right:var(--mud-drawer-width-right)}.mud-drawer-open-mini-lg-left.mud-drawer-open-mini-lg-right .mud-main-content{margin-right:var(--mud-drawer-width-right);margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-mini-xl-left .mud-main-content{margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-mini-xl-right .mud-main-content{margin-right:var(--mud-drawer-width-right)}.mud-drawer-open-mini-xl-left.mud-drawer-open-mini-xl-right .mud-main-content{margin-right:var(--mud-drawer-width-right);margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-mini-xxl-left .mud-main-content{margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-mini-xxl-right .mud-main-content{margin-right:var(--mud-drawer-width-right)}.mud-drawer-open-mini-xxl-left.mud-drawer-open-mini-xxl-right .mud-main-content{margin-right:var(--mud-drawer-width-right);margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-mini-none-left .mud-main-content,.mud-drawer-open-mini-always-left .mud-main-content{margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-mini-none-right .mud-main-content,.mud-drawer-open-mini-always-right .mud-main-content{margin-right:var(--mud-drawer-width-right)}.mud-drawer-open-mini-none-left.mud-drawer-open-mini-none,.mud-drawer-open-mini-none .mud-drawer-open-mini-always-right .mud-main-content,.mud-drawer-open-mini-always-left.mud-drawer-open-mini-none,.mud-drawer-open-mini-always .mud-drawer-open-mini-always-right .mud-main-content{margin-right:var(--mud-drawer-width-right);margin-left:var(--mud-drawer-width-left)}.mud-drawer-close-mini-xs-left .mud-main-content{margin-left:var(--mud-drawer-width-mini-left)}.mud-drawer-close-mini-xs-right .mud-main-content{margin-right:var(--mud-drawer-width-mini-right)}.mud-drawer-close-mini-xs-left.mud-drawer-close-mini-xs-right .mud-main-content{margin-right:var(--mud-drawer-width-mini-right);margin-left:var(--mud-drawer-width-mini-left)}.mud-drawer-close-mini-sm-left .mud-main-content{margin-left:var(--mud-drawer-width-mini-left)}.mud-drawer-close-mini-sm-right .mud-main-content{margin-right:var(--mud-drawer-width-mini-right)}.mud-drawer-close-mini-sm-left.mud-drawer-close-mini-sm-right .mud-main-content{margin-right:var(--mud-drawer-width-mini-right);margin-left:var(--mud-drawer-width-mini-left)}.mud-drawer-close-mini-md-left .mud-main-content{margin-left:var(--mud-drawer-width-mini-left)}.mud-drawer-close-mini-md-right .mud-main-content{margin-right:var(--mud-drawer-width-mini-right)}.mud-drawer-close-mini-md-left.mud-drawer-close-mini-md-right .mud-main-content{margin-right:var(--mud-drawer-width-mini-right);margin-left:var(--mud-drawer-width-mini-left)}.mud-drawer-close-mini-lg-left .mud-main-content{margin-left:var(--mud-drawer-width-mini-left)}.mud-drawer-close-mini-lg-right .mud-main-content{margin-right:var(--mud-drawer-width-mini-right)}.mud-drawer-close-mini-lg-left.mud-drawer-close-mini-lg-right .mud-main-content{margin-right:var(--mud-drawer-width-mini-right);margin-left:var(--mud-drawer-width-mini-left)}.mud-drawer-close-mini-xl-left .mud-main-content{margin-left:var(--mud-drawer-width-mini-left)}.mud-drawer-close-mini-xl-right .mud-main-content{margin-right:var(--mud-drawer-width-mini-right)}.mud-drawer-close-mini-xl-left.mud-drawer-close-mini-xl-right .mud-main-content{margin-right:var(--mud-drawer-width-mini-right);margin-left:var(--mud-drawer-width-mini-left)}.mud-drawer-close-mini-xxl-left .mud-main-content{margin-left:var(--mud-drawer-width-mini-left)}.mud-drawer-close-mini-xxl-right .mud-main-content{margin-right:var(--mud-drawer-width-mini-right)}.mud-drawer-close-mini-xxl-left.mud-drawer-close-mini-xxl-right .mud-main-content{margin-right:var(--mud-drawer-width-mini-right);margin-left:var(--mud-drawer-width-mini-left)}.mud-drawer-close-mini-none-left .mud-main-content,.mud-drawer-close-mini-always-left .mud-main-content{margin-left:var(--mud-drawer-width-mini-left)}.mud-drawer-close-mini-none-right .mud-main-content,.mud-drawer-close-mini-always-right .mud-main-content{margin-right:var(--mud-drawer-width-mini-right)}.mud-drawer-close-mini-none-left.mud-drawer-close-mini-none,.mud-drawer-close-mini-none .mud-drawer-close-mini-always-right .mud-main-content,.mud-drawer-close-mini-always-left.mud-drawer-close-mini-none,.mud-drawer-close-mini-always .mud-drawer-close-mini-always-right .mud-main-content{margin-right:var(--mud-drawer-width-mini-right);margin-left:var(--mud-drawer-width-mini-left)}.mud-container{width:100%;display:block;box-sizing:border-box;margin-left:auto;margin-right:auto}.mud-container--gutters{padding-left:16px;padding-right:16px}@media(min-width: 600px){.mud-container--gutters{padding-left:24px;padding-right:24px}}@media(min-width: 600px){.mud-container-fixed{max-width:600px}}@media(min-width: 960px){.mud-container-fixed{max-width:960px}}@media(min-width: 1280px){.mud-container-fixed{max-width:1280px}}@media(min-width: 1920px){.mud-container-fixed{max-width:1920px}}@media(min-width: 2560px){.mud-container-fixed{max-width:2560px}}@media(min-width: 0px){.mud-container-maxwidth-xs{max-width:444px}}@media(min-width: 600px){.mud-container-maxwidth-sm{max-width:600px}}@media(min-width: 960px){.mud-container-maxwidth-md{max-width:960px}}@media(min-width: 1280px){.mud-container-maxwidth-lg{max-width:1280px}}@media(min-width: 1920px){.mud-container-maxwidth-xl{max-width:1920px}}@media(min-width: 2560px){.mud-container-maxwidth-xxl{max-width:2560px}}.scroll-locked{padding-right:8px;overflow:hidden}.scroll-locked .mud-layout .mud-appbar{padding-right:8px}.scroll-locked .mud-layout .mud-main-content .mud-scroll-to-top{padding-right:8px}.scroll-locked-no-padding{overflow:hidden}@-moz-document url-prefix(){.scroll-locked{padding-right:17px}.scroll-locked .mud-layout .mud-appbar{padding-right:17px}.scroll-locked .mud-layout .mud-main-content .mud-scroll-to-top{padding-right:17px}}.mud-scroll-to-top{position:fixed;cursor:pointer;z-index:100}.mud-scroll-to-top.visible{bottom:16px;right:16px;opacity:1;transition:transform .5s;flex:1}.mud-scroll-to-top.hidden{bottom:16px;right:16px;opacity:0;transition:all .5s;visibility:hidden;transform:scale(0) rotate(180deg);flex:0}.mud-scroll-to-top:after{content:"";background:rgba(0,0,0,0);top:0;bottom:0;left:0;right:0;position:absolute;z-index:var(--mud-zindex-tooltip)}.red{background-color:#f44336}.red-text{color:#f44336}.red.lighten-5{background-color:#ffebee}.red-text.text-lighten-5{color:#ffebee}.red.lighten-4{background-color:#ffcdd2}.red-text.text-lighten-4{color:#ffcdd2}.red.lighten-3{background-color:#ef9a9a}.red-text.text-lighten-3{color:#ef9a9a}.red.lighten-2{background-color:#e57373}.red-text.text-lighten-2{color:#e57373}.red.lighten-1{background-color:#ef5350}.red-text.text-lighten-1{color:#ef5350}.red.darken-1{background-color:#e53935}.red-text.text-darken-1{color:#e53935}.red.darken-2{background-color:#d32f2f}.red-text.text-darken-2{color:#d32f2f}.red.darken-3{background-color:#c62828}.red-text.text-darken-3{color:#c62828}.red.darken-4{background-color:#b71c1c}.red-text.text-darken-4{color:#b71c1c}.red.accent-1{background-color:#ff8a80}.red-text.text-accent-1{color:#ff8a80}.red.accent-2{background-color:#ff5252}.red-text.text-accent-2{color:#ff5252}.red.accent-3{background-color:#ff1744}.red-text.text-accent-3{color:#ff1744}.red.accent-4{background-color:#d50000}.red-text.text-accent-4{color:#d50000}.pink{background-color:#e91e63}.pink-text{color:#e91e63}.pink.lighten-5{background-color:#fce4ec}.pink-text.text-lighten-5{color:#fce4ec}.pink.lighten-4{background-color:#f8bbd0}.pink-text.text-lighten-4{color:#f8bbd0}.pink.lighten-3{background-color:#f48fb1}.pink-text.text-lighten-3{color:#f48fb1}.pink.lighten-2{background-color:#f06292}.pink-text.text-lighten-2{color:#f06292}.pink.lighten-1{background-color:#ec407a}.pink-text.text-lighten-1{color:#ec407a}.pink.darken-1{background-color:#d81b60}.pink-text.text-darken-1{color:#d81b60}.pink.darken-2{background-color:#c2185b}.pink-text.text-darken-2{color:#c2185b}.pink.darken-3{background-color:#ad1457}.pink-text.text-darken-3{color:#ad1457}.pink.darken-4{background-color:#880e4f}.pink-text.text-darken-4{color:#880e4f}.pink.accent-1{background-color:#ff80ab}.pink-text.text-accent-1{color:#ff80ab}.pink.accent-2{background-color:#ff4081}.pink-text.text-accent-2{color:#ff4081}.pink.accent-3{background-color:#f50057}.pink-text.text-accent-3{color:#f50057}.pink.accent-4{background-color:#c51162}.pink-text.text-accent-4{color:#c51162}.purple{background-color:#9c27b0}.purple-text{color:#9c27b0}.purple.lighten-5{background-color:#f3e5f5}.purple-text.text-lighten-5{color:#f3e5f5}.purple.lighten-4{background-color:#e1bee7}.purple-text.text-lighten-4{color:#e1bee7}.purple.lighten-3{background-color:#ce93d8}.purple-text.text-lighten-3{color:#ce93d8}.purple.lighten-2{background-color:#ba68c8}.purple-text.text-lighten-2{color:#ba68c8}.purple.lighten-1{background-color:#ab47bc}.purple-text.text-lighten-1{color:#ab47bc}.purple.darken-1{background-color:#8e24aa}.purple-text.text-darken-1{color:#8e24aa}.purple.darken-2{background-color:#7b1fa2}.purple-text.text-darken-2{color:#7b1fa2}.purple.darken-3{background-color:#6a1b9a}.purple-text.text-darken-3{color:#6a1b9a}.purple.darken-4{background-color:#4a148c}.purple-text.text-darken-4{color:#4a148c}.purple.accent-1{background-color:#ea80fc}.purple-text.text-accent-1{color:#ea80fc}.purple.accent-2{background-color:#e040fb}.purple-text.text-accent-2{color:#e040fb}.purple.accent-3{background-color:#d500f9}.purple-text.text-accent-3{color:#d500f9}.purple.accent-4{background-color:#a0f}.purple-text.text-accent-4{color:#a0f}.deep-purple{background-color:#673ab7}.deep-purple-text{color:#673ab7}.deep-purple.lighten-5{background-color:#ede7f6}.deep-purple-text.text-lighten-5{color:#ede7f6}.deep-purple.lighten-4{background-color:#d1c4e9}.deep-purple-text.text-lighten-4{color:#d1c4e9}.deep-purple.lighten-3{background-color:#b39ddb}.deep-purple-text.text-lighten-3{color:#b39ddb}.deep-purple.lighten-2{background-color:#9575cd}.deep-purple-text.text-lighten-2{color:#9575cd}.deep-purple.lighten-1{background-color:#7e57c2}.deep-purple-text.text-lighten-1{color:#7e57c2}.deep-purple.darken-1{background-color:#5e35b1}.deep-purple-text.text-darken-1{color:#5e35b1}.deep-purple.darken-2{background-color:#512da8}.deep-purple-text.text-darken-2{color:#512da8}.deep-purple.darken-3{background-color:#4527a0}.deep-purple-text.text-darken-3{color:#4527a0}.deep-purple.darken-4{background-color:#311b92}.deep-purple-text.text-darken-4{color:#311b92}.deep-purple.accent-1{background-color:#b388ff}.deep-purple-text.text-accent-1{color:#b388ff}.deep-purple.accent-2{background-color:#7c4dff}.deep-purple-text.text-accent-2{color:#7c4dff}.deep-purple.accent-3{background-color:#651fff}.deep-purple-text.text-accent-3{color:#651fff}.deep-purple.accent-4{background-color:#6200ea}.deep-purple-text.text-accent-4{color:#6200ea}.indigo{background-color:#3f51b5}.indigo-text{color:#3f51b5}.indigo.lighten-5{background-color:#e8eaf6}.indigo-text.text-lighten-5{color:#e8eaf6}.indigo.lighten-4{background-color:#c5cae9}.indigo-text.text-lighten-4{color:#c5cae9}.indigo.lighten-3{background-color:#9fa8da}.indigo-text.text-lighten-3{color:#9fa8da}.indigo.lighten-2{background-color:#7986cb}.indigo-text.text-lighten-2{color:#7986cb}.indigo.lighten-1{background-color:#5c6bc0}.indigo-text.text-lighten-1{color:#5c6bc0}.indigo.darken-1{background-color:#3949ab}.indigo-text.text-darken-1{color:#3949ab}.indigo.darken-2{background-color:#303f9f}.indigo-text.text-darken-2{color:#303f9f}.indigo.darken-3{background-color:#283593}.indigo-text.text-darken-3{color:#283593}.indigo.darken-4{background-color:#1a237e}.indigo-text.text-darken-4{color:#1a237e}.indigo.accent-1{background-color:#8c9eff}.indigo-text.text-accent-1{color:#8c9eff}.indigo.accent-2{background-color:#536dfe}.indigo-text.text-accent-2{color:#536dfe}.indigo.accent-3{background-color:#3d5afe}.indigo-text.text-accent-3{color:#3d5afe}.indigo.accent-4{background-color:#304ffe}.indigo-text.text-accent-4{color:#304ffe}.blue{background-color:#2196f3}.blue-text{color:#2196f3}.blue.lighten-5{background-color:#e3f2fd}.blue-text.text-lighten-5{color:#e3f2fd}.blue.lighten-4{background-color:#bbdefb}.blue-text.text-lighten-4{color:#bbdefb}.blue.lighten-3{background-color:#90caf9}.blue-text.text-lighten-3{color:#90caf9}.blue.lighten-2{background-color:#64b5f6}.blue-text.text-lighten-2{color:#64b5f6}.blue.lighten-1{background-color:#42a5f5}.blue-text.text-lighten-1{color:#42a5f5}.blue.darken-1{background-color:#1e88e5}.blue-text.text-darken-1{color:#1e88e5}.blue.darken-2{background-color:#1976d2}.blue-text.text-darken-2{color:#1976d2}.blue.darken-3{background-color:#1565c0}.blue-text.text-darken-3{color:#1565c0}.blue.darken-4{background-color:#0d47a1}.blue-text.text-darken-4{color:#0d47a1}.blue.accent-1{background-color:#82b1ff}.blue-text.text-accent-1{color:#82b1ff}.blue.accent-2{background-color:#448aff}.blue-text.text-accent-2{color:#448aff}.blue.accent-3{background-color:#2979ff}.blue-text.text-accent-3{color:#2979ff}.blue.accent-4{background-color:#2962ff}.blue-text.text-accent-4{color:#2962ff}.light-blue{background-color:#03a9f4}.light-blue-text{color:#03a9f4}.light-blue.lighten-5{background-color:#e1f5fe}.light-blue-text.text-lighten-5{color:#e1f5fe}.light-blue.lighten-4{background-color:#b3e5fc}.light-blue-text.text-lighten-4{color:#b3e5fc}.light-blue.lighten-3{background-color:#81d4fa}.light-blue-text.text-lighten-3{color:#81d4fa}.light-blue.lighten-2{background-color:#4fc3f7}.light-blue-text.text-lighten-2{color:#4fc3f7}.light-blue.lighten-1{background-color:#29b6f6}.light-blue-text.text-lighten-1{color:#29b6f6}.light-blue.darken-1{background-color:#039be5}.light-blue-text.text-darken-1{color:#039be5}.light-blue.darken-2{background-color:#0288d1}.light-blue-text.text-darken-2{color:#0288d1}.light-blue.darken-3{background-color:#0277bd}.light-blue-text.text-darken-3{color:#0277bd}.light-blue.darken-4{background-color:#01579b}.light-blue-text.text-darken-4{color:#01579b}.light-blue.accent-1{background-color:#80d8ff}.light-blue-text.text-accent-1{color:#80d8ff}.light-blue.accent-2{background-color:#40c4ff}.light-blue-text.text-accent-2{color:#40c4ff}.light-blue.accent-3{background-color:#00b0ff}.light-blue-text.text-accent-3{color:#00b0ff}.light-blue.accent-4{background-color:#0091ea}.light-blue-text.text-accent-4{color:#0091ea}.cyan{background-color:#00bcd4}.cyan-text{color:#00bcd4}.cyan.lighten-5{background-color:#e0f7fa}.cyan-text.text-lighten-5{color:#e0f7fa}.cyan.lighten-4{background-color:#b2ebf2}.cyan-text.text-lighten-4{color:#b2ebf2}.cyan.lighten-3{background-color:#80deea}.cyan-text.text-lighten-3{color:#80deea}.cyan.lighten-2{background-color:#4dd0e1}.cyan-text.text-lighten-2{color:#4dd0e1}.cyan.lighten-1{background-color:#26c6da}.cyan-text.text-lighten-1{color:#26c6da}.cyan.darken-1{background-color:#00acc1}.cyan-text.text-darken-1{color:#00acc1}.cyan.darken-2{background-color:#0097a7}.cyan-text.text-darken-2{color:#0097a7}.cyan.darken-3{background-color:#00838f}.cyan-text.text-darken-3{color:#00838f}.cyan.darken-4{background-color:#006064}.cyan-text.text-darken-4{color:#006064}.cyan.accent-1{background-color:#84ffff}.cyan-text.text-accent-1{color:#84ffff}.cyan.accent-2{background-color:#18ffff}.cyan-text.text-accent-2{color:#18ffff}.cyan.accent-3{background-color:#00e5ff}.cyan-text.text-accent-3{color:#00e5ff}.cyan.accent-4{background-color:#00b8d4}.cyan-text.text-accent-4{color:#00b8d4}.teal{background-color:#009688}.teal-text{color:#009688}.teal.lighten-5{background-color:#e0f2f1}.teal-text.text-lighten-5{color:#e0f2f1}.teal.lighten-4{background-color:#b2dfdb}.teal-text.text-lighten-4{color:#b2dfdb}.teal.lighten-3{background-color:#80cbc4}.teal-text.text-lighten-3{color:#80cbc4}.teal.lighten-2{background-color:#4db6ac}.teal-text.text-lighten-2{color:#4db6ac}.teal.lighten-1{background-color:#26a69a}.teal-text.text-lighten-1{color:#26a69a}.teal.darken-1{background-color:#00897b}.teal-text.text-darken-1{color:#00897b}.teal.darken-2{background-color:#00796b}.teal-text.text-darken-2{color:#00796b}.teal.darken-3{background-color:#00695c}.teal-text.text-darken-3{color:#00695c}.teal.darken-4{background-color:#004d40}.teal-text.text-darken-4{color:#004d40}.teal.accent-1{background-color:#a7ffeb}.teal-text.text-accent-1{color:#a7ffeb}.teal.accent-2{background-color:#64ffda}.teal-text.text-accent-2{color:#64ffda}.teal.accent-3{background-color:#1de9b6}.teal-text.text-accent-3{color:#1de9b6}.teal.accent-4{background-color:#00bfa5}.teal-text.text-accent-4{color:#00bfa5}.green{background-color:#4caf50}.green-text{color:#4caf50}.green.lighten-5{background-color:#e8f5e9}.green-text.text-lighten-5{color:#e8f5e9}.green.lighten-4{background-color:#c8e6c9}.green-text.text-lighten-4{color:#c8e6c9}.green.lighten-3{background-color:#a5d6a7}.green-text.text-lighten-3{color:#a5d6a7}.green.lighten-2{background-color:#81c784}.green-text.text-lighten-2{color:#81c784}.green.lighten-1{background-color:#66bb6a}.green-text.text-lighten-1{color:#66bb6a}.green.darken-1{background-color:#43a047}.green-text.text-darken-1{color:#43a047}.green.darken-2{background-color:#388e3c}.green-text.text-darken-2{color:#388e3c}.green.darken-3{background-color:#2e7d32}.green-text.text-darken-3{color:#2e7d32}.green.darken-4{background-color:#1b5e20}.green-text.text-darken-4{color:#1b5e20}.green.accent-1{background-color:#b9f6ca}.green-text.text-accent-1{color:#b9f6ca}.green.accent-2{background-color:#69f0ae}.green-text.text-accent-2{color:#69f0ae}.green.accent-3{background-color:#00e676}.green-text.text-accent-3{color:#00e676}.green.accent-4{background-color:#00c853}.green-text.text-accent-4{color:#00c853}.light-green{background-color:#8bc34a}.light-green-text{color:#8bc34a}.light-green.lighten-5{background-color:#f1f8e9}.light-green-text.text-lighten-5{color:#f1f8e9}.light-green.lighten-4{background-color:#dcedc8}.light-green-text.text-lighten-4{color:#dcedc8}.light-green.lighten-3{background-color:#c5e1a5}.light-green-text.text-lighten-3{color:#c5e1a5}.light-green.lighten-2{background-color:#aed581}.light-green-text.text-lighten-2{color:#aed581}.light-green.lighten-1{background-color:#9ccc65}.light-green-text.text-lighten-1{color:#9ccc65}.light-green.darken-1{background-color:#7cb342}.light-green-text.text-darken-1{color:#7cb342}.light-green.darken-2{background-color:#689f38}.light-green-text.text-darken-2{color:#689f38}.light-green.darken-3{background-color:#558b2f}.light-green-text.text-darken-3{color:#558b2f}.light-green.darken-4{background-color:#33691e}.light-green-text.text-darken-4{color:#33691e}.light-green.accent-1{background-color:#ccff90}.light-green-text.text-accent-1{color:#ccff90}.light-green.accent-2{background-color:#b2ff59}.light-green-text.text-accent-2{color:#b2ff59}.light-green.accent-3{background-color:#76ff03}.light-green-text.text-accent-3{color:#76ff03}.light-green.accent-4{background-color:#64dd17}.light-green-text.text-accent-4{color:#64dd17}.lime{background-color:#cddc39}.lime-text{color:#cddc39}.lime.lighten-5{background-color:#f9fbe7}.lime-text.text-lighten-5{color:#f9fbe7}.lime.lighten-4{background-color:#f0f4c3}.lime-text.text-lighten-4{color:#f0f4c3}.lime.lighten-3{background-color:#e6ee9c}.lime-text.text-lighten-3{color:#e6ee9c}.lime.lighten-2{background-color:#dce775}.lime-text.text-lighten-2{color:#dce775}.lime.lighten-1{background-color:#d4e157}.lime-text.text-lighten-1{color:#d4e157}.lime.darken-1{background-color:#c0ca33}.lime-text.text-darken-1{color:#c0ca33}.lime.darken-2{background-color:#afb42b}.lime-text.text-darken-2{color:#afb42b}.lime.darken-3{background-color:#9e9d24}.lime-text.text-darken-3{color:#9e9d24}.lime.darken-4{background-color:#827717}.lime-text.text-darken-4{color:#827717}.lime.accent-1{background-color:#f4ff81}.lime-text.text-accent-1{color:#f4ff81}.lime.accent-2{background-color:#eeff41}.lime-text.text-accent-2{color:#eeff41}.lime.accent-3{background-color:#c6ff00}.lime-text.text-accent-3{color:#c6ff00}.lime.accent-4{background-color:#aeea00}.lime-text.text-accent-4{color:#aeea00}.yellow{background-color:#ffeb3b}.yellow-text{color:#ffeb3b}.yellow.lighten-5{background-color:#fffde7}.yellow-text.text-lighten-5{color:#fffde7}.yellow.lighten-4{background-color:#fff9c4}.yellow-text.text-lighten-4{color:#fff9c4}.yellow.lighten-3{background-color:#fff59d}.yellow-text.text-lighten-3{color:#fff59d}.yellow.lighten-2{background-color:#fff176}.yellow-text.text-lighten-2{color:#fff176}.yellow.lighten-1{background-color:#ffee58}.yellow-text.text-lighten-1{color:#ffee58}.yellow.darken-1{background-color:#fdd835}.yellow-text.text-darken-1{color:#fdd835}.yellow.darken-2{background-color:#fbc02d}.yellow-text.text-darken-2{color:#fbc02d}.yellow.darken-3{background-color:#f9a825}.yellow-text.text-darken-3{color:#f9a825}.yellow.darken-4{background-color:#f57f17}.yellow-text.text-darken-4{color:#f57f17}.yellow.accent-1{background-color:#ffff8d}.yellow-text.text-accent-1{color:#ffff8d}.yellow.accent-2{background-color:#ff0}.yellow-text.text-accent-2{color:#ff0}.yellow.accent-3{background-color:#ffea00}.yellow-text.text-accent-3{color:#ffea00}.yellow.accent-4{background-color:#ffd600}.yellow-text.text-accent-4{color:#ffd600}.amber{background-color:#ffc107}.amber-text{color:#ffc107}.amber.lighten-5{background-color:#fff8e1}.amber-text.text-lighten-5{color:#fff8e1}.amber.lighten-4{background-color:#ffecb3}.amber-text.text-lighten-4{color:#ffecb3}.amber.lighten-3{background-color:#ffe082}.amber-text.text-lighten-3{color:#ffe082}.amber.lighten-2{background-color:#ffd54f}.amber-text.text-lighten-2{color:#ffd54f}.amber.lighten-1{background-color:#ffca28}.amber-text.text-lighten-1{color:#ffca28}.amber.darken-1{background-color:#ffb300}.amber-text.text-darken-1{color:#ffb300}.amber.darken-2{background-color:#ffa000}.amber-text.text-darken-2{color:#ffa000}.amber.darken-3{background-color:#ff8f00}.amber-text.text-darken-3{color:#ff8f00}.amber.darken-4{background-color:#ff6f00}.amber-text.text-darken-4{color:#ff6f00}.amber.accent-1{background-color:#ffe57f}.amber-text.text-accent-1{color:#ffe57f}.amber.accent-2{background-color:#ffd740}.amber-text.text-accent-2{color:#ffd740}.amber.accent-3{background-color:#ffc400}.amber-text.text-accent-3{color:#ffc400}.amber.accent-4{background-color:#ffab00}.amber-text.text-accent-4{color:#ffab00}.orange{background-color:#ff9800}.orange-text{color:#ff9800}.orange.lighten-5{background-color:#fff3e0}.orange-text.text-lighten-5{color:#fff3e0}.orange.lighten-4{background-color:#ffe0b2}.orange-text.text-lighten-4{color:#ffe0b2}.orange.lighten-3{background-color:#ffcc80}.orange-text.text-lighten-3{color:#ffcc80}.orange.lighten-2{background-color:#ffb74d}.orange-text.text-lighten-2{color:#ffb74d}.orange.lighten-1{background-color:#ffa726}.orange-text.text-lighten-1{color:#ffa726}.orange.darken-1{background-color:#fb8c00}.orange-text.text-darken-1{color:#fb8c00}.orange.darken-2{background-color:#f57c00}.orange-text.text-darken-2{color:#f57c00}.orange.darken-3{background-color:#ef6c00}.orange-text.text-darken-3{color:#ef6c00}.orange.darken-4{background-color:#e65100}.orange-text.text-darken-4{color:#e65100}.orange.accent-1{background-color:#ffd180}.orange-text.text-accent-1{color:#ffd180}.orange.accent-2{background-color:#ffab40}.orange-text.text-accent-2{color:#ffab40}.orange.accent-3{background-color:#ff9100}.orange-text.text-accent-3{color:#ff9100}.orange.accent-4{background-color:#ff6d00}.orange-text.text-accent-4{color:#ff6d00}.deep-orange{background-color:#ff5722}.deep-orange-text{color:#ff5722}.deep-orange.lighten-5{background-color:#fbe9e7}.deep-orange-text.text-lighten-5{color:#fbe9e7}.deep-orange.lighten-4{background-color:#ffccbc}.deep-orange-text.text-lighten-4{color:#ffccbc}.deep-orange.lighten-3{background-color:#ffab91}.deep-orange-text.text-lighten-3{color:#ffab91}.deep-orange.lighten-2{background-color:#ff8a65}.deep-orange-text.text-lighten-2{color:#ff8a65}.deep-orange.lighten-1{background-color:#ff7043}.deep-orange-text.text-lighten-1{color:#ff7043}.deep-orange.darken-1{background-color:#f4511e}.deep-orange-text.text-darken-1{color:#f4511e}.deep-orange.darken-2{background-color:#e64a19}.deep-orange-text.text-darken-2{color:#e64a19}.deep-orange.darken-3{background-color:#d84315}.deep-orange-text.text-darken-3{color:#d84315}.deep-orange.darken-4{background-color:#bf360c}.deep-orange-text.text-darken-4{color:#bf360c}.deep-orange.accent-1{background-color:#ff9e80}.deep-orange-text.text-accent-1{color:#ff9e80}.deep-orange.accent-2{background-color:#ff6e40}.deep-orange-text.text-accent-2{color:#ff6e40}.deep-orange.accent-3{background-color:#ff3d00}.deep-orange-text.text-accent-3{color:#ff3d00}.deep-orange.accent-4{background-color:#dd2c00}.deep-orange-text.text-accent-4{color:#dd2c00}.brown{background-color:#795548}.brown-text{color:#795548}.brown.lighten-5{background-color:#efebe9}.brown-text.text-lighten-5{color:#efebe9}.brown.lighten-4{background-color:#d7ccc8}.brown-text.text-lighten-4{color:#d7ccc8}.brown.lighten-3{background-color:#bcaaa4}.brown-text.text-lighten-3{color:#bcaaa4}.brown.lighten-2{background-color:#a1887f}.brown-text.text-lighten-2{color:#a1887f}.brown.lighten-1{background-color:#8d6e63}.brown-text.text-lighten-1{color:#8d6e63}.brown.darken-1{background-color:#6d4c41}.brown-text.text-darken-1{color:#6d4c41}.brown.darken-2{background-color:#5d4037}.brown-text.text-darken-2{color:#5d4037}.brown.darken-3{background-color:#4e342e}.brown-text.text-darken-3{color:#4e342e}.brown.darken-4{background-color:#3e2723}.brown-text.text-darken-4{color:#3e2723}.blue-gray{background-color:#607d8b}.blue-gray-text{color:#607d8b}.blue-gray.lighten-5{background-color:#eceff1}.blue-gray-text.text-lighten-5{color:#eceff1}.blue-gray.lighten-4{background-color:#cfd8dc}.blue-gray-text.text-lighten-4{color:#cfd8dc}.blue-gray.lighten-3{background-color:#b0bec5}.blue-gray-text.text-lighten-3{color:#b0bec5}.blue-gray.lighten-2{background-color:#90a4ae}.blue-gray-text.text-lighten-2{color:#90a4ae}.blue-gray.lighten-1{background-color:#78909c}.blue-gray-text.text-lighten-1{color:#78909c}.blue-gray.darken-1{background-color:#546e7a}.blue-gray-text.text-darken-1{color:#546e7a}.blue-gray.darken-2{background-color:#455a64}.blue-gray-text.text-darken-2{color:#455a64}.blue-gray.darken-3{background-color:#37474f}.blue-gray-text.text-darken-3{color:#37474f}.blue-gray.darken-4{background-color:#263238}.blue-gray-text.text-darken-4{color:#263238}.gray{background-color:#9e9e9e}.gray-text{color:#9e9e9e}.gray.lighten-5{background-color:#fafafa}.gray-text.text-lighten-5{color:#fafafa}.gray.lighten-4{background-color:#f5f5f5}.gray-text.text-lighten-4{color:#f5f5f5}.gray.lighten-3{background-color:#eee}.gray-text.text-lighten-3{color:#eee}.gray.lighten-2{background-color:#e0e0e0}.gray-text.text-lighten-2{color:#e0e0e0}.gray.lighten-1{background-color:#bdbdbd}.gray-text.text-lighten-1{color:#bdbdbd}.gray.darken-1{background-color:#757575}.gray-text.text-darken-1{color:#757575}.gray.darken-2{background-color:#616161}.gray-text.text-darken-2{color:#616161}.gray.darken-3{background-color:#424242}.gray-text.text-darken-3{color:#424242}.gray.darken-4{background-color:#212121}.gray-text.text-darken-4{color:#212121}.shades.black{background-color:#000}.shades-text.text-black{color:#000}.shades.white{background-color:#fff}.shades-text.text-white{color:#fff}.shades.transparent{background-color:rgba(0,0,0,0)}.shades-text.text-transparent{color:rgba(0,0,0,0)}.mud-ripple{--mud-ripple-offset-x: 0;--mud-ripple-offset-y: 0;position:relative;overflow:hidden}.mud-ripple:after{content:"";display:block;position:absolute;width:100%;height:100%;top:var(--mud-ripple-offset-y);left:var(--mud-ripple-offset-x);pointer-events:none;background-image:radial-gradient(circle, var(--mud-ripple-color) 10%, transparent 10.01%);background-repeat:no-repeat;background-position:50%;transform:scale(20, 20);opacity:0;transition:transform .6s,opacity 1s}.mud-ripple:active:after{transform:scale(0, 0);opacity:var(--mud-ripple-opacity);transition:0s}.mud-ripple:has(.mud-ripple:active):after{opacity:0}.mud-ripple-icon:after,.mud-ripple-checkbox:after,.mud-ripple-switch:after,.mud-ripple-radio:after{transform:scale(14, 14)}.mud-ripple-switch{position:absolute}.mud-rtl{direction:rtl !important}.mud-ltr{direction:ltr !important}.mud-application-layout-rtl .mud-flip-x-rtl{transform:scaleX(-1)} + */.mud-primary{background-color:var(--mud-palette-primary) !important}.mud-primary-text{color:var(--mud-palette-primary) !important;--mud-ripple-color: var(--mud-palette-primary) !important}.mud-primary-hover{background-color:var(--mud-palette-primary-hover) !important}@media(hover: hover)and (pointer: fine){.hover\:mud-primary-hover:hover{background-color:var(--mud-palette-primary-hover) !important}}.hover\:mud-primary-hover:focus-visible,.hover\:mud-primary-hover:active{background-color:var(--mud-palette-primary-hover) !important}.mud-border-primary{border-color:var(--mud-palette-primary) !important}.mud-theme-primary{color:var(--mud-palette-primary-text) !important;background-color:var(--mud-palette-primary) !important}.mud-secondary{background-color:var(--mud-palette-secondary) !important}.mud-secondary-text{color:var(--mud-palette-secondary) !important;--mud-ripple-color: var(--mud-palette-secondary) !important}.mud-secondary-hover{background-color:var(--mud-palette-secondary-hover) !important}@media(hover: hover)and (pointer: fine){.hover\:mud-secondary-hover:hover{background-color:var(--mud-palette-secondary-hover) !important}}.hover\:mud-secondary-hover:focus-visible,.hover\:mud-secondary-hover:active{background-color:var(--mud-palette-secondary-hover) !important}.mud-border-secondary{border-color:var(--mud-palette-secondary) !important}.mud-theme-secondary{color:var(--mud-palette-secondary-text) !important;background-color:var(--mud-palette-secondary) !important}.mud-tertiary{background-color:var(--mud-palette-tertiary) !important}.mud-tertiary-text{color:var(--mud-palette-tertiary) !important;--mud-ripple-color: var(--mud-palette-tertiary) !important}.mud-tertiary-hover{background-color:var(--mud-palette-tertiary-hover) !important}@media(hover: hover)and (pointer: fine){.hover\:mud-tertiary-hover:hover{background-color:var(--mud-palette-tertiary-hover) !important}}.hover\:mud-tertiary-hover:focus-visible,.hover\:mud-tertiary-hover:active{background-color:var(--mud-palette-tertiary-hover) !important}.mud-border-tertiary{border-color:var(--mud-palette-tertiary) !important}.mud-theme-tertiary{color:var(--mud-palette-tertiary-text) !important;background-color:var(--mud-palette-tertiary) !important}.mud-info{background-color:var(--mud-palette-info) !important}.mud-info-text{color:var(--mud-palette-info) !important;--mud-ripple-color: var(--mud-palette-info) !important}.mud-info-hover{background-color:var(--mud-palette-info-hover) !important}@media(hover: hover)and (pointer: fine){.hover\:mud-info-hover:hover{background-color:var(--mud-palette-info-hover) !important}}.hover\:mud-info-hover:focus-visible,.hover\:mud-info-hover:active{background-color:var(--mud-palette-info-hover) !important}.mud-border-info{border-color:var(--mud-palette-info) !important}.mud-theme-info{color:var(--mud-palette-info-text) !important;background-color:var(--mud-palette-info) !important}.mud-success{background-color:var(--mud-palette-success) !important}.mud-success-text{color:var(--mud-palette-success) !important;--mud-ripple-color: var(--mud-palette-success) !important}.mud-success-hover{background-color:var(--mud-palette-success-hover) !important}@media(hover: hover)and (pointer: fine){.hover\:mud-success-hover:hover{background-color:var(--mud-palette-success-hover) !important}}.hover\:mud-success-hover:focus-visible,.hover\:mud-success-hover:active{background-color:var(--mud-palette-success-hover) !important}.mud-border-success{border-color:var(--mud-palette-success) !important}.mud-theme-success{color:var(--mud-palette-success-text) !important;background-color:var(--mud-palette-success) !important}.mud-warning{background-color:var(--mud-palette-warning) !important}.mud-warning-text{color:var(--mud-palette-warning) !important;--mud-ripple-color: var(--mud-palette-warning) !important}.mud-warning-hover{background-color:var(--mud-palette-warning-hover) !important}@media(hover: hover)and (pointer: fine){.hover\:mud-warning-hover:hover{background-color:var(--mud-palette-warning-hover) !important}}.hover\:mud-warning-hover:focus-visible,.hover\:mud-warning-hover:active{background-color:var(--mud-palette-warning-hover) !important}.mud-border-warning{border-color:var(--mud-palette-warning) !important}.mud-theme-warning{color:var(--mud-palette-warning-text) !important;background-color:var(--mud-palette-warning) !important}.mud-error{background-color:var(--mud-palette-error) !important}.mud-error-text{color:var(--mud-palette-error) !important;--mud-ripple-color: var(--mud-palette-error) !important}.mud-error-hover{background-color:var(--mud-palette-error-hover) !important}@media(hover: hover)and (pointer: fine){.hover\:mud-error-hover:hover{background-color:var(--mud-palette-error-hover) !important}}.hover\:mud-error-hover:focus-visible,.hover\:mud-error-hover:active{background-color:var(--mud-palette-error-hover) !important}.mud-border-error{border-color:var(--mud-palette-error) !important}.mud-theme-error{color:var(--mud-palette-error-text) !important;background-color:var(--mud-palette-error) !important}.mud-dark{background-color:var(--mud-palette-dark) !important}.mud-dark-text{color:var(--mud-palette-dark) !important;--mud-ripple-color: var(--mud-palette-dark) !important}.mud-dark-hover{background-color:var(--mud-palette-dark-hover) !important}@media(hover: hover)and (pointer: fine){.hover\:mud-dark-hover:hover{background-color:var(--mud-palette-dark-hover) !important}}.hover\:mud-dark-hover:focus-visible,.hover\:mud-dark-hover:active{background-color:var(--mud-palette-dark-hover) !important}.mud-border-dark{border-color:var(--mud-palette-dark) !important}.mud-theme-dark{color:var(--mud-palette-dark-text) !important;background-color:var(--mud-palette-dark) !important}.mud-inherit-text{color:inherit !important}.mud-border-lines-default{border-color:var(--mud-palette-lines-default)}.mud-background{background-color:var(--mud-palette-background) !important}.mud-background-gray{background-color:var(--mud-palette-background-gray) !important}.mud-theme-transparent{color:inherit !important;background-color:rgba(0,0,0,0) !important}.mud-transparent{background-color:rgba(0,0,0,0) !important}.mud-transparent-text{color:rgba(0,0,0,0) !important}.mud-text-primary{color:var(--mud-palette-text-primary)}.mud-text-secondary{color:var(--mud-palette-text-secondary)}.mud-text-disabled{color:var(--mud-palette-text-disabled)}.white{background-color:#fff !important}.white-text{color:#fff !important}.black{background-color:#000 !important}.black-text{color:#000 !important}*{box-sizing:border-box;margin:0;padding:0;border-width:0;border-style:solid;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-tap-highlight-color:rgba(0,0,0,0)}strong,b{font-weight:700}body{color:var(--mud-palette-text-primary);font-family:var(--mud-typography-default-family);font-size:var(--mud-typography-default-size);font-weight:var(--mud-typography-default-weight);line-height:var(--mud-typography-default-lineheight);letter-spacing:var(--mud-typography-default-letterspacing);text-transform:var(--mud-typography-default-text-transform);background-color:var(--mud-palette-background)}a{color:var(--mud-palette-text-primary)}.mud-layout{height:100%;width:100%;position:relative}#blazor-error-ui{background-color:var(--mud-palette-error);color:var(--mud-palette-error-text);bottom:0;box-shadow:0 -1px 2px rgba(0,0,0,.2);display:none;left:0;padding:.6rem 1.75rem .7rem 1.25rem;position:fixed;width:100%;z-index:9999}#blazor-error-ui .reload{color:inherit;text-decoration:underline}#blazor-error-ui .dismiss{color:inherit;cursor:pointer;position:absolute;right:.75rem;top:.5rem}#components-reconnect-modal{z-index:9999 !important;background-color:var(--mud-palette-background) !important}#components-reconnect-modal h5{font-size:18px}#components-reconnect-modal button{color:var(--mud-palette-text-primary);padding:8px 16px;font-size:.875rem;min-width:64px;box-sizing:border-box;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;font-weight:500;line-height:1;border-radius:var(--mud-default-borderradius);letter-spacing:.02857em;text-transform:uppercase;margin:40px auto !important}@media(hover: hover)and (pointer: fine){#components-reconnect-modal button:hover{background-color:var(--mud-palette-action-default-hover)}}@keyframes mud-animation-fadein{0%{opacity:0}100%{opacity:1}}@-moz-keyframes mud-animation-fadein{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes mud-animation-fadein{0%{opacity:0}100%{opacity:1}}@-o-keyframes mud-animation-fadein{0%{opacity:0}100%{opacity:1}}@-ms-keyframes mud-animation-fadein{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes mud-scale-up-center{0%{-webkit-transform:scale(0.5);transform:scale(0.5)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes mud-scale-up-center{0%{-webkit-transform:scale(0.5);transform:scale(0.5)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes mud-skeleton-keyframes-pulse{0%{opacity:1}50%{opacity:.4}100%{opacity:1}}@-webkit-keyframes mud-skeleton-keyframes-wave{0%{transform:translateX(-100%)}60%{transform:translateX(100%)}100%{transform:translateX(100%)}}@-webkit-keyframes mud-progress-circular-keyframes-circular-rotate{0%{transform-origin:50% 50%}100%{transform:rotate(360deg)}}@-webkit-keyframes mud-progress-circular-keyframes-circular-dash{0%{stroke-dasharray:1px,200px;stroke-dashoffset:0px}50%{stroke-dasharray:100px,200px;stroke-dashoffset:-15px}100%{stroke-dasharray:100px,200px;stroke-dashoffset:-125px}}@-webkit-keyframes mud-progress-linear-horizontal-keyframes-indeterminate1{0%{left:-35%;right:100%}60%{left:100%;right:-90%}100%{left:100%;right:-90%}}@-webkit-keyframes mud-progress-linear-horizontal-keyframes-indeterminate2{0%{left:-200%;right:100%}60%{left:107%;right:-8%}100%{left:107%;right:-8%}}@-webkit-keyframes mud-progress-linear-horizontal-keyframes-buffer{0%{opacity:1;background-position:0 50%}50%{opacity:0;background-position:0 50%}100%{opacity:1;background-position:-200px 50%}}@-webkit-keyframes mud-progress-linear-vertical-keyframes-indeterminate1{0%{bottom:-35%;top:100%}60%{bottom:100%;top:-90%}100%{bottom:100%;top:-90%}}@-webkit-keyframes mud-progress-linear-vertical-keyframes-indeterminate2{0%{bottom:-200%;top:100%}60%{bottom:107%;top:-8%}100%{bottom:107%;top:-8%}}@-webkit-keyframes mud-progress-linear-vertical-keyframes-buffer{0%{opacity:1;background-position:50% 0}50%{opacity:0;background-position:50% 0}100%{opacity:1;background-position:50% -200px}}@keyframes mud-progress-linear-striped-loading{0%{background-position:0 0}100%{background-position:300px 0}}a{text-decoration:none}a:focus-visible{outline:none}label{display:inline-block}button{color:inherit;border:0;cursor:pointer;margin:0;display:inline-flex;outline:0;padding:0;position:relative;align-items:center;user-select:none;border-radius:0;vertical-align:middle;-moz-appearance:none;justify-content:center;text-decoration:none;background-color:rgba(0,0,0,0);-webkit-appearance:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}button:focus{outline:none}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}iframe{border:none;height:100%;width:100%}.mud-elevation-0{box-shadow:var(--mud-elevation-0)}.mud-elevation-1{box-shadow:var(--mud-elevation-1)}.mud-elevation-2{box-shadow:var(--mud-elevation-2)}.mud-elevation-3{box-shadow:var(--mud-elevation-3)}.mud-elevation-4{box-shadow:var(--mud-elevation-4)}.mud-elevation-5{box-shadow:var(--mud-elevation-5)}.mud-elevation-6{box-shadow:var(--mud-elevation-6)}.mud-elevation-7{box-shadow:var(--mud-elevation-7)}.mud-elevation-8{box-shadow:var(--mud-elevation-8)}.mud-elevation-9{box-shadow:var(--mud-elevation-9)}.mud-elevation-10{box-shadow:var(--mud-elevation-10)}.mud-elevation-11{box-shadow:var(--mud-elevation-11)}.mud-elevation-12{box-shadow:var(--mud-elevation-12)}.mud-elevation-13{box-shadow:var(--mud-elevation-13)}.mud-elevation-14{box-shadow:var(--mud-elevation-14)}.mud-elevation-15{box-shadow:var(--mud-elevation-15)}.mud-elevation-16{box-shadow:var(--mud-elevation-16)}.mud-elevation-17{box-shadow:var(--mud-elevation-17)}.mud-elevation-18{box-shadow:var(--mud-elevation-18)}.mud-elevation-19{box-shadow:var(--mud-elevation-19)}.mud-elevation-20{box-shadow:var(--mud-elevation-20)}.mud-elevation-21{box-shadow:var(--mud-elevation-21)}.mud-elevation-22{box-shadow:var(--mud-elevation-22)}.mud-elevation-23{box-shadow:var(--mud-elevation-23)}.mud-elevation-24{box-shadow:var(--mud-elevation-24)}.mud-elevation-25{box-shadow:var(--mud-elevation-25)}.mud-alert{display:flex;padding:6px 16px;border-radius:var(--mud-default-borderradius);background-color:rgba(0,0,0,0);transition:box-shadow 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-alert.mud-square{border-radius:0px}.mud-alert.mud-dense{padding:0px 12px}.mud-alert-text-normal{color:var(--mud-palette-text-primary);background-color:var(--mud-palette-dark-hover)}.mud-alert-text-primary{color:var(--mud-palette-primary-darken);background-color:var(--mud-palette-primary-hover)}.mud-alert-text-primary .mud-alert-icon{color:var(--mud-palette-primary)}.mud-alert-text-secondary{color:var(--mud-palette-secondary-darken);background-color:var(--mud-palette-secondary-hover)}.mud-alert-text-secondary .mud-alert-icon{color:var(--mud-palette-secondary)}.mud-alert-text-tertiary{color:var(--mud-palette-tertiary-darken);background-color:var(--mud-palette-tertiary-hover)}.mud-alert-text-tertiary .mud-alert-icon{color:var(--mud-palette-tertiary)}.mud-alert-text-info{color:var(--mud-palette-info-darken);background-color:var(--mud-palette-info-hover)}.mud-alert-text-info .mud-alert-icon{color:var(--mud-palette-info)}.mud-alert-text-success{color:var(--mud-palette-success-darken);background-color:var(--mud-palette-success-hover)}.mud-alert-text-success .mud-alert-icon{color:var(--mud-palette-success)}.mud-alert-text-warning{color:var(--mud-palette-warning-darken);background-color:var(--mud-palette-warning-hover)}.mud-alert-text-warning .mud-alert-icon{color:var(--mud-palette-warning)}.mud-alert-text-error{color:var(--mud-palette-error-darken);background-color:var(--mud-palette-error-hover)}.mud-alert-text-error .mud-alert-icon{color:var(--mud-palette-error)}.mud-alert-text-dark{color:var(--mud-palette-dark-darken);background-color:var(--mud-palette-dark-hover)}.mud-alert-text-dark .mud-alert-icon{color:var(--mud-palette-dark)}.mud-alert-outlined-normal{color:var(--mud-palette-text-primary);border:1px solid var(--mud-palette-text-primary)}.mud-alert-outlined-primary{color:var(--mud-palette-primary-darken);border:1px solid var(--mud-palette-primary)}.mud-alert-outlined-primary .mud-alert-icon{color:var(--mud-palette-primary)}.mud-alert-outlined-secondary{color:var(--mud-palette-secondary-darken);border:1px solid var(--mud-palette-secondary)}.mud-alert-outlined-secondary .mud-alert-icon{color:var(--mud-palette-secondary)}.mud-alert-outlined-tertiary{color:var(--mud-palette-tertiary-darken);border:1px solid var(--mud-palette-tertiary)}.mud-alert-outlined-tertiary .mud-alert-icon{color:var(--mud-palette-tertiary)}.mud-alert-outlined-info{color:var(--mud-palette-info-darken);border:1px solid var(--mud-palette-info)}.mud-alert-outlined-info .mud-alert-icon{color:var(--mud-palette-info)}.mud-alert-outlined-success{color:var(--mud-palette-success-darken);border:1px solid var(--mud-palette-success)}.mud-alert-outlined-success .mud-alert-icon{color:var(--mud-palette-success)}.mud-alert-outlined-warning{color:var(--mud-palette-warning-darken);border:1px solid var(--mud-palette-warning)}.mud-alert-outlined-warning .mud-alert-icon{color:var(--mud-palette-warning)}.mud-alert-outlined-error{color:var(--mud-palette-error-darken);border:1px solid var(--mud-palette-error)}.mud-alert-outlined-error .mud-alert-icon{color:var(--mud-palette-error)}.mud-alert-outlined-dark{color:var(--mud-palette-dark-darken);border:1px solid var(--mud-palette-dark)}.mud-alert-outlined-dark .mud-alert-icon{color:var(--mud-palette-dark)}.mud-alert-filled-normal{color:var(--mud-palette-dark-text);font-weight:500;background-color:var(--mud-palette-dark)}.mud-alert-filled-normal .mud-alert-close .mud-button-root{color:currentColor}.mud-alert-filled-primary{color:var(--mud-palette-primary-text);font-weight:500;background-color:var(--mud-palette-primary)}.mud-alert-filled-primary .mud-button-root{color:currentColor}.mud-alert-filled-secondary{color:var(--mud-palette-secondary-text);font-weight:500;background-color:var(--mud-palette-secondary)}.mud-alert-filled-secondary .mud-button-root{color:currentColor}.mud-alert-filled-tertiary{color:var(--mud-palette-tertiary-text);font-weight:500;background-color:var(--mud-palette-tertiary)}.mud-alert-filled-tertiary .mud-button-root{color:currentColor}.mud-alert-filled-info{color:var(--mud-palette-info-text);font-weight:500;background-color:var(--mud-palette-info)}.mud-alert-filled-info .mud-button-root{color:currentColor}.mud-alert-filled-success{color:var(--mud-palette-success-text);font-weight:500;background-color:var(--mud-palette-success)}.mud-alert-filled-success .mud-button-root{color:currentColor}.mud-alert-filled-warning{color:var(--mud-palette-warning-text);font-weight:500;background-color:var(--mud-palette-warning)}.mud-alert-filled-warning .mud-button-root{color:currentColor}.mud-alert-filled-error{color:var(--mud-palette-error-text);font-weight:500;background-color:var(--mud-palette-error)}.mud-alert-filled-error .mud-button-root{color:currentColor}.mud-alert-filled-dark{color:var(--mud-palette-dark-text);font-weight:500;background-color:var(--mud-palette-dark)}.mud-alert-filled-dark .mud-button-root{color:currentColor}.mud-alert-icon{display:flex;opacity:.9;padding:7px 0;font-size:22px;margin-right:12px;margin-inline-end:12px;margin-inline-start:unset}.mud-alert-icon.mud-alert-icon-left{margin-right:12px;margin-inline-end:12px;margin-inline-start:unset}.mud-alert-icon.mud-alert-icon-right{margin-left:12px;margin-inline-start:12px;margin-inline-end:unset}.mud-alert-message{padding:9px 0}.mud-alert-position{flex:1;display:flex;align-items:start}.mud-alert-close{display:flex;flex:0;align-items:center;margin-left:8px}.mud-badge-root{position:relative;display:inline-block}.mud-badge-root .mud-badge-wrapper{top:0;left:0;flex:0 1;width:100%;height:100%;display:flex;pointer-events:none;position:absolute}.mud-badge-root .mud-badge-wrapper.mud-badge-top{align-items:flex-start}.mud-badge-root .mud-badge-wrapper.mud-badge-top.left{justify-content:flex-start}.mud-badge-root .mud-badge-wrapper.mud-badge-top.center{justify-content:center}.mud-badge-root .mud-badge-wrapper.mud-badge-top.right{justify-content:flex-end}.mud-badge-root .mud-badge-wrapper.mud-badge-center{align-items:center}.mud-badge-root .mud-badge-wrapper.mud-badge-center.left{justify-content:flex-start}.mud-badge-root .mud-badge-wrapper.mud-badge-center.center{justify-content:center}.mud-badge-root .mud-badge-wrapper.mud-badge-center.right{justify-content:flex-end}.mud-badge-root .mud-badge-wrapper.mud-badge-bottom{align-items:flex-end}.mud-badge-root .mud-badge-wrapper.mud-badge-bottom.left{justify-content:flex-start}.mud-badge-root .mud-badge-wrapper.mud-badge-bottom.center{justify-content:center}.mud-badge-root .mud-badge-wrapper.mud-badge-bottom.right{justify-content:flex-end}.mud-badge{border-radius:10px;font-size:12px;height:20px;letter-spacing:0;min-width:20px;padding:4px 6px;pointer-events:auto;line-height:1;position:absolute;text-align:center;text-indent:0;top:auto;transition:.3s cubic-bezier(0.25, 0.8, 0.5, 1);white-space:nowrap}.mud-badge.mud-badge-default{color:var(--mud-palette-text-primary);background-color:var(--mud-palette-gray-light)}.mud-badge.mud-badge-bordered{border-color:var(--mud-palette-surface);border-style:solid;border-width:2px;padding:3px 4px}.mud-badge.mud-badge-bordered.mud-badge-icon{padding:4px 6px}.mud-badge.mud-badge-icon{width:20px;height:20px}.mud-badge.mud-badge-icon .mud-icon-badge{color:inherit;font-size:12px}.mud-badge.mud-badge-dot{border-radius:50%;height:9px;min-width:0;padding:0;width:9px}.mud-badge.mud-badge{display:flex;align-items:center;justify-content:center}.mud-badge.mud-badge-top.left{inset:auto calc(100% - 4px) calc(100% - 4px) auto}.mud-badge.mud-badge-top.left.mud-badge-overlap{inset:auto calc(100% - 12px) calc(100% - 12px) auto}.mud-badge.mud-badge-top.center{bottom:calc(100% - 4px)}.mud-badge.mud-badge-top.center.mud-badge-overlap{bottom:calc(100% - 12px)}.mud-badge.mud-badge-top.right{inset:auto auto calc(100% - 4px) calc(100% - 4px)}.mud-badge.mud-badge-top.right.mud-badge-overlap{inset:auto auto calc(100% - 12px) calc(100% - 12px)}.mud-badge.mud-badge-center.left{right:calc(100% - 4px)}.mud-badge.mud-badge-center.left.mud-badge-overlap{right:calc(100% - 12px)}.mud-badge.mud-badge-center.right{left:calc(100% - 4px)}.mud-badge.mud-badge-center.right.mud-badge-overlap{left:calc(100% - 12px)}.mud-badge.mud-badge-bottom.left{inset:calc(100% - 4px) calc(100% - 4px) auto auto}.mud-badge.mud-badge-bottom.left.mud-badge-overlap{inset:calc(100% - 12px) calc(100% - 12px) auto auto}.mud-badge.mud-badge-bottom.center{top:calc(100% - 4px)}.mud-badge.mud-badge-bottom.center.mud-badge-overlap{top:calc(100% - 12px)}.mud-badge.mud-badge-bottom.right{inset:calc(100% - 4px) auto auto calc(100% - 4px)}.mud-badge.mud-badge-bottom.right.mud-badge-overlap{inset:calc(100% - 12px) auto auto calc(100% - 12px)}.mud-toolbar{display:flex;position:relative;align-items:center;--mud-internal-toolbar-height: 56px;height:var(--mud-internal-toolbar-height)}.mud-toolbar-gutters{padding-left:16px;padding-right:16px}@media(min-width: 0px)and (orientation: landscape){.mud-toolbar{--mud-internal-toolbar-height: 48px}}@media(min-width: 600px){.mud-toolbar{--mud-internal-toolbar-height: 64px}.mud-toolbar-gutters{padding-left:24px;padding-right:24px}}.mud-toolbar-dense{--mud-internal-toolbar-height: 48px}.mud-toolbar.mud-toolbar-wrap-content{height:auto;min-height:var(--mud-internal-toolbar-height);flex-wrap:wrap}.mud-toolbar.mud-toolbar-wrap-content.mud-toolbar-appbar{min-height:min(var(--mud-appbar-height),var(--mud-internal-toolbar-height))}.mud-tooltip-root.mud-tooltip-inline{display:inline-block}.mud-tooltip{padding:4px 8px;text-align:center;align-items:center;justify-content:center;font-weight:500;font-size:12px;line-height:1.4em;border-radius:var(--mud-default-borderradius);z-index:var(--mud-zindex-tooltip)}.mud-tooltip.mud-tooltip-default{color:var(--mud-palette-dark-text);background-color:var(--mud-palette-gray-darker)}.mud-tooltip.mud-tooltip-default.mud-tooltip-arrow::after{border-color:var(--mud-palette-gray-darker) rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0)}.mud-tooltip.mud-tooltip-center-left:not([data-mudpopover-flip]),.mud-tooltip.mud-tooltip-center-right[data-mudpopover-flip]{transform:translateX(-10px)}.mud-tooltip.mud-tooltip-center-left:not([data-mudpopover-flip]).mud-tooltip-arrow::after,.mud-tooltip.mud-tooltip-center-right[data-mudpopover-flip].mud-tooltip-arrow::after{left:100%;transform:rotate(270deg)}.mud-tooltip.mud-tooltip-center-right:not([data-mudpopover-flip]),.mud-tooltip.mud-tooltip-center-left[data-mudpopover-flip]{transform:translateX(10px)}.mud-tooltip.mud-tooltip-center-right:not([data-mudpopover-flip]).mud-tooltip-arrow::after,.mud-tooltip.mud-tooltip-center-left[data-mudpopover-flip].mud-tooltip-arrow::after{right:100%;transform:rotate(90deg)}.mud-tooltip.mud-tooltip-top-center:not([data-mudpopover-flip]),.mud-tooltip.mud-tooltip-bottom-center[data-mudpopover-flip]{transform:translateY(-10px)}.mud-tooltip.mud-tooltip-top-center:not([data-mudpopover-flip]).mud-tooltip-arrow::after,.mud-tooltip.mud-tooltip-bottom-center[data-mudpopover-flip].mud-tooltip-arrow::after{top:100%;transform:rotate(0deg)}.mud-tooltip.mud-tooltip-bottom-center:not([data-mudpopover-flip]),.mud-tooltip.mud-tooltip-top-center[data-mudpopover-flip]{transform:translateY(10px)}.mud-tooltip.mud-tooltip-bottom-center:not([data-mudpopover-flip]).mud-tooltip-arrow::after,.mud-tooltip.mud-tooltip-top-center[data-mudpopover-flip].mud-tooltip-arrow::after{bottom:100%;transform:rotate(180deg)}.mud-tooltip.mud-tooltip-arrow::after{content:"";position:absolute;border-width:6px;border-style:solid;border-color:rgba(0,0,0,0);border-top-color:inherit}.mud-avatar{display:inline-flex;overflow:hidden;position:relative;align-items:center;flex-shrink:0;line-height:1;user-select:none;border-radius:50%;justify-content:center;color:var(--mud-palette-white);background-color:var(--mud-palette-gray-light)}.mud-avatar.mud-avatar-small{width:24px;height:24px;font-size:.75rem}.mud-avatar.mud-avatar-medium{width:40px;height:40px;font-size:1.25rem}.mud-avatar.mud-avatar-large{width:56px;height:56px;font-size:1.5rem}.mud-avatar-rounded{border-radius:var(--mud-default-borderradius)}.mud-avatar-square{border-radius:0}.mud-avatar>.mud-image{color:rgba(0,0,0,0);width:100%;height:100%;object-fit:cover;text-align:center;text-indent:10000px}.mud-avatar-fallback{width:75%;height:75%}.mud-avatar-outlined{color:var(--mud-palette-text-primary);background-color:unset;border:1px solid var(--mud-palette-text-primary)}.mud-avatar-outlined.mud-avatar-outlined-primary{color:var(--mud-palette-primary);border:1px solid var(--mud-palette-primary)}.mud-avatar-outlined.mud-avatar-outlined-secondary{color:var(--mud-palette-secondary);border:1px solid var(--mud-palette-secondary)}.mud-avatar-outlined.mud-avatar-outlined-tertiary{color:var(--mud-palette-tertiary);border:1px solid var(--mud-palette-tertiary)}.mud-avatar-outlined.mud-avatar-outlined-info{color:var(--mud-palette-info);border:1px solid var(--mud-palette-info)}.mud-avatar-outlined.mud-avatar-outlined-success{color:var(--mud-palette-success);border:1px solid var(--mud-palette-success)}.mud-avatar-outlined.mud-avatar-outlined-warning{color:var(--mud-palette-warning);border:1px solid var(--mud-palette-warning)}.mud-avatar-outlined.mud-avatar-outlined-error{color:var(--mud-palette-error);border:1px solid var(--mud-palette-error)}.mud-avatar-outlined.mud-avatar-outlined-dark{color:var(--mud-palette-dark);border:1px solid var(--mud-palette-dark)}.mud-avatar-filled{color:var(--mud-palette-text-primary);background-color:var(--mud-palette-lines-inputs)}.mud-avatar-filled.mud-avatar-filled-primary{color:var(--mud-palette-primary-text);background-color:var(--mud-palette-primary)}.mud-avatar-filled.mud-avatar-filled-secondary{color:var(--mud-palette-secondary-text);background-color:var(--mud-palette-secondary)}.mud-avatar-filled.mud-avatar-filled-tertiary{color:var(--mud-palette-tertiary-text);background-color:var(--mud-palette-tertiary)}.mud-avatar-filled.mud-avatar-filled-info{color:var(--mud-palette-info-text);background-color:var(--mud-palette-info)}.mud-avatar-filled.mud-avatar-filled-success{color:var(--mud-palette-success-text);background-color:var(--mud-palette-success)}.mud-avatar-filled.mud-avatar-filled-warning{color:var(--mud-palette-warning-text);background-color:var(--mud-palette-warning)}.mud-avatar-filled.mud-avatar-filled-error{color:var(--mud-palette-error-text);background-color:var(--mud-palette-error)}.mud-avatar-filled.mud-avatar-filled-dark{color:var(--mud-palette-dark-text);background-color:var(--mud-palette-dark)}.mud-avatar-group{display:flex}.mud-avatar-group .mud-avatar:first-child{margin-inline-start:0px !important}.mud-avatar-group.mud-avatar-group-outlined.mud-avatar-group-outlined-transparent .mud-avatar:not(.mud-avatar-outlined){border-color:rgba(0,0,0,0)}.mud-avatar-group.mud-avatar-group-outlined.mud-avatar-group-outlined-surface .mud-avatar:not(.mud-avatar-outlined){border-color:var(--mud-palette-surface)}.mud-avatar-group.mud-avatar-group-outlined.mud-avatar-group-outlined-primary .mud-avatar:not(.mud-avatar-outlined){border-color:var(--mud-palette-primary)}.mud-avatar-group.mud-avatar-group-outlined.mud-avatar-group-outlined-secondary .mud-avatar:not(.mud-avatar-outlined){border-color:var(--mud-palette-secondary)}.mud-avatar-group.mud-avatar-group-outlined.mud-avatar-group-outlined-tertiary .mud-avatar:not(.mud-avatar-outlined){border-color:var(--mud-palette-tertiary)}.mud-avatar-group.mud-avatar-group-outlined.mud-avatar-group-outlined-info .mud-avatar:not(.mud-avatar-outlined){border-color:var(--mud-palette-info)}.mud-avatar-group.mud-avatar-group-outlined.mud-avatar-group-outlined-success .mud-avatar:not(.mud-avatar-outlined){border-color:var(--mud-palette-success)}.mud-avatar-group.mud-avatar-group-outlined.mud-avatar-group-outlined-warning .mud-avatar:not(.mud-avatar-outlined){border-color:var(--mud-palette-warning)}.mud-avatar-group.mud-avatar-group-outlined.mud-avatar-group-outlined-error .mud-avatar:not(.mud-avatar-outlined){border-color:var(--mud-palette-error)}.mud-avatar-group.mud-avatar-group-outlined.mud-avatar-group-outlined-dark .mud-avatar:not(.mud-avatar-outlined){border-color:var(--mud-palette-dark)}.mud-avatar-group.mud-avatar-group-outlined .mud-avatar{border:2px solid}.mud-avatar-group.mud-avatar-group-outlined .mud-avatar.mud-avatar-small{width:28px;height:28px}.mud-avatar-group.mud-avatar-group-outlined .mud-avatar.mud-avatar-medium{width:44px;height:44px}.mud-avatar-group.mud-avatar-group-outlined .mud-avatar.mud-avatar-large{width:60px;height:60px}.mud-breadcrumbs{display:flex;flex-wrap:wrap;flex:0 1 auto;align-items:center;list-style:none;margin:0;padding:16px 12px}.mud-breadcrumb-separator{display:inline-flex;padding:0 12px}.mud-breadcrumb-separator>span{color:var(--mud-palette-text-primary);opacity:.38}.mud-breadcrumb-item>a{display:flex;align-items:center}.mud-breadcrumb-item>a>svg.mud-icon-root{margin-right:4px;margin-inline-end:4px;margin-inline-start:unset}.mud-breadcrumb-item.mud-disabled>a{pointer-events:none;color:var(--mud-palette-action-disabled)}.mud-breadcrumbs-expander{cursor:pointer;display:flex;background-color:#eee}@media(hover: hover)and (pointer: fine){.mud-breadcrumbs-expander:hover{background-color:#e0e0e0}}.mud-breadcrumbs-expander>svg{width:26px}.mud-button-root{color:inherit;border:0;cursor:pointer;margin:0;display:inline-flex;outline:0;padding:0;position:relative;align-items:center;user-select:none;border-radius:0;vertical-align:middle;-moz-appearance:none;justify-content:center;text-decoration:none;background-color:rgba(0,0,0,0);-webkit-appearance:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mud-button-root::-moz-focus-inner{border-style:none}.mud-button-root:disabled{color:var(--mud-palette-action-disabled) !important;cursor:default;pointer-events:none}.mud-button{padding:6px 16px;font-family:var(--mud-typography-button-family);font-size:var(--mud-typography-button-size);font-weight:var(--mud-typography-button-weight);line-height:var(--mud-typography-button-lineheight);letter-spacing:var(--mud-typography-button-letterspacing);text-transform:var(--mud-typography-button-text-transform);min-width:64px;box-sizing:border-box;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;border-radius:var(--mud-default-borderradius);color:var(--mud-palette-text-primary);--mud-ripple-color: var(--mud-palette-text-primary)}@media(hover: hover)and (pointer: fine){.mud-button:hover{background-color:var(--mud-palette-action-default-hover)}}.mud-button:focus-visible,.mud-button:active{background-color:var(--mud-palette-action-default-hover)}.mud-button-text{padding:6px 8px}.mud-button-text.mud-button-text-inherit{color:inherit}.mud-button-text.mud-button-text-primary{color:var(--mud-palette-primary);--mud-ripple-color: var(--mud-palette-primary)}@media(hover: hover)and (pointer: fine){.mud-button-text.mud-button-text-primary:hover{background-color:var(--mud-palette-primary-hover)}}.mud-button-text.mud-button-text-primary:focus-visible,.mud-button-text.mud-button-text-primary:active{background-color:var(--mud-palette-primary-hover)}.mud-button-text.mud-button-text-secondary{color:var(--mud-palette-secondary);--mud-ripple-color: var(--mud-palette-secondary)}@media(hover: hover)and (pointer: fine){.mud-button-text.mud-button-text-secondary:hover{background-color:var(--mud-palette-secondary-hover)}}.mud-button-text.mud-button-text-secondary:focus-visible,.mud-button-text.mud-button-text-secondary:active{background-color:var(--mud-palette-secondary-hover)}.mud-button-text.mud-button-text-tertiary{color:var(--mud-palette-tertiary);--mud-ripple-color: var(--mud-palette-tertiary)}@media(hover: hover)and (pointer: fine){.mud-button-text.mud-button-text-tertiary:hover{background-color:var(--mud-palette-tertiary-hover)}}.mud-button-text.mud-button-text-tertiary:focus-visible,.mud-button-text.mud-button-text-tertiary:active{background-color:var(--mud-palette-tertiary-hover)}.mud-button-text.mud-button-text-info{color:var(--mud-palette-info);--mud-ripple-color: var(--mud-palette-info)}@media(hover: hover)and (pointer: fine){.mud-button-text.mud-button-text-info:hover{background-color:var(--mud-palette-info-hover)}}.mud-button-text.mud-button-text-info:focus-visible,.mud-button-text.mud-button-text-info:active{background-color:var(--mud-palette-info-hover)}.mud-button-text.mud-button-text-success{color:var(--mud-palette-success);--mud-ripple-color: var(--mud-palette-success)}@media(hover: hover)and (pointer: fine){.mud-button-text.mud-button-text-success:hover{background-color:var(--mud-palette-success-hover)}}.mud-button-text.mud-button-text-success:focus-visible,.mud-button-text.mud-button-text-success:active{background-color:var(--mud-palette-success-hover)}.mud-button-text.mud-button-text-warning{color:var(--mud-palette-warning);--mud-ripple-color: var(--mud-palette-warning)}@media(hover: hover)and (pointer: fine){.mud-button-text.mud-button-text-warning:hover{background-color:var(--mud-palette-warning-hover)}}.mud-button-text.mud-button-text-warning:focus-visible,.mud-button-text.mud-button-text-warning:active{background-color:var(--mud-palette-warning-hover)}.mud-button-text.mud-button-text-error{color:var(--mud-palette-error);--mud-ripple-color: var(--mud-palette-error)}@media(hover: hover)and (pointer: fine){.mud-button-text.mud-button-text-error:hover{background-color:var(--mud-palette-error-hover)}}.mud-button-text.mud-button-text-error:focus-visible,.mud-button-text.mud-button-text-error:active{background-color:var(--mud-palette-error-hover)}.mud-button-text.mud-button-text-dark{color:var(--mud-palette-dark);--mud-ripple-color: var(--mud-palette-dark)}@media(hover: hover)and (pointer: fine){.mud-button-text.mud-button-text-dark:hover{background-color:var(--mud-palette-dark-hover)}}.mud-button-text.mud-button-text-dark:focus-visible,.mud-button-text.mud-button-text-dark:active{background-color:var(--mud-palette-dark-hover)}.mud-button-outlined{color:var(--mud-palette-text-primary);border:1px solid var(--mud-palette-text-primary);padding:5px 15px}.mud-button-outlined.mud-button-outlined-inherit{color:inherit;border-color:currentColor}.mud-button-outlined.mud-icon-button{padding:5px}@media(hover: hover)and (pointer: fine){.mud-button-outlined:hover{background-color:var(--mud-palette-action-default-hover)}}.mud-button-outlined:focus-visible,.mud-button-outlined:active{background-color:var(--mud-palette-action-default-hover)}.mud-button-outlined.mud-button-outlined-primary{color:var(--mud-palette-primary);--mud-ripple-color: var(--mud-palette-primary);border:1px solid var(--mud-palette-primary)}@media(hover: hover)and (pointer: fine){.mud-button-outlined.mud-button-outlined-primary:hover{border:1px solid var(--mud-palette-primary);background-color:var(--mud-palette-primary-hover)}}.mud-button-outlined.mud-button-outlined-primary:focus-visible,.mud-button-outlined.mud-button-outlined-primary:active{border:1px solid var(--mud-palette-primary);background-color:var(--mud-palette-primary-hover)}.mud-button-outlined.mud-button-outlined-secondary{color:var(--mud-palette-secondary);--mud-ripple-color: var(--mud-palette-secondary);border:1px solid var(--mud-palette-secondary)}@media(hover: hover)and (pointer: fine){.mud-button-outlined.mud-button-outlined-secondary:hover{border:1px solid var(--mud-palette-secondary);background-color:var(--mud-palette-secondary-hover)}}.mud-button-outlined.mud-button-outlined-secondary:focus-visible,.mud-button-outlined.mud-button-outlined-secondary:active{border:1px solid var(--mud-palette-secondary);background-color:var(--mud-palette-secondary-hover)}.mud-button-outlined.mud-button-outlined-tertiary{color:var(--mud-palette-tertiary);--mud-ripple-color: var(--mud-palette-tertiary);border:1px solid var(--mud-palette-tertiary)}@media(hover: hover)and (pointer: fine){.mud-button-outlined.mud-button-outlined-tertiary:hover{border:1px solid var(--mud-palette-tertiary);background-color:var(--mud-palette-tertiary-hover)}}.mud-button-outlined.mud-button-outlined-tertiary:focus-visible,.mud-button-outlined.mud-button-outlined-tertiary:active{border:1px solid var(--mud-palette-tertiary);background-color:var(--mud-palette-tertiary-hover)}.mud-button-outlined.mud-button-outlined-info{color:var(--mud-palette-info);--mud-ripple-color: var(--mud-palette-info);border:1px solid var(--mud-palette-info)}@media(hover: hover)and (pointer: fine){.mud-button-outlined.mud-button-outlined-info:hover{border:1px solid var(--mud-palette-info);background-color:var(--mud-palette-info-hover)}}.mud-button-outlined.mud-button-outlined-info:focus-visible,.mud-button-outlined.mud-button-outlined-info:active{border:1px solid var(--mud-palette-info);background-color:var(--mud-palette-info-hover)}.mud-button-outlined.mud-button-outlined-success{color:var(--mud-palette-success);--mud-ripple-color: var(--mud-palette-success);border:1px solid var(--mud-palette-success)}@media(hover: hover)and (pointer: fine){.mud-button-outlined.mud-button-outlined-success:hover{border:1px solid var(--mud-palette-success);background-color:var(--mud-palette-success-hover)}}.mud-button-outlined.mud-button-outlined-success:focus-visible,.mud-button-outlined.mud-button-outlined-success:active{border:1px solid var(--mud-palette-success);background-color:var(--mud-palette-success-hover)}.mud-button-outlined.mud-button-outlined-warning{color:var(--mud-palette-warning);--mud-ripple-color: var(--mud-palette-warning);border:1px solid var(--mud-palette-warning)}@media(hover: hover)and (pointer: fine){.mud-button-outlined.mud-button-outlined-warning:hover{border:1px solid var(--mud-palette-warning);background-color:var(--mud-palette-warning-hover)}}.mud-button-outlined.mud-button-outlined-warning:focus-visible,.mud-button-outlined.mud-button-outlined-warning:active{border:1px solid var(--mud-palette-warning);background-color:var(--mud-palette-warning-hover)}.mud-button-outlined.mud-button-outlined-error{color:var(--mud-palette-error);--mud-ripple-color: var(--mud-palette-error);border:1px solid var(--mud-palette-error)}@media(hover: hover)and (pointer: fine){.mud-button-outlined.mud-button-outlined-error:hover{border:1px solid var(--mud-palette-error);background-color:var(--mud-palette-error-hover)}}.mud-button-outlined.mud-button-outlined-error:focus-visible,.mud-button-outlined.mud-button-outlined-error:active{border:1px solid var(--mud-palette-error);background-color:var(--mud-palette-error-hover)}.mud-button-outlined.mud-button-outlined-dark{color:var(--mud-palette-dark);--mud-ripple-color: var(--mud-palette-dark);border:1px solid var(--mud-palette-dark)}@media(hover: hover)and (pointer: fine){.mud-button-outlined.mud-button-outlined-dark:hover{border:1px solid var(--mud-palette-dark);background-color:var(--mud-palette-dark-hover)}}.mud-button-outlined.mud-button-outlined-dark:focus-visible,.mud-button-outlined.mud-button-outlined-dark:active{border:1px solid var(--mud-palette-dark);background-color:var(--mud-palette-dark-hover)}.mud-button-outlined:disabled{border:1px solid var(--mud-palette-action-disabled-background)}.mud-button-filled{color:var(--mud-palette-text-primary);--mud-ripple-color: var(--mud-palette-text-primary);--mud-ripple-opacity: var(--mud-ripple-opacity-secondary) !important;box-shadow:0px 3px 1px -2px rgba(0,0,0,.2),0px 2px 2px 0px rgba(0,0,0,.14),0px 1px 5px 0px rgba(0,0,0,.12);background-color:var(--mud-palette-action-default-hover)}.mud-button-filled.mud-icon-button{padding:6px}@media(hover: hover)and (pointer: fine){.mud-button-filled:hover{box-shadow:0px 2px 4px -1px rgba(0,0,0,.2),0px 4px 5px 0px rgba(0,0,0,.14),0px 1px 10px 0px rgba(0,0,0,.12);background-color:var(--mud-palette-action-disabled-background)}}.mud-button-filled:focus-visible{box-shadow:0px 2px 4px -1px rgba(0,0,0,.2),0px 4px 5px 0px rgba(0,0,0,.14),0px 1px 10px 0px rgba(0,0,0,.12);background-color:var(--mud-palette-action-disabled-background)}.mud-button-filled:active{box-shadow:0px 5px 5px -3px rgba(0,0,0,.2),0px 8px 10px 1px rgba(0,0,0,.14),0px 3px 14px 2px rgba(0,0,0,.12);background-color:var(--mud-palette-action-disabled-background)}.mud-button-filled:disabled{color:var(--mud-palette-action-disabled);box-shadow:none;background-color:var(--mud-palette-action-disabled-background) !important}.mud-button-filled.mud-button-filled-primary{color:var(--mud-palette-primary-text);--mud-ripple-color: var(--mud-palette-primary-text);background-color:var(--mud-palette-primary)}@media(hover: hover)and (pointer: fine){.mud-button-filled.mud-button-filled-primary:hover{background-color:var(--mud-palette-primary-darken)}}.mud-button-filled.mud-button-filled-primary:focus-visible,.mud-button-filled.mud-button-filled-primary:active{background-color:var(--mud-palette-primary-darken)}.mud-button-filled.mud-button-filled-secondary{color:var(--mud-palette-secondary-text);--mud-ripple-color: var(--mud-palette-secondary-text);background-color:var(--mud-palette-secondary)}@media(hover: hover)and (pointer: fine){.mud-button-filled.mud-button-filled-secondary:hover{background-color:var(--mud-palette-secondary-darken)}}.mud-button-filled.mud-button-filled-secondary:focus-visible,.mud-button-filled.mud-button-filled-secondary:active{background-color:var(--mud-palette-secondary-darken)}.mud-button-filled.mud-button-filled-tertiary{color:var(--mud-palette-tertiary-text);--mud-ripple-color: var(--mud-palette-tertiary-text);background-color:var(--mud-palette-tertiary)}@media(hover: hover)and (pointer: fine){.mud-button-filled.mud-button-filled-tertiary:hover{background-color:var(--mud-palette-tertiary-darken)}}.mud-button-filled.mud-button-filled-tertiary:focus-visible,.mud-button-filled.mud-button-filled-tertiary:active{background-color:var(--mud-palette-tertiary-darken)}.mud-button-filled.mud-button-filled-info{color:var(--mud-palette-info-text);--mud-ripple-color: var(--mud-palette-info-text);background-color:var(--mud-palette-info)}@media(hover: hover)and (pointer: fine){.mud-button-filled.mud-button-filled-info:hover{background-color:var(--mud-palette-info-darken)}}.mud-button-filled.mud-button-filled-info:focus-visible,.mud-button-filled.mud-button-filled-info:active{background-color:var(--mud-palette-info-darken)}.mud-button-filled.mud-button-filled-success{color:var(--mud-palette-success-text);--mud-ripple-color: var(--mud-palette-success-text);background-color:var(--mud-palette-success)}@media(hover: hover)and (pointer: fine){.mud-button-filled.mud-button-filled-success:hover{background-color:var(--mud-palette-success-darken)}}.mud-button-filled.mud-button-filled-success:focus-visible,.mud-button-filled.mud-button-filled-success:active{background-color:var(--mud-palette-success-darken)}.mud-button-filled.mud-button-filled-warning{color:var(--mud-palette-warning-text);--mud-ripple-color: var(--mud-palette-warning-text);background-color:var(--mud-palette-warning)}@media(hover: hover)and (pointer: fine){.mud-button-filled.mud-button-filled-warning:hover{background-color:var(--mud-palette-warning-darken)}}.mud-button-filled.mud-button-filled-warning:focus-visible,.mud-button-filled.mud-button-filled-warning:active{background-color:var(--mud-palette-warning-darken)}.mud-button-filled.mud-button-filled-error{color:var(--mud-palette-error-text);--mud-ripple-color: var(--mud-palette-error-text);background-color:var(--mud-palette-error)}@media(hover: hover)and (pointer: fine){.mud-button-filled.mud-button-filled-error:hover{background-color:var(--mud-palette-error-darken)}}.mud-button-filled.mud-button-filled-error:focus-visible,.mud-button-filled.mud-button-filled-error:active{background-color:var(--mud-palette-error-darken)}.mud-button-filled.mud-button-filled-dark{color:var(--mud-palette-dark-text);--mud-ripple-color: var(--mud-palette-dark-text);background-color:var(--mud-palette-dark)}@media(hover: hover)and (pointer: fine){.mud-button-filled.mud-button-filled-dark:hover{background-color:var(--mud-palette-dark-darken)}}.mud-button-filled.mud-button-filled-dark:focus-visible,.mud-button-filled.mud-button-filled-dark:active{background-color:var(--mud-palette-dark-darken)}.mud-button-disable-elevation{box-shadow:none}@media(hover: hover)and (pointer: fine){.mud-button-disable-elevation:hover{box-shadow:none}}.mud-button-disable-elevation:active{box-shadow:none}.mud-button-disable-elevation.mud-focus-visible{box-shadow:none}.mud-button-disable-elevation:disabled{box-shadow:none}.mud-button-color-inherit{color:inherit;border-color:currentColor}.mud-button-text-size-small{padding:4px 5px;font-size:.8125rem}.mud-button-text-size-large{padding:8px 11px;font-size:.9375rem}.mud-button-outlined-size-small{padding:3px 9px;font-size:.8125rem}.mud-button-outlined-size-small.mud-icon-button{padding:4px}.mud-button-outlined-size-large{padding:7px 21px;font-size:.9375rem}.mud-button-outlined-size-large.mud-icon-button{padding:4px}.mud-button-filled-size-small{padding:4px 10px;font-size:.8125rem}.mud-button-filled-size-small.mud-icon-button{padding:5px}.mud-button-filled-size-large{padding:8px 22px;font-size:.9375rem}.mud-button-filled-size-large.mud-icon-button{padding:5px}.mud-button-full-width{width:100%}.mud-button-label{width:100%;display:inherit;align-items:inherit;justify-content:inherit}.mud-button-label .mud-button-icon-start{display:inherit;margin-left:-4px;margin-right:8px;margin-inline-start:-4px;margin-inline-end:8px}.mud-button-label .mud-button-icon-start.mud-button-icon-size-small{margin-left:-2px;margin-inline-start:-2px;margin-inline-end:8px}.mud-button-label .mud-button-icon-end{display:inherit;margin-left:8px;margin-right:-4px;margin-inline-start:8px;margin-inline-end:-4px}.mud-button-label .mud-button-icon-end.mud-button-icon-size-small{margin-right:-2px;margin-inline-end:-2px;margin-inline-start:8px}.mud-button-icon-size-small>*:first-child{font-size:18px}.mud-button-icon-size-medium>*:first-child{font-size:20px}.mud-button-icon-size-large>*:first-child{font-size:22px}.mud-button-group-root{border-radius:var(--mud-default-borderradius);display:inline-flex}.mud-button-group-root .mud-button-root{border-radius:var(--mud-default-borderradius)}.mud-button-group-root.mud-button-group-override-styles .mud-button{color:var(--mud-palette-text-primary);--mud-ripple-color: var(--mud-palette-text-primary)}.mud-button-group-root.mud-button-group-override-styles .mud-button-root{background-color:inherit;box-shadow:none;border:none}@media(hover: hover)and (pointer: fine){.mud-button-group-root.mud-button-group-override-styles .mud-button-root:hover{background-color:var(--mud-palette-action-default-hover)}}.mud-button-group-root.mud-button-group-override-styles .mud-button-root:focus-visible,.mud-button-group-root.mud-button-group-override-styles .mud-button-root:active{background-color:var(--mud-palette-action-default-hover)}.mud-button-group-root.mud-button-group-override-styles .mud-button-root:disabled{border-color:var(--mud-palette-action-disabled-background) !important}.mud-button-group-root.mud-button-group-text-size-small .mud-button-root{padding:4px 5px;font-size:.8125rem}.mud-button-group-root.mud-button-group-text-size-small .mud-button-root.mud-icon-button .mud-icon-root{font-size:1.422rem}.mud-button-group-root.mud-button-group-text-size-large .mud-button-root{padding:8px 11px;font-size:.9375rem}.mud-button-group-root.mud-button-group-text-size-large .mud-button-root.mud-icon-button .mud-icon-root{font-size:1.641rem}.mud-button-group-root.mud-button-group-outlined-size-small .mud-button-root{padding:3px 9px;font-size:.8125rem}.mud-button-group-root.mud-button-group-outlined-size-small .mud-button-root.mud-icon-button{padding:3px 9px}.mud-button-group-root.mud-button-group-outlined-size-small .mud-button-root.mud-icon-button .mud-icon-root{font-size:1.422rem}.mud-button-group-root.mud-button-group-outlined-size-large .mud-button-root{padding:7px 21px;font-size:.9375rem}.mud-button-group-root.mud-button-group-outlined-size-large .mud-button-root.mud-icon-button{padding:7px 15px}.mud-button-group-root.mud-button-group-outlined-size-large .mud-button-root.mud-icon-button .mud-icon-root{font-size:1.641rem}.mud-button-group-root.mud-button-group-filled-size-small .mud-button-root{padding:4px 10px;font-size:.8125rem}.mud-button-group-root.mud-button-group-filled-size-small .mud-button-root.mud-icon-button{padding:4px 10px}.mud-button-group-root.mud-button-group-filled-size-small .mud-button-root.mud-icon-button .mud-icon-root{font-size:1.422rem}.mud-button-group-root.mud-button-group-filled-size-large .mud-button-root{padding:8px 22px;font-size:.9375rem}.mud-button-group-root.mud-button-group-filled-size-large .mud-button-root.mud-icon-button{padding:8px 16px}.mud-button-group-root.mud-button-group-filled-size-large .mud-button-root.mud-icon-button .mud-icon-root{font-size:1.641rem}.mud-button-group-root .mud-button-root.mud-icon-button{padding-right:12px;padding-left:12px}.mud-button-group-root .mud-button-root.mud-icon-button .mud-icon-root{font-size:1.516rem}.mud-button-group-root .mud-button-root.mud-icon-button.mud-ripple-icon:after{transform:scale(10, 10)}.mud-button-group-root .mud-button-root.mud-icon-button.mud-ripple-icon:active:after{transform:scale(0, 0);opacity:.1;transition:0s}.mud-button-group-horizontal:not(.mud-button-group-rtl)>.mud-button-root:not(:last-child),.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:last-child) .mud-button-root{border-top-right-radius:0;border-bottom-right-radius:0}.mud-button-group-horizontal:not(.mud-button-group-rtl)>.mud-button-root:not(:first-child),.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-top-left-radius:0;border-bottom-left-radius:0;margin-left:-1px}.mud-button-group-horizontal.mud-button-group-rtl>.mud-button-root:not(:last-child),.mud-button-group-horizontal.mud-button-group-rtl>:not(:last-child) .mud-button-root{border-top-left-radius:0;border-bottom-left-radius:0;margin-left:-1px}.mud-button-group-horizontal.mud-button-group-rtl>.mud-button-root:not(:first-child),.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-top-right-radius:0;border-bottom-right-radius:0}.mud-button-group-vertical{flex-direction:column}.mud-button-group-vertical .mud-icon-button{width:100%}.mud-button-group-vertical>.mud-button-root:not(:last-child),.mud-button-group-vertical>:not(:last-child) .mud-button-root{border-bottom-right-radius:0;border-bottom-left-radius:0}.mud-button-group-vertical>.mud-button-root:not(:first-child),.mud-button-group-vertical>:not(:first-child) .mud-button-root{border-top-right-radius:0;border-top-left-radius:0;margin-top:-1px}.mud-button-group-text.mud-button-group-override-styles .mud-button-root{padding:6px 8px}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-text-primary)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-text-primary)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-vertical .mud-button-root:not(:last-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-vertical>:not(:last-child) .mud-button-root{border-bottom:1px solid var(--mud-palette-text-primary)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-primary .mud-button-root{color:var(--mud-palette-primary);--mud-ripple-color: var(--mud-palette-primary)}@media(hover: hover)and (pointer: fine){.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-primary .mud-button-root:hover{background-color:var(--mud-palette-primary-hover)}}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-primary .mud-button-root:focus-visible,.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-primary .mud-button-root:active{background-color:var(--mud-palette-primary-hover)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-primary.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-primary.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-primary)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-primary.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-primary.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-primary)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-primary.mud-button-group-vertical .mud-button-root:not(:last-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-primary.mud-button-group-vertical>:not(:last-child) .mud-button-root{border-bottom:1px solid var(--mud-palette-primary)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-secondary .mud-button-root{color:var(--mud-palette-secondary);--mud-ripple-color: var(--mud-palette-secondary)}@media(hover: hover)and (pointer: fine){.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-secondary .mud-button-root:hover{background-color:var(--mud-palette-secondary-hover)}}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-secondary .mud-button-root:focus-visible,.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-secondary .mud-button-root:active{background-color:var(--mud-palette-secondary-hover)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-secondary.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-secondary.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-secondary)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-secondary.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-secondary.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-secondary)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-secondary.mud-button-group-vertical .mud-button-root:not(:last-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-secondary.mud-button-group-vertical>:not(:last-child) .mud-button-root{border-bottom:1px solid var(--mud-palette-secondary)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-tertiary .mud-button-root{color:var(--mud-palette-tertiary);--mud-ripple-color: var(--mud-palette-tertiary)}@media(hover: hover)and (pointer: fine){.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-tertiary .mud-button-root:hover{background-color:var(--mud-palette-tertiary-hover)}}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-tertiary .mud-button-root:focus-visible,.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-tertiary .mud-button-root:active{background-color:var(--mud-palette-tertiary-hover)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-tertiary.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-tertiary.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-tertiary)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-tertiary.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-tertiary.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-tertiary)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-tertiary.mud-button-group-vertical .mud-button-root:not(:last-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-tertiary.mud-button-group-vertical>:not(:last-child) .mud-button-root{border-bottom:1px solid var(--mud-palette-tertiary)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-info .mud-button-root{color:var(--mud-palette-info);--mud-ripple-color: var(--mud-palette-info)}@media(hover: hover)and (pointer: fine){.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-info .mud-button-root:hover{background-color:var(--mud-palette-info-hover)}}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-info .mud-button-root:focus-visible,.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-info .mud-button-root:active{background-color:var(--mud-palette-info-hover)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-info.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-info.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-info)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-info.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-info.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-info)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-info.mud-button-group-vertical .mud-button-root:not(:last-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-info.mud-button-group-vertical>:not(:last-child) .mud-button-root{border-bottom:1px solid var(--mud-palette-info)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-success .mud-button-root{color:var(--mud-palette-success);--mud-ripple-color: var(--mud-palette-success)}@media(hover: hover)and (pointer: fine){.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-success .mud-button-root:hover{background-color:var(--mud-palette-success-hover)}}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-success .mud-button-root:focus-visible,.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-success .mud-button-root:active{background-color:var(--mud-palette-success-hover)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-success.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-success.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-success)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-success.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-success.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-success)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-success.mud-button-group-vertical .mud-button-root:not(:last-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-success.mud-button-group-vertical>:not(:last-child) .mud-button-root{border-bottom:1px solid var(--mud-palette-success)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-warning .mud-button-root{color:var(--mud-palette-warning);--mud-ripple-color: var(--mud-palette-warning)}@media(hover: hover)and (pointer: fine){.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-warning .mud-button-root:hover{background-color:var(--mud-palette-warning-hover)}}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-warning .mud-button-root:focus-visible,.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-warning .mud-button-root:active{background-color:var(--mud-palette-warning-hover)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-warning.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-warning.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-warning)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-warning.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-warning.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-warning)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-warning.mud-button-group-vertical .mud-button-root:not(:last-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-warning.mud-button-group-vertical>:not(:last-child) .mud-button-root{border-bottom:1px solid var(--mud-palette-warning)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-error .mud-button-root{color:var(--mud-palette-error);--mud-ripple-color: var(--mud-palette-error)}@media(hover: hover)and (pointer: fine){.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-error .mud-button-root:hover{background-color:var(--mud-palette-error-hover)}}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-error .mud-button-root:focus-visible,.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-error .mud-button-root:active{background-color:var(--mud-palette-error-hover)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-error.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-error.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-error)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-error.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-error.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-error)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-error.mud-button-group-vertical .mud-button-root:not(:last-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-error.mud-button-group-vertical>:not(:last-child) .mud-button-root{border-bottom:1px solid var(--mud-palette-error)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-dark .mud-button-root{color:var(--mud-palette-dark);--mud-ripple-color: var(--mud-palette-dark)}@media(hover: hover)and (pointer: fine){.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-dark .mud-button-root:hover{background-color:var(--mud-palette-dark-hover)}}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-dark .mud-button-root:focus-visible,.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-dark .mud-button-root:active{background-color:var(--mud-palette-dark-hover)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-dark.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-dark.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-dark)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-dark.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-dark.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-dark)}.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-dark.mud-button-group-vertical .mud-button-root:not(:last-child),.mud-button-group-text.mud-button-group-override-styles.mud-button-group-text-dark.mud-button-group-vertical>:not(:last-child) .mud-button-root{border-bottom:1px solid var(--mud-palette-dark)}.mud-button-group-outlined.mud-button-group-override-styles .mud-button-root{padding:5px 15px;border:1px solid var(--mud-palette-text-primary)}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-primary .mud-button-root{color:var(--mud-palette-primary);border:1px solid var(--mud-palette-primary);--mud-ripple-color: var(--mud-palette-primary)}@media(hover: hover)and (pointer: fine){.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-primary .mud-button-root:hover{background-color:var(--mud-palette-primary-hover)}}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-primary .mud-button-root:focus-visible,.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-primary .mud-button-root:active{background-color:var(--mud-palette-primary-hover)}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-secondary .mud-button-root{color:var(--mud-palette-secondary);border:1px solid var(--mud-palette-secondary);--mud-ripple-color: var(--mud-palette-secondary)}@media(hover: hover)and (pointer: fine){.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-secondary .mud-button-root:hover{background-color:var(--mud-palette-secondary-hover)}}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-secondary .mud-button-root:focus-visible,.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-secondary .mud-button-root:active{background-color:var(--mud-palette-secondary-hover)}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-tertiary .mud-button-root{color:var(--mud-palette-tertiary);border:1px solid var(--mud-palette-tertiary);--mud-ripple-color: var(--mud-palette-tertiary)}@media(hover: hover)and (pointer: fine){.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-tertiary .mud-button-root:hover{background-color:var(--mud-palette-tertiary-hover)}}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-tertiary .mud-button-root:focus-visible,.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-tertiary .mud-button-root:active{background-color:var(--mud-palette-tertiary-hover)}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-info .mud-button-root{color:var(--mud-palette-info);border:1px solid var(--mud-palette-info);--mud-ripple-color: var(--mud-palette-info)}@media(hover: hover)and (pointer: fine){.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-info .mud-button-root:hover{background-color:var(--mud-palette-info-hover)}}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-info .mud-button-root:focus-visible,.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-info .mud-button-root:active{background-color:var(--mud-palette-info-hover)}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-success .mud-button-root{color:var(--mud-palette-success);border:1px solid var(--mud-palette-success);--mud-ripple-color: var(--mud-palette-success)}@media(hover: hover)and (pointer: fine){.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-success .mud-button-root:hover{background-color:var(--mud-palette-success-hover)}}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-success .mud-button-root:focus-visible,.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-success .mud-button-root:active{background-color:var(--mud-palette-success-hover)}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-warning .mud-button-root{color:var(--mud-palette-warning);border:1px solid var(--mud-palette-warning);--mud-ripple-color: var(--mud-palette-warning)}@media(hover: hover)and (pointer: fine){.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-warning .mud-button-root:hover{background-color:var(--mud-palette-warning-hover)}}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-warning .mud-button-root:focus-visible,.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-warning .mud-button-root:active{background-color:var(--mud-palette-warning-hover)}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-error .mud-button-root{color:var(--mud-palette-error);border:1px solid var(--mud-palette-error);--mud-ripple-color: var(--mud-palette-error)}@media(hover: hover)and (pointer: fine){.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-error .mud-button-root:hover{background-color:var(--mud-palette-error-hover)}}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-error .mud-button-root:focus-visible,.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-error .mud-button-root:active{background-color:var(--mud-palette-error-hover)}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-dark .mud-button-root{color:var(--mud-palette-dark);border:1px solid var(--mud-palette-dark);--mud-ripple-color: var(--mud-palette-dark)}@media(hover: hover)and (pointer: fine){.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-dark .mud-button-root:hover{background-color:var(--mud-palette-dark-hover)}}.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-dark .mud-button-root:focus-visible,.mud-button-group-outlined.mud-button-group-override-styles.mud-button-group-outlined-dark .mud-button-root:active{background-color:var(--mud-palette-dark-hover)}.mud-button-group-filled{box-shadow:var(--mud-elevation-2)}.mud-button-group-filled .mud-button-root{box-shadow:none}@media(hover: hover)and (pointer: fine){.mud-button-group-filled .mud-button-root:hover{box-shadow:var(--mud-elevation-4)}}.mud-button-group-filled .mud-button-root:focus-visible,.mud-button-group-filled .mud-button-root:active{box-shadow:var(--mud-elevation-4)}.mud-button-group-filled.mud-button-group-override-styles .mud-button-root{background-color:var(--mud-palette-action-default-hover);padding:6px 16px}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-divider)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-divider)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-vertical .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-vertical>:not(:first-child) .mud-button-root{border-top:1px solid var(--mud-palette-divider)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-primary .mud-button-root{background-color:var(--mud-palette-primary);color:var(--mud-palette-primary-text);--mud-ripple-color: var(--mud-palette-primary-text);--mud-ripple-opacity: var(--mud-ripple-opacity-secondary)}@media(hover: hover)and (pointer: fine){.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-primary .mud-button-root:hover{background-color:var(--mud-palette-primary-darken)}}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-primary .mud-button-root:focus-visible,.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-primary .mud-button-root:active{background-color:var(--mud-palette-primary-darken)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-primary .mud-button-root:disabled{background-color:var(--mud-palette-action-disabled-background)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-primary.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-primary.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-primary-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-primary.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-primary.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-primary-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-primary.mud-button-group-vertical .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-primary.mud-button-group-vertical>:not(:first-child) .mud-button-root{border-top:1px solid var(--mud-palette-primary-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-secondary .mud-button-root{background-color:var(--mud-palette-secondary);color:var(--mud-palette-secondary-text);--mud-ripple-color: var(--mud-palette-secondary-text);--mud-ripple-opacity: var(--mud-ripple-opacity-secondary)}@media(hover: hover)and (pointer: fine){.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-secondary .mud-button-root:hover{background-color:var(--mud-palette-secondary-darken)}}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-secondary .mud-button-root:focus-visible,.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-secondary .mud-button-root:active{background-color:var(--mud-palette-secondary-darken)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-secondary .mud-button-root:disabled{background-color:var(--mud-palette-action-disabled-background)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-secondary.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-secondary.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-secondary-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-secondary.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-secondary.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-secondary-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-secondary.mud-button-group-vertical .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-secondary.mud-button-group-vertical>:not(:first-child) .mud-button-root{border-top:1px solid var(--mud-palette-secondary-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-tertiary .mud-button-root{background-color:var(--mud-palette-tertiary);color:var(--mud-palette-tertiary-text);--mud-ripple-color: var(--mud-palette-tertiary-text);--mud-ripple-opacity: var(--mud-ripple-opacity-secondary)}@media(hover: hover)and (pointer: fine){.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-tertiary .mud-button-root:hover{background-color:var(--mud-palette-tertiary-darken)}}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-tertiary .mud-button-root:focus-visible,.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-tertiary .mud-button-root:active{background-color:var(--mud-palette-tertiary-darken)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-tertiary .mud-button-root:disabled{background-color:var(--mud-palette-action-disabled-background)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-tertiary.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-tertiary.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-tertiary-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-tertiary.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-tertiary.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-tertiary-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-tertiary.mud-button-group-vertical .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-tertiary.mud-button-group-vertical>:not(:first-child) .mud-button-root{border-top:1px solid var(--mud-palette-tertiary-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-info .mud-button-root{background-color:var(--mud-palette-info);color:var(--mud-palette-info-text);--mud-ripple-color: var(--mud-palette-info-text);--mud-ripple-opacity: var(--mud-ripple-opacity-secondary)}@media(hover: hover)and (pointer: fine){.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-info .mud-button-root:hover{background-color:var(--mud-palette-info-darken)}}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-info .mud-button-root:focus-visible,.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-info .mud-button-root:active{background-color:var(--mud-palette-info-darken)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-info .mud-button-root:disabled{background-color:var(--mud-palette-action-disabled-background)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-info.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-info.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-info-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-info.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-info.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-info-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-info.mud-button-group-vertical .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-info.mud-button-group-vertical>:not(:first-child) .mud-button-root{border-top:1px solid var(--mud-palette-info-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-success .mud-button-root{background-color:var(--mud-palette-success);color:var(--mud-palette-success-text);--mud-ripple-color: var(--mud-palette-success-text);--mud-ripple-opacity: var(--mud-ripple-opacity-secondary)}@media(hover: hover)and (pointer: fine){.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-success .mud-button-root:hover{background-color:var(--mud-palette-success-darken)}}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-success .mud-button-root:focus-visible,.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-success .mud-button-root:active{background-color:var(--mud-palette-success-darken)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-success .mud-button-root:disabled{background-color:var(--mud-palette-action-disabled-background)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-success.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-success.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-success-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-success.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-success.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-success-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-success.mud-button-group-vertical .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-success.mud-button-group-vertical>:not(:first-child) .mud-button-root{border-top:1px solid var(--mud-palette-success-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-warning .mud-button-root{background-color:var(--mud-palette-warning);color:var(--mud-palette-warning-text);--mud-ripple-color: var(--mud-palette-warning-text);--mud-ripple-opacity: var(--mud-ripple-opacity-secondary)}@media(hover: hover)and (pointer: fine){.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-warning .mud-button-root:hover{background-color:var(--mud-palette-warning-darken)}}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-warning .mud-button-root:focus-visible,.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-warning .mud-button-root:active{background-color:var(--mud-palette-warning-darken)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-warning .mud-button-root:disabled{background-color:var(--mud-palette-action-disabled-background)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-warning.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-warning.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-warning-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-warning.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-warning.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-warning-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-warning.mud-button-group-vertical .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-warning.mud-button-group-vertical>:not(:first-child) .mud-button-root{border-top:1px solid var(--mud-palette-warning-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-error .mud-button-root{background-color:var(--mud-palette-error);color:var(--mud-palette-error-text);--mud-ripple-color: var(--mud-palette-error-text);--mud-ripple-opacity: var(--mud-ripple-opacity-secondary)}@media(hover: hover)and (pointer: fine){.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-error .mud-button-root:hover{background-color:var(--mud-palette-error-darken)}}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-error .mud-button-root:focus-visible,.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-error .mud-button-root:active{background-color:var(--mud-palette-error-darken)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-error .mud-button-root:disabled{background-color:var(--mud-palette-action-disabled-background)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-error.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-error.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-error-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-error.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-error.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-error-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-error.mud-button-group-vertical .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-error.mud-button-group-vertical>:not(:first-child) .mud-button-root{border-top:1px solid var(--mud-palette-error-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-dark .mud-button-root{background-color:var(--mud-palette-dark);color:var(--mud-palette-dark-text);--mud-ripple-color: var(--mud-palette-dark-text);--mud-ripple-opacity: var(--mud-ripple-opacity-secondary)}@media(hover: hover)and (pointer: fine){.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-dark .mud-button-root:hover{background-color:var(--mud-palette-dark-darken)}}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-dark .mud-button-root:focus-visible,.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-dark .mud-button-root:active{background-color:var(--mud-palette-dark-darken)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-dark .mud-button-root:disabled{background-color:var(--mud-palette-action-disabled-background)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-dark.mud-button-group-horizontal:not(.mud-button-group-rtl) .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-dark.mud-button-group-horizontal:not(.mud-button-group-rtl)>:not(:first-child) .mud-button-root{border-left:1px solid var(--mud-palette-dark-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-dark.mud-button-group-horizontal.mud-button-group-rtl .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-dark.mud-button-group-horizontal.mud-button-group-rtl>:not(:first-child) .mud-button-root{border-right:1px solid var(--mud-palette-dark-lighten)}.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-dark.mud-button-group-vertical .mud-button-root:not(:first-child),.mud-button-group-filled.mud-button-group-override-styles.mud-button-group-filled-dark.mud-button-group-vertical>:not(:first-child) .mud-button-root{border-top:1px solid var(--mud-palette-dark-lighten)}.mud-button-group-disable-elevation{box-shadow:none}.mud-icon-button{flex:0 0 auto;padding:12px;overflow:visible;font-size:1.5rem;text-align:center;transition:background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;border-radius:50%;color:var(--mud-palette-action-default)}.mud-icon-button.mud-button{min-width:unset;border-radius:var(--mud-default-borderradius)}@media(hover: hover)and (pointer: fine){.mud-icon-button:hover{background-color:var(--mud-palette-action-default-hover)}}.mud-icon-button:focus-visible,.mud-icon-button:active{background-color:var(--mud-palette-action-default-hover)}.mud-icon-button:disabled{color:var(--mud-palette-action-disabled);background-color:rgba(0,0,0,0)}.mud-icon-button.mud-readonly,.mud-icon-button .mud-readonly:hover{cursor:default}.mud-icon-button-color-inherit{color:inherit}@media(hover: hover)and (pointer: fine){.mud-icon-button-color-inherit:hover{background-color:var(--mud-palette-action-default-hover)}}.mud-icon-button-color-inherit:focus-visible,.mud-icon-button-color-inherit:active{background-color:var(--mud-palette-action-default-hover)}.mud-icon-button-label{width:100%;display:flex;align-items:inherit;justify-content:inherit}.mud-icon-button-edge-start{margin-left:-12px;margin-inline-start:-12px;margin-inline-end:unset}.mud-icon-button-edge-end{margin-right:-12px;margin-inline-end:-12px;margin-inline-start:unset}.mud-icon-button-edge-margin-end{margin-right:8px;margin-inline-end:8px;margin-inline-start:unset}.mud-icon-button-size-small{padding:3px;font-size:1.125rem}.mud-icon-button-size-small.mud-icon-button-edge-start{margin-left:-3px;margin-inline-start:-3px;margin-inline-end:unset}.mud-icon-button-size-small.mud-icon-button-edge-end{margin-right:-3px;margin-inline-end:-3px;margin-inline-start:unset}.mud-icon-button-size-large.mud-button>.mud-icon-button-label>.mud-icon-size-large{font-size:2rem}.mud-card{display:flex;flex-direction:column}.mud-card-header{display:flex;padding:16px;align-items:center;border-top-left-radius:inherit;border-top-right-radius:inherit}.mud-card-header .mud-card-header-avatar{flex:0 0 auto;margin-right:16px;margin-inline-end:16px;margin-inline-start:unset}.mud-card-header .mud-card-header-content{flex:1 1 auto}.mud-card-header .mud-card-header-content .mud-typography{margin-bottom:0}.mud-card-header .mud-card-header-actions{flex:0 0 auto;align-self:flex-start;margin-top:-8px;margin-right:-8px;margin-inline-end:-8px;margin-inline-start:unset}.mud-card-media{display:block;background-size:cover;background-repeat:no-repeat;background-position:center;border-top-left-radius:inherit;border-top-right-radius:inherit}.mud-card-header+.mud-card-media{border-top-left-radius:0px;border-top-right-radius:0px}.mud-card-content{flex-grow:1;padding:16px}.mud-card-actions{display:flex;padding:8px;align-items:center}.mud-carousel{display:flex !important;position:relative;margin:0px !important;clip-path:inset(0px 0px 0px 0px);overflow:hidden}.mud-carousel.mud-carousel-primary{color:var(--mud-palette-primary-text)}.mud-carousel.mud-carousel-secondary{color:var(--mud-palette-secondary-text)}.mud-carousel.mud-carousel-tertiary{color:var(--mud-palette-tertiary-text)}.mud-carousel.mud-carousel-info{color:var(--mud-palette-info-text)}.mud-carousel.mud-carousel-success{color:var(--mud-palette-success-text)}.mud-carousel.mud-carousel-warning{color:var(--mud-palette-warning-text)}.mud-carousel.mud-carousel-error{color:var(--mud-palette-error-text)}.mud-carousel.mud-carousel-dark{color:var(--mud-palette-dark-text)}.mud-carousel-elements-rtl{transform:rotate(180deg) !important}.mud-carousel-item{position:absolute;left:0px;right:0px;top:0px;bottom:0px;margin:inherit;padding:inherit;z-index:2}.mud-carousel-item.mud-carousel-item-primary{color:var(--mud-palette-primary-text);background-color:var(--mud-palette-primary)}.mud-carousel-item.mud-carousel-item-secondary{color:var(--mud-palette-secondary-text);background-color:var(--mud-palette-secondary)}.mud-carousel-item.mud-carousel-item-tertiary{color:var(--mud-palette-tertiary-text);background-color:var(--mud-palette-tertiary)}.mud-carousel-item.mud-carousel-item-info{color:var(--mud-palette-info-text);background-color:var(--mud-palette-info)}.mud-carousel-item.mud-carousel-item-success{color:var(--mud-palette-success-text);background-color:var(--mud-palette-success)}.mud-carousel-item.mud-carousel-item-warning{color:var(--mud-palette-warning-text);background-color:var(--mud-palette-warning)}.mud-carousel-item.mud-carousel-item-error{color:var(--mud-palette-error-text);background-color:var(--mud-palette-error)}.mud-carousel-item.mud-carousel-item-dark{color:var(--mud-palette-dark-text);background-color:var(--mud-palette-dark)}.mud-carousel-item-exit{z-index:1}@keyframes mud-carousel-transition-fade-in-keyframe{from{opacity:0}to{opacity:1}}@keyframes mud-carousel-transition-fade-out-keyframe{from{opacity:1}to{opacity:0}}.mud-carousel-transition-fade-in{animation:.5s mud-carousel-transition-fade-in-keyframe}.mud-carousel-transition-fade-out{animation:.5s mud-carousel-transition-fade-out-keyframe;animation-fill-mode:forwards}.mud-carousel-transition-none{display:none}@keyframes mud-carousel-transition-slide-next-enter-keyframe{from{transform:translate3d(100%, 0, 0);visibility:visible}to{transform:translate3d(0, 0, 0)}}@keyframes mud-carousel-transition-slide-next-rtl-enter-keyframe{from{transform:translate3d(-100%, 0, 0);visibility:visible}to{transform:translate3d(0, 0, 0)}}@keyframes mud-carousel-transition-slide-next-exit-keyframe{from{transform:translate3d(0, 0, 0);visibility:visible}to{transform:translate3d(-100%, 0, 0)}}@keyframes mud-carousel-transition-slide-next-rtl-exit-keyframe{from{transform:translate3d(0, 0, 0);visibility:visible}to{transform:translate3d(100%, 0, 0)}}.mud-carousel-transition-slide-next-enter{animation:.5s mud-carousel-transition-slide-next-enter-keyframe}.mud-carousel-transition-slide-next-rtl-enter{animation:.5s mud-carousel-transition-slide-next-rtl-enter-keyframe}.mud-carousel-transition-slide-next-exit{animation:.5s mud-carousel-transition-slide-next-exit-keyframe;animation-fill-mode:forwards}.mud-carousel-transition-slide-next-rtl-exit{animation:.5s mud-carousel-transition-slide-next-rtl-exit-keyframe;animation-fill-mode:forwards}@keyframes mud-carousel-transition-slide-prev-enter-keyframe{from{transform:translate3d(-100%, 0, 0);visibility:visible}to{transform:translate3d(0, 0, 0)}}@keyframes mud-carousel-transition-slide-prev-rtl-enter-keyframe{from{transform:translate3d(100%, 0, 0);visibility:visible}to{transform:translate3d(0, 0, 0)}}@keyframes mud-carousel-transition-slide-prev-exit-keyframe{from{transform:translate3d(0, 0, 0);visibility:visible}to{transform:translate3d(100%, 0, 0)}}@keyframes mud-carousel-transition-slide-prev-rtl-exit-keyframe{from{transform:translate3d(0, 0, 0);visibility:visible}to{transform:translate3d(-100%, 0, 0)}}.mud-carousel-transition-slide-prev-enter{animation:.5s mud-carousel-transition-slide-prev-enter-keyframe}.mud-carousel-transition-slide-prev-rtl-enter{animation:.5s mud-carousel-transition-slide-prev-rtl-enter-keyframe}.mud-carousel-transition-slide-prev-exit{animation:.5s mud-carousel-transition-slide-prev-exit-keyframe;animation-fill-mode:forwards}.mud-carousel-transition-slide-prev-rtl-exit{animation:.5s mud-carousel-transition-slide-prev-rtl-exit-keyframe;animation-fill-mode:forwards}.mud-chart{display:flex;min-height:fit-content;min-width:fit-content}.mud-chart svg{order:2}.mud-chart.mud-chart-legend-bottom{flex-direction:column}.mud-chart.mud-chart-legend-bottom .mud-chart-legend{margin-top:10px;justify-content:center;width:100%;order:3}.mud-chart.mud-chart-legend-top{flex-direction:column}.mud-chart.mud-chart-legend-top .mud-chart-legend{justify-content:center;width:100%;order:1}.mud-chart.mud-chart-legend-right{flex-direction:row}.mud-chart.mud-chart-legend-right .mud-chart-legend{flex-direction:column;order:3;min-width:fit-content}.mud-chart.mud-chart-legend-left{flex-direction:row}.mud-chart.mud-chart-legend-left .mud-chart-legend{flex-direction:column;order:1;min-width:fit-content}.mud-chart .mud-chart-donut,.mud-chart .mud-chart-pie,.mud-chart mud-chart-line{display:flex;margin:auto}.mud-chart .mud-chart-legend{display:flex;padding:10px 0px;margin:auto;flex-wrap:wrap}.mud-chart .mud-chart-legend .mud-chart-legend-item{display:block;margin:2px 5px}.mud-chart .mud-chart-legend .mud-chart-legend-item .mud-chart-legend-marker{height:12px;width:12px;border-radius:50%;position:relative;display:inline-flex}.mud-chart .mud-chart-legend .mud-chart-legend-item .mud-chart-legend-text{display:inline-flex}.mud-chart .mud-chart-legend .mud-chart-legend-item .mud-chart-legend-checkbox{display:flex;align-items:center}.mud-chart .mud-chart-legend .mud-chart-legend-item .mud-input-control{width:35px !important}.mud-charts-yaxis{fill:var(--mud-palette-text-primary)}.mud-charts-xaxis{fill:var(--mud-palette-text-primary)}.mud-chart-donut .mud-donut-hole{fill:rgba(0,0,0,0);user-select:none;pointer-events:unset}.mud-chart-donut .mud-donut-ring{fill:rgba(0,0,0,0);stroke:#fff;pointer-events:unset}.mud-chart-donut .mud-donut-segment{fill:rgba(0,0,0,0);pointer-events:stroke;-webkit-transition:stroke .2s ease;-moz-transition:stroke .2s ease;-o-transition:stroke .2s ease;transition:stroke .2s ease}.mud-chart-legend-marker{height:12px;width:12px;border-radius:50%;position:relative;display:inline-block}.mud-chart-marker-color-0{background-color:#008ffb}.mud-chart-marker-color-1{background-color:#00e396}.mud-chart-marker-color-2{background-color:#feb019}.mud-chart-marker-color-3{background-color:#ff4560}.mud-chart-marker-color-4{background-color:#594ae2}.mud-chart-cell text{fill:#000}.mud-chart-heatmap-legend line{stroke:var(--mud-palette-text-primary)}.mud-chart-heatmap-legend text{fill:var(--mud-palette-text-primary)}.mud-chat{display:grid;column-gap:.75rem;padding-top:.25rem;padding-bottom:.25rem;border-radius:var(--mud-default-borderradius)}.mud-chat.mud-dense .mud-chat-bubble{padding:.1875rem 1rem;min-height:.9166666667rem}.mud-chat.mud-dense .mud-chat-bubble+.mud-chat-bubble{margin-top:.1875rem}.mud-chat.mud-dense .mud-chat-header{line-height:.4166666667rem}.mud-chat.mud-square{border-radius:0px}.mud-chat.mud-square .mud-chat-bubble{border-radius:0px}.mud-chat.mud-chat-arrow-top .mud-chat-bubble:before{content:"";mask-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0nMycgaGVpZ2h0PSczJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnPjxwYXRoIGZpbGw9J2JsYWNrJyBkPSdtIDAgMCBMIDMgMCBMIDMgMyBDIDMgMiAxIDAgMCAwJy8+PC9zdmc+);bottom:auto;top:0}.mud-chat.mud-chat-arrow-top.mud-chat-start .mud-chat-bubble{border-top-left-radius:0}.mud-chat.mud-chat-arrow-top.mud-chat-end .mud-chat-bubble{border-top-right-radius:0}.mud-chat.mud-chat-arrow-bottom .mud-chat-bubble:before{content:"";mask-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0nMycgaGVpZ2h0PSczJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnPjxwYXRoIGZpbGw9J2JsYWNrJyBkPSdtIDAgMyBMIDMgMyBMIDMgMCBDIDMgMSAxIDMgMCAzJy8+PC9zdmc+);bottom:0}.mud-chat.mud-chat-arrow-bottom.mud-chat-start .mud-chat-bubble{border-bottom-left-radius:0}.mud-chat.mud-chat-arrow-bottom.mud-chat-end .mud-chat-bubble{border-bottom-right-radius:0}.mud-chat.mud-chat-arrow-middle .mud-chat-bubble:before{content:"";mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzIDMiIHdpZHRoPSIzMDAiIGhlaWdodD0iMzAwIj4KICA8cG9seWdvbiBwb2ludHM9IjMsMCAzLDMgMS41LDEuNSIgZmlsbD0iYmxhY2siIC8+Cjwvc3ZnPg==);top:50%}.mud-chat.mud-chat-arrow-middle.mud-chat-start .mud-chat-bubble:before,.mud-chat.mud-chat-arrow-middle.mud-chat-end.mud-chat-rtl .mud-chat-bubble:before{transform:translateY(-50%)}.mud-chat.mud-chat-arrow-middle.mud-chat-end .mud-chat-bubble:before,.mud-chat.mud-chat-arrow-middle.mud-chat-start.mud-chat-rtl .mud-chat-bubble:before{transform:scaleX(-1) translateY(-50%)}.mud-chat-bubble{position:relative;text-align:start;align-content:center;width:fit-content;padding:.5rem 1rem;max-width:90%;border-radius:var(--mud-default-borderradius);min-width:2.75rem;min-height:2.75rem}.mud-chat-bubble.mud-chat-bubble-clickable{cursor:pointer;user-select:none;-webkit-appearance:none;-webkit-tap-highlight-color:rgba(0,0,0,0);transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;--mud-ripple-color: $default-foreground;--mud-ripple-opacity: var(--mud-ripple-opacity-secondary) !important}@media(hover: hover)and (pointer: fine){.mud-chat-bubble.mud-chat-bubble-clickable:hover{box-shadow:0px 2px 4px -1px rgba(0,0,0,.2),0px 4px 5px 0px rgba(0,0,0,.14),0px 1px 10px 0px rgba(0,0,0,.12);background-color:var(--mud-palette-action-disabled-background)}}.mud-chat-bubble.mud-chat-bubble-clickable:focus-visible{box-shadow:0px 2px 4px -1px rgba(0,0,0,.2),0px 4px 5px 0px rgba(0,0,0,.14),0px 1px 10px 0px rgba(0,0,0,.12);background-color:var(--mud-palette-action-disabled-background)}.mud-chat-bubble.mud-chat-bubble-clickable:active{box-shadow:0px 5px 5px -3px rgba(0,0,0,.2),0px 8px 10px 1px rgba(0,0,0,.14),0px 3px 14px 2px rgba(0,0,0,.12);background-color:var(--mud-palette-action-disabled-background)}.mud-chat-bubble:before{position:absolute;width:.75rem;height:.75rem;background-color:inherit;mask-size:contain;mask-repeat:no-repeat;mask-position:center}.mud-chat-bubble+.mud-chat-bubble{margin-top:.5rem}.mud-chat-bubble+.mud-chat-bubble:before{content:none !important}.mud-chat-header{grid-row-start:1;font-size:.875rem;line-height:1.25rem;margin-left:.25rem;margin-right:.25rem;min-height:.5rem}.mud-chat-header time{margin-left:.5rem;opacity:.5;font-size:.75rem;line-height:1rem}.mud-chat-footer{opacity:.5;font-size:.875rem;line-height:1rem;margin-left:.25rem;margin-right:.25rem;min-height:.5rem}.mud-chat .mud-avatar{align-self:center;grid-row-start:1}.mud-chat:has(.mud-chat-header) .mud-avatar{grid-row-start:2}.mud-chat-start{place-items:start;grid-template-columns:1fr 99fr}.mud-chat-start .mud-chat-header,.mud-chat-start .mud-chat-footer{grid-column-start:2}.mud-chat-start .mud-avatar{grid-column-start:1;margin-left:.25rem;margin-right:-0.35rem}.mud-chat-start .mud-chat-bubble{grid-column-start:2}.mud-chat-start .mud-chat-bubble:before{inset-inline-start:-0.749rem}.mud-chat-end{place-items:end;grid-template-columns:99fr 1fr}.mud-chat-end .mud-chat-header,.mud-chat-end .mud-chat-footer{grid-column-start:1}.mud-chat-end .mud-avatar{grid-column-start:2;margin-right:.25rem;margin-left:-0.35rem}.mud-chat-end .mud-chat-bubble{grid-column-start:1;text-align:end}.mud-chat-end .mud-chat-bubble:before{inset-inline-start:100%;transform:scaleX(-1)}.mud-chat-text-default{color:var(--mud-palette-text-primary);background-color:var(--mud-palette-action-default-hover);--mud-ripple-color: $default-foreground}.mud-chat-text-primary{color:var(--mud-palette-primary-darken);background-color:var(--mud-palette-primary-hover);--mud-ripple-color: var(--mud-palette-primary-darken)}.mud-chat-text-secondary{color:var(--mud-palette-secondary-darken);background-color:var(--mud-palette-secondary-hover);--mud-ripple-color: var(--mud-palette-secondary-darken)}.mud-chat-text-tertiary{color:var(--mud-palette-tertiary-darken);background-color:var(--mud-palette-tertiary-hover);--mud-ripple-color: var(--mud-palette-tertiary-darken)}.mud-chat-text-info{color:var(--mud-palette-info-darken);background-color:var(--mud-palette-info-hover);--mud-ripple-color: var(--mud-palette-info-darken)}.mud-chat-text-success{color:var(--mud-palette-success-darken);background-color:var(--mud-palette-success-hover);--mud-ripple-color: var(--mud-palette-success-darken)}.mud-chat-text-warning{color:var(--mud-palette-warning-darken);background-color:var(--mud-palette-warning-hover);--mud-ripple-color: var(--mud-palette-warning-darken)}.mud-chat-text-error{color:var(--mud-palette-error-darken);background-color:var(--mud-palette-error-hover);--mud-ripple-color: var(--mud-palette-error-darken)}.mud-chat-text-dark{color:var(--mud-palette-dark-darken);background-color:var(--mud-palette-dark-hover);--mud-ripple-color: var(--mud-palette-dark-darken)}.mud-chat-outlined-default{color:var(--mud-palette-text-primary);border:1px solid var(--mud-palette-action-default-hover);--mud-ripple-color: $default-foreground}.mud-chat-outlined-default:before{background-color:var(--mud-palette-action-default-hover)}.mud-chat-outlined-default.mud-chat-arrow-top:before{top:-0.05rem !important}.mud-chat-outlined-default.mud-chat-arrow-bottom:before{bottom:-0.07rem !important}.mud-chat-outlined-primary{color:var(--mud-palette-primary-darken);border:1px solid var(--mud-palette-primary);--mud-ripple-color: var(--mud-palette-primary-darken)}.mud-chat-outlined-primary:before{background-color:var(--mud-palette-primary-darken)}.mud-chat-outlined-primary.mud-chat-arrow-top:before{top:-0.05rem !important}.mud-chat-outlined-primary.mud-chat-arrow-bottom:before{bottom:-0.02rem !important}.mud-chat-outlined-secondary{color:var(--mud-palette-secondary-darken);border:1px solid var(--mud-palette-secondary);--mud-ripple-color: var(--mud-palette-secondary-darken)}.mud-chat-outlined-secondary:before{background-color:var(--mud-palette-secondary-darken)}.mud-chat-outlined-secondary.mud-chat-arrow-top:before{top:-0.05rem !important}.mud-chat-outlined-secondary.mud-chat-arrow-bottom:before{bottom:-0.02rem !important}.mud-chat-outlined-tertiary{color:var(--mud-palette-tertiary-darken);border:1px solid var(--mud-palette-tertiary);--mud-ripple-color: var(--mud-palette-tertiary-darken)}.mud-chat-outlined-tertiary:before{background-color:var(--mud-palette-tertiary-darken)}.mud-chat-outlined-tertiary.mud-chat-arrow-top:before{top:-0.05rem !important}.mud-chat-outlined-tertiary.mud-chat-arrow-bottom:before{bottom:-0.02rem !important}.mud-chat-outlined-info{color:var(--mud-palette-info-darken);border:1px solid var(--mud-palette-info);--mud-ripple-color: var(--mud-palette-info-darken)}.mud-chat-outlined-info:before{background-color:var(--mud-palette-info-darken)}.mud-chat-outlined-info.mud-chat-arrow-top:before{top:-0.05rem !important}.mud-chat-outlined-info.mud-chat-arrow-bottom:before{bottom:-0.02rem !important}.mud-chat-outlined-success{color:var(--mud-palette-success-darken);border:1px solid var(--mud-palette-success);--mud-ripple-color: var(--mud-palette-success-darken)}.mud-chat-outlined-success:before{background-color:var(--mud-palette-success-darken)}.mud-chat-outlined-success.mud-chat-arrow-top:before{top:-0.05rem !important}.mud-chat-outlined-success.mud-chat-arrow-bottom:before{bottom:-0.02rem !important}.mud-chat-outlined-warning{color:var(--mud-palette-warning-darken);border:1px solid var(--mud-palette-warning);--mud-ripple-color: var(--mud-palette-warning-darken)}.mud-chat-outlined-warning:before{background-color:var(--mud-palette-warning-darken)}.mud-chat-outlined-warning.mud-chat-arrow-top:before{top:-0.05rem !important}.mud-chat-outlined-warning.mud-chat-arrow-bottom:before{bottom:-0.02rem !important}.mud-chat-outlined-error{color:var(--mud-palette-error-darken);border:1px solid var(--mud-palette-error);--mud-ripple-color: var(--mud-palette-error-darken)}.mud-chat-outlined-error:before{background-color:var(--mud-palette-error-darken)}.mud-chat-outlined-error.mud-chat-arrow-top:before{top:-0.05rem !important}.mud-chat-outlined-error.mud-chat-arrow-bottom:before{bottom:-0.02rem !important}.mud-chat-outlined-dark{color:var(--mud-palette-dark-darken);border:1px solid var(--mud-palette-dark);--mud-ripple-color: var(--mud-palette-dark-darken)}.mud-chat-outlined-dark:before{background-color:var(--mud-palette-dark-darken)}.mud-chat-outlined-dark.mud-chat-arrow-top:before{top:-0.05rem !important}.mud-chat-outlined-dark.mud-chat-arrow-bottom:before{bottom:-0.02rem !important}.mud-chat-filled-default{color:var(--mud-palette-text-primary);font-weight:500;background-color:var(--mud-palette-action-default-hover);--mud-ripple-color: $default-foreground}.mud-chat-filled-primary{color:var(--mud-palette-primary-text);font-weight:500;background-color:var(--mud-palette-primary);--mud-ripple-color: var(--mud-palette-primary-text)}.mud-chat-filled-secondary{color:var(--mud-palette-secondary-text);font-weight:500;background-color:var(--mud-palette-secondary);--mud-ripple-color: var(--mud-palette-secondary-text)}.mud-chat-filled-tertiary{color:var(--mud-palette-tertiary-text);font-weight:500;background-color:var(--mud-palette-tertiary);--mud-ripple-color: var(--mud-palette-tertiary-text)}.mud-chat-filled-info{color:var(--mud-palette-info-text);font-weight:500;background-color:var(--mud-palette-info);--mud-ripple-color: var(--mud-palette-info-text)}.mud-chat-filled-success{color:var(--mud-palette-success-text);font-weight:500;background-color:var(--mud-palette-success);--mud-ripple-color: var(--mud-palette-success-text)}.mud-chat-filled-warning{color:var(--mud-palette-warning-text);font-weight:500;background-color:var(--mud-palette-warning);--mud-ripple-color: var(--mud-palette-warning-text)}.mud-chat-filled-error{color:var(--mud-palette-error-text);font-weight:500;background-color:var(--mud-palette-error);--mud-ripple-color: var(--mud-palette-error-text)}.mud-chat-filled-dark{color:var(--mud-palette-dark-text);font-weight:500;background-color:var(--mud-palette-dark);--mud-ripple-color: var(--mud-palette-dark-text)}.mud-checkbox{cursor:pointer;display:inline-flex;align-items:center;vertical-align:middle;-webkit-tap-highlight-color:rgba(0,0,0,0)}@media(hover: hover)and (pointer: fine){.mud-checkbox .mud-disabled:hover{cursor:default;background-color:rgba(0,0,0,0) !important}.mud-checkbox .mud-disabled:hover *{cursor:default;color:var(--mud-palette-text-disabled)}}.mud-checkbox .mud-disabled:focus-visible,.mud-checkbox .mud-disabled:active{cursor:default;background-color:rgba(0,0,0,0) !important}.mud-checkbox .mud-disabled:focus-visible *,.mud-checkbox .mud-disabled:active *{cursor:default;color:var(--mud-palette-text-disabled)}.mud-checkbox.mud-readonly,.mud-checkbox .mud-readonly:hover{cursor:default;background-color:rgba(0,0,0,0) !important}.mud-checkbox .mud-checkbox-dense{padding:4px}.mud-checkbox-input{top:0;left:0;width:100%;cursor:inherit;height:100%;margin:0;opacity:0;padding:0;z-index:1;position:absolute}.mud-checkbox-span{display:inline-block;width:100%;cursor:pointer}.mud-chart-legend-checkbox .mud-checkbox svg path:last-child{fill:var(--checkbox-color) !important}.mud-chip-container{display:contents}.mud-chip{border:none;display:inline-flex;max-width:100%;outline:0;padding:0 12px;position:relative;box-sizing:border-box;transition:background-color 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;align-items:center;white-space:nowrap;vertical-align:middle;justify-content:center;text-decoration:none;line-height:normal;margin:4px}.mud-chip.mud-disabled{opacity:.5;pointer-events:none}.mud-chip.mud-chip-size-small{border-radius:12px;font-size:12px;height:24px;padding:0 8px}.mud-chip.mud-chip-size-small .mud-avatar{margin-left:-4px;margin-right:4px;margin-inline-start:-4px;margin-inline-end:4px;width:18px;height:18px;font-size:.625rem}.mud-chip.mud-chip-size-small .mud-icon-root{font-size:1.125rem}.mud-chip.mud-chip-size-small .mud-chip-close-button{margin-right:-4px;margin-left:4px;margin-inline-end:-4px;margin-inline-start:4px}.mud-chip.mud-chip-size-medium{height:32px;font-size:14px;border-radius:16px}.mud-chip.mud-chip-size-medium .mud-avatar{margin-left:-8px;margin-right:8px;margin-inline-start:-8px;margin-inline-end:8px;width:24px;height:24px;font-size:.75rem}.mud-chip.mud-chip-size-large{height:40px;font-size:16px;border-radius:20px;padding:0 16px}.mud-chip.mud-chip-size-large .mud-avatar{margin-left:-12px;margin-right:8px;margin-inline-start:-12px;margin-inline-end:8px;width:32px;height:32px;font-size:1rem}.mud-chip.mud-chip-size-large .mud-chip-icon{font-size:1.5rem;margin-left:-6px;margin-right:6px;margin-inline-start:-6px;margin-inline-end:6px}.mud-chip.mud-chip-label{border-radius:var(--mud-default-borderradius)}.mud-chip.mud-clickable{cursor:pointer;user-select:none}.mud-chip .mud-chip-icon{margin-left:-4px;margin-right:4px;margin-inline-start:-4px;margin-inline-end:4px;color:inherit}.mud-chip .mud-chip-close-button{padding:1px;margin-right:-4px;margin-left:6px;margin-inline-end:-4px;margin-inline-start:6px;height:18px;width:18px;color:inherit;transition:.3s cubic-bezier(0.25, 0.8, 0.5, 1),visibility 0s}.mud-chip .mud-chip-close-button .mud-icon-size-small{font-size:1.15rem}@media(hover: hover)and (pointer: fine){.mud-chip .mud-chip-close-button:hover:not(.mud-disabled){opacity:.7}}.mud-chip .mud-chip-close-button:focus-visible:not(.mud-disabled),.mud-chip .mud-chip-close-button:active:not(.mud-disabled){opacity:.7}.mud-chip>.mud-chip-content{align-items:center;display:inline-flex;height:100%;max-width:100%}.mud-chip-filled{color:var(--mud-palette-text-primary);background-color:var(--mud-palette-action-disabled-background);--mud-ripple-opacity: var(--mud-ripple-opacity-secondary)}@media(hover: hover)and (pointer: fine){.mud-chip-filled.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-action-disabled)}}.mud-chip-filled.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-filled.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-action-disabled)}.mud-chip-filled.mud-chip-color-primary{color:var(--mud-palette-primary-text);--mud-ripple-color: var(--mud-palette-primary-text) !important;background-color:var(--mud-palette-primary)}@media(hover: hover)and (pointer: fine){.mud-chip-filled.mud-chip-color-primary.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-primary-darken)}}.mud-chip-filled.mud-chip-color-primary.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-filled.mud-chip-color-primary.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-primary-darken)}.mud-chip-filled.mud-chip-color-secondary{color:var(--mud-palette-secondary-text);--mud-ripple-color: var(--mud-palette-secondary-text) !important;background-color:var(--mud-palette-secondary)}@media(hover: hover)and (pointer: fine){.mud-chip-filled.mud-chip-color-secondary.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-secondary-darken)}}.mud-chip-filled.mud-chip-color-secondary.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-filled.mud-chip-color-secondary.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-secondary-darken)}.mud-chip-filled.mud-chip-color-tertiary{color:var(--mud-palette-tertiary-text);--mud-ripple-color: var(--mud-palette-tertiary-text) !important;background-color:var(--mud-palette-tertiary)}@media(hover: hover)and (pointer: fine){.mud-chip-filled.mud-chip-color-tertiary.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-tertiary-darken)}}.mud-chip-filled.mud-chip-color-tertiary.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-filled.mud-chip-color-tertiary.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-tertiary-darken)}.mud-chip-filled.mud-chip-color-info{color:var(--mud-palette-info-text);--mud-ripple-color: var(--mud-palette-info-text) !important;background-color:var(--mud-palette-info)}@media(hover: hover)and (pointer: fine){.mud-chip-filled.mud-chip-color-info.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-info-darken)}}.mud-chip-filled.mud-chip-color-info.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-filled.mud-chip-color-info.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-info-darken)}.mud-chip-filled.mud-chip-color-success{color:var(--mud-palette-success-text);--mud-ripple-color: var(--mud-palette-success-text) !important;background-color:var(--mud-palette-success)}@media(hover: hover)and (pointer: fine){.mud-chip-filled.mud-chip-color-success.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-success-darken)}}.mud-chip-filled.mud-chip-color-success.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-filled.mud-chip-color-success.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-success-darken)}.mud-chip-filled.mud-chip-color-warning{color:var(--mud-palette-warning-text);--mud-ripple-color: var(--mud-palette-warning-text) !important;background-color:var(--mud-palette-warning)}@media(hover: hover)and (pointer: fine){.mud-chip-filled.mud-chip-color-warning.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-warning-darken)}}.mud-chip-filled.mud-chip-color-warning.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-filled.mud-chip-color-warning.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-warning-darken)}.mud-chip-filled.mud-chip-color-error{color:var(--mud-palette-error-text);--mud-ripple-color: var(--mud-palette-error-text) !important;background-color:var(--mud-palette-error)}@media(hover: hover)and (pointer: fine){.mud-chip-filled.mud-chip-color-error.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-error-darken)}}.mud-chip-filled.mud-chip-color-error.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-filled.mud-chip-color-error.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-error-darken)}.mud-chip-filled.mud-chip-color-dark{color:var(--mud-palette-dark-text);--mud-ripple-color: var(--mud-palette-dark-text) !important;background-color:var(--mud-palette-dark)}@media(hover: hover)and (pointer: fine){.mud-chip-filled.mud-chip-color-dark.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-dark-darken)}}.mud-chip-filled.mud-chip-color-dark.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-filled.mud-chip-color-dark.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-dark-darken)}.mud-chip-outlined{color:var(--mud-palette-text-primary);border:1px solid var(--mud-palette-lines-inputs)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-action-default-hover)}}.mud-chip-outlined.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-action-default-hover)}.mud-chip-outlined.mud-chip-color-primary{color:var(--mud-palette-primary);--mud-ripple-color: var(--mud-palette-primary) !important;border:1px solid var(--mud-palette-primary)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-primary.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-primary-hover)}}.mud-chip-outlined.mud-chip-color-primary.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-primary.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-primary-hover)}.mud-chip-outlined.mud-chip-color-primary.mud-chip-selected{background-color:var(--mud-palette-primary-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-primary.mud-chip-selected:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-primary-rgb), 0.12)}}.mud-chip-outlined.mud-chip-color-primary.mud-chip-selected:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-primary.mud-chip-selected:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-primary-rgb), 0.12)}.mud-chip-outlined.mud-chip-color-secondary{color:var(--mud-palette-secondary);--mud-ripple-color: var(--mud-palette-secondary) !important;border:1px solid var(--mud-palette-secondary)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-secondary.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-secondary-hover)}}.mud-chip-outlined.mud-chip-color-secondary.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-secondary.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-secondary-hover)}.mud-chip-outlined.mud-chip-color-secondary.mud-chip-selected{background-color:var(--mud-palette-secondary-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-secondary.mud-chip-selected:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-secondary-rgb), 0.12)}}.mud-chip-outlined.mud-chip-color-secondary.mud-chip-selected:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-secondary.mud-chip-selected:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-secondary-rgb), 0.12)}.mud-chip-outlined.mud-chip-color-tertiary{color:var(--mud-palette-tertiary);--mud-ripple-color: var(--mud-palette-tertiary) !important;border:1px solid var(--mud-palette-tertiary)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-tertiary.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-tertiary-hover)}}.mud-chip-outlined.mud-chip-color-tertiary.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-tertiary.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-tertiary-hover)}.mud-chip-outlined.mud-chip-color-tertiary.mud-chip-selected{background-color:var(--mud-palette-tertiary-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-tertiary.mud-chip-selected:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-tertiary-rgb), 0.12)}}.mud-chip-outlined.mud-chip-color-tertiary.mud-chip-selected:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-tertiary.mud-chip-selected:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-tertiary-rgb), 0.12)}.mud-chip-outlined.mud-chip-color-info{color:var(--mud-palette-info);--mud-ripple-color: var(--mud-palette-info) !important;border:1px solid var(--mud-palette-info)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-info.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-info-hover)}}.mud-chip-outlined.mud-chip-color-info.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-info.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-info-hover)}.mud-chip-outlined.mud-chip-color-info.mud-chip-selected{background-color:var(--mud-palette-info-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-info.mud-chip-selected:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-info-rgb), 0.12)}}.mud-chip-outlined.mud-chip-color-info.mud-chip-selected:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-info.mud-chip-selected:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-info-rgb), 0.12)}.mud-chip-outlined.mud-chip-color-success{color:var(--mud-palette-success);--mud-ripple-color: var(--mud-palette-success) !important;border:1px solid var(--mud-palette-success)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-success.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-success-hover)}}.mud-chip-outlined.mud-chip-color-success.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-success.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-success-hover)}.mud-chip-outlined.mud-chip-color-success.mud-chip-selected{background-color:var(--mud-palette-success-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-success.mud-chip-selected:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-success-rgb), 0.12)}}.mud-chip-outlined.mud-chip-color-success.mud-chip-selected:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-success.mud-chip-selected:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-success-rgb), 0.12)}.mud-chip-outlined.mud-chip-color-warning{color:var(--mud-palette-warning);--mud-ripple-color: var(--mud-palette-warning) !important;border:1px solid var(--mud-palette-warning)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-warning.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-warning-hover)}}.mud-chip-outlined.mud-chip-color-warning.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-warning.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-warning-hover)}.mud-chip-outlined.mud-chip-color-warning.mud-chip-selected{background-color:var(--mud-palette-warning-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-warning.mud-chip-selected:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-warning-rgb), 0.12)}}.mud-chip-outlined.mud-chip-color-warning.mud-chip-selected:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-warning.mud-chip-selected:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-warning-rgb), 0.12)}.mud-chip-outlined.mud-chip-color-error{color:var(--mud-palette-error);--mud-ripple-color: var(--mud-palette-error) !important;border:1px solid var(--mud-palette-error)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-error.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-error-hover)}}.mud-chip-outlined.mud-chip-color-error.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-error.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-error-hover)}.mud-chip-outlined.mud-chip-color-error.mud-chip-selected{background-color:var(--mud-palette-error-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-error.mud-chip-selected:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-error-rgb), 0.12)}}.mud-chip-outlined.mud-chip-color-error.mud-chip-selected:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-error.mud-chip-selected:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-error-rgb), 0.12)}.mud-chip-outlined.mud-chip-color-dark{color:var(--mud-palette-dark);--mud-ripple-color: var(--mud-palette-dark) !important;border:1px solid var(--mud-palette-dark)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-dark.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-dark-hover)}}.mud-chip-outlined.mud-chip-color-dark.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-dark.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-dark-hover)}.mud-chip-outlined.mud-chip-color-dark.mud-chip-selected{background-color:var(--mud-palette-dark-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-outlined.mud-chip-color-dark.mud-chip-selected:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-dark-rgb), 0.12)}}.mud-chip-outlined.mud-chip-color-dark.mud-chip-selected:focus-visible:not(.mud-disabled),.mud-chip-outlined.mud-chip-color-dark.mud-chip-selected:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-dark-rgb), 0.12)}.mud-chip-text{color:var(--mud-palette-text-primary);background-color:var(--mud-palette-action-default-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-text.mud-clickable:hover:not(.mud-disabled){background-color:var(--mud-palette-action-disabled-background)}}.mud-chip-text.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-text.mud-clickable:active:not(.mud-disabled){background-color:var(--mud-palette-action-disabled-background)}.mud-chip-text.mud-chip-color-primary{color:var(--mud-palette-primary);--mud-ripple-color: var(--mud-palette-primary) !important;background-color:var(--mud-palette-primary-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-text.mud-chip-color-primary.mud-clickable:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-primary-rgb), 0.12)}}.mud-chip-text.mud-chip-color-primary.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-text.mud-chip-color-primary.mud-clickable:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-primary-rgb), 0.12)}.mud-chip-text.mud-chip-color-secondary{color:var(--mud-palette-secondary);--mud-ripple-color: var(--mud-palette-secondary) !important;background-color:var(--mud-palette-secondary-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-text.mud-chip-color-secondary.mud-clickable:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-secondary-rgb), 0.12)}}.mud-chip-text.mud-chip-color-secondary.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-text.mud-chip-color-secondary.mud-clickable:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-secondary-rgb), 0.12)}.mud-chip-text.mud-chip-color-tertiary{color:var(--mud-palette-tertiary);--mud-ripple-color: var(--mud-palette-tertiary) !important;background-color:var(--mud-palette-tertiary-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-text.mud-chip-color-tertiary.mud-clickable:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-tertiary-rgb), 0.12)}}.mud-chip-text.mud-chip-color-tertiary.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-text.mud-chip-color-tertiary.mud-clickable:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-tertiary-rgb), 0.12)}.mud-chip-text.mud-chip-color-info{color:var(--mud-palette-info);--mud-ripple-color: var(--mud-palette-info) !important;background-color:var(--mud-palette-info-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-text.mud-chip-color-info.mud-clickable:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-info-rgb), 0.12)}}.mud-chip-text.mud-chip-color-info.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-text.mud-chip-color-info.mud-clickable:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-info-rgb), 0.12)}.mud-chip-text.mud-chip-color-success{color:var(--mud-palette-success);--mud-ripple-color: var(--mud-palette-success) !important;background-color:var(--mud-palette-success-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-text.mud-chip-color-success.mud-clickable:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-success-rgb), 0.12)}}.mud-chip-text.mud-chip-color-success.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-text.mud-chip-color-success.mud-clickable:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-success-rgb), 0.12)}.mud-chip-text.mud-chip-color-warning{color:var(--mud-palette-warning);--mud-ripple-color: var(--mud-palette-warning) !important;background-color:var(--mud-palette-warning-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-text.mud-chip-color-warning.mud-clickable:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-warning-rgb), 0.12)}}.mud-chip-text.mud-chip-color-warning.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-text.mud-chip-color-warning.mud-clickable:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-warning-rgb), 0.12)}.mud-chip-text.mud-chip-color-error{color:var(--mud-palette-error);--mud-ripple-color: var(--mud-palette-error) !important;background-color:var(--mud-palette-error-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-text.mud-chip-color-error.mud-clickable:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-error-rgb), 0.12)}}.mud-chip-text.mud-chip-color-error.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-text.mud-chip-color-error.mud-clickable:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-error-rgb), 0.12)}.mud-chip-text.mud-chip-color-dark{color:var(--mud-palette-dark);--mud-ripple-color: var(--mud-palette-dark) !important;background-color:var(--mud-palette-dark-hover)}@media(hover: hover)and (pointer: fine){.mud-chip-text.mud-chip-color-dark.mud-clickable:hover:not(.mud-disabled){background-color:rgba(var(--mud-palette-dark-rgb), 0.12)}}.mud-chip-text.mud-chip-color-dark.mud-clickable:focus-visible:not(.mud-disabled),.mud-chip-text.mud-chip-color-dark.mud-clickable:active:not(.mud-disabled){background-color:rgba(var(--mud-palette-dark-rgb), 0.12)}.mud-collapse-container{overflow:hidden;display:grid;grid-template-rows:minmax(0, 0fr);transition:grid-template-rows 300ms ease-in-out}.mud-collapse-entering{grid-template-rows:minmax(0, 1fr)}.mud-collapse-entered{overflow:initial;grid-template-rows:minmax(0, 1fr)}.mud-collapse-entered .mud-collapse-wrapper{overflow-y:auto}.mud-collapse-hidden{visibility:hidden}.mud-collapse-wrapper{overflow:hidden;display:flex}.mud-collapse-wrapper-inner{width:100%}.mud-dialog-container{display:flex;position:fixed;top:0;left:0;width:100%;height:100%;z-index:var(--mud-zindex-dialog)}.mud-dialog-container.mud-dialog-center{align-items:center;justify-content:center}.mud-dialog-container.mud-dialog-topcenter{align-items:flex-start;justify-content:center;padding-top:32px}.mud-dialog-container.mud-dialog-bottomcenter{align-items:flex-end;justify-content:center;padding-bottom:32px}.mud-dialog-container.mud-dialog-centerright{align-items:center;justify-content:flex-end;padding-right:32px}.mud-dialog-container.mud-dialog-centerleft{align-items:center;justify-content:flex-start;padding-left:32px}.mud-dialog-container.mud-dialog-topleft .mud-dialog{position:absolute;top:32px;left:32px}.mud-dialog-container.mud-dialog-topright .mud-dialog{position:absolute;top:32px;right:32px}.mud-dialog-container.mud-dialog-bottomleft .mud-dialog{position:absolute;bottom:32px;left:32px}.mud-dialog-container.mud-dialog-bottomright .mud-dialog{position:absolute;bottom:32px;right:32px}.mud-dialog{display:flex;z-index:calc(var(--mud-zindex-dialog) + 2);flex-direction:column;color:var(--mud-palette-text-primary);background-color:var(--mud-palette-surface);border-radius:var(--mud-default-borderradius);-webkit-animation:mud-open-dialog-center .1s cubic-bezier(0.39, 0.575, 0.565, 1) both;animation:mud-open-dialog-center .1s cubic-bezier(0.39, 0.575, 0.565, 1) both;box-shadow:0px 11px 15px -7px rgba(0,0,0,.2),0px 24px 38px 3px rgba(0,0,0,.14),0px 9px 46px 8px rgba(0,0,0,.12);max-height:calc(100vh - var(--mud-appbar-height));max-height:calc(100dvh - var(--mud-appbar-height));overflow-y:auto}.mud-dialog.mud-dialog-rtl .mud-dialog-title .mud-button-close{right:unset;left:8px}.mud-dialog .mud-dialog-title{z-index:1;flex:0 0 auto;margin:0;padding:16px 24px;border-top-left-radius:var(--mud-default-borderradius);border-top-right-radius:var(--mud-default-borderradius)}.mud-dialog .mud-dialog-title+*>.mud-dialog-content{border-radius:0}.mud-dialog .mud-dialog-title .mud-button-close{top:8px;right:8px;position:absolute}.mud-dialog .mud-dialog-content{position:relative;flex:1 1 auto;overflow:auto;padding:0px 24px;margin:8px 0px;-webkit-overflow-scrolling:touch;border-top-left-radius:var(--mud-default-borderradius);border-top-right-radius:var(--mud-default-borderradius)}.mud-dialog .mud-dialog-content.mud-dialog-no-side-padding{padding:0px;margin:12px 0px}.mud-dialog .mud-dialog-actions{flex:0 0 auto;display:flex;padding:8px;align-items:center;justify-content:flex-end;border-bottom-left-radius:var(--mud-default-borderradius);border-bottom-right-radius:var(--mud-default-borderradius)}.mud-dialog .mud-dialog-actions>:not(:first-child){margin-left:8px;margin-inline-start:8px;margin-inline-end:unset}.mud-dialog-width-false{max-width:calc(100% - 64px)}.mud-dialog-width-xs{max-width:444px}.mud-dialog-width-sm{max-width:600px}.mud-dialog-width-md{max-width:960px}.mud-dialog-width-lg{max-width:1280px}.mud-dialog-width-xl{max-width:1920px}.mud-dialog-width-xxl{max-width:2560px}.mud-dialog-width-full{width:calc(100% - 64px)}.mud-dialog-fullscreen{width:100%;height:100%;margin:0;max-width:100%;max-height:none;border-radius:0;overflow-y:hidden}@-webkit-keyframes mud-open-dialog-center{0%{opacity:0}1%{-webkit-transform:scale(0.5);transform:scale(0.5);opacity:1}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes mud-open-dialog-center{0%{opacity:0}1%{-webkit-transform:scale(0.5);transform:scale(0.5);opacity:1}100%{-webkit-transform:scale(1);transform:scale(1)}}.mud-focus-trap{display:contents}.mud-focus-trap .mud-focus-trap-child-container{display:contents}.mud-input-control.mud-field .mud-input-slot{height:auto;min-height:19px}.mud-input-control.mud-field .mud-input-slot.mud-input-root-outlined.mud-input-adorned-start{padding-left:0;padding-inline-start:0;padding-inline-end:14px}.mud-input-control.mud-field .mud-input-slot.mud-input-root-filled.mud-input-adorned-start{padding-left:0;padding-inline-start:0;padding-inline-end:12px}.mud-input-control.mud-field .mud-input-slot.mud-input-slot-nopadding{padding-top:0px;padding-bottom:0px}.mud-input-control.mud-field .mud-input-slot.mud-input-slot-nopadding.mud-input-root-filled{padding-top:21px;padding-bottom:2px}.mud-input-control.mud-field .mud-input-slot.mud-input-slot-nopadding.mud-input-root-outlined{padding-top:7px;padding-bottom:2px}.mud-flex-break{flex-basis:100%;width:0}.mud-grid{width:100%;display:flex;flex-wrap:wrap;box-sizing:border-box}.mud-grid-item{margin:0;box-sizing:border-box}.mud-grid-spacing-xs-1{width:calc(100% + 4px);margin-left:-4px;margin-top:-4px}.mud-grid-spacing-xs-1>.mud-grid-item{padding-left:4px;padding-top:4px}.mud-grid-spacing-xs-2{width:calc(100% + 8px);margin-left:-8px;margin-top:-8px}.mud-grid-spacing-xs-2>.mud-grid-item{padding-left:8px;padding-top:8px}.mud-grid-spacing-xs-3{width:calc(100% + 12px);margin-left:-12px;margin-top:-12px}.mud-grid-spacing-xs-3>.mud-grid-item{padding-left:12px;padding-top:12px}.mud-grid-spacing-xs-4{width:calc(100% + 16px);margin-left:-16px;margin-top:-16px}.mud-grid-spacing-xs-4>.mud-grid-item{padding-left:16px;padding-top:16px}.mud-grid-spacing-xs-5{width:calc(100% + 20px);margin-left:-20px;margin-top:-20px}.mud-grid-spacing-xs-5>.mud-grid-item{padding-left:20px;padding-top:20px}.mud-grid-spacing-xs-6{width:calc(100% + 24px);margin-left:-24px;margin-top:-24px}.mud-grid-spacing-xs-6>.mud-grid-item{padding-left:24px;padding-top:24px}.mud-grid-spacing-xs-7{width:calc(100% + 28px);margin-left:-28px;margin-top:-28px}.mud-grid-spacing-xs-7>.mud-grid-item{padding-left:28px;padding-top:28px}.mud-grid-spacing-xs-8{width:calc(100% + 32px);margin-left:-32px;margin-top:-32px}.mud-grid-spacing-xs-8>.mud-grid-item{padding-left:32px;padding-top:32px}.mud-grid-spacing-xs-9{width:calc(100% + 36px);margin-left:-36px;margin-top:-36px}.mud-grid-spacing-xs-9>.mud-grid-item{padding-left:36px;padding-top:36px}.mud-grid-spacing-xs-10{width:calc(100% + 40px);margin-left:-40px;margin-top:-40px}.mud-grid-spacing-xs-10>.mud-grid-item{padding-left:40px;padding-top:40px}.mud-grid-spacing-xs-11{width:calc(100% + 44px);margin-left:-44px;margin-top:-44px}.mud-grid-spacing-xs-11>.mud-grid-item{padding-left:44px;padding-top:44px}.mud-grid-spacing-xs-12{width:calc(100% + 48px);margin-left:-48px;margin-top:-48px}.mud-grid-spacing-xs-12>.mud-grid-item{padding-left:48px;padding-top:48px}.mud-grid-spacing-xs-13{width:calc(100% + 52px);margin-left:-52px;margin-top:-52px}.mud-grid-spacing-xs-13>.mud-grid-item{padding-left:52px;padding-top:52px}.mud-grid-spacing-xs-14{width:calc(100% + 56px);margin-left:-56px;margin-top:-56px}.mud-grid-spacing-xs-14>.mud-grid-item{padding-left:56px;padding-top:56px}.mud-grid-spacing-xs-15{width:calc(100% + 60px);margin-left:-60px;margin-top:-60px}.mud-grid-spacing-xs-15>.mud-grid-item{padding-left:60px;padding-top:60px}.mud-grid-spacing-xs-16{width:calc(100% + 64px);margin-left:-64px;margin-top:-64px}.mud-grid-spacing-xs-16>.mud-grid-item{padding-left:64px;padding-top:64px}.mud-grid-spacing-xs-17{width:calc(100% + 68px);margin-left:-68px;margin-top:-68px}.mud-grid-spacing-xs-17>.mud-grid-item{padding-left:68px;padding-top:68px}.mud-grid-spacing-xs-18{width:calc(100% + 72px);margin-left:-72px;margin-top:-72px}.mud-grid-spacing-xs-18>.mud-grid-item{padding-left:72px;padding-top:72px}.mud-grid-spacing-xs-19{width:calc(100% + 76px);margin-left:-76px;margin-top:-76px}.mud-grid-spacing-xs-19>.mud-grid-item{padding-left:76px;padding-top:76px}.mud-grid-spacing-xs-20{width:calc(100% + 80px);margin-left:-80px;margin-top:-80px}.mud-grid-spacing-xs-20>.mud-grid-item{padding-left:80px;padding-top:80px}@media(min-width: 0px){.mud-grid-item-xs-1{flex-grow:0;max-width:calc(100%/12*1);flex-basis:calc(100%/12*1)}.mud-grid-item-xs-2{flex-grow:0;max-width:calc(100%/12*2);flex-basis:calc(100%/12*2)}.mud-grid-item-xs-3{flex-grow:0;max-width:calc(100%/12*3);flex-basis:calc(100%/12*3)}.mud-grid-item-xs-4{flex-grow:0;max-width:calc(100%/12*4);flex-basis:calc(100%/12*4)}.mud-grid-item-xs-5{flex-grow:0;max-width:calc(100%/12*5);flex-basis:calc(100%/12*5)}.mud-grid-item-xs-6{flex-grow:0;max-width:calc(100%/12*6);flex-basis:calc(100%/12*6)}.mud-grid-item-xs-7{flex-grow:0;max-width:calc(100%/12*7);flex-basis:calc(100%/12*7)}.mud-grid-item-xs-8{flex-grow:0;max-width:calc(100%/12*8);flex-basis:calc(100%/12*8)}.mud-grid-item-xs-9{flex-grow:0;max-width:calc(100%/12*9);flex-basis:calc(100%/12*9)}.mud-grid-item-xs-10{flex-grow:0;max-width:calc(100%/12*10);flex-basis:calc(100%/12*10)}.mud-grid-item-xs-11{flex-grow:0;max-width:calc(100%/12*11);flex-basis:calc(100%/12*11)}.mud-grid-item-xs-12{flex-grow:0;max-width:calc(100%/12*12);flex-basis:calc(100%/12*12)}.mud-grid-item-xs-auto{flex-grow:0;max-width:none;flex-basis:auto}.mud-grid-item-xs-true{flex-grow:1;max-width:100%;flex-basis:0}}@media(min-width: 600px){.mud-grid-item-sm-1{flex-grow:0;max-width:calc(100%/12*1);flex-basis:calc(100%/12*1)}.mud-grid-item-sm-2{flex-grow:0;max-width:calc(100%/12*2);flex-basis:calc(100%/12*2)}.mud-grid-item-sm-3{flex-grow:0;max-width:calc(100%/12*3);flex-basis:calc(100%/12*3)}.mud-grid-item-sm-4{flex-grow:0;max-width:calc(100%/12*4);flex-basis:calc(100%/12*4)}.mud-grid-item-sm-5{flex-grow:0;max-width:calc(100%/12*5);flex-basis:calc(100%/12*5)}.mud-grid-item-sm-6{flex-grow:0;max-width:calc(100%/12*6);flex-basis:calc(100%/12*6)}.mud-grid-item-sm-7{flex-grow:0;max-width:calc(100%/12*7);flex-basis:calc(100%/12*7)}.mud-grid-item-sm-8{flex-grow:0;max-width:calc(100%/12*8);flex-basis:calc(100%/12*8)}.mud-grid-item-sm-9{flex-grow:0;max-width:calc(100%/12*9);flex-basis:calc(100%/12*9)}.mud-grid-item-sm-10{flex-grow:0;max-width:calc(100%/12*10);flex-basis:calc(100%/12*10)}.mud-grid-item-sm-11{flex-grow:0;max-width:calc(100%/12*11);flex-basis:calc(100%/12*11)}.mud-grid-item-sm-12{flex-grow:0;max-width:calc(100%/12*12);flex-basis:calc(100%/12*12)}.mud-grid-item-sm-auto{flex-grow:0;max-width:none;flex-basis:auto}.mud-grid-item-sm-true{flex-grow:1;max-width:100%;flex-basis:0}}@media(min-width: 960px){.mud-grid-item-md-1{flex-grow:0;max-width:calc(100%/12*1);flex-basis:calc(100%/12*1)}.mud-grid-item-md-2{flex-grow:0;max-width:calc(100%/12*2);flex-basis:calc(100%/12*2)}.mud-grid-item-md-3{flex-grow:0;max-width:calc(100%/12*3);flex-basis:calc(100%/12*3)}.mud-grid-item-md-4{flex-grow:0;max-width:calc(100%/12*4);flex-basis:calc(100%/12*4)}.mud-grid-item-md-5{flex-grow:0;max-width:calc(100%/12*5);flex-basis:calc(100%/12*5)}.mud-grid-item-md-6{flex-grow:0;max-width:calc(100%/12*6);flex-basis:calc(100%/12*6)}.mud-grid-item-md-7{flex-grow:0;max-width:calc(100%/12*7);flex-basis:calc(100%/12*7)}.mud-grid-item-md-8{flex-grow:0;max-width:calc(100%/12*8);flex-basis:calc(100%/12*8)}.mud-grid-item-md-9{flex-grow:0;max-width:calc(100%/12*9);flex-basis:calc(100%/12*9)}.mud-grid-item-md-10{flex-grow:0;max-width:calc(100%/12*10);flex-basis:calc(100%/12*10)}.mud-grid-item-md-11{flex-grow:0;max-width:calc(100%/12*11);flex-basis:calc(100%/12*11)}.mud-grid-item-md-12{flex-grow:0;max-width:calc(100%/12*12);flex-basis:calc(100%/12*12)}.mud-grid-item-md-auto{flex-grow:0;max-width:none;flex-basis:auto}.mud-grid-item-md-true{flex-grow:1;max-width:100%;flex-basis:0}}@media(min-width: 1280px){.mud-grid-item-lg-1{flex-grow:0;max-width:calc(100%/12*1);flex-basis:calc(100%/12*1)}.mud-grid-item-lg-2{flex-grow:0;max-width:calc(100%/12*2);flex-basis:calc(100%/12*2)}.mud-grid-item-lg-3{flex-grow:0;max-width:calc(100%/12*3);flex-basis:calc(100%/12*3)}.mud-grid-item-lg-4{flex-grow:0;max-width:calc(100%/12*4);flex-basis:calc(100%/12*4)}.mud-grid-item-lg-5{flex-grow:0;max-width:calc(100%/12*5);flex-basis:calc(100%/12*5)}.mud-grid-item-lg-6{flex-grow:0;max-width:calc(100%/12*6);flex-basis:calc(100%/12*6)}.mud-grid-item-lg-7{flex-grow:0;max-width:calc(100%/12*7);flex-basis:calc(100%/12*7)}.mud-grid-item-lg-8{flex-grow:0;max-width:calc(100%/12*8);flex-basis:calc(100%/12*8)}.mud-grid-item-lg-9{flex-grow:0;max-width:calc(100%/12*9);flex-basis:calc(100%/12*9)}.mud-grid-item-lg-10{flex-grow:0;max-width:calc(100%/12*10);flex-basis:calc(100%/12*10)}.mud-grid-item-lg-11{flex-grow:0;max-width:calc(100%/12*11);flex-basis:calc(100%/12*11)}.mud-grid-item-lg-12{flex-grow:0;max-width:calc(100%/12*12);flex-basis:calc(100%/12*12)}.mud-grid-item-lg-auto{flex-grow:0;max-width:none;flex-basis:auto}.mud-grid-item-lg-true{flex-grow:1;max-width:100%;flex-basis:0}}@media(min-width: 1920px){.mud-grid-item-xl-1{flex-grow:0;max-width:calc(100%/12*1);flex-basis:calc(100%/12*1)}.mud-grid-item-xl-2{flex-grow:0;max-width:calc(100%/12*2);flex-basis:calc(100%/12*2)}.mud-grid-item-xl-3{flex-grow:0;max-width:calc(100%/12*3);flex-basis:calc(100%/12*3)}.mud-grid-item-xl-4{flex-grow:0;max-width:calc(100%/12*4);flex-basis:calc(100%/12*4)}.mud-grid-item-xl-5{flex-grow:0;max-width:calc(100%/12*5);flex-basis:calc(100%/12*5)}.mud-grid-item-xl-6{flex-grow:0;max-width:calc(100%/12*6);flex-basis:calc(100%/12*6)}.mud-grid-item-xl-7{flex-grow:0;max-width:calc(100%/12*7);flex-basis:calc(100%/12*7)}.mud-grid-item-xl-8{flex-grow:0;max-width:calc(100%/12*8);flex-basis:calc(100%/12*8)}.mud-grid-item-xl-9{flex-grow:0;max-width:calc(100%/12*9);flex-basis:calc(100%/12*9)}.mud-grid-item-xl-10{flex-grow:0;max-width:calc(100%/12*10);flex-basis:calc(100%/12*10)}.mud-grid-item-xl-11{flex-grow:0;max-width:calc(100%/12*11);flex-basis:calc(100%/12*11)}.mud-grid-item-xl-12{flex-grow:0;max-width:calc(100%/12*12);flex-basis:calc(100%/12*12)}.mud-grid-item-xl-auto{flex-grow:0;max-width:none;flex-basis:auto}.mud-grid-item-xl-true{flex-grow:1;max-width:100%;flex-basis:0}}@media(min-width: 2560px){.mud-grid-item-xxl-1{flex-grow:0;max-width:calc(100%/12*1);flex-basis:calc(100%/12*1)}.mud-grid-item-xxl-2{flex-grow:0;max-width:calc(100%/12*2);flex-basis:calc(100%/12*2)}.mud-grid-item-xxl-3{flex-grow:0;max-width:calc(100%/12*3);flex-basis:calc(100%/12*3)}.mud-grid-item-xxl-4{flex-grow:0;max-width:calc(100%/12*4);flex-basis:calc(100%/12*4)}.mud-grid-item-xxl-5{flex-grow:0;max-width:calc(100%/12*5);flex-basis:calc(100%/12*5)}.mud-grid-item-xxl-6{flex-grow:0;max-width:calc(100%/12*6);flex-basis:calc(100%/12*6)}.mud-grid-item-xxl-7{flex-grow:0;max-width:calc(100%/12*7);flex-basis:calc(100%/12*7)}.mud-grid-item-xxl-8{flex-grow:0;max-width:calc(100%/12*8);flex-basis:calc(100%/12*8)}.mud-grid-item-xxl-9{flex-grow:0;max-width:calc(100%/12*9);flex-basis:calc(100%/12*9)}.mud-grid-item-xxl-10{flex-grow:0;max-width:calc(100%/12*10);flex-basis:calc(100%/12*10)}.mud-grid-item-xxl-11{flex-grow:0;max-width:calc(100%/12*11);flex-basis:calc(100%/12*11)}.mud-grid-item-xxl-12{flex-grow:0;max-width:calc(100%/12*12);flex-basis:calc(100%/12*12)}.mud-grid-item-xxl-auto{flex-grow:0;max-width:none;flex-basis:auto}.mud-grid-item-xxl-true{flex-grow:1;max-width:100%;flex-basis:0}}.mud-paper{color:var(--mud-palette-text-primary);background-color:var(--mud-palette-surface);border-radius:var(--mud-default-borderradius);transition:box-shadow 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-paper-square{border-radius:0px}.mud-paper-outlined{border:1px solid var(--mud-palette-lines-default)}.mud-icon-default{color:var(--mud-palette-text-secondary)}.mud-disabled .mud-icon-root,.mud-disabled .mud-svg-icon,.mud-disabled .mud-icon-default{color:var(--mud-palette-text-disabled)}.mud-icon-root{width:1em;height:1em;display:inline-block;transition:fill 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;flex-shrink:0;user-select:none}.mud-icon-root:focus{outline:none}.mud-icon-root.mud-svg-icon{fill:currentColor}.mud-icon-size-small{font-size:1.25rem}.mud-icon-size-medium{font-size:1.5rem}.mud-icon-size-large{font-size:2.25rem}.mud-divider{margin:0;flex-shrink:0;border-color:var(--mud-palette-divider);border-width:1px;border-style:solid none none none}.mud-divider-absolute{left:0;width:100%;bottom:0;position:absolute}.mud-divider-inset{margin-left:72px;margin-inline-start:72px;margin-inline-end:unset}.mud-divider-light{border-color:var(--mud-palette-divider-light)}.mud-divider-middle{margin-left:16px;margin-right:16px}.mud-divider-vertical{border-style:none solid none none;height:100%}.mud-divider-flexitem{height:auto;align-self:stretch}.mud-divider-fullwidth{flex-grow:1;width:100%}.mud-drop-zone{position:relative;transition:all 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-drop-zone-drag-block>*{pointer-events:none}.mud-drop-zone-can-drop{background-color:var(--mud-palette-success-hover)}.mud-drop-zone-no-drop{background-color:var(--mud-palette-error-hover)}.mud-drop-item:not(.mud-drop-item-preview-start){cursor:grab;user-select:none}.mud-drop-item:not(.mud-drop-item-preview-start):active{cursor:grabbing}.mud-drop-item-preview-start{height:20px;width:100%;position:absolute;top:0;left:0;z-index:1;user-select:none}.mud-drop-item .mud-ripple:after{display:none;transform:none}.mud-expansion-panels{flex:0 1 auto;position:relative;max-width:100%;transition:.3s cubic-bezier(0.25, 0.8, 0.5, 1);border-radius:var(--mud-default-borderradius)}.mud-expansion-panels.mud-expansion-panels-square{border-radius:0px}.mud-expansion-panels.mud-expansion-panels-borders .mud-expand-panel{border-bottom:1px solid var(--mud-palette-lines-default)}.mud-expand-panel{flex:1 0 100%;max-width:100%;position:relative;transition:margin .3s cubic-bezier(0.25, 0.8, 0.5, 1);transition-delay:100ms;color:var(--mud-palette-text-primary);background-color:var(--mud-palette-surface)}.mud-expand-panel.mud-expand-panel-border{border-bottom:1px solid var(--mud-palette-lines-default)}.mud-expand-panel:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.mud-expand-panel:last-child{border-bottom:none;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.mud-expand-panel.mud-panel-expanded{margin:16px 0;border-radius:inherit;border-bottom:none;transition-delay:0ms}.mud-expand-panel.mud-panel-expanded:first-child{margin-top:0}.mud-expand-panel.mud-panel-expanded:last-child{margin-bottom:0}.mud-expand-panel.mud-panel-expanded+.mud-expand-panel{border-top-left-radius:inherit;border-top-right-radius:inherit}.mud-expand-panel.mud-panel-next-expanded{border-bottom:none;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.mud-expand-panel .mud-expand-panel-header{width:100%;align-items:center;display:flex;font-size:.9375rem;line-height:1;min-height:48px;outline:none;padding:16px 24px;position:relative;transition:min-height .3s cubic-bezier(0.25, 0.8, 0.5, 1);user-select:none}.mud-expand-panel .mud-expand-panel-header:hover{cursor:pointer}.mud-expand-panel .mud-expand-panel-header .mud-expand-panel-text{flex:1 1 auto}.mud-expand-panel .mud-expand-panel-header .mud-expand-panel-icon{transition:.3s cubic-bezier(0.25, 0.8, 0.5, 1),visibility 0s}.mud-expand-panel .mud-expand-panel-header .mud-expand-panel-icon.mud-transform{transform:rotate(-180deg)}.mud-expand-panel .mud-expand-panel-content{padding-bottom:16px;flex:1 1 auto;max-width:100%}.mud-expand-panel .mud-expand-panel-content.mud-expand-panel-gutters{padding-left:24px;padding-right:24px}.mud-expand-panel .mud-expand-panel-content.mud-expand-panel-dense{padding-top:0px;padding-bottom:0px}.mud-disabled>.mud-expand-panel-header{color:var(--mud-palette-text-disabled)}.mud-disabled>.mud-expand-panel-header:hover{cursor:default}.mud-fab{padding:0;font-family:var(--mud-typography-button-family);font-size:var(--mud-typography-button-size);font-weight:var(--mud-typography-button-weight);line-height:var(--mud-typography-button-lineheight);letter-spacing:var(--mud-typography-button-letterspacing);text-transform:var(--mud-typography-button-text-transform);min-width:0;box-shadow:0px 3px 5px -1px rgba(0,0,0,.2),0px 6px 10px 0px rgba(0,0,0,.14),0px 1px 18px 0px rgba(0,0,0,.12);box-sizing:border-box;min-height:36px;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;border-radius:50%;color:var(--mud-palette-text-primary);--mud-ripple-color: var(--mud-palette-text-primary);background-color:var(--mud-palette-action-default-hover)}@media(hover: hover)and (pointer: fine){.mud-fab:hover{box-shadow:0px 5px 5px -3px rgba(0,0,0,.2),0px 8px 10px 1px rgba(0,0,0,.14),0px 3px 14px 2px rgba(0,0,0,.12);text-decoration:none;background-color:var(--mud-palette-action-disabled-background)}}.mud-fab:focus-visible{box-shadow:0px 5px 5px -3px rgba(0,0,0,.2),0px 8px 10px 1px rgba(0,0,0,.14),0px 3px 14px 2px rgba(0,0,0,.12);text-decoration:none;background-color:var(--mud-palette-action-disabled-background)}.mud-fab:active{box-shadow:0px 7px 8px -4px rgba(0,0,0,.2),0px 12px 17px 2px rgba(0,0,0,.14),0px 5px 22px 4px rgba(0,0,0,.12);text-decoration:none;background-color:var(--mud-palette-action-disabled-background)}.mud-fab:disabled{color:var(--mud-palette-action-disabled);box-shadow:none;background-color:var(--mud-palette-action-disabled-background);cursor:default;pointer-events:none}@media(hover: hover)and (pointer: fine){.mud-fab:disabled:hover{background-color:var(--mud-palette-action-disabled-background)}}.mud-fab-disable-elevation{box-shadow:none}@media(hover: hover)and (pointer: fine){.mud-fab-disable-elevation:hover{box-shadow:none}}.mud-fab-disable-elevation:active{box-shadow:none}.mud-fab-disable-elevation.mud-focus-visible{box-shadow:none}.mud-fab-disable-elevation:disabled{box-shadow:none}.mud-fab-label{width:100%;display:inherit;align-items:inherit;justify-content:inherit}.mud-fab-primary{color:var(--mud-palette-primary-text);--mud-ripple-color: var(--mud-palette-primary-text) !important;--mud-ripple-opacity: var(--mud-ripple-opacity-secondary) !important;background-color:var(--mud-palette-primary)}@media(hover: hover)and (pointer: fine){.mud-fab-primary:hover{background-color:var(--mud-palette-primary-darken)}}.mud-fab-primary:focus-visible,.mud-fab-primary:active{background-color:var(--mud-palette-primary-darken)}.mud-fab-secondary{color:var(--mud-palette-secondary-text);--mud-ripple-color: var(--mud-palette-secondary-text) !important;--mud-ripple-opacity: var(--mud-ripple-opacity-secondary) !important;background-color:var(--mud-palette-secondary)}@media(hover: hover)and (pointer: fine){.mud-fab-secondary:hover{background-color:var(--mud-palette-secondary-darken)}}.mud-fab-secondary:focus-visible,.mud-fab-secondary:active{background-color:var(--mud-palette-secondary-darken)}.mud-fab-tertiary{color:var(--mud-palette-tertiary-text);--mud-ripple-color: var(--mud-palette-tertiary-text) !important;--mud-ripple-opacity: var(--mud-ripple-opacity-secondary) !important;background-color:var(--mud-palette-tertiary)}@media(hover: hover)and (pointer: fine){.mud-fab-tertiary:hover{background-color:var(--mud-palette-tertiary-darken)}}.mud-fab-tertiary:focus-visible,.mud-fab-tertiary:active{background-color:var(--mud-palette-tertiary-darken)}.mud-fab-info{color:var(--mud-palette-info-text);--mud-ripple-color: var(--mud-palette-info-text) !important;--mud-ripple-opacity: var(--mud-ripple-opacity-secondary) !important;background-color:var(--mud-palette-info)}@media(hover: hover)and (pointer: fine){.mud-fab-info:hover{background-color:var(--mud-palette-info-darken)}}.mud-fab-info:focus-visible,.mud-fab-info:active{background-color:var(--mud-palette-info-darken)}.mud-fab-success{color:var(--mud-palette-success-text);--mud-ripple-color: var(--mud-palette-success-text) !important;--mud-ripple-opacity: var(--mud-ripple-opacity-secondary) !important;background-color:var(--mud-palette-success)}@media(hover: hover)and (pointer: fine){.mud-fab-success:hover{background-color:var(--mud-palette-success-darken)}}.mud-fab-success:focus-visible,.mud-fab-success:active{background-color:var(--mud-palette-success-darken)}.mud-fab-warning{color:var(--mud-palette-warning-text);--mud-ripple-color: var(--mud-palette-warning-text) !important;--mud-ripple-opacity: var(--mud-ripple-opacity-secondary) !important;background-color:var(--mud-palette-warning)}@media(hover: hover)and (pointer: fine){.mud-fab-warning:hover{background-color:var(--mud-palette-warning-darken)}}.mud-fab-warning:focus-visible,.mud-fab-warning:active{background-color:var(--mud-palette-warning-darken)}.mud-fab-error{color:var(--mud-palette-error-text);--mud-ripple-color: var(--mud-palette-error-text) !important;--mud-ripple-opacity: var(--mud-ripple-opacity-secondary) !important;background-color:var(--mud-palette-error)}@media(hover: hover)and (pointer: fine){.mud-fab-error:hover{background-color:var(--mud-palette-error-darken)}}.mud-fab-error:focus-visible,.mud-fab-error:active{background-color:var(--mud-palette-error-darken)}.mud-fab-dark{color:var(--mud-palette-dark-text);--mud-ripple-color: var(--mud-palette-dark-text) !important;--mud-ripple-opacity: var(--mud-ripple-opacity-secondary) !important;background-color:var(--mud-palette-dark)}@media(hover: hover)and (pointer: fine){.mud-fab-dark:hover{background-color:var(--mud-palette-dark-darken)}}.mud-fab-dark:focus-visible,.mud-fab-dark:active{background-color:var(--mud-palette-dark-darken)}.mud-fab-extended.mud-fab-size-large{width:auto;height:48px;padding:0 16px;min-width:48px;min-height:auto;border-radius:24px}.mud-fab-extended.mud-fab-size-large .mud-fab-label{gap:8px}.mud-fab-extended.mud-fab-size-small{width:auto;height:34px;padding:0 12px;min-width:34px;border-radius:17px}.mud-fab-extended.mud-fab-size-small .mud-fab-label{gap:4px}.mud-fab-extended.mud-fab-size-medium{width:auto;height:40px;padding:0 16px;min-width:40px;border-radius:20px}.mud-fab-extended.mud-fab-size-medium .mud-fab-label{gap:8px}.mud-fab-color-inherit{color:inherit}.mud-fab-size-small{width:40px;height:40px}.mud-fab-size-medium{width:48px;height:48px}.mud-fab-size-large{width:56px;height:56px}.mud-form{display:flex;flex-direction:column}.mud-list{margin:0;padding:0;position:relative;list-style:none}.mud-list.mud-list-padding{padding-top:8px;padding-bottom:8px}.mud-list-item{width:100%;display:flex;position:relative;box-sizing:border-box;text-align:start;align-items:center;padding-top:8px;padding-bottom:8px;justify-content:flex-start;text-decoration:none}.mud-list-item.mud-list-item-dense{padding-top:4px;padding-bottom:4px}.mud-list-item.mud-list-item-disabled{color:var(--mud-palette-action-disabled) !important;cursor:default !important;pointer-events:none !important}.mud-list-item.mud-list-item-disabled .mud-list-item-icon{color:var(--mud-palette-action-disabled) !important}.mud-list-item.mud-list-item-disabled .mud-list-item-secondary-text{color:var(--mud-palette-action-disabled) !important}.mud-list-item-clickable{color:inherit;border:0;cursor:pointer;margin:0;outline:0;user-select:none;border-radius:0;vertical-align:middle;background-color:rgba(0,0,0,0);-webkit-appearance:none;-webkit-tap-highlight-color:rgba(0,0,0,0);transition:background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}@media(hover: hover)and (pointer: fine){.mud-list-item-clickable:hover{background-color:var(--mud-palette-action-default-hover)}}.mud-list-item-clickable:focus:not(.mud-selected-item),.mud-list-item-clickable:active{background-color:var(--mud-palette-action-default-hover)}.mud-list-item-gutters{padding-left:16px;padding-right:16px}.mud-list-item-text{flex:1 1 auto;min-width:0;margin-top:4px;margin-bottom:4px}.mud-list-item-text-inset{padding-left:56px;padding-inline-start:56px;padding-inline-end:unset}.mud-list-item-icon{color:var(--mud-palette-action-default);display:inline-flex;min-width:56px;flex-shrink:0}.mud-list-subheader{color:var(--mud-palette-action-default);font-size:.875rem;box-sizing:border-box;list-style:none;font-weight:500;padding-top:8px;padding-bottom:20px}.mud-list-subheader-gutters{padding-left:16px;padding-right:16px}.mud-list-subheader-inset{padding-left:72px;padding-inline-start:72px;padding-inline-end:unset}.mud-list-subheader-sticky{top:0;z-index:1;position:sticky;background-color:inherit}.mud-list-item-avatar{min-width:56px;flex-shrink:0}.mud-nested-list>.mud-list-item{padding-left:32px;padding-inline-start:32px;padding-inline-end:unset}.mud-list-item-secondary-text{font-weight:500;color:var(--mud-palette-text-secondary)}.mud-application-layout-rtl{direction:rtl}.mud-menu{display:inline-flex;align-self:center;position:relative}.mud-menu *{cursor:pointer}.mud-menu>div.mud-disabled{cursor:default}.mud-menu>div.mud-disabled *{cursor:default}.mud-menu>div.mud-menu-activator{display:contents;user-select:none}.mud-menu-button-hidden{position:absolute}.mud-menu-list{padding:4px 0}.mud-menu-list>.mud-menu{width:100%}.mud-menu-list>.mud-divider{margin:4px 0}.mud-menu-item{width:100%;display:flex;position:relative;box-sizing:border-box;text-align:start;align-items:center;justify-content:flex-start;text-decoration:none;padding:8px 12px}.mud-menu-item>.mud-icon-root{color:var(--mud-palette-action-default)}.mud-menu-item .mud-menu-item-icon{display:inline-flex;flex-shrink:0;margin-inline-end:12px}.mud-menu-item .mud-menu-item-text{flex:1 1 auto;margin:4px 0}.mud-menu-item.mud-menu-item-dense{padding:2px 12px}.mud-menu-item.mud-disabled{color:var(--mud-palette-action-disabled) !important;cursor:default !important;pointer-events:none !important}.mud-menu-item.mud-disabled .mud-menu-item-icon{color:var(--mud-palette-action-disabled) !important}.mud-menu-list:has(.mud-menu-item-icon) .mud-menu-item:not(:has(.mud-menu-item-icon)) .mud-menu-item-text{margin-inline-start:36px}.mud-link.mud-link-underline-none{text-decoration:none}.mud-link.mud-link-underline-hover{text-decoration:none}@media(hover: hover)and (pointer: fine){.mud-link.mud-link-underline-hover:hover{text-decoration:underline}}.mud-link.mud-link-underline-hover:focus-visible,.mud-link.mud-link-underline-hover:active{text-decoration:underline}.mud-link.mud-link-underline-always{text-decoration:underline}.mud-link.mud-link-disabled{cursor:default;color:var(--mud-palette-action-disabled) !important}.mud-link.mud-link-disabled:not(.mud-link-underline-always){text-decoration:none}.mud-navmenu{margin:0;position:relative;list-style:none;overscroll-behavior-y:contain}.mud-navmenu.mud-navmenu-dense .mud-nav-link{padding:4px 16px 4px 16px}.mud-navmenu.mud-navmenu-margin-dense .mud-nav-link{margin:2px 0}.mud-navmenu.mud-navmenu-margin-normal .mud-nav-link{margin:4px 0}.mud-navmenu.mud-navmenu-rounded .mud-nav-link{border-radius:var(--mud-default-borderradius)}.mud-navmenu.mud-navmenu-bordered .mud-nav-link.active:not(.mud-nav-link-disabled){border-inline-end-style:solid;border-inline-end-width:2px}.mud-navmenu.mud-navmenu-default .mud-nav-link.active:not(.mud-nav-link-disabled){color:var(--mud-palette-primary);background-color:var(--mud-palette-action-default-hover)}@media(hover: hover)and (pointer: fine){.mud-navmenu.mud-navmenu-default .mud-nav-link.active:not(.mud-nav-link-disabled):hover:not(.mud-nav-link-disabled){background-color:var(--mud-palette-action-default-hover)}}.mud-navmenu.mud-navmenu-default .mud-nav-link.active:not(.mud-nav-link-disabled):focus-visible:not(.mud-nav-link-disabled),.mud-navmenu.mud-navmenu-default .mud-nav-link.active:not(.mud-nav-link-disabled):active:not(.mud-nav-link-disabled){background-color:var(--mud-palette-action-default-hover)}.mud-navmenu.mud-navmenu-default .mud-nav-link-expand-icon.mud-transform{fill:var(--mud-palette-primary)}.mud-navmenu.mud-navmenu-primary .mud-nav-link.active:not(.mud-nav-link-disabled){color:var(--mud-palette-primary);--mud-ripple-color: var(--mud-palette-primary);background-color:var(--mud-palette-primary-hover)}@media(hover: hover)and (pointer: fine){.mud-navmenu.mud-navmenu-primary .mud-nav-link.active:not(.mud-nav-link-disabled):hover:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-primary-rgb), 0.12)}}.mud-navmenu.mud-navmenu-primary .mud-nav-link.active:not(.mud-nav-link-disabled):focus-visible:not(.mud-nav-link-disabled),.mud-navmenu.mud-navmenu-primary .mud-nav-link.active:not(.mud-nav-link-disabled):active:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-primary-rgb), 0.12)}.mud-navmenu.mud-navmenu-primary .mud-nav-link.active:not(.mud-nav-link-disabled) .mud-nav-link-icon{color:var(--mud-palette-primary)}.mud-navmenu.mud-navmenu-primary .mud-nav-link-expand-icon.mud-transform{fill:var(--mud-palette-primary)}.mud-navmenu.mud-navmenu-secondary .mud-nav-link.active:not(.mud-nav-link-disabled){color:var(--mud-palette-secondary);--mud-ripple-color: var(--mud-palette-secondary);background-color:var(--mud-palette-secondary-hover)}@media(hover: hover)and (pointer: fine){.mud-navmenu.mud-navmenu-secondary .mud-nav-link.active:not(.mud-nav-link-disabled):hover:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-secondary-rgb), 0.12)}}.mud-navmenu.mud-navmenu-secondary .mud-nav-link.active:not(.mud-nav-link-disabled):focus-visible:not(.mud-nav-link-disabled),.mud-navmenu.mud-navmenu-secondary .mud-nav-link.active:not(.mud-nav-link-disabled):active:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-secondary-rgb), 0.12)}.mud-navmenu.mud-navmenu-secondary .mud-nav-link.active:not(.mud-nav-link-disabled) .mud-nav-link-icon{color:var(--mud-palette-secondary)}.mud-navmenu.mud-navmenu-secondary .mud-nav-link-expand-icon.mud-transform{fill:var(--mud-palette-secondary)}.mud-navmenu.mud-navmenu-tertiary .mud-nav-link.active:not(.mud-nav-link-disabled){color:var(--mud-palette-tertiary);--mud-ripple-color: var(--mud-palette-tertiary);background-color:var(--mud-palette-tertiary-hover)}@media(hover: hover)and (pointer: fine){.mud-navmenu.mud-navmenu-tertiary .mud-nav-link.active:not(.mud-nav-link-disabled):hover:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-tertiary-rgb), 0.12)}}.mud-navmenu.mud-navmenu-tertiary .mud-nav-link.active:not(.mud-nav-link-disabled):focus-visible:not(.mud-nav-link-disabled),.mud-navmenu.mud-navmenu-tertiary .mud-nav-link.active:not(.mud-nav-link-disabled):active:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-tertiary-rgb), 0.12)}.mud-navmenu.mud-navmenu-tertiary .mud-nav-link.active:not(.mud-nav-link-disabled) .mud-nav-link-icon{color:var(--mud-palette-tertiary)}.mud-navmenu.mud-navmenu-tertiary .mud-nav-link-expand-icon.mud-transform{fill:var(--mud-palette-tertiary)}.mud-navmenu.mud-navmenu-info .mud-nav-link.active:not(.mud-nav-link-disabled){color:var(--mud-palette-info);--mud-ripple-color: var(--mud-palette-info);background-color:var(--mud-palette-info-hover)}@media(hover: hover)and (pointer: fine){.mud-navmenu.mud-navmenu-info .mud-nav-link.active:not(.mud-nav-link-disabled):hover:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-info-rgb), 0.12)}}.mud-navmenu.mud-navmenu-info .mud-nav-link.active:not(.mud-nav-link-disabled):focus-visible:not(.mud-nav-link-disabled),.mud-navmenu.mud-navmenu-info .mud-nav-link.active:not(.mud-nav-link-disabled):active:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-info-rgb), 0.12)}.mud-navmenu.mud-navmenu-info .mud-nav-link.active:not(.mud-nav-link-disabled) .mud-nav-link-icon{color:var(--mud-palette-info)}.mud-navmenu.mud-navmenu-info .mud-nav-link-expand-icon.mud-transform{fill:var(--mud-palette-info)}.mud-navmenu.mud-navmenu-success .mud-nav-link.active:not(.mud-nav-link-disabled){color:var(--mud-palette-success);--mud-ripple-color: var(--mud-palette-success);background-color:var(--mud-palette-success-hover)}@media(hover: hover)and (pointer: fine){.mud-navmenu.mud-navmenu-success .mud-nav-link.active:not(.mud-nav-link-disabled):hover:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-success-rgb), 0.12)}}.mud-navmenu.mud-navmenu-success .mud-nav-link.active:not(.mud-nav-link-disabled):focus-visible:not(.mud-nav-link-disabled),.mud-navmenu.mud-navmenu-success .mud-nav-link.active:not(.mud-nav-link-disabled):active:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-success-rgb), 0.12)}.mud-navmenu.mud-navmenu-success .mud-nav-link.active:not(.mud-nav-link-disabled) .mud-nav-link-icon{color:var(--mud-palette-success)}.mud-navmenu.mud-navmenu-success .mud-nav-link-expand-icon.mud-transform{fill:var(--mud-palette-success)}.mud-navmenu.mud-navmenu-warning .mud-nav-link.active:not(.mud-nav-link-disabled){color:var(--mud-palette-warning);--mud-ripple-color: var(--mud-palette-warning);background-color:var(--mud-palette-warning-hover)}@media(hover: hover)and (pointer: fine){.mud-navmenu.mud-navmenu-warning .mud-nav-link.active:not(.mud-nav-link-disabled):hover:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-warning-rgb), 0.12)}}.mud-navmenu.mud-navmenu-warning .mud-nav-link.active:not(.mud-nav-link-disabled):focus-visible:not(.mud-nav-link-disabled),.mud-navmenu.mud-navmenu-warning .mud-nav-link.active:not(.mud-nav-link-disabled):active:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-warning-rgb), 0.12)}.mud-navmenu.mud-navmenu-warning .mud-nav-link.active:not(.mud-nav-link-disabled) .mud-nav-link-icon{color:var(--mud-palette-warning)}.mud-navmenu.mud-navmenu-warning .mud-nav-link-expand-icon.mud-transform{fill:var(--mud-palette-warning)}.mud-navmenu.mud-navmenu-error .mud-nav-link.active:not(.mud-nav-link-disabled){color:var(--mud-palette-error);--mud-ripple-color: var(--mud-palette-error);background-color:var(--mud-palette-error-hover)}@media(hover: hover)and (pointer: fine){.mud-navmenu.mud-navmenu-error .mud-nav-link.active:not(.mud-nav-link-disabled):hover:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-error-rgb), 0.12)}}.mud-navmenu.mud-navmenu-error .mud-nav-link.active:not(.mud-nav-link-disabled):focus-visible:not(.mud-nav-link-disabled),.mud-navmenu.mud-navmenu-error .mud-nav-link.active:not(.mud-nav-link-disabled):active:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-error-rgb), 0.12)}.mud-navmenu.mud-navmenu-error .mud-nav-link.active:not(.mud-nav-link-disabled) .mud-nav-link-icon{color:var(--mud-palette-error)}.mud-navmenu.mud-navmenu-error .mud-nav-link-expand-icon.mud-transform{fill:var(--mud-palette-error)}.mud-navmenu.mud-navmenu-dark .mud-nav-link.active:not(.mud-nav-link-disabled){color:var(--mud-palette-dark);--mud-ripple-color: var(--mud-palette-dark);background-color:var(--mud-palette-dark-hover)}@media(hover: hover)and (pointer: fine){.mud-navmenu.mud-navmenu-dark .mud-nav-link.active:not(.mud-nav-link-disabled):hover:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-dark-rgb), 0.12)}}.mud-navmenu.mud-navmenu-dark .mud-nav-link.active:not(.mud-nav-link-disabled):focus-visible:not(.mud-nav-link-disabled),.mud-navmenu.mud-navmenu-dark .mud-nav-link.active:not(.mud-nav-link-disabled):active:not(.mud-nav-link-disabled){background-color:rgba(var(--mud-palette-dark-rgb), 0.12)}.mud-navmenu.mud-navmenu-dark .mud-nav-link.active:not(.mud-nav-link-disabled) .mud-nav-link-icon{color:var(--mud-palette-dark)}.mud-navmenu.mud-navmenu-dark .mud-nav-link-expand-icon.mud-transform{fill:var(--mud-palette-dark)}.mud-nav-group{width:100%;display:block;justify-content:flex-start}.mud-nav-group>.mud-nav-link>.mud-nav-link-text{font-weight:500}.mud-nav-group * .mud-nav-group>.mud-nav-link>.mud-nav-link-text{font-weight:400}.mud-nav-group * .mud-nav-group>.mud-nav-link.mud-expanded>.mud-nav-link-text{font-weight:500}.mud-nav-group * .mud-navmenu .mud-nav-item .mud-nav-link{padding-left:36px;padding-inline-start:36px;padding-inline-end:unset}.mud-nav-group-disabled,.mud-nav-group-disabled .mud-nav-link-text,.mud-nav-group-disabled .mud-nav-link-expand-icon,.mud-nav-group-disabled .mud-nav-link-icon{color:var(--mud-palette-text-disabled) !important;cursor:default;pointer-events:none}.mud-nav-item{width:100%;display:flex;justify-content:flex-start;text-decoration:none}.mud-nav-link{width:100%;font-weight:400;padding:8px 16px 8px 16px;color:inherit;line-height:1.75;display:inline-flex;justify-content:flex-start;text-transform:inherit;background-color:rgba(0,0,0,0);transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,padding 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;align-items:flex-start}.mud-nav-link.mud-nav-link-disabled{color:var(--mud-palette-text-disabled) !important;cursor:default;pointer-events:none}@media(hover: hover)and (pointer: fine){.mud-nav-link:hover:not(.mud-nav-link-disabled){cursor:pointer;text-decoration:none;background-color:var(--mud-palette-action-default-hover)}}.mud-nav-link:focus:not(.mud-nav-link-disabled){background-color:var(--mud-palette-action-default-hover)}.mud-nav-link.active:not(.mud-nav-link-disabled){font-weight:500 !important}.mud-nav-link:not(.mud-nav-link-disabled) .mud-nav-link-icon.mud-nav-link-icon-default{color:var(--mud-palette-drawer-icon)}.mud-nav-link.mud-nav-link-disabled .mud-nav-link-icon{color:var(--mud-palette-text-disabled)}.mud-nav-link .mud-nav-link-expand-icon{color:var(--mud-palette-drawer-icon);transition:.3s cubic-bezier(0.25, 0.8, 0.5, 1),visibility 0s}.mud-nav-link .mud-nav-link-expand-icon.mud-transform{transform:rotate(-180deg)}.mud-nav-link .mud-nav-link-expand-icon.mud-transform-disabled{transform:rotate(-180deg)}.mud-nav-link .mud-nav-link-text{width:100%;text-align:start;margin-left:12px;margin-inline-start:12px;margin-inline-end:unset;letter-spacing:0}.mud-nav-group * .mud-navmenu>.mud-nav-group .mud-nav-link{padding-left:36px;padding-inline-start:36px;padding-inline-end:16px}.mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu .mud-nav-item .mud-nav-link{padding-left:48px;padding-inline-start:48px}.mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu>.mud-nav-group .mud-nav-link{padding-left:48px;padding-inline-start:48px;padding-inline-end:16px}.mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu .mud-nav-item .mud-nav-link{padding-left:60px;padding-inline-start:60px;padding-inline-end:0}.mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu>.mud-nav-group .mud-nav-link{padding-left:60px;padding-inline-start:60px;padding-inline-end:16px}.mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu .mud-nav-item .mud-nav-link{padding-left:72px;padding-inline-start:72px;padding-inline-end:0}.mud-drawer-mini .mud-nav-link{line-height:1;display:flex;align-items:center}.mud-drawer--closed.mud-drawer-mini>.mud-drawer-content>.mud-navmenu .mud-nav-link .mud-icon-root:first-child+.mud-nav-link-text{display:none}.mud-drawer--closed.mud-drawer-mini .mud-nav-group * .mud-navmenu .mud-nav-item .mud-nav-link{padding:8px 16px 8px 16px}.mud-drawer--closed.mud-drawer-mini .mud-nav-group * .mud-navmenu>.mud-nav-group .mud-nav-link{padding:8px 16px 8px 16px}.mud-drawer--closed.mud-drawer-mini .mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu .mud-nav-item .mud-nav-link{padding:8px 16px 8px 16px}.mud-drawer--closed.mud-drawer-mini .mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu>.mud-nav-group .mud-nav-link{padding:8px 16px 8px 16px}.mud-drawer--closed.mud-drawer-mini .mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu .mud-nav-item .mud-nav-link{padding:8px 16px 8px 16px}.mud-drawer--closed.mud-drawer-mini .mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu>.mud-nav-group .mud-nav-link{padding:8px 16px 8px 16px}.mud-drawer--closed.mud-drawer-mini .mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu>.mud-nav-group * .mud-navmenu .mud-nav-item .mud-nav-link{padding:8px 16px 8px 16px}.page-content-navigation .page-content-navigation-navlink.active .mud-nav-link{color:var(--mud-palette-primary);border-color:var(--mud-palette-primary);background-color:rgba(0,0,0,0)}.page-content-navigation .page-content-navigation-navlink .mud-nav-link{padding:4px 16px 4px 16px;color:var(--mud-palette-text-secondary);border-left:2px solid var(--mud-palette-action-disabled-background)}.page-content-navigation .page-content-navigation-navlink .mud-nav-link.active{color:var(--mud-palette-primary);border-color:var(--mud-palette-primary);background-color:rgba(0,0,0,0)}.page-content-navigation .page-content-navigation-navlink .mud-nav-link .mud-nav-link-text{margin-left:0px;margin-inline-start:0px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mud-pagination{display:inline-flex;flex-wrap:wrap;gap:6px;align-items:center;margin:0;list-style:none}.mud-pagination .mud-pagination-item>*{height:32px;min-width:32px;margin:0 3px;padding:0 6px;text-align:center;border-radius:16px}.mud-pagination .mud-pagination-item :not(mud-pagination-item-selected)>*{box-shadow:none}.mud-pagination .mud-pagination-item .mud-button{line-height:normal}.mud-pagination .mud-pagination-item .mud-icon-button{padding:0}.mud-pagination .mud-pagination-item-rectangular .mud-button{border-radius:var(--mud-default-borderradius)}.mud-pagination .mud-pagination-item .mud-typography[disabled]{color:var(--mud-palette-action-disabled) !important}.mud-pagination-outlined .mud-pagination-item-selected .mud-button-outlined-default{background-color:var(--mud-palette-action-default-hover)}.mud-pagination-outlined .mud-pagination-item-selected .mud-button-outlined-primary{background-color:var(--mud-palette-primary-hover)}.mud-pagination-outlined .mud-pagination-item-selected .mud-button-outlined-secondary{background-color:var(--mud-palette-secondary-hover)}.mud-pagination-outlined .mud-pagination-item-selected .mud-button-outlined-tertiary{background-color:var(--mud-palette-tertiary-hover)}.mud-pagination-outlined .mud-pagination-item-selected .mud-button-outlined-info{background-color:var(--mud-palette-info-hover)}.mud-pagination-outlined .mud-pagination-item-selected .mud-button-outlined-success{background-color:var(--mud-palette-success-hover)}.mud-pagination-outlined .mud-pagination-item-selected .mud-button-outlined-warning{background-color:var(--mud-palette-warning-hover)}.mud-pagination-outlined .mud-pagination-item-selected .mud-button-outlined-error{background-color:var(--mud-palette-error-hover)}.mud-pagination-outlined .mud-pagination-item-selected .mud-button-outlined-dark{background-color:var(--mud-palette-dark-hover)}.mud-pagination-filled .mud-pagination-item:not(.mud-pagination-item-selected) .mud-button{background-color:var(--mud-palette-surface)}.mud-pagination-filled .mud-pagination-item .mud-button{box-shadow:var(--mud-elevation-1)}.mud-pagination-small .mud-pagination-item>*{height:26px;min-width:26px;margin:0 1px;padding:0 4px;border-radius:13px}.mud-pagination-large .mud-pagination-item>*{height:40px;min-width:40px;padding:0 10px;border-radius:20px}.mud-pagination-disable-elevation .mud-pagination-item .mud-button{box-shadow:none}.mud-pagination-rtl .mud-pagination-item .mud-icon-root{transform:scaleX(-1)}.mud-picker.mud-rounded{border-radius:var(--mud-default-borderradius)}.mud-picker .mud-picker-actions{flex:0 0 auto;display:flex;padding:8px;align-items:center;justify-content:flex-end}.mud-picker .mud-picker-actions>:not(:first-child){margin-left:8px;margin-inline-start:8px;margin-inline-end:unset}.mud-picker-inline{display:flex;flex:1 1 auto;position:relative;max-width:100%}.mud-picker-inline.mud-picker-input-button .mud-input,.mud-picker-inline.mud-picker-input-button .mud-input .mud-input-root{cursor:pointer}.mud-picker-inline.mud-picker-input-button.mud-disabled .mud-input,.mud-picker-inline.mud-picker-input-button.mud-disabled .mud-input .mud-input-root{cursor:default}.mud-picker-inline.mud-picker-input-text{cursor:text}.mud-picker-inline.mud-picker-input-text:hover{cursor:text}.mud-picker-inline.mud-picker-input-text.mud-disabled{cursor:default}.mud-picker-inline.mud-picker-input-text.mud-disabled:hover{cursor:default}.mud-picker-static{display:flex;overflow:hidden;min-width:310px;flex-direction:column}.mud-picker-container{display:flex;flex-direction:column;border-radius:inherit}.mud-picker-container.mud-picker-container-landscape{flex-direction:row}.mud-picker-container .mud-toolbar{border-top-left-radius:inherit;border-top-right-radius:inherit}.mud-picker-popover-paper{outline:0;z-index:calc(var(--mud-zindex-popover) + 1);position:absolute;min-width:16px;min-height:16px;overflow-x:hidden;overflow-y:auto}.mud-picker-view{display:none}.mud-picker-view.mud-picker-open{display:block}.mud-picker-content{display:flex;max-width:100%;min-width:310px;min-height:305px;overflow:hidden;flex-direction:column;justify-content:center}.mud-picker-content.mud-picker-content-landscape{padding:0 8px}.mud-picker-toolbar{height:100px;display:flex;align-items:center;flex-direction:row;justify-content:center}.mud-picker-toolbar.mud-picker-toolbar-landscape{height:auto;padding:8px;max-width:150px;justify-content:flex-start}.mud-picker-toolbar.mud-button-root{padding:0;min-width:16px;text-transform:none}.mud-picker-inline-paper .mud-paper{position:relative !important}.mud-picker-hidden{visibility:hidden}.mud-picker-pos-top{top:0px;position:fixed;visibility:visible}.mud-picker-pos-top.mud-picker-pos-left{left:10px}.mud-picker-pos-top.mud-picker-pos-right{right:10px}.mud-picker-pos-above{bottom:0px;visibility:visible}.mud-picker-pos-above.mud-picker-pos-left{left:50%;transform:translateX(-50%)}.mud-picker-pos-above.mud-picker-pos-right{right:0px}.mud-picker-pos-bottom{bottom:10px;position:fixed;visibility:visible}.mud-picker-pos-bottom.mud-picker-pos-left{left:10px}.mud-picker-pos-bottom.mud-picker-pos-right{right:10px}.mud-picker-pos-below{visibility:visible}.mud-picker-pos-below.mud-picker-pos-left{left:50%;transform:translateX(-50%)}.mud-picker-pos-below.mud-picker-pos-right{right:0px}.mud-picker-datepicker-toolbar{align-items:flex-start;flex-direction:column}.mud-picker-datepicker-toolbar .mud-button-year{font-size:1rem;font-weight:400;line-height:1.75;letter-spacing:.00938em}.mud-picker-datepicker-toolbar .mud-button-date{font-size:2.125rem;font-weight:400;line-height:1.17;letter-spacing:.00735em;text-transform:none}.mud-picker-datepicker-toolbar-landscape{padding:16px}.mud-picker-datepicker-date-landscape{margin-right:16px;margin-inline-end:16px;margin-inline-start:unset}.mud-picker-calendar-header-switch{display:flex;margin-top:4px;align-items:center;margin-bottom:8px;justify-content:space-between}.mud-picker-calendar-header-switch>.mud-icon-button{z-index:1;padding:8px;margin:6px;background-color:var(--mud-palette-surface)}@media(hover: hover)and (pointer: fine){.mud-picker-calendar-header-switch>.mud-icon-button:hover{background-color:var(--mud-palette-action-default-hover)}}.mud-picker-calendar-header-switch .mud-picker-calendar-header-transition{width:100%;height:23px;overflow:hidden}@media(hover: hover)and (pointer: fine){.mud-picker-calendar-header-switch .mud-picker-calendar-header-transition:hover .mud-typography{cursor:pointer;font-weight:500}}.mud-picker-calendar-header-day{display:flex;max-height:16px;align-items:center;justify-content:center}.mud-picker-calendar-header-day .mud-day-label{color:var(--mud-palette-text-secondary);width:36px;margin:0 2px;text-align:center}.mud-picker-year-container{height:300px;overflow-y:auto}.mud-picker-year-container .mud-picker-year{cursor:pointer;height:40px;display:flex;outline:none;align-items:center;justify-content:center;user-select:none;animation:mud-animation-fadein 500ms;transition:background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}@media(hover: hover)and (pointer: fine){.mud-picker-year-container .mud-picker-year:hover{background-color:var(--mud-palette-action-default-hover)}}.mud-picker-year-container .mud-picker-year .mud-picker-year-selected{margin:10px 0;font-weight:500}.mud-picker-month-container{width:310px;display:flex;flex-wrap:wrap;align-content:stretch}.mud-picker-month-container .mud-picker-month{flex:1 0 33.33%;cursor:pointer;height:60px;display:flex;outline:none;align-items:center;justify-content:center;transition:background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}@media(hover: hover)and (pointer: fine){.mud-picker-month-container .mud-picker-month:hover{background-color:var(--mud-palette-action-default-hover)}}.mud-picker-month-container .mud-picker-month .mud-picker-month-selected{font-weight:500}.mud-picker-month-container .mud-picker-month.mud-disabled{color:var(--mud-palette-text-disabled);pointer-events:none}.mud-picker-slide-transition{display:block;position:relative}.mud-picker-slide-transition>*{top:0;left:0;right:0;position:absolute}.mud-picker-calendar-transition{margin-top:12px;min-height:216px}.mud-picker-calendar-progress-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.mud-picker-calendar-content{display:grid;--selected-day: 0;grid-column-gap:10px;grid-template-columns:auto}@media(min-width: 600px){.mud-picker-calendar-content:not(.mud-picker-calendar-content-1){grid-template-columns:repeat(2, minmax(auto, 1fr))}.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-1 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-3 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-5 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-7 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-9 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-11 .mud-picker-nav-button-next{visibility:hidden}.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-1 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-3 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-5 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-7 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-9 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-11 .mud-picker-nav-button-prev{visibility:visible}.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-2 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-4 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-6 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-8 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-10 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-12 .mud-picker-nav-button-next{visibility:visible}.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-2 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-4 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-6 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-8 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-10 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1) .mud-picker-calendar-header-12 .mud-picker-nav-button-prev{visibility:hidden}}@media(min-width: 960px){.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2){grid-template-columns:repeat(3, minmax(auto, 1fr))}.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-1 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-4 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-7 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-10 .mud-picker-nav-button-next{visibility:hidden}.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-1 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-4 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-7 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-10 .mud-picker-nav-button-prev{visibility:visible}.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-2 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-2 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-5 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-5 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-8 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-8 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-11 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-11 .mud-picker-nav-button-prev{visibility:hidden}.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-3 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-6 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-9 .mud-picker-nav-button-next,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-12 .mud-picker-nav-button-next{visibility:visible}.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-3 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-6 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-9 .mud-picker-nav-button-prev,.mud-picker-calendar-content:not(.mud-picker-calendar-content-1):not(.mud-picker-calendar-content-2) .mud-picker-calendar-header-12 .mud-picker-nav-button-prev{visibility:hidden}}:not(.mud-picker-hidden) .mud-picker-calendar-header-last .mud-picker-nav-button-next{visibility:inherit !important}.mud-picker-hidden .mud-picker-nav-button-next,.mud-picker-hidden .mud-picker-nav-button-prev{visibility:hidden !important}.mud-picker-calendar-container{display:flex;width:310px;flex-direction:column}.mud-picker-calendar{display:flex;flex-wrap:wrap;justify-content:center}.mud-picker-calendar .mud-day{color:var(--mud-palette-text-primary);width:36px;height:36px;margin:0 2px;padding:0;font-size:.75rem;font-weight:500}@media(hover: hover)and (pointer: fine){.mud-picker-calendar .mud-day:hover{background-color:var(--mud-palette-action-default-hover)}}.mud-picker-calendar .mud-day.mud-hidden{opacity:0;pointer-events:none}.mud-picker-calendar .mud-day.mud-current{font-weight:600}.mud-picker-calendar .mud-day.mud-selected{font-weight:500}.mud-picker-calendar .mud-day .mud-typography{margin-top:2px}.mud-picker-calendar .mud-day.mud-disabled{color:var(--mud-palette-text-disabled);pointer-events:none}.mud-picker-calendar .mud-day.mud-range{margin:0;width:40px;transition:none}.mud-picker-calendar .mud-day.mud-range.mud-range-start-selected{border-radius:50% 0% 0% 50%}.mud-picker-calendar .mud-day.mud-range.mud-range-end-selected{border-radius:0% 50% 50% 0%}.mud-picker-calendar .mud-day.mud-range.mud-range-between{border-radius:0;background-color:var(--mud-palette-action-default-hover)}@media(hover: hover)and (pointer: fine){.mud-picker-calendar .mud-day.mud-range.mud-range-selection:hover.mud-range-start-selected{border-radius:50%}.mud-picker-calendar .mud-day.mud-range.mud-range-selection:hover:not(.mud-range-start-selected){border-radius:0% 50% 50% 0%}}.mud-picker-calendar .mud-day.mud-range.mud-range-selection:not(:hover):not(.mud-range-start-selected){border-radius:0;background:linear-gradient(var(--mud-palette-action-default-hover) 100%, var(--mud-palette-action-default-hover) 100%, transparent 0%);background-size:100% calc(100%*(var(--selected-day) - var(--day-id)))}@media(hover: hover)and (pointer: fine){.mud-range-selection-primary:hover{color:var(--mud-palette-primary-text) !important;background-color:var(--mud-palette-primary) !important}}@media(hover: hover)and (pointer: fine){.mud-range-selection-secondary:hover{color:var(--mud-palette-secondary-text) !important;background-color:var(--mud-palette-secondary) !important}}@media(hover: hover)and (pointer: fine){.mud-range-selection-tertiary:hover{color:var(--mud-palette-tertiary-text) !important;background-color:var(--mud-palette-tertiary) !important}}@media(hover: hover)and (pointer: fine){.mud-range-selection-info:hover{color:var(--mud-palette-info-text) !important;background-color:var(--mud-palette-info) !important}}@media(hover: hover)and (pointer: fine){.mud-range-selection-success:hover{color:var(--mud-palette-success-text) !important;background-color:var(--mud-palette-success) !important}}@media(hover: hover)and (pointer: fine){.mud-range-selection-warning:hover{color:var(--mud-palette-warning-text) !important;background-color:var(--mud-palette-warning) !important}}@media(hover: hover)and (pointer: fine){.mud-range-selection-error:hover{color:var(--mud-palette-error-text) !important;background-color:var(--mud-palette-error) !important}}@media(hover: hover)and (pointer: fine){.mud-range-selection-dark:hover{color:var(--mud-palette-dark-text) !important;background-color:var(--mud-palette-dark) !important}}.mud-picker-calendar-week{display:flex;margin:0 5px;justify-content:center;align-items:center}.mud-picker-calendar-week .mud-picker-calendar-week-text{width:15px;margin-top:2px !important;color:var(--mud-palette-text-disabled)}.mud-application-layout-rtl .mud-picker-calendar .mud-day.mud-range.mud-range-start-selected{border-radius:0% 50% 50% 0%}.mud-application-layout-rtl .mud-picker-calendar .mud-day.mud-range.mud-range-end-selected{border-radius:50% 0% 0% 50%}@media(hover: hover)and (pointer: fine){.mud-application-layout-rtl .mud-picker-calendar .mud-day.mud-range.mud-range-selection:hover:not(.mud-range-start-selected){border-radius:50% 0% 0% 50%}}.mud-picker-timepicker-toolbar .mud-timepicker-button{padding:0;min-width:16px;text-transform:none}.mud-picker-timepicker-toolbar .mud-timepicker-button.mud-timepicker-toolbar-text{color:hsla(0,0%,100%,.54)}@media(hover: hover)and (pointer: fine){.mud-picker-timepicker-toolbar .mud-timepicker-button:hover{background-color:var(--mud-theme-default-hover)}}.mud-picker-timepicker-toolbar .mud-timepicker-hourminute{display:flex;align-items:baseline;justify-content:flex-end}.mud-picker-timepicker-toolbar .mud-timepicker-hourminute .mud-timepicker-button{font-size:3.75rem;font-weight:300;line-height:1;letter-spacing:-0.00833em}.mud-picker-timepicker-toolbar .mud-timepicker-ampm{display:flex;margin-left:20px;margin-right:-20px;margin-inline-start:20px;margin-inline-end:-20px;flex-direction:column}.mud-picker-timepicker-toolbar .mud-timepicker-ampm .mud-timepicker-button{font-size:18px;font-weight:400;line-height:1.75;letter-spacing:.00938em}.mud-picker-timepicker-toolbar .mud-timepicker-separator{cursor:default;margin:0 4px 0 2px;margin-inline-start:2px;margin-inline-end:4px}.mud-picker-timepicker-toolbar.mud-picker-timepicker-toolbar-landscape{flex-wrap:wrap;width:150px;justify-content:center}.mud-picker-timepicker-toolbar.mud-picker-timepicker-toolbar-landscape .mud-timepicker-hourminute .mud-timepicker-button{font-size:3rem;font-weight:400;line-height:1.04;letter-spacing:0em}.mud-picker-timepicker-toolbar.mud-picker-timepicker-toolbar-landscape .mud-timepicker-ampm{display:flex;margin-left:20px;margin-right:-20px;margin-inline-start:20px;margin-inline-end:-20px;flex-direction:column}.mud-picker-timepicker-toolbar.mud-picker-timepicker-toolbar-landscape .mud-timepicker-ampm .mud-timepicker-button{font-size:18px;font-weight:400;line-height:1.75;letter-spacing:.00938em}.mud-picker-timepicker-toolbar.mud-picker-timepicker-toolbar-landscape .mud-timepicker-separator{font-size:3rem;font-weight:400;line-height:1.04;letter-spacing:0em}.mud-picker-time-container{margin:16px 0 8px;display:flex;align-items:flex-end;justify-content:center}.mud-picker-time-container .mud-picker-time-clock{width:260px;height:260px;position:relative;border-radius:50%;pointer-events:none;touch-action:pinch-zoom;background-color:rgba(0,0,0,.07)}.mud-picker-time-container .mud-picker-time-clock .mud-picker-time-clock-mask{width:100%;height:100%;outline:none;position:absolute;user-select:none;pointer-events:auto}.mud-picker-time-container .mud-picker-time-clock .mud-picker-time-clock-pin{top:50%;left:50%;width:6px;height:6px;position:absolute;transform:translate(-50%, -50%);border-radius:50%}.mud-picker-time-container .mud-picker-time-clock .mud-picker-stick-inner{left:calc(50% - 1px);width:3px;height:35%;bottom:0;position:absolute;transform-origin:center bottom 0px}.mud-picker-time-container .mud-picker-time-clock .mud-picker-stick-inner.mud-hour:after{content:"";position:absolute;left:50%;transform:translate(-50%, -50%);height:48px;width:48px;top:-60%;border-radius:50%;background-color:inherit}.mud-picker-time-container .mud-picker-time-clock .mud-picker-stick-outer{left:calc(50% - 1px);width:0;height:35%;bottom:35%;position:absolute;transform-origin:center bottom 0px}.mud-picker-time-container .mud-picker-time-clock .mud-picker-stick-outer.mud-hour:after{content:"";position:absolute;left:50%;transform:translate(-50%, -50%);height:48px;width:62px;top:-20px;border-radius:50%;background-color:inherit}.mud-picker-time-container .mud-picker-time-clock .mud-picker-stick{left:calc(50% - 1px);width:3px;height:50%;bottom:50%;position:absolute;transform-origin:center bottom 0px}.mud-picker-time-container .mud-picker-time-clock .mud-picker-stick.mud-hour:after{content:"";position:absolute;left:50%;transform:translate(-50%, -50%);height:62px;width:62px;top:20px;border-radius:50%;background-color:inherit}.mud-picker-time-container .mud-picker-time-clock .mud-picker-stick.mud-minute:after{content:"";position:absolute;left:50%;transform:translate(-50%, -50%);height:44px;width:15px;top:20px;border-radius:50%;background-color:inherit}.mud-picker-time-container .mud-picker-time-clock .mud-picker-time-clock-pointer{left:calc(50% - 1px);width:2px;bottom:50%;position:absolute;transform-origin:center bottom 0px}.mud-picker-time-container .mud-picker-time-clock .mud-picker-time-clock-pointer.mud-picker-time-clock-pointer-animation{transition:transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,height 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-picker-time-container .mud-picker-time-clock .mud-picker-time-clock-pointer .mud-picker-time-clock-pointer-thumb{position:absolute;border-radius:100%}.mud-picker-time-container .mud-picker-time-clock .mud-picker-time-clock-pointer .mud-picker-time-clock-pointer-thumb.mud-onclock-text{top:-19px;left:-13px;width:28px;height:28px;border:none;background-color:inherit}.mud-picker-time-container .mud-picker-time-clock .mud-picker-time-clock-pointer .mud-picker-time-clock-pointer-thumb.mud-onclock-minute{background:rgba(0,0,0,0);border:2px solid;width:10px;height:10px;top:-9px;left:-4px}.mud-picker-time-container .mud-picker-time-clock .mud-clock-number{left:calc((100% - 32px)/2);color:var(--mud-palette-text-primary);background-color:rgba(0,0,0,0) !important;width:32px;height:32px;display:inline-flex;position:absolute;align-items:center;user-select:none;border-radius:50%;justify-content:center;transition-duration:120ms;transition-property:color}.mud-time-picker-dial{width:100%;height:100%;position:absolute;transition:transform 350ms,opacity 350ms}.mud-time-picker-dial-out{opacity:0}.mud-time-picker-hour.mud-time-picker-dial-out{transform:scale(1.2, 1.2);transform-origin:center}.mud-time-picker-minute.mud-time-picker-dial-out{transform:scale(0.8, 0.8);transform-origin:center}.mud-time-picker-dial-hidden{visibility:hidden}.mud-picker-container+.mud-picker-color-toolbar{border-top-left-radius:inherit;border-top-right-radius:inherit}.mud-picker-container+.mud-picker-color-content{border-top-left-radius:inherit;border-top-right-radius:inherit}.mud-picker-color-toolbar{height:32px;padding-right:2px;padding-left:2px}.mud-picker-color-content{min-height:unset;position:relative}.mud-picker-color-picker{width:312px;height:250px;position:relative;overflow:hidden;touch-action:pinch-zoom}.mud-picker-color-picker .mud-picker-color-overlay{width:100%;height:100%;user-select:none}.mud-picker-color-picker .mud-picker-color-overlay.mud-picker-color-overlay-white{background:linear-gradient(to right, white 0%, rgba(255, 255, 255, 0) 100%)}.mud-picker-color-picker .mud-picker-color-overlay.mud-picker-color-overlay-black{background:linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, black 100%)}.mud-picker-color-picker .mud-picker-color-selector{position:absolute;top:-13px;left:-13px;pointer-events:none}.mud-picker-color-picker .mud-picker-color-grid{display:flex;flex-wrap:wrap}.mud-picker-color-picker .mud-picker-color-grid .mud-picker-color-dot{height:25px;min-width:26px;max-width:26px;border-radius:0px;box-shadow:none}.mud-picker-color-controls{width:312px;padding:16px;display:flex;flex-direction:column}.mud-picker-color-controls .mud-picker-color-controls-row{display:flex;align-items:center}.mud-picker-color-controls .mud-picker-color-controls-row+.mud-picker-color-controls-row{margin-top:24px}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-sliders{display:flex;flex:1 0 auto;flex-direction:column}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-sliders .mud-picker-color-slider{min-width:224px;border-radius:var(--mud-default-borderradius)}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-sliders .mud-picker-color-slider .mud-slider-input{height:10px;border-radius:var(--mud-default-borderradius)}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-sliders .mud-picker-color-slider .mud-slider-input::-webkit-slider-runnable-track{background:initial}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-sliders .mud-picker-color-slider .mud-slider-input::-moz-range-track{background:initial}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-sliders .mud-picker-color-slider .mud-slider-input::-webkit-slider-thumb{appearance:none;margin-top:-6px;height:14px;width:14px;transform:none;transition:none;background:#f0f0f0;box-shadow:rgba(0,0,0,.37) 0px 1px 4px 0px}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-sliders .mud-picker-color-slider .mud-slider-input::-moz-range-thumb{appearance:none;margin-top:-6px;height:14px;width:14px;transform:none;transition:none;background:#f0f0f0;box-shadow:rgba(0,0,0,.37) 0px 1px 4px 0px}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-sliders .mud-picker-color-slider .mud-slider-input:active::-webkit-slider-thumb{box-shadow:0 0 0 2px var(--mud-palette-action-default-hover) !important}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-sliders .mud-picker-color-slider .mud-slider-input:active::-moz-range-thumb{box-shadow:0 0 0 2px var(--mud-palette-action-default-hover) !important}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-sliders .mud-picker-color-slider.hue+.alpha{margin-top:18px}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-sliders .mud-picker-color-slider.hue .mud-slider-input{background:linear-gradient(90deg, #FF0000, #ff0 16.66%, #0f0 33.33%, #0ff 50%, #00f 66.66%, #f0f 83.33%, #FF0000)}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-sliders .mud-picker-color-slider.alpha .mud-slider-input{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAGElEQVQYlWNgYGCQwoKxgqGgcJA5h3yFAAs8BRWVSwooAAAAAElFTkSuQmCC) repeat}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-inputs{display:flex;flex:1 1 auto}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-inputs .mud-picker-color-inputfield{width:100%;margin-right:8px;margin-inline-end:8px;margin-inline-start:unset}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-inputs .mud-picker-color-inputfield:last-of-type{margin-right:0;margin-inline-end:0;margin-inline-start:unset}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-inputs .mud-picker-color-inputfield .mud-input input{padding:6px;height:1em;text-align:center;font-size:14px}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-inputs .mud-picker-color-inputfield .mud-input-helper-text{text-align:center}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-inputs .mud-picker-color-inputfield .mud-input-helper-text div div{margin:auto}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-control-switch{margin-left:8px;margin-inline-start:8px;margin-inline-end:unset;padding-bottom:16px}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-collection{display:flex;min-width:230px;justify-content:space-between}.mud-picker-color-controls .mud-picker-color-controls-row .mud-picker-color-collection .mud-picker-color-dot{max-width:38px}.mud-picker-color-dot{height:38px;min-width:38px;width:100%;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-radius 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;border-radius:var(--mud-default-borderradius);box-shadow:0 0 6px rgba(127,130,134,.18)}@media(hover: hover)and (pointer: fine){.mud-picker-color-dot:hover{cursor:pointer;box-shadow:0px 3px 1px -2px rgba(0,0,0,.2),0px 2px 2px 0px rgba(0,0,0,.14),0px 1px 5px 0px rgba(0,0,0,.12)}}.mud-picker-color-dot.mud-picker-color-dot-current{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAGElEQVQYlWNgYGCQwoKxgqGgcJA5h3yFAAs8BRWVSwooAAAAAElFTkSuQmCC) repeat}.mud-picker-color-dot .mud-picker-color-fill{width:100%;height:100%;border-radius:inherit}.mud-picker-color-dot+.mud-picker-color-sliders{margin-left:16px;margin-inline-start:16px;margin-inline-end:unset}.mud-picker-color-dot+.mud-picker-color-collection{margin-left:10px;margin-inline-start:10px;margin-inline-end:unset}.mud-picker-color-view{position:absolute;width:100%;height:100%;overflow:auto;padding:6px;background-color:var(--mud-palette-surface)}.mud-picker-color-view .mud-picker-color-view-collection{display:flex;flex-wrap:wrap;justify-content:space-evenly}.mud-picker-color-view .mud-picker-color-view-collection .mud-picker-color-dot{max-width:38px;margin:8px}.mud-picker-color-view .mud-picker-color-view-collection .mud-picker-color-dot.selected{border-radius:50%;box-shadow:0px 3px 1px -2px rgba(0,0,0,.2),0px 2px 2px 0px rgba(0,0,0,.14),0px 1px 5px 0px rgba(0,0,0,.12)}.mud-popover{outline:0;z-index:calc(var(--mud-zindex-popover) + 1);position:absolute;opacity:0}.mud-popover.mud-popover-fixed{position:fixed}.mud-popover.mud-popover-relative-width{width:100%}.mud-popover.mud-popover-open{opacity:1;transition:opacity}.mud-popover:not(.mud-popover-open){pointer-events:none;transition-duration:0ms !important;transition-delay:0ms !important}.mud-popover .mud-list{max-height:inherit;overflow-y:auto}.mud-popover .mud-popover{z-index:auto}.mud-appbar .mud-popover-cascading-value{z-index:calc(var(--mud-zindex-appbar) + 2)}.mud-drawer:not(.mud-drawer-temporary) .mud-popover-cascading-value{z-index:calc(var(--mud-zindex-drawer) + 2)}.mud-drawer.mud-drawer-temporary .mud-popover-cascading-value,.mud-drawer.mud-drawer-responsive .mud-popover-cascading-value{z-index:calc(var(--mud-zindex-appbar) + 4)}.mud-dialog .mud-popover-cascading-value{z-index:calc(var(--mud-zindex-dialog) + 3)}.mud-select .mud-popover-cascading-value{z-index:calc(var(--mud-zindex-select) + 5)}.mud-simple-table table{width:100%;display:table;border-spacing:0;border-collapse:collapse}.mud-simple-table table thead{display:table-header-group}.mud-simple-table table tbody{display:table-row-group}.mud-simple-table table tbody tr:last-child td{border-bottom:none}.mud-simple-table table * tr{color:inherit;display:table-row;outline:0;vertical-align:middle}.mud-simple-table table * tr>td,.mud-simple-table table * tr th{display:table-cell;padding:16px;font-size:.875rem;text-align:start;font-weight:400;line-height:1.43;border-bottom:1px solid var(--mud-palette-table-lines);letter-spacing:.01071em;vertical-align:inherit}.mud-simple-table table * tr>th{font-weight:500;line-height:1.5rem}.mud-simple-table.mud-table-dense * tr td,.mud-simple-table.mud-table-dense * tr th{padding:6px 16px}@media(hover: hover)and (pointer: fine){.mud-simple-table.mud-table-hover .mud-table-container table tbody tr:hover{background-color:var(--mud-palette-table-hover)}}.mud-simple-table.mud-table-bordered .mud-table-container table tbody tr td{border-right:1px solid var(--mud-palette-table-lines)}.mud-simple-table.mud-table-bordered .mud-table-container table tbody tr td:last-child{border-right:none}.mud-simple-table.mud-table-striped .mud-table-container table tbody tr:nth-of-type(odd){background-color:var(--mud-palette-table-striped)}@media(hover: hover)and (pointer: fine){.mud-table-hover.mud-table-striped .mud-table-container table tbody tr:nth-of-type(odd):nth-of-type(odd):hover{background-color:var(--mud-palette-table-hover)}}.mud-simple-table.mud-table-sticky-header .mud-table-container{overflow-x:auto;max-height:100%}.mud-simple-table.mud-table-sticky-header * table{border-collapse:separate}.mud-simple-table.mud-table-sticky-header * table thead * th:first-child{border-radius:var(--mud-default-borderradius) 0 0 0}.mud-simple-table.mud-table-sticky-header * table thead * th:last-child{border-radius:0 var(--mud-default-borderradius) 0 0}.mud-simple-table.mud-table-sticky-header * table thead * th{background-color:var(--mud-palette-surface);position:sticky;z-index:1;top:0}.mud-simple-table.mud-table-sticky-footer .mud-table-container{overflow-x:auto;max-height:100%}.mud-simple-table.mud-table-sticky-footer * table{border-collapse:separate}.mud-simple-table.mud-table-sticky-footer * table tfoot * td{background-color:var(--mud-palette-surface);position:sticky;z-index:1;bottom:0}.mud-skeleton{height:1.2em;display:block;background-color:var(--mud-palette-skeleton)}.mud-skeleton-text{height:auto;transform:scale(1, 0.6);margin-top:0;border-radius:var(--mud-default-borderradius);margin-bottom:0;transform-origin:0 60%}.mud-skeleton-text:empty:before{content:" "}.mud-skeleton-circle{border-radius:50%}.mud-skeleton-pulse{animation:mud-skeleton-keyframes-pulse 1.5s ease-in-out .5s infinite}.mud-skeleton-wave{overflow:hidden;position:relative}.mud-skeleton-wave::after{top:0;left:0;right:0;bottom:0;content:"";position:absolute;animation:mud-skeleton-keyframes-wave 1.6s linear .5s infinite;transform:translateX(-100%);background:linear-gradient(90deg, transparent, rgba(0, 0, 0, 0.04), transparent)}.mud-slider{color:var(--mud-palette-text-primary);display:inline-block;width:100%;user-select:none;touch-action:pinch-zoom}.mud-slider>.mud-typography{margin-top:10px}.mud-slider.mud-slider-vertical{transform:rotate(270deg);height:100%;width:unset}.mud-slider .mud-slider-input{-webkit-appearance:none;-moz-appearance:none;position:relative;display:block;width:100%;background-color:rgba(0,0,0,0);cursor:pointer}.mud-slider .mud-slider-input:focus{outline:none}.mud-slider .mud-slider-input:active+.mud-slider-value-label{opacity:1}.mud-slider .mud-slider-input::-webkit-slider-runnable-track{border-radius:var(--mud-default-borderradius);width:100%}.mud-slider .mud-slider-input::-moz-range-track{border-radius:var(--mud-default-borderradius);width:100%}.mud-slider .mud-slider-input::-webkit-slider-thumb{appearance:none;-webkit-appearance:none;border:none;border-radius:50%;cursor:pointer;transition:box-shadow 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-slider .mud-slider-input::-moz-range-thumb{appearance:none;-webkit-appearance:none;border:none;border-radius:50%;cursor:pointer;transition:box-shadow 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-slider .mud-slider-input:disabled{cursor:default;opacity:.38}.mud-slider .mud-slider-input:disabled::-webkit-slider-runnable-track{background-color:var(--mud-palette-text-disabled)}.mud-slider .mud-slider-input:disabled::-moz-range-track{background-color:var(--mud-palette-text-disabled)}.mud-slider .mud-slider-input:disabled::-webkit-slider-thumb{background-color:#000;color:#fff;box-shadow:0 0 0 1px #fff !important;transform:scale(4, 4)}@media(hover: hover)and (pointer: fine){.mud-slider .mud-slider-input:disabled::-webkit-slider-thumb:hover{box-shadow:0 0 0 1px #fff !important}}.mud-slider .mud-slider-input:disabled::-moz-range-thumb{background-color:#000;color:#fff;box-shadow:0 0 0 1px #fff !important;transform:scale(4, 4)}@media(hover: hover)and (pointer: fine){.mud-slider .mud-slider-input:disabled::-moz-range-thumb:hover{box-shadow:0 0 0 1px #fff !important}}.mud-slider.mud-slider-primary .mud-slider-filled{background-color:var(--mud-palette-primary)}.mud-slider.mud-slider-primary .mud-slider-track-tick{background-color:var(--mud-palette-primary)}.mud-slider.mud-slider-primary .mud-slider-value-label{color:var(--mud-palette-primary-text);background-color:var(--mud-palette-primary)}.mud-slider.mud-slider-primary .mud-slider-input::-webkit-slider-runnable-track{background-color:rgba(var(--mud-palette-primary-rgb), 0.3)}.mud-slider.mud-slider-primary .mud-slider-input::-moz-range-track{background-color:rgba(var(--mud-palette-primary-rgb), 0.3)}.mud-slider.mud-slider-primary .mud-slider-input::-webkit-slider-thumb{background-color:var(--mud-palette-primary);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-primary-rgb), 0.3)}.mud-slider.mud-slider-primary .mud-slider-input::-moz-range-thumb{background-color:var(--mud-palette-primary);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-primary-rgb), 0.3)}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-primary .mud-slider-input::-webkit-slider-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-primary-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-primary-rgb), 0.24)}}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-primary .mud-slider-input::-moz-range-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-primary-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-primary-rgb), 0.24)}}.mud-slider.mud-slider-primary .mud-slider-input:focus-visible::-webkit-slider-thumb,.mud-slider.mud-slider-primary .mud-slider-input:active::-webkit-slider-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-primary-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-primary-rgb), 0.24)}.mud-slider.mud-slider-primary .mud-slider-input:focus-visible::-moz-range-thumb,.mud-slider.mud-slider-primary .mud-slider-input:active::-moz-range-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-primary-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-primary-rgb), 0.24)}.mud-slider.mud-slider-secondary .mud-slider-filled{background-color:var(--mud-palette-secondary)}.mud-slider.mud-slider-secondary .mud-slider-track-tick{background-color:var(--mud-palette-secondary)}.mud-slider.mud-slider-secondary .mud-slider-value-label{color:var(--mud-palette-secondary-text);background-color:var(--mud-palette-secondary)}.mud-slider.mud-slider-secondary .mud-slider-input::-webkit-slider-runnable-track{background-color:rgba(var(--mud-palette-secondary-rgb), 0.3)}.mud-slider.mud-slider-secondary .mud-slider-input::-moz-range-track{background-color:rgba(var(--mud-palette-secondary-rgb), 0.3)}.mud-slider.mud-slider-secondary .mud-slider-input::-webkit-slider-thumb{background-color:var(--mud-palette-secondary);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-secondary-rgb), 0.3)}.mud-slider.mud-slider-secondary .mud-slider-input::-moz-range-thumb{background-color:var(--mud-palette-secondary);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-secondary-rgb), 0.3)}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-secondary .mud-slider-input::-webkit-slider-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-secondary-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-secondary-rgb), 0.24)}}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-secondary .mud-slider-input::-moz-range-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-secondary-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-secondary-rgb), 0.24)}}.mud-slider.mud-slider-secondary .mud-slider-input:focus-visible::-webkit-slider-thumb,.mud-slider.mud-slider-secondary .mud-slider-input:active::-webkit-slider-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-secondary-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-secondary-rgb), 0.24)}.mud-slider.mud-slider-secondary .mud-slider-input:focus-visible::-moz-range-thumb,.mud-slider.mud-slider-secondary .mud-slider-input:active::-moz-range-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-secondary-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-secondary-rgb), 0.24)}.mud-slider.mud-slider-tertiary .mud-slider-filled{background-color:var(--mud-palette-tertiary)}.mud-slider.mud-slider-tertiary .mud-slider-track-tick{background-color:var(--mud-palette-tertiary)}.mud-slider.mud-slider-tertiary .mud-slider-value-label{color:var(--mud-palette-tertiary-text);background-color:var(--mud-palette-tertiary)}.mud-slider.mud-slider-tertiary .mud-slider-input::-webkit-slider-runnable-track{background-color:rgba(var(--mud-palette-tertiary-rgb), 0.3)}.mud-slider.mud-slider-tertiary .mud-slider-input::-moz-range-track{background-color:rgba(var(--mud-palette-tertiary-rgb), 0.3)}.mud-slider.mud-slider-tertiary .mud-slider-input::-webkit-slider-thumb{background-color:var(--mud-palette-tertiary);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-tertiary-rgb), 0.3)}.mud-slider.mud-slider-tertiary .mud-slider-input::-moz-range-thumb{background-color:var(--mud-palette-tertiary);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-tertiary-rgb), 0.3)}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-tertiary .mud-slider-input::-webkit-slider-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-tertiary-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-tertiary-rgb), 0.24)}}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-tertiary .mud-slider-input::-moz-range-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-tertiary-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-tertiary-rgb), 0.24)}}.mud-slider.mud-slider-tertiary .mud-slider-input:focus-visible::-webkit-slider-thumb,.mud-slider.mud-slider-tertiary .mud-slider-input:active::-webkit-slider-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-tertiary-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-tertiary-rgb), 0.24)}.mud-slider.mud-slider-tertiary .mud-slider-input:focus-visible::-moz-range-thumb,.mud-slider.mud-slider-tertiary .mud-slider-input:active::-moz-range-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-tertiary-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-tertiary-rgb), 0.24)}.mud-slider.mud-slider-info .mud-slider-filled{background-color:var(--mud-palette-info)}.mud-slider.mud-slider-info .mud-slider-track-tick{background-color:var(--mud-palette-info)}.mud-slider.mud-slider-info .mud-slider-value-label{color:var(--mud-palette-info-text);background-color:var(--mud-palette-info)}.mud-slider.mud-slider-info .mud-slider-input::-webkit-slider-runnable-track{background-color:rgba(var(--mud-palette-info-rgb), 0.3)}.mud-slider.mud-slider-info .mud-slider-input::-moz-range-track{background-color:rgba(var(--mud-palette-info-rgb), 0.3)}.mud-slider.mud-slider-info .mud-slider-input::-webkit-slider-thumb{background-color:var(--mud-palette-info);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-info-rgb), 0.3)}.mud-slider.mud-slider-info .mud-slider-input::-moz-range-thumb{background-color:var(--mud-palette-info);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-info-rgb), 0.3)}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-info .mud-slider-input::-webkit-slider-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-info-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-info-rgb), 0.24)}}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-info .mud-slider-input::-moz-range-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-info-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-info-rgb), 0.24)}}.mud-slider.mud-slider-info .mud-slider-input:focus-visible::-webkit-slider-thumb,.mud-slider.mud-slider-info .mud-slider-input:active::-webkit-slider-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-info-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-info-rgb), 0.24)}.mud-slider.mud-slider-info .mud-slider-input:focus-visible::-moz-range-thumb,.mud-slider.mud-slider-info .mud-slider-input:active::-moz-range-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-info-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-info-rgb), 0.24)}.mud-slider.mud-slider-success .mud-slider-filled{background-color:var(--mud-palette-success)}.mud-slider.mud-slider-success .mud-slider-track-tick{background-color:var(--mud-palette-success)}.mud-slider.mud-slider-success .mud-slider-value-label{color:var(--mud-palette-success-text);background-color:var(--mud-palette-success)}.mud-slider.mud-slider-success .mud-slider-input::-webkit-slider-runnable-track{background-color:rgba(var(--mud-palette-success-rgb), 0.3)}.mud-slider.mud-slider-success .mud-slider-input::-moz-range-track{background-color:rgba(var(--mud-palette-success-rgb), 0.3)}.mud-slider.mud-slider-success .mud-slider-input::-webkit-slider-thumb{background-color:var(--mud-palette-success);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-success-rgb), 0.3)}.mud-slider.mud-slider-success .mud-slider-input::-moz-range-thumb{background-color:var(--mud-palette-success);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-success-rgb), 0.3)}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-success .mud-slider-input::-webkit-slider-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-success-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-success-rgb), 0.24)}}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-success .mud-slider-input::-moz-range-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-success-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-success-rgb), 0.24)}}.mud-slider.mud-slider-success .mud-slider-input:focus-visible::-webkit-slider-thumb,.mud-slider.mud-slider-success .mud-slider-input:active::-webkit-slider-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-success-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-success-rgb), 0.24)}.mud-slider.mud-slider-success .mud-slider-input:focus-visible::-moz-range-thumb,.mud-slider.mud-slider-success .mud-slider-input:active::-moz-range-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-success-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-success-rgb), 0.24)}.mud-slider.mud-slider-warning .mud-slider-filled{background-color:var(--mud-palette-warning)}.mud-slider.mud-slider-warning .mud-slider-track-tick{background-color:var(--mud-palette-warning)}.mud-slider.mud-slider-warning .mud-slider-value-label{color:var(--mud-palette-warning-text);background-color:var(--mud-palette-warning)}.mud-slider.mud-slider-warning .mud-slider-input::-webkit-slider-runnable-track{background-color:rgba(var(--mud-palette-warning-rgb), 0.3)}.mud-slider.mud-slider-warning .mud-slider-input::-moz-range-track{background-color:rgba(var(--mud-palette-warning-rgb), 0.3)}.mud-slider.mud-slider-warning .mud-slider-input::-webkit-slider-thumb{background-color:var(--mud-palette-warning);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-warning-rgb), 0.3)}.mud-slider.mud-slider-warning .mud-slider-input::-moz-range-thumb{background-color:var(--mud-palette-warning);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-warning-rgb), 0.3)}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-warning .mud-slider-input::-webkit-slider-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-warning-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-warning-rgb), 0.24)}}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-warning .mud-slider-input::-moz-range-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-warning-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-warning-rgb), 0.24)}}.mud-slider.mud-slider-warning .mud-slider-input:focus-visible::-webkit-slider-thumb,.mud-slider.mud-slider-warning .mud-slider-input:active::-webkit-slider-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-warning-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-warning-rgb), 0.24)}.mud-slider.mud-slider-warning .mud-slider-input:focus-visible::-moz-range-thumb,.mud-slider.mud-slider-warning .mud-slider-input:active::-moz-range-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-warning-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-warning-rgb), 0.24)}.mud-slider.mud-slider-error .mud-slider-filled{background-color:var(--mud-palette-error)}.mud-slider.mud-slider-error .mud-slider-track-tick{background-color:var(--mud-palette-error)}.mud-slider.mud-slider-error .mud-slider-value-label{color:var(--mud-palette-error-text);background-color:var(--mud-palette-error)}.mud-slider.mud-slider-error .mud-slider-input::-webkit-slider-runnable-track{background-color:rgba(var(--mud-palette-error-rgb), 0.3)}.mud-slider.mud-slider-error .mud-slider-input::-moz-range-track{background-color:rgba(var(--mud-palette-error-rgb), 0.3)}.mud-slider.mud-slider-error .mud-slider-input::-webkit-slider-thumb{background-color:var(--mud-palette-error);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-error-rgb), 0.3)}.mud-slider.mud-slider-error .mud-slider-input::-moz-range-thumb{background-color:var(--mud-palette-error);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-error-rgb), 0.3)}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-error .mud-slider-input::-webkit-slider-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-error-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-error-rgb), 0.24)}}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-error .mud-slider-input::-moz-range-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-error-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-error-rgb), 0.24)}}.mud-slider.mud-slider-error .mud-slider-input:focus-visible::-webkit-slider-thumb,.mud-slider.mud-slider-error .mud-slider-input:active::-webkit-slider-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-error-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-error-rgb), 0.24)}.mud-slider.mud-slider-error .mud-slider-input:focus-visible::-moz-range-thumb,.mud-slider.mud-slider-error .mud-slider-input:active::-moz-range-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-error-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-error-rgb), 0.24)}.mud-slider.mud-slider-dark .mud-slider-filled{background-color:var(--mud-palette-dark)}.mud-slider.mud-slider-dark .mud-slider-track-tick{background-color:var(--mud-palette-dark)}.mud-slider.mud-slider-dark .mud-slider-value-label{color:var(--mud-palette-dark-text);background-color:var(--mud-palette-dark)}.mud-slider.mud-slider-dark .mud-slider-input::-webkit-slider-runnable-track{background-color:rgba(var(--mud-palette-dark-rgb), 0.3)}.mud-slider.mud-slider-dark .mud-slider-input::-moz-range-track{background-color:rgba(var(--mud-palette-dark-rgb), 0.3)}.mud-slider.mud-slider-dark .mud-slider-input::-webkit-slider-thumb{background-color:var(--mud-palette-dark);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-dark-rgb), 0.3)}.mud-slider.mud-slider-dark .mud-slider-input::-moz-range-thumb{background-color:var(--mud-palette-dark);box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-dark-rgb), 0.3)}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-dark .mud-slider-input::-webkit-slider-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-dark-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-dark-rgb), 0.24)}}@media(hover: hover)and (pointer: fine){.mud-slider.mud-slider-dark .mud-slider-input::-moz-range-thumb:hover{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-dark-rgb), 0.3),0 0 0 1px rgba(var(--mud-palette-dark-rgb), 0.24)}}.mud-slider.mud-slider-dark .mud-slider-input:focus-visible::-webkit-slider-thumb,.mud-slider.mud-slider-dark .mud-slider-input:active::-webkit-slider-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-dark-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-dark-rgb), 0.24)}.mud-slider.mud-slider-dark .mud-slider-input:focus-visible::-moz-range-thumb,.mud-slider.mud-slider-dark .mud-slider-input:active::-moz-range-thumb{box-shadow:0px 1px 2px -1px rgba(var(--mud-palette-dark-rgb), 0.3),0 0 0 2px rgba(var(--mud-palette-dark-rgb), 0.24)}.mud-slider.mud-slider-small .mud-slider-filled{height:2px}.mud-slider.mud-slider-small .mud-slider-track-tick{width:2px;height:2px}.mud-slider.mud-slider-small .mud-slider-track-tick-label{transform:translateX(-50%) translateY(50%)}.mud-slider.mud-slider-small .mud-slider-input::-webkit-slider-runnable-track{height:2px;margin:10px 0}.mud-slider.mud-slider-small .mud-slider-input::-moz-range-track{height:2px;margin:10px 0}.mud-slider.mud-slider-small .mud-slider-input::-webkit-slider-thumb{height:2px;width:2px;transform:scale(6, 6)}.mud-slider.mud-slider-small .mud-slider-input::-moz-range-thumb{height:2px;width:2px;transform:scale(6, 6)}.mud-slider.mud-slider-medium .mud-slider-filled{height:4px}.mud-slider.mud-slider-medium .mud-slider-track-tick{width:4px;height:4px}.mud-slider.mud-slider-medium .mud-slider-track-tick-label{transform:translateX(-50%) translateY(80%)}.mud-slider.mud-slider-medium .mud-slider-input::-webkit-slider-runnable-track{height:4px;margin:12px 0}.mud-slider.mud-slider-medium .mud-slider-input::-moz-range-track{height:4px;margin:12px 0}.mud-slider.mud-slider-medium .mud-slider-input::-webkit-slider-thumb{height:4px;width:4px;transform:scale(5, 5)}.mud-slider.mud-slider-medium .mud-slider-input::-moz-range-thumb{height:4px;width:4px;transform:scale(5, 5)}.mud-slider.mud-slider-large .mud-slider-filled{height:6px}.mud-slider.mud-slider-large .mud-slider-track-tick{width:6px;height:6px}.mud-slider.mud-slider-large .mud-slider-track-tick-label{transform:translateX(-50%) translateY(110%)}.mud-slider.mud-slider-large .mud-slider-input::-webkit-slider-runnable-track{height:6px;margin:14px 0}.mud-slider.mud-slider-large .mud-slider-input::-moz-range-track{height:6px;margin:14px 0}.mud-slider.mud-slider-large .mud-slider-input::-webkit-slider-thumb{height:6px;width:6px;transform:scale(4, 4)}.mud-slider.mud-slider-large .mud-slider-input::-moz-range-thumb{height:6px;width:6px;transform:scale(4, 4)}.mud-slider .mud-slider-container{position:relative;width:100%;display:flex;align-content:center}.mud-slider .mud-slider-filled{border-radius:var(--mud-default-borderradius)}.mud-slider .mud-slider-inner-container{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;align-items:center}.mud-slider .mud-slider-value-label{position:absolute;top:0;transform:translateX(-50%) translateY(-125%);padding:4px 8px;text-align:center;align-items:center;justify-content:center;font-size:12px;border-radius:2px;line-height:normal;opacity:0;transition:opacity .2s ease-in-out;pointer-events:none;user-select:none}.mud-slider .mud-slider-tickmarks{display:flex;justify-content:space-between;flex-grow:1}.mud-slider .mud-slider-track-tick{border-radius:9999%;background-color:var(--mud-palette-primary)}.mud-slider .mud-slider-track-tick-label{position:absolute;top:0;left:50%}.mud-progress-circular{display:inline-block;color:var(--mud-palette-text-secondary)}.mud-progress-circular.mud-progress-indeterminate{animation:mud-progress-circular-keyframes-circular-rotate 1.4s linear infinite}.mud-progress-circular.mud-progress-static{transition:transform 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-progress-circular.mud-progress-small{height:24px;width:24px}.mud-progress-circular.mud-progress-medium{height:40px;width:40px}.mud-progress-circular.mud-progress-large{height:56px;width:56px}.mud-progress-circular-svg{display:block;transform:rotate(-90deg)}.mud-progress-circular-circle{stroke:currentColor}.mud-progress-circular-circle.mud-progress-indeterminate{animation:mud-progress-circular-keyframes-circular-dash 1.4s ease-in-out infinite;stroke-dasharray:80px,200px;stroke-dashoffset:0px}.mud-progress-circular-circle.mud-progress-static{transition:stroke-dashoffset 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-progress-circular-circle.mud-progress-circular-circle-rounded{stroke-linecap:round}.mud-progress-circular-disable-shrink{animation:none}.mud-progress-linear{position:relative}.mud-progress-linear::before{content:"";position:absolute;top:0;left:0;height:100%;width:100%;display:block;opacity:.2}.mud-progress-linear.horizontal{width:100%}.mud-progress-linear.horizontal.mud-progress-linear-small{height:4px}.mud-progress-linear.horizontal.mud-progress-linear-medium{height:8px}.mud-progress-linear.horizontal.mud-progress-linear-large{height:12px}.mud-progress-linear.horizontal .mud-progress-linear-dashed{animation:mud-progress-linear-horizontal-keyframes-buffer 3s infinite linear}.mud-progress-linear.vertical{height:100%}.mud-progress-linear.vertical.mud-progress-linear-small{width:4px}.mud-progress-linear.vertical.mud-progress-linear-medium{width:8px}.mud-progress-linear.vertical.mud-progress-linear-large{width:12px}.mud-progress-linear .mud-progress-linear-content{position:absolute;height:100%;width:100%;display:flex;justify-content:center;align-items:center}.mud-progress-linear .mud-progress-linear-bars{position:absolute;height:100%;width:100%;overflow:hidden}.mud-progress-linear .mud-progress-linear-bar{top:0;left:0;width:100%;bottom:0;position:absolute;transition:transform .2s linear;transform-origin:left}.mud-progress-linear .mud-progress-linear-bar.mud-progress-linear-1-indeterminate.horizontal{width:auto;animation:mud-progress-linear-horizontal-keyframes-indeterminate1 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite}.mud-progress-linear .mud-progress-linear-bar.mud-progress-linear-1-indeterminate.vertical{height:auto;animation:mud-progress-linear-vertical-keyframes-indeterminate1 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite}.mud-progress-linear .mud-progress-linear-bar.mud-progress-linear-2-indeterminate.horizontal{width:auto;animation:mud-progress-linear-horizontal-keyframes-indeterminate2 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) 1.15s infinite}.mud-progress-linear .mud-progress-linear-bar.mud-progress-linear-2-indeterminate.vertical{height:auto;animation:mud-progress-linear-vertical-keyframes-indeterminate2 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) 1.15s infinite}.mud-progress-linear.mud-progress-linear-color-default:not(.mud-progress-linear-buffer)::before{background-color:var(--mud-palette-action-disabled)}.mud-progress-linear.mud-progress-linear-color-default:not(.mud-progress-linear-buffer) .mud-progress-linear-bar{background-color:var(--mud-palette-action-default)}.mud-progress-linear.mud-progress-linear-color-default.mud-progress-linear-buffer .mud-progress-linear-bar:first-child{background-size:10px 10px;background-image:radial-gradient(var(--mud-palette-action-disabled) 0%, var(--mud-palette-action-disabled) 16%, transparent 42%);background-position:0 50%}.mud-progress-linear.mud-progress-linear-color-default.mud-progress-linear-buffer .mud-progress-linear-bar:nth-child(2){background-color:var(--mud-palette-action-default)}.mud-progress-linear.mud-progress-linear-color-default.mud-progress-linear-buffer .mud-progress-linear-bar:last-child{transition:transform .4s linear}.mud-progress-linear.mud-progress-linear-color-default.mud-progress-linear-buffer .mud-progress-linear-bar:last-child::before{content:"";position:absolute;top:0;left:0;height:100%;width:100%;display:block;opacity:.4;background-color:var(--mud-palette-action-disabled)}.mud-progress-linear.mud-progress-linear-color-primary:not(.mud-progress-linear-buffer)::before{background-color:var(--mud-palette-primary)}.mud-progress-linear.mud-progress-linear-color-primary:not(.mud-progress-linear-buffer) .mud-progress-linear-bar{background-color:var(--mud-palette-primary)}.mud-progress-linear.mud-progress-linear-color-primary.mud-progress-linear-buffer .mud-progress-linear-bar:first-child{background-size:10px 10px;background-image:radial-gradient(var(--mud-palette-primary) 0%, var(--mud-palette-primary) 16%, transparent 42%);background-position:0 50%}.mud-progress-linear.mud-progress-linear-color-primary.mud-progress-linear-buffer .mud-progress-linear-bar:nth-child(2){background-color:var(--mud-palette-primary)}.mud-progress-linear.mud-progress-linear-color-primary.mud-progress-linear-buffer .mud-progress-linear-bar:last-child{transition:transform .4s linear}.mud-progress-linear.mud-progress-linear-color-primary.mud-progress-linear-buffer .mud-progress-linear-bar:last-child::before{content:"";position:absolute;top:0;left:0;height:100%;width:100%;display:block;opacity:.4;background-color:var(--mud-palette-primary)}.mud-progress-linear.mud-progress-linear-color-secondary:not(.mud-progress-linear-buffer)::before{background-color:var(--mud-palette-secondary)}.mud-progress-linear.mud-progress-linear-color-secondary:not(.mud-progress-linear-buffer) .mud-progress-linear-bar{background-color:var(--mud-palette-secondary)}.mud-progress-linear.mud-progress-linear-color-secondary.mud-progress-linear-buffer .mud-progress-linear-bar:first-child{background-size:10px 10px;background-image:radial-gradient(var(--mud-palette-secondary) 0%, var(--mud-palette-secondary) 16%, transparent 42%);background-position:0 50%}.mud-progress-linear.mud-progress-linear-color-secondary.mud-progress-linear-buffer .mud-progress-linear-bar:nth-child(2){background-color:var(--mud-palette-secondary)}.mud-progress-linear.mud-progress-linear-color-secondary.mud-progress-linear-buffer .mud-progress-linear-bar:last-child{transition:transform .4s linear}.mud-progress-linear.mud-progress-linear-color-secondary.mud-progress-linear-buffer .mud-progress-linear-bar:last-child::before{content:"";position:absolute;top:0;left:0;height:100%;width:100%;display:block;opacity:.4;background-color:var(--mud-palette-secondary)}.mud-progress-linear.mud-progress-linear-color-tertiary:not(.mud-progress-linear-buffer)::before{background-color:var(--mud-palette-tertiary)}.mud-progress-linear.mud-progress-linear-color-tertiary:not(.mud-progress-linear-buffer) .mud-progress-linear-bar{background-color:var(--mud-palette-tertiary)}.mud-progress-linear.mud-progress-linear-color-tertiary.mud-progress-linear-buffer .mud-progress-linear-bar:first-child{background-size:10px 10px;background-image:radial-gradient(var(--mud-palette-tertiary) 0%, var(--mud-palette-tertiary) 16%, transparent 42%);background-position:0 50%}.mud-progress-linear.mud-progress-linear-color-tertiary.mud-progress-linear-buffer .mud-progress-linear-bar:nth-child(2){background-color:var(--mud-palette-tertiary)}.mud-progress-linear.mud-progress-linear-color-tertiary.mud-progress-linear-buffer .mud-progress-linear-bar:last-child{transition:transform .4s linear}.mud-progress-linear.mud-progress-linear-color-tertiary.mud-progress-linear-buffer .mud-progress-linear-bar:last-child::before{content:"";position:absolute;top:0;left:0;height:100%;width:100%;display:block;opacity:.4;background-color:var(--mud-palette-tertiary)}.mud-progress-linear.mud-progress-linear-color-info:not(.mud-progress-linear-buffer)::before{background-color:var(--mud-palette-info)}.mud-progress-linear.mud-progress-linear-color-info:not(.mud-progress-linear-buffer) .mud-progress-linear-bar{background-color:var(--mud-palette-info)}.mud-progress-linear.mud-progress-linear-color-info.mud-progress-linear-buffer .mud-progress-linear-bar:first-child{background-size:10px 10px;background-image:radial-gradient(var(--mud-palette-info) 0%, var(--mud-palette-info) 16%, transparent 42%);background-position:0 50%}.mud-progress-linear.mud-progress-linear-color-info.mud-progress-linear-buffer .mud-progress-linear-bar:nth-child(2){background-color:var(--mud-palette-info)}.mud-progress-linear.mud-progress-linear-color-info.mud-progress-linear-buffer .mud-progress-linear-bar:last-child{transition:transform .4s linear}.mud-progress-linear.mud-progress-linear-color-info.mud-progress-linear-buffer .mud-progress-linear-bar:last-child::before{content:"";position:absolute;top:0;left:0;height:100%;width:100%;display:block;opacity:.4;background-color:var(--mud-palette-info)}.mud-progress-linear.mud-progress-linear-color-success:not(.mud-progress-linear-buffer)::before{background-color:var(--mud-palette-success)}.mud-progress-linear.mud-progress-linear-color-success:not(.mud-progress-linear-buffer) .mud-progress-linear-bar{background-color:var(--mud-palette-success)}.mud-progress-linear.mud-progress-linear-color-success.mud-progress-linear-buffer .mud-progress-linear-bar:first-child{background-size:10px 10px;background-image:radial-gradient(var(--mud-palette-success) 0%, var(--mud-palette-success) 16%, transparent 42%);background-position:0 50%}.mud-progress-linear.mud-progress-linear-color-success.mud-progress-linear-buffer .mud-progress-linear-bar:nth-child(2){background-color:var(--mud-palette-success)}.mud-progress-linear.mud-progress-linear-color-success.mud-progress-linear-buffer .mud-progress-linear-bar:last-child{transition:transform .4s linear}.mud-progress-linear.mud-progress-linear-color-success.mud-progress-linear-buffer .mud-progress-linear-bar:last-child::before{content:"";position:absolute;top:0;left:0;height:100%;width:100%;display:block;opacity:.4;background-color:var(--mud-palette-success)}.mud-progress-linear.mud-progress-linear-color-warning:not(.mud-progress-linear-buffer)::before{background-color:var(--mud-palette-warning)}.mud-progress-linear.mud-progress-linear-color-warning:not(.mud-progress-linear-buffer) .mud-progress-linear-bar{background-color:var(--mud-palette-warning)}.mud-progress-linear.mud-progress-linear-color-warning.mud-progress-linear-buffer .mud-progress-linear-bar:first-child{background-size:10px 10px;background-image:radial-gradient(var(--mud-palette-warning) 0%, var(--mud-palette-warning) 16%, transparent 42%);background-position:0 50%}.mud-progress-linear.mud-progress-linear-color-warning.mud-progress-linear-buffer .mud-progress-linear-bar:nth-child(2){background-color:var(--mud-palette-warning)}.mud-progress-linear.mud-progress-linear-color-warning.mud-progress-linear-buffer .mud-progress-linear-bar:last-child{transition:transform .4s linear}.mud-progress-linear.mud-progress-linear-color-warning.mud-progress-linear-buffer .mud-progress-linear-bar:last-child::before{content:"";position:absolute;top:0;left:0;height:100%;width:100%;display:block;opacity:.4;background-color:var(--mud-palette-warning)}.mud-progress-linear.mud-progress-linear-color-error:not(.mud-progress-linear-buffer)::before{background-color:var(--mud-palette-error)}.mud-progress-linear.mud-progress-linear-color-error:not(.mud-progress-linear-buffer) .mud-progress-linear-bar{background-color:var(--mud-palette-error)}.mud-progress-linear.mud-progress-linear-color-error.mud-progress-linear-buffer .mud-progress-linear-bar:first-child{background-size:10px 10px;background-image:radial-gradient(var(--mud-palette-error) 0%, var(--mud-palette-error) 16%, transparent 42%);background-position:0 50%}.mud-progress-linear.mud-progress-linear-color-error.mud-progress-linear-buffer .mud-progress-linear-bar:nth-child(2){background-color:var(--mud-palette-error)}.mud-progress-linear.mud-progress-linear-color-error.mud-progress-linear-buffer .mud-progress-linear-bar:last-child{transition:transform .4s linear}.mud-progress-linear.mud-progress-linear-color-error.mud-progress-linear-buffer .mud-progress-linear-bar:last-child::before{content:"";position:absolute;top:0;left:0;height:100%;width:100%;display:block;opacity:.4;background-color:var(--mud-palette-error)}.mud-progress-linear.mud-progress-linear-color-dark:not(.mud-progress-linear-buffer)::before{background-color:var(--mud-palette-dark)}.mud-progress-linear.mud-progress-linear-color-dark:not(.mud-progress-linear-buffer) .mud-progress-linear-bar{background-color:var(--mud-palette-dark)}.mud-progress-linear.mud-progress-linear-color-dark.mud-progress-linear-buffer .mud-progress-linear-bar:first-child{background-size:10px 10px;background-image:radial-gradient(var(--mud-palette-dark) 0%, var(--mud-palette-dark) 16%, transparent 42%);background-position:0 50%}.mud-progress-linear.mud-progress-linear-color-dark.mud-progress-linear-buffer .mud-progress-linear-bar:nth-child(2){background-color:var(--mud-palette-dark)}.mud-progress-linear.mud-progress-linear-color-dark.mud-progress-linear-buffer .mud-progress-linear-bar:last-child{transition:transform .4s linear}.mud-progress-linear.mud-progress-linear-color-dark.mud-progress-linear-buffer .mud-progress-linear-bar:last-child::before{content:"";position:absolute;top:0;left:0;height:100%;width:100%;display:block;opacity:.4;background-color:var(--mud-palette-dark)}.mud-progress-linear.mud-progress-indeterminate.horizontal .mud-progress-linear-bar:first-child{width:auto;animation:mud-progress-linear-horizontal-keyframes-indeterminate1 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite}.mud-progress-linear.mud-progress-indeterminate.horizontal .mud-progress-linear-bar:last-child{width:auto;animation:mud-progress-linear-horizontal-keyframes-indeterminate2 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) 1.15s infinite}.mud-progress-linear.mud-progress-indeterminate.vertical .mud-progress-linear-bar:first-child{height:auto;animation:mud-progress-linear-vertical-keyframes-indeterminate1 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite}.mud-progress-linear.mud-progress-indeterminate.vertical .mud-progress-linear-bar:last-child{height:auto;animation:mud-progress-linear-vertical-keyframes-indeterminate2 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) 1.15s infinite}.mud-progress-linear.mud-progress-linear-buffer .mud-progress-linear-bar:first-child{width:100%;height:100%;position:absolute;margin-top:0}.mud-progress-linear.mud-progress-linear-buffer .mud-progress-linear-bar:nth-child(2){z-index:1;transition:transform .4s linear}.mud-progress-linear.mud-progress-linear-buffer.horizontal .mud-progress-linear-bar:first-child{animation:mud-progress-linear-horizontal-keyframes-buffer 3s infinite linear}.mud-progress-linear.mud-progress-linear-buffer.vertical .mud-progress-linear-bar:first-child{animation:mud-progress-linear-vertical-keyframes-buffer 3s infinite linear}.mud-progress-linear.mud-progress-linear-striped .mud-progress-linear-bar{background-image:linear-gradient(135deg, hsla(0, 0%, 100%, 0.25) 25%, transparent 0, transparent 50%, hsla(0, 0%, 100%, 0.25) 0, hsla(0, 0%, 100%, 0.25) 75%, transparent 0, transparent);background-size:40px 40px;background-repeat:repeat;animation:mud-progress-linear-striped-loading 10s linear infinite}.mud-progress-linear.mud-progress-linear-rounded{border-radius:var(--mud-default-borderradius)}.mud-progress-linear.mud-progress-linear-rounded .mud-progress-linear-bars{border-radius:var(--mud-default-borderradius)}.mud-progress-linear.mud-progress-linear-rounded .mud-progress-linear-bar{border-radius:var(--mud-default-borderradius)}.mud-progress-linear.mud-progress-linear-rounded::before{border-radius:var(--mud-default-borderradius)}.mud-radio{cursor:pointer;display:inline-flex;align-items:center;vertical-align:middle;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mud-radio>.mud-radio-content{color:var(--mud-palette-text-primary)}@media(hover: hover)and (pointer: fine){.mud-radio .mud-disabled:hover{cursor:default;background-color:rgba(0,0,0,0) !important}.mud-radio .mud-disabled:hover>.mud-radio-content{color:var(--mud-palette-text-disabled)}.mud-radio .mud-disabled:hover *{cursor:default;color:var(--mud-palette-text-disabled)}}.mud-radio.mud-disabled,.mud-radio .mud-disabled:focus-visible,.mud-radio .mud-disabled:active{cursor:default;background-color:rgba(0,0,0,0) !important}.mud-radio.mud-disabled>.mud-radio-content,.mud-radio .mud-disabled:focus-visible>.mud-radio-content,.mud-radio .mud-disabled:active>.mud-radio-content{color:var(--mud-palette-text-disabled)}.mud-radio.mud-disabled *,.mud-radio .mud-disabled:focus-visible *,.mud-radio .mud-disabled:active *{cursor:default;color:var(--mud-palette-text-disabled)}.mud-radio.mud-readonly,.mud-radio .mud-readonly:hover{cursor:default;background-color:rgba(0,0,0,0) !important}.mud-radio .mud-radio-dense{padding:4px}.mud-radio.mud-checked{color:var(--mud-palette-action-default)}@media(hover: hover)and (pointer: fine){.mud-radio.mud-checked:hover{background-color:var(--mud-palette-action-default-hover)}}.mud-radio-input{top:0;left:0;width:100%;cursor:inherit;height:100%;margin:0;opacity:0;padding:0;z-index:1;position:absolute}.mud-radio-icons{display:flex;position:relative}.mud-radio-icons.mud-checked .mud-radio-icon-checked{transform:scale(1);transition:transform 150ms cubic-bezier(0, 0, 0.2, 1) 0ms}.mud-radio-icon-checked{left:0;position:absolute;transform:scale(0);transition:transform 150ms cubic-bezier(0.4, 0, 1, 1) 0ms}.mud-rating-root{display:inline-flex;color:#ffb400}.mud-rating-root:focus-visible,.mud-rating-root:active{outline:none}.mud-rating-root:focus-visible:not(.mud-disabled),.mud-rating-root:active:not(.mud-disabled){background-color:var(--mud-palette-action-default-hover)}.mud-rating-item{cursor:pointer;transition:transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-rating-item.mud-rating-item-active{transform:scale(1.2)}.mud-rating-item.mud-disabled{cursor:default;pointer-events:none}.mud-rating-item.mud-disabled *{cursor:default;color:var(--mud-palette-text-disabled)}@media(hover: hover)and (pointer: fine){.mud-rating-item .mud-disabled:hover{cursor:default;pointer-events:none}.mud-rating-item .mud-disabled:hover *{cursor:default;color:var(--mud-palette-text-disabled)}}.mud-rating-item.mud-readonly{cursor:default}.mud-rating-item .mud-rating-input{clip:rect(0, 0, 0, 0);margin:0;opacity:0;padding:0;z-index:1;position:absolute;cursor:inherit;overflow:hidden}.mud-rating-item svg{pointer-events:none}.mud-rating-item svg path{pointer-events:none}.mud-snackbar{display:flex;flex-grow:initial;padding:6px 16px;align-items:center;position:relative;pointer-events:auto;font-weight:400;line-height:1.43;overflow:hidden;margin-top:16px;min-width:288px;max-width:500px;border-radius:var(--mud-default-borderradius);box-shadow:0px 3px 5px -1px rgba(0,0,0,.2),0px 6px 10px 0px rgba(0,0,0,.14),0px 1px 18px 0px rgba(0,0,0,.12);touch-action:pinch-zoom}.mud-snackbar.force-cursor{cursor:pointer}.mud-snackbar.mud-snackbar-blurred{backdrop-filter:blur(18px)}.mud-snackbar.mud-snackbar-surface{background:var(--mud-palette-surface)}.mud-snackbar .mud-snackbar-content-message{padding:8px 0;overflow-wrap:anywhere}.mud-snackbar .mud-snackbar-content-action{display:flex;align-items:center;margin-left:auto;margin-right:-8px;padding-left:16px;margin-inline-start:auto;margin-inline-end:-8px;padding-inline-start:16px;padding-inline-end:unset}.mud-snackbar .mud-snackbar-content-action>button{color:inherit}.mud-snackbar-location-top-left{top:24px;left:24px}.mud-snackbar-location-top-center{top:24px;left:50%;transform:translateX(-50%)}.mud-snackbar-location-top-right{top:24px;right:24px}.mud-snackbar-location-bottom-right{right:24px;bottom:24px}.mud-snackbar-location-bottom-center{bottom:24px;left:50%;transform:translateX(-50%)}.mud-snackbar-location-bottom-left{bottom:24px;left:24px}#mud-snackbar-container{position:fixed;z-index:var(--mud-zindex-snackbar);pointer-events:none}.mud-snackbar-icon{display:flex;opacity:.9;padding:7px 0;font-size:22px;margin-right:12px;margin-inline-end:12px;margin-inline-start:unset}.mud-switch{cursor:pointer;display:inline-flex;align-items:center;vertical-align:middle;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mud-switch.mud-disabled{color:var(--mud-palette-text-disabled) !important;cursor:default}.mud-switch.mud-readonly{cursor:default;background-color:rgba(0,0,0,0) !important}@media(hover: hover)and (pointer: fine){.mud-switch .mud-readonly:hover{cursor:default;background-color:rgba(0,0,0,0) !important}}.mud-switch-span{width:58px;height:38px;display:inline-flex;padding:12px;z-index:0;overflow:hidden;position:relative;box-sizing:border-box;flex-shrink:0;vertical-align:middle}.mud-switch-span .mud-switch-track{width:100%;height:100%;opacity:.48;z-index:-1;transition:opacity 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;border-radius:9px;background-color:var(--mud-palette-black)}.mud-switch-base{padding:9px;top:0;left:0;color:#fafafa;z-index:1;position:absolute;transition:left 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-switch-base.mud-checked{transform:translateX(20px)}.mud-switch-base.mud-checked+.mud-switch-track{opacity:.5}@media(hover: hover)and (pointer: fine){.mud-switch-base:hover{background-color:var(--mud-palette-action-default-hover)}}.mud-switch-base.mud-switch-disabled{color:var(--mud-palette-gray-default) !important}.mud-switch-base.mud-switch-disabled+.mud-switch-track{opacity:.12 !important}@media(hover: hover)and (pointer: fine){.mud-switch-base.mud-switch-disabled:hover{cursor:default;background-color:rgba(0,0,0,0) !important}}.mud-switch-base.mud-switch-disabled:focus-visible,.mud-switch-base.mud-switch-disabled:active{cursor:default;background-color:rgba(0,0,0,0) !important}.mud-switch-button{display:flex;align-items:inherit;justify-content:inherit}.mud-switch-button .mud-switch-input{top:0;left:0;width:100%;cursor:inherit;height:100%;margin:0;opacity:0;padding:0;z-index:1;position:absolute}.mud-switch-button .mud-switch-thumb-small{width:14px;height:14px;box-shadow:0px 2px 1px -1px rgba(0,0,0,.2),0px 1px 1px 0px rgba(0,0,0,.14),0px 1px 3px 0px rgba(0,0,0,.12);border-radius:50%;background-color:currentColor}.mud-switch-button .mud-switch-thumb-medium{width:20px;height:20px;box-shadow:0px 2px 1px -1px rgba(0,0,0,.2),0px 1px 1px 0px rgba(0,0,0,.14),0px 1px 3px 0px rgba(0,0,0,.12);border-radius:50%;background-color:currentColor}.mud-switch-button .mud-switch-thumb-large{width:26px;height:26px;box-shadow:0px 2px 1px -1px rgba(0,0,0,.2),0px 1px 1px 0px rgba(0,0,0,.14),0px 1px 3px 0px rgba(0,0,0,.12);border-radius:50%;background-color:currentColor}.mud-switch-base-small.mud-switch-base{padding:5px}.mud-switch-base-medium.mud-switch-base{padding:9px}.mud-switch-base-large.mud-switch-base{padding:13px}.mud-switch-span-small.mud-switch-span{padding:7px;width:44px;height:24px}.mud-switch-span-medium.mud-switch-span{padding:12px;width:58px;height:38px}.mud-switch-span-large.mud-switch-span{padding:17px;width:72px;height:52px}.mud-switch-label-small{font-size:.8125rem !important}.mud-switch-label-medium{font-size:1rem !important}.mud-switch-label-large{font-size:1.1875rem !important}.mud-timeline{position:relative;display:flex}.mud-timeline-item{display:flex}.mud-timeline-item .mud-timeline-item-content{position:relative;height:100%;flex:1 1 auto}.mud-timeline-item .mud-timeline-item-divider{position:relative;display:flex;align-items:center;justify-content:center}.mud-timeline-item .mud-timeline-item-opposite{align-self:center}.mud-timeline-vertical{padding-top:24px;flex-direction:column}.mud-timeline-vertical .mud-timeline-item{padding-bottom:24px}.mud-timeline-vertical .mud-timeline-item .mud-timeline-item-content{max-width:calc(50% - 48px)}.mud-timeline-vertical .mud-timeline-item .mud-timeline-item-divider{min-width:96px}.mud-timeline-vertical .mud-timeline-item .mud-timeline-item-opposite{flex:1 1 auto;max-width:calc(50% - 48px)}.mud-timeline-vertical::before{top:0;bottom:0;content:"";height:100%;position:absolute;width:2px;background:var(--mud-palette-divider)}.mud-timeline-vertical.mud-timeline-align-start .mud-timeline-item-divider{align-items:flex-start}.mud-timeline-vertical.mud-timeline-align-start .mud-timeline-item-opposite{align-self:flex-start}.mud-timeline-vertical.mud-timeline-align-end .mud-timeline-item-divider{align-items:flex-end}.mud-timeline-vertical.mud-timeline-align-end .mud-timeline-item-opposite{align-self:flex-end}.mud-timeline-vertical.mud-timeline-position-alternate::before{left:auto;right:calc(50% - 1px)}.mud-timeline-vertical.mud-timeline-position-alternate .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-start),.mud-timeline-vertical.mud-timeline-position-alternate .mud-timeline-item.mud-timeline-item-end{flex-direction:row-reverse}.mud-timeline-vertical.mud-timeline-position-alternate .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-start) .mud-timeline-item-opposite,.mud-timeline-vertical.mud-timeline-position-alternate .mud-timeline-item.mud-timeline-item-end .mud-timeline-item-opposite{text-align:end}.mud-timeline-vertical.mud-timeline-position-alternate .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-end){flex-direction:row}.mud-timeline-vertical.mud-timeline-position-alternate .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-end) .mud-timeline-item-opposite{text-align:start}.mud-timeline-vertical.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-end),.mud-timeline-vertical.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item.mud-timeline-item-start{flex-direction:row}.mud-timeline-vertical.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-end) .mud-timeline-item-opposite,.mud-timeline-vertical.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item.mud-timeline-item-start .mud-timeline-item-opposite{text-align:start}.mud-timeline-vertical.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-start){flex-direction:row-reverse}.mud-timeline-vertical.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-start) .mud-timeline-item-opposite{text-align:end}.mud-timeline-vertical.mud-timeline-position-start::before{right:auto;left:47px}.mud-timeline-vertical.mud-timeline-position-start.mud-timeline-rtl::before{right:47px;left:auto}.mud-timeline-vertical.mud-timeline-position-start .mud-timeline-item{flex-direction:row-reverse}.mud-timeline-vertical.mud-timeline-position-end::before{right:47px;left:auto}.mud-timeline-vertical.mud-timeline-position-end.mud-timeline-rtl::before{left:47px;right:auto}.mud-timeline-vertical.mud-timeline-position-end .mud-timeline-item{flex-direction:row}.mud-timeline-vertical.mud-timeline-position-start .mud-timeline-item-content,.mud-timeline-vertical.mud-timeline-position-end .mud-timeline-item-content{max-width:calc(100% - 96px)}.mud-timeline-vertical.mud-timeline-position-start .mud-timeline-item-opposite,.mud-timeline-vertical.mud-timeline-position-end .mud-timeline-item-opposite{display:none}.mud-timeline-horizontal{flex-direction:row}.mud-timeline-horizontal .mud-timeline-item{padding:0 24px;width:100%;min-width:0}.mud-timeline-horizontal .mud-timeline-item .mud-timeline-item-content{max-height:calc(50% - 48px)}.mud-timeline-horizontal .mud-timeline-item .mud-timeline-item-divider{min-height:96px}.mud-timeline-horizontal::before{top:0;bottom:0;content:"";height:2px;position:absolute;width:100%;background:var(--mud-palette-divider)}.mud-timeline-horizontal.mud-timeline-align-start .mud-timeline-item-divider{justify-content:flex-start}.mud-timeline-horizontal.mud-timeline-align-start .mud-timeline-item-opposite{align-self:flex-start}.mud-timeline-horizontal.mud-timeline-align-end .mud-timeline-item-divider{justify-content:flex-end}.mud-timeline-horizontal.mud-timeline-align-end .mud-timeline-item-opposite{align-self:flex-end}.mud-timeline-horizontal.mud-timeline-position-alternate::before{top:auto;bottom:calc(50% - 1px)}.mud-timeline-horizontal.mud-timeline-position-alternate .mud-timeline-item:nth-child(odd),.mud-timeline-horizontal.mud-timeline-position-alternate .mud-timeline-item.mud-timeline-item-end{flex-direction:column-reverse}.mud-timeline-horizontal.mud-timeline-position-alternate .mud-timeline-item:nth-child(2n),.mud-timeline-horizontal.mud-timeline-position-alternate .mud-timeline-item.mud-timeline-item-start{flex-direction:column}.mud-timeline-horizontal.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item:nth-child(odd),.mud-timeline-horizontal.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item.mud-timeline-item-end{flex-direction:column}.mud-timeline-horizontal.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item:nth-child(2n),.mud-timeline-horizontal.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item.mud-timeline-item-start{flex-direction:column-reverse}.mud-timeline-horizontal.mud-timeline-position-top::before{top:47px;bottom:auto}.mud-timeline-horizontal.mud-timeline-position-top .mud-timeline-item{flex-direction:column-reverse}.mud-timeline-horizontal.mud-timeline-position-bottom::before{top:auto;bottom:47px}.mud-timeline-horizontal.mud-timeline-position-bottom .mud-timeline-item{flex-direction:column}.mud-timeline-horizontal.mud-timeline-position-top .mud-timeline-item-content,.mud-timeline-horizontal.mud-timeline-position-bottom .mud-timeline-item-content{max-height:calc(100% - 96px)}.mud-timeline-horizontal.mud-timeline-position-top .mud-timeline-item-opposite,.mud-timeline-horizontal.mud-timeline-position-bottom .mud-timeline-item-opposite{display:none}.mud-timeline-item-dot{display:flex;justify-content:center;align-items:center;background:var(--mud-palette-surface);border-radius:50%;left:calc(50% - 19px)}.mud-timeline-item-dot.mud-timeline-dot-size-small{width:24px;height:24px}.mud-timeline-item-dot.mud-timeline-dot-size-small .mud-timeline-item-dot-inner{height:18px;width:18px}.mud-timeline-item-dot.mud-timeline-dot-size-medium{width:38px;height:38px}.mud-timeline-item-dot.mud-timeline-dot-size-medium .mud-timeline-item-dot-inner{height:30px;width:30px}.mud-timeline-item-dot.mud-timeline-dot-size-large{width:52px;height:52px}.mud-timeline-item-dot.mud-timeline-dot-size-large .mud-timeline-item-dot-inner{height:42px;width:42px}.mud-timeline-item-dot .mud-timeline-item-dot-inner{border-radius:50%;display:flex;justify-content:center;align-items:center}.mud-timeline-item-dot .mud-timeline-item-dot-inner.mud-timeline-dot-fill{height:inherit;width:inherit}.mud-timeline-item-dot .mud-timeline-item-dot-inner.mud-timeline-dot-default{background-color:var(--mud-palette-gray-light)}.mud-timeline-item-dot .mud-timeline-item-dot-inner.mud-timeline-dot-primary{color:var(--mud-palette-primary-text);background-color:var(--mud-palette-primary)}.mud-timeline-item-dot .mud-timeline-item-dot-inner.mud-timeline-dot-secondary{color:var(--mud-palette-secondary-text);background-color:var(--mud-palette-secondary)}.mud-timeline-item-dot .mud-timeline-item-dot-inner.mud-timeline-dot-tertiary{color:var(--mud-palette-tertiary-text);background-color:var(--mud-palette-tertiary)}.mud-timeline-item-dot .mud-timeline-item-dot-inner.mud-timeline-dot-info{color:var(--mud-palette-info-text);background-color:var(--mud-palette-info)}.mud-timeline-item-dot .mud-timeline-item-dot-inner.mud-timeline-dot-success{color:var(--mud-palette-success-text);background-color:var(--mud-palette-success)}.mud-timeline-item-dot .mud-timeline-item-dot-inner.mud-timeline-dot-warning{color:var(--mud-palette-warning-text);background-color:var(--mud-palette-warning)}.mud-timeline-item-dot .mud-timeline-item-dot-inner.mud-timeline-dot-error{color:var(--mud-palette-error-text);background-color:var(--mud-palette-error)}.mud-timeline-item-dot .mud-timeline-item-dot-inner.mud-timeline-dot-dark{color:var(--mud-palette-dark-text);background-color:var(--mud-palette-dark)}.mud-timeline-modifiers .mud-timeline-item-content .mud-card::before{content:"";position:absolute;border-top:16px solid rgba(0,0,0,0);border-bottom:16px solid rgba(0,0,0,0);border-right:16px solid rgba(0,0,0,.1);top:calc(50% - 14px)}.mud-timeline-modifiers .mud-timeline-item-content .mud-card::after{content:"";position:absolute;border-top:16px solid rgba(0,0,0,0);border-bottom:16px solid rgba(0,0,0,0);border-right:16px solid var(--mud-palette-surface);top:calc(50% - 16px)}.mud-timeline-modifiers .mud-timeline-item-content .mud-card.mud-paper-outlined::before{top:calc(50% - 16px);border-right-color:var(--mud-palette-lines-default)}.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-start:not(.mud-timeline-rtl) .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-start:not(.mud-timeline-rtl) .mud-timeline-item-content .mud-card::after,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-end.mud-timeline-rtl .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-end.mud-timeline-rtl .mud-timeline-item-content .mud-card::after{transform:rotate(0);left:-16px;right:auto}.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-start:not(.mud-timeline-rtl) .mud-timeline-item-content .mud-card.mud-paper-outlined::after,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-end.mud-timeline-rtl .mud-timeline-item-content .mud-card.mud-paper-outlined::after{left:-15px}.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-end:not(.mud-timeline-rtl) .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-end:not(.mud-timeline-rtl) .mud-timeline-item-content .mud-card::after,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-start.mud-timeline-rtl .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-start.mud-timeline-rtl .mud-timeline-item-content .mud-card::after{transform:rotate(180deg);right:-16px;left:auto}.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-end:not(.mud-timeline-rtl) .mud-timeline-item-content .mud-card.mud-paper-outlined::after,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-start.mud-timeline-rtl .mud-timeline-item-content .mud-card.mud-paper-outlined::after{right:-15px}.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-start) .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-start) .mud-timeline-item-content .mud-card::after,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate .mud-timeline-item.mud-timeline-item-end .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate .mud-timeline-item.mud-timeline-item-end .mud-timeline-item-content .mud-card::after{transform:rotate(0);left:-16px;right:auto}.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-start) .mud-timeline-item-content .mud-card.mud-paper-outlined::after,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate .mud-timeline-item.mud-timeline-item-end .mud-timeline-item-content .mud-card.mud-paper-outlined::after{left:-15px}.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-end) .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-end) .mud-timeline-item-content .mud-card::after{transform:rotate(180deg);right:-16px;left:auto}.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-end) .mud-timeline-item-content .mud-card.mud-paper-outlined::after{right:-15px}.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-reverse:not(.mud-timeline-rtl) .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-end) .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-reverse:not(.mud-timeline-rtl) .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-end) .mud-timeline-item-content .mud-card::after,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-reverse:not(.mud-timeline-rtl) .mud-timeline-item.mud-timeline-item-start .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-reverse:not(.mud-timeline-rtl) .mud-timeline-item.mud-timeline-item-start .mud-timeline-item-content .mud-card::after,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate.mud-timeline-rtl:not(.mud-timeline-reverse) .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-end) .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate.mud-timeline-rtl:not(.mud-timeline-reverse) .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-end) .mud-timeline-item-content .mud-card::after,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate.mud-timeline-rtl:not(.mud-timeline-reverse) .mud-timeline-item.mud-timeline-item-start .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate.mud-timeline-rtl:not(.mud-timeline-reverse) .mud-timeline-item.mud-timeline-item-start .mud-timeline-item-content .mud-card::after{transform:rotate(180deg);right:-16px;left:auto}.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-reverse:not(.mud-timeline-rtl) .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-end) .mud-timeline-item-content .mud-card.mud-paper-outlined::after,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-reverse:not(.mud-timeline-rtl) .mud-timeline-item.mud-timeline-item-start .mud-timeline-item-content .mud-card.mud-paper-outlined::after,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate.mud-timeline-rtl:not(.mud-timeline-reverse) .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-end) .mud-timeline-item-content .mud-card.mud-paper-outlined::after,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate.mud-timeline-rtl:not(.mud-timeline-reverse) .mud-timeline-item.mud-timeline-item-start .mud-timeline-item-content .mud-card.mud-paper-outlined::after{right:-15px}.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-reverse:not(.mud-timeline-rtl) .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-start) .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-reverse:not(.mud-timeline-rtl) .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-start) .mud-timeline-item-content .mud-card::after,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate.mud-timeline-rtl:not(.mud-timeline-reverse) .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-start) .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate.mud-timeline-rtl:not(.mud-timeline-reverse) .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-start) .mud-timeline-item-content .mud-card::after{transform:rotate(0);left:-16px;right:auto}.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-reverse:not(.mud-timeline-rtl) .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-start) .mud-timeline-item-content .mud-card.mud-paper-outlined::after,.mud-timeline-modifiers.mud-timeline-vertical.mud-timeline-position-alternate.mud-timeline-rtl:not(.mud-timeline-reverse) .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-start) .mud-timeline-item-content .mud-card.mud-paper-outlined::after{left:-15px}.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-top .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-top .mud-timeline-item-content .mud-card::after{transform:rotate(90deg);top:-24px;bottom:auto;left:calc(50% - 8px)}.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-top .mud-timeline-item-content .mud-card.mud-paper-outlined::after{top:-23px}.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-bottom .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-bottom .mud-timeline-item-content .mud-card::after{transform:rotate(270deg);bottom:-24px;top:auto;left:calc(50% - 8px)}.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-bottom .mud-timeline-item-content .mud-card.mud-paper-outlined::after{bottom:-23px}.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-start) .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-start) .mud-timeline-item-content .mud-card::after,.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate .mud-timeline-item.mud-timeline-item-end .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate .mud-timeline-item.mud-timeline-item-end .mud-timeline-item-content .mud-card::after{transform:rotate(90deg);top:-24px;bottom:auto;left:calc(50% - 8px)}.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-start) .mud-timeline-item-content .mud-card.mud-paper-outlined::after,.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate .mud-timeline-item.mud-timeline-item-end .mud-timeline-item-content .mud-card.mud-paper-outlined::after{top:-23px}.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-end) .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-end) .mud-timeline-item-content .mud-card::after{transform:rotate(270deg);bottom:-24px;top:auto;left:calc(50% - 8px)}.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-end) .mud-timeline-item-content .mud-card.mud-paper-outlined::after{bottom:-23px}.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-start) .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-start) .mud-timeline-item-content .mud-card::after,.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item.mud-timeline-item-end .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item.mud-timeline-item-end .mud-timeline-item-content .mud-card::after{transform:rotate(270deg);bottom:-24px;top:auto;left:calc(50% - 8px)}.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item:nth-child(odd):not(.mud-timeline-item-start) .mud-timeline-item-content .mud-card.mud-paper-outlined::after,.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item.mud-timeline-item-end .mud-timeline-item-content .mud-card.mud-paper-outlined::after{bottom:-23px}.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-end) .mud-timeline-item-content .mud-card::before,.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-end) .mud-timeline-item-content .mud-card::after{transform:rotate(90deg);top:-24px;bottom:auto;left:calc(50% - 8px)}.mud-timeline-modifiers.mud-timeline-horizontal.mud-timeline-position-alternate.mud-timeline-reverse .mud-timeline-item:nth-child(2n):not(.mud-timeline-item-end) .mud-timeline-item-content .mud-card.mud-paper-outlined::after{top:-23px}.mud-typography{margin:0}.mud-typography-h1{font-size:var(--mud-typography-h1-size);font-family:var(--mud-typography-h1-family);font-weight:var(--mud-typography-h1-weight);line-height:var(--mud-typography-h1-lineheight);letter-spacing:var(--mud-typography-h1-letterspacing);text-transform:var(--mud-typography-h1-text-transform)}.mud-typography-h2{font-size:var(--mud-typography-h2-size);font-family:var(--mud-typography-h2-family);font-weight:var(--mud-typography-h2-weight);line-height:var(--mud-typography-h2-lineheight);letter-spacing:var(--mud-typography-h2-letterspacing);text-transform:var(--mud-typography-h2-text-transform)}.mud-typography-h3{font-size:var(--mud-typography-h3-size);font-family:var(--mud-typography-h3-family);font-weight:var(--mud-typography-h3-weight);line-height:var(--mud-typography-h3-lineheight);letter-spacing:var(--mud-typography-h3-letterspacing);text-transform:var(--mud-typography-h3-text-transform)}.mud-typography-h4{font-size:var(--mud-typography-h4-size);font-family:var(--mud-typography-h4-family);font-weight:var(--mud-typography-h4-weight);line-height:var(--mud-typography-h4-lineheight);letter-spacing:var(--mud-typography-h4-letterspacing);text-transform:var(--mud-typography-h4-text-transform)}.mud-typography-h5{font-size:var(--mud-typography-h5-size);font-family:var(--mud-typography-h5-family);font-weight:var(--mud-typography-h5-weight);line-height:var(--mud-typography-h5-lineheight);letter-spacing:var(--mud-typography-h5-letterspacing);text-transform:var(--mud-typography-h5-text-transform)}.mud-typography-h6{font-size:var(--mud-typography-h6-size);font-family:var(--mud-typography-h6-family);font-weight:var(--mud-typography-h6-weight);line-height:var(--mud-typography-h6-lineheight);letter-spacing:var(--mud-typography-h6-letterspacing);text-transform:var(--mud-typography-h6-text-transform)}.mud-typography-subtitle1{font-size:var(--mud-typography-subtitle1-size);font-family:var(--mud-typography-subtitle1-family);font-weight:var(--mud-typography-subtitle1-weight);line-height:var(--mud-typography-subtitle1-lineheight);letter-spacing:var(--mud-typography-subtitle1-letterspacing);text-transform:var(--mud-typography-subtitle1-text-transform)}.mud-typography-subtitle2{font-size:var(--mud-typography-subtitle2-size);font-family:var(--mud-typography-subtitle2-family);font-weight:var(--mud-typography-subtitle2-weight);line-height:var(--mud-typography-subtitle2-lineheight);letter-spacing:var(--mud-typography-subtitle2-letterspacing);text-transform:var(--mud-typography-subtitle2-text-transform)}.mud-typography-body1{font-size:var(--mud-typography-body1-size);font-family:var(--mud-typography-body1-family);font-weight:var(--mud-typography-body1-weight);line-height:var(--mud-typography-body1-lineheight);letter-spacing:var(--mud-typography-body1-letterspacing);text-transform:var(--mud-typography-body1-text-transform)}.mud-typography-body2{font-size:var(--mud-typography-body2-size);font-family:var(--mud-typography-body2-family);font-weight:var(--mud-typography-body2-weight);line-height:var(--mud-typography-body2-lineheight);letter-spacing:var(--mud-typography-body2-letterspacing);text-transform:var(--mud-typography-body2-text-transform)}.mud-typography-button{font-size:var(--mud-typography-button-size);font-family:var(--mud-typography-button-family);font-weight:var(--mud-typography-button-weight);line-height:var(--mud-typography-button-lineheight);letter-spacing:var(--mud-typography-button-letterspacing);text-transform:var(--mud-typography-button-text-transform)}.mud-typography-caption{font-size:var(--mud-typography-caption-size);font-family:var(--mud-typography-caption-family);font-weight:var(--mud-typography-caption-weight);line-height:var(--mud-typography-caption-lineheight);letter-spacing:var(--mud-typography-caption-letterspacing);text-transform:var(--mud-typography-caption-text-transform)}.mud-typography-overline{font-size:var(--mud-typography-overline-size);font-family:var(--mud-typography-overline-family);font-weight:var(--mud-typography-overline-weight);line-height:var(--mud-typography-overline-lineheight);letter-spacing:var(--mud-typography-overline-letterspacing);text-transform:var(--mud-typography-overline-text-transform)}.mud-typography-srOnly{width:1px;height:1px;overflow:hidden;position:absolute}.mud-typography-align-left{text-align:left}.mud-typography-align-center{text-align:center}.mud-typography-align-right{text-align:right}.mud-typography-align-justify{text-align:justify}.mud-typography-nowrap{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.mud-typography-gutterbottom{margin-bottom:.35em}.mud-typography-paragraph{margin-bottom:16px}.mud-table{color:var(--mud-palette-text-primary);background-color:var(--mud-palette-surface);border-radius:var(--mud-default-borderradius);transition:box-shadow 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-table.mud-table-square{border-radius:0px}.mud-table.mud-table-outlined{border:1px solid var(--mud-palette-lines-default)}.mud-table-container{width:100%;overflow-y:auto}.mud-table-root{width:100%;border-spacing:0}.mud-table-root .mud-table-head{display:table-header-group}.mud-table-root .mud-table-head .mud-table-cell{color:var(--mud-palette-text-primary);font-weight:500;line-height:1.5rem}@media(hover: hover)and (pointer: fine){.mud-table-root .mud-table-head .mud-table-cell .mud-button-root:hover{color:var(--mud-palette-action-default)}.mud-table-root .mud-table-head .mud-table-cell .mud-button-root:hover .mud-table-sort-label-icon{opacity:.8}}.mud-table-root .mud-table-body{display:table-row-group}.mud-table-root .mud-table-body .mud-table-cell{color:var(--mud-palette-text-primary)}.mud-table-root>.mud-table-body:last-child>.mud-table-row:last-child>.mud-table-cell,.mud-table-root>.mud-table-foot:last-child>.mud-table-row:last-child>.mud-table-cell{border-bottom:none}.mud-table-sort-label{user-select:auto;display:inline-flex;align-items:center;flex-direction:inherit;justify-content:flex-start}.mud-table-sort-label .mud-table-sort-label-icon{font-size:18px;transition:opacity 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,transform 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;margin-left:4px;user-select:none;margin-right:4px;opacity:0}.mud-table-sort-label .mud-table-sort-label-icon.mud-direction-desc{opacity:1;transform:rotate(180deg)}.mud-table-sort-label .mud-table-sort-label-icon.mud-direction-asc{opacity:1;transform:rotate(0deg)}.mud-table-toolbar{left:0;position:sticky;padding-left:16px;padding-right:8px;padding-inline-start:16px;padding-inline-end:8px}.mud-table-cell{display:table-cell;padding:16px;font-size:.875rem;text-align:start;font-weight:400;line-height:1.43;border-bottom:1px solid var(--mud-palette-table-lines);letter-spacing:.01071em;vertical-align:inherit}.mud-table-cell .mud-checkbox{margin:-4px}.mud-table-cell .mud-checkbox>.mud-icon-button{padding:4px}.mud-table-cell>.mud-input-control>div.mud-input.mud-input-text{color:var(--mud-theme-on-surface);font-size:.875rem;margin-top:-14px;margin-bottom:-8px}.mud-table-cell>.mud-select>.mud-input-control>div.mud-input.mud-input-text{color:var(--mud-theme-on-surface);font-size:.875rem;margin-top:-14px;margin-bottom:-8px}.mud-table-cell-footer{color:var(--mud-palette-text-secondary);font-size:.75rem;line-height:1.3125rem}.mud-table-dense * .mud-table-row .mud-table-cell{padding:6px 24px 6px 16px;padding-inline-start:16px;padding-inline-end:24px}.mud-table-dense * .mud-table-row .mud-table-cell .mud-table-cell-checkbox .mud-button-root{padding:4px}.mud-table-dense * .mud-table-row .mud-table-cell .mud-table-row-expander{padding:4px}.mud-table-dense * .mud-table-row .mud-table-cell:last-child{padding-right:16px;padding-inline-end:16px}.mud-table-bordered .mud-table-container .mud-table-root .mud-table-body .mud-table-row .mud-table-cell:not(:last-child){border-right:1px solid var(--mud-palette-table-lines)}.mud-table-bordered .mud-table-container .mud-table-root .mud-table-head.table-head-bordered .mud-table-row .mud-table-cell:not(:last-child){border-right:1px solid var(--mud-palette-table-lines)}.mud-table-bordered .mud-table-container .mud-table-root .mud-table-foot.table-foot-bordered .mud-table-row .mud-table-cell:not(:last-child){border-right:1px solid var(--mud-palette-table-lines)}.mud-application-layout-rtl .mud-table-bordered .mud-table-container .mud-table-root .mud-table-body .mud-table-row .mud-table-cell:first-child{border-right:none;border-top-right-radius:0px}.mud-application-layout-rtl .mud-table-bordered .mud-table-container .mud-table-root .mud-table-body .mud-table-row .mud-table-cell:last-child{border-right:1px solid var(--mud-palette-table-lines);border-top-right-radius:0px}.mud-application-layout-rtl .mud-table-bordered .mud-table-container .mud-table-root .mud-table-head.table-head-bordered .mud-table-row .mud-table-cell:last-child{border-right:1px solid var(--mud-palette-table-lines);border-top-right-radius:0px}.mud-application-layout-rtl .mud-table-bordered .mud-table-container .mud-table-root .mud-table-head.table-head-bordered .mud-table-row .mud-table-cell:only-child{border-right:none;border-top-right-radius:var(--mud-default-borderradius)}.mud-application-layout-rtl .mud-table-bordered .mud-table-container .mud-table-root .mud-table-head .mud-table-row th.mud-table-cell:first-child{border-right:none;border-top-right-radius:var(--mud-default-borderradius)}.mud-application-layout-rtl .mud-table-bordered .mud-table-container .mud-table-root .mud-table-foot.table-foot-bordered .mud-table-row .mud-table-cell:last-child{border-right:1px solid var(--mud-palette-table-lines);border-top-right-radius:0px}.mud-application-layout-rtl .mud-table-bordered .mud-table-container .mud-table-root .mud-table-foot .mud-table-row .mud-table-cell:first-child{border-right:none}.mud-table-sticky-header .mud-table-container{overflow-x:auto}.mud-table-sticky-header * .mud-table-root .mud-table-head * .mud-table-cell:first-child{border-radius:var(--mud-default-borderradius) 0px 0px 0px}.mud-table-sticky-header * .mud-table-root .mud-table-head * .mud-table-cell:last-child{border-radius:0px var(--mud-default-borderradius) 0px 0px}.mud-table-sticky-header * .mud-table-root .mud-table-head * .mud-table-cell{background-color:var(--mud-palette-surface);position:sticky;z-index:2;top:0}.mud-table-sticky-header * .mud-table-root .mud-table-head * .mud-table-loading{background-color:var(--mud-palette-surface);position:sticky;z-index:2;top:59px}.mud-table-sticky-header * .mud-table-root .mud-table-head * .mud-filter-panel-cell{top:59px}table:has(.mud-table-loading) .mud-table-sticky-header * .mud-table-root .mud-table-head * .mud-filter-panel-cell{top:63px}.mud-table-sticky-header * .mud-table-root .mud-table-head * .mud-table-cell.sticky-left,.mud-table-sticky-header * .mud-table-root .mud-table-head * .mud-table-cell.sticky-right{z-index:3;background-color:var(--mud-palette-background-gray)}.mud-table-sticky-header.mud-table-dense * .mud-table-root .mud-table-head * .mud-table-loading{top:39px}.mud-table-sticky-header.mud-table-dense * .mud-table-root .mud-table-head * .mud-filter-panel-cell{top:39px}table:has(.mud-table-loading) .mud-table-sticky-header.mud-table-dense * .mud-table-root .mud-table-head * .mud-filter-panel-cell{top:43px}.mud-table-sticky-footer .mud-table-container{overflow-x:auto}.mud-table-sticky-footer * .mud-table-root .mud-table-foot{position:sticky;z-index:2;bottom:0}.mud-table-sticky-footer * .mud-table-root .mud-table-foot * .mud-table-cell{background-color:var(--mud-palette-surface)}.mud-table-row{color:inherit;display:table-row;outline:0;vertical-align:middle}@media(hover: hover)and (pointer: fine){.mud-table-hover .mud-table-container .mud-table-root .mud-table-body .mud-table-row:hover{background-color:var(--mud-palette-table-hover)}}.mud-table-striped .mud-table-container .mud-table-root .mud-table-body .mud-table-row:nth-of-type(odd){background-color:var(--mud-palette-table-striped)}@media(hover: hover)and (pointer: fine){.mud-table-hover.mud-table-striped .mud-table-container .mud-table-root .mud-table-body .mud-table-row:nth-of-type(odd):hover{background-color:var(--mud-palette-table-hover)}}.mud-table-cell-align-left{text-align:left}.mud-table-cell-align-center{text-align:center}.mud-table-cell-align-right{text-align:right;flex-direction:row-reverse}.mud-table-cell-align-justify{text-align:justify}.mud-table-pagination-display{display:flex;flex-shrink:0}.mud-table-pagination-display .mud-tablepager-left{flex-direction:row !important}.mud-table-pagination-display .mud-tablepager-right{flex-direction:row-reverse !important}.mud-table-pagination-information{white-space:nowrap;direction:initial}.mud-table-page-number-information{white-space:nowrap;direction:initial}.mud-table-pagination{color:var(--mud-theme-on-surface);overflow:auto;font-size:.875rem;display:initial;position:sticky;left:0}.mud-table-pagination:last-child{padding:0}.mud-table-pagination-toolbar{border-top:1px solid var(--mud-palette-table-lines);height:52px;padding-right:2px;padding-inline-end:2px;padding-inline-start:unset;flex-wrap:nowrap}.mud-table-pagination-toolbar .mud-tablepager-left{flex-direction:row !important}.mud-table-pagination-toolbar .mud-tablepager-right{flex-direction:row-reverse !important}.mud-table-pagination-spacer{flex:1 1 100%}.mud-table-pagination-caption{display:flex;flex-shrink:0;align-items:center;padding-left:10px;padding-right:10px}.mud-table-pagination-select{cursor:pointer;margin-left:10px !important;margin-right:10px !important;margin-top:0px !important;min-width:52px}.mud-table-pagination-select .mud-select-input{margin-top:0px !important;padding:0 7px !important}.mud-table-pagination-select .mud-input .mud-input-root{max-width:80px;cursor:pointer;margin-top:2px;border:none;font-size:.875rem;font-weight:400;line-height:1.43;letter-spacing:.01071em;color:var(--mud-theme-on-surface)}.mud-table-pagination-actions{flex-shrink:0;align-items:center;margin-left:10px;margin-inline-start:10px;margin-inline-end:unset}.mud-table-smalldevices-sortselect{display:none}.mud-table-loading{position:relative}.mud-table-loading .mud-table-loading-progress{width:100%}.mud-table-empty-row{background-color:var(--mud-palette-surface);vertical-align:middle;text-align:center}tr.mud-table-row-group-indented-1 td:first-child{padding-left:48px !important}tr.mud-table-row-group-indented-2 td:first-child{padding-left:96px !important}tr.mud-table-row-group-indented-3 td:first-child{padding-left:144px !important}tr.mud-table-row-group-indented-4 td:first-child{padding-left:192px !important}tr.mud-table-row-group-indented-5 td:first-child{padding-left:240px !important}.mud-table-row-expander{margin-top:-12px;margin-bottom:-12px;margin-inline-start:-12px;margin-inline-end:-2px}@media(max-width: 360px){.mud-table .mud-table-pagination .mud-select{margin-left:auto;margin-right:-14px;margin-inline-start:auto;margin-inline-end:-14px}.mud-table .mud-table-pagination .mud-select~.mud-table-pagination-caption{margin-left:unset !important;margin-inline-start:unset !important}}@media(max-width: 416px){.mud-table .mud-table-pagination .mud-table-pagination-toolbar{flex-wrap:wrap;padding-top:16px;padding-right:16px;padding-inline-end:16px;padding-inline-start:unset;min-height:100px}.mud-table .mud-table-pagination .mud-table-pagination-toolbar .mud-table-pagination-actions{margin-left:auto;margin-right:-14px;margin-inline-start:auto;margin-inline-end:-14px}}@media(max-width: 600px){.mud-xs-table .mud-table-root .mud-table-head,.mud-xs-table .mud-table-root .mud-table-foot{display:none}.mud-xs-table .mud-table-smalldevices-sortselect{display:block;padding:4px 16px 8px}.mud-xs-table .mud-table-body{border-top:1px solid var(--mud-palette-table-lines)}.mud-xs-table .mud-table-row{display:revert}.mud-xs-table .mud-table-row .mud-table-cell:last-child{border-bottom:1px solid var(--mud-palette-table-lines)}.mud-xs-table .mud-table-cell{display:flex;justify-content:space-between;align-items:center;border:none;padding:14px 16px;text-align:start !important}.mud-xs-table.mud-table-dense .mud-table-cell{padding:6px 16px}.mud-xs-table .mud-table-cell:before{content:attr(data-label);font-weight:500;padding-right:16px;padding-inline-end:16px;padding-inline-start:unset}.mud-xs-table.mud-table-small-alignright .mud-table-cell:before{margin-right:auto}.mud-xs-table .mud-table-cell-hide{visibility:collapse;height:0;padding:0;margin:0}.mud-xs-table .mud-table-pagination .mud-table-pagination-spacer{flex:none}.mud-xs-table .mud-table-pagination .mud-table-pagination-actions .mud-button-root:first-child{display:none}.mud-xs-table .mud-table-pagination .mud-table-pagination-actions .mud-button-root:last-child{display:none}.mud-xs-table .mud-table-pagination .mud-select~.mud-table-pagination-caption{margin-left:auto;margin-inline-start:auto}.mud-xs-table.mud-table-bordered .mud-table-container .mud-table-root colgroup~.mud-table-body .mud-table-row .mud-table-cell{border-right:1px solid var(--mud-palette-table-lines) !important}.mud-xs-table.mud-table-bordered .mud-table-container .mud-table-root .mud-table-body .mud-table-row .mud-table-cell{border-right:none !important}}@media(max-width: 960px){.mud-sm-table .mud-table-root .mud-table-head,.mud-sm-table .mud-table-root .mud-table-foot{display:none}.mud-sm-table .mud-table-smalldevices-sortselect{display:block;padding:4px 16px 8px}.mud-sm-table .mud-table-body{border-top:1px solid var(--mud-palette-table-lines)}.mud-sm-table .mud-table-row{display:revert}.mud-sm-table .mud-table-row .mud-table-cell:last-child{border-bottom:1px solid var(--mud-palette-table-lines)}.mud-sm-table .mud-table-cell{display:flex;justify-content:space-between;align-items:center;border:none;padding:14px 16px;text-align:start !important}.mud-sm-table.mud-table-dense .mud-table-cell{padding:6px 16px}.mud-sm-table .mud-table-cell:before{content:attr(data-label);font-weight:500;padding-right:16px;padding-inline-end:16px;padding-inline-start:unset}.mud-sm-table.mud-table-small-alignright .mud-table-cell:before{margin-right:auto}.mud-sm-table .mud-table-cell-hide{visibility:collapse;height:0;padding:0;margin:0}.mud-sm-table .mud-table-pagination .mud-table-pagination-spacer{flex:none}.mud-sm-table .mud-table-pagination .mud-table-pagination-actions .mud-button-root:first-child{display:none}.mud-sm-table .mud-table-pagination .mud-table-pagination-actions .mud-button-root:last-child{display:none}.mud-sm-table .mud-table-pagination .mud-select~.mud-table-pagination-caption{margin-left:auto;margin-inline-start:auto}.mud-sm-table.mud-table-bordered .mud-table-container .mud-table-root colgroup~.mud-table-body .mud-table-row .mud-table-cell{border-right:1px solid var(--mud-palette-table-lines) !important}.mud-sm-table.mud-table-bordered .mud-table-container .mud-table-root .mud-table-body .mud-table-row .mud-table-cell{border-right:none !important}}@media(max-width: 1280px){.mud-md-table .mud-table-root .mud-table-head,.mud-md-table .mud-table-root .mud-table-foot{display:none}.mud-md-table .mud-table-smalldevices-sortselect{display:block;padding:4px 16px 8px}.mud-md-table .mud-table-body{border-top:1px solid var(--mud-palette-table-lines)}.mud-md-table .mud-table-row{display:revert}.mud-md-table .mud-table-row .mud-table-cell:last-child{border-bottom:1px solid var(--mud-palette-table-lines)}.mud-md-table .mud-table-cell{display:flex;justify-content:space-between;align-items:center;border:none;padding:14px 16px;text-align:start !important}.mud-md-table.mud-table-dense .mud-table-cell{padding:6px 16px}.mud-md-table .mud-table-cell:before{content:attr(data-label);font-weight:500;padding-right:16px;padding-inline-end:16px;padding-inline-start:unset}.mud-md-table.mud-table-small-alignright .mud-table-cell:before{margin-right:auto}.mud-md-table .mud-table-cell-hide{visibility:collapse;height:0;padding:0;margin:0}.mud-md-table .mud-table-pagination .mud-table-pagination-spacer{flex:none}.mud-md-table .mud-table-pagination .mud-table-pagination-actions .mud-button-root:first-child{display:none}.mud-md-table .mud-table-pagination .mud-table-pagination-actions .mud-button-root:last-child{display:none}.mud-md-table .mud-table-pagination .mud-select~.mud-table-pagination-caption{margin-left:auto;margin-inline-start:auto}.mud-md-table.mud-table-bordered .mud-table-container .mud-table-root colgroup~.mud-table-body .mud-table-row .mud-table-cell{border-right:1px solid var(--mud-palette-table-lines) !important}.mud-md-table.mud-table-bordered .mud-table-container .mud-table-root .mud-table-body .mud-table-row .mud-table-cell{border-right:none !important}}@media(max-width: 1920px){.mud-lg-table .mud-table-root .mud-table-head,.mud-lg-table .mud-table-root .mud-table-foot{display:none}.mud-lg-table .mud-table-smalldevices-sortselect{display:block;padding:4px 16px 8px}.mud-lg-table .mud-table-body{border-top:1px solid var(--mud-palette-table-lines)}.mud-lg-table .mud-table-row{display:revert}.mud-lg-table .mud-table-row .mud-table-cell:last-child{border-bottom:1px solid var(--mud-palette-table-lines)}.mud-lg-table .mud-table-cell{display:flex;justify-content:space-between;align-items:center;border:none;padding:14px 16px;text-align:start !important}.mud-lg-table.mud-table-dense .mud-table-cell{padding:6px 16px}.mud-lg-table .mud-table-cell:before{content:attr(data-label);font-weight:500;padding-right:16px;padding-inline-end:16px;padding-inline-start:unset}.mud-lg-table.mud-table-small-alignright .mud-table-cell:before{margin-right:auto}.mud-lg-table .mud-table-cell-hide{visibility:collapse;height:0;padding:0;margin:0}.mud-lg-table .mud-table-pagination .mud-table-pagination-spacer{flex:none}.mud-lg-table .mud-table-pagination .mud-table-pagination-actions .mud-button-root:first-child{display:none}.mud-lg-table .mud-table-pagination .mud-table-pagination-actions .mud-button-root:last-child{display:none}.mud-lg-table .mud-table-pagination .mud-select~.mud-table-pagination-caption{margin-left:auto;margin-inline-start:auto}.mud-lg-table.mud-table-bordered .mud-table-container .mud-table-root colgroup~.mud-table-body .mud-table-row .mud-table-cell{border-right:1px solid var(--mud-palette-table-lines) !important}.mud-lg-table.mud-table-bordered .mud-table-container .mud-table-root .mud-table-body .mud-table-row .mud-table-cell{border-right:none !important}}@media(max-width: 2560px){.mud-xl-table .mud-table-root .mud-table-head,.mud-xl-table .mud-table-root .mud-table-foot{display:none}.mud-xl-table .mud-table-smalldevices-sortselect{display:block;padding:4px 16px 8px}.mud-xl-table .mud-table-body{border-top:1px solid var(--mud-palette-table-lines)}.mud-xl-table .mud-table-row{display:revert}.mud-xl-table .mud-table-row .mud-table-cell:last-child{border-bottom:1px solid var(--mud-palette-table-lines)}.mud-xl-table .mud-table-cell{display:flex;justify-content:space-between;align-items:center;border:none;padding:14px 16px;text-align:start !important}.mud-xl-table.mud-table-dense .mud-table-cell{padding:6px 16px}.mud-xl-table .mud-table-cell:before{content:attr(data-label);font-weight:500;padding-right:16px;padding-inline-end:16px;padding-inline-start:unset}.mud-xl-table.mud-table-small-alignright .mud-table-cell:before{margin-right:auto}.mud-xl-table .mud-table-cell-hide{visibility:collapse;height:0;padding:0;margin:0}.mud-xl-table .mud-table-pagination .mud-table-pagination-spacer{flex:none}.mud-xl-table .mud-table-pagination .mud-table-pagination-actions .mud-button-root:first-child{display:none}.mud-xl-table .mud-table-pagination .mud-table-pagination-actions .mud-button-root:last-child{display:none}.mud-xl-table .mud-table-pagination .mud-select~.mud-table-pagination-caption{margin-left:auto;margin-inline-start:auto}.mud-xl-table.mud-table-bordered .mud-table-container .mud-table-root colgroup~.mud-table-body .mud-table-row .mud-table-cell{border-right:1px solid var(--mud-palette-table-lines) !important}.mud-xl-table.mud-table-bordered .mud-table-container .mud-table-root .mud-table-body .mud-table-row .mud-table-cell{border-right:none !important}}@media(min-width: 2560px){.mud-xxl-table .mud-table-root .mud-table-head,.mud-xxl-table .mud-table-root .mud-table-foot{display:none}.mud-xxl-table .mud-table-smalldevices-sortselect{display:block;padding:4px 16px 8px}.mud-xxl-table .mud-table-body{border-top:1px solid var(--mud-palette-table-lines)}.mud-xxl-table .mud-table-row{display:revert}.mud-xxl-table .mud-table-row .mud-table-cell:last-child{border-bottom:1px solid var(--mud-palette-table-lines)}.mud-xxl-table .mud-table-cell{display:flex;justify-content:space-between;align-items:center;border:none;padding:14px 16px;text-align:start !important}.mud-xxl-table.mud-table-dense .mud-table-cell{padding:6px 16px}.mud-xxl-table .mud-table-cell:before{content:attr(data-label);font-weight:500;padding-right:16px;padding-inline-end:16px;padding-inline-start:unset}.mud-xxl-table.mud-table-small-alignright .mud-table-cell:before{margin-right:auto}.mud-xxl-table .mud-table-cell-hide{visibility:collapse;height:0;padding:0;margin:0}.mud-xxl-table .mud-table-pagination .mud-table-pagination-spacer{flex:none}.mud-xxl-table .mud-table-pagination .mud-table-pagination-actions .mud-button-root:first-child{display:none}.mud-xxl-table .mud-table-pagination .mud-table-pagination-actions .mud-button-root:last-child{display:none}.mud-xxl-table .mud-table-pagination .mud-select~.mud-table-pagination-caption{margin-left:auto;margin-inline-start:auto}.mud-xxl-table.mud-table-bordered .mud-table-container .mud-table-root colgroup~.mud-table-body .mud-table-row .mud-table-cell{border-right:1px solid var(--mud-palette-table-lines) !important}.mud-xxl-table.mud-table-bordered .mud-table-container .mud-table-root .mud-table-body .mud-table-row .mud-table-cell{border-right:none !important}}.mud-tabs{display:flex;flex-direction:column}.mud-tabs.mud-tabs-reverse{flex-direction:column-reverse}.mud-tabs.mud-tabs-vertical{flex-direction:row}.mud-tabs.mud-tabs-vertical .mud-tooltip-root{width:auto}.mud-tabs.mud-tabs-vertical-reverse{flex-direction:row-reverse}.mud-tabs.mud-tabs-rounded{border-radius:var(--mud-default-borderradius);overflow:hidden}.mud-tabs.mud-tabs-rounded .mud-tabs-tabbar{border-radius:var(--mud-default-borderradius)}.mud-tabs.mud-tabs-rounded .mud-tabs-panels{border-radius:var(--mud-default-borderradius)}.mud-tabs-tabbar{position:relative;background-color:var(--mud-palette-surface)}.mud-tabs-tabbar.mud-tabs-border-left{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important;border-right:1px solid var(--mud-palette-lines-default)}.mud-tabs-tabbar.mud-tabs-border-right{border-top-left-radius:0 !important;border-bottom-left-radius:0 !important;border-left:1px solid var(--mud-palette-lines-default)}.mud-tabs-tabbar.mud-tabs-border-top{border-bottom-left-radius:0 !important;border-bottom-right-radius:0 !important;border-bottom:1px solid var(--mud-palette-lines-default)}.mud-tabs-tabbar.mud-tabs-border-bottom{border-top-left-radius:0 !important;border-top-right-radius:0 !important;border-top:1px solid var(--mud-palette-lines-default)}.mud-tabs-tabbar.mud-tabs-rounded{border-radius:var(--mud-default-borderradius)}.mud-tabs-tabbar.mud-tabs-vertical .mud-tabs-tabbar-inner{flex-direction:column}.mud-tabs-tabbar.mud-tabs-vertical .mud-tabs-tabbar-inner .mud-tabs-scroll-button .mud-button-root{width:100%;border-radius:0px;height:32px}.mud-tabs-tabbar.mud-tabs-vertical .mud-tabs-tabbar-inner .mud-tabs-scroll-button .mud-button-root .mud-icon-button-label .mud-icon-root{transform:rotate(90deg)}.mud-tabs-tabbar .mud-tabs-tabbar-inner{display:flex;min-height:48px}.mud-tabs-tabbar-content{width:100%;flex:1 1 auto;display:inline-block;position:relative;white-space:nowrap;overflow:hidden}.mud-tabs-tabbar-content .mud-tabs-tabbar-wrapper{width:max-content;position:inherit;display:flex;transition:.3s cubic-bezier(0.25, 0.8, 0.5, 1)}.mud-tabs-tabbar-content .mud-tabs-tabbar-wrapper.mud-tabs-centered{margin:auto}.mud-tabs-tabbar-content .mud-tabs-tabbar-wrapper.mud-tabs-vertical{flex-direction:column}.mud-tabs-panels{position:relative;transition:.3s cubic-bezier(0.25, 0.8, 0.5, 1)}.mud-tabs-panels.mud-tabs-vertical{display:flex;flex-grow:1}.mud-tab{width:100%;display:inline-flex;padding:6px 12px;min-height:48px;flex-shrink:0;font-weight:500;line-height:1.75;user-select:none;white-space:normal;letter-spacing:.02857em;text-transform:uppercase;text-align:center;align-items:center;justify-content:center;transition:background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}@media(hover: hover)and (pointer: fine){.mud-tab:hover{cursor:pointer;background-color:var(--mud-palette-action-default-hover)}}.mud-tab.mud-tab-active{color:var(--mud-palette-primary)}@media(hover: hover)and (pointer: fine){.mud-tab.mud-tab-active:hover{background-color:var(--mud-palette-primary-hover)}}.mud-tab.mud-disabled{cursor:default;pointer-events:none;color:var(--mud-palette-text-disabled)}.mud-tab .mud-tab-icon-text{margin-right:8px;margin-inline-end:8px;margin-inline-start:unset}.mud-tab.mud-tab-panel-hidden{display:none}.mud-tab-slider{position:absolute;background:var(--mud-palette-primary)}.mud-tab-slider.mud-tab-slider-horizontal{height:2px;bottom:0;transition:left .3s cubic-bezier(0.64, 0.09, 0.08, 1);will-change:left}.mud-tab-slider.mud-tab-slider-horizontal.mud-tab-slider-horizontal-reverse{top:0;bottom:unset}.mud-tab-slider.mud-tab-slider-vertical{width:2px;right:0;transition:top .3s cubic-bezier(0.64, 0.09, 0.08, 1);will-change:top}.mud-tab-slider.mud-tab-slider-vertical.mud-tab-slider-vertical-reverse{left:0;right:unset}.mud-tab-badge{margin-left:8px;margin-inline-start:8px;margin-inline-end:unset}.mud-tabs-tabbar-primary{background-color:var(--mud-palette-primary);color:var(--mud-palette-primary-text)}.mud-tabs-tabbar-primary .mud-tab-slider{background:var(--mud-palette-primary-text)}.mud-tabs-tabbar-primary .mud-tab.mud-tab-active{color:var(--mud-palette-primary-text)}@media(hover: hover)and (pointer: fine){.mud-tabs-tabbar-primary .mud-tab.mud-tab-active:hover{background-color:var(--mud-palette-primary-lighten)}}.mud-tabs-tabbar-secondary{background-color:var(--mud-palette-secondary);color:var(--mud-palette-secondary-text)}.mud-tabs-tabbar-secondary .mud-tab-slider{background:var(--mud-palette-secondary-text)}.mud-tabs-tabbar-secondary .mud-tab.mud-tab-active{color:var(--mud-palette-secondary-text)}@media(hover: hover)and (pointer: fine){.mud-tabs-tabbar-secondary .mud-tab.mud-tab-active:hover{background-color:var(--mud-palette-secondary-lighten)}}.mud-tabs-tabbar-tertiary{background-color:var(--mud-palette-tertiary);color:var(--mud-palette-tertiary-text)}.mud-tabs-tabbar-tertiary .mud-tab-slider{background:var(--mud-palette-tertiary-text)}.mud-tabs-tabbar-tertiary .mud-tab.mud-tab-active{color:var(--mud-palette-tertiary-text)}@media(hover: hover)and (pointer: fine){.mud-tabs-tabbar-tertiary .mud-tab.mud-tab-active:hover{background-color:var(--mud-palette-tertiary-lighten)}}.mud-tabs-tabbar-info{background-color:var(--mud-palette-info);color:var(--mud-palette-info-text)}.mud-tabs-tabbar-info .mud-tab-slider{background:var(--mud-palette-info-text)}.mud-tabs-tabbar-info .mud-tab.mud-tab-active{color:var(--mud-palette-info-text)}@media(hover: hover)and (pointer: fine){.mud-tabs-tabbar-info .mud-tab.mud-tab-active:hover{background-color:var(--mud-palette-info-lighten)}}.mud-tabs-tabbar-success{background-color:var(--mud-palette-success);color:var(--mud-palette-success-text)}.mud-tabs-tabbar-success .mud-tab-slider{background:var(--mud-palette-success-text)}.mud-tabs-tabbar-success .mud-tab.mud-tab-active{color:var(--mud-palette-success-text)}@media(hover: hover)and (pointer: fine){.mud-tabs-tabbar-success .mud-tab.mud-tab-active:hover{background-color:var(--mud-palette-success-lighten)}}.mud-tabs-tabbar-warning{background-color:var(--mud-palette-warning);color:var(--mud-palette-warning-text)}.mud-tabs-tabbar-warning .mud-tab-slider{background:var(--mud-palette-warning-text)}.mud-tabs-tabbar-warning .mud-tab.mud-tab-active{color:var(--mud-palette-warning-text)}@media(hover: hover)and (pointer: fine){.mud-tabs-tabbar-warning .mud-tab.mud-tab-active:hover{background-color:var(--mud-palette-warning-lighten)}}.mud-tabs-tabbar-error{background-color:var(--mud-palette-error);color:var(--mud-palette-error-text)}.mud-tabs-tabbar-error .mud-tab-slider{background:var(--mud-palette-error-text)}.mud-tabs-tabbar-error .mud-tab.mud-tab-active{color:var(--mud-palette-error-text)}@media(hover: hover)and (pointer: fine){.mud-tabs-tabbar-error .mud-tab.mud-tab-active:hover{background-color:var(--mud-palette-error-lighten)}}.mud-tabs-tabbar-dark{background-color:var(--mud-palette-dark);color:var(--mud-palette-dark-text)}.mud-tabs-tabbar-dark .mud-tab-slider{background:var(--mud-palette-dark-text)}.mud-tabs-tabbar-dark .mud-tab.mud-tab-active{color:var(--mud-palette-dark-text)}@media(hover: hover)and (pointer: fine){.mud-tabs-tabbar-dark .mud-tab.mud-tab-active:hover{background-color:var(--mud-palette-dark-lighten)}}.tab-transition-enter{transform:translate(100%, 0)}.tab-transition-leave,.tab-transition-leave-active{position:absolute;top:0}.tab-transition-leave-to{position:absolute;transform:translate(-100%, 0)}.tab-reverse-transition-enter{transform:translate(-100%, 0)}.tab-reverse-transition-leave,.tab-reverse-transition-leave-to{top:0;position:absolute;transform:translate(100%, 0)}.mud-dynamic-tabs .mud-tabs-tabbar .mud-tab{padding:6px 14px}.mud-dynamic-tabs .mud-tabs-tabbar .mud-tab .mud-icon-button{padding:4px;margin-right:-4px;margin-inline-end:-4px;margin-inline-start:unset}.mud-dynamic-tabs .mud-tabs-tabbar .mud-tab .mud-tabs-panel-header-before{padding-right:8px;padding-inline-end:8px;padding-inline-start:unset}.mud-dynamic-tabs .mud-tabs-tabbar .mud-tab .mud-tabs-panel-header-after{padding-left:8px;padding-inline-start:8px;padding-inline-end:unset}.mud-tabs-header.mud-tabs-header-before{display:inherit}.mud-tabs-header.mud-tabs-header-after{display:inherit}.mud-tabs-panel-header{display:flex;flex:1 1 auto}.mud-tabs-panel-header.mud-tabs-panel-header-before{justify-content:flex-start}.mud-tabs-panel-header.mud-tabs-panel-header-after{justify-content:flex-end}.mud-select{display:flex;flex-grow:1;position:relative}.mud-select.mud-autocomplete{display:block}.mud-select.mud-autocomplete .mud-select-input{cursor:text}.mud-select.mud-autocomplete .mud-input-adornment{cursor:pointer}.mud-select.mud-autocomplete--with-progress .mud-select-input input{padding-right:3.5rem !important}.mud-select.mud-autocomplete--with-progress .mud-input-adorned-end input{padding-right:4.5rem !important}.mud-select.mud-autocomplete--with-progress .mud-select-input .mud-icon-button{display:none !important}.mud-select.mud-autocomplete--with-progress .progress-indicator-circular{position:absolute;width:100%;top:0;bottom:0;display:flex;align-items:center;justify-content:flex-end;padding-top:.25rem;padding-bottom:.25rem;padding-right:1rem}.mud-select.mud-autocomplete--with-progress .mud-progress-linear{position:absolute;bottom:-1px;height:2px}.mud-select .mud-select-input{cursor:pointer}.mud-select .mud-select-input .mud-input-slot{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.mud-select .mud-select-input .mud-input-adornment-end{margin-left:0}.mud-select .mud-select-input:disabled{cursor:default}.mud-select .mud-disabled .mud-select-input{cursor:default}.mud-rtl-provider .mud-select .progress-indicator-circular--with-adornment{padding-right:1rem}.mud-rtl-provider.mud-application-layout-rtl .mud-select .progress-indicator-circular--with-adornment{padding-right:0rem !important;padding-left:1rem !important}.mud-select>.mud-form-helpertext{margin-top:-21px}.mud-select-all{margin-top:10px;border-bottom:1px solid #d3d3d3;padding-bottom:18px}.mud-input{position:relative;color:var(--mud-palette-text-primary);cursor:text;display:inline-flex;box-sizing:border-box;align-items:center;color-scheme:var(--mud-native-html-color-scheme);line-height:1.1876em}.mud-input.mud-input-full-width{width:100%}.mud-input.mud-disabled{color:var(--mud-palette-text-disabled);cursor:default}.mud-input.mud-disabled>.mud-input-adornment{color:var(--mud-palette-text-disabled);pointer-events:none}.mud-input.mud-input-underline:before{left:0;right:0;bottom:0;content:" ";position:absolute;transition:border-bottom .2s,background-color .2s;border-bottom:1px solid var(--mud-palette-lines-inputs);pointer-events:none}@media(hover: hover)and (pointer: fine){.mud-input.mud-input-underline:hover:not(.mud-disabled):before{border-bottom:1px solid var(--mud-palette-action-default)}}.mud-input.mud-input-underline:after{left:0;right:0;bottom:0;content:"";position:absolute;transform:scaleX(0);transition:transform 200ms cubic-bezier(0, 0, 0.2, 1) 0ms;border-bottom:2px solid var(--mud-palette-primary);pointer-events:none}.mud-input.mud-input-underline.mud-disabled:before{border-bottom-style:dotted}.mud-input.mud-input-underline.mud-input-error:after{transform:scaleX(1);border-bottom-color:var(--mud-palette-error)}.mud-input.mud-input-filled{position:relative;transition:background-color 200ms cubic-bezier(0, 0, 0.2, 1) 0ms;background-color:rgba(0,0,0,.09);border-top-left-radius:4px;border-top-right-radius:4px}@media(hover: hover)and (pointer: fine){.mud-input.mud-input-filled:hover{background-color:rgba(0,0,0,.13)}}.mud-input.mud-input-filled.mud-focused{background-color:rgba(0,0,0,.09)}.mud-input.mud-input-filled.mud-disabled{background-color:rgba(0,0,0,.12)}.mud-input.mud-input-filled.mud-input-adorned-start{padding-left:12px;padding-inline-start:12px;padding-inline-end:unset}.mud-input.mud-input-filled.mud-input-adorned-end{padding-right:12px;padding-inline-end:12px;padding-inline-start:unset}.mud-input.mud-input-filled.mud-input-underline:before{left:0;right:0;bottom:0;content:" ";position:absolute;transition:border-bottom-color 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;border-bottom:1px solid var(--mud-palette-lines-inputs);pointer-events:none}.mud-input.mud-input-filled.mud-input-underline:after{left:0;right:0;bottom:0;content:"";position:absolute;transform:scaleX(0);transition:transform 200ms cubic-bezier(0, 0, 0.2, 1) 0ms;border-bottom:2px solid var(--mud-palette-primary);pointer-events:none}@media(hover: hover)and (pointer: fine){.mud-input.mud-input-filled.mud-input-underline:hover:before{border-bottom:1px solid var(--mud-palette-action-default)}}.mud-input.mud-input-filled.mud-input-underline.mud-disabled:before{border-bottom-style:dotted}.mud-input.mud-input-filled.mud-input-underline.mud-input-error:after{transform:scaleX(1);border-bottom-color:var(--mud-palette-error)}.mud-input.mud-input-outlined{position:relative;border-width:0px}.mud-input.mud-input-outlined .mud-input-outlined-border{display:flex;position:absolute;top:0;right:0;left:0;box-sizing:border-box;width:100%;max-width:100%;min-width:0%;height:100%;text-align:start;pointer-events:none;border-radius:var(--mud-default-borderradius);border-color:var(--mud-palette-lines-inputs);border-width:1px;border-style:solid;transition:border-width,border-color 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-input.mud-input-outlined>.mud-input-outlined-border legend{float:none;visibility:hidden;font-size:.75rem;font-weight:inherit;width:0;height:0;margin:0 11px 0 11px;padding:0;position:relative}@media(hover: hover)and (pointer: fine){.mud-input.mud-input-outlined:not(.mud-disabled):not(:focus-within):hover .mud-input-outlined-border{border-color:var(--mud-palette-action-default)}}.mud-input.mud-input-outlined.mud-shrink>.mud-input-outlined-border legend{width:auto;padding:0 5px}.mud-input.mud-input-outlined:focus-within>.mud-input-outlined-border,.mud-input.mud-input-outlined:focus-within .mud-shrink>.mud-input-outlined-border{border-width:2px;border-color:var(--mud-palette-primary)}.mud-input.mud-input-outlined:focus-within>.mud-input-outlined-border legend,.mud-input.mud-input-outlined:focus-within .mud-shrink>.mud-input-outlined-border legend{width:auto;padding:0 5px}.mud-input.mud-input-outlined.mud-disabled .mud-input-outlined-border{border-color:var(--mud-palette-action-disabled)}.mud-input.mud-input-outlined.mud-input-adorned-start{padding-left:14px;padding-inline-start:14px;padding-inline-end:unset}.mud-input.mud-input-outlined.mud-input-adorned-end{padding-right:14px;padding-inline-end:14px;padding-inline-start:unset}.mud-input-error .mud-input-outlined-border{border-color:var(--mud-palette-error) !important}.mud-input:focus-within.mud-input-underline:after{transform:scaleX(1)}.mud-input>input.mud-input-root,div.mud-input-slot.mud-input-root{font:inherit;color:currentColor;width:100%;border:0;height:1lh;margin:0;display:block;padding:6px 0 7px;min-width:0;background:none;position:relative;box-sizing:content-box;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mud-input>input.mud-input-root::placeholder,div.mud-input-slot.mud-input-root::placeholder{color:currentColor;opacity:.42;transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-input>input.mud-input-root::-webkit-input-placeholder,div.mud-input-slot.mud-input-root::-webkit-input-placeholder{color:currentColor;opacity:.42;transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-input>input.mud-input-root:-moz-placeholder,div.mud-input-slot.mud-input-root:-moz-placeholder{color:currentColor;opacity:.42;transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-input>input.mud-input-root::-moz-placeholder,div.mud-input-slot.mud-input-root::-moz-placeholder{color:currentColor;opacity:.42;transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-input>input.mud-input-root:-ms-input-placeholder,div.mud-input-slot.mud-input-root:-ms-input-placeholder{color:currentColor;opacity:.42;transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-input>input.mud-input-root::-ms-input-placeholder,div.mud-input-slot.mud-input-root::-ms-input-placeholder{color:currentColor;opacity:.42;transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-input>input.mud-input-root.mud-input-root-margin-dense,div.mud-input-slot.mud-input-root.mud-input-root-margin-dense{padding-top:3px}.mud-input>input.mud-input-root.mud-input-root-multiline,div.mud-input-slot.mud-input-root.mud-input-root-multiline{height:auto;resize:none;padding:0}.mud-input>input.mud-input-root.mud-input-root-type-search,div.mud-input-slot.mud-input-root.mud-input-root-type-search{-moz-appearance:textfield;-webkit-appearance:textfield}.mud-input>input.mud-input-root:focus,.mud-input>input.mud-input-root:active,div.mud-input-slot.mud-input-root:focus,div.mud-input-slot.mud-input-root:active{outline:0}.mud-input>input.mud-input-root:invalid,div.mud-input-slot.mud-input-root:invalid{box-shadow:none}.mud-input>input.mud-input-root:disabled,div.mud-input-slot.mud-input-root:disabled{opacity:1}.mud-input>input.mud-input-root.mud-input-root-filled,div.mud-input-slot.mud-input-root.mud-input-root-filled{padding:27px 12px 10px}.mud-input>input.mud-input-root.mud-input-root-filled.mud-input-root-margin-dense,div.mud-input-slot.mud-input-root.mud-input-root-filled.mud-input-root-margin-dense{padding-top:23px;padding-bottom:6px}.mud-input>input.mud-input-root.mud-input-root-filled:-webkit-autofill,div.mud-input-slot.mud-input-root.mud-input-root-filled:-webkit-autofill{border-top-left-radius:inherit;border-top-right-radius:inherit}.mud-input>input.mud-input-root.mud-input-root-filled.mud-input-root-hidden-label,div.mud-input-slot.mud-input-root.mud-input-root-filled.mud-input-root-hidden-label{padding-top:18px;padding-bottom:19px}.mud-input>input.mud-input-root.mud-input-root-filled.mud-input-root-hidden-label.mud-input-root-margin-dense,div.mud-input-slot.mud-input-root.mud-input-root-filled.mud-input-root-hidden-label.mud-input-root-margin-dense{padding-top:10px;padding-bottom:11px}.mud-input>input.mud-input-root.mud-input-root-filled.mud-input-root-multiline,div.mud-input-slot.mud-input-root.mud-input-root-filled.mud-input-root-multiline{padding:0}.mud-input>input.mud-input-root.mud-input-root-filled.mud-input-root-adorned-start,div.mud-input-slot.mud-input-root.mud-input-root-filled.mud-input-root-adorned-start{padding-left:0;padding-inline-start:0;padding-inline-end:12px}.mud-input>input.mud-input-root.mud-input-root-filled.mud-input-root-adorned-end,div.mud-input-slot.mud-input-root.mud-input-root-filled.mud-input-root-adorned-end{padding-right:0;padding-inline-end:0;padding-inline-start:12px}.mud-input>input.mud-input-root-outlined,div.mud-input-slot.mud-input-root-outlined{padding:18.5px 14px}.mud-input>input.mud-input-root-outlined.mud-input-root:-webkit-autofill,div.mud-input-slot.mud-input-root-outlined.mud-input-root:-webkit-autofill{border-radius:inherit}.mud-input>input.mud-input-root-outlined.mud-input-root-margin-dense,div.mud-input-slot.mud-input-root-outlined.mud-input-root-margin-dense{padding-top:10.5px;padding-bottom:10.5px}.mud-input>input.mud-input-root-outlined.mud-input-root-adorned-start,div.mud-input-slot.mud-input-root-outlined.mud-input-root-adorned-start{padding-left:0;padding-inline-start:0;padding-inline-end:14px}.mud-input>input.mud-input-root-outlined.mud-input-root-adorned-end,div.mud-input-slot.mud-input-root-outlined.mud-input-root-adorned-end{padding-right:0;padding-inline-end:0;padding-inline-start:14px}.mud-input>input::-ms-reveal,.mud-input>input::-ms-clear,div.mud-input-slot::-ms-reveal,div.mud-input-slot::-ms-clear{display:none !important}.mud-input>textarea.mud-input-root{font:inherit;color:currentColor;width:100%;border:0;height:auto;margin:6px 0 7px;padding:0;display:block;min-width:0;background:none;position:relative;box-sizing:content-box;letter-spacing:inherit;-webkit-tap-highlight-color:rgba(0,0,0,0);resize:none;cursor:auto}.mud-input>textarea.mud-input-root::placeholder{color:currentColor;opacity:.42;transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-input>textarea.mud-input-root::-webkit-input-placeholder{color:currentColor;opacity:.42;transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-input>textarea.mud-input-root:-moz-placeholder{color:currentColor;opacity:.42;transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-input>textarea.mud-input-root::-moz-placeholder{color:currentColor;opacity:.42;transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-input>textarea.mud-input-root:-ms-input-placeholder{color:currentColor;opacity:.42;transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-input>textarea.mud-input-root::-ms-input-placeholder{color:currentColor;opacity:.42;transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-input>textarea.mud-input-root.mud-input-root-margin-dense{margin-top:3px}.mud-input>textarea.mud-input-root.mud-input-root-type-search{-moz-appearance:textfield;-webkit-appearance:textfield}.mud-input>textarea.mud-input-root:focus,.mud-input>textarea.mud-input-root:active{outline:0}.mud-input>textarea.mud-input-root:invalid{box-shadow:none}.mud-input>textarea.mud-input-root:disabled{opacity:1}.mud-input>textarea.mud-input-root.mud-input-root-filled{box-sizing:border-box;margin-top:0;margin-bottom:0;padding:27px 12px 10px;mask-image:linear-gradient(to bottom, transparent 27px, black 27px)}.mud-input>textarea.mud-input-root.mud-input-root-filled.mud-input-root-margin-dense{padding-top:23px;padding-bottom:6px;mask-image:linear-gradient(to bottom, transparent 23px, black 23px)}.mud-input>textarea.mud-input-root.mud-input-root-filled:-webkit-autofill{border-top-left-radius:inherit;border-top-right-radius:inherit}.mud-input>textarea.mud-input-root.mud-input-root-filled.mud-input-root-hidden-label{padding-top:18px;padding-bottom:19px;mask-image:linear-gradient(to bottom, transparent 18px, black 18px)}.mud-input>textarea.mud-input-root.mud-input-root-filled.mud-input-root-hidden-label.mud-input-root-margin-dense{padding-top:10px;padding-bottom:11px;mask-image:linear-gradient(to bottom, transparent 10px, black 10px)}.mud-input>textarea.mud-input-root.mud-input-root-filled.mud-input-root-adorned-start{margin-left:0;margin-inline-start:0;margin-inline-end:12px}.mud-input>textarea.mud-input-root.mud-input-root-filled.mud-input-root-adorned-end{margin-right:0;margin-inline-end:unset;margin-inline-start:12px}.mud-input>textarea.mud-input-root::-webkit-scrollbar{width:8px;height:8px;z-index:1;cursor:crosshair}.mud-input>textarea.mud-input-root::-webkit-scrollbar-thumb{background:var(--mud-palette-lines-inputs);border-radius:1px}.mud-input>textarea.mud-input-root::-webkit-scrollbar-track{background:rgba(0,0,0,0)}.mud-input>textarea.mud-input-root-outlined{box-sizing:border-box;margin-top:0;margin-bottom:0;padding:18.5px 14px;mask-image:linear-gradient(to bottom, transparent 18.5px, black 18.5px)}.mud-input>textarea.mud-input-root-outlined.mud-input-root:-webkit-autofill{border-radius:inherit}.mud-input>textarea.mud-input-root-outlined.mud-input-root-margin-dense{padding-top:10.5px;padding-bottom:10.5px;mask-image:linear-gradient(to bottom, transparent 10.5px, black 10.5px)}.mud-input>textarea.mud-input-root-outlined.mud-input-root-adorned-start{margin-left:0;margin-inline-start:0;margin-inline-end:14px}.mud-input>textarea.mud-input-root-outlined.mud-input-root-adorned-end{margin-right:0;margin-inline-end:0;margin-inline-start:14px}.mud-input-adornment{height:.01em;display:flex;max-height:2em;align-items:center;white-space:nowrap}.mud-input-adornment-start{margin-right:8px;margin-inline-end:8px;margin-inline-start:unset}.mud-input-adornment-start.mud-input-root-filled-shrink{margin-top:16px}.mud-input-adornment-end{margin-left:8px;margin-inline-start:8px;margin-inline-end:unset}.mud-input-number-control.mud-input-showspin .mud-input-adornment-end{margin-right:12px;margin-inline-end:12px;margin-inline-start:unset}.mud-input-number-control.mud-input-showspin .mud-input-underline:not(.mud-input-filled) .mud-input-adornment-end{margin-right:24px;margin-inline-end:24px;margin-inline-start:unset}.mud-input-adornment-disable-pointerevents{pointer-events:none}.mud-range-input-separator{visibility:hidden;margin:0 4px}.mud-input:focus-within .mud-range-input-separator{visibility:visible}.mud-picker .mud-shrink .mud-range-input-separator{visibility:visible}.mud-input-control{border:0;margin:0;padding:0;display:flex;flex:1 1 auto;max-width:100%;position:relative;flex-direction:column;vertical-align:top}.mud-input-control.mud-input-control-full-width{width:100%}.mud-input-control.mud-input-control-boolean-input{flex:none;margin:0}.mud-input-control.mud-input-control-boolean-input .mud-radio-group{display:inherit;flex-direction:row;align-items:center;flex-wrap:wrap}.mud-input-control.mud-input-outlined-with-label{margin-top:8px;margin-bottom:4px}.mud-input-control.mud-input-control-margin-dense{margin:4px 0px}.mud-input-control.mud-input-control-margin-dense.mud-input-outlined-with-label{margin-top:8px;margin-bottom:4px}.mud-input-control.mud-input-control-margin-normal{margin:8px 0px}.mud-input-control.mud-input-control-margin-normal.mud-input-outlined-with-label{margin-top:16px;margin-bottom:8px}.mud-input-control>.mud-input-control-input-container{position:relative;display:flex;flex-direction:column}.mud-input-control>.mud-input-control-input-container>div.mud-input.mud-input-text.mud-input-text-with-label{margin-top:16px}.mud-input-control>.mud-input-control-input-container>.mud-input-label-outlined.mud-input-label-inputcontrol{line-height:1.15rem}.mud-input-control>.mud-input-control-input-container>.mud-input-label-inputcontrol{color:var(--mud-palette-text-secondary);padding:0;font-size:1rem;font-weight:400;line-height:1.15rem;letter-spacing:.00938em;z-index:0;pointer-events:none}.mud-input-control>.mud-input-control-input-container>.mud-input-label-inputcontrol.mud-disabled{color:var(--mud-palette-text-disabled)}.mud-input-control>.mud-input-control-input-container>.mud-input-label-inputcontrol.mud-input-error{color:var(--mud-palette-error) !important}.mud-input-control.mud-input-required>.mud-input-control-input-container>.mud-input-label::after{content:"*"}.mud-input-control.mud-input-number-control input::-webkit-outer-spin-button,.mud-input-control.mud-input-number-control input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.mud-input-control.mud-input-number-control input[type=number]{-moz-appearance:textfield}.mud-input-control.mud-input-number-control.mud-input-showspin .mud-input:not(.mud-input-adorned-end) input{padding-right:24px;padding-inline-end:24px}.mud-input-control.mud-input-number-control.mud-input-showspin .mud-input:not(.mud-input-adorned-end) input.mud-input-root-margin-dense{padding-right:20px;padding-inline-end:20px}.mud-input-control.mud-input-number-control.mud-input-showspin .mud-input:not(.mud-input-adorned-end).mud-input-text input{padding-inline-start:0}.mud-input-control.mud-input-number-control.mud-input-showspin .mud-input:not(.mud-input-adorned-end).mud-input-text input.mud-input-root-margin-dense{padding-inline-start:0}.mud-input-control.mud-input-number-control.mud-input-showspin .mud-input:not(.mud-input-adorned-end).mud-input-filled input{padding-inline-start:12px}.mud-input-control.mud-input-number-control.mud-input-showspin .mud-input:not(.mud-input-adorned-end).mud-input-filled input.mud-input-root-margin-dense{padding-inline-start:12px}.mud-input-control.mud-input-number-control.mud-input-showspin .mud-input:not(.mud-input-adorned-end).mud-input-outlined input{padding-inline-start:14px}.mud-input-control.mud-input-number-control.mud-input-showspin .mud-input:not(.mud-input-adorned-end).mud-input-outlined input.mud-input-root-margin-dense{padding-inline-start:14px}.mud-input-control.mud-input-number-control .mud-input-numeric-spin{display:inline-flex;flex-direction:column;justify-content:space-between;position:absolute;right:0;top:0;bottom:0}.mud-input-control.mud-input-number-control .mud-input-numeric-spin button{padding:2px 0;min-width:unset;min-height:unset}.mud-input-control:focus-within .mud-input-helper-text.mud-input-helper-onfocus,.mud-input-control.mud-input-error .mud-input-helper-text.mud-input-helper-onfocus{transform:translateY(0)}.mud-input-control-helper-container{overflow:hidden;margin-top:3px}.mud-input-helper-text{color:var(--mud-palette-text-secondary);margin:0;font-size:.75rem;text-align:start;font-weight:400;line-height:1.66;letter-spacing:.03333em}.mud-input-helper-text.mud-input-helper-onfocus{transform:translateY(-100%);transition:color 200ms cubic-bezier(0, 0, 0.2, 1) 0ms,transform 200ms cubic-bezier(0, 0, 0.2, 1) 0ms}.mud-input-helper-text.mud-disabled{color:var(--mud-palette-text-disabled)}.mud-input-helper-text.mud-input-error{color:var(--mud-palette-error) !important}.mud-input-helper-text-margin-dense{margin-top:4px}.mud-input-helper-text-contained{margin-left:14px;margin-right:14px}.mud-application-layout-rtl .mud-input-control.mud-input-number-control .mud-input-numeric-spin{left:0;right:unset}.mud-input-label{display:block;transform-origin:top left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.mud-input-label-inputcontrol{top:0;left:0;position:absolute;transform:translate(0, 24px) scale(1)}.mud-input-label-margindense{transform:translate(0, 21px) scale(1)}.mud-input-label-shrink{transform:translate(0, 1.5px) scale(0.75);transform-origin:top left}.mud-input-label-animated{transition:color 200ms cubic-bezier(0, 0, 0.2, 1) 0ms,transform 200ms cubic-bezier(0, 0, 0.2, 1) 0ms,max-width 200ms cubic-bezier(0, 0, 0.2, 1) 0ms}.mud-input-label-filled{z-index:1;transform:translate(12px, 20px) scale(1);max-width:calc(100% - 12px);pointer-events:none}.mud-input-label-filled.mud-input-label-margin-dense{transform:translate(12px, 17px) scale(1)}.mud-input-label-outlined{transform:translate(14px, 20px) scale(1);max-width:calc(100% - 14px);pointer-events:none;background-color:rgba(0,0,0,0);padding:0px 5px !important}.mud-input-label-outlined.mud-input-label-margin-dense{transform:translate(14px, 12px) scale(1)}.mud-shrink~label.mud-input-label.mud-input-label-inputcontrol{color:var(--mud-palette-text-primary)}.mud-input:focus-within~label.mud-input-label.mud-input-label-inputcontrol{color:var(--mud-palette-primary)}.mud-shrink~label.mud-input-label.mud-input-label-inputcontrol,.mud-input:focus-within~label.mud-input-label.mud-input-label-inputcontrol{transform:translate(0, 1.5px) scale(0.75);transform-origin:top left}.mud-shrink~label.mud-input-label.mud-input-label-inputcontrol.mud-input-label-filled,.mud-input:focus-within~label.mud-input-label.mud-input-label-inputcontrol.mud-input-label-filled{transform:translate(12px, 10px) scale(0.75);max-width:calc((100% - 12px)/.75)}.mud-shrink~label.mud-input-label.mud-input-label-inputcontrol.mud-input-label-filled.mud-input-label-margin-dense,.mud-input:focus-within~label.mud-input-label.mud-input-label-inputcontrol.mud-input-label-filled.mud-input-label-margin-dense{transform:translate(12px, 7px) scale(0.75)}.mud-shrink~label.mud-input-label.mud-input-label-inputcontrol.mud-input-label-outlined,.mud-input:focus-within~label.mud-input-label.mud-input-label-inputcontrol.mud-input-label-outlined{transform:translate(14px, -6px) scale(0.75);max-width:calc((100% - 14px)/.75)}.mud-input:focus-within~label.mud-input-label.mud-input-label-inputcontrol.mud-input-error{color:var(--mud-palette-error)}.mud-application-layout-rtl .mud-input-label{transform-origin:top right}.mud-application-layout-rtl .mud-input-label-inputcontrol{left:unset;right:0}.mud-application-layout-rtl .mud-input-label-shrink{transform-origin:top right}.mud-application-layout-rtl .mud-input-label-filled{transform:translate(-12px, 20px) scale(1)}.mud-application-layout-rtl .mud-input-label-filled.mud-input-label-margin-dense{transform:translate(-12px, 17px) scale(1)}.mud-application-layout-rtl .mud-input-label-outlined{transform:translate(-14px, 20px) scale(1)}.mud-application-layout-rtl .mud-input-label-outlined.mud-input-label-margin-dense{transform:translate(-14px, 12px) scale(1)}.mud-application-layout-rtl .mud-shrink~label.mud-input-label.mud-input-label-inputcontrol,.mud-application-layout-rtl .mud-input:focus-within~label.mud-input-label.mud-input-label-inputcontrol{transform-origin:top right}.mud-application-layout-rtl .mud-shrink~label.mud-input-label.mud-input-label-inputcontrol.mud-input-label-filled,.mud-application-layout-rtl .mud-input:focus-within~label.mud-input-label.mud-input-label-inputcontrol.mud-input-label-filled{transform:translate(-12px, 10px) scale(0.75)}.mud-application-layout-rtl .mud-shrink~label.mud-input-label.mud-input-label-inputcontrol.mud-input-label-filled.mud-input-label-margin-dense,.mud-application-layout-rtl .mud-input:focus-within~label.mud-input-label.mud-input-label-inputcontrol.mud-input-label-filled.mud-input-label-margin-dense{transform:translate(-12px, 7px) scale(0.75)}.mud-application-layout-rtl .mud-shrink~label.mud-input-label.mud-input-label-inputcontrol.mud-input-label-outlined,.mud-application-layout-rtl .mud-input:focus-within~label.mud-input-label.mud-input-label-inputcontrol.mud-input-label-outlined{transform:translate(-14px, -6px) scale(0.75)}.mud-input-content-placement-start{flex-direction:row-reverse}.mud-input-content-placement-start.mud-input-with-content{margin-left:16px;margin-inline-start:16px}.mud-input-content-placement-end{flex-direction:row}.mud-input-content-placement-end.mud-input-with-content{margin-right:16px;margin-inline-end:16px}.mud-input-content-placement-top{margin-inline-end:unset;flex-direction:column-reverse}.mud-input-content-placement-top.mud-input-with-content{margin-left:16px;margin-inline-start:16px}.mud-input-content-placement-bottom{margin-inline-end:unset;flex-direction:column}.mud-input-content-placement-bottom.mud-input-with-content{margin-left:16px;margin-inline-start:16px}.mud-file-upload{flex-grow:0}.mud-file-upload>.mud-input-control-input-container{display:initial !important}.mud-file-upload.mud-input-control{margin-top:0}.mud-image.fluid{max-width:100%;height:auto}.mud-overlay{top:0;left:0;right:0;bottom:0;margin:0 !important;align-items:center;justify-content:center;border-radius:inherit;display:flex;position:fixed;transition:.3s cubic-bezier(0.25, 0.8, 0.5, 1),z-index 1ms;z-index:5}.mud-overlay.mud-overlay-absolute{position:absolute}.mud-overlay .mud-overlay-scrim{top:0;left:0;right:0;bottom:0;border-radius:inherit;position:absolute;height:100%;width:100%;border-color:rgba(0,0,0,0);background-color:rgba(0,0,0,0);animation:mud-animation-fadein ease .15s;-webkit-animation:mud-animation-fadein ease .15s;-moz-animation:mud-animation-fadein ease .15s;-o-animation:mud-animation-fadein ease .15s}.mud-overlay .mud-overlay-scrim.mud-overlay-dark{border-color:var(--mud-palette-overlay-dark);background-color:var(--mud-palette-overlay-dark)}.mud-overlay .mud-overlay-scrim.mud-overlay-light{border-color:var(--mud-palette-overlay-light);background-color:var(--mud-palette-overlay-light)}.mud-overlay .mud-overlay-scrim:hover{cursor:default}.mud-overlay .mud-overlay-content{position:relative}.mud-overlay.mud-overlay-popover{z-index:var(--mud-zindex-popover)}.mud-overlay.mud-overlay-dialog{z-index:calc(var(--mud-zindex-dialog) + 1)}.mud-overlay.mud-overlay-drawer{z-index:calc(var(--mud-zindex-appbar) + 1)}.mud-treeview{margin:0px;padding:0px;list-style:none;overflow:auto}.mud-treeview.mud-treeview-selected-primary .mud-treeview-item-content.mud-treeview-item-selected{color:var(--mud-palette-primary);--mud-ripple-color: var(--mud-palette-primary);background-color:var(--mud-palette-primary-hover)}.mud-treeview.mud-treeview-selected-secondary .mud-treeview-item-content.mud-treeview-item-selected{color:var(--mud-palette-secondary);--mud-ripple-color: var(--mud-palette-secondary);background-color:var(--mud-palette-secondary-hover)}.mud-treeview.mud-treeview-selected-tertiary .mud-treeview-item-content.mud-treeview-item-selected{color:var(--mud-palette-tertiary);--mud-ripple-color: var(--mud-palette-tertiary);background-color:var(--mud-palette-tertiary-hover)}.mud-treeview.mud-treeview-selected-info .mud-treeview-item-content.mud-treeview-item-selected{color:var(--mud-palette-info);--mud-ripple-color: var(--mud-palette-info);background-color:var(--mud-palette-info-hover)}.mud-treeview.mud-treeview-selected-success .mud-treeview-item-content.mud-treeview-item-selected{color:var(--mud-palette-success);--mud-ripple-color: var(--mud-palette-success);background-color:var(--mud-palette-success-hover)}.mud-treeview.mud-treeview-selected-warning .mud-treeview-item-content.mud-treeview-item-selected{color:var(--mud-palette-warning);--mud-ripple-color: var(--mud-palette-warning);background-color:var(--mud-palette-warning-hover)}.mud-treeview.mud-treeview-selected-error .mud-treeview-item-content.mud-treeview-item-selected{color:var(--mud-palette-error);--mud-ripple-color: var(--mud-palette-error);background-color:var(--mud-palette-error-hover)}.mud-treeview.mud-treeview-selected-dark .mud-treeview-item-content.mud-treeview-item-selected{color:var(--mud-palette-dark);--mud-ripple-color: var(--mud-palette-dark);background-color:var(--mud-palette-dark-hover)}.mud-treeview.mud-treeview-checked-primary .mud-treeview-item-checkbox .mud-button-root.mud-icon-button{color:var(--mud-palette-primary)}.mud-treeview.mud-treeview-checked-secondary .mud-treeview-item-checkbox .mud-button-root.mud-icon-button{color:var(--mud-palette-secondary)}.mud-treeview.mud-treeview-checked-tertiary .mud-treeview-item-checkbox .mud-button-root.mud-icon-button{color:var(--mud-palette-tertiary)}.mud-treeview.mud-treeview-checked-info .mud-treeview-item-checkbox .mud-button-root.mud-icon-button{color:var(--mud-palette-info)}.mud-treeview.mud-treeview-checked-success .mud-treeview-item-checkbox .mud-button-root.mud-icon-button{color:var(--mud-palette-success)}.mud-treeview.mud-treeview-checked-warning .mud-treeview-item-checkbox .mud-button-root.mud-icon-button{color:var(--mud-palette-warning)}.mud-treeview.mud-treeview-checked-error .mud-treeview-item-checkbox .mud-button-root.mud-icon-button{color:var(--mud-palette-error)}.mud-treeview.mud-treeview-checked-dark .mud-treeview-item-checkbox .mud-button-root.mud-icon-button{color:var(--mud-palette-dark)}.mud-treeview-group{margin:0px;padding:0px;margin-left:17px;margin-inline-start:17px;margin-inline-end:unset;list-style:none}.mud-treeview-item{margin:0;outline:0;padding:0;cursor:default;list-style:none;min-height:2rem;align-items:center;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mud-treeview-item .mud-treeview-item-arrow .mud-icon-button,.mud-treeview-item .mud-treeview-item-checkbox .mud-icon-button{padding:4px}.mud-treeview-item.mud-treeview-item-disabled{color:var(--mud-palette-action-disabled) !important;cursor:default !important;pointer-events:none !important}.mud-treeview-item-content{width:100%;display:flex;padding:4px 8px;align-items:center;transition:background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}@media(hover: hover)and (pointer: fine){.mud-treeview-hover .mud-treeview-item-content:hover{background-color:var(--mud-palette-action-default-hover)}}.mud-treeview-item-arrow{width:2rem;display:flex;flex-shrink:0;margin:0 4px;min-height:32px;justify-content:center}.mud-treeview-item-arrow .mud-treeview-item-arrow-expand{transition:.3s cubic-bezier(0.25, 0.8, 0.5, 1),visibility 0s}.mud-treeview-item-arrow .mud-treeview-item-arrow-expand.mud-transform{transform:rotate(90deg)}.mud-treeview-item-arrow .mud-treeview-item-arrow-load{animation:rotation 1s infinite linear}.mud-treeview-item-icon{width:32px;display:flex;flex-shrink:0;margin-right:4px;margin-inline-end:4px;margin-inline-start:unset;justify-content:center}.mud-treeview-item-label{flex-grow:1;padding-left:4px;padding-right:4px}.mud-treeview-dense .mud-treeview-item{min-height:unset}.mud-treeview-dense .mud-treeview-item-content{padding:1px 4px}.mud-treeview-dense .mud-treeview-item-arrow{min-height:unset}.mud-treeview-dense .mud-icon-button{padding:0}.mud-treeview-select-none{user-select:none}@keyframes rotation{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}.mud-application-layout-rtl .mud-treeview-item-arrow{transform:scaleX(-1)}.mud-data-grid th{position:relative}.mud-data-grid .drop-allowed{color:var(--mud-palette-success)}.mud-data-grid .drop-not-allowed{color:var(--mud-palette-error)}.mud-data-grid .drag-icon-options{transition:opacity 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,transform 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;opacity:0;cursor:grab}.mud-data-grid .mud-table-cell.edit-mode-cell .mud-input-control{margin:0 !important}.mud-data-grid .mud-table-cell.edit-mode-cell .mud-input{font-size:inherit}.mud-data-grid .mud-table-cell.edit-mode-cell .mud-input:before{content:none}.mud-data-grid .mud-table-cell.edit-mode-cell .mud-inputafter{content:none}.mud-data-grid .mud-table-cell.edit-mode-cell .mud-input .mud-input-outlined-border{border:none}.mud-data-grid .mud-table-cell.filter-header-cell{padding:6px 24px 6px 16px;padding-inline-start:16px;padding-inline-end:24px}.mud-data-grid .mud-table-cell.sticky-left,.mud-data-grid .mud-table-cell.sticky-right{position:sticky;background-color:var(--mud-palette-background-gray);z-index:1}.mud-data-grid .mud-table-cell.sticky-left{left:0px}.mud-data-grid .mud-table-cell.sticky-right{right:0px}.mud-data-grid .mud-table-cell:not(.mud-table-child-content) .mud-input-text{margin-top:0 !important}.mud-data-grid .mud-table-cell .column-header{display:flex;align-items:center;justify-content:space-between}.mud-data-grid .mud-table-cell .column-header .sortable-column-header{width:100%}@media(hover: hover)and (pointer: fine){.mud-data-grid .mud-table-cell .column-header:hover .column-options .sort-direction-icon,.mud-data-grid .mud-table-cell .column-header:hover .column-options .column-options-icon,.mud-data-grid .mud-table-cell .column-header:hover .column-options .drag-icon-options{opacity:.8;color:var(--mud-palette-action-default)}.mud-data-grid .mud-table-cell .column-header:hover .column-options .mud-menu .mud-icon-button-label{opacity:1;color:var(--mud-palette-action-default)}}.mud-data-grid .mud-table-cell .column-header .column-options{display:inline-flex;align-items:center;flex-direction:inherit;justify-content:flex-start}.mud-data-grid .mud-table-cell .column-header .sort-direction-icon{font-size:18px;margin-left:4px;margin-inline-start:4px;margin-inline-end:unset;user-select:none;transition:opacity 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,transform 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;opacity:0}.mud-data-grid .mud-table-cell .column-header .sort-direction-icon.mud-direction-desc{opacity:1;transform:rotate(180deg)}.mud-data-grid .mud-table-cell .column-header .sort-direction-icon.mud-direction-asc{opacity:1;transform:rotate(0deg)}.mud-data-grid .mud-table-cell .column-header .mud-sort-index{transform:scale(0.9) translate(-2px, -2px)}.mud-data-grid .mud-table-cell .column-header .column-options .mud-menu .mud-icon-button-label{user-select:none;transition:opacity 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,transform 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;opacity:0}.mud-data-grid .mud-table-cell .mud-resizer{position:absolute;top:0;right:0;width:8px;cursor:col-resize;user-select:none}.mud-application-layout-rtl .mud-data-grid .mud-table-cell .mud-resizer{right:auto;left:0}@media(hover: hover)and (pointer: fine){.mud-data-grid .mud-table-cell .mud-resizer:hover{border-right:2px solid var(--mud-palette-primary)}}.mud-data-grid .mud-table-cell .mud-resizing{border-right:2px solid var(--mud-palette-primary)}@media(hover: hover)and (pointer: fine){.mud-data-grid-columns-panel:hover .column-options .sort-direction-icon,.mud-data-grid-columns-panel:hover .column-options .column-options-icon,.mud-data-grid-columns-panel:hover .column-options .drag-icon-options{opacity:.8;color:var(--mud-palette-action-default)}.mud-data-grid-columns-panel:hover .column-options .mud-menu .mud-icon-button-label{opacity:1;color:var(--mud-palette-action-default)}}.mud-data-grid-columns-panel .sort-direction-icon{font-size:18px;margin-left:4px;margin-inline-start:4px;margin-inline-end:unset;user-select:none;transition:opacity 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,transform 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.mud-data-grid-columns-panel .sort-direction-icon.mud-direction-desc{opacity:1;transform:rotate(180deg)}.mud-data-grid-columns-panel .sort-direction-icon.mud-direction-asc{opacity:1;transform:rotate(0deg)}.mud-data-grid-columns-panel .mud-sort-index{transform:scale(0.9) translate(-2px, -2px)}.mud-data-grid-columns-panel .drag-icon-options{transition:opacity 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,transform 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;opacity:1;cursor:grab}.mud-data-grid-columns-panel .mud-drop-item-preview-start{z-index:0}.mud-toggle-group{display:grid;overflow:hidden;box-sizing:border-box;border-width:0;border-radius:var(--mud-default-borderradius)}.mud-toggle-group>.mud-toggle-item{box-shadow:none;border-width:inherit;border-style:none;border-color:inherit;border-radius:0}.mud-toggle-group-horizontal:not(.mud-toggle-group-rtl)>.mud-toggle-item:not(:first-child),.mud-toggle-group-horizontal:not(.mud-toggle-group-rtl)>:not(:first-child) .mud-toggle-item{margin-left:-1px}.mud-toggle-group-horizontal:not(.mud-toggle-group-rtl)>.mud-toggle-item:not(:first-child).mud-toggle-item-delimiter,.mud-toggle-group-horizontal:not(.mud-toggle-group-rtl)>:not(:first-child) .mud-toggle-item.mud-toggle-item-delimiter{border-left-style:solid !important}.mud-toggle-group-horizontal.mud-toggle-group-rtl>.mud-toggle-item:not(:last-child),.mud-toggle-group-horizontal.mud-toggle-group-rtl>:not(:last-child) .mud-toggle-item{margin-left:-1px}.mud-toggle-group-horizontal.mud-toggle-group-rtl>.mud-toggle-item:not(:last-child).mud-toggle-item-delimiter,.mud-toggle-group-horizontal.mud-toggle-group-rtl>:not(:last-child) .mud-toggle-item.mud-toggle-item-delimiter{border-left-style:solid !important}.mud-toggle-group-vertical>.mud-toggle-item:not(:first-child),.mud-toggle-group-vertical>:not(:first-child) .mud-toggle-item{margin-top:-1px}.mud-toggle-group-vertical>.mud-toggle-item:not(:first-child).mud-toggle-item-delimiter,.mud-toggle-group-vertical>:not(:first-child) .mud-toggle-item.mud-toggle-item-delimiter{border-top-style:solid !important}.mud-toggle-item{padding:6px;min-width:auto;border-style:none !important}.mud-toggle-item>.mud-button-label{min-height:20px}.mud-toggle-item .mud-toggle-item-check-icon{margin:0 6px;font-size:20px}.mud-toggle-item-size-small{padding:4px}.mud-toggle-item-size-small .mud-toggle-item-check-icon{margin:0 4px;font-size:18px}.mud-toggle-item-size-large{padding:8px}.mud-toggle-item-size-large .mud-toggle-item-check-icon{margin:0 8px;font-size:22px}.mud-toggle-item-fixed>.mud-button-label:has(>.mud-toggle-item-check-icon){display:grid;grid-template-columns:1fr auto 1fr}.mud-toggle-item-check-icon{justify-self:end}.mud-toggle-item-content{display:contents}.mud-stepper .mud-stepper-nav .mud-step{padding:24px;position:relative;cursor:default;pointer-events:none;user-select:text}.mud-stepper .mud-stepper-nav .mud-step.mud-clickable{cursor:pointer;pointer-events:auto;user-select:none;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}@media(hover: hover)and (pointer: fine){.mud-stepper .mud-stepper-nav .mud-step.mud-clickable:hover{background-color:var(--mud-palette-action-default-hover)}}.mud-stepper .mud-stepper-nav .mud-step.mud-clickable:focus-visible,.mud-stepper .mud-stepper-nav .mud-step.mud-clickable:active{background-color:var(--mud-palette-action-default-hover)}.mud-stepper .mud-stepper-nav .mud-step:disabled .mud-step-label-icon{background-color:var(--mud-palette-lines-default) !important;color:var(--mud-palette-text-disabled) !important}.mud-stepper .mud-stepper-nav .mud-step:disabled .mud-step-label-content{color:var(--mud-palette-text-disabled) !important}.mud-stepper .mud-stepper-nav .mud-step .mud-step-label{display:flex;align-items:center;flex-direction:row;height:100%;gap:8px}.mud-stepper .mud-stepper-nav .mud-step .mud-step-label .mud-step-label-icon{display:flex;flex-shrink:0;color:var(--mud-palette-white);border-radius:50%;background-color:var(--mud-palette-text-disabled);height:24px;width:24px;align-items:center;justify-content:center;font-size:12px;letter-spacing:0;text-indent:0;white-space:nowrap}.mud-stepper .mud-stepper-nav .mud-step .mud-step-label .mud-step-label-icon .mud-typography{line-height:1}.mud-stepper .mud-stepper-nav .mud-step .mud-step-label .mud-step-label-content{width:100%;color:var(--mud-palette-text-secondary);--mud-ripple-color: var(--mud-palette-text-secondary);text-align:start}.mud-stepper .mud-stepper-nav .mud-step .mud-step-label .mud-step-label-content-title{line-height:var(--mud-typography-body2-lineheight)}.mud-stepper .mud-stepper-nav .mud-step.active .mud-step-label-content{color:var(--mud-palette-text-primary);--mud-ripple-color: var(--mud-palette-text-primary)}.mud-stepper .mud-stepper-nav.mud-stepper-nav-scrollable{overflow:auto}.mud-stepper .mud-stepper-nav.mud-stepper-nav-scrollable .mud-step{min-width:fit-content}.mud-stepper .mud-stepper-nav.mud-stepper-nav-scrollable .mud-stepper-nav-connector{min-width:32px}.mud-stepper .mud-stepper-content{padding:0 24px}.mud-stepper .mud-stepper-nav-connector{flex:1 1 auto}.mud-stepper .mud-stepper-nav-connector .mud-stepper-nav-connector-line{display:block;border-color:var(--mud-palette-lines-inputs)}.mud-stepper.mud-stepper__horizontal .mud-stepper-nav{display:flex}.mud-stepper.mud-stepper__horizontal.mud-stepper__center-labels .mud-step{flex-basis:175px}.mud-stepper.mud-stepper__horizontal.mud-stepper__center-labels .mud-step-label{flex-direction:column;justify-content:flex-start;align-items:center}.mud-stepper.mud-stepper__horizontal.mud-stepper__center-labels .mud-step-label .mud-step-label-icon{margin-inline-end:0px !important}.mud-stepper.mud-stepper__horizontal.mud-stepper__center-labels .mud-step-label .mud-step-label-content{margin-top:12px;text-align:center}.mud-stepper.mud-stepper__horizontal.mud-stepper__center-labels .mud-stepper-nav-connector{margin:35px -67px 0;align-self:flex-start}.mud-stepper.mud-stepper__horizontal .mud-stepper-nav-connector{align-self:center;margin:0 -16px}.mud-stepper.mud-stepper__horizontal .mud-stepper-nav-connector .mud-stepper-nav-connector-line{border-top-style:solid;border-top-width:1px}.mud-stepper.mud-stepper__vertical .mud-stepper-nav{padding:8px 0px}.mud-stepper.mud-stepper__vertical .mud-step{padding:0 16px}.mud-stepper.mud-stepper__vertical .mud-step .mud-step-label{padding:8px 0px}.mud-stepper.mud-stepper__vertical .mud-stepper-nav-connector{margin-inline-start:28px;margin-inline-end:0}.mud-stepper.mud-stepper__vertical .mud-stepper-nav-connector .mud-stepper-nav-connector-line{border-inline-start:1px solid #bdbdbd;min-height:24px}.mud-stepper.mud-stepper__vertical .mud-stepper-content{margin-inline-start:28px;margin-inline-end:0;padding-inline-start:20px;padding-inline-end:0;border-inline-start:1px solid var(--mud-palette-lines-inputs)}.mud-stepper-step-button{display:inline-flex;-moz-box-align:center;align-items:center;-moz-box-pack:center;justify-content:center;position:relative;background-color:rgba(0,0,0,0);outline:0px;border:0px;border-radius:0px;cursor:pointer;user-select:none;vertical-align:middle;appearance:none;text-decoration:none;color:inherit;width:100%;padding:24px 16px;margin:-24px -16px;box-sizing:content-box}.mud-swipearea{touch-action:none}.rounded-0{border-radius:0 !important}.rounded-t-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-r-0,.rounded-e-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-b-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-l-0,.rounded-s-0{border-top-left-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-tl-0,.rounded-ts-0{border-top-left-radius:0 !important}.rounded-tr-0,.rounded-te-0{border-top-right-radius:0 !important}.rounded-br-0,.rounded-be-0{border-bottom-right-radius:0 !important}.rounded-bl-0,.rounded-bs-0{border-bottom-left-radius:0 !important}.mud-application-layout-rtl .rounded-s-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important;border-top-left-radius:0 !important;border-bottom-left-radius:0 !important}.mud-application-layout-rtl .rounded-e-0{border-top-left-radius:0 !important;border-bottom-left-radius:0 !important;border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.mud-application-layout-rtl .rounded-ts-0{border-top-right-radius:0 !important;border-top-left-radius:0 !important}.mud-application-layout-rtl .rounded-te-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.mud-application-layout-rtl .rounded-bs-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.mud-application-layout-rtl .rounded-be-0{border-bottom-left-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-sm{border-radius:2px !important}.rounded-t-sm{border-top-left-radius:2px !important;border-top-right-radius:2px !important}.rounded-r-sm,.rounded-e-sm{border-top-right-radius:2px !important;border-bottom-right-radius:2px !important}.rounded-b-sm{border-bottom-right-radius:2px !important;border-bottom-left-radius:2px !important}.rounded-l-sm,.rounded-s-sm{border-top-left-radius:2px !important;border-bottom-left-radius:2px !important}.rounded-tl-sm,.rounded-ts-sm{border-top-left-radius:2px !important}.rounded-tr-sm,.rounded-te-sm{border-top-right-radius:2px !important}.rounded-br-sm,.rounded-be-sm{border-bottom-right-radius:2px !important}.rounded-bl-sm,.rounded-bs-sm{border-bottom-left-radius:2px !important}.mud-application-layout-rtl .rounded-s-sm{border-top-right-radius:2px !important;border-bottom-right-radius:2px !important;border-top-left-radius:0 !important;border-bottom-left-radius:0 !important}.mud-application-layout-rtl .rounded-e-sm{border-top-left-radius:2px !important;border-bottom-left-radius:2px !important;border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.mud-application-layout-rtl .rounded-ts-sm{border-top-right-radius:2px !important;border-top-left-radius:0 !important}.mud-application-layout-rtl .rounded-te-sm{border-top-left-radius:2px !important;border-top-right-radius:0 !important}.mud-application-layout-rtl .rounded-bs-sm{border-bottom-right-radius:2px !important;border-bottom-left-radius:0 !important}.mud-application-layout-rtl .rounded-be-sm{border-bottom-left-radius:2px !important;border-bottom-right-radius:0 !important}.rounded-lg{border-radius:8px !important}.rounded-t-lg{border-top-left-radius:8px !important;border-top-right-radius:8px !important}.rounded-r-lg,.rounded-e-lg{border-top-right-radius:8px !important;border-bottom-right-radius:8px !important}.rounded-b-lg{border-bottom-right-radius:8px !important;border-bottom-left-radius:8px !important}.rounded-l-lg,.rounded-s-lg{border-top-left-radius:8px !important;border-bottom-left-radius:8px !important}.rounded-tl-lg,.rounded-ts-lg{border-top-left-radius:8px !important}.rounded-tr-lg,.rounded-te-lg{border-top-right-radius:8px !important}.rounded-br-lg,.rounded-be-lg{border-bottom-right-radius:8px !important}.rounded-bl-lg,.rounded-bs-lg{border-bottom-left-radius:8px !important}.mud-application-layout-rtl .rounded-s-lg{border-top-right-radius:8px !important;border-bottom-right-radius:8px !important;border-top-left-radius:0 !important;border-bottom-left-radius:0 !important}.mud-application-layout-rtl .rounded-e-lg{border-top-left-radius:8px !important;border-bottom-left-radius:8px !important;border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.mud-application-layout-rtl .rounded-ts-lg{border-top-right-radius:8px !important;border-top-left-radius:0 !important}.mud-application-layout-rtl .rounded-te-lg{border-top-left-radius:8px !important;border-top-right-radius:0 !important}.mud-application-layout-rtl .rounded-bs-lg{border-bottom-right-radius:8px !important;border-bottom-left-radius:0 !important}.mud-application-layout-rtl .rounded-be-lg{border-bottom-left-radius:8px !important;border-bottom-right-radius:0 !important}.rounded-xl{border-radius:24px !important}.rounded-t-xl{border-top-left-radius:24px !important;border-top-right-radius:24px !important}.rounded-r-xl,.rounded-e-xl{border-top-right-radius:24px !important;border-bottom-right-radius:24px !important}.rounded-b-xl{border-bottom-right-radius:24px !important;border-bottom-left-radius:24px !important}.rounded-l-xl,.rounded-s-xl{border-top-left-radius:24px !important;border-bottom-left-radius:24px !important}.rounded-tl-xl,.rounded-ts-xl{border-top-left-radius:24px !important}.rounded-tr-xl,.rounded-te-xl{border-top-right-radius:24px !important}.rounded-br-xl,.rounded-be-xl{border-bottom-right-radius:24px !important}.rounded-bl-xl,.rounded-bs-xl{border-bottom-left-radius:24px !important}.mud-application-layout-rtl .rounded-s-xl{border-top-right-radius:24px !important;border-bottom-right-radius:24px !important;border-top-left-radius:0 !important;border-bottom-left-radius:0 !important}.mud-application-layout-rtl .rounded-e-xl{border-top-left-radius:24px !important;border-bottom-left-radius:24px !important;border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.mud-application-layout-rtl .rounded-ts-xl{border-top-right-radius:24px !important;border-top-left-radius:0 !important}.mud-application-layout-rtl .rounded-te-xl{border-top-left-radius:24px !important;border-top-right-radius:0 !important}.mud-application-layout-rtl .rounded-bs-xl{border-bottom-right-radius:24px !important;border-bottom-left-radius:0 !important}.mud-application-layout-rtl .rounded-be-xl{border-bottom-left-radius:24px !important;border-bottom-right-radius:0 !important}.rounded{border-radius:var(--mud-default-borderradius) !important}.rounded-t{border-top-left-radius:var(--mud-default-borderradius) !important;border-top-right-radius:var(--mud-default-borderradius) !important}.rounded-r,.rounded-e{border-top-right-radius:var(--mud-default-borderradius) !important;border-bottom-right-radius:var(--mud-default-borderradius) !important}.rounded-b{border-bottom-right-radius:var(--mud-default-borderradius) !important;border-bottom-left-radius:var(--mud-default-borderradius) !important}.rounded-l,.rounded-s{border-top-left-radius:var(--mud-default-borderradius) !important;border-bottom-left-radius:var(--mud-default-borderradius) !important}.rounded-tl,.rounded-ts{border-top-left-radius:var(--mud-default-borderradius) !important}.rounded-tr,.rounded-te{border-top-right-radius:var(--mud-default-borderradius) !important}.rounded-br,.rounded-be{border-bottom-right-radius:var(--mud-default-borderradius) !important}.rounded-bl,.rounded-bs{border-bottom-left-radius:var(--mud-default-borderradius) !important}.mud-application-layout-rtl .rounded-s{border-top-right-radius:var(--mud-default-borderradius) !important;border-bottom-right-radius:var(--mud-default-borderradius) !important;border-top-left-radius:0 !important;border-bottom-left-radius:0 !important}.mud-application-layout-rtl .rounded-e{border-top-left-radius:var(--mud-default-borderradius) !important;border-bottom-left-radius:var(--mud-default-borderradius) !important;border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.mud-application-layout-rtl .rounded-ts{border-top-right-radius:var(--mud-default-borderradius) !important;border-top-left-radius:0 !important}.mud-application-layout-rtl .rounded-te{border-top-left-radius:var(--mud-default-borderradius) !important;border-top-right-radius:0 !important}.mud-application-layout-rtl .rounded-bs{border-bottom-right-radius:var(--mud-default-borderradius) !important;border-bottom-left-radius:0 !important}.mud-application-layout-rtl .rounded-be{border-bottom-left-radius:var(--mud-default-borderradius) !important;border-bottom-right-radius:0 !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:9999px !important}.border-solid{border-style:solid !important}.border-dashed{border-style:dashed !important}.border-dotted{border-style:dotted !important}.border-double{border-style:double !important}.border-hidden{border-style:hidden !important}.border-none{border-style:none !important}.border-0{border-width:0px !important}.border-t-0{border-top-width:0px !important}.border-r-0{border-right-width:0px !important}.border-b-0{border-bottom-width:0px !important}.border-l-0{border-left-width:0px !important}.border-x-0{border-left-width:0px !important;border-right-width:0px !important}.border-y-0{border-top-width:0px !important;border-bottom-width:0px !important}.border{border-width:1px !important}.border-t{border-top-width:1px !important}.border-r{border-right-width:1px !important}.border-b{border-bottom-width:1px !important}.border-l{border-left-width:1px !important}.border-x{border-left-width:1px !important;border-right-width:1px !important}.border-y{border-top-width:1px !important;border-bottom-width:1px !important}.border-2{border-width:2px !important}.border-t-2{border-top-width:2px !important}.border-r-2{border-right-width:2px !important}.border-b-2{border-bottom-width:2px !important}.border-l-2{border-left-width:2px !important}.border-x-2{border-left-width:2px !important;border-right-width:2px !important}.border-y-2{border-top-width:2px !important;border-bottom-width:2px !important}.border-4{border-width:4px !important}.border-t-4{border-top-width:4px !important}.border-r-4{border-right-width:4px !important}.border-b-4{border-bottom-width:4px !important}.border-l-4{border-left-width:4px !important}.border-x-4{border-left-width:4px !important;border-right-width:4px !important}.border-y-4{border-top-width:4px !important;border-bottom-width:4px !important}.border-8{border-width:8px !important}.border-t-8{border-top-width:8px !important}.border-r-8{border-right-width:8px !important}.border-b-8{border-bottom-width:8px !important}.border-l-8{border-left-width:8px !important}.border-x-8{border-left-width:8px !important;border-right-width:8px !important}.border-y-8{border-top-width:8px !important;border-bottom-width:8px !important}.outline-none{outline-style:none}.outline-solid{outline-style:solid}.outline-dashed{outline-style:dashed}.outline-dotted{outline-style:dotted}.outline-double{outline-style:double}.outline-hidden{outline-style:hidden}.flex-1{flex:1 1 0% !important}.flex-auto{flex:1 1 auto !important}.flex-initial{flex:0 1 auto !important}.flex-none{flex:none !important}.flex-row{flex-direction:row !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column{flex-direction:column !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-grow-start>*:first-child{flex-grow:1 !important}.flex-grow-end>*:last-child{flex-grow:1 !important}.flex-grow-start-and-end>:first-child,.flex-grow-start-and-end>:last-child{flex-grow:1 !important}.flex-grow-middle>*:not(:first-child):not(:last-child){flex-grow:1 !important}.flex-grow-all>*{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-start{justify-content:flex-start !important}.justify-end{justify-content:flex-end !important}.justify-center{justify-content:center !important}.justify-space-between{justify-content:space-between !important}.justify-space-around{justify-content:space-around !important}.justify-space-evenly{justify-content:space-evenly !important}.order-first{order:-9999 !important}.order-last{order:9999 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-6{order:6 !important}.order-7{order:7 !important}.order-8{order:8 !important}.order-9{order:9 !important}.order-10{order:10 !important}.order-11{order:11 !important}.order-12{order:12 !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-space-between{align-content:space-between !important}.align-content-space-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-start{align-items:flex-start !important}.align-end{align-items:flex-end !important}.align-center{align-items:center !important}.align-baseline{align-items:baseline !important}.align-stretch{align-items:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-stretch{align-self:stretch !important}.gap-0{gap:0px}.gap-x-0{column-gap:0px}.gap-y-0{row-gap:0px}.gap-1{gap:4px}.gap-x-1{column-gap:4px}.gap-y-1{row-gap:4px}.gap-2{gap:8px}.gap-x-2{column-gap:8px}.gap-y-2{row-gap:8px}.gap-3{gap:12px}.gap-x-3{column-gap:12px}.gap-y-3{row-gap:12px}.gap-4{gap:16px}.gap-x-4{column-gap:16px}.gap-y-4{row-gap:16px}.gap-5{gap:20px}.gap-x-5{column-gap:20px}.gap-y-5{row-gap:20px}.gap-6{gap:24px}.gap-x-6{column-gap:24px}.gap-y-6{row-gap:24px}.gap-7{gap:28px}.gap-x-7{column-gap:28px}.gap-y-7{row-gap:28px}.gap-8{gap:32px}.gap-x-8{column-gap:32px}.gap-y-8{row-gap:32px}.gap-9{gap:36px}.gap-x-9{column-gap:36px}.gap-y-9{row-gap:36px}.gap-10{gap:40px}.gap-x-10{column-gap:40px}.gap-y-10{row-gap:40px}.gap-11{gap:44px}.gap-x-11{column-gap:44px}.gap-y-11{row-gap:44px}.gap-12{gap:48px}.gap-x-12{column-gap:48px}.gap-y-12{row-gap:48px}.gap-13{gap:52px}.gap-x-13{column-gap:52px}.gap-y-13{row-gap:52px}.gap-14{gap:56px}.gap-x-14{column-gap:56px}.gap-y-14{row-gap:56px}.gap-15{gap:60px}.gap-x-15{column-gap:60px}.gap-y-15{row-gap:60px}.gap-16{gap:64px}.gap-x-16{column-gap:64px}.gap-y-16{row-gap:64px}.gap-17{gap:68px}.gap-x-17{column-gap:68px}.gap-y-17{row-gap:68px}.gap-18{gap:72px}.gap-x-18{column-gap:72px}.gap-y-18{row-gap:72px}.gap-19{gap:76px}.gap-x-19{column-gap:76px}.gap-y-19{row-gap:76px}.gap-20{gap:80px}.gap-x-20{column-gap:80px}.gap-y-20{row-gap:80px}@media(min-width: 600px){.flex-sm-1{flex:1 1 0% !important}.flex-sm-auto{flex:1 1 auto !important}.flex-sm-initial{flex:0 1 auto !important}.flex-sm-none{flex:none !important}.flex-sm-row{flex-direction:row !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column{flex-direction:column !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-grow-start>*:first-child{flex-grow:1 !important}.flex-sm-grow-end>*:last-child{flex-grow:1 !important}.flex-sm-grow-start-and-end>:first-child,.flex-sm-grow-start-and-end>:last-child{flex-grow:1 !important}.flex-sm-grow-middle>*:not(:first-child):not(:last-child){flex-grow:1 !important}.flex-sm-grow-all>*{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-sm-start{justify-content:flex-start !important}.justify-sm-end{justify-content:flex-end !important}.justify-sm-center{justify-content:center !important}.justify-sm-space-between{justify-content:space-between !important}.justify-sm-space-around{justify-content:space-around !important}.justify-sm-space-evenly{justify-content:space-evenly !important}.order-sm-first{order:-9999 !important}.order-sm-last{order:9999 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-6{order:6 !important}.order-sm-7{order:7 !important}.order-sm-8{order:8 !important}.order-sm-9{order:9 !important}.order-sm-10{order:10 !important}.order-sm-11{order:11 !important}.order-sm-12{order:12 !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-space-between{align-content:space-between !important}.align-content-sm-space-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-sm-start{align-items:flex-start !important}.align-sm-end{align-items:flex-end !important}.align-sm-center{align-items:center !important}.align-sm-baseline{align-items:baseline !important}.align-sm-stretch{align-items:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-stretch{align-self:stretch !important}.gap-sm-0{gap:0px}.gap-x-sm-0{column-gap:0px}.gap-y-sm-0{row-gap:0px}.gap-sm-1{gap:4px}.gap-x-sm-1{column-gap:4px}.gap-y-sm-1{row-gap:4px}.gap-sm-2{gap:8px}.gap-x-sm-2{column-gap:8px}.gap-y-sm-2{row-gap:8px}.gap-sm-3{gap:12px}.gap-x-sm-3{column-gap:12px}.gap-y-sm-3{row-gap:12px}.gap-sm-4{gap:16px}.gap-x-sm-4{column-gap:16px}.gap-y-sm-4{row-gap:16px}.gap-sm-5{gap:20px}.gap-x-sm-5{column-gap:20px}.gap-y-sm-5{row-gap:20px}.gap-sm-6{gap:24px}.gap-x-sm-6{column-gap:24px}.gap-y-sm-6{row-gap:24px}.gap-sm-7{gap:28px}.gap-x-sm-7{column-gap:28px}.gap-y-sm-7{row-gap:28px}.gap-sm-8{gap:32px}.gap-x-sm-8{column-gap:32px}.gap-y-sm-8{row-gap:32px}.gap-sm-9{gap:36px}.gap-x-sm-9{column-gap:36px}.gap-y-sm-9{row-gap:36px}.gap-sm-10{gap:40px}.gap-x-sm-10{column-gap:40px}.gap-y-sm-10{row-gap:40px}.gap-sm-11{gap:44px}.gap-x-sm-11{column-gap:44px}.gap-y-sm-11{row-gap:44px}.gap-sm-12{gap:48px}.gap-x-sm-12{column-gap:48px}.gap-y-sm-12{row-gap:48px}.gap-sm-13{gap:52px}.gap-x-sm-13{column-gap:52px}.gap-y-sm-13{row-gap:52px}.gap-sm-14{gap:56px}.gap-x-sm-14{column-gap:56px}.gap-y-sm-14{row-gap:56px}.gap-sm-15{gap:60px}.gap-x-sm-15{column-gap:60px}.gap-y-sm-15{row-gap:60px}.gap-sm-16{gap:64px}.gap-x-sm-16{column-gap:64px}.gap-y-sm-16{row-gap:64px}.gap-sm-17{gap:68px}.gap-x-sm-17{column-gap:68px}.gap-y-sm-17{row-gap:68px}.gap-sm-18{gap:72px}.gap-x-sm-18{column-gap:72px}.gap-y-sm-18{row-gap:72px}.gap-sm-19{gap:76px}.gap-x-sm-19{column-gap:76px}.gap-y-sm-19{row-gap:76px}.gap-sm-20{gap:80px}.gap-x-sm-20{column-gap:80px}.gap-y-sm-20{row-gap:80px}}@media(min-width: 960px){.flex-md-1{flex:1 1 0% !important}.flex-md-auto{flex:1 1 auto !important}.flex-md-initial{flex:0 1 auto !important}.flex-md-none{flex:none !important}.flex-md-row{flex-direction:row !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column{flex-direction:column !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-grow-start>*:first-child{flex-grow:1 !important}.flex-md-grow-end>*:last-child{flex-grow:1 !important}.flex-md-grow-start-and-end>:first-child,.flex-md-grow-start-and-end>:last-child{flex-grow:1 !important}.flex-md-grow-middle>*:not(:first-child):not(:last-child){flex-grow:1 !important}.flex-md-grow-all>*{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-md-start{justify-content:flex-start !important}.justify-md-end{justify-content:flex-end !important}.justify-md-center{justify-content:center !important}.justify-md-space-between{justify-content:space-between !important}.justify-md-space-around{justify-content:space-around !important}.justify-md-space-evenly{justify-content:space-evenly !important}.order-md-first{order:-9999 !important}.order-md-last{order:9999 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-6{order:6 !important}.order-md-7{order:7 !important}.order-md-8{order:8 !important}.order-md-9{order:9 !important}.order-md-10{order:10 !important}.order-md-11{order:11 !important}.order-md-12{order:12 !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-space-between{align-content:space-between !important}.align-content-md-space-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-md-start{align-items:flex-start !important}.align-md-end{align-items:flex-end !important}.align-md-center{align-items:center !important}.align-md-baseline{align-items:baseline !important}.align-md-stretch{align-items:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-stretch{align-self:stretch !important}.gap-md-0{gap:0px}.gap-x-md-0{column-gap:0px}.gap-y-md-0{row-gap:0px}.gap-md-1{gap:4px}.gap-x-md-1{column-gap:4px}.gap-y-md-1{row-gap:4px}.gap-md-2{gap:8px}.gap-x-md-2{column-gap:8px}.gap-y-md-2{row-gap:8px}.gap-md-3{gap:12px}.gap-x-md-3{column-gap:12px}.gap-y-md-3{row-gap:12px}.gap-md-4{gap:16px}.gap-x-md-4{column-gap:16px}.gap-y-md-4{row-gap:16px}.gap-md-5{gap:20px}.gap-x-md-5{column-gap:20px}.gap-y-md-5{row-gap:20px}.gap-md-6{gap:24px}.gap-x-md-6{column-gap:24px}.gap-y-md-6{row-gap:24px}.gap-md-7{gap:28px}.gap-x-md-7{column-gap:28px}.gap-y-md-7{row-gap:28px}.gap-md-8{gap:32px}.gap-x-md-8{column-gap:32px}.gap-y-md-8{row-gap:32px}.gap-md-9{gap:36px}.gap-x-md-9{column-gap:36px}.gap-y-md-9{row-gap:36px}.gap-md-10{gap:40px}.gap-x-md-10{column-gap:40px}.gap-y-md-10{row-gap:40px}.gap-md-11{gap:44px}.gap-x-md-11{column-gap:44px}.gap-y-md-11{row-gap:44px}.gap-md-12{gap:48px}.gap-x-md-12{column-gap:48px}.gap-y-md-12{row-gap:48px}.gap-md-13{gap:52px}.gap-x-md-13{column-gap:52px}.gap-y-md-13{row-gap:52px}.gap-md-14{gap:56px}.gap-x-md-14{column-gap:56px}.gap-y-md-14{row-gap:56px}.gap-md-15{gap:60px}.gap-x-md-15{column-gap:60px}.gap-y-md-15{row-gap:60px}.gap-md-16{gap:64px}.gap-x-md-16{column-gap:64px}.gap-y-md-16{row-gap:64px}.gap-md-17{gap:68px}.gap-x-md-17{column-gap:68px}.gap-y-md-17{row-gap:68px}.gap-md-18{gap:72px}.gap-x-md-18{column-gap:72px}.gap-y-md-18{row-gap:72px}.gap-md-19{gap:76px}.gap-x-md-19{column-gap:76px}.gap-y-md-19{row-gap:76px}.gap-md-20{gap:80px}.gap-x-md-20{column-gap:80px}.gap-y-md-20{row-gap:80px}}@media(min-width: 1280px){.flex-lg-1{flex:1 1 0% !important}.flex-lg-auto{flex:1 1 auto !important}.flex-lg-initial{flex:0 1 auto !important}.flex-lg-none{flex:none !important}.flex-lg-row{flex-direction:row !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column{flex-direction:column !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-grow-start>*:first-child{flex-grow:1 !important}.flex-lg-grow-end>*:last-child{flex-grow:1 !important}.flex-lg-grow-start-and-end>:first-child,.flex-lg-grow-start-and-end>:last-child{flex-grow:1 !important}.flex-lg-grow-middle>*:not(:first-child):not(:last-child){flex-grow:1 !important}.flex-lg-grow-all>*{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-lg-start{justify-content:flex-start !important}.justify-lg-end{justify-content:flex-end !important}.justify-lg-center{justify-content:center !important}.justify-lg-space-between{justify-content:space-between !important}.justify-lg-space-around{justify-content:space-around !important}.justify-lg-space-evenly{justify-content:space-evenly !important}.order-lg-first{order:-9999 !important}.order-lg-last{order:9999 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-6{order:6 !important}.order-lg-7{order:7 !important}.order-lg-8{order:8 !important}.order-lg-9{order:9 !important}.order-lg-10{order:10 !important}.order-lg-11{order:11 !important}.order-lg-12{order:12 !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-space-between{align-content:space-between !important}.align-content-lg-space-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-lg-start{align-items:flex-start !important}.align-lg-end{align-items:flex-end !important}.align-lg-center{align-items:center !important}.align-lg-baseline{align-items:baseline !important}.align-lg-stretch{align-items:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-stretch{align-self:stretch !important}.gap-lg-0{gap:0px}.gap-x-lg-0{column-gap:0px}.gap-y-lg-0{row-gap:0px}.gap-lg-1{gap:4px}.gap-x-lg-1{column-gap:4px}.gap-y-lg-1{row-gap:4px}.gap-lg-2{gap:8px}.gap-x-lg-2{column-gap:8px}.gap-y-lg-2{row-gap:8px}.gap-lg-3{gap:12px}.gap-x-lg-3{column-gap:12px}.gap-y-lg-3{row-gap:12px}.gap-lg-4{gap:16px}.gap-x-lg-4{column-gap:16px}.gap-y-lg-4{row-gap:16px}.gap-lg-5{gap:20px}.gap-x-lg-5{column-gap:20px}.gap-y-lg-5{row-gap:20px}.gap-lg-6{gap:24px}.gap-x-lg-6{column-gap:24px}.gap-y-lg-6{row-gap:24px}.gap-lg-7{gap:28px}.gap-x-lg-7{column-gap:28px}.gap-y-lg-7{row-gap:28px}.gap-lg-8{gap:32px}.gap-x-lg-8{column-gap:32px}.gap-y-lg-8{row-gap:32px}.gap-lg-9{gap:36px}.gap-x-lg-9{column-gap:36px}.gap-y-lg-9{row-gap:36px}.gap-lg-10{gap:40px}.gap-x-lg-10{column-gap:40px}.gap-y-lg-10{row-gap:40px}.gap-lg-11{gap:44px}.gap-x-lg-11{column-gap:44px}.gap-y-lg-11{row-gap:44px}.gap-lg-12{gap:48px}.gap-x-lg-12{column-gap:48px}.gap-y-lg-12{row-gap:48px}.gap-lg-13{gap:52px}.gap-x-lg-13{column-gap:52px}.gap-y-lg-13{row-gap:52px}.gap-lg-14{gap:56px}.gap-x-lg-14{column-gap:56px}.gap-y-lg-14{row-gap:56px}.gap-lg-15{gap:60px}.gap-x-lg-15{column-gap:60px}.gap-y-lg-15{row-gap:60px}.gap-lg-16{gap:64px}.gap-x-lg-16{column-gap:64px}.gap-y-lg-16{row-gap:64px}.gap-lg-17{gap:68px}.gap-x-lg-17{column-gap:68px}.gap-y-lg-17{row-gap:68px}.gap-lg-18{gap:72px}.gap-x-lg-18{column-gap:72px}.gap-y-lg-18{row-gap:72px}.gap-lg-19{gap:76px}.gap-x-lg-19{column-gap:76px}.gap-y-lg-19{row-gap:76px}.gap-lg-20{gap:80px}.gap-x-lg-20{column-gap:80px}.gap-y-lg-20{row-gap:80px}}@media(min-width: 1920px){.flex-xl-1{flex:1 1 0% !important}.flex-xl-auto{flex:1 1 auto !important}.flex-xl-initial{flex:0 1 auto !important}.flex-xl-none{flex:none !important}.flex-xl-row{flex-direction:row !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column{flex-direction:column !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-grow-start>*:first-child{flex-grow:1 !important}.flex-xl-grow-end>*:last-child{flex-grow:1 !important}.flex-xl-grow-start-and-end>:first-child,.flex-xl-grow-start-and-end>:last-child{flex-grow:1 !important}.flex-xl-grow-middle>*:not(:first-child):not(:last-child){flex-grow:1 !important}.flex-xl-grow-all>*{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-xl-start{justify-content:flex-start !important}.justify-xl-end{justify-content:flex-end !important}.justify-xl-center{justify-content:center !important}.justify-xl-space-between{justify-content:space-between !important}.justify-xl-space-around{justify-content:space-around !important}.justify-xl-space-evenly{justify-content:space-evenly !important}.order-xl-first{order:-9999 !important}.order-xl-last{order:9999 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-6{order:6 !important}.order-xl-7{order:7 !important}.order-xl-8{order:8 !important}.order-xl-9{order:9 !important}.order-xl-10{order:10 !important}.order-xl-11{order:11 !important}.order-xl-12{order:12 !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-space-between{align-content:space-between !important}.align-content-xl-space-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-xl-start{align-items:flex-start !important}.align-xl-end{align-items:flex-end !important}.align-xl-center{align-items:center !important}.align-xl-baseline{align-items:baseline !important}.align-xl-stretch{align-items:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-stretch{align-self:stretch !important}.gap-xl-0{gap:0px}.gap-x-xl-0{column-gap:0px}.gap-y-xl-0{row-gap:0px}.gap-xl-1{gap:4px}.gap-x-xl-1{column-gap:4px}.gap-y-xl-1{row-gap:4px}.gap-xl-2{gap:8px}.gap-x-xl-2{column-gap:8px}.gap-y-xl-2{row-gap:8px}.gap-xl-3{gap:12px}.gap-x-xl-3{column-gap:12px}.gap-y-xl-3{row-gap:12px}.gap-xl-4{gap:16px}.gap-x-xl-4{column-gap:16px}.gap-y-xl-4{row-gap:16px}.gap-xl-5{gap:20px}.gap-x-xl-5{column-gap:20px}.gap-y-xl-5{row-gap:20px}.gap-xl-6{gap:24px}.gap-x-xl-6{column-gap:24px}.gap-y-xl-6{row-gap:24px}.gap-xl-7{gap:28px}.gap-x-xl-7{column-gap:28px}.gap-y-xl-7{row-gap:28px}.gap-xl-8{gap:32px}.gap-x-xl-8{column-gap:32px}.gap-y-xl-8{row-gap:32px}.gap-xl-9{gap:36px}.gap-x-xl-9{column-gap:36px}.gap-y-xl-9{row-gap:36px}.gap-xl-10{gap:40px}.gap-x-xl-10{column-gap:40px}.gap-y-xl-10{row-gap:40px}.gap-xl-11{gap:44px}.gap-x-xl-11{column-gap:44px}.gap-y-xl-11{row-gap:44px}.gap-xl-12{gap:48px}.gap-x-xl-12{column-gap:48px}.gap-y-xl-12{row-gap:48px}.gap-xl-13{gap:52px}.gap-x-xl-13{column-gap:52px}.gap-y-xl-13{row-gap:52px}.gap-xl-14{gap:56px}.gap-x-xl-14{column-gap:56px}.gap-y-xl-14{row-gap:56px}.gap-xl-15{gap:60px}.gap-x-xl-15{column-gap:60px}.gap-y-xl-15{row-gap:60px}.gap-xl-16{gap:64px}.gap-x-xl-16{column-gap:64px}.gap-y-xl-16{row-gap:64px}.gap-xl-17{gap:68px}.gap-x-xl-17{column-gap:68px}.gap-y-xl-17{row-gap:68px}.gap-xl-18{gap:72px}.gap-x-xl-18{column-gap:72px}.gap-y-xl-18{row-gap:72px}.gap-xl-19{gap:76px}.gap-x-xl-19{column-gap:76px}.gap-y-xl-19{row-gap:76px}.gap-xl-20{gap:80px}.gap-x-xl-20{column-gap:80px}.gap-y-xl-20{row-gap:80px}}@media(min-width: 2560px){.flex-xxl-1{flex:1 1 0% !important}.flex-xxl-auto{flex:1 1 auto !important}.flex-xxl-initial{flex:0 1 auto !important}.flex-xxl-none{flex:none !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-grow-start>*:first-child{flex-grow:1 !important}.flex-xxl-grow-end>*:last-child{flex-grow:1 !important}.flex-xxl-grow-start-and-end>:first-child,.flex-xxl-grow-start-and-end>:last-child{flex-grow:1 !important}.flex-xxl-grow-middle>*:not(:first-child):not(:last-child){flex-grow:1 !important}.flex-xxl-grow-all>*{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-xxl-start{justify-content:flex-start !important}.justify-xxl-end{justify-content:flex-end !important}.justify-xxl-center{justify-content:center !important}.justify-xxl-space-between{justify-content:space-between !important}.justify-xxl-space-around{justify-content:space-around !important}.justify-xxl-space-evenly{justify-content:space-evenly !important}.order-xxl-first{order:-9999 !important}.order-xxl-last{order:9999 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-6{order:6 !important}.order-xxl-7{order:7 !important}.order-xxl-8{order:8 !important}.order-xxl-9{order:9 !important}.order-xxl-10{order:10 !important}.order-xxl-11{order:11 !important}.order-xxl-12{order:12 !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-space-between{align-content:space-between !important}.align-content-xxl-space-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-xxl-start{align-items:flex-start !important}.align-xxl-end{align-items:flex-end !important}.align-xxl-center{align-items:center !important}.align-xxl-baseline{align-items:baseline !important}.align-xxl-stretch{align-items:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-stretch{align-self:stretch !important}.gap-xxl-0{gap:0px}.gap-x-xxl-0{column-gap:0px}.gap-y-xxl-0{row-gap:0px}.gap-xxl-1{gap:4px}.gap-x-xxl-1{column-gap:4px}.gap-y-xxl-1{row-gap:4px}.gap-xxl-2{gap:8px}.gap-x-xxl-2{column-gap:8px}.gap-y-xxl-2{row-gap:8px}.gap-xxl-3{gap:12px}.gap-x-xxl-3{column-gap:12px}.gap-y-xxl-3{row-gap:12px}.gap-xxl-4{gap:16px}.gap-x-xxl-4{column-gap:16px}.gap-y-xxl-4{row-gap:16px}.gap-xxl-5{gap:20px}.gap-x-xxl-5{column-gap:20px}.gap-y-xxl-5{row-gap:20px}.gap-xxl-6{gap:24px}.gap-x-xxl-6{column-gap:24px}.gap-y-xxl-6{row-gap:24px}.gap-xxl-7{gap:28px}.gap-x-xxl-7{column-gap:28px}.gap-y-xxl-7{row-gap:28px}.gap-xxl-8{gap:32px}.gap-x-xxl-8{column-gap:32px}.gap-y-xxl-8{row-gap:32px}.gap-xxl-9{gap:36px}.gap-x-xxl-9{column-gap:36px}.gap-y-xxl-9{row-gap:36px}.gap-xxl-10{gap:40px}.gap-x-xxl-10{column-gap:40px}.gap-y-xxl-10{row-gap:40px}.gap-xxl-11{gap:44px}.gap-x-xxl-11{column-gap:44px}.gap-y-xxl-11{row-gap:44px}.gap-xxl-12{gap:48px}.gap-x-xxl-12{column-gap:48px}.gap-y-xxl-12{row-gap:48px}.gap-xxl-13{gap:52px}.gap-x-xxl-13{column-gap:52px}.gap-y-xxl-13{row-gap:52px}.gap-xxl-14{gap:56px}.gap-x-xxl-14{column-gap:56px}.gap-y-xxl-14{row-gap:56px}.gap-xxl-15{gap:60px}.gap-x-xxl-15{column-gap:60px}.gap-y-xxl-15{row-gap:60px}.gap-xxl-16{gap:64px}.gap-x-xxl-16{column-gap:64px}.gap-y-xxl-16{row-gap:64px}.gap-xxl-17{gap:68px}.gap-x-xxl-17{column-gap:68px}.gap-y-xxl-17{row-gap:68px}.gap-xxl-18{gap:72px}.gap-x-xxl-18{column-gap:72px}.gap-y-xxl-18{row-gap:72px}.gap-xxl-19{gap:76px}.gap-x-xxl-19{column-gap:76px}.gap-y-xxl-19{row-gap:76px}.gap-xxl-20{gap:80px}.gap-x-xxl-20{column-gap:80px}.gap-y-xxl-20{row-gap:80px}}.cursor-auto{cursor:auto !important}.cursor-default{cursor:default !important}.cursor-pointer{cursor:pointer !important}.cursor-wait{cursor:wait !important}.cursor-text{cursor:text !important}.cursor-move{cursor:move !important}.cursor-help{cursor:help !important}.cursor-not-allowed{cursor:not-allowed !important}.cursor-none{cursor:none !important}.cursor-progress{cursor:progress !important}.cursor-cell{cursor:cell !important}.cursor-crosshair{cursor:crosshair !important}.cursor-vertical-text{cursor:vertical-text !important}.cursor-alias{cursor:alias !important}.cursor-copy{cursor:copy !important}.cursor-no-drop{cursor:no-drop !important}.cursor-grab{cursor:grab !important}.cursor-grabbing{cursor:grabbing !important}.cursor-all-scroll{cursor:all-scroll !important}.cursor-col-resize{cursor:col-resize !important}.cursor-row-resize{cursor:row-resize !important}.cursor-n-resize{cursor:n-resize !important}.cursor-w-resize{cursor:w-resize !important}.cursor-zoom-in{cursor:zoom-in !important}.cursor-zoom-out{cursor:zoom-out !important}.cursor-url{cursor:url !important}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.d-none{display:none !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}@media(min-width: 600px){.d-sm-none{display:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}}@media(min-width: 960px){.d-md-none{display:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}}@media(min-width: 1280px){.d-lg-none{display:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}}@media(min-width: 1920px){.d-xl-none{display:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}}@media(min-width: 2560px){.d-xxl-none{display:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}}.object-none{object-fit:none !important}.object-cover{object-fit:cover !important}.object-contain{object-fit:contain !important}.object-fill{object-fit:fill !important}.object-scale-down{object-fit:scale-down !important}.object-center{object-position:center !important}.object-top{object-position:top !important}.object-bottom{object-position:bottom !important}.object-left{object-position:left !important}.object-left-top{object-position:left top !important}.object-left-bottom{object-position:left bottom !important}.object-right{object-position:right !important}.object-right-top{object-position:right top !important}.object-right-bottom{object-position:right bottom !important}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-scroll{overflow:scroll}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-hidden{overflow-y:hidden}.overflow-x-visible{overflow-x:visible}.overflow-y-visible{overflow-y:visible}.overflow-x-scroll{overflow-x:scroll}.overflow-y-scroll{overflow-y:scroll}.absolute{position:absolute !important}.fixed{position:fixed !important}.relative{position:relative !important}.static{position:static !important}.sticky{position:sticky !important}.visible{visibility:visible}.invisible{visibility:hidden}[hidden]{display:none !important}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-60{z-index:60}.z-70{z-index:70}.z-80{z-index:80}.z-90{z-index:90}.z-100{z-index:100}.z-auto{z-index:auto}.mt-0,.my-0{margin-top:0 !important}.mr-0,.mx-0{margin-right:0 !important}.ml-0,.mx-0{margin-left:0 !important}.mb-0,.my-0{margin-bottom:0 !important}.ms-0{margin-inline-start:0 !important}.me-0{margin-inline-end:0 !important}.ma-0{margin:0 !important}.mt-1,.my-1{margin-top:4px !important}.mr-1,.mx-1{margin-right:4px !important}.ml-1,.mx-1{margin-left:4px !important}.mb-1,.my-1{margin-bottom:4px !important}.ms-1{margin-inline-start:4px !important}.me-1{margin-inline-end:4px !important}.ma-1{margin:4px !important}.mt-2,.my-2{margin-top:8px !important}.mr-2,.mx-2{margin-right:8px !important}.ml-2,.mx-2{margin-left:8px !important}.mb-2,.my-2{margin-bottom:8px !important}.ms-2{margin-inline-start:8px !important}.me-2{margin-inline-end:8px !important}.ma-2{margin:8px !important}.mt-3,.my-3{margin-top:12px !important}.mr-3,.mx-3{margin-right:12px !important}.ml-3,.mx-3{margin-left:12px !important}.mb-3,.my-3{margin-bottom:12px !important}.ms-3{margin-inline-start:12px !important}.me-3{margin-inline-end:12px !important}.ma-3{margin:12px !important}.mt-4,.my-4{margin-top:16px !important}.mr-4,.mx-4{margin-right:16px !important}.ml-4,.mx-4{margin-left:16px !important}.mb-4,.my-4{margin-bottom:16px !important}.ms-4{margin-inline-start:16px !important}.me-4{margin-inline-end:16px !important}.ma-4{margin:16px !important}.mt-5,.my-5{margin-top:20px !important}.mr-5,.mx-5{margin-right:20px !important}.ml-5,.mx-5{margin-left:20px !important}.mb-5,.my-5{margin-bottom:20px !important}.ms-5{margin-inline-start:20px !important}.me-5{margin-inline-end:20px !important}.ma-5{margin:20px !important}.mt-6,.my-6{margin-top:24px !important}.mr-6,.mx-6{margin-right:24px !important}.ml-6,.mx-6{margin-left:24px !important}.mb-6,.my-6{margin-bottom:24px !important}.ms-6{margin-inline-start:24px !important}.me-6{margin-inline-end:24px !important}.ma-6{margin:24px !important}.mt-7,.my-7{margin-top:28px !important}.mr-7,.mx-7{margin-right:28px !important}.ml-7,.mx-7{margin-left:28px !important}.mb-7,.my-7{margin-bottom:28px !important}.ms-7{margin-inline-start:28px !important}.me-7{margin-inline-end:28px !important}.ma-7{margin:28px !important}.mt-8,.my-8{margin-top:32px !important}.mr-8,.mx-8{margin-right:32px !important}.ml-8,.mx-8{margin-left:32px !important}.mb-8,.my-8{margin-bottom:32px !important}.ms-8{margin-inline-start:32px !important}.me-8{margin-inline-end:32px !important}.ma-8{margin:32px !important}.mt-9,.my-9{margin-top:36px !important}.mr-9,.mx-9{margin-right:36px !important}.ml-9,.mx-9{margin-left:36px !important}.mb-9,.my-9{margin-bottom:36px !important}.ms-9{margin-inline-start:36px !important}.me-9{margin-inline-end:36px !important}.ma-9{margin:36px !important}.mt-10,.my-10{margin-top:40px !important}.mr-10,.mx-10{margin-right:40px !important}.ml-10,.mx-10{margin-left:40px !important}.mb-10,.my-10{margin-bottom:40px !important}.ms-10{margin-inline-start:40px !important}.me-10{margin-inline-end:40px !important}.ma-10{margin:40px !important}.mt-11,.my-11{margin-top:44px !important}.mr-11,.mx-11{margin-right:44px !important}.ml-11,.mx-11{margin-left:44px !important}.mb-11,.my-11{margin-bottom:44px !important}.ms-11{margin-inline-start:44px !important}.me-11{margin-inline-end:44px !important}.ma-11{margin:44px !important}.mt-12,.my-12{margin-top:48px !important}.mr-12,.mx-12{margin-right:48px !important}.ml-12,.mx-12{margin-left:48px !important}.mb-12,.my-12{margin-bottom:48px !important}.ms-12{margin-inline-start:48px !important}.me-12{margin-inline-end:48px !important}.ma-12{margin:48px !important}.mt-13,.my-13{margin-top:52px !important}.mr-13,.mx-13{margin-right:52px !important}.ml-13,.mx-13{margin-left:52px !important}.mb-13,.my-13{margin-bottom:52px !important}.ms-13{margin-inline-start:52px !important}.me-13{margin-inline-end:52px !important}.ma-13{margin:52px !important}.mt-14,.my-14{margin-top:56px !important}.mr-14,.mx-14{margin-right:56px !important}.ml-14,.mx-14{margin-left:56px !important}.mb-14,.my-14{margin-bottom:56px !important}.ms-14{margin-inline-start:56px !important}.me-14{margin-inline-end:56px !important}.ma-14{margin:56px !important}.mt-15,.my-15{margin-top:60px !important}.mr-15,.mx-15{margin-right:60px !important}.ml-15,.mx-15{margin-left:60px !important}.mb-15,.my-15{margin-bottom:60px !important}.ms-15{margin-inline-start:60px !important}.me-15{margin-inline-end:60px !important}.ma-15{margin:60px !important}.mt-16,.my-16{margin-top:64px !important}.mr-16,.mx-16{margin-right:64px !important}.ml-16,.mx-16{margin-left:64px !important}.mb-16,.my-16{margin-bottom:64px !important}.ms-16{margin-inline-start:64px !important}.me-16{margin-inline-end:64px !important}.ma-16{margin:64px !important}.mt-17,.my-17{margin-top:68px !important}.mr-17,.mx-17{margin-right:68px !important}.ml-17,.mx-17{margin-left:68px !important}.mb-17,.my-17{margin-bottom:68px !important}.ms-17{margin-inline-start:68px !important}.me-17{margin-inline-end:68px !important}.ma-17{margin:68px !important}.mt-18,.my-18{margin-top:72px !important}.mr-18,.mx-18{margin-right:72px !important}.ml-18,.mx-18{margin-left:72px !important}.mb-18,.my-18{margin-bottom:72px !important}.ms-18{margin-inline-start:72px !important}.me-18{margin-inline-end:72px !important}.ma-18{margin:72px !important}.mt-19,.my-19{margin-top:76px !important}.mr-19,.mx-19{margin-right:76px !important}.ml-19,.mx-19{margin-left:76px !important}.mb-19,.my-19{margin-bottom:76px !important}.ms-19{margin-inline-start:76px !important}.me-19{margin-inline-end:76px !important}.ma-19{margin:76px !important}.mt-20,.my-20{margin-top:80px !important}.mr-20,.mx-20{margin-right:80px !important}.ml-20,.mx-20{margin-left:80px !important}.mb-20,.my-20{margin-bottom:80px !important}.ms-20{margin-inline-start:80px !important}.me-20{margin-inline-end:80px !important}.ma-20{margin:80px !important}.mt-auto,.my-auto{margin-top:auto !important}.mr-auto,.mx-auto{margin-right:auto !important}.ml-auto,.mx-auto{margin-left:auto !important}.mb-auto,.my-auto{margin-bottom:auto !important}.ms-auto{margin-inline-start:auto !important}.me-auto{margin-inline-end:auto !important}.ma-auto{margin:auto !important}.pt-0,.py-0{padding-top:0 !important}.pr-0,.px-0{padding-right:0 !important}.pl-0,.px-0{padding-left:0 !important}.pb-0,.py-0{padding-bottom:0 !important}.ps-0{padding-inline-start:0 !important}.pe-0{padding-inline-end:0 !important}.pa-0{padding:0 !important}.pt-1,.py-1{padding-top:4px !important}.pr-1,.px-1{padding-right:4px !important}.pl-1,.px-1{padding-left:4px !important}.pb-1,.py-1{padding-bottom:4px !important}.ps-1{padding-inline-start:4px !important}.pe-1{padding-inline-end:4px !important}.pa-1{padding:4px !important}.pt-2,.py-2{padding-top:8px !important}.pr-2,.px-2{padding-right:8px !important}.pl-2,.px-2{padding-left:8px !important}.pb-2,.py-2{padding-bottom:8px !important}.ps-2{padding-inline-start:8px !important}.pe-2{padding-inline-end:8px !important}.pa-2{padding:8px !important}.pt-3,.py-3{padding-top:12px !important}.pr-3,.px-3{padding-right:12px !important}.pl-3,.px-3{padding-left:12px !important}.pb-3,.py-3{padding-bottom:12px !important}.ps-3{padding-inline-start:12px !important}.pe-3{padding-inline-end:12px !important}.pa-3{padding:12px !important}.pt-4,.py-4{padding-top:16px !important}.pr-4,.px-4{padding-right:16px !important}.pl-4,.px-4{padding-left:16px !important}.pb-4,.py-4{padding-bottom:16px !important}.ps-4{padding-inline-start:16px !important}.pe-4{padding-inline-end:16px !important}.pa-4{padding:16px !important}.pt-5,.py-5{padding-top:20px !important}.pr-5,.px-5{padding-right:20px !important}.pl-5,.px-5{padding-left:20px !important}.pb-5,.py-5{padding-bottom:20px !important}.ps-5{padding-inline-start:20px !important}.pe-5{padding-inline-end:20px !important}.pa-5{padding:20px !important}.pt-6,.py-6{padding-top:24px !important}.pr-6,.px-6{padding-right:24px !important}.pl-6,.px-6{padding-left:24px !important}.pb-6,.py-6{padding-bottom:24px !important}.ps-6{padding-inline-start:24px !important}.pe-6{padding-inline-end:24px !important}.pa-6{padding:24px !important}.pt-7,.py-7{padding-top:28px !important}.pr-7,.px-7{padding-right:28px !important}.pl-7,.px-7{padding-left:28px !important}.pb-7,.py-7{padding-bottom:28px !important}.ps-7{padding-inline-start:28px !important}.pe-7{padding-inline-end:28px !important}.pa-7{padding:28px !important}.pt-8,.py-8{padding-top:32px !important}.pr-8,.px-8{padding-right:32px !important}.pl-8,.px-8{padding-left:32px !important}.pb-8,.py-8{padding-bottom:32px !important}.ps-8{padding-inline-start:32px !important}.pe-8{padding-inline-end:32px !important}.pa-8{padding:32px !important}.pt-9,.py-9{padding-top:36px !important}.pr-9,.px-9{padding-right:36px !important}.pl-9,.px-9{padding-left:36px !important}.pb-9,.py-9{padding-bottom:36px !important}.ps-9{padding-inline-start:36px !important}.pe-9{padding-inline-end:36px !important}.pa-9{padding:36px !important}.pt-10,.py-10{padding-top:40px !important}.pr-10,.px-10{padding-right:40px !important}.pl-10,.px-10{padding-left:40px !important}.pb-10,.py-10{padding-bottom:40px !important}.ps-10{padding-inline-start:40px !important}.pe-10{padding-inline-end:40px !important}.pa-10{padding:40px !important}.pt-11,.py-11{padding-top:44px !important}.pr-11,.px-11{padding-right:44px !important}.pl-11,.px-11{padding-left:44px !important}.pb-11,.py-11{padding-bottom:44px !important}.ps-11{padding-inline-start:44px !important}.pe-11{padding-inline-end:44px !important}.pa-11{padding:44px !important}.pt-12,.py-12{padding-top:48px !important}.pr-12,.px-12{padding-right:48px !important}.pl-12,.px-12{padding-left:48px !important}.pb-12,.py-12{padding-bottom:48px !important}.ps-12{padding-inline-start:48px !important}.pe-12{padding-inline-end:48px !important}.pa-12{padding:48px !important}.pt-13,.py-13{padding-top:52px !important}.pr-13,.px-13{padding-right:52px !important}.pl-13,.px-13{padding-left:52px !important}.pb-13,.py-13{padding-bottom:52px !important}.ps-13{padding-inline-start:52px !important}.pe-13{padding-inline-end:52px !important}.pa-13{padding:52px !important}.pt-14,.py-14{padding-top:56px !important}.pr-14,.px-14{padding-right:56px !important}.pl-14,.px-14{padding-left:56px !important}.pb-14,.py-14{padding-bottom:56px !important}.ps-14{padding-inline-start:56px !important}.pe-14{padding-inline-end:56px !important}.pa-14{padding:56px !important}.pt-15,.py-15{padding-top:60px !important}.pr-15,.px-15{padding-right:60px !important}.pl-15,.px-15{padding-left:60px !important}.pb-15,.py-15{padding-bottom:60px !important}.ps-15{padding-inline-start:60px !important}.pe-15{padding-inline-end:60px !important}.pa-15{padding:60px !important}.pt-16,.py-16{padding-top:64px !important}.pr-16,.px-16{padding-right:64px !important}.pl-16,.px-16{padding-left:64px !important}.pb-16,.py-16{padding-bottom:64px !important}.ps-16{padding-inline-start:64px !important}.pe-16{padding-inline-end:64px !important}.pa-16{padding:64px !important}.pt-17,.py-17{padding-top:68px !important}.pr-17,.px-17{padding-right:68px !important}.pl-17,.px-17{padding-left:68px !important}.pb-17,.py-17{padding-bottom:68px !important}.ps-17{padding-inline-start:68px !important}.pe-17{padding-inline-end:68px !important}.pa-17{padding:68px !important}.pt-18,.py-18{padding-top:72px !important}.pr-18,.px-18{padding-right:72px !important}.pl-18,.px-18{padding-left:72px !important}.pb-18,.py-18{padding-bottom:72px !important}.ps-18{padding-inline-start:72px !important}.pe-18{padding-inline-end:72px !important}.pa-18{padding:72px !important}.pt-19,.py-19{padding-top:76px !important}.pr-19,.px-19{padding-right:76px !important}.pl-19,.px-19{padding-left:76px !important}.pb-19,.py-19{padding-bottom:76px !important}.ps-19{padding-inline-start:76px !important}.pe-19{padding-inline-end:76px !important}.pa-19{padding:76px !important}.pt-20,.py-20{padding-top:80px !important}.pr-20,.px-20{padding-right:80px !important}.pl-20,.px-20{padding-left:80px !important}.pb-20,.py-20{padding-bottom:80px !important}.ps-20{padding-inline-start:80px !important}.pe-20{padding-inline-end:80px !important}.pa-20{padding:80px !important}.pt-auto,.py-auto{padding-top:auto !important}.pr-auto,.px-auto{padding-right:auto !important}.pl-auto,.px-auto{padding-left:auto !important}.pb-auto,.py-auto{padding-bottom:auto !important}.ps-auto{padding-inline-start:auto !important}.pe-auto{padding-inline-end:auto !important}.pa-auto{padding:auto !important}.mt-n1,.my-n1{margin-top:-4px !important}.mr-n1,.mx-n1{margin-right:-4px !important}.ml-n1,.mx-n1{margin-left:-4px !important}.mb-n1,.my-n1{margin-bottom:-4px !important}.ms-n1{margin-inline-start:-4px !important}.me-n1{margin-inline-end:-4px !important}.ma-n1{margin:-4px !important}.mt-n2,.my-n2{margin-top:-8px !important}.mr-n2,.mx-n2{margin-right:-8px !important}.ml-n2,.mx-n2{margin-left:-8px !important}.mb-n2,.my-n2{margin-bottom:-8px !important}.ms-n2{margin-inline-start:-8px !important}.me-n2{margin-inline-end:-8px !important}.ma-n2{margin:-8px !important}.mt-n3,.my-n3{margin-top:-12px !important}.mr-n3,.mx-n3{margin-right:-12px !important}.ml-n3,.mx-n3{margin-left:-12px !important}.mb-n3,.my-n3{margin-bottom:-12px !important}.ms-n3{margin-inline-start:-12px !important}.me-n3{margin-inline-end:-12px !important}.ma-n3{margin:-12px !important}.mt-n4,.my-n4{margin-top:-16px !important}.mr-n4,.mx-n4{margin-right:-16px !important}.ml-n4,.mx-n4{margin-left:-16px !important}.mb-n4,.my-n4{margin-bottom:-16px !important}.ms-n4{margin-inline-start:-16px !important}.me-n4{margin-inline-end:-16px !important}.ma-n4{margin:-16px !important}.mt-n5,.my-n5{margin-top:-20px !important}.mr-n5,.mx-n5{margin-right:-20px !important}.ml-n5,.mx-n5{margin-left:-20px !important}.mb-n5,.my-n5{margin-bottom:-20px !important}.ms-n5{margin-inline-start:-20px !important}.me-n5{margin-inline-end:-20px !important}.ma-n5{margin:-20px !important}.mt-n6,.my-n6{margin-top:-24px !important}.mr-n6,.mx-n6{margin-right:-24px !important}.ml-n6,.mx-n6{margin-left:-24px !important}.mb-n6,.my-n6{margin-bottom:-24px !important}.ms-n6{margin-inline-start:-24px !important}.me-n6{margin-inline-end:-24px !important}.ma-n6{margin:-24px !important}.mt-n7,.my-n7{margin-top:-28px !important}.mr-n7,.mx-n7{margin-right:-28px !important}.ml-n7,.mx-n7{margin-left:-28px !important}.mb-n7,.my-n7{margin-bottom:-28px !important}.ms-n7{margin-inline-start:-28px !important}.me-n7{margin-inline-end:-28px !important}.ma-n7{margin:-28px !important}.mt-n8,.my-n8{margin-top:-32px !important}.mr-n8,.mx-n8{margin-right:-32px !important}.ml-n8,.mx-n8{margin-left:-32px !important}.mb-n8,.my-n8{margin-bottom:-32px !important}.ms-n8{margin-inline-start:-32px !important}.me-n8{margin-inline-end:-32px !important}.ma-n8{margin:-32px !important}.mt-n9,.my-n9{margin-top:-36px !important}.mr-n9,.mx-n9{margin-right:-36px !important}.ml-n9,.mx-n9{margin-left:-36px !important}.mb-n9,.my-n9{margin-bottom:-36px !important}.ms-n9{margin-inline-start:-36px !important}.me-n9{margin-inline-end:-36px !important}.ma-n9{margin:-36px !important}.mt-n10,.my-n10{margin-top:-40px !important}.mr-n10,.mx-n10{margin-right:-40px !important}.ml-n10,.mx-n10{margin-left:-40px !important}.mb-n10,.my-n10{margin-bottom:-40px !important}.ms-n10{margin-inline-start:-40px !important}.me-n10{margin-inline-end:-40px !important}.ma-n10{margin:-40px !important}.mt-n11,.my-n11{margin-top:-44px !important}.mr-n11,.mx-n11{margin-right:-44px !important}.ml-n11,.mx-n11{margin-left:-44px !important}.mb-n11,.my-n11{margin-bottom:-44px !important}.ms-n11{margin-inline-start:-44px !important}.me-n11{margin-inline-end:-44px !important}.ma-n11{margin:-44px !important}.mt-n12,.my-n12{margin-top:-48px !important}.mr-n12,.mx-n12{margin-right:-48px !important}.ml-n12,.mx-n12{margin-left:-48px !important}.mb-n12,.my-n12{margin-bottom:-48px !important}.ms-n12{margin-inline-start:-48px !important}.me-n12{margin-inline-end:-48px !important}.ma-n12{margin:-48px !important}.mt-n13,.my-n13{margin-top:-52px !important}.mr-n13,.mx-n13{margin-right:-52px !important}.ml-n13,.mx-n13{margin-left:-52px !important}.mb-n13,.my-n13{margin-bottom:-52px !important}.ms-n13{margin-inline-start:-52px !important}.me-n13{margin-inline-end:-52px !important}.ma-n13{margin:-52px !important}.mt-n14,.my-n14{margin-top:-56px !important}.mr-n14,.mx-n14{margin-right:-56px !important}.ml-n14,.mx-n14{margin-left:-56px !important}.mb-n14,.my-n14{margin-bottom:-56px !important}.ms-n14{margin-inline-start:-56px !important}.me-n14{margin-inline-end:-56px !important}.ma-n14{margin:-56px !important}.mt-n15,.my-n15{margin-top:-60px !important}.mr-n15,.mx-n15{margin-right:-60px !important}.ml-n15,.mx-n15{margin-left:-60px !important}.mb-n15,.my-n15{margin-bottom:-60px !important}.ms-n15{margin-inline-start:-60px !important}.me-n15{margin-inline-end:-60px !important}.ma-n15{margin:-60px !important}.mt-n16,.my-n16{margin-top:-64px !important}.mr-n16,.mx-n16{margin-right:-64px !important}.ml-n16,.mx-n16{margin-left:-64px !important}.mb-n16,.my-n16{margin-bottom:-64px !important}.ms-n16{margin-inline-start:-64px !important}.me-n16{margin-inline-end:-64px !important}.ma-n16{margin:-64px !important}.mt-n17,.my-n17{margin-top:-68px !important}.mr-n17,.mx-n17{margin-right:-68px !important}.ml-n17,.mx-n17{margin-left:-68px !important}.mb-n17,.my-n17{margin-bottom:-68px !important}.ms-n17{margin-inline-start:-68px !important}.me-n17{margin-inline-end:-68px !important}.ma-n17{margin:-68px !important}.mt-n18,.my-n18{margin-top:-72px !important}.mr-n18,.mx-n18{margin-right:-72px !important}.ml-n18,.mx-n18{margin-left:-72px !important}.mb-n18,.my-n18{margin-bottom:-72px !important}.ms-n18{margin-inline-start:-72px !important}.me-n18{margin-inline-end:-72px !important}.ma-n18{margin:-72px !important}.mt-n19,.my-n19{margin-top:-76px !important}.mr-n19,.mx-n19{margin-right:-76px !important}.ml-n19,.mx-n19{margin-left:-76px !important}.mb-n19,.my-n19{margin-bottom:-76px !important}.ms-n19{margin-inline-start:-76px !important}.me-n19{margin-inline-end:-76px !important}.ma-n19{margin:-76px !important}.mt-n20,.my-n20{margin-top:-80px !important}.mr-n20,.mx-n20{margin-right:-80px !important}.ml-n20,.mx-n20{margin-left:-80px !important}.mb-n20,.my-n20{margin-bottom:-80px !important}.ms-n20{margin-inline-start:-80px !important}.me-n20{margin-inline-end:-80px !important}.ma-n20{margin:-80px !important}@media screen and (min-width: 600px){.mt-sm-0,.my-sm-0{margin-top:0 !important}.mr-sm-0,.mx-sm-0{margin-right:0 !important}.ml-sm-0,.mx-sm-0{margin-left:0 !important}.mb-sm-0,.my-sm-0{margin-bottom:0 !important}.ms-sm-0{margin-inline-start:0 !important}.me-sm-0{margin-inline-end:0 !important}.ma-sm-0{margin:0 !important}.mt-sm-1,.my-sm-1{margin-top:4px !important}.mr-sm-1,.mx-sm-1{margin-right:4px !important}.ml-sm-1,.mx-sm-1{margin-left:4px !important}.mb-sm-1,.my-sm-1{margin-bottom:4px !important}.ms-sm-1{margin-inline-start:4px !important}.me-sm-1{margin-inline-end:4px !important}.ma-sm-1{margin:4px !important}.mt-sm-2,.my-sm-2{margin-top:8px !important}.mr-sm-2,.mx-sm-2{margin-right:8px !important}.ml-sm-2,.mx-sm-2{margin-left:8px !important}.mb-sm-2,.my-sm-2{margin-bottom:8px !important}.ms-sm-2{margin-inline-start:8px !important}.me-sm-2{margin-inline-end:8px !important}.ma-sm-2{margin:8px !important}.mt-sm-3,.my-sm-3{margin-top:12px !important}.mr-sm-3,.mx-sm-3{margin-right:12px !important}.ml-sm-3,.mx-sm-3{margin-left:12px !important}.mb-sm-3,.my-sm-3{margin-bottom:12px !important}.ms-sm-3{margin-inline-start:12px !important}.me-sm-3{margin-inline-end:12px !important}.ma-sm-3{margin:12px !important}.mt-sm-4,.my-sm-4{margin-top:16px !important}.mr-sm-4,.mx-sm-4{margin-right:16px !important}.ml-sm-4,.mx-sm-4{margin-left:16px !important}.mb-sm-4,.my-sm-4{margin-bottom:16px !important}.ms-sm-4{margin-inline-start:16px !important}.me-sm-4{margin-inline-end:16px !important}.ma-sm-4{margin:16px !important}.mt-sm-5,.my-sm-5{margin-top:20px !important}.mr-sm-5,.mx-sm-5{margin-right:20px !important}.ml-sm-5,.mx-sm-5{margin-left:20px !important}.mb-sm-5,.my-sm-5{margin-bottom:20px !important}.ms-sm-5{margin-inline-start:20px !important}.me-sm-5{margin-inline-end:20px !important}.ma-sm-5{margin:20px !important}.mt-sm-6,.my-sm-6{margin-top:24px !important}.mr-sm-6,.mx-sm-6{margin-right:24px !important}.ml-sm-6,.mx-sm-6{margin-left:24px !important}.mb-sm-6,.my-sm-6{margin-bottom:24px !important}.ms-sm-6{margin-inline-start:24px !important}.me-sm-6{margin-inline-end:24px !important}.ma-sm-6{margin:24px !important}.mt-sm-7,.my-sm-7{margin-top:28px !important}.mr-sm-7,.mx-sm-7{margin-right:28px !important}.ml-sm-7,.mx-sm-7{margin-left:28px !important}.mb-sm-7,.my-sm-7{margin-bottom:28px !important}.ms-sm-7{margin-inline-start:28px !important}.me-sm-7{margin-inline-end:28px !important}.ma-sm-7{margin:28px !important}.mt-sm-8,.my-sm-8{margin-top:32px !important}.mr-sm-8,.mx-sm-8{margin-right:32px !important}.ml-sm-8,.mx-sm-8{margin-left:32px !important}.mb-sm-8,.my-sm-8{margin-bottom:32px !important}.ms-sm-8{margin-inline-start:32px !important}.me-sm-8{margin-inline-end:32px !important}.ma-sm-8{margin:32px !important}.mt-sm-9,.my-sm-9{margin-top:36px !important}.mr-sm-9,.mx-sm-9{margin-right:36px !important}.ml-sm-9,.mx-sm-9{margin-left:36px !important}.mb-sm-9,.my-sm-9{margin-bottom:36px !important}.ms-sm-9{margin-inline-start:36px !important}.me-sm-9{margin-inline-end:36px !important}.ma-sm-9{margin:36px !important}.mt-sm-10,.my-sm-10{margin-top:40px !important}.mr-sm-10,.mx-sm-10{margin-right:40px !important}.ml-sm-10,.mx-sm-10{margin-left:40px !important}.mb-sm-10,.my-sm-10{margin-bottom:40px !important}.ms-sm-10{margin-inline-start:40px !important}.me-sm-10{margin-inline-end:40px !important}.ma-sm-10{margin:40px !important}.mt-sm-11,.my-sm-11{margin-top:44px !important}.mr-sm-11,.mx-sm-11{margin-right:44px !important}.ml-sm-11,.mx-sm-11{margin-left:44px !important}.mb-sm-11,.my-sm-11{margin-bottom:44px !important}.ms-sm-11{margin-inline-start:44px !important}.me-sm-11{margin-inline-end:44px !important}.ma-sm-11{margin:44px !important}.mt-sm-12,.my-sm-12{margin-top:48px !important}.mr-sm-12,.mx-sm-12{margin-right:48px !important}.ml-sm-12,.mx-sm-12{margin-left:48px !important}.mb-sm-12,.my-sm-12{margin-bottom:48px !important}.ms-sm-12{margin-inline-start:48px !important}.me-sm-12{margin-inline-end:48px !important}.ma-sm-12{margin:48px !important}.mt-sm-13,.my-sm-13{margin-top:52px !important}.mr-sm-13,.mx-sm-13{margin-right:52px !important}.ml-sm-13,.mx-sm-13{margin-left:52px !important}.mb-sm-13,.my-sm-13{margin-bottom:52px !important}.ms-sm-13{margin-inline-start:52px !important}.me-sm-13{margin-inline-end:52px !important}.ma-sm-13{margin:52px !important}.mt-sm-14,.my-sm-14{margin-top:56px !important}.mr-sm-14,.mx-sm-14{margin-right:56px !important}.ml-sm-14,.mx-sm-14{margin-left:56px !important}.mb-sm-14,.my-sm-14{margin-bottom:56px !important}.ms-sm-14{margin-inline-start:56px !important}.me-sm-14{margin-inline-end:56px !important}.ma-sm-14{margin:56px !important}.mt-sm-15,.my-sm-15{margin-top:60px !important}.mr-sm-15,.mx-sm-15{margin-right:60px !important}.ml-sm-15,.mx-sm-15{margin-left:60px !important}.mb-sm-15,.my-sm-15{margin-bottom:60px !important}.ms-sm-15{margin-inline-start:60px !important}.me-sm-15{margin-inline-end:60px !important}.ma-sm-15{margin:60px !important}.mt-sm-16,.my-sm-16{margin-top:64px !important}.mr-sm-16,.mx-sm-16{margin-right:64px !important}.ml-sm-16,.mx-sm-16{margin-left:64px !important}.mb-sm-16,.my-sm-16{margin-bottom:64px !important}.ms-sm-16{margin-inline-start:64px !important}.me-sm-16{margin-inline-end:64px !important}.ma-sm-16{margin:64px !important}.mt-sm-17,.my-sm-17{margin-top:68px !important}.mr-sm-17,.mx-sm-17{margin-right:68px !important}.ml-sm-17,.mx-sm-17{margin-left:68px !important}.mb-sm-17,.my-sm-17{margin-bottom:68px !important}.ms-sm-17{margin-inline-start:68px !important}.me-sm-17{margin-inline-end:68px !important}.ma-sm-17{margin:68px !important}.mt-sm-18,.my-sm-18{margin-top:72px !important}.mr-sm-18,.mx-sm-18{margin-right:72px !important}.ml-sm-18,.mx-sm-18{margin-left:72px !important}.mb-sm-18,.my-sm-18{margin-bottom:72px !important}.ms-sm-18{margin-inline-start:72px !important}.me-sm-18{margin-inline-end:72px !important}.ma-sm-18{margin:72px !important}.mt-sm-19,.my-sm-19{margin-top:76px !important}.mr-sm-19,.mx-sm-19{margin-right:76px !important}.ml-sm-19,.mx-sm-19{margin-left:76px !important}.mb-sm-19,.my-sm-19{margin-bottom:76px !important}.ms-sm-19{margin-inline-start:76px !important}.me-sm-19{margin-inline-end:76px !important}.ma-sm-19{margin:76px !important}.mt-sm-20,.my-sm-20{margin-top:80px !important}.mr-sm-20,.mx-sm-20{margin-right:80px !important}.ml-sm-20,.mx-sm-20{margin-left:80px !important}.mb-sm-20,.my-sm-20{margin-bottom:80px !important}.ms-sm-20{margin-inline-start:80px !important}.me-sm-20{margin-inline-end:80px !important}.ma-sm-20{margin:80px !important}.mt-sm-auto,.my-sm-auto{margin-top:auto !important}.mr-sm-auto,.mx-sm-auto{margin-right:auto !important}.ml-sm-auto,.mx-sm-auto{margin-left:auto !important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto !important}.ms-sm-auto{margin-inline-start:auto !important}.me-sm-auto{margin-inline-end:auto !important}.ma-sm-auto{margin:auto !important}.pt-sm-0,.py-sm-0{padding-top:0 !important}.pr-sm-0,.px-sm-0{padding-right:0 !important}.pl-sm-0,.px-sm-0{padding-left:0 !important}.pb-sm-0,.py-sm-0{padding-bottom:0 !important}.ps-sm-0{padding-inline-start:0 !important}.pe-sm-0{padding-inline-end:0 !important}.pa-sm-0{padding:0 !important}.pt-sm-1,.py-sm-1{padding-top:4px !important}.pr-sm-1,.px-sm-1{padding-right:4px !important}.pl-sm-1,.px-sm-1{padding-left:4px !important}.pb-sm-1,.py-sm-1{padding-bottom:4px !important}.ps-sm-1{padding-inline-start:4px !important}.pe-sm-1{padding-inline-end:4px !important}.pa-sm-1{padding:4px !important}.pt-sm-2,.py-sm-2{padding-top:8px !important}.pr-sm-2,.px-sm-2{padding-right:8px !important}.pl-sm-2,.px-sm-2{padding-left:8px !important}.pb-sm-2,.py-sm-2{padding-bottom:8px !important}.ps-sm-2{padding-inline-start:8px !important}.pe-sm-2{padding-inline-end:8px !important}.pa-sm-2{padding:8px !important}.pt-sm-3,.py-sm-3{padding-top:12px !important}.pr-sm-3,.px-sm-3{padding-right:12px !important}.pl-sm-3,.px-sm-3{padding-left:12px !important}.pb-sm-3,.py-sm-3{padding-bottom:12px !important}.ps-sm-3{padding-inline-start:12px !important}.pe-sm-3{padding-inline-end:12px !important}.pa-sm-3{padding:12px !important}.pt-sm-4,.py-sm-4{padding-top:16px !important}.pr-sm-4,.px-sm-4{padding-right:16px !important}.pl-sm-4,.px-sm-4{padding-left:16px !important}.pb-sm-4,.py-sm-4{padding-bottom:16px !important}.ps-sm-4{padding-inline-start:16px !important}.pe-sm-4{padding-inline-end:16px !important}.pa-sm-4{padding:16px !important}.pt-sm-5,.py-sm-5{padding-top:20px !important}.pr-sm-5,.px-sm-5{padding-right:20px !important}.pl-sm-5,.px-sm-5{padding-left:20px !important}.pb-sm-5,.py-sm-5{padding-bottom:20px !important}.ps-sm-5{padding-inline-start:20px !important}.pe-sm-5{padding-inline-end:20px !important}.pa-sm-5{padding:20px !important}.pt-sm-6,.py-sm-6{padding-top:24px !important}.pr-sm-6,.px-sm-6{padding-right:24px !important}.pl-sm-6,.px-sm-6{padding-left:24px !important}.pb-sm-6,.py-sm-6{padding-bottom:24px !important}.ps-sm-6{padding-inline-start:24px !important}.pe-sm-6{padding-inline-end:24px !important}.pa-sm-6{padding:24px !important}.pt-sm-7,.py-sm-7{padding-top:28px !important}.pr-sm-7,.px-sm-7{padding-right:28px !important}.pl-sm-7,.px-sm-7{padding-left:28px !important}.pb-sm-7,.py-sm-7{padding-bottom:28px !important}.ps-sm-7{padding-inline-start:28px !important}.pe-sm-7{padding-inline-end:28px !important}.pa-sm-7{padding:28px !important}.pt-sm-8,.py-sm-8{padding-top:32px !important}.pr-sm-8,.px-sm-8{padding-right:32px !important}.pl-sm-8,.px-sm-8{padding-left:32px !important}.pb-sm-8,.py-sm-8{padding-bottom:32px !important}.ps-sm-8{padding-inline-start:32px !important}.pe-sm-8{padding-inline-end:32px !important}.pa-sm-8{padding:32px !important}.pt-sm-9,.py-sm-9{padding-top:36px !important}.pr-sm-9,.px-sm-9{padding-right:36px !important}.pl-sm-9,.px-sm-9{padding-left:36px !important}.pb-sm-9,.py-sm-9{padding-bottom:36px !important}.ps-sm-9{padding-inline-start:36px !important}.pe-sm-9{padding-inline-end:36px !important}.pa-sm-9{padding:36px !important}.pt-sm-10,.py-sm-10{padding-top:40px !important}.pr-sm-10,.px-sm-10{padding-right:40px !important}.pl-sm-10,.px-sm-10{padding-left:40px !important}.pb-sm-10,.py-sm-10{padding-bottom:40px !important}.ps-sm-10{padding-inline-start:40px !important}.pe-sm-10{padding-inline-end:40px !important}.pa-sm-10{padding:40px !important}.pt-sm-11,.py-sm-11{padding-top:44px !important}.pr-sm-11,.px-sm-11{padding-right:44px !important}.pl-sm-11,.px-sm-11{padding-left:44px !important}.pb-sm-11,.py-sm-11{padding-bottom:44px !important}.ps-sm-11{padding-inline-start:44px !important}.pe-sm-11{padding-inline-end:44px !important}.pa-sm-11{padding:44px !important}.pt-sm-12,.py-sm-12{padding-top:48px !important}.pr-sm-12,.px-sm-12{padding-right:48px !important}.pl-sm-12,.px-sm-12{padding-left:48px !important}.pb-sm-12,.py-sm-12{padding-bottom:48px !important}.ps-sm-12{padding-inline-start:48px !important}.pe-sm-12{padding-inline-end:48px !important}.pa-sm-12{padding:48px !important}.pt-sm-13,.py-sm-13{padding-top:52px !important}.pr-sm-13,.px-sm-13{padding-right:52px !important}.pl-sm-13,.px-sm-13{padding-left:52px !important}.pb-sm-13,.py-sm-13{padding-bottom:52px !important}.ps-sm-13{padding-inline-start:52px !important}.pe-sm-13{padding-inline-end:52px !important}.pa-sm-13{padding:52px !important}.pt-sm-14,.py-sm-14{padding-top:56px !important}.pr-sm-14,.px-sm-14{padding-right:56px !important}.pl-sm-14,.px-sm-14{padding-left:56px !important}.pb-sm-14,.py-sm-14{padding-bottom:56px !important}.ps-sm-14{padding-inline-start:56px !important}.pe-sm-14{padding-inline-end:56px !important}.pa-sm-14{padding:56px !important}.pt-sm-15,.py-sm-15{padding-top:60px !important}.pr-sm-15,.px-sm-15{padding-right:60px !important}.pl-sm-15,.px-sm-15{padding-left:60px !important}.pb-sm-15,.py-sm-15{padding-bottom:60px !important}.ps-sm-15{padding-inline-start:60px !important}.pe-sm-15{padding-inline-end:60px !important}.pa-sm-15{padding:60px !important}.pt-sm-16,.py-sm-16{padding-top:64px !important}.pr-sm-16,.px-sm-16{padding-right:64px !important}.pl-sm-16,.px-sm-16{padding-left:64px !important}.pb-sm-16,.py-sm-16{padding-bottom:64px !important}.ps-sm-16{padding-inline-start:64px !important}.pe-sm-16{padding-inline-end:64px !important}.pa-sm-16{padding:64px !important}.pt-sm-17,.py-sm-17{padding-top:68px !important}.pr-sm-17,.px-sm-17{padding-right:68px !important}.pl-sm-17,.px-sm-17{padding-left:68px !important}.pb-sm-17,.py-sm-17{padding-bottom:68px !important}.ps-sm-17{padding-inline-start:68px !important}.pe-sm-17{padding-inline-end:68px !important}.pa-sm-17{padding:68px !important}.pt-sm-18,.py-sm-18{padding-top:72px !important}.pr-sm-18,.px-sm-18{padding-right:72px !important}.pl-sm-18,.px-sm-18{padding-left:72px !important}.pb-sm-18,.py-sm-18{padding-bottom:72px !important}.ps-sm-18{padding-inline-start:72px !important}.pe-sm-18{padding-inline-end:72px !important}.pa-sm-18{padding:72px !important}.pt-sm-19,.py-sm-19{padding-top:76px !important}.pr-sm-19,.px-sm-19{padding-right:76px !important}.pl-sm-19,.px-sm-19{padding-left:76px !important}.pb-sm-19,.py-sm-19{padding-bottom:76px !important}.ps-sm-19{padding-inline-start:76px !important}.pe-sm-19{padding-inline-end:76px !important}.pa-sm-19{padding:76px !important}.pt-sm-20,.py-sm-20{padding-top:80px !important}.pr-sm-20,.px-sm-20{padding-right:80px !important}.pl-sm-20,.px-sm-20{padding-left:80px !important}.pb-sm-20,.py-sm-20{padding-bottom:80px !important}.ps-sm-20{padding-inline-start:80px !important}.pe-sm-20{padding-inline-end:80px !important}.pa-sm-20{padding:80px !important}.pt-sm-auto,.py-sm-auto{padding-top:auto !important}.pr-sm-auto,.px-sm-auto{padding-right:auto !important}.pl-sm-auto,.px-sm-auto{padding-left:auto !important}.pb-sm-auto,.py-sm-auto{padding-bottom:auto !important}.ps-sm-auto{padding-inline-start:auto !important}.pe-sm-auto{padding-inline-end:auto !important}.pa-sm-auto{padding:auto !important}.mt-sm-n1,.my-sm-n1{margin-top:-4px !important}.mr-sm-n1,.mx-sm-n1{margin-right:-4px !important}.ml-sm-n1,.mx-sm-n1{margin-left:-4px !important}.mb-sm-n1,.my-sm-n1{margin-bottom:-4px !important}.ms-sm-n1{margin-inline-start:-4px !important}.me-sm-n1{margin-inline-end:-4px !important}.ma-sm-n1{margin:-4px !important}.mt-sm-n2,.my-sm-n2{margin-top:-8px !important}.mr-sm-n2,.mx-sm-n2{margin-right:-8px !important}.ml-sm-n2,.mx-sm-n2{margin-left:-8px !important}.mb-sm-n2,.my-sm-n2{margin-bottom:-8px !important}.ms-sm-n2{margin-inline-start:-8px !important}.me-sm-n2{margin-inline-end:-8px !important}.ma-sm-n2{margin:-8px !important}.mt-sm-n3,.my-sm-n3{margin-top:-12px !important}.mr-sm-n3,.mx-sm-n3{margin-right:-12px !important}.ml-sm-n3,.mx-sm-n3{margin-left:-12px !important}.mb-sm-n3,.my-sm-n3{margin-bottom:-12px !important}.ms-sm-n3{margin-inline-start:-12px !important}.me-sm-n3{margin-inline-end:-12px !important}.ma-sm-n3{margin:-12px !important}.mt-sm-n4,.my-sm-n4{margin-top:-16px !important}.mr-sm-n4,.mx-sm-n4{margin-right:-16px !important}.ml-sm-n4,.mx-sm-n4{margin-left:-16px !important}.mb-sm-n4,.my-sm-n4{margin-bottom:-16px !important}.ms-sm-n4{margin-inline-start:-16px !important}.me-sm-n4{margin-inline-end:-16px !important}.ma-sm-n4{margin:-16px !important}.mt-sm-n5,.my-sm-n5{margin-top:-20px !important}.mr-sm-n5,.mx-sm-n5{margin-right:-20px !important}.ml-sm-n5,.mx-sm-n5{margin-left:-20px !important}.mb-sm-n5,.my-sm-n5{margin-bottom:-20px !important}.ms-sm-n5{margin-inline-start:-20px !important}.me-sm-n5{margin-inline-end:-20px !important}.ma-sm-n5{margin:-20px !important}.mt-sm-n6,.my-sm-n6{margin-top:-24px !important}.mr-sm-n6,.mx-sm-n6{margin-right:-24px !important}.ml-sm-n6,.mx-sm-n6{margin-left:-24px !important}.mb-sm-n6,.my-sm-n6{margin-bottom:-24px !important}.ms-sm-n6{margin-inline-start:-24px !important}.me-sm-n6{margin-inline-end:-24px !important}.ma-sm-n6{margin:-24px !important}.mt-sm-n7,.my-sm-n7{margin-top:-28px !important}.mr-sm-n7,.mx-sm-n7{margin-right:-28px !important}.ml-sm-n7,.mx-sm-n7{margin-left:-28px !important}.mb-sm-n7,.my-sm-n7{margin-bottom:-28px !important}.ms-sm-n7{margin-inline-start:-28px !important}.me-sm-n7{margin-inline-end:-28px !important}.ma-sm-n7{margin:-28px !important}.mt-sm-n8,.my-sm-n8{margin-top:-32px !important}.mr-sm-n8,.mx-sm-n8{margin-right:-32px !important}.ml-sm-n8,.mx-sm-n8{margin-left:-32px !important}.mb-sm-n8,.my-sm-n8{margin-bottom:-32px !important}.ms-sm-n8{margin-inline-start:-32px !important}.me-sm-n8{margin-inline-end:-32px !important}.ma-sm-n8{margin:-32px !important}.mt-sm-n9,.my-sm-n9{margin-top:-36px !important}.mr-sm-n9,.mx-sm-n9{margin-right:-36px !important}.ml-sm-n9,.mx-sm-n9{margin-left:-36px !important}.mb-sm-n9,.my-sm-n9{margin-bottom:-36px !important}.ms-sm-n9{margin-inline-start:-36px !important}.me-sm-n9{margin-inline-end:-36px !important}.ma-sm-n9{margin:-36px !important}.mt-sm-n10,.my-sm-n10{margin-top:-40px !important}.mr-sm-n10,.mx-sm-n10{margin-right:-40px !important}.ml-sm-n10,.mx-sm-n10{margin-left:-40px !important}.mb-sm-n10,.my-sm-n10{margin-bottom:-40px !important}.ms-sm-n10{margin-inline-start:-40px !important}.me-sm-n10{margin-inline-end:-40px !important}.ma-sm-n10{margin:-40px !important}.mt-sm-n11,.my-sm-n11{margin-top:-44px !important}.mr-sm-n11,.mx-sm-n11{margin-right:-44px !important}.ml-sm-n11,.mx-sm-n11{margin-left:-44px !important}.mb-sm-n11,.my-sm-n11{margin-bottom:-44px !important}.ms-sm-n11{margin-inline-start:-44px !important}.me-sm-n11{margin-inline-end:-44px !important}.ma-sm-n11{margin:-44px !important}.mt-sm-n12,.my-sm-n12{margin-top:-48px !important}.mr-sm-n12,.mx-sm-n12{margin-right:-48px !important}.ml-sm-n12,.mx-sm-n12{margin-left:-48px !important}.mb-sm-n12,.my-sm-n12{margin-bottom:-48px !important}.ms-sm-n12{margin-inline-start:-48px !important}.me-sm-n12{margin-inline-end:-48px !important}.ma-sm-n12{margin:-48px !important}.mt-sm-n13,.my-sm-n13{margin-top:-52px !important}.mr-sm-n13,.mx-sm-n13{margin-right:-52px !important}.ml-sm-n13,.mx-sm-n13{margin-left:-52px !important}.mb-sm-n13,.my-sm-n13{margin-bottom:-52px !important}.ms-sm-n13{margin-inline-start:-52px !important}.me-sm-n13{margin-inline-end:-52px !important}.ma-sm-n13{margin:-52px !important}.mt-sm-n14,.my-sm-n14{margin-top:-56px !important}.mr-sm-n14,.mx-sm-n14{margin-right:-56px !important}.ml-sm-n14,.mx-sm-n14{margin-left:-56px !important}.mb-sm-n14,.my-sm-n14{margin-bottom:-56px !important}.ms-sm-n14{margin-inline-start:-56px !important}.me-sm-n14{margin-inline-end:-56px !important}.ma-sm-n14{margin:-56px !important}.mt-sm-n15,.my-sm-n15{margin-top:-60px !important}.mr-sm-n15,.mx-sm-n15{margin-right:-60px !important}.ml-sm-n15,.mx-sm-n15{margin-left:-60px !important}.mb-sm-n15,.my-sm-n15{margin-bottom:-60px !important}.ms-sm-n15{margin-inline-start:-60px !important}.me-sm-n15{margin-inline-end:-60px !important}.ma-sm-n15{margin:-60px !important}.mt-sm-n16,.my-sm-n16{margin-top:-64px !important}.mr-sm-n16,.mx-sm-n16{margin-right:-64px !important}.ml-sm-n16,.mx-sm-n16{margin-left:-64px !important}.mb-sm-n16,.my-sm-n16{margin-bottom:-64px !important}.ms-sm-n16{margin-inline-start:-64px !important}.me-sm-n16{margin-inline-end:-64px !important}.ma-sm-n16{margin:-64px !important}.mt-sm-n17,.my-sm-n17{margin-top:-68px !important}.mr-sm-n17,.mx-sm-n17{margin-right:-68px !important}.ml-sm-n17,.mx-sm-n17{margin-left:-68px !important}.mb-sm-n17,.my-sm-n17{margin-bottom:-68px !important}.ms-sm-n17{margin-inline-start:-68px !important}.me-sm-n17{margin-inline-end:-68px !important}.ma-sm-n17{margin:-68px !important}.mt-sm-n18,.my-sm-n18{margin-top:-72px !important}.mr-sm-n18,.mx-sm-n18{margin-right:-72px !important}.ml-sm-n18,.mx-sm-n18{margin-left:-72px !important}.mb-sm-n18,.my-sm-n18{margin-bottom:-72px !important}.ms-sm-n18{margin-inline-start:-72px !important}.me-sm-n18{margin-inline-end:-72px !important}.ma-sm-n18{margin:-72px !important}.mt-sm-n19,.my-sm-n19{margin-top:-76px !important}.mr-sm-n19,.mx-sm-n19{margin-right:-76px !important}.ml-sm-n19,.mx-sm-n19{margin-left:-76px !important}.mb-sm-n19,.my-sm-n19{margin-bottom:-76px !important}.ms-sm-n19{margin-inline-start:-76px !important}.me-sm-n19{margin-inline-end:-76px !important}.ma-sm-n19{margin:-76px !important}.mt-sm-n20,.my-sm-n20{margin-top:-80px !important}.mr-sm-n20,.mx-sm-n20{margin-right:-80px !important}.ml-sm-n20,.mx-sm-n20{margin-left:-80px !important}.mb-sm-n20,.my-sm-n20{margin-bottom:-80px !important}.ms-sm-n20{margin-inline-start:-80px !important}.me-sm-n20{margin-inline-end:-80px !important}.ma-sm-n20{margin:-80px !important}}@media screen and (min-width: 960px){.mt-md-0,.my-md-0{margin-top:0 !important}.mr-md-0,.mx-md-0{margin-right:0 !important}.ml-md-0,.mx-md-0{margin-left:0 !important}.mb-md-0,.my-md-0{margin-bottom:0 !important}.ms-md-0{margin-inline-start:0 !important}.me-md-0{margin-inline-end:0 !important}.ma-md-0{margin:0 !important}.mt-md-1,.my-md-1{margin-top:4px !important}.mr-md-1,.mx-md-1{margin-right:4px !important}.ml-md-1,.mx-md-1{margin-left:4px !important}.mb-md-1,.my-md-1{margin-bottom:4px !important}.ms-md-1{margin-inline-start:4px !important}.me-md-1{margin-inline-end:4px !important}.ma-md-1{margin:4px !important}.mt-md-2,.my-md-2{margin-top:8px !important}.mr-md-2,.mx-md-2{margin-right:8px !important}.ml-md-2,.mx-md-2{margin-left:8px !important}.mb-md-2,.my-md-2{margin-bottom:8px !important}.ms-md-2{margin-inline-start:8px !important}.me-md-2{margin-inline-end:8px !important}.ma-md-2{margin:8px !important}.mt-md-3,.my-md-3{margin-top:12px !important}.mr-md-3,.mx-md-3{margin-right:12px !important}.ml-md-3,.mx-md-3{margin-left:12px !important}.mb-md-3,.my-md-3{margin-bottom:12px !important}.ms-md-3{margin-inline-start:12px !important}.me-md-3{margin-inline-end:12px !important}.ma-md-3{margin:12px !important}.mt-md-4,.my-md-4{margin-top:16px !important}.mr-md-4,.mx-md-4{margin-right:16px !important}.ml-md-4,.mx-md-4{margin-left:16px !important}.mb-md-4,.my-md-4{margin-bottom:16px !important}.ms-md-4{margin-inline-start:16px !important}.me-md-4{margin-inline-end:16px !important}.ma-md-4{margin:16px !important}.mt-md-5,.my-md-5{margin-top:20px !important}.mr-md-5,.mx-md-5{margin-right:20px !important}.ml-md-5,.mx-md-5{margin-left:20px !important}.mb-md-5,.my-md-5{margin-bottom:20px !important}.ms-md-5{margin-inline-start:20px !important}.me-md-5{margin-inline-end:20px !important}.ma-md-5{margin:20px !important}.mt-md-6,.my-md-6{margin-top:24px !important}.mr-md-6,.mx-md-6{margin-right:24px !important}.ml-md-6,.mx-md-6{margin-left:24px !important}.mb-md-6,.my-md-6{margin-bottom:24px !important}.ms-md-6{margin-inline-start:24px !important}.me-md-6{margin-inline-end:24px !important}.ma-md-6{margin:24px !important}.mt-md-7,.my-md-7{margin-top:28px !important}.mr-md-7,.mx-md-7{margin-right:28px !important}.ml-md-7,.mx-md-7{margin-left:28px !important}.mb-md-7,.my-md-7{margin-bottom:28px !important}.ms-md-7{margin-inline-start:28px !important}.me-md-7{margin-inline-end:28px !important}.ma-md-7{margin:28px !important}.mt-md-8,.my-md-8{margin-top:32px !important}.mr-md-8,.mx-md-8{margin-right:32px !important}.ml-md-8,.mx-md-8{margin-left:32px !important}.mb-md-8,.my-md-8{margin-bottom:32px !important}.ms-md-8{margin-inline-start:32px !important}.me-md-8{margin-inline-end:32px !important}.ma-md-8{margin:32px !important}.mt-md-9,.my-md-9{margin-top:36px !important}.mr-md-9,.mx-md-9{margin-right:36px !important}.ml-md-9,.mx-md-9{margin-left:36px !important}.mb-md-9,.my-md-9{margin-bottom:36px !important}.ms-md-9{margin-inline-start:36px !important}.me-md-9{margin-inline-end:36px !important}.ma-md-9{margin:36px !important}.mt-md-10,.my-md-10{margin-top:40px !important}.mr-md-10,.mx-md-10{margin-right:40px !important}.ml-md-10,.mx-md-10{margin-left:40px !important}.mb-md-10,.my-md-10{margin-bottom:40px !important}.ms-md-10{margin-inline-start:40px !important}.me-md-10{margin-inline-end:40px !important}.ma-md-10{margin:40px !important}.mt-md-11,.my-md-11{margin-top:44px !important}.mr-md-11,.mx-md-11{margin-right:44px !important}.ml-md-11,.mx-md-11{margin-left:44px !important}.mb-md-11,.my-md-11{margin-bottom:44px !important}.ms-md-11{margin-inline-start:44px !important}.me-md-11{margin-inline-end:44px !important}.ma-md-11{margin:44px !important}.mt-md-12,.my-md-12{margin-top:48px !important}.mr-md-12,.mx-md-12{margin-right:48px !important}.ml-md-12,.mx-md-12{margin-left:48px !important}.mb-md-12,.my-md-12{margin-bottom:48px !important}.ms-md-12{margin-inline-start:48px !important}.me-md-12{margin-inline-end:48px !important}.ma-md-12{margin:48px !important}.mt-md-13,.my-md-13{margin-top:52px !important}.mr-md-13,.mx-md-13{margin-right:52px !important}.ml-md-13,.mx-md-13{margin-left:52px !important}.mb-md-13,.my-md-13{margin-bottom:52px !important}.ms-md-13{margin-inline-start:52px !important}.me-md-13{margin-inline-end:52px !important}.ma-md-13{margin:52px !important}.mt-md-14,.my-md-14{margin-top:56px !important}.mr-md-14,.mx-md-14{margin-right:56px !important}.ml-md-14,.mx-md-14{margin-left:56px !important}.mb-md-14,.my-md-14{margin-bottom:56px !important}.ms-md-14{margin-inline-start:56px !important}.me-md-14{margin-inline-end:56px !important}.ma-md-14{margin:56px !important}.mt-md-15,.my-md-15{margin-top:60px !important}.mr-md-15,.mx-md-15{margin-right:60px !important}.ml-md-15,.mx-md-15{margin-left:60px !important}.mb-md-15,.my-md-15{margin-bottom:60px !important}.ms-md-15{margin-inline-start:60px !important}.me-md-15{margin-inline-end:60px !important}.ma-md-15{margin:60px !important}.mt-md-16,.my-md-16{margin-top:64px !important}.mr-md-16,.mx-md-16{margin-right:64px !important}.ml-md-16,.mx-md-16{margin-left:64px !important}.mb-md-16,.my-md-16{margin-bottom:64px !important}.ms-md-16{margin-inline-start:64px !important}.me-md-16{margin-inline-end:64px !important}.ma-md-16{margin:64px !important}.mt-md-17,.my-md-17{margin-top:68px !important}.mr-md-17,.mx-md-17{margin-right:68px !important}.ml-md-17,.mx-md-17{margin-left:68px !important}.mb-md-17,.my-md-17{margin-bottom:68px !important}.ms-md-17{margin-inline-start:68px !important}.me-md-17{margin-inline-end:68px !important}.ma-md-17{margin:68px !important}.mt-md-18,.my-md-18{margin-top:72px !important}.mr-md-18,.mx-md-18{margin-right:72px !important}.ml-md-18,.mx-md-18{margin-left:72px !important}.mb-md-18,.my-md-18{margin-bottom:72px !important}.ms-md-18{margin-inline-start:72px !important}.me-md-18{margin-inline-end:72px !important}.ma-md-18{margin:72px !important}.mt-md-19,.my-md-19{margin-top:76px !important}.mr-md-19,.mx-md-19{margin-right:76px !important}.ml-md-19,.mx-md-19{margin-left:76px !important}.mb-md-19,.my-md-19{margin-bottom:76px !important}.ms-md-19{margin-inline-start:76px !important}.me-md-19{margin-inline-end:76px !important}.ma-md-19{margin:76px !important}.mt-md-20,.my-md-20{margin-top:80px !important}.mr-md-20,.mx-md-20{margin-right:80px !important}.ml-md-20,.mx-md-20{margin-left:80px !important}.mb-md-20,.my-md-20{margin-bottom:80px !important}.ms-md-20{margin-inline-start:80px !important}.me-md-20{margin-inline-end:80px !important}.ma-md-20{margin:80px !important}.mt-md-auto,.my-md-auto{margin-top:auto !important}.mr-md-auto,.mx-md-auto{margin-right:auto !important}.ml-md-auto,.mx-md-auto{margin-left:auto !important}.mb-md-auto,.my-md-auto{margin-bottom:auto !important}.ms-md-auto{margin-inline-start:auto !important}.me-md-auto{margin-inline-end:auto !important}.ma-md-auto{margin:auto !important}.pt-md-0,.py-md-0{padding-top:0 !important}.pr-md-0,.px-md-0{padding-right:0 !important}.pl-md-0,.px-md-0{padding-left:0 !important}.pb-md-0,.py-md-0{padding-bottom:0 !important}.ps-md-0{padding-inline-start:0 !important}.pe-md-0{padding-inline-end:0 !important}.pa-md-0{padding:0 !important}.pt-md-1,.py-md-1{padding-top:4px !important}.pr-md-1,.px-md-1{padding-right:4px !important}.pl-md-1,.px-md-1{padding-left:4px !important}.pb-md-1,.py-md-1{padding-bottom:4px !important}.ps-md-1{padding-inline-start:4px !important}.pe-md-1{padding-inline-end:4px !important}.pa-md-1{padding:4px !important}.pt-md-2,.py-md-2{padding-top:8px !important}.pr-md-2,.px-md-2{padding-right:8px !important}.pl-md-2,.px-md-2{padding-left:8px !important}.pb-md-2,.py-md-2{padding-bottom:8px !important}.ps-md-2{padding-inline-start:8px !important}.pe-md-2{padding-inline-end:8px !important}.pa-md-2{padding:8px !important}.pt-md-3,.py-md-3{padding-top:12px !important}.pr-md-3,.px-md-3{padding-right:12px !important}.pl-md-3,.px-md-3{padding-left:12px !important}.pb-md-3,.py-md-3{padding-bottom:12px !important}.ps-md-3{padding-inline-start:12px !important}.pe-md-3{padding-inline-end:12px !important}.pa-md-3{padding:12px !important}.pt-md-4,.py-md-4{padding-top:16px !important}.pr-md-4,.px-md-4{padding-right:16px !important}.pl-md-4,.px-md-4{padding-left:16px !important}.pb-md-4,.py-md-4{padding-bottom:16px !important}.ps-md-4{padding-inline-start:16px !important}.pe-md-4{padding-inline-end:16px !important}.pa-md-4{padding:16px !important}.pt-md-5,.py-md-5{padding-top:20px !important}.pr-md-5,.px-md-5{padding-right:20px !important}.pl-md-5,.px-md-5{padding-left:20px !important}.pb-md-5,.py-md-5{padding-bottom:20px !important}.ps-md-5{padding-inline-start:20px !important}.pe-md-5{padding-inline-end:20px !important}.pa-md-5{padding:20px !important}.pt-md-6,.py-md-6{padding-top:24px !important}.pr-md-6,.px-md-6{padding-right:24px !important}.pl-md-6,.px-md-6{padding-left:24px !important}.pb-md-6,.py-md-6{padding-bottom:24px !important}.ps-md-6{padding-inline-start:24px !important}.pe-md-6{padding-inline-end:24px !important}.pa-md-6{padding:24px !important}.pt-md-7,.py-md-7{padding-top:28px !important}.pr-md-7,.px-md-7{padding-right:28px !important}.pl-md-7,.px-md-7{padding-left:28px !important}.pb-md-7,.py-md-7{padding-bottom:28px !important}.ps-md-7{padding-inline-start:28px !important}.pe-md-7{padding-inline-end:28px !important}.pa-md-7{padding:28px !important}.pt-md-8,.py-md-8{padding-top:32px !important}.pr-md-8,.px-md-8{padding-right:32px !important}.pl-md-8,.px-md-8{padding-left:32px !important}.pb-md-8,.py-md-8{padding-bottom:32px !important}.ps-md-8{padding-inline-start:32px !important}.pe-md-8{padding-inline-end:32px !important}.pa-md-8{padding:32px !important}.pt-md-9,.py-md-9{padding-top:36px !important}.pr-md-9,.px-md-9{padding-right:36px !important}.pl-md-9,.px-md-9{padding-left:36px !important}.pb-md-9,.py-md-9{padding-bottom:36px !important}.ps-md-9{padding-inline-start:36px !important}.pe-md-9{padding-inline-end:36px !important}.pa-md-9{padding:36px !important}.pt-md-10,.py-md-10{padding-top:40px !important}.pr-md-10,.px-md-10{padding-right:40px !important}.pl-md-10,.px-md-10{padding-left:40px !important}.pb-md-10,.py-md-10{padding-bottom:40px !important}.ps-md-10{padding-inline-start:40px !important}.pe-md-10{padding-inline-end:40px !important}.pa-md-10{padding:40px !important}.pt-md-11,.py-md-11{padding-top:44px !important}.pr-md-11,.px-md-11{padding-right:44px !important}.pl-md-11,.px-md-11{padding-left:44px !important}.pb-md-11,.py-md-11{padding-bottom:44px !important}.ps-md-11{padding-inline-start:44px !important}.pe-md-11{padding-inline-end:44px !important}.pa-md-11{padding:44px !important}.pt-md-12,.py-md-12{padding-top:48px !important}.pr-md-12,.px-md-12{padding-right:48px !important}.pl-md-12,.px-md-12{padding-left:48px !important}.pb-md-12,.py-md-12{padding-bottom:48px !important}.ps-md-12{padding-inline-start:48px !important}.pe-md-12{padding-inline-end:48px !important}.pa-md-12{padding:48px !important}.pt-md-13,.py-md-13{padding-top:52px !important}.pr-md-13,.px-md-13{padding-right:52px !important}.pl-md-13,.px-md-13{padding-left:52px !important}.pb-md-13,.py-md-13{padding-bottom:52px !important}.ps-md-13{padding-inline-start:52px !important}.pe-md-13{padding-inline-end:52px !important}.pa-md-13{padding:52px !important}.pt-md-14,.py-md-14{padding-top:56px !important}.pr-md-14,.px-md-14{padding-right:56px !important}.pl-md-14,.px-md-14{padding-left:56px !important}.pb-md-14,.py-md-14{padding-bottom:56px !important}.ps-md-14{padding-inline-start:56px !important}.pe-md-14{padding-inline-end:56px !important}.pa-md-14{padding:56px !important}.pt-md-15,.py-md-15{padding-top:60px !important}.pr-md-15,.px-md-15{padding-right:60px !important}.pl-md-15,.px-md-15{padding-left:60px !important}.pb-md-15,.py-md-15{padding-bottom:60px !important}.ps-md-15{padding-inline-start:60px !important}.pe-md-15{padding-inline-end:60px !important}.pa-md-15{padding:60px !important}.pt-md-16,.py-md-16{padding-top:64px !important}.pr-md-16,.px-md-16{padding-right:64px !important}.pl-md-16,.px-md-16{padding-left:64px !important}.pb-md-16,.py-md-16{padding-bottom:64px !important}.ps-md-16{padding-inline-start:64px !important}.pe-md-16{padding-inline-end:64px !important}.pa-md-16{padding:64px !important}.pt-md-17,.py-md-17{padding-top:68px !important}.pr-md-17,.px-md-17{padding-right:68px !important}.pl-md-17,.px-md-17{padding-left:68px !important}.pb-md-17,.py-md-17{padding-bottom:68px !important}.ps-md-17{padding-inline-start:68px !important}.pe-md-17{padding-inline-end:68px !important}.pa-md-17{padding:68px !important}.pt-md-18,.py-md-18{padding-top:72px !important}.pr-md-18,.px-md-18{padding-right:72px !important}.pl-md-18,.px-md-18{padding-left:72px !important}.pb-md-18,.py-md-18{padding-bottom:72px !important}.ps-md-18{padding-inline-start:72px !important}.pe-md-18{padding-inline-end:72px !important}.pa-md-18{padding:72px !important}.pt-md-19,.py-md-19{padding-top:76px !important}.pr-md-19,.px-md-19{padding-right:76px !important}.pl-md-19,.px-md-19{padding-left:76px !important}.pb-md-19,.py-md-19{padding-bottom:76px !important}.ps-md-19{padding-inline-start:76px !important}.pe-md-19{padding-inline-end:76px !important}.pa-md-19{padding:76px !important}.pt-md-20,.py-md-20{padding-top:80px !important}.pr-md-20,.px-md-20{padding-right:80px !important}.pl-md-20,.px-md-20{padding-left:80px !important}.pb-md-20,.py-md-20{padding-bottom:80px !important}.ps-md-20{padding-inline-start:80px !important}.pe-md-20{padding-inline-end:80px !important}.pa-md-20{padding:80px !important}.pt-md-auto,.py-md-auto{padding-top:auto !important}.pr-md-auto,.px-md-auto{padding-right:auto !important}.pl-md-auto,.px-md-auto{padding-left:auto !important}.pb-md-auto,.py-md-auto{padding-bottom:auto !important}.ps-md-auto{padding-inline-start:auto !important}.pe-md-auto{padding-inline-end:auto !important}.pa-md-auto{padding:auto !important}.mt-md-n1,.my-md-n1{margin-top:-4px !important}.mr-md-n1,.mx-md-n1{margin-right:-4px !important}.ml-md-n1,.mx-md-n1{margin-left:-4px !important}.mb-md-n1,.my-md-n1{margin-bottom:-4px !important}.ms-md-n1{margin-inline-start:-4px !important}.me-md-n1{margin-inline-end:-4px !important}.ma-md-n1{margin:-4px !important}.mt-md-n2,.my-md-n2{margin-top:-8px !important}.mr-md-n2,.mx-md-n2{margin-right:-8px !important}.ml-md-n2,.mx-md-n2{margin-left:-8px !important}.mb-md-n2,.my-md-n2{margin-bottom:-8px !important}.ms-md-n2{margin-inline-start:-8px !important}.me-md-n2{margin-inline-end:-8px !important}.ma-md-n2{margin:-8px !important}.mt-md-n3,.my-md-n3{margin-top:-12px !important}.mr-md-n3,.mx-md-n3{margin-right:-12px !important}.ml-md-n3,.mx-md-n3{margin-left:-12px !important}.mb-md-n3,.my-md-n3{margin-bottom:-12px !important}.ms-md-n3{margin-inline-start:-12px !important}.me-md-n3{margin-inline-end:-12px !important}.ma-md-n3{margin:-12px !important}.mt-md-n4,.my-md-n4{margin-top:-16px !important}.mr-md-n4,.mx-md-n4{margin-right:-16px !important}.ml-md-n4,.mx-md-n4{margin-left:-16px !important}.mb-md-n4,.my-md-n4{margin-bottom:-16px !important}.ms-md-n4{margin-inline-start:-16px !important}.me-md-n4{margin-inline-end:-16px !important}.ma-md-n4{margin:-16px !important}.mt-md-n5,.my-md-n5{margin-top:-20px !important}.mr-md-n5,.mx-md-n5{margin-right:-20px !important}.ml-md-n5,.mx-md-n5{margin-left:-20px !important}.mb-md-n5,.my-md-n5{margin-bottom:-20px !important}.ms-md-n5{margin-inline-start:-20px !important}.me-md-n5{margin-inline-end:-20px !important}.ma-md-n5{margin:-20px !important}.mt-md-n6,.my-md-n6{margin-top:-24px !important}.mr-md-n6,.mx-md-n6{margin-right:-24px !important}.ml-md-n6,.mx-md-n6{margin-left:-24px !important}.mb-md-n6,.my-md-n6{margin-bottom:-24px !important}.ms-md-n6{margin-inline-start:-24px !important}.me-md-n6{margin-inline-end:-24px !important}.ma-md-n6{margin:-24px !important}.mt-md-n7,.my-md-n7{margin-top:-28px !important}.mr-md-n7,.mx-md-n7{margin-right:-28px !important}.ml-md-n7,.mx-md-n7{margin-left:-28px !important}.mb-md-n7,.my-md-n7{margin-bottom:-28px !important}.ms-md-n7{margin-inline-start:-28px !important}.me-md-n7{margin-inline-end:-28px !important}.ma-md-n7{margin:-28px !important}.mt-md-n8,.my-md-n8{margin-top:-32px !important}.mr-md-n8,.mx-md-n8{margin-right:-32px !important}.ml-md-n8,.mx-md-n8{margin-left:-32px !important}.mb-md-n8,.my-md-n8{margin-bottom:-32px !important}.ms-md-n8{margin-inline-start:-32px !important}.me-md-n8{margin-inline-end:-32px !important}.ma-md-n8{margin:-32px !important}.mt-md-n9,.my-md-n9{margin-top:-36px !important}.mr-md-n9,.mx-md-n9{margin-right:-36px !important}.ml-md-n9,.mx-md-n9{margin-left:-36px !important}.mb-md-n9,.my-md-n9{margin-bottom:-36px !important}.ms-md-n9{margin-inline-start:-36px !important}.me-md-n9{margin-inline-end:-36px !important}.ma-md-n9{margin:-36px !important}.mt-md-n10,.my-md-n10{margin-top:-40px !important}.mr-md-n10,.mx-md-n10{margin-right:-40px !important}.ml-md-n10,.mx-md-n10{margin-left:-40px !important}.mb-md-n10,.my-md-n10{margin-bottom:-40px !important}.ms-md-n10{margin-inline-start:-40px !important}.me-md-n10{margin-inline-end:-40px !important}.ma-md-n10{margin:-40px !important}.mt-md-n11,.my-md-n11{margin-top:-44px !important}.mr-md-n11,.mx-md-n11{margin-right:-44px !important}.ml-md-n11,.mx-md-n11{margin-left:-44px !important}.mb-md-n11,.my-md-n11{margin-bottom:-44px !important}.ms-md-n11{margin-inline-start:-44px !important}.me-md-n11{margin-inline-end:-44px !important}.ma-md-n11{margin:-44px !important}.mt-md-n12,.my-md-n12{margin-top:-48px !important}.mr-md-n12,.mx-md-n12{margin-right:-48px !important}.ml-md-n12,.mx-md-n12{margin-left:-48px !important}.mb-md-n12,.my-md-n12{margin-bottom:-48px !important}.ms-md-n12{margin-inline-start:-48px !important}.me-md-n12{margin-inline-end:-48px !important}.ma-md-n12{margin:-48px !important}.mt-md-n13,.my-md-n13{margin-top:-52px !important}.mr-md-n13,.mx-md-n13{margin-right:-52px !important}.ml-md-n13,.mx-md-n13{margin-left:-52px !important}.mb-md-n13,.my-md-n13{margin-bottom:-52px !important}.ms-md-n13{margin-inline-start:-52px !important}.me-md-n13{margin-inline-end:-52px !important}.ma-md-n13{margin:-52px !important}.mt-md-n14,.my-md-n14{margin-top:-56px !important}.mr-md-n14,.mx-md-n14{margin-right:-56px !important}.ml-md-n14,.mx-md-n14{margin-left:-56px !important}.mb-md-n14,.my-md-n14{margin-bottom:-56px !important}.ms-md-n14{margin-inline-start:-56px !important}.me-md-n14{margin-inline-end:-56px !important}.ma-md-n14{margin:-56px !important}.mt-md-n15,.my-md-n15{margin-top:-60px !important}.mr-md-n15,.mx-md-n15{margin-right:-60px !important}.ml-md-n15,.mx-md-n15{margin-left:-60px !important}.mb-md-n15,.my-md-n15{margin-bottom:-60px !important}.ms-md-n15{margin-inline-start:-60px !important}.me-md-n15{margin-inline-end:-60px !important}.ma-md-n15{margin:-60px !important}.mt-md-n16,.my-md-n16{margin-top:-64px !important}.mr-md-n16,.mx-md-n16{margin-right:-64px !important}.ml-md-n16,.mx-md-n16{margin-left:-64px !important}.mb-md-n16,.my-md-n16{margin-bottom:-64px !important}.ms-md-n16{margin-inline-start:-64px !important}.me-md-n16{margin-inline-end:-64px !important}.ma-md-n16{margin:-64px !important}.mt-md-n17,.my-md-n17{margin-top:-68px !important}.mr-md-n17,.mx-md-n17{margin-right:-68px !important}.ml-md-n17,.mx-md-n17{margin-left:-68px !important}.mb-md-n17,.my-md-n17{margin-bottom:-68px !important}.ms-md-n17{margin-inline-start:-68px !important}.me-md-n17{margin-inline-end:-68px !important}.ma-md-n17{margin:-68px !important}.mt-md-n18,.my-md-n18{margin-top:-72px !important}.mr-md-n18,.mx-md-n18{margin-right:-72px !important}.ml-md-n18,.mx-md-n18{margin-left:-72px !important}.mb-md-n18,.my-md-n18{margin-bottom:-72px !important}.ms-md-n18{margin-inline-start:-72px !important}.me-md-n18{margin-inline-end:-72px !important}.ma-md-n18{margin:-72px !important}.mt-md-n19,.my-md-n19{margin-top:-76px !important}.mr-md-n19,.mx-md-n19{margin-right:-76px !important}.ml-md-n19,.mx-md-n19{margin-left:-76px !important}.mb-md-n19,.my-md-n19{margin-bottom:-76px !important}.ms-md-n19{margin-inline-start:-76px !important}.me-md-n19{margin-inline-end:-76px !important}.ma-md-n19{margin:-76px !important}.mt-md-n20,.my-md-n20{margin-top:-80px !important}.mr-md-n20,.mx-md-n20{margin-right:-80px !important}.ml-md-n20,.mx-md-n20{margin-left:-80px !important}.mb-md-n20,.my-md-n20{margin-bottom:-80px !important}.ms-md-n20{margin-inline-start:-80px !important}.me-md-n20{margin-inline-end:-80px !important}.ma-md-n20{margin:-80px !important}}@media screen and (min-width: 1280px){.mt-lg-0,.my-lg-0{margin-top:0 !important}.mr-lg-0,.mx-lg-0{margin-right:0 !important}.ml-lg-0,.mx-lg-0{margin-left:0 !important}.mb-lg-0,.my-lg-0{margin-bottom:0 !important}.ms-lg-0{margin-inline-start:0 !important}.me-lg-0{margin-inline-end:0 !important}.ma-lg-0{margin:0 !important}.mt-lg-1,.my-lg-1{margin-top:4px !important}.mr-lg-1,.mx-lg-1{margin-right:4px !important}.ml-lg-1,.mx-lg-1{margin-left:4px !important}.mb-lg-1,.my-lg-1{margin-bottom:4px !important}.ms-lg-1{margin-inline-start:4px !important}.me-lg-1{margin-inline-end:4px !important}.ma-lg-1{margin:4px !important}.mt-lg-2,.my-lg-2{margin-top:8px !important}.mr-lg-2,.mx-lg-2{margin-right:8px !important}.ml-lg-2,.mx-lg-2{margin-left:8px !important}.mb-lg-2,.my-lg-2{margin-bottom:8px !important}.ms-lg-2{margin-inline-start:8px !important}.me-lg-2{margin-inline-end:8px !important}.ma-lg-2{margin:8px !important}.mt-lg-3,.my-lg-3{margin-top:12px !important}.mr-lg-3,.mx-lg-3{margin-right:12px !important}.ml-lg-3,.mx-lg-3{margin-left:12px !important}.mb-lg-3,.my-lg-3{margin-bottom:12px !important}.ms-lg-3{margin-inline-start:12px !important}.me-lg-3{margin-inline-end:12px !important}.ma-lg-3{margin:12px !important}.mt-lg-4,.my-lg-4{margin-top:16px !important}.mr-lg-4,.mx-lg-4{margin-right:16px !important}.ml-lg-4,.mx-lg-4{margin-left:16px !important}.mb-lg-4,.my-lg-4{margin-bottom:16px !important}.ms-lg-4{margin-inline-start:16px !important}.me-lg-4{margin-inline-end:16px !important}.ma-lg-4{margin:16px !important}.mt-lg-5,.my-lg-5{margin-top:20px !important}.mr-lg-5,.mx-lg-5{margin-right:20px !important}.ml-lg-5,.mx-lg-5{margin-left:20px !important}.mb-lg-5,.my-lg-5{margin-bottom:20px !important}.ms-lg-5{margin-inline-start:20px !important}.me-lg-5{margin-inline-end:20px !important}.ma-lg-5{margin:20px !important}.mt-lg-6,.my-lg-6{margin-top:24px !important}.mr-lg-6,.mx-lg-6{margin-right:24px !important}.ml-lg-6,.mx-lg-6{margin-left:24px !important}.mb-lg-6,.my-lg-6{margin-bottom:24px !important}.ms-lg-6{margin-inline-start:24px !important}.me-lg-6{margin-inline-end:24px !important}.ma-lg-6{margin:24px !important}.mt-lg-7,.my-lg-7{margin-top:28px !important}.mr-lg-7,.mx-lg-7{margin-right:28px !important}.ml-lg-7,.mx-lg-7{margin-left:28px !important}.mb-lg-7,.my-lg-7{margin-bottom:28px !important}.ms-lg-7{margin-inline-start:28px !important}.me-lg-7{margin-inline-end:28px !important}.ma-lg-7{margin:28px !important}.mt-lg-8,.my-lg-8{margin-top:32px !important}.mr-lg-8,.mx-lg-8{margin-right:32px !important}.ml-lg-8,.mx-lg-8{margin-left:32px !important}.mb-lg-8,.my-lg-8{margin-bottom:32px !important}.ms-lg-8{margin-inline-start:32px !important}.me-lg-8{margin-inline-end:32px !important}.ma-lg-8{margin:32px !important}.mt-lg-9,.my-lg-9{margin-top:36px !important}.mr-lg-9,.mx-lg-9{margin-right:36px !important}.ml-lg-9,.mx-lg-9{margin-left:36px !important}.mb-lg-9,.my-lg-9{margin-bottom:36px !important}.ms-lg-9{margin-inline-start:36px !important}.me-lg-9{margin-inline-end:36px !important}.ma-lg-9{margin:36px !important}.mt-lg-10,.my-lg-10{margin-top:40px !important}.mr-lg-10,.mx-lg-10{margin-right:40px !important}.ml-lg-10,.mx-lg-10{margin-left:40px !important}.mb-lg-10,.my-lg-10{margin-bottom:40px !important}.ms-lg-10{margin-inline-start:40px !important}.me-lg-10{margin-inline-end:40px !important}.ma-lg-10{margin:40px !important}.mt-lg-11,.my-lg-11{margin-top:44px !important}.mr-lg-11,.mx-lg-11{margin-right:44px !important}.ml-lg-11,.mx-lg-11{margin-left:44px !important}.mb-lg-11,.my-lg-11{margin-bottom:44px !important}.ms-lg-11{margin-inline-start:44px !important}.me-lg-11{margin-inline-end:44px !important}.ma-lg-11{margin:44px !important}.mt-lg-12,.my-lg-12{margin-top:48px !important}.mr-lg-12,.mx-lg-12{margin-right:48px !important}.ml-lg-12,.mx-lg-12{margin-left:48px !important}.mb-lg-12,.my-lg-12{margin-bottom:48px !important}.ms-lg-12{margin-inline-start:48px !important}.me-lg-12{margin-inline-end:48px !important}.ma-lg-12{margin:48px !important}.mt-lg-13,.my-lg-13{margin-top:52px !important}.mr-lg-13,.mx-lg-13{margin-right:52px !important}.ml-lg-13,.mx-lg-13{margin-left:52px !important}.mb-lg-13,.my-lg-13{margin-bottom:52px !important}.ms-lg-13{margin-inline-start:52px !important}.me-lg-13{margin-inline-end:52px !important}.ma-lg-13{margin:52px !important}.mt-lg-14,.my-lg-14{margin-top:56px !important}.mr-lg-14,.mx-lg-14{margin-right:56px !important}.ml-lg-14,.mx-lg-14{margin-left:56px !important}.mb-lg-14,.my-lg-14{margin-bottom:56px !important}.ms-lg-14{margin-inline-start:56px !important}.me-lg-14{margin-inline-end:56px !important}.ma-lg-14{margin:56px !important}.mt-lg-15,.my-lg-15{margin-top:60px !important}.mr-lg-15,.mx-lg-15{margin-right:60px !important}.ml-lg-15,.mx-lg-15{margin-left:60px !important}.mb-lg-15,.my-lg-15{margin-bottom:60px !important}.ms-lg-15{margin-inline-start:60px !important}.me-lg-15{margin-inline-end:60px !important}.ma-lg-15{margin:60px !important}.mt-lg-16,.my-lg-16{margin-top:64px !important}.mr-lg-16,.mx-lg-16{margin-right:64px !important}.ml-lg-16,.mx-lg-16{margin-left:64px !important}.mb-lg-16,.my-lg-16{margin-bottom:64px !important}.ms-lg-16{margin-inline-start:64px !important}.me-lg-16{margin-inline-end:64px !important}.ma-lg-16{margin:64px !important}.mt-lg-17,.my-lg-17{margin-top:68px !important}.mr-lg-17,.mx-lg-17{margin-right:68px !important}.ml-lg-17,.mx-lg-17{margin-left:68px !important}.mb-lg-17,.my-lg-17{margin-bottom:68px !important}.ms-lg-17{margin-inline-start:68px !important}.me-lg-17{margin-inline-end:68px !important}.ma-lg-17{margin:68px !important}.mt-lg-18,.my-lg-18{margin-top:72px !important}.mr-lg-18,.mx-lg-18{margin-right:72px !important}.ml-lg-18,.mx-lg-18{margin-left:72px !important}.mb-lg-18,.my-lg-18{margin-bottom:72px !important}.ms-lg-18{margin-inline-start:72px !important}.me-lg-18{margin-inline-end:72px !important}.ma-lg-18{margin:72px !important}.mt-lg-19,.my-lg-19{margin-top:76px !important}.mr-lg-19,.mx-lg-19{margin-right:76px !important}.ml-lg-19,.mx-lg-19{margin-left:76px !important}.mb-lg-19,.my-lg-19{margin-bottom:76px !important}.ms-lg-19{margin-inline-start:76px !important}.me-lg-19{margin-inline-end:76px !important}.ma-lg-19{margin:76px !important}.mt-lg-20,.my-lg-20{margin-top:80px !important}.mr-lg-20,.mx-lg-20{margin-right:80px !important}.ml-lg-20,.mx-lg-20{margin-left:80px !important}.mb-lg-20,.my-lg-20{margin-bottom:80px !important}.ms-lg-20{margin-inline-start:80px !important}.me-lg-20{margin-inline-end:80px !important}.ma-lg-20{margin:80px !important}.mt-lg-auto,.my-lg-auto{margin-top:auto !important}.mr-lg-auto,.mx-lg-auto{margin-right:auto !important}.ml-lg-auto,.mx-lg-auto{margin-left:auto !important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto !important}.ms-lg-auto{margin-inline-start:auto !important}.me-lg-auto{margin-inline-end:auto !important}.ma-lg-auto{margin:auto !important}.pt-lg-0,.py-lg-0{padding-top:0 !important}.pr-lg-0,.px-lg-0{padding-right:0 !important}.pl-lg-0,.px-lg-0{padding-left:0 !important}.pb-lg-0,.py-lg-0{padding-bottom:0 !important}.ps-lg-0{padding-inline-start:0 !important}.pe-lg-0{padding-inline-end:0 !important}.pa-lg-0{padding:0 !important}.pt-lg-1,.py-lg-1{padding-top:4px !important}.pr-lg-1,.px-lg-1{padding-right:4px !important}.pl-lg-1,.px-lg-1{padding-left:4px !important}.pb-lg-1,.py-lg-1{padding-bottom:4px !important}.ps-lg-1{padding-inline-start:4px !important}.pe-lg-1{padding-inline-end:4px !important}.pa-lg-1{padding:4px !important}.pt-lg-2,.py-lg-2{padding-top:8px !important}.pr-lg-2,.px-lg-2{padding-right:8px !important}.pl-lg-2,.px-lg-2{padding-left:8px !important}.pb-lg-2,.py-lg-2{padding-bottom:8px !important}.ps-lg-2{padding-inline-start:8px !important}.pe-lg-2{padding-inline-end:8px !important}.pa-lg-2{padding:8px !important}.pt-lg-3,.py-lg-3{padding-top:12px !important}.pr-lg-3,.px-lg-3{padding-right:12px !important}.pl-lg-3,.px-lg-3{padding-left:12px !important}.pb-lg-3,.py-lg-3{padding-bottom:12px !important}.ps-lg-3{padding-inline-start:12px !important}.pe-lg-3{padding-inline-end:12px !important}.pa-lg-3{padding:12px !important}.pt-lg-4,.py-lg-4{padding-top:16px !important}.pr-lg-4,.px-lg-4{padding-right:16px !important}.pl-lg-4,.px-lg-4{padding-left:16px !important}.pb-lg-4,.py-lg-4{padding-bottom:16px !important}.ps-lg-4{padding-inline-start:16px !important}.pe-lg-4{padding-inline-end:16px !important}.pa-lg-4{padding:16px !important}.pt-lg-5,.py-lg-5{padding-top:20px !important}.pr-lg-5,.px-lg-5{padding-right:20px !important}.pl-lg-5,.px-lg-5{padding-left:20px !important}.pb-lg-5,.py-lg-5{padding-bottom:20px !important}.ps-lg-5{padding-inline-start:20px !important}.pe-lg-5{padding-inline-end:20px !important}.pa-lg-5{padding:20px !important}.pt-lg-6,.py-lg-6{padding-top:24px !important}.pr-lg-6,.px-lg-6{padding-right:24px !important}.pl-lg-6,.px-lg-6{padding-left:24px !important}.pb-lg-6,.py-lg-6{padding-bottom:24px !important}.ps-lg-6{padding-inline-start:24px !important}.pe-lg-6{padding-inline-end:24px !important}.pa-lg-6{padding:24px !important}.pt-lg-7,.py-lg-7{padding-top:28px !important}.pr-lg-7,.px-lg-7{padding-right:28px !important}.pl-lg-7,.px-lg-7{padding-left:28px !important}.pb-lg-7,.py-lg-7{padding-bottom:28px !important}.ps-lg-7{padding-inline-start:28px !important}.pe-lg-7{padding-inline-end:28px !important}.pa-lg-7{padding:28px !important}.pt-lg-8,.py-lg-8{padding-top:32px !important}.pr-lg-8,.px-lg-8{padding-right:32px !important}.pl-lg-8,.px-lg-8{padding-left:32px !important}.pb-lg-8,.py-lg-8{padding-bottom:32px !important}.ps-lg-8{padding-inline-start:32px !important}.pe-lg-8{padding-inline-end:32px !important}.pa-lg-8{padding:32px !important}.pt-lg-9,.py-lg-9{padding-top:36px !important}.pr-lg-9,.px-lg-9{padding-right:36px !important}.pl-lg-9,.px-lg-9{padding-left:36px !important}.pb-lg-9,.py-lg-9{padding-bottom:36px !important}.ps-lg-9{padding-inline-start:36px !important}.pe-lg-9{padding-inline-end:36px !important}.pa-lg-9{padding:36px !important}.pt-lg-10,.py-lg-10{padding-top:40px !important}.pr-lg-10,.px-lg-10{padding-right:40px !important}.pl-lg-10,.px-lg-10{padding-left:40px !important}.pb-lg-10,.py-lg-10{padding-bottom:40px !important}.ps-lg-10{padding-inline-start:40px !important}.pe-lg-10{padding-inline-end:40px !important}.pa-lg-10{padding:40px !important}.pt-lg-11,.py-lg-11{padding-top:44px !important}.pr-lg-11,.px-lg-11{padding-right:44px !important}.pl-lg-11,.px-lg-11{padding-left:44px !important}.pb-lg-11,.py-lg-11{padding-bottom:44px !important}.ps-lg-11{padding-inline-start:44px !important}.pe-lg-11{padding-inline-end:44px !important}.pa-lg-11{padding:44px !important}.pt-lg-12,.py-lg-12{padding-top:48px !important}.pr-lg-12,.px-lg-12{padding-right:48px !important}.pl-lg-12,.px-lg-12{padding-left:48px !important}.pb-lg-12,.py-lg-12{padding-bottom:48px !important}.ps-lg-12{padding-inline-start:48px !important}.pe-lg-12{padding-inline-end:48px !important}.pa-lg-12{padding:48px !important}.pt-lg-13,.py-lg-13{padding-top:52px !important}.pr-lg-13,.px-lg-13{padding-right:52px !important}.pl-lg-13,.px-lg-13{padding-left:52px !important}.pb-lg-13,.py-lg-13{padding-bottom:52px !important}.ps-lg-13{padding-inline-start:52px !important}.pe-lg-13{padding-inline-end:52px !important}.pa-lg-13{padding:52px !important}.pt-lg-14,.py-lg-14{padding-top:56px !important}.pr-lg-14,.px-lg-14{padding-right:56px !important}.pl-lg-14,.px-lg-14{padding-left:56px !important}.pb-lg-14,.py-lg-14{padding-bottom:56px !important}.ps-lg-14{padding-inline-start:56px !important}.pe-lg-14{padding-inline-end:56px !important}.pa-lg-14{padding:56px !important}.pt-lg-15,.py-lg-15{padding-top:60px !important}.pr-lg-15,.px-lg-15{padding-right:60px !important}.pl-lg-15,.px-lg-15{padding-left:60px !important}.pb-lg-15,.py-lg-15{padding-bottom:60px !important}.ps-lg-15{padding-inline-start:60px !important}.pe-lg-15{padding-inline-end:60px !important}.pa-lg-15{padding:60px !important}.pt-lg-16,.py-lg-16{padding-top:64px !important}.pr-lg-16,.px-lg-16{padding-right:64px !important}.pl-lg-16,.px-lg-16{padding-left:64px !important}.pb-lg-16,.py-lg-16{padding-bottom:64px !important}.ps-lg-16{padding-inline-start:64px !important}.pe-lg-16{padding-inline-end:64px !important}.pa-lg-16{padding:64px !important}.pt-lg-17,.py-lg-17{padding-top:68px !important}.pr-lg-17,.px-lg-17{padding-right:68px !important}.pl-lg-17,.px-lg-17{padding-left:68px !important}.pb-lg-17,.py-lg-17{padding-bottom:68px !important}.ps-lg-17{padding-inline-start:68px !important}.pe-lg-17{padding-inline-end:68px !important}.pa-lg-17{padding:68px !important}.pt-lg-18,.py-lg-18{padding-top:72px !important}.pr-lg-18,.px-lg-18{padding-right:72px !important}.pl-lg-18,.px-lg-18{padding-left:72px !important}.pb-lg-18,.py-lg-18{padding-bottom:72px !important}.ps-lg-18{padding-inline-start:72px !important}.pe-lg-18{padding-inline-end:72px !important}.pa-lg-18{padding:72px !important}.pt-lg-19,.py-lg-19{padding-top:76px !important}.pr-lg-19,.px-lg-19{padding-right:76px !important}.pl-lg-19,.px-lg-19{padding-left:76px !important}.pb-lg-19,.py-lg-19{padding-bottom:76px !important}.ps-lg-19{padding-inline-start:76px !important}.pe-lg-19{padding-inline-end:76px !important}.pa-lg-19{padding:76px !important}.pt-lg-20,.py-lg-20{padding-top:80px !important}.pr-lg-20,.px-lg-20{padding-right:80px !important}.pl-lg-20,.px-lg-20{padding-left:80px !important}.pb-lg-20,.py-lg-20{padding-bottom:80px !important}.ps-lg-20{padding-inline-start:80px !important}.pe-lg-20{padding-inline-end:80px !important}.pa-lg-20{padding:80px !important}.pt-lg-auto,.py-lg-auto{padding-top:auto !important}.pr-lg-auto,.px-lg-auto{padding-right:auto !important}.pl-lg-auto,.px-lg-auto{padding-left:auto !important}.pb-lg-auto,.py-lg-auto{padding-bottom:auto !important}.ps-lg-auto{padding-inline-start:auto !important}.pe-lg-auto{padding-inline-end:auto !important}.pa-lg-auto{padding:auto !important}.mt-lg-n1,.my-lg-n1{margin-top:-4px !important}.mr-lg-n1,.mx-lg-n1{margin-right:-4px !important}.ml-lg-n1,.mx-lg-n1{margin-left:-4px !important}.mb-lg-n1,.my-lg-n1{margin-bottom:-4px !important}.ms-lg-n1{margin-inline-start:-4px !important}.me-lg-n1{margin-inline-end:-4px !important}.ma-lg-n1{margin:-4px !important}.mt-lg-n2,.my-lg-n2{margin-top:-8px !important}.mr-lg-n2,.mx-lg-n2{margin-right:-8px !important}.ml-lg-n2,.mx-lg-n2{margin-left:-8px !important}.mb-lg-n2,.my-lg-n2{margin-bottom:-8px !important}.ms-lg-n2{margin-inline-start:-8px !important}.me-lg-n2{margin-inline-end:-8px !important}.ma-lg-n2{margin:-8px !important}.mt-lg-n3,.my-lg-n3{margin-top:-12px !important}.mr-lg-n3,.mx-lg-n3{margin-right:-12px !important}.ml-lg-n3,.mx-lg-n3{margin-left:-12px !important}.mb-lg-n3,.my-lg-n3{margin-bottom:-12px !important}.ms-lg-n3{margin-inline-start:-12px !important}.me-lg-n3{margin-inline-end:-12px !important}.ma-lg-n3{margin:-12px !important}.mt-lg-n4,.my-lg-n4{margin-top:-16px !important}.mr-lg-n4,.mx-lg-n4{margin-right:-16px !important}.ml-lg-n4,.mx-lg-n4{margin-left:-16px !important}.mb-lg-n4,.my-lg-n4{margin-bottom:-16px !important}.ms-lg-n4{margin-inline-start:-16px !important}.me-lg-n4{margin-inline-end:-16px !important}.ma-lg-n4{margin:-16px !important}.mt-lg-n5,.my-lg-n5{margin-top:-20px !important}.mr-lg-n5,.mx-lg-n5{margin-right:-20px !important}.ml-lg-n5,.mx-lg-n5{margin-left:-20px !important}.mb-lg-n5,.my-lg-n5{margin-bottom:-20px !important}.ms-lg-n5{margin-inline-start:-20px !important}.me-lg-n5{margin-inline-end:-20px !important}.ma-lg-n5{margin:-20px !important}.mt-lg-n6,.my-lg-n6{margin-top:-24px !important}.mr-lg-n6,.mx-lg-n6{margin-right:-24px !important}.ml-lg-n6,.mx-lg-n6{margin-left:-24px !important}.mb-lg-n6,.my-lg-n6{margin-bottom:-24px !important}.ms-lg-n6{margin-inline-start:-24px !important}.me-lg-n6{margin-inline-end:-24px !important}.ma-lg-n6{margin:-24px !important}.mt-lg-n7,.my-lg-n7{margin-top:-28px !important}.mr-lg-n7,.mx-lg-n7{margin-right:-28px !important}.ml-lg-n7,.mx-lg-n7{margin-left:-28px !important}.mb-lg-n7,.my-lg-n7{margin-bottom:-28px !important}.ms-lg-n7{margin-inline-start:-28px !important}.me-lg-n7{margin-inline-end:-28px !important}.ma-lg-n7{margin:-28px !important}.mt-lg-n8,.my-lg-n8{margin-top:-32px !important}.mr-lg-n8,.mx-lg-n8{margin-right:-32px !important}.ml-lg-n8,.mx-lg-n8{margin-left:-32px !important}.mb-lg-n8,.my-lg-n8{margin-bottom:-32px !important}.ms-lg-n8{margin-inline-start:-32px !important}.me-lg-n8{margin-inline-end:-32px !important}.ma-lg-n8{margin:-32px !important}.mt-lg-n9,.my-lg-n9{margin-top:-36px !important}.mr-lg-n9,.mx-lg-n9{margin-right:-36px !important}.ml-lg-n9,.mx-lg-n9{margin-left:-36px !important}.mb-lg-n9,.my-lg-n9{margin-bottom:-36px !important}.ms-lg-n9{margin-inline-start:-36px !important}.me-lg-n9{margin-inline-end:-36px !important}.ma-lg-n9{margin:-36px !important}.mt-lg-n10,.my-lg-n10{margin-top:-40px !important}.mr-lg-n10,.mx-lg-n10{margin-right:-40px !important}.ml-lg-n10,.mx-lg-n10{margin-left:-40px !important}.mb-lg-n10,.my-lg-n10{margin-bottom:-40px !important}.ms-lg-n10{margin-inline-start:-40px !important}.me-lg-n10{margin-inline-end:-40px !important}.ma-lg-n10{margin:-40px !important}.mt-lg-n11,.my-lg-n11{margin-top:-44px !important}.mr-lg-n11,.mx-lg-n11{margin-right:-44px !important}.ml-lg-n11,.mx-lg-n11{margin-left:-44px !important}.mb-lg-n11,.my-lg-n11{margin-bottom:-44px !important}.ms-lg-n11{margin-inline-start:-44px !important}.me-lg-n11{margin-inline-end:-44px !important}.ma-lg-n11{margin:-44px !important}.mt-lg-n12,.my-lg-n12{margin-top:-48px !important}.mr-lg-n12,.mx-lg-n12{margin-right:-48px !important}.ml-lg-n12,.mx-lg-n12{margin-left:-48px !important}.mb-lg-n12,.my-lg-n12{margin-bottom:-48px !important}.ms-lg-n12{margin-inline-start:-48px !important}.me-lg-n12{margin-inline-end:-48px !important}.ma-lg-n12{margin:-48px !important}.mt-lg-n13,.my-lg-n13{margin-top:-52px !important}.mr-lg-n13,.mx-lg-n13{margin-right:-52px !important}.ml-lg-n13,.mx-lg-n13{margin-left:-52px !important}.mb-lg-n13,.my-lg-n13{margin-bottom:-52px !important}.ms-lg-n13{margin-inline-start:-52px !important}.me-lg-n13{margin-inline-end:-52px !important}.ma-lg-n13{margin:-52px !important}.mt-lg-n14,.my-lg-n14{margin-top:-56px !important}.mr-lg-n14,.mx-lg-n14{margin-right:-56px !important}.ml-lg-n14,.mx-lg-n14{margin-left:-56px !important}.mb-lg-n14,.my-lg-n14{margin-bottom:-56px !important}.ms-lg-n14{margin-inline-start:-56px !important}.me-lg-n14{margin-inline-end:-56px !important}.ma-lg-n14{margin:-56px !important}.mt-lg-n15,.my-lg-n15{margin-top:-60px !important}.mr-lg-n15,.mx-lg-n15{margin-right:-60px !important}.ml-lg-n15,.mx-lg-n15{margin-left:-60px !important}.mb-lg-n15,.my-lg-n15{margin-bottom:-60px !important}.ms-lg-n15{margin-inline-start:-60px !important}.me-lg-n15{margin-inline-end:-60px !important}.ma-lg-n15{margin:-60px !important}.mt-lg-n16,.my-lg-n16{margin-top:-64px !important}.mr-lg-n16,.mx-lg-n16{margin-right:-64px !important}.ml-lg-n16,.mx-lg-n16{margin-left:-64px !important}.mb-lg-n16,.my-lg-n16{margin-bottom:-64px !important}.ms-lg-n16{margin-inline-start:-64px !important}.me-lg-n16{margin-inline-end:-64px !important}.ma-lg-n16{margin:-64px !important}.mt-lg-n17,.my-lg-n17{margin-top:-68px !important}.mr-lg-n17,.mx-lg-n17{margin-right:-68px !important}.ml-lg-n17,.mx-lg-n17{margin-left:-68px !important}.mb-lg-n17,.my-lg-n17{margin-bottom:-68px !important}.ms-lg-n17{margin-inline-start:-68px !important}.me-lg-n17{margin-inline-end:-68px !important}.ma-lg-n17{margin:-68px !important}.mt-lg-n18,.my-lg-n18{margin-top:-72px !important}.mr-lg-n18,.mx-lg-n18{margin-right:-72px !important}.ml-lg-n18,.mx-lg-n18{margin-left:-72px !important}.mb-lg-n18,.my-lg-n18{margin-bottom:-72px !important}.ms-lg-n18{margin-inline-start:-72px !important}.me-lg-n18{margin-inline-end:-72px !important}.ma-lg-n18{margin:-72px !important}.mt-lg-n19,.my-lg-n19{margin-top:-76px !important}.mr-lg-n19,.mx-lg-n19{margin-right:-76px !important}.ml-lg-n19,.mx-lg-n19{margin-left:-76px !important}.mb-lg-n19,.my-lg-n19{margin-bottom:-76px !important}.ms-lg-n19{margin-inline-start:-76px !important}.me-lg-n19{margin-inline-end:-76px !important}.ma-lg-n19{margin:-76px !important}.mt-lg-n20,.my-lg-n20{margin-top:-80px !important}.mr-lg-n20,.mx-lg-n20{margin-right:-80px !important}.ml-lg-n20,.mx-lg-n20{margin-left:-80px !important}.mb-lg-n20,.my-lg-n20{margin-bottom:-80px !important}.ms-lg-n20{margin-inline-start:-80px !important}.me-lg-n20{margin-inline-end:-80px !important}.ma-lg-n20{margin:-80px !important}}@media screen and (min-width: 1920px){.mt-xl-0,.my-xl-0{margin-top:0 !important}.mr-xl-0,.mx-xl-0{margin-right:0 !important}.ml-xl-0,.mx-xl-0{margin-left:0 !important}.mb-xl-0,.my-xl-0{margin-bottom:0 !important}.ms-xl-0{margin-inline-start:0 !important}.me-xl-0{margin-inline-end:0 !important}.ma-xl-0{margin:0 !important}.mt-xl-1,.my-xl-1{margin-top:4px !important}.mr-xl-1,.mx-xl-1{margin-right:4px !important}.ml-xl-1,.mx-xl-1{margin-left:4px !important}.mb-xl-1,.my-xl-1{margin-bottom:4px !important}.ms-xl-1{margin-inline-start:4px !important}.me-xl-1{margin-inline-end:4px !important}.ma-xl-1{margin:4px !important}.mt-xl-2,.my-xl-2{margin-top:8px !important}.mr-xl-2,.mx-xl-2{margin-right:8px !important}.ml-xl-2,.mx-xl-2{margin-left:8px !important}.mb-xl-2,.my-xl-2{margin-bottom:8px !important}.ms-xl-2{margin-inline-start:8px !important}.me-xl-2{margin-inline-end:8px !important}.ma-xl-2{margin:8px !important}.mt-xl-3,.my-xl-3{margin-top:12px !important}.mr-xl-3,.mx-xl-3{margin-right:12px !important}.ml-xl-3,.mx-xl-3{margin-left:12px !important}.mb-xl-3,.my-xl-3{margin-bottom:12px !important}.ms-xl-3{margin-inline-start:12px !important}.me-xl-3{margin-inline-end:12px !important}.ma-xl-3{margin:12px !important}.mt-xl-4,.my-xl-4{margin-top:16px !important}.mr-xl-4,.mx-xl-4{margin-right:16px !important}.ml-xl-4,.mx-xl-4{margin-left:16px !important}.mb-xl-4,.my-xl-4{margin-bottom:16px !important}.ms-xl-4{margin-inline-start:16px !important}.me-xl-4{margin-inline-end:16px !important}.ma-xl-4{margin:16px !important}.mt-xl-5,.my-xl-5{margin-top:20px !important}.mr-xl-5,.mx-xl-5{margin-right:20px !important}.ml-xl-5,.mx-xl-5{margin-left:20px !important}.mb-xl-5,.my-xl-5{margin-bottom:20px !important}.ms-xl-5{margin-inline-start:20px !important}.me-xl-5{margin-inline-end:20px !important}.ma-xl-5{margin:20px !important}.mt-xl-6,.my-xl-6{margin-top:24px !important}.mr-xl-6,.mx-xl-6{margin-right:24px !important}.ml-xl-6,.mx-xl-6{margin-left:24px !important}.mb-xl-6,.my-xl-6{margin-bottom:24px !important}.ms-xl-6{margin-inline-start:24px !important}.me-xl-6{margin-inline-end:24px !important}.ma-xl-6{margin:24px !important}.mt-xl-7,.my-xl-7{margin-top:28px !important}.mr-xl-7,.mx-xl-7{margin-right:28px !important}.ml-xl-7,.mx-xl-7{margin-left:28px !important}.mb-xl-7,.my-xl-7{margin-bottom:28px !important}.ms-xl-7{margin-inline-start:28px !important}.me-xl-7{margin-inline-end:28px !important}.ma-xl-7{margin:28px !important}.mt-xl-8,.my-xl-8{margin-top:32px !important}.mr-xl-8,.mx-xl-8{margin-right:32px !important}.ml-xl-8,.mx-xl-8{margin-left:32px !important}.mb-xl-8,.my-xl-8{margin-bottom:32px !important}.ms-xl-8{margin-inline-start:32px !important}.me-xl-8{margin-inline-end:32px !important}.ma-xl-8{margin:32px !important}.mt-xl-9,.my-xl-9{margin-top:36px !important}.mr-xl-9,.mx-xl-9{margin-right:36px !important}.ml-xl-9,.mx-xl-9{margin-left:36px !important}.mb-xl-9,.my-xl-9{margin-bottom:36px !important}.ms-xl-9{margin-inline-start:36px !important}.me-xl-9{margin-inline-end:36px !important}.ma-xl-9{margin:36px !important}.mt-xl-10,.my-xl-10{margin-top:40px !important}.mr-xl-10,.mx-xl-10{margin-right:40px !important}.ml-xl-10,.mx-xl-10{margin-left:40px !important}.mb-xl-10,.my-xl-10{margin-bottom:40px !important}.ms-xl-10{margin-inline-start:40px !important}.me-xl-10{margin-inline-end:40px !important}.ma-xl-10{margin:40px !important}.mt-xl-11,.my-xl-11{margin-top:44px !important}.mr-xl-11,.mx-xl-11{margin-right:44px !important}.ml-xl-11,.mx-xl-11{margin-left:44px !important}.mb-xl-11,.my-xl-11{margin-bottom:44px !important}.ms-xl-11{margin-inline-start:44px !important}.me-xl-11{margin-inline-end:44px !important}.ma-xl-11{margin:44px !important}.mt-xl-12,.my-xl-12{margin-top:48px !important}.mr-xl-12,.mx-xl-12{margin-right:48px !important}.ml-xl-12,.mx-xl-12{margin-left:48px !important}.mb-xl-12,.my-xl-12{margin-bottom:48px !important}.ms-xl-12{margin-inline-start:48px !important}.me-xl-12{margin-inline-end:48px !important}.ma-xl-12{margin:48px !important}.mt-xl-13,.my-xl-13{margin-top:52px !important}.mr-xl-13,.mx-xl-13{margin-right:52px !important}.ml-xl-13,.mx-xl-13{margin-left:52px !important}.mb-xl-13,.my-xl-13{margin-bottom:52px !important}.ms-xl-13{margin-inline-start:52px !important}.me-xl-13{margin-inline-end:52px !important}.ma-xl-13{margin:52px !important}.mt-xl-14,.my-xl-14{margin-top:56px !important}.mr-xl-14,.mx-xl-14{margin-right:56px !important}.ml-xl-14,.mx-xl-14{margin-left:56px !important}.mb-xl-14,.my-xl-14{margin-bottom:56px !important}.ms-xl-14{margin-inline-start:56px !important}.me-xl-14{margin-inline-end:56px !important}.ma-xl-14{margin:56px !important}.mt-xl-15,.my-xl-15{margin-top:60px !important}.mr-xl-15,.mx-xl-15{margin-right:60px !important}.ml-xl-15,.mx-xl-15{margin-left:60px !important}.mb-xl-15,.my-xl-15{margin-bottom:60px !important}.ms-xl-15{margin-inline-start:60px !important}.me-xl-15{margin-inline-end:60px !important}.ma-xl-15{margin:60px !important}.mt-xl-16,.my-xl-16{margin-top:64px !important}.mr-xl-16,.mx-xl-16{margin-right:64px !important}.ml-xl-16,.mx-xl-16{margin-left:64px !important}.mb-xl-16,.my-xl-16{margin-bottom:64px !important}.ms-xl-16{margin-inline-start:64px !important}.me-xl-16{margin-inline-end:64px !important}.ma-xl-16{margin:64px !important}.mt-xl-17,.my-xl-17{margin-top:68px !important}.mr-xl-17,.mx-xl-17{margin-right:68px !important}.ml-xl-17,.mx-xl-17{margin-left:68px !important}.mb-xl-17,.my-xl-17{margin-bottom:68px !important}.ms-xl-17{margin-inline-start:68px !important}.me-xl-17{margin-inline-end:68px !important}.ma-xl-17{margin:68px !important}.mt-xl-18,.my-xl-18{margin-top:72px !important}.mr-xl-18,.mx-xl-18{margin-right:72px !important}.ml-xl-18,.mx-xl-18{margin-left:72px !important}.mb-xl-18,.my-xl-18{margin-bottom:72px !important}.ms-xl-18{margin-inline-start:72px !important}.me-xl-18{margin-inline-end:72px !important}.ma-xl-18{margin:72px !important}.mt-xl-19,.my-xl-19{margin-top:76px !important}.mr-xl-19,.mx-xl-19{margin-right:76px !important}.ml-xl-19,.mx-xl-19{margin-left:76px !important}.mb-xl-19,.my-xl-19{margin-bottom:76px !important}.ms-xl-19{margin-inline-start:76px !important}.me-xl-19{margin-inline-end:76px !important}.ma-xl-19{margin:76px !important}.mt-xl-20,.my-xl-20{margin-top:80px !important}.mr-xl-20,.mx-xl-20{margin-right:80px !important}.ml-xl-20,.mx-xl-20{margin-left:80px !important}.mb-xl-20,.my-xl-20{margin-bottom:80px !important}.ms-xl-20{margin-inline-start:80px !important}.me-xl-20{margin-inline-end:80px !important}.ma-xl-20{margin:80px !important}.mt-xl-auto,.my-xl-auto{margin-top:auto !important}.mr-xl-auto,.mx-xl-auto{margin-right:auto !important}.ml-xl-auto,.mx-xl-auto{margin-left:auto !important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto !important}.ms-xl-auto{margin-inline-start:auto !important}.me-xl-auto{margin-inline-end:auto !important}.ma-xl-auto{margin:auto !important}.pt-xl-0,.py-xl-0{padding-top:0 !important}.pr-xl-0,.px-xl-0{padding-right:0 !important}.pl-xl-0,.px-xl-0{padding-left:0 !important}.pb-xl-0,.py-xl-0{padding-bottom:0 !important}.ps-xl-0{padding-inline-start:0 !important}.pe-xl-0{padding-inline-end:0 !important}.pa-xl-0{padding:0 !important}.pt-xl-1,.py-xl-1{padding-top:4px !important}.pr-xl-1,.px-xl-1{padding-right:4px !important}.pl-xl-1,.px-xl-1{padding-left:4px !important}.pb-xl-1,.py-xl-1{padding-bottom:4px !important}.ps-xl-1{padding-inline-start:4px !important}.pe-xl-1{padding-inline-end:4px !important}.pa-xl-1{padding:4px !important}.pt-xl-2,.py-xl-2{padding-top:8px !important}.pr-xl-2,.px-xl-2{padding-right:8px !important}.pl-xl-2,.px-xl-2{padding-left:8px !important}.pb-xl-2,.py-xl-2{padding-bottom:8px !important}.ps-xl-2{padding-inline-start:8px !important}.pe-xl-2{padding-inline-end:8px !important}.pa-xl-2{padding:8px !important}.pt-xl-3,.py-xl-3{padding-top:12px !important}.pr-xl-3,.px-xl-3{padding-right:12px !important}.pl-xl-3,.px-xl-3{padding-left:12px !important}.pb-xl-3,.py-xl-3{padding-bottom:12px !important}.ps-xl-3{padding-inline-start:12px !important}.pe-xl-3{padding-inline-end:12px !important}.pa-xl-3{padding:12px !important}.pt-xl-4,.py-xl-4{padding-top:16px !important}.pr-xl-4,.px-xl-4{padding-right:16px !important}.pl-xl-4,.px-xl-4{padding-left:16px !important}.pb-xl-4,.py-xl-4{padding-bottom:16px !important}.ps-xl-4{padding-inline-start:16px !important}.pe-xl-4{padding-inline-end:16px !important}.pa-xl-4{padding:16px !important}.pt-xl-5,.py-xl-5{padding-top:20px !important}.pr-xl-5,.px-xl-5{padding-right:20px !important}.pl-xl-5,.px-xl-5{padding-left:20px !important}.pb-xl-5,.py-xl-5{padding-bottom:20px !important}.ps-xl-5{padding-inline-start:20px !important}.pe-xl-5{padding-inline-end:20px !important}.pa-xl-5{padding:20px !important}.pt-xl-6,.py-xl-6{padding-top:24px !important}.pr-xl-6,.px-xl-6{padding-right:24px !important}.pl-xl-6,.px-xl-6{padding-left:24px !important}.pb-xl-6,.py-xl-6{padding-bottom:24px !important}.ps-xl-6{padding-inline-start:24px !important}.pe-xl-6{padding-inline-end:24px !important}.pa-xl-6{padding:24px !important}.pt-xl-7,.py-xl-7{padding-top:28px !important}.pr-xl-7,.px-xl-7{padding-right:28px !important}.pl-xl-7,.px-xl-7{padding-left:28px !important}.pb-xl-7,.py-xl-7{padding-bottom:28px !important}.ps-xl-7{padding-inline-start:28px !important}.pe-xl-7{padding-inline-end:28px !important}.pa-xl-7{padding:28px !important}.pt-xl-8,.py-xl-8{padding-top:32px !important}.pr-xl-8,.px-xl-8{padding-right:32px !important}.pl-xl-8,.px-xl-8{padding-left:32px !important}.pb-xl-8,.py-xl-8{padding-bottom:32px !important}.ps-xl-8{padding-inline-start:32px !important}.pe-xl-8{padding-inline-end:32px !important}.pa-xl-8{padding:32px !important}.pt-xl-9,.py-xl-9{padding-top:36px !important}.pr-xl-9,.px-xl-9{padding-right:36px !important}.pl-xl-9,.px-xl-9{padding-left:36px !important}.pb-xl-9,.py-xl-9{padding-bottom:36px !important}.ps-xl-9{padding-inline-start:36px !important}.pe-xl-9{padding-inline-end:36px !important}.pa-xl-9{padding:36px !important}.pt-xl-10,.py-xl-10{padding-top:40px !important}.pr-xl-10,.px-xl-10{padding-right:40px !important}.pl-xl-10,.px-xl-10{padding-left:40px !important}.pb-xl-10,.py-xl-10{padding-bottom:40px !important}.ps-xl-10{padding-inline-start:40px !important}.pe-xl-10{padding-inline-end:40px !important}.pa-xl-10{padding:40px !important}.pt-xl-11,.py-xl-11{padding-top:44px !important}.pr-xl-11,.px-xl-11{padding-right:44px !important}.pl-xl-11,.px-xl-11{padding-left:44px !important}.pb-xl-11,.py-xl-11{padding-bottom:44px !important}.ps-xl-11{padding-inline-start:44px !important}.pe-xl-11{padding-inline-end:44px !important}.pa-xl-11{padding:44px !important}.pt-xl-12,.py-xl-12{padding-top:48px !important}.pr-xl-12,.px-xl-12{padding-right:48px !important}.pl-xl-12,.px-xl-12{padding-left:48px !important}.pb-xl-12,.py-xl-12{padding-bottom:48px !important}.ps-xl-12{padding-inline-start:48px !important}.pe-xl-12{padding-inline-end:48px !important}.pa-xl-12{padding:48px !important}.pt-xl-13,.py-xl-13{padding-top:52px !important}.pr-xl-13,.px-xl-13{padding-right:52px !important}.pl-xl-13,.px-xl-13{padding-left:52px !important}.pb-xl-13,.py-xl-13{padding-bottom:52px !important}.ps-xl-13{padding-inline-start:52px !important}.pe-xl-13{padding-inline-end:52px !important}.pa-xl-13{padding:52px !important}.pt-xl-14,.py-xl-14{padding-top:56px !important}.pr-xl-14,.px-xl-14{padding-right:56px !important}.pl-xl-14,.px-xl-14{padding-left:56px !important}.pb-xl-14,.py-xl-14{padding-bottom:56px !important}.ps-xl-14{padding-inline-start:56px !important}.pe-xl-14{padding-inline-end:56px !important}.pa-xl-14{padding:56px !important}.pt-xl-15,.py-xl-15{padding-top:60px !important}.pr-xl-15,.px-xl-15{padding-right:60px !important}.pl-xl-15,.px-xl-15{padding-left:60px !important}.pb-xl-15,.py-xl-15{padding-bottom:60px !important}.ps-xl-15{padding-inline-start:60px !important}.pe-xl-15{padding-inline-end:60px !important}.pa-xl-15{padding:60px !important}.pt-xl-16,.py-xl-16{padding-top:64px !important}.pr-xl-16,.px-xl-16{padding-right:64px !important}.pl-xl-16,.px-xl-16{padding-left:64px !important}.pb-xl-16,.py-xl-16{padding-bottom:64px !important}.ps-xl-16{padding-inline-start:64px !important}.pe-xl-16{padding-inline-end:64px !important}.pa-xl-16{padding:64px !important}.pt-xl-17,.py-xl-17{padding-top:68px !important}.pr-xl-17,.px-xl-17{padding-right:68px !important}.pl-xl-17,.px-xl-17{padding-left:68px !important}.pb-xl-17,.py-xl-17{padding-bottom:68px !important}.ps-xl-17{padding-inline-start:68px !important}.pe-xl-17{padding-inline-end:68px !important}.pa-xl-17{padding:68px !important}.pt-xl-18,.py-xl-18{padding-top:72px !important}.pr-xl-18,.px-xl-18{padding-right:72px !important}.pl-xl-18,.px-xl-18{padding-left:72px !important}.pb-xl-18,.py-xl-18{padding-bottom:72px !important}.ps-xl-18{padding-inline-start:72px !important}.pe-xl-18{padding-inline-end:72px !important}.pa-xl-18{padding:72px !important}.pt-xl-19,.py-xl-19{padding-top:76px !important}.pr-xl-19,.px-xl-19{padding-right:76px !important}.pl-xl-19,.px-xl-19{padding-left:76px !important}.pb-xl-19,.py-xl-19{padding-bottom:76px !important}.ps-xl-19{padding-inline-start:76px !important}.pe-xl-19{padding-inline-end:76px !important}.pa-xl-19{padding:76px !important}.pt-xl-20,.py-xl-20{padding-top:80px !important}.pr-xl-20,.px-xl-20{padding-right:80px !important}.pl-xl-20,.px-xl-20{padding-left:80px !important}.pb-xl-20,.py-xl-20{padding-bottom:80px !important}.ps-xl-20{padding-inline-start:80px !important}.pe-xl-20{padding-inline-end:80px !important}.pa-xl-20{padding:80px !important}.pt-xl-auto,.py-xl-auto{padding-top:auto !important}.pr-xl-auto,.px-xl-auto{padding-right:auto !important}.pl-xl-auto,.px-xl-auto{padding-left:auto !important}.pb-xl-auto,.py-xl-auto{padding-bottom:auto !important}.ps-xl-auto{padding-inline-start:auto !important}.pe-xl-auto{padding-inline-end:auto !important}.pa-xl-auto{padding:auto !important}.mt-xl-n1,.my-xl-n1{margin-top:-4px !important}.mr-xl-n1,.mx-xl-n1{margin-right:-4px !important}.ml-xl-n1,.mx-xl-n1{margin-left:-4px !important}.mb-xl-n1,.my-xl-n1{margin-bottom:-4px !important}.ms-xl-n1{margin-inline-start:-4px !important}.me-xl-n1{margin-inline-end:-4px !important}.ma-xl-n1{margin:-4px !important}.mt-xl-n2,.my-xl-n2{margin-top:-8px !important}.mr-xl-n2,.mx-xl-n2{margin-right:-8px !important}.ml-xl-n2,.mx-xl-n2{margin-left:-8px !important}.mb-xl-n2,.my-xl-n2{margin-bottom:-8px !important}.ms-xl-n2{margin-inline-start:-8px !important}.me-xl-n2{margin-inline-end:-8px !important}.ma-xl-n2{margin:-8px !important}.mt-xl-n3,.my-xl-n3{margin-top:-12px !important}.mr-xl-n3,.mx-xl-n3{margin-right:-12px !important}.ml-xl-n3,.mx-xl-n3{margin-left:-12px !important}.mb-xl-n3,.my-xl-n3{margin-bottom:-12px !important}.ms-xl-n3{margin-inline-start:-12px !important}.me-xl-n3{margin-inline-end:-12px !important}.ma-xl-n3{margin:-12px !important}.mt-xl-n4,.my-xl-n4{margin-top:-16px !important}.mr-xl-n4,.mx-xl-n4{margin-right:-16px !important}.ml-xl-n4,.mx-xl-n4{margin-left:-16px !important}.mb-xl-n4,.my-xl-n4{margin-bottom:-16px !important}.ms-xl-n4{margin-inline-start:-16px !important}.me-xl-n4{margin-inline-end:-16px !important}.ma-xl-n4{margin:-16px !important}.mt-xl-n5,.my-xl-n5{margin-top:-20px !important}.mr-xl-n5,.mx-xl-n5{margin-right:-20px !important}.ml-xl-n5,.mx-xl-n5{margin-left:-20px !important}.mb-xl-n5,.my-xl-n5{margin-bottom:-20px !important}.ms-xl-n5{margin-inline-start:-20px !important}.me-xl-n5{margin-inline-end:-20px !important}.ma-xl-n5{margin:-20px !important}.mt-xl-n6,.my-xl-n6{margin-top:-24px !important}.mr-xl-n6,.mx-xl-n6{margin-right:-24px !important}.ml-xl-n6,.mx-xl-n6{margin-left:-24px !important}.mb-xl-n6,.my-xl-n6{margin-bottom:-24px !important}.ms-xl-n6{margin-inline-start:-24px !important}.me-xl-n6{margin-inline-end:-24px !important}.ma-xl-n6{margin:-24px !important}.mt-xl-n7,.my-xl-n7{margin-top:-28px !important}.mr-xl-n7,.mx-xl-n7{margin-right:-28px !important}.ml-xl-n7,.mx-xl-n7{margin-left:-28px !important}.mb-xl-n7,.my-xl-n7{margin-bottom:-28px !important}.ms-xl-n7{margin-inline-start:-28px !important}.me-xl-n7{margin-inline-end:-28px !important}.ma-xl-n7{margin:-28px !important}.mt-xl-n8,.my-xl-n8{margin-top:-32px !important}.mr-xl-n8,.mx-xl-n8{margin-right:-32px !important}.ml-xl-n8,.mx-xl-n8{margin-left:-32px !important}.mb-xl-n8,.my-xl-n8{margin-bottom:-32px !important}.ms-xl-n8{margin-inline-start:-32px !important}.me-xl-n8{margin-inline-end:-32px !important}.ma-xl-n8{margin:-32px !important}.mt-xl-n9,.my-xl-n9{margin-top:-36px !important}.mr-xl-n9,.mx-xl-n9{margin-right:-36px !important}.ml-xl-n9,.mx-xl-n9{margin-left:-36px !important}.mb-xl-n9,.my-xl-n9{margin-bottom:-36px !important}.ms-xl-n9{margin-inline-start:-36px !important}.me-xl-n9{margin-inline-end:-36px !important}.ma-xl-n9{margin:-36px !important}.mt-xl-n10,.my-xl-n10{margin-top:-40px !important}.mr-xl-n10,.mx-xl-n10{margin-right:-40px !important}.ml-xl-n10,.mx-xl-n10{margin-left:-40px !important}.mb-xl-n10,.my-xl-n10{margin-bottom:-40px !important}.ms-xl-n10{margin-inline-start:-40px !important}.me-xl-n10{margin-inline-end:-40px !important}.ma-xl-n10{margin:-40px !important}.mt-xl-n11,.my-xl-n11{margin-top:-44px !important}.mr-xl-n11,.mx-xl-n11{margin-right:-44px !important}.ml-xl-n11,.mx-xl-n11{margin-left:-44px !important}.mb-xl-n11,.my-xl-n11{margin-bottom:-44px !important}.ms-xl-n11{margin-inline-start:-44px !important}.me-xl-n11{margin-inline-end:-44px !important}.ma-xl-n11{margin:-44px !important}.mt-xl-n12,.my-xl-n12{margin-top:-48px !important}.mr-xl-n12,.mx-xl-n12{margin-right:-48px !important}.ml-xl-n12,.mx-xl-n12{margin-left:-48px !important}.mb-xl-n12,.my-xl-n12{margin-bottom:-48px !important}.ms-xl-n12{margin-inline-start:-48px !important}.me-xl-n12{margin-inline-end:-48px !important}.ma-xl-n12{margin:-48px !important}.mt-xl-n13,.my-xl-n13{margin-top:-52px !important}.mr-xl-n13,.mx-xl-n13{margin-right:-52px !important}.ml-xl-n13,.mx-xl-n13{margin-left:-52px !important}.mb-xl-n13,.my-xl-n13{margin-bottom:-52px !important}.ms-xl-n13{margin-inline-start:-52px !important}.me-xl-n13{margin-inline-end:-52px !important}.ma-xl-n13{margin:-52px !important}.mt-xl-n14,.my-xl-n14{margin-top:-56px !important}.mr-xl-n14,.mx-xl-n14{margin-right:-56px !important}.ml-xl-n14,.mx-xl-n14{margin-left:-56px !important}.mb-xl-n14,.my-xl-n14{margin-bottom:-56px !important}.ms-xl-n14{margin-inline-start:-56px !important}.me-xl-n14{margin-inline-end:-56px !important}.ma-xl-n14{margin:-56px !important}.mt-xl-n15,.my-xl-n15{margin-top:-60px !important}.mr-xl-n15,.mx-xl-n15{margin-right:-60px !important}.ml-xl-n15,.mx-xl-n15{margin-left:-60px !important}.mb-xl-n15,.my-xl-n15{margin-bottom:-60px !important}.ms-xl-n15{margin-inline-start:-60px !important}.me-xl-n15{margin-inline-end:-60px !important}.ma-xl-n15{margin:-60px !important}.mt-xl-n16,.my-xl-n16{margin-top:-64px !important}.mr-xl-n16,.mx-xl-n16{margin-right:-64px !important}.ml-xl-n16,.mx-xl-n16{margin-left:-64px !important}.mb-xl-n16,.my-xl-n16{margin-bottom:-64px !important}.ms-xl-n16{margin-inline-start:-64px !important}.me-xl-n16{margin-inline-end:-64px !important}.ma-xl-n16{margin:-64px !important}.mt-xl-n17,.my-xl-n17{margin-top:-68px !important}.mr-xl-n17,.mx-xl-n17{margin-right:-68px !important}.ml-xl-n17,.mx-xl-n17{margin-left:-68px !important}.mb-xl-n17,.my-xl-n17{margin-bottom:-68px !important}.ms-xl-n17{margin-inline-start:-68px !important}.me-xl-n17{margin-inline-end:-68px !important}.ma-xl-n17{margin:-68px !important}.mt-xl-n18,.my-xl-n18{margin-top:-72px !important}.mr-xl-n18,.mx-xl-n18{margin-right:-72px !important}.ml-xl-n18,.mx-xl-n18{margin-left:-72px !important}.mb-xl-n18,.my-xl-n18{margin-bottom:-72px !important}.ms-xl-n18{margin-inline-start:-72px !important}.me-xl-n18{margin-inline-end:-72px !important}.ma-xl-n18{margin:-72px !important}.mt-xl-n19,.my-xl-n19{margin-top:-76px !important}.mr-xl-n19,.mx-xl-n19{margin-right:-76px !important}.ml-xl-n19,.mx-xl-n19{margin-left:-76px !important}.mb-xl-n19,.my-xl-n19{margin-bottom:-76px !important}.ms-xl-n19{margin-inline-start:-76px !important}.me-xl-n19{margin-inline-end:-76px !important}.ma-xl-n19{margin:-76px !important}.mt-xl-n20,.my-xl-n20{margin-top:-80px !important}.mr-xl-n20,.mx-xl-n20{margin-right:-80px !important}.ml-xl-n20,.mx-xl-n20{margin-left:-80px !important}.mb-xl-n20,.my-xl-n20{margin-bottom:-80px !important}.ms-xl-n20{margin-inline-start:-80px !important}.me-xl-n20{margin-inline-end:-80px !important}.ma-xl-n20{margin:-80px !important}}@media screen and (min-width: 2560px){.mt-xxl-0,.my-xxl-0{margin-top:0 !important}.mr-xxl-0,.mx-xxl-0{margin-right:0 !important}.ml-xxl-0,.mx-xxl-0{margin-left:0 !important}.mb-xxl-0,.my-xxl-0{margin-bottom:0 !important}.ms-xxl-0{margin-inline-start:0 !important}.me-xxl-0{margin-inline-end:0 !important}.ma-xxl-0{margin:0 !important}.mt-xxl-1,.my-xxl-1{margin-top:4px !important}.mr-xxl-1,.mx-xxl-1{margin-right:4px !important}.ml-xxl-1,.mx-xxl-1{margin-left:4px !important}.mb-xxl-1,.my-xxl-1{margin-bottom:4px !important}.ms-xxl-1{margin-inline-start:4px !important}.me-xxl-1{margin-inline-end:4px !important}.ma-xxl-1{margin:4px !important}.mt-xxl-2,.my-xxl-2{margin-top:8px !important}.mr-xxl-2,.mx-xxl-2{margin-right:8px !important}.ml-xxl-2,.mx-xxl-2{margin-left:8px !important}.mb-xxl-2,.my-xxl-2{margin-bottom:8px !important}.ms-xxl-2{margin-inline-start:8px !important}.me-xxl-2{margin-inline-end:8px !important}.ma-xxl-2{margin:8px !important}.mt-xxl-3,.my-xxl-3{margin-top:12px !important}.mr-xxl-3,.mx-xxl-3{margin-right:12px !important}.ml-xxl-3,.mx-xxl-3{margin-left:12px !important}.mb-xxl-3,.my-xxl-3{margin-bottom:12px !important}.ms-xxl-3{margin-inline-start:12px !important}.me-xxl-3{margin-inline-end:12px !important}.ma-xxl-3{margin:12px !important}.mt-xxl-4,.my-xxl-4{margin-top:16px !important}.mr-xxl-4,.mx-xxl-4{margin-right:16px !important}.ml-xxl-4,.mx-xxl-4{margin-left:16px !important}.mb-xxl-4,.my-xxl-4{margin-bottom:16px !important}.ms-xxl-4{margin-inline-start:16px !important}.me-xxl-4{margin-inline-end:16px !important}.ma-xxl-4{margin:16px !important}.mt-xxl-5,.my-xxl-5{margin-top:20px !important}.mr-xxl-5,.mx-xxl-5{margin-right:20px !important}.ml-xxl-5,.mx-xxl-5{margin-left:20px !important}.mb-xxl-5,.my-xxl-5{margin-bottom:20px !important}.ms-xxl-5{margin-inline-start:20px !important}.me-xxl-5{margin-inline-end:20px !important}.ma-xxl-5{margin:20px !important}.mt-xxl-6,.my-xxl-6{margin-top:24px !important}.mr-xxl-6,.mx-xxl-6{margin-right:24px !important}.ml-xxl-6,.mx-xxl-6{margin-left:24px !important}.mb-xxl-6,.my-xxl-6{margin-bottom:24px !important}.ms-xxl-6{margin-inline-start:24px !important}.me-xxl-6{margin-inline-end:24px !important}.ma-xxl-6{margin:24px !important}.mt-xxl-7,.my-xxl-7{margin-top:28px !important}.mr-xxl-7,.mx-xxl-7{margin-right:28px !important}.ml-xxl-7,.mx-xxl-7{margin-left:28px !important}.mb-xxl-7,.my-xxl-7{margin-bottom:28px !important}.ms-xxl-7{margin-inline-start:28px !important}.me-xxl-7{margin-inline-end:28px !important}.ma-xxl-7{margin:28px !important}.mt-xxl-8,.my-xxl-8{margin-top:32px !important}.mr-xxl-8,.mx-xxl-8{margin-right:32px !important}.ml-xxl-8,.mx-xxl-8{margin-left:32px !important}.mb-xxl-8,.my-xxl-8{margin-bottom:32px !important}.ms-xxl-8{margin-inline-start:32px !important}.me-xxl-8{margin-inline-end:32px !important}.ma-xxl-8{margin:32px !important}.mt-xxl-9,.my-xxl-9{margin-top:36px !important}.mr-xxl-9,.mx-xxl-9{margin-right:36px !important}.ml-xxl-9,.mx-xxl-9{margin-left:36px !important}.mb-xxl-9,.my-xxl-9{margin-bottom:36px !important}.ms-xxl-9{margin-inline-start:36px !important}.me-xxl-9{margin-inline-end:36px !important}.ma-xxl-9{margin:36px !important}.mt-xxl-10,.my-xxl-10{margin-top:40px !important}.mr-xxl-10,.mx-xxl-10{margin-right:40px !important}.ml-xxl-10,.mx-xxl-10{margin-left:40px !important}.mb-xxl-10,.my-xxl-10{margin-bottom:40px !important}.ms-xxl-10{margin-inline-start:40px !important}.me-xxl-10{margin-inline-end:40px !important}.ma-xxl-10{margin:40px !important}.mt-xxl-11,.my-xxl-11{margin-top:44px !important}.mr-xxl-11,.mx-xxl-11{margin-right:44px !important}.ml-xxl-11,.mx-xxl-11{margin-left:44px !important}.mb-xxl-11,.my-xxl-11{margin-bottom:44px !important}.ms-xxl-11{margin-inline-start:44px !important}.me-xxl-11{margin-inline-end:44px !important}.ma-xxl-11{margin:44px !important}.mt-xxl-12,.my-xxl-12{margin-top:48px !important}.mr-xxl-12,.mx-xxl-12{margin-right:48px !important}.ml-xxl-12,.mx-xxl-12{margin-left:48px !important}.mb-xxl-12,.my-xxl-12{margin-bottom:48px !important}.ms-xxl-12{margin-inline-start:48px !important}.me-xxl-12{margin-inline-end:48px !important}.ma-xxl-12{margin:48px !important}.mt-xxl-13,.my-xxl-13{margin-top:52px !important}.mr-xxl-13,.mx-xxl-13{margin-right:52px !important}.ml-xxl-13,.mx-xxl-13{margin-left:52px !important}.mb-xxl-13,.my-xxl-13{margin-bottom:52px !important}.ms-xxl-13{margin-inline-start:52px !important}.me-xxl-13{margin-inline-end:52px !important}.ma-xxl-13{margin:52px !important}.mt-xxl-14,.my-xxl-14{margin-top:56px !important}.mr-xxl-14,.mx-xxl-14{margin-right:56px !important}.ml-xxl-14,.mx-xxl-14{margin-left:56px !important}.mb-xxl-14,.my-xxl-14{margin-bottom:56px !important}.ms-xxl-14{margin-inline-start:56px !important}.me-xxl-14{margin-inline-end:56px !important}.ma-xxl-14{margin:56px !important}.mt-xxl-15,.my-xxl-15{margin-top:60px !important}.mr-xxl-15,.mx-xxl-15{margin-right:60px !important}.ml-xxl-15,.mx-xxl-15{margin-left:60px !important}.mb-xxl-15,.my-xxl-15{margin-bottom:60px !important}.ms-xxl-15{margin-inline-start:60px !important}.me-xxl-15{margin-inline-end:60px !important}.ma-xxl-15{margin:60px !important}.mt-xxl-16,.my-xxl-16{margin-top:64px !important}.mr-xxl-16,.mx-xxl-16{margin-right:64px !important}.ml-xxl-16,.mx-xxl-16{margin-left:64px !important}.mb-xxl-16,.my-xxl-16{margin-bottom:64px !important}.ms-xxl-16{margin-inline-start:64px !important}.me-xxl-16{margin-inline-end:64px !important}.ma-xxl-16{margin:64px !important}.mt-xxl-17,.my-xxl-17{margin-top:68px !important}.mr-xxl-17,.mx-xxl-17{margin-right:68px !important}.ml-xxl-17,.mx-xxl-17{margin-left:68px !important}.mb-xxl-17,.my-xxl-17{margin-bottom:68px !important}.ms-xxl-17{margin-inline-start:68px !important}.me-xxl-17{margin-inline-end:68px !important}.ma-xxl-17{margin:68px !important}.mt-xxl-18,.my-xxl-18{margin-top:72px !important}.mr-xxl-18,.mx-xxl-18{margin-right:72px !important}.ml-xxl-18,.mx-xxl-18{margin-left:72px !important}.mb-xxl-18,.my-xxl-18{margin-bottom:72px !important}.ms-xxl-18{margin-inline-start:72px !important}.me-xxl-18{margin-inline-end:72px !important}.ma-xxl-18{margin:72px !important}.mt-xxl-19,.my-xxl-19{margin-top:76px !important}.mr-xxl-19,.mx-xxl-19{margin-right:76px !important}.ml-xxl-19,.mx-xxl-19{margin-left:76px !important}.mb-xxl-19,.my-xxl-19{margin-bottom:76px !important}.ms-xxl-19{margin-inline-start:76px !important}.me-xxl-19{margin-inline-end:76px !important}.ma-xxl-19{margin:76px !important}.mt-xxl-20,.my-xxl-20{margin-top:80px !important}.mr-xxl-20,.mx-xxl-20{margin-right:80px !important}.ml-xxl-20,.mx-xxl-20{margin-left:80px !important}.mb-xxl-20,.my-xxl-20{margin-bottom:80px !important}.ms-xxl-20{margin-inline-start:80px !important}.me-xxl-20{margin-inline-end:80px !important}.ma-xxl-20{margin:80px !important}.mt-xxl-auto,.my-xxl-auto{margin-top:auto !important}.mr-xxl-auto,.mx-xxl-auto{margin-right:auto !important}.ml-xxl-auto,.mx-xxl-auto{margin-left:auto !important}.mb-xxl-auto,.my-xxl-auto{margin-bottom:auto !important}.ms-xxl-auto{margin-inline-start:auto !important}.me-xxl-auto{margin-inline-end:auto !important}.ma-xxl-auto{margin:auto !important}.pt-xxl-0,.py-xxl-0{padding-top:0 !important}.pr-xxl-0,.px-xxl-0{padding-right:0 !important}.pl-xxl-0,.px-xxl-0{padding-left:0 !important}.pb-xxl-0,.py-xxl-0{padding-bottom:0 !important}.ps-xxl-0{padding-inline-start:0 !important}.pe-xxl-0{padding-inline-end:0 !important}.pa-xxl-0{padding:0 !important}.pt-xxl-1,.py-xxl-1{padding-top:4px !important}.pr-xxl-1,.px-xxl-1{padding-right:4px !important}.pl-xxl-1,.px-xxl-1{padding-left:4px !important}.pb-xxl-1,.py-xxl-1{padding-bottom:4px !important}.ps-xxl-1{padding-inline-start:4px !important}.pe-xxl-1{padding-inline-end:4px !important}.pa-xxl-1{padding:4px !important}.pt-xxl-2,.py-xxl-2{padding-top:8px !important}.pr-xxl-2,.px-xxl-2{padding-right:8px !important}.pl-xxl-2,.px-xxl-2{padding-left:8px !important}.pb-xxl-2,.py-xxl-2{padding-bottom:8px !important}.ps-xxl-2{padding-inline-start:8px !important}.pe-xxl-2{padding-inline-end:8px !important}.pa-xxl-2{padding:8px !important}.pt-xxl-3,.py-xxl-3{padding-top:12px !important}.pr-xxl-3,.px-xxl-3{padding-right:12px !important}.pl-xxl-3,.px-xxl-3{padding-left:12px !important}.pb-xxl-3,.py-xxl-3{padding-bottom:12px !important}.ps-xxl-3{padding-inline-start:12px !important}.pe-xxl-3{padding-inline-end:12px !important}.pa-xxl-3{padding:12px !important}.pt-xxl-4,.py-xxl-4{padding-top:16px !important}.pr-xxl-4,.px-xxl-4{padding-right:16px !important}.pl-xxl-4,.px-xxl-4{padding-left:16px !important}.pb-xxl-4,.py-xxl-4{padding-bottom:16px !important}.ps-xxl-4{padding-inline-start:16px !important}.pe-xxl-4{padding-inline-end:16px !important}.pa-xxl-4{padding:16px !important}.pt-xxl-5,.py-xxl-5{padding-top:20px !important}.pr-xxl-5,.px-xxl-5{padding-right:20px !important}.pl-xxl-5,.px-xxl-5{padding-left:20px !important}.pb-xxl-5,.py-xxl-5{padding-bottom:20px !important}.ps-xxl-5{padding-inline-start:20px !important}.pe-xxl-5{padding-inline-end:20px !important}.pa-xxl-5{padding:20px !important}.pt-xxl-6,.py-xxl-6{padding-top:24px !important}.pr-xxl-6,.px-xxl-6{padding-right:24px !important}.pl-xxl-6,.px-xxl-6{padding-left:24px !important}.pb-xxl-6,.py-xxl-6{padding-bottom:24px !important}.ps-xxl-6{padding-inline-start:24px !important}.pe-xxl-6{padding-inline-end:24px !important}.pa-xxl-6{padding:24px !important}.pt-xxl-7,.py-xxl-7{padding-top:28px !important}.pr-xxl-7,.px-xxl-7{padding-right:28px !important}.pl-xxl-7,.px-xxl-7{padding-left:28px !important}.pb-xxl-7,.py-xxl-7{padding-bottom:28px !important}.ps-xxl-7{padding-inline-start:28px !important}.pe-xxl-7{padding-inline-end:28px !important}.pa-xxl-7{padding:28px !important}.pt-xxl-8,.py-xxl-8{padding-top:32px !important}.pr-xxl-8,.px-xxl-8{padding-right:32px !important}.pl-xxl-8,.px-xxl-8{padding-left:32px !important}.pb-xxl-8,.py-xxl-8{padding-bottom:32px !important}.ps-xxl-8{padding-inline-start:32px !important}.pe-xxl-8{padding-inline-end:32px !important}.pa-xxl-8{padding:32px !important}.pt-xxl-9,.py-xxl-9{padding-top:36px !important}.pr-xxl-9,.px-xxl-9{padding-right:36px !important}.pl-xxl-9,.px-xxl-9{padding-left:36px !important}.pb-xxl-9,.py-xxl-9{padding-bottom:36px !important}.ps-xxl-9{padding-inline-start:36px !important}.pe-xxl-9{padding-inline-end:36px !important}.pa-xxl-9{padding:36px !important}.pt-xxl-10,.py-xxl-10{padding-top:40px !important}.pr-xxl-10,.px-xxl-10{padding-right:40px !important}.pl-xxl-10,.px-xxl-10{padding-left:40px !important}.pb-xxl-10,.py-xxl-10{padding-bottom:40px !important}.ps-xxl-10{padding-inline-start:40px !important}.pe-xxl-10{padding-inline-end:40px !important}.pa-xxl-10{padding:40px !important}.pt-xxl-11,.py-xxl-11{padding-top:44px !important}.pr-xxl-11,.px-xxl-11{padding-right:44px !important}.pl-xxl-11,.px-xxl-11{padding-left:44px !important}.pb-xxl-11,.py-xxl-11{padding-bottom:44px !important}.ps-xxl-11{padding-inline-start:44px !important}.pe-xxl-11{padding-inline-end:44px !important}.pa-xxl-11{padding:44px !important}.pt-xxl-12,.py-xxl-12{padding-top:48px !important}.pr-xxl-12,.px-xxl-12{padding-right:48px !important}.pl-xxl-12,.px-xxl-12{padding-left:48px !important}.pb-xxl-12,.py-xxl-12{padding-bottom:48px !important}.ps-xxl-12{padding-inline-start:48px !important}.pe-xxl-12{padding-inline-end:48px !important}.pa-xxl-12{padding:48px !important}.pt-xxl-13,.py-xxl-13{padding-top:52px !important}.pr-xxl-13,.px-xxl-13{padding-right:52px !important}.pl-xxl-13,.px-xxl-13{padding-left:52px !important}.pb-xxl-13,.py-xxl-13{padding-bottom:52px !important}.ps-xxl-13{padding-inline-start:52px !important}.pe-xxl-13{padding-inline-end:52px !important}.pa-xxl-13{padding:52px !important}.pt-xxl-14,.py-xxl-14{padding-top:56px !important}.pr-xxl-14,.px-xxl-14{padding-right:56px !important}.pl-xxl-14,.px-xxl-14{padding-left:56px !important}.pb-xxl-14,.py-xxl-14{padding-bottom:56px !important}.ps-xxl-14{padding-inline-start:56px !important}.pe-xxl-14{padding-inline-end:56px !important}.pa-xxl-14{padding:56px !important}.pt-xxl-15,.py-xxl-15{padding-top:60px !important}.pr-xxl-15,.px-xxl-15{padding-right:60px !important}.pl-xxl-15,.px-xxl-15{padding-left:60px !important}.pb-xxl-15,.py-xxl-15{padding-bottom:60px !important}.ps-xxl-15{padding-inline-start:60px !important}.pe-xxl-15{padding-inline-end:60px !important}.pa-xxl-15{padding:60px !important}.pt-xxl-16,.py-xxl-16{padding-top:64px !important}.pr-xxl-16,.px-xxl-16{padding-right:64px !important}.pl-xxl-16,.px-xxl-16{padding-left:64px !important}.pb-xxl-16,.py-xxl-16{padding-bottom:64px !important}.ps-xxl-16{padding-inline-start:64px !important}.pe-xxl-16{padding-inline-end:64px !important}.pa-xxl-16{padding:64px !important}.pt-xxl-17,.py-xxl-17{padding-top:68px !important}.pr-xxl-17,.px-xxl-17{padding-right:68px !important}.pl-xxl-17,.px-xxl-17{padding-left:68px !important}.pb-xxl-17,.py-xxl-17{padding-bottom:68px !important}.ps-xxl-17{padding-inline-start:68px !important}.pe-xxl-17{padding-inline-end:68px !important}.pa-xxl-17{padding:68px !important}.pt-xxl-18,.py-xxl-18{padding-top:72px !important}.pr-xxl-18,.px-xxl-18{padding-right:72px !important}.pl-xxl-18,.px-xxl-18{padding-left:72px !important}.pb-xxl-18,.py-xxl-18{padding-bottom:72px !important}.ps-xxl-18{padding-inline-start:72px !important}.pe-xxl-18{padding-inline-end:72px !important}.pa-xxl-18{padding:72px !important}.pt-xxl-19,.py-xxl-19{padding-top:76px !important}.pr-xxl-19,.px-xxl-19{padding-right:76px !important}.pl-xxl-19,.px-xxl-19{padding-left:76px !important}.pb-xxl-19,.py-xxl-19{padding-bottom:76px !important}.ps-xxl-19{padding-inline-start:76px !important}.pe-xxl-19{padding-inline-end:76px !important}.pa-xxl-19{padding:76px !important}.pt-xxl-20,.py-xxl-20{padding-top:80px !important}.pr-xxl-20,.px-xxl-20{padding-right:80px !important}.pl-xxl-20,.px-xxl-20{padding-left:80px !important}.pb-xxl-20,.py-xxl-20{padding-bottom:80px !important}.ps-xxl-20{padding-inline-start:80px !important}.pe-xxl-20{padding-inline-end:80px !important}.pa-xxl-20{padding:80px !important}.pt-xxl-auto,.py-xxl-auto{padding-top:auto !important}.pr-xxl-auto,.px-xxl-auto{padding-right:auto !important}.pl-xxl-auto,.px-xxl-auto{padding-left:auto !important}.pb-xxl-auto,.py-xxl-auto{padding-bottom:auto !important}.ps-xxl-auto{padding-inline-start:auto !important}.pe-xxl-auto{padding-inline-end:auto !important}.pa-xxl-auto{padding:auto !important}.mt-xxl-n1,.my-xxl-n1{margin-top:-4px !important}.mr-xxl-n1,.mx-xxl-n1{margin-right:-4px !important}.ml-xxl-n1,.mx-xxl-n1{margin-left:-4px !important}.mb-xxl-n1,.my-xxl-n1{margin-bottom:-4px !important}.ms-xxl-n1{margin-inline-start:-4px !important}.me-xxl-n1{margin-inline-end:-4px !important}.ma-xxl-n1{margin:-4px !important}.mt-xxl-n2,.my-xxl-n2{margin-top:-8px !important}.mr-xxl-n2,.mx-xxl-n2{margin-right:-8px !important}.ml-xxl-n2,.mx-xxl-n2{margin-left:-8px !important}.mb-xxl-n2,.my-xxl-n2{margin-bottom:-8px !important}.ms-xxl-n2{margin-inline-start:-8px !important}.me-xxl-n2{margin-inline-end:-8px !important}.ma-xxl-n2{margin:-8px !important}.mt-xxl-n3,.my-xxl-n3{margin-top:-12px !important}.mr-xxl-n3,.mx-xxl-n3{margin-right:-12px !important}.ml-xxl-n3,.mx-xxl-n3{margin-left:-12px !important}.mb-xxl-n3,.my-xxl-n3{margin-bottom:-12px !important}.ms-xxl-n3{margin-inline-start:-12px !important}.me-xxl-n3{margin-inline-end:-12px !important}.ma-xxl-n3{margin:-12px !important}.mt-xxl-n4,.my-xxl-n4{margin-top:-16px !important}.mr-xxl-n4,.mx-xxl-n4{margin-right:-16px !important}.ml-xxl-n4,.mx-xxl-n4{margin-left:-16px !important}.mb-xxl-n4,.my-xxl-n4{margin-bottom:-16px !important}.ms-xxl-n4{margin-inline-start:-16px !important}.me-xxl-n4{margin-inline-end:-16px !important}.ma-xxl-n4{margin:-16px !important}.mt-xxl-n5,.my-xxl-n5{margin-top:-20px !important}.mr-xxl-n5,.mx-xxl-n5{margin-right:-20px !important}.ml-xxl-n5,.mx-xxl-n5{margin-left:-20px !important}.mb-xxl-n5,.my-xxl-n5{margin-bottom:-20px !important}.ms-xxl-n5{margin-inline-start:-20px !important}.me-xxl-n5{margin-inline-end:-20px !important}.ma-xxl-n5{margin:-20px !important}.mt-xxl-n6,.my-xxl-n6{margin-top:-24px !important}.mr-xxl-n6,.mx-xxl-n6{margin-right:-24px !important}.ml-xxl-n6,.mx-xxl-n6{margin-left:-24px !important}.mb-xxl-n6,.my-xxl-n6{margin-bottom:-24px !important}.ms-xxl-n6{margin-inline-start:-24px !important}.me-xxl-n6{margin-inline-end:-24px !important}.ma-xxl-n6{margin:-24px !important}.mt-xxl-n7,.my-xxl-n7{margin-top:-28px !important}.mr-xxl-n7,.mx-xxl-n7{margin-right:-28px !important}.ml-xxl-n7,.mx-xxl-n7{margin-left:-28px !important}.mb-xxl-n7,.my-xxl-n7{margin-bottom:-28px !important}.ms-xxl-n7{margin-inline-start:-28px !important}.me-xxl-n7{margin-inline-end:-28px !important}.ma-xxl-n7{margin:-28px !important}.mt-xxl-n8,.my-xxl-n8{margin-top:-32px !important}.mr-xxl-n8,.mx-xxl-n8{margin-right:-32px !important}.ml-xxl-n8,.mx-xxl-n8{margin-left:-32px !important}.mb-xxl-n8,.my-xxl-n8{margin-bottom:-32px !important}.ms-xxl-n8{margin-inline-start:-32px !important}.me-xxl-n8{margin-inline-end:-32px !important}.ma-xxl-n8{margin:-32px !important}.mt-xxl-n9,.my-xxl-n9{margin-top:-36px !important}.mr-xxl-n9,.mx-xxl-n9{margin-right:-36px !important}.ml-xxl-n9,.mx-xxl-n9{margin-left:-36px !important}.mb-xxl-n9,.my-xxl-n9{margin-bottom:-36px !important}.ms-xxl-n9{margin-inline-start:-36px !important}.me-xxl-n9{margin-inline-end:-36px !important}.ma-xxl-n9{margin:-36px !important}.mt-xxl-n10,.my-xxl-n10{margin-top:-40px !important}.mr-xxl-n10,.mx-xxl-n10{margin-right:-40px !important}.ml-xxl-n10,.mx-xxl-n10{margin-left:-40px !important}.mb-xxl-n10,.my-xxl-n10{margin-bottom:-40px !important}.ms-xxl-n10{margin-inline-start:-40px !important}.me-xxl-n10{margin-inline-end:-40px !important}.ma-xxl-n10{margin:-40px !important}.mt-xxl-n11,.my-xxl-n11{margin-top:-44px !important}.mr-xxl-n11,.mx-xxl-n11{margin-right:-44px !important}.ml-xxl-n11,.mx-xxl-n11{margin-left:-44px !important}.mb-xxl-n11,.my-xxl-n11{margin-bottom:-44px !important}.ms-xxl-n11{margin-inline-start:-44px !important}.me-xxl-n11{margin-inline-end:-44px !important}.ma-xxl-n11{margin:-44px !important}.mt-xxl-n12,.my-xxl-n12{margin-top:-48px !important}.mr-xxl-n12,.mx-xxl-n12{margin-right:-48px !important}.ml-xxl-n12,.mx-xxl-n12{margin-left:-48px !important}.mb-xxl-n12,.my-xxl-n12{margin-bottom:-48px !important}.ms-xxl-n12{margin-inline-start:-48px !important}.me-xxl-n12{margin-inline-end:-48px !important}.ma-xxl-n12{margin:-48px !important}.mt-xxl-n13,.my-xxl-n13{margin-top:-52px !important}.mr-xxl-n13,.mx-xxl-n13{margin-right:-52px !important}.ml-xxl-n13,.mx-xxl-n13{margin-left:-52px !important}.mb-xxl-n13,.my-xxl-n13{margin-bottom:-52px !important}.ms-xxl-n13{margin-inline-start:-52px !important}.me-xxl-n13{margin-inline-end:-52px !important}.ma-xxl-n13{margin:-52px !important}.mt-xxl-n14,.my-xxl-n14{margin-top:-56px !important}.mr-xxl-n14,.mx-xxl-n14{margin-right:-56px !important}.ml-xxl-n14,.mx-xxl-n14{margin-left:-56px !important}.mb-xxl-n14,.my-xxl-n14{margin-bottom:-56px !important}.ms-xxl-n14{margin-inline-start:-56px !important}.me-xxl-n14{margin-inline-end:-56px !important}.ma-xxl-n14{margin:-56px !important}.mt-xxl-n15,.my-xxl-n15{margin-top:-60px !important}.mr-xxl-n15,.mx-xxl-n15{margin-right:-60px !important}.ml-xxl-n15,.mx-xxl-n15{margin-left:-60px !important}.mb-xxl-n15,.my-xxl-n15{margin-bottom:-60px !important}.ms-xxl-n15{margin-inline-start:-60px !important}.me-xxl-n15{margin-inline-end:-60px !important}.ma-xxl-n15{margin:-60px !important}.mt-xxl-n16,.my-xxl-n16{margin-top:-64px !important}.mr-xxl-n16,.mx-xxl-n16{margin-right:-64px !important}.ml-xxl-n16,.mx-xxl-n16{margin-left:-64px !important}.mb-xxl-n16,.my-xxl-n16{margin-bottom:-64px !important}.ms-xxl-n16{margin-inline-start:-64px !important}.me-xxl-n16{margin-inline-end:-64px !important}.ma-xxl-n16{margin:-64px !important}.mt-xxl-n17,.my-xxl-n17{margin-top:-68px !important}.mr-xxl-n17,.mx-xxl-n17{margin-right:-68px !important}.ml-xxl-n17,.mx-xxl-n17{margin-left:-68px !important}.mb-xxl-n17,.my-xxl-n17{margin-bottom:-68px !important}.ms-xxl-n17{margin-inline-start:-68px !important}.me-xxl-n17{margin-inline-end:-68px !important}.ma-xxl-n17{margin:-68px !important}.mt-xxl-n18,.my-xxl-n18{margin-top:-72px !important}.mr-xxl-n18,.mx-xxl-n18{margin-right:-72px !important}.ml-xxl-n18,.mx-xxl-n18{margin-left:-72px !important}.mb-xxl-n18,.my-xxl-n18{margin-bottom:-72px !important}.ms-xxl-n18{margin-inline-start:-72px !important}.me-xxl-n18{margin-inline-end:-72px !important}.ma-xxl-n18{margin:-72px !important}.mt-xxl-n19,.my-xxl-n19{margin-top:-76px !important}.mr-xxl-n19,.mx-xxl-n19{margin-right:-76px !important}.ml-xxl-n19,.mx-xxl-n19{margin-left:-76px !important}.mb-xxl-n19,.my-xxl-n19{margin-bottom:-76px !important}.ms-xxl-n19{margin-inline-start:-76px !important}.me-xxl-n19{margin-inline-end:-76px !important}.ma-xxl-n19{margin:-76px !important}.mt-xxl-n20,.my-xxl-n20{margin-top:-80px !important}.mr-xxl-n20,.mx-xxl-n20{margin-right:-80px !important}.ml-xxl-n20,.mx-xxl-n20{margin-left:-80px !important}.mb-xxl-n20,.my-xxl-n20{margin-bottom:-80px !important}.ms-xxl-n20{margin-inline-start:-80px !important}.me-xxl-n20{margin-inline-end:-80px !important}.ma-xxl-n20{margin:-80px !important}}.mud-width-full{width:100%}.mud-height-full{height:100%}.w-max{width:max-content}.mud-appbar{width:100%;display:flex;z-index:var(--mud-zindex-appbar);position:relative;box-sizing:border-box;flex-shrink:0;flex-direction:column;color:var(--mud-palette-appbar-text);background-color:var(--mud-palette-appbar-background);transition:margin 225ms cubic-bezier(0, 0, 0.2, 1) 0ms,width 225ms cubic-bezier(0, 0, 0.2, 1) 0ms}.mud-appbar.mud-appbar-fixed-top{position:fixed;top:0;right:0;left:0}.mud-appbar.mud-appbar-fixed-top .mud-popover-cascading-value{position:fixed}.mud-appbar.mud-appbar-fixed-bottom{position:fixed;bottom:0;right:0;left:0}.mud-appbar.mud-appbar-fixed-bottom .mud-popover-cascading-value{position:fixed}.mud-appbar .mud-toolbar-appbar{height:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/8)}@media(min-width: 0px)and (orientation: landscape){.mud-appbar .mud-toolbar-appbar{height:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/4)}}@media(min-width: 600px){.mud-appbar .mud-toolbar-appbar{height:var(--mud-appbar-height)}}.mud-appbar.mud-appbar-dense .mud-toolbar-appbar{height:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/4)}@media(min-width: 0px){.mud-drawer-open-responsive-xs-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);width:calc(100% - var(--mud-drawer-width-left))}.mud-drawer-open-responsive-xs-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-right))}.mud-drawer-open-responsive-xs-left.mud-drawer-left-clipped-never.mud-drawer-open-responsive-xs-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-left) - var(--mud-drawer-width-right))}}@media(min-width: 600px){.mud-drawer-open-responsive-sm-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);width:calc(100% - var(--mud-drawer-width-left))}.mud-drawer-open-responsive-sm-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-right))}.mud-drawer-open-responsive-sm-left.mud-drawer-left-clipped-never.mud-drawer-open-responsive-sm-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-left) - var(--mud-drawer-width-right))}}@media(min-width: 960px){.mud-drawer-open-responsive-md-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);width:calc(100% - var(--mud-drawer-width-left))}.mud-drawer-open-responsive-md-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-right))}.mud-drawer-open-responsive-md-left.mud-drawer-left-clipped-never.mud-drawer-open-responsive-md-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-left) - var(--mud-drawer-width-right))}}@media(min-width: 1280px){.mud-drawer-open-responsive-lg-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);width:calc(100% - var(--mud-drawer-width-left))}.mud-drawer-open-responsive-lg-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-right))}.mud-drawer-open-responsive-lg-left.mud-drawer-left-clipped-never.mud-drawer-open-responsive-lg-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-left) - var(--mud-drawer-width-right))}}@media(min-width: 1920px){.mud-drawer-open-responsive-xl-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);width:calc(100% - var(--mud-drawer-width-left))}.mud-drawer-open-responsive-xl-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-right))}.mud-drawer-open-responsive-xl-left.mud-drawer-left-clipped-never.mud-drawer-open-responsive-xl-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-left) - var(--mud-drawer-width-right))}}@media(min-width: 2560px){.mud-drawer-open-responsive-xxl-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);width:calc(100% - var(--mud-drawer-width-left))}.mud-drawer-open-responsive-xxl-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-right))}.mud-drawer-open-responsive-xxl-left.mud-drawer-left-clipped-never.mud-drawer-open-responsive-xxl-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-left) - var(--mud-drawer-width-right))}}.mud-drawer-open-persistent-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);width:calc(100% - var(--mud-drawer-width-left))}.mud-drawer-open-persistent-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-right))}.mud-drawer-open-persistent-left.mud-drawer-left-clipped-never.mud-drawer-open-persistent-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-left) - var(--mud-drawer-width-right))}@media(min-width: 0px){.mud-drawer-open-mini-xs-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);width:calc(100% - var(--mud-drawer-width-left))}.mud-drawer-open-mini-xs-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-right))}.mud-drawer-open-mini-xs-left.mud-drawer-left-clipped-never.mud-drawer-open-mini-xs-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-left) - var(--mud-drawer-width-right))}}@media(min-width: 600px){.mud-drawer-open-mini-sm-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);width:calc(100% - var(--mud-drawer-width-left))}.mud-drawer-open-mini-sm-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-right))}.mud-drawer-open-mini-sm-left.mud-drawer-left-clipped-never.mud-drawer-open-mini-sm-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-left) - var(--mud-drawer-width-right))}}@media(min-width: 960px){.mud-drawer-open-mini-md-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);width:calc(100% - var(--mud-drawer-width-left))}.mud-drawer-open-mini-md-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-right))}.mud-drawer-open-mini-md-left.mud-drawer-left-clipped-never.mud-drawer-open-mini-md-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-left) - var(--mud-drawer-width-right))}}@media(min-width: 1280px){.mud-drawer-open-mini-lg-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);width:calc(100% - var(--mud-drawer-width-left))}.mud-drawer-open-mini-lg-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-right))}.mud-drawer-open-mini-lg-left.mud-drawer-left-clipped-never.mud-drawer-open-mini-lg-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-left) - var(--mud-drawer-width-right))}}@media(min-width: 1920px){.mud-drawer-open-mini-xl-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);width:calc(100% - var(--mud-drawer-width-left))}.mud-drawer-open-mini-xl-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-right))}.mud-drawer-open-mini-xl-left.mud-drawer-left-clipped-never.mud-drawer-open-mini-xl-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-left) - var(--mud-drawer-width-right))}}@media(min-width: 2560px){.mud-drawer-open-mini-xxl-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);width:calc(100% - var(--mud-drawer-width-left))}.mud-drawer-open-mini-xxl-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-right))}.mud-drawer-open-mini-xxl-left.mud-drawer-left-clipped-never.mud-drawer-open-mini-xxl-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-left);margin-right:var(--mud-drawer-width-right);width:calc(100% - var(--mud-drawer-width-left) - var(--mud-drawer-width-right))}}.mud-drawer-close-mini-xs-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);width:calc(100% - var(--mud-drawer-width-mini-left))}.mud-drawer-close-mini-xs-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-right))}.mud-drawer-close-mini-xs-left.mud-drawer-left-clipped-never.mud-drawer-close-mini-xs-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-left) - var(--mud-drawer-width-mini-right))}@media(max-width: 0px){.mud-drawer-close-mini-xs-left.mud-drawer-left-clipped-docked .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);width:calc(100% - var(--mud-drawer-width-mini-left))}.mud-drawer-close-mini-xs-right.mud-drawer-right-clipped-docked .mud-appbar{margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-right))}.mud-drawer-close-mini-xs-left.mud-drawer-left-clipped-docked.mud-drawer-close-mini-xs-right.mud-drawer-right-clipped-docked .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-left) - var(--mud-drawer-width-mini-right))}}.mud-drawer-close-mini-sm-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);width:calc(100% - var(--mud-drawer-width-mini-left))}.mud-drawer-close-mini-sm-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-right))}.mud-drawer-close-mini-sm-left.mud-drawer-left-clipped-never.mud-drawer-close-mini-sm-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-left) - var(--mud-drawer-width-mini-right))}@media(max-width: 600px){.mud-drawer-close-mini-sm-left.mud-drawer-left-clipped-docked .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);width:calc(100% - var(--mud-drawer-width-mini-left))}.mud-drawer-close-mini-sm-right.mud-drawer-right-clipped-docked .mud-appbar{margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-right))}.mud-drawer-close-mini-sm-left.mud-drawer-left-clipped-docked.mud-drawer-close-mini-sm-right.mud-drawer-right-clipped-docked .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-left) - var(--mud-drawer-width-mini-right))}}.mud-drawer-close-mini-md-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);width:calc(100% - var(--mud-drawer-width-mini-left))}.mud-drawer-close-mini-md-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-right))}.mud-drawer-close-mini-md-left.mud-drawer-left-clipped-never.mud-drawer-close-mini-md-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-left) - var(--mud-drawer-width-mini-right))}@media(max-width: 960px){.mud-drawer-close-mini-md-left.mud-drawer-left-clipped-docked .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);width:calc(100% - var(--mud-drawer-width-mini-left))}.mud-drawer-close-mini-md-right.mud-drawer-right-clipped-docked .mud-appbar{margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-right))}.mud-drawer-close-mini-md-left.mud-drawer-left-clipped-docked.mud-drawer-close-mini-md-right.mud-drawer-right-clipped-docked .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-left) - var(--mud-drawer-width-mini-right))}}.mud-drawer-close-mini-lg-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);width:calc(100% - var(--mud-drawer-width-mini-left))}.mud-drawer-close-mini-lg-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-right))}.mud-drawer-close-mini-lg-left.mud-drawer-left-clipped-never.mud-drawer-close-mini-lg-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-left) - var(--mud-drawer-width-mini-right))}@media(max-width: 1280px){.mud-drawer-close-mini-lg-left.mud-drawer-left-clipped-docked .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);width:calc(100% - var(--mud-drawer-width-mini-left))}.mud-drawer-close-mini-lg-right.mud-drawer-right-clipped-docked .mud-appbar{margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-right))}.mud-drawer-close-mini-lg-left.mud-drawer-left-clipped-docked.mud-drawer-close-mini-lg-right.mud-drawer-right-clipped-docked .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-left) - var(--mud-drawer-width-mini-right))}}.mud-drawer-close-mini-xl-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);width:calc(100% - var(--mud-drawer-width-mini-left))}.mud-drawer-close-mini-xl-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-right))}.mud-drawer-close-mini-xl-left.mud-drawer-left-clipped-never.mud-drawer-close-mini-xl-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-left) - var(--mud-drawer-width-mini-right))}@media(max-width: 1920px){.mud-drawer-close-mini-xl-left.mud-drawer-left-clipped-docked .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);width:calc(100% - var(--mud-drawer-width-mini-left))}.mud-drawer-close-mini-xl-right.mud-drawer-right-clipped-docked .mud-appbar{margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-right))}.mud-drawer-close-mini-xl-left.mud-drawer-left-clipped-docked.mud-drawer-close-mini-xl-right.mud-drawer-right-clipped-docked .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-left) - var(--mud-drawer-width-mini-right))}}.mud-drawer-close-mini-xxl-left.mud-drawer-left-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);width:calc(100% - var(--mud-drawer-width-mini-left))}.mud-drawer-close-mini-xxl-right.mud-drawer-right-clipped-never .mud-appbar{margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-right))}.mud-drawer-close-mini-xxl-left.mud-drawer-left-clipped-never.mud-drawer-close-mini-xxl-right.mud-drawer-right-clipped-never .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-left) - var(--mud-drawer-width-mini-right))}@media(max-width: 2560px){.mud-drawer-close-mini-xxl-left.mud-drawer-left-clipped-docked .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);width:calc(100% - var(--mud-drawer-width-mini-left))}.mud-drawer-close-mini-xxl-right.mud-drawer-right-clipped-docked .mud-appbar{margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-right))}.mud-drawer-close-mini-xxl-left.mud-drawer-left-clipped-docked.mud-drawer-close-mini-xxl-right.mud-drawer-right-clipped-docked .mud-appbar{margin-left:var(--mud-drawer-width-mini-left);margin-right:var(--mud-drawer-width-mini-right);width:calc(100% - var(--mud-drawer-width-mini-left) - var(--mud-drawer-width-mini-right))}}.mud-drawer{display:flex;flex:0 0 auto;outline:0;position:fixed;z-index:var(--mud-zindex-drawer);overflow-y:auto;flex-direction:column;color:var(--mud-palette-drawer-text);background-color:var(--mud-palette-drawer-background);--mud-drawer-content-height: 0}.mud-drawer .mud-drawer-content{height:100%;max-height:100%;display:flex;flex:0 0 auto;flex-direction:column}.mud-drawer:not(.mud-drawer-fixed){position:absolute}@media(max-width: -1px){.mud-drawer.mud-drawer-mini.mud-drawer-xs:not(.mud-drawer--closed),.mud-drawer.mud-drawer-responsive.mud-drawer-xs{z-index:calc(var(--mud-zindex-appbar) + 2)}.mud-drawer.mud-drawer-mini.mud-drawer-xs:not(.mud-drawer--closed).mud-drawer--initial:not(.mud-drawer-mini),.mud-drawer.mud-drawer-responsive.mud-drawer-xs.mud-drawer--initial:not(.mud-drawer-mini){display:none !important}}@media(max-width: 599px){.mud-drawer.mud-drawer-mini.mud-drawer-sm:not(.mud-drawer--closed),.mud-drawer.mud-drawer-responsive.mud-drawer-sm{z-index:calc(var(--mud-zindex-appbar) + 2)}.mud-drawer.mud-drawer-mini.mud-drawer-sm:not(.mud-drawer--closed).mud-drawer--initial:not(.mud-drawer-mini),.mud-drawer.mud-drawer-responsive.mud-drawer-sm.mud-drawer--initial:not(.mud-drawer-mini){display:none !important}}@media(max-width: 959px){.mud-drawer.mud-drawer-mini.mud-drawer-md:not(.mud-drawer--closed),.mud-drawer.mud-drawer-responsive.mud-drawer-md{z-index:calc(var(--mud-zindex-appbar) + 2)}.mud-drawer.mud-drawer-mini.mud-drawer-md:not(.mud-drawer--closed).mud-drawer--initial:not(.mud-drawer-mini),.mud-drawer.mud-drawer-responsive.mud-drawer-md.mud-drawer--initial:not(.mud-drawer-mini){display:none !important}}@media(max-width: 1279px){.mud-drawer.mud-drawer-mini.mud-drawer-lg:not(.mud-drawer--closed),.mud-drawer.mud-drawer-responsive.mud-drawer-lg{z-index:calc(var(--mud-zindex-appbar) + 2)}.mud-drawer.mud-drawer-mini.mud-drawer-lg:not(.mud-drawer--closed).mud-drawer--initial:not(.mud-drawer-mini),.mud-drawer.mud-drawer-responsive.mud-drawer-lg.mud-drawer--initial:not(.mud-drawer-mini){display:none !important}}@media(max-width: 1919px){.mud-drawer.mud-drawer-mini.mud-drawer-xl:not(.mud-drawer--closed),.mud-drawer.mud-drawer-responsive.mud-drawer-xl{z-index:calc(var(--mud-zindex-appbar) + 2)}.mud-drawer.mud-drawer-mini.mud-drawer-xl:not(.mud-drawer--closed).mud-drawer--initial:not(.mud-drawer-mini),.mud-drawer.mud-drawer-responsive.mud-drawer-xl.mud-drawer--initial:not(.mud-drawer-mini){display:none !important}}@media(max-width: 2559px){.mud-drawer.mud-drawer-mini.mud-drawer-xxl:not(.mud-drawer--closed),.mud-drawer.mud-drawer-responsive.mud-drawer-xxl{z-index:calc(var(--mud-zindex-appbar) + 2)}.mud-drawer.mud-drawer-mini.mud-drawer-xxl:not(.mud-drawer--closed).mud-drawer--initial:not(.mud-drawer-mini),.mud-drawer.mud-drawer-responsive.mud-drawer-xxl.mud-drawer--initial:not(.mud-drawer-mini){display:none !important}}.mud-drawer.mud-drawer-responsive,.mud-drawer.mud-drawer-persistent{height:100%}.mud-drawer.mud-drawer-responsive.mud-drawer-pos-left,.mud-drawer.mud-drawer-persistent.mud-drawer-pos-left{right:auto;width:var(--mud-drawer-width, var(--mud-drawer-width-left))}.mud-drawer.mud-drawer-responsive.mud-drawer-pos-left.mud-drawer--open,.mud-drawer.mud-drawer-persistent.mud-drawer-pos-left.mud-drawer--open{left:0}.mud-drawer.mud-drawer-responsive.mud-drawer-pos-left.mud-drawer--open:not(.mud-drawer--initial),.mud-drawer.mud-drawer-persistent.mud-drawer-pos-left.mud-drawer--open:not(.mud-drawer--initial){animation:mud-drawer-slide-in-left 225ms cubic-bezier(0, 0, 0.2, 1)}.mud-drawer.mud-drawer-responsive.mud-drawer-pos-left.mud-drawer--closed,.mud-drawer.mud-drawer-persistent.mud-drawer-pos-left.mud-drawer--closed{box-shadow:none;left:calc(-1*var(--mud-drawer-width, var(--mud-drawer-width-left)))}.mud-drawer.mud-drawer-responsive.mud-drawer-pos-left.mud-drawer--closed:not(.mud-drawer--initial),.mud-drawer.mud-drawer-persistent.mud-drawer-pos-left.mud-drawer--closed:not(.mud-drawer--initial){animation:mud-drawer-slide-out-left 225ms cubic-bezier(0, 0, 0.2, 1)}.mud-drawer.mud-drawer-responsive.mud-drawer-pos-right,.mud-drawer.mud-drawer-persistent.mud-drawer-pos-right{left:auto;width:var(--mud-drawer-width, var(--mud-drawer-width-right))}.mud-drawer.mud-drawer-responsive.mud-drawer-pos-right.mud-drawer--open,.mud-drawer.mud-drawer-persistent.mud-drawer-pos-right.mud-drawer--open{right:0}.mud-drawer.mud-drawer-responsive.mud-drawer-pos-right.mud-drawer--open:not(.mud-drawer--initial),.mud-drawer.mud-drawer-persistent.mud-drawer-pos-right.mud-drawer--open:not(.mud-drawer--initial){animation:mud-drawer-slide-in-right 225ms cubic-bezier(0, 0, 0.2, 1)}.mud-drawer.mud-drawer-responsive.mud-drawer-pos-right.mud-drawer--closed,.mud-drawer.mud-drawer-persistent.mud-drawer-pos-right.mud-drawer--closed{box-shadow:none;right:calc(-1*var(--mud-drawer-width, var(--mud-drawer-width-right)))}.mud-drawer.mud-drawer-responsive.mud-drawer-pos-right.mud-drawer--closed:not(.mud-drawer--initial),.mud-drawer.mud-drawer-persistent.mud-drawer-pos-right.mud-drawer--closed:not(.mud-drawer--initial){animation:mud-drawer-slide-out-right 225ms cubic-bezier(0, 0, 0.2, 1)}.mud-drawer.mud-drawer-mini{height:100%;transition:width 225ms cubic-bezier(0, 0, 0.2, 1)}.mud-drawer.mud-drawer-mini.mud-drawer-pos-left{left:0;right:auto}.mud-drawer.mud-drawer-mini.mud-drawer-pos-left.mud-drawer--closed{width:var(--mud-drawer-width-mini-left)}.mud-drawer.mud-drawer-mini.mud-drawer-pos-left.mud-drawer--open{width:var(--mud-drawer-width-left)}.mud-drawer.mud-drawer-mini.mud-drawer-pos-right{left:auto;right:0}.mud-drawer.mud-drawer-mini.mud-drawer-pos-right.mud-drawer--closed{width:var(--mud-drawer-width-mini-right)}.mud-drawer.mud-drawer-mini.mud-drawer-pos-right.mud-drawer--open{width:var(--mud-drawer-width-right)}.mud-drawer.mud-drawer-temporary{margin:0 !important;z-index:calc(var(--mud-zindex-appbar) + 2);transition:transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-left{right:auto;top:0;height:100%;width:var(--mud-drawer-width, var(--mud-drawer-width-left))}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-left.mud-drawer--open{left:0}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-left.mud-drawer--open:not(.mud-drawer--initial){animation:mud-drawer-slide-in-left 225ms cubic-bezier(0, 0, 0.2, 1) forwards}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-left.mud-drawer--closed{left:calc(-1*var(--mud-drawer-width, var(--mud-drawer-width-left)))}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-left.mud-drawer--closed:not(.mud-drawer--initial){animation:mud-drawer-slide-out-left 225ms cubic-bezier(0, 0, 0.2, 1) forwards}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-right{left:auto;top:0;height:100%;width:var(--mud-drawer-width, var(--mud-drawer-width-right))}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-right.mud-drawer--open{right:0}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-right.mud-drawer--open:not(.mud-drawer--initial){animation:mud-drawer-slide-in-right 225ms cubic-bezier(0, 0, 0.2, 1) forwards}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-right.mud-drawer--closed{right:calc(-1*var(--mud-drawer-width, var(--mud-drawer-width-right)))}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-right.mud-drawer--closed:not(.mud-drawer--initial){animation:mud-drawer-slide-out-right 225ms cubic-bezier(0, 0, 0.2, 1) forwards}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-bottom{left:0;top:auto;width:100%}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-bottom.mud-drawer--open{bottom:0}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-bottom.mud-drawer--open:not(.mud-drawer--initial){animation:mud-drawer-slide-in-bottom 225ms cubic-bezier(0, 0, 0.2, 1) 0ms 1}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-bottom.mud-drawer--closed{bottom:calc(-1*var(--mud-drawer-content-height))}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-bottom.mud-drawer--closed:not(.mud-drawer--initial){animation:mud-drawer-slide-out-bottom 225ms cubic-bezier(0, 0, 0.2, 1) 0ms 1}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-top{left:0;bottom:auto;width:100%}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-top.mud-drawer--open{top:0}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-top.mud-drawer--open:not(.mud-drawer--initial){animation:mud-drawer-slide-in-top 225ms cubic-bezier(0, 0, 0.2, 1) 0ms 1}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-top.mud-drawer--closed{top:calc(-1*var(--mud-drawer-content-height))}.mud-drawer.mud-drawer-temporary.mud-drawer-pos-top.mud-drawer--closed:not(.mud-drawer--initial){animation:mud-drawer-slide-out-top 225ms cubic-bezier(0, 0, 0.2, 1) 0ms 1}.mud-drawer.mud-drawer-mini.mud-drawer-pos-left~div:not(.mud-main-content),.mud-drawer.mud-drawer-mini.mud-drawer-pos-right~div:not(.mud-main-content),.mud-drawer.mud-drawer-persistent.mud-drawer-pos-left~div:not(.mud-main-content),.mud-drawer.mud-drawer-persistent.mud-drawer-pos-right~div:not(.mud-main-content){transition:margin 225ms cubic-bezier(0, 0, 0.2, 1) 0ms}.mud-drawer.mud-drawer-mini.mud-drawer-pos-left.mud-drawer--open~div:not(.mud-main-content),.mud-drawer.mud-drawer-persistent.mud-drawer-pos-left.mud-drawer--open~div:not(.mud-main-content){margin-left:var(--mud-drawer-width, var(--mud-drawer-width-left))}.mud-drawer.mud-drawer-mini.mud-drawer-pos-right.mud-drawer--open~div:not(.mud-main-content),.mud-drawer.mud-drawer-persistent.mud-drawer-pos-right.mud-drawer--open~div:not(.mud-main-content){margin-right:var(--mud-drawer-width, var(--mud-drawer-width-right))}.mud-drawer.mud-drawer-mini.mud-drawer-pos-left.mud-drawer--closed~div:not(.mud-main-content){margin-left:var(--mud-drawer-width, var(--mud-drawer-width-mini-left))}.mud-drawer.mud-drawer-mini.mud-drawer-pos-right.mud-drawer--closed~div:not(.mud-main-content){margin-right:var(--mud-drawer-width, var(--mud-drawer-width-mini-right))}.mud-drawer-header{display:flex;min-height:var(--mud-appbar-height);padding:12px 24px 12px 24px}.mud-drawer-header.mud-drawer-header-dense{min-height:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/4);padding:8px 24px 8px 24px}.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-always,.mud-drawer-fixed.mud-drawer-persistent:not(.mud-drawer-clipped-never),.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-always,.mud-drawer-fixed.mud-drawer-temporary.mud-drawer-clipped-always{top:var(--mud-appbar-height);height:calc(100% - var(--mud-appbar-height))}@media(max-width: 599px)and (orientation: landscape){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-always,.mud-drawer-fixed.mud-drawer-persistent:not(.mud-drawer-clipped-never),.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-always,.mud-drawer-fixed.mud-drawer-temporary.mud-drawer-clipped-always{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/4);height:calc(100% - (var(--mud-appbar-height) - var(--mud-appbar-height)/4))}}@media(max-width: 599px)and (orientation: portrait){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-always,.mud-drawer-fixed.mud-drawer-persistent:not(.mud-drawer-clipped-never),.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-always,.mud-drawer-fixed.mud-drawer-temporary.mud-drawer-clipped-always{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/8);height:calc(100% - (var(--mud-appbar-height) - var(--mud-appbar-height)/8))}}@media(min-width: 0px){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-xs,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-xs{top:var(--mud-appbar-height);height:calc(100% - var(--mud-appbar-height))}}@media(min-width: 0px)and (max-width: 599px)and (orientation: landscape){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-xs,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-xs{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height) - var(--mud-appbar-height)/4);height:calc(100% - var(--mud-appbar-height) + var(--mud-appbar-height) - var(--mud-appbar-height)/4)}}@media(min-width: 0px)and (max-width: 599px)and (orientation: portrait){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-xs,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-xs{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/8);height:calc(100% - var(--mud-appbar-height)/8)}}@media(min-width: 600px){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-sm,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-sm{top:var(--mud-appbar-height);height:calc(100% - var(--mud-appbar-height))}}@media(min-width: 600px)and (max-width: 599px)and (orientation: landscape){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-sm,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-sm{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height) - var(--mud-appbar-height)/4);height:calc(100% - var(--mud-appbar-height) + var(--mud-appbar-height) - var(--mud-appbar-height)/4)}}@media(min-width: 600px)and (max-width: 599px)and (orientation: portrait){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-sm,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-sm{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/8);height:calc(100% - var(--mud-appbar-height)/8)}}@media(min-width: 960px){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-md,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-md{top:var(--mud-appbar-height);height:calc(100% - var(--mud-appbar-height))}}@media(min-width: 960px)and (max-width: 599px)and (orientation: landscape){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-md,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-md{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height) - var(--mud-appbar-height)/4);height:calc(100% - var(--mud-appbar-height) + var(--mud-appbar-height) - var(--mud-appbar-height)/4)}}@media(min-width: 960px)and (max-width: 599px)and (orientation: portrait){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-md,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-md{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/8);height:calc(100% - var(--mud-appbar-height)/8)}}@media(min-width: 1280px){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-lg,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-lg{top:var(--mud-appbar-height);height:calc(100% - var(--mud-appbar-height))}}@media(min-width: 1280px)and (max-width: 599px)and (orientation: landscape){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-lg,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-lg{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height) - var(--mud-appbar-height)/4);height:calc(100% - var(--mud-appbar-height) + var(--mud-appbar-height) - var(--mud-appbar-height)/4)}}@media(min-width: 1280px)and (max-width: 599px)and (orientation: portrait){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-lg,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-lg{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/8);height:calc(100% - var(--mud-appbar-height)/8)}}@media(min-width: 1920px){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-xl,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-xl{top:var(--mud-appbar-height);height:calc(100% - var(--mud-appbar-height))}}@media(min-width: 1920px)and (max-width: 599px)and (orientation: landscape){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-xl,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-xl{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height) - var(--mud-appbar-height)/4);height:calc(100% - var(--mud-appbar-height) + var(--mud-appbar-height) - var(--mud-appbar-height)/4)}}@media(min-width: 1920px)and (max-width: 599px)and (orientation: portrait){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-xl,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-xl{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/8);height:calc(100% - var(--mud-appbar-height)/8)}}@media(min-width: 2560px){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-xxl,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-xxl{top:var(--mud-appbar-height);height:calc(100% - var(--mud-appbar-height))}}@media(min-width: 2560px)and (max-width: 599px)and (orientation: landscape){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-xxl,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-xxl{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height) - var(--mud-appbar-height)/4);height:calc(100% - var(--mud-appbar-height) + var(--mud-appbar-height) - var(--mud-appbar-height)/4)}}@media(min-width: 2560px)and (max-width: 599px)and (orientation: portrait){.mud-drawer-fixed.mud-drawer-mini.mud-drawer-clipped-docked.mud-drawer-xxl,.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-xxl{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/8);height:calc(100% - var(--mud-appbar-height)/8)}}.mud-appbar-dense~.mud-drawer-fixed.mud-drawer-mini:not(.mud-drawer-clipped-never),.mud-appbar-dense~.mud-drawer-fixed.mud-drawer-persistent:not(.mud-drawer-clipped-never),.mud-appbar-dense~.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-always,.mud-appbar-dense~.mud-drawer-fixed.mud-drawer-temporary.mud-drawer-clipped-always{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/4);height:calc(100% - var(--mud-appbar-height) + var(--mud-appbar-height)/4)}@media(min-width: 0px){.mud-appbar-dense~.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-xs{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/4);height:calc(100% - var(--mud-appbar-height) + var(--mud-appbar-height)/4)}}@media(min-width: 600px){.mud-appbar-dense~.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-sm{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/4);height:calc(100% - var(--mud-appbar-height) + var(--mud-appbar-height)/4)}}@media(min-width: 960px){.mud-appbar-dense~.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-md{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/4);height:calc(100% - var(--mud-appbar-height) + var(--mud-appbar-height)/4)}}@media(min-width: 1280px){.mud-appbar-dense~.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-lg{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/4);height:calc(100% - var(--mud-appbar-height) + var(--mud-appbar-height)/4)}}@media(min-width: 1920px){.mud-appbar-dense~.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-xl{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/4);height:calc(100% - var(--mud-appbar-height) + var(--mud-appbar-height)/4)}}@media(min-width: 2560px){.mud-appbar-dense~.mud-drawer-fixed.mud-drawer-responsive.mud-drawer-clipped-docked.mud-drawer-xxl{top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/4);height:calc(100% - var(--mud-appbar-height) + var(--mud-appbar-height)/4)}}.mud-drawer-overlay{display:none}@media(max-width: -1px){.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-responsive.mud-drawer-overlay-xs{display:block}.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-responsive.mud-drawer-overlay-xs.mud-drawer--initial{display:none}}@media(max-width: -1px){.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-mini.mud-drawer-overlay-xs{display:block}}@media(max-width: 599px){.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-responsive.mud-drawer-overlay-sm{display:block}.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-responsive.mud-drawer-overlay-sm.mud-drawer--initial{display:none}}@media(max-width: 599px){.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-mini.mud-drawer-overlay-sm{display:block}}@media(max-width: 959px){.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-responsive.mud-drawer-overlay-md{display:block}.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-responsive.mud-drawer-overlay-md.mud-drawer--initial{display:none}}@media(max-width: 959px){.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-mini.mud-drawer-overlay-md{display:block}}@media(max-width: 1279px){.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-responsive.mud-drawer-overlay-lg{display:block}.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-responsive.mud-drawer-overlay-lg.mud-drawer--initial{display:none}}@media(max-width: 1279px){.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-mini.mud-drawer-overlay-lg{display:block}}@media(max-width: 1919px){.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-responsive.mud-drawer-overlay-xl{display:block}.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-responsive.mud-drawer-overlay-xl.mud-drawer--initial{display:none}}@media(max-width: 1919px){.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-mini.mud-drawer-overlay-xl{display:block}}@media(max-width: 2559px){.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-responsive.mud-drawer-overlay-xxl{display:block}.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-responsive.mud-drawer-overlay-xxl.mud-drawer--initial{display:none}}@media(max-width: 2559px){.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-mini.mud-drawer-overlay-xxl{display:block}}.mud-drawer-overlay.mud-drawer-overlay--open.mud-drawer-overlay-temporary{display:block}@keyframes mud-drawer-slide-in-left{from{left:calc(-1*var(--mud-drawer-width, var(--mud-drawer-width-left)))}}@keyframes mud-drawer-slide-out-left{from{left:0}}@keyframes mud-drawer-slide-in-right{from{right:calc(-1*var(--mud-drawer-width, var(--mud-drawer-width-right)))}}@keyframes mud-drawer-slide-out-right{from{right:0}}@keyframes mud-drawer-slide-in-bottom{from{bottom:calc(-1*var(--mud-drawer-content-height))}}@keyframes mud-drawer-slide-out-bottom{from{bottom:0}}@keyframes mud-drawer-slide-in-top{from{top:calc(-1*var(--mud-drawer-content-height))}}@keyframes mud-drawer-slide-out-top{from{top:0}}.mud-main-content{margin:0;flex:1 1 auto;padding-top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/8);transition:margin 225ms cubic-bezier(0, 0, 0.2, 1) 0ms}@media(min-width: 0px)and (orientation: landscape){.mud-main-content{padding-top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/4)}}@media(min-width: 600px){.mud-main-content{padding-top:var(--mud-appbar-height)}}.mud-appbar-dense~.mud-main-content{padding-top:calc(var(--mud-appbar-height) - var(--mud-appbar-height)/4)}@media(min-width: 0px){.mud-drawer-open-responsive-xs-left .mud-main-content{margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-responsive-xs-right .mud-main-content{margin-right:var(--mud-drawer-width-right)}.mud-drawer-open-responsive-xs-left.mud-drawer-open-responsive-xs-right .mud-main-content{margin-right:var(--mud-drawer-width-right);margin-left:var(--mud-drawer-width-left)}}@media(min-width: 600px){.mud-drawer-open-responsive-sm-left .mud-main-content{margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-responsive-sm-right .mud-main-content{margin-right:var(--mud-drawer-width-right)}.mud-drawer-open-responsive-sm-left.mud-drawer-open-responsive-sm-right .mud-main-content{margin-right:var(--mud-drawer-width-right);margin-left:var(--mud-drawer-width-left)}}@media(min-width: 960px){.mud-drawer-open-responsive-md-left .mud-main-content{margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-responsive-md-right .mud-main-content{margin-right:var(--mud-drawer-width-right)}.mud-drawer-open-responsive-md-left.mud-drawer-open-responsive-md-right .mud-main-content{margin-right:var(--mud-drawer-width-right);margin-left:var(--mud-drawer-width-left)}}@media(min-width: 1280px){.mud-drawer-open-responsive-lg-left .mud-main-content{margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-responsive-lg-right .mud-main-content{margin-right:var(--mud-drawer-width-right)}.mud-drawer-open-responsive-lg-left.mud-drawer-open-responsive-lg-right .mud-main-content{margin-right:var(--mud-drawer-width-right);margin-left:var(--mud-drawer-width-left)}}@media(min-width: 1920px){.mud-drawer-open-responsive-xl-left .mud-main-content{margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-responsive-xl-right .mud-main-content{margin-right:var(--mud-drawer-width-right)}.mud-drawer-open-responsive-xl-left.mud-drawer-open-responsive-xl-right .mud-main-content{margin-right:var(--mud-drawer-width-right);margin-left:var(--mud-drawer-width-left)}}@media(min-width: 2560px){.mud-drawer-open-responsive-xxl-left .mud-main-content{margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-responsive-xxl-right .mud-main-content{margin-right:var(--mud-drawer-width-right)}.mud-drawer-open-responsive-xxl-left.mud-drawer-open-responsive-xxl-right .mud-main-content{margin-right:var(--mud-drawer-width-right);margin-left:var(--mud-drawer-width-left)}}.mud-drawer-open-persistent-left:not(.mud-drawer-open-persistent-right) .mud-main-content{margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-persistent-right:not(.mud-drawer-open-persistent-left) .mud-main-content{margin-right:var(--mud-drawer-width-right)}.mud-drawer-open-persistent-left.mud-drawer-open-persistent-right .mud-main-content{margin-right:var(--mud-drawer-width-right);margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-mini-xs-left .mud-main-content{margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-mini-xs-right .mud-main-content{margin-right:var(--mud-drawer-width-right)}.mud-drawer-open-mini-xs-left.mud-drawer-open-mini-xs-right .mud-main-content{margin-right:var(--mud-drawer-width-right);margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-mini-sm-left .mud-main-content{margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-mini-sm-right .mud-main-content{margin-right:var(--mud-drawer-width-right)}.mud-drawer-open-mini-sm-left.mud-drawer-open-mini-sm-right .mud-main-content{margin-right:var(--mud-drawer-width-right);margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-mini-md-left .mud-main-content{margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-mini-md-right .mud-main-content{margin-right:var(--mud-drawer-width-right)}.mud-drawer-open-mini-md-left.mud-drawer-open-mini-md-right .mud-main-content{margin-right:var(--mud-drawer-width-right);margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-mini-lg-left .mud-main-content{margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-mini-lg-right .mud-main-content{margin-right:var(--mud-drawer-width-right)}.mud-drawer-open-mini-lg-left.mud-drawer-open-mini-lg-right .mud-main-content{margin-right:var(--mud-drawer-width-right);margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-mini-xl-left .mud-main-content{margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-mini-xl-right .mud-main-content{margin-right:var(--mud-drawer-width-right)}.mud-drawer-open-mini-xl-left.mud-drawer-open-mini-xl-right .mud-main-content{margin-right:var(--mud-drawer-width-right);margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-mini-xxl-left .mud-main-content{margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-mini-xxl-right .mud-main-content{margin-right:var(--mud-drawer-width-right)}.mud-drawer-open-mini-xxl-left.mud-drawer-open-mini-xxl-right .mud-main-content{margin-right:var(--mud-drawer-width-right);margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-mini-none-left .mud-main-content,.mud-drawer-open-mini-always-left .mud-main-content{margin-left:var(--mud-drawer-width-left)}.mud-drawer-open-mini-none-right .mud-main-content,.mud-drawer-open-mini-always-right .mud-main-content{margin-right:var(--mud-drawer-width-right)}.mud-drawer-open-mini-none-left.mud-drawer-open-mini-none,.mud-drawer-open-mini-none .mud-drawer-open-mini-always-right .mud-main-content,.mud-drawer-open-mini-always-left.mud-drawer-open-mini-none,.mud-drawer-open-mini-always .mud-drawer-open-mini-always-right .mud-main-content{margin-right:var(--mud-drawer-width-right);margin-left:var(--mud-drawer-width-left)}.mud-drawer-close-mini-xs-left .mud-main-content{margin-left:var(--mud-drawer-width-mini-left)}.mud-drawer-close-mini-xs-right .mud-main-content{margin-right:var(--mud-drawer-width-mini-right)}.mud-drawer-close-mini-xs-left.mud-drawer-close-mini-xs-right .mud-main-content{margin-right:var(--mud-drawer-width-mini-right);margin-left:var(--mud-drawer-width-mini-left)}.mud-drawer-close-mini-sm-left .mud-main-content{margin-left:var(--mud-drawer-width-mini-left)}.mud-drawer-close-mini-sm-right .mud-main-content{margin-right:var(--mud-drawer-width-mini-right)}.mud-drawer-close-mini-sm-left.mud-drawer-close-mini-sm-right .mud-main-content{margin-right:var(--mud-drawer-width-mini-right);margin-left:var(--mud-drawer-width-mini-left)}.mud-drawer-close-mini-md-left .mud-main-content{margin-left:var(--mud-drawer-width-mini-left)}.mud-drawer-close-mini-md-right .mud-main-content{margin-right:var(--mud-drawer-width-mini-right)}.mud-drawer-close-mini-md-left.mud-drawer-close-mini-md-right .mud-main-content{margin-right:var(--mud-drawer-width-mini-right);margin-left:var(--mud-drawer-width-mini-left)}.mud-drawer-close-mini-lg-left .mud-main-content{margin-left:var(--mud-drawer-width-mini-left)}.mud-drawer-close-mini-lg-right .mud-main-content{margin-right:var(--mud-drawer-width-mini-right)}.mud-drawer-close-mini-lg-left.mud-drawer-close-mini-lg-right .mud-main-content{margin-right:var(--mud-drawer-width-mini-right);margin-left:var(--mud-drawer-width-mini-left)}.mud-drawer-close-mini-xl-left .mud-main-content{margin-left:var(--mud-drawer-width-mini-left)}.mud-drawer-close-mini-xl-right .mud-main-content{margin-right:var(--mud-drawer-width-mini-right)}.mud-drawer-close-mini-xl-left.mud-drawer-close-mini-xl-right .mud-main-content{margin-right:var(--mud-drawer-width-mini-right);margin-left:var(--mud-drawer-width-mini-left)}.mud-drawer-close-mini-xxl-left .mud-main-content{margin-left:var(--mud-drawer-width-mini-left)}.mud-drawer-close-mini-xxl-right .mud-main-content{margin-right:var(--mud-drawer-width-mini-right)}.mud-drawer-close-mini-xxl-left.mud-drawer-close-mini-xxl-right .mud-main-content{margin-right:var(--mud-drawer-width-mini-right);margin-left:var(--mud-drawer-width-mini-left)}.mud-drawer-close-mini-none-left .mud-main-content,.mud-drawer-close-mini-always-left .mud-main-content{margin-left:var(--mud-drawer-width-mini-left)}.mud-drawer-close-mini-none-right .mud-main-content,.mud-drawer-close-mini-always-right .mud-main-content{margin-right:var(--mud-drawer-width-mini-right)}.mud-drawer-close-mini-none-left.mud-drawer-close-mini-none,.mud-drawer-close-mini-none .mud-drawer-close-mini-always-right .mud-main-content,.mud-drawer-close-mini-always-left.mud-drawer-close-mini-none,.mud-drawer-close-mini-always .mud-drawer-close-mini-always-right .mud-main-content{margin-right:var(--mud-drawer-width-mini-right);margin-left:var(--mud-drawer-width-mini-left)}.mud-container{width:100%;display:block;box-sizing:border-box;margin-left:auto;margin-right:auto}.mud-container--gutters{padding-left:16px;padding-right:16px}@media(min-width: 600px){.mud-container--gutters{padding-left:24px;padding-right:24px}}@media(min-width: 600px){.mud-container-fixed{max-width:600px}}@media(min-width: 960px){.mud-container-fixed{max-width:960px}}@media(min-width: 1280px){.mud-container-fixed{max-width:1280px}}@media(min-width: 1920px){.mud-container-fixed{max-width:1920px}}@media(min-width: 2560px){.mud-container-fixed{max-width:2560px}}@media(min-width: 0px){.mud-container-maxwidth-xs{max-width:444px}}@media(min-width: 600px){.mud-container-maxwidth-sm{max-width:600px}}@media(min-width: 960px){.mud-container-maxwidth-md{max-width:960px}}@media(min-width: 1280px){.mud-container-maxwidth-lg{max-width:1280px}}@media(min-width: 1920px){.mud-container-maxwidth-xl{max-width:1920px}}@media(min-width: 2560px){.mud-container-maxwidth-xxl{max-width:2560px}}.scroll-locked{padding-right:8px;overflow:hidden}.scroll-locked .mud-layout .mud-appbar{padding-right:8px}.scroll-locked .mud-layout .mud-main-content .mud-scroll-to-top{padding-right:8px}.scroll-locked-no-padding{overflow:hidden}@-moz-document url-prefix(){.scroll-locked{padding-right:17px}.scroll-locked .mud-layout .mud-appbar{padding-right:17px}.scroll-locked .mud-layout .mud-main-content .mud-scroll-to-top{padding-right:17px}}.mud-scroll-to-top{position:fixed;cursor:pointer;z-index:100}.mud-scroll-to-top.visible{bottom:16px;right:16px;opacity:1;transition:transform .5s;flex:1}.mud-scroll-to-top.hidden{bottom:16px;right:16px;opacity:0;transition:all .5s;visibility:hidden;transform:scale(0) rotate(180deg);flex:0}.mud-scroll-to-top:after{content:"";background:rgba(0,0,0,0);top:0;bottom:0;left:0;right:0;position:absolute;z-index:var(--mud-zindex-tooltip)}.red{background-color:#f44336}.red-text{color:#f44336}.red.lighten-5{background-color:#ffebee}.red-text.text-lighten-5{color:#ffebee}.red.lighten-4{background-color:#ffcdd2}.red-text.text-lighten-4{color:#ffcdd2}.red.lighten-3{background-color:#ef9a9a}.red-text.text-lighten-3{color:#ef9a9a}.red.lighten-2{background-color:#e57373}.red-text.text-lighten-2{color:#e57373}.red.lighten-1{background-color:#ef5350}.red-text.text-lighten-1{color:#ef5350}.red.darken-1{background-color:#e53935}.red-text.text-darken-1{color:#e53935}.red.darken-2{background-color:#d32f2f}.red-text.text-darken-2{color:#d32f2f}.red.darken-3{background-color:#c62828}.red-text.text-darken-3{color:#c62828}.red.darken-4{background-color:#b71c1c}.red-text.text-darken-4{color:#b71c1c}.red.accent-1{background-color:#ff8a80}.red-text.text-accent-1{color:#ff8a80}.red.accent-2{background-color:#ff5252}.red-text.text-accent-2{color:#ff5252}.red.accent-3{background-color:#ff1744}.red-text.text-accent-3{color:#ff1744}.red.accent-4{background-color:#d50000}.red-text.text-accent-4{color:#d50000}.pink{background-color:#e91e63}.pink-text{color:#e91e63}.pink.lighten-5{background-color:#fce4ec}.pink-text.text-lighten-5{color:#fce4ec}.pink.lighten-4{background-color:#f8bbd0}.pink-text.text-lighten-4{color:#f8bbd0}.pink.lighten-3{background-color:#f48fb1}.pink-text.text-lighten-3{color:#f48fb1}.pink.lighten-2{background-color:#f06292}.pink-text.text-lighten-2{color:#f06292}.pink.lighten-1{background-color:#ec407a}.pink-text.text-lighten-1{color:#ec407a}.pink.darken-1{background-color:#d81b60}.pink-text.text-darken-1{color:#d81b60}.pink.darken-2{background-color:#c2185b}.pink-text.text-darken-2{color:#c2185b}.pink.darken-3{background-color:#ad1457}.pink-text.text-darken-3{color:#ad1457}.pink.darken-4{background-color:#880e4f}.pink-text.text-darken-4{color:#880e4f}.pink.accent-1{background-color:#ff80ab}.pink-text.text-accent-1{color:#ff80ab}.pink.accent-2{background-color:#ff4081}.pink-text.text-accent-2{color:#ff4081}.pink.accent-3{background-color:#f50057}.pink-text.text-accent-3{color:#f50057}.pink.accent-4{background-color:#c51162}.pink-text.text-accent-4{color:#c51162}.purple{background-color:#9c27b0}.purple-text{color:#9c27b0}.purple.lighten-5{background-color:#f3e5f5}.purple-text.text-lighten-5{color:#f3e5f5}.purple.lighten-4{background-color:#e1bee7}.purple-text.text-lighten-4{color:#e1bee7}.purple.lighten-3{background-color:#ce93d8}.purple-text.text-lighten-3{color:#ce93d8}.purple.lighten-2{background-color:#ba68c8}.purple-text.text-lighten-2{color:#ba68c8}.purple.lighten-1{background-color:#ab47bc}.purple-text.text-lighten-1{color:#ab47bc}.purple.darken-1{background-color:#8e24aa}.purple-text.text-darken-1{color:#8e24aa}.purple.darken-2{background-color:#7b1fa2}.purple-text.text-darken-2{color:#7b1fa2}.purple.darken-3{background-color:#6a1b9a}.purple-text.text-darken-3{color:#6a1b9a}.purple.darken-4{background-color:#4a148c}.purple-text.text-darken-4{color:#4a148c}.purple.accent-1{background-color:#ea80fc}.purple-text.text-accent-1{color:#ea80fc}.purple.accent-2{background-color:#e040fb}.purple-text.text-accent-2{color:#e040fb}.purple.accent-3{background-color:#d500f9}.purple-text.text-accent-3{color:#d500f9}.purple.accent-4{background-color:#a0f}.purple-text.text-accent-4{color:#a0f}.deep-purple{background-color:#673ab7}.deep-purple-text{color:#673ab7}.deep-purple.lighten-5{background-color:#ede7f6}.deep-purple-text.text-lighten-5{color:#ede7f6}.deep-purple.lighten-4{background-color:#d1c4e9}.deep-purple-text.text-lighten-4{color:#d1c4e9}.deep-purple.lighten-3{background-color:#b39ddb}.deep-purple-text.text-lighten-3{color:#b39ddb}.deep-purple.lighten-2{background-color:#9575cd}.deep-purple-text.text-lighten-2{color:#9575cd}.deep-purple.lighten-1{background-color:#7e57c2}.deep-purple-text.text-lighten-1{color:#7e57c2}.deep-purple.darken-1{background-color:#5e35b1}.deep-purple-text.text-darken-1{color:#5e35b1}.deep-purple.darken-2{background-color:#512da8}.deep-purple-text.text-darken-2{color:#512da8}.deep-purple.darken-3{background-color:#4527a0}.deep-purple-text.text-darken-3{color:#4527a0}.deep-purple.darken-4{background-color:#311b92}.deep-purple-text.text-darken-4{color:#311b92}.deep-purple.accent-1{background-color:#b388ff}.deep-purple-text.text-accent-1{color:#b388ff}.deep-purple.accent-2{background-color:#7c4dff}.deep-purple-text.text-accent-2{color:#7c4dff}.deep-purple.accent-3{background-color:#651fff}.deep-purple-text.text-accent-3{color:#651fff}.deep-purple.accent-4{background-color:#6200ea}.deep-purple-text.text-accent-4{color:#6200ea}.indigo{background-color:#3f51b5}.indigo-text{color:#3f51b5}.indigo.lighten-5{background-color:#e8eaf6}.indigo-text.text-lighten-5{color:#e8eaf6}.indigo.lighten-4{background-color:#c5cae9}.indigo-text.text-lighten-4{color:#c5cae9}.indigo.lighten-3{background-color:#9fa8da}.indigo-text.text-lighten-3{color:#9fa8da}.indigo.lighten-2{background-color:#7986cb}.indigo-text.text-lighten-2{color:#7986cb}.indigo.lighten-1{background-color:#5c6bc0}.indigo-text.text-lighten-1{color:#5c6bc0}.indigo.darken-1{background-color:#3949ab}.indigo-text.text-darken-1{color:#3949ab}.indigo.darken-2{background-color:#303f9f}.indigo-text.text-darken-2{color:#303f9f}.indigo.darken-3{background-color:#283593}.indigo-text.text-darken-3{color:#283593}.indigo.darken-4{background-color:#1a237e}.indigo-text.text-darken-4{color:#1a237e}.indigo.accent-1{background-color:#8c9eff}.indigo-text.text-accent-1{color:#8c9eff}.indigo.accent-2{background-color:#536dfe}.indigo-text.text-accent-2{color:#536dfe}.indigo.accent-3{background-color:#3d5afe}.indigo-text.text-accent-3{color:#3d5afe}.indigo.accent-4{background-color:#304ffe}.indigo-text.text-accent-4{color:#304ffe}.blue{background-color:#2196f3}.blue-text{color:#2196f3}.blue.lighten-5{background-color:#e3f2fd}.blue-text.text-lighten-5{color:#e3f2fd}.blue.lighten-4{background-color:#bbdefb}.blue-text.text-lighten-4{color:#bbdefb}.blue.lighten-3{background-color:#90caf9}.blue-text.text-lighten-3{color:#90caf9}.blue.lighten-2{background-color:#64b5f6}.blue-text.text-lighten-2{color:#64b5f6}.blue.lighten-1{background-color:#42a5f5}.blue-text.text-lighten-1{color:#42a5f5}.blue.darken-1{background-color:#1e88e5}.blue-text.text-darken-1{color:#1e88e5}.blue.darken-2{background-color:#1976d2}.blue-text.text-darken-2{color:#1976d2}.blue.darken-3{background-color:#1565c0}.blue-text.text-darken-3{color:#1565c0}.blue.darken-4{background-color:#0d47a1}.blue-text.text-darken-4{color:#0d47a1}.blue.accent-1{background-color:#82b1ff}.blue-text.text-accent-1{color:#82b1ff}.blue.accent-2{background-color:#448aff}.blue-text.text-accent-2{color:#448aff}.blue.accent-3{background-color:#2979ff}.blue-text.text-accent-3{color:#2979ff}.blue.accent-4{background-color:#2962ff}.blue-text.text-accent-4{color:#2962ff}.light-blue{background-color:#03a9f4}.light-blue-text{color:#03a9f4}.light-blue.lighten-5{background-color:#e1f5fe}.light-blue-text.text-lighten-5{color:#e1f5fe}.light-blue.lighten-4{background-color:#b3e5fc}.light-blue-text.text-lighten-4{color:#b3e5fc}.light-blue.lighten-3{background-color:#81d4fa}.light-blue-text.text-lighten-3{color:#81d4fa}.light-blue.lighten-2{background-color:#4fc3f7}.light-blue-text.text-lighten-2{color:#4fc3f7}.light-blue.lighten-1{background-color:#29b6f6}.light-blue-text.text-lighten-1{color:#29b6f6}.light-blue.darken-1{background-color:#039be5}.light-blue-text.text-darken-1{color:#039be5}.light-blue.darken-2{background-color:#0288d1}.light-blue-text.text-darken-2{color:#0288d1}.light-blue.darken-3{background-color:#0277bd}.light-blue-text.text-darken-3{color:#0277bd}.light-blue.darken-4{background-color:#01579b}.light-blue-text.text-darken-4{color:#01579b}.light-blue.accent-1{background-color:#80d8ff}.light-blue-text.text-accent-1{color:#80d8ff}.light-blue.accent-2{background-color:#40c4ff}.light-blue-text.text-accent-2{color:#40c4ff}.light-blue.accent-3{background-color:#00b0ff}.light-blue-text.text-accent-3{color:#00b0ff}.light-blue.accent-4{background-color:#0091ea}.light-blue-text.text-accent-4{color:#0091ea}.cyan{background-color:#00bcd4}.cyan-text{color:#00bcd4}.cyan.lighten-5{background-color:#e0f7fa}.cyan-text.text-lighten-5{color:#e0f7fa}.cyan.lighten-4{background-color:#b2ebf2}.cyan-text.text-lighten-4{color:#b2ebf2}.cyan.lighten-3{background-color:#80deea}.cyan-text.text-lighten-3{color:#80deea}.cyan.lighten-2{background-color:#4dd0e1}.cyan-text.text-lighten-2{color:#4dd0e1}.cyan.lighten-1{background-color:#26c6da}.cyan-text.text-lighten-1{color:#26c6da}.cyan.darken-1{background-color:#00acc1}.cyan-text.text-darken-1{color:#00acc1}.cyan.darken-2{background-color:#0097a7}.cyan-text.text-darken-2{color:#0097a7}.cyan.darken-3{background-color:#00838f}.cyan-text.text-darken-3{color:#00838f}.cyan.darken-4{background-color:#006064}.cyan-text.text-darken-4{color:#006064}.cyan.accent-1{background-color:#84ffff}.cyan-text.text-accent-1{color:#84ffff}.cyan.accent-2{background-color:#18ffff}.cyan-text.text-accent-2{color:#18ffff}.cyan.accent-3{background-color:#00e5ff}.cyan-text.text-accent-3{color:#00e5ff}.cyan.accent-4{background-color:#00b8d4}.cyan-text.text-accent-4{color:#00b8d4}.teal{background-color:#009688}.teal-text{color:#009688}.teal.lighten-5{background-color:#e0f2f1}.teal-text.text-lighten-5{color:#e0f2f1}.teal.lighten-4{background-color:#b2dfdb}.teal-text.text-lighten-4{color:#b2dfdb}.teal.lighten-3{background-color:#80cbc4}.teal-text.text-lighten-3{color:#80cbc4}.teal.lighten-2{background-color:#4db6ac}.teal-text.text-lighten-2{color:#4db6ac}.teal.lighten-1{background-color:#26a69a}.teal-text.text-lighten-1{color:#26a69a}.teal.darken-1{background-color:#00897b}.teal-text.text-darken-1{color:#00897b}.teal.darken-2{background-color:#00796b}.teal-text.text-darken-2{color:#00796b}.teal.darken-3{background-color:#00695c}.teal-text.text-darken-3{color:#00695c}.teal.darken-4{background-color:#004d40}.teal-text.text-darken-4{color:#004d40}.teal.accent-1{background-color:#a7ffeb}.teal-text.text-accent-1{color:#a7ffeb}.teal.accent-2{background-color:#64ffda}.teal-text.text-accent-2{color:#64ffda}.teal.accent-3{background-color:#1de9b6}.teal-text.text-accent-3{color:#1de9b6}.teal.accent-4{background-color:#00bfa5}.teal-text.text-accent-4{color:#00bfa5}.green{background-color:#4caf50}.green-text{color:#4caf50}.green.lighten-5{background-color:#e8f5e9}.green-text.text-lighten-5{color:#e8f5e9}.green.lighten-4{background-color:#c8e6c9}.green-text.text-lighten-4{color:#c8e6c9}.green.lighten-3{background-color:#a5d6a7}.green-text.text-lighten-3{color:#a5d6a7}.green.lighten-2{background-color:#81c784}.green-text.text-lighten-2{color:#81c784}.green.lighten-1{background-color:#66bb6a}.green-text.text-lighten-1{color:#66bb6a}.green.darken-1{background-color:#43a047}.green-text.text-darken-1{color:#43a047}.green.darken-2{background-color:#388e3c}.green-text.text-darken-2{color:#388e3c}.green.darken-3{background-color:#2e7d32}.green-text.text-darken-3{color:#2e7d32}.green.darken-4{background-color:#1b5e20}.green-text.text-darken-4{color:#1b5e20}.green.accent-1{background-color:#b9f6ca}.green-text.text-accent-1{color:#b9f6ca}.green.accent-2{background-color:#69f0ae}.green-text.text-accent-2{color:#69f0ae}.green.accent-3{background-color:#00e676}.green-text.text-accent-3{color:#00e676}.green.accent-4{background-color:#00c853}.green-text.text-accent-4{color:#00c853}.light-green{background-color:#8bc34a}.light-green-text{color:#8bc34a}.light-green.lighten-5{background-color:#f1f8e9}.light-green-text.text-lighten-5{color:#f1f8e9}.light-green.lighten-4{background-color:#dcedc8}.light-green-text.text-lighten-4{color:#dcedc8}.light-green.lighten-3{background-color:#c5e1a5}.light-green-text.text-lighten-3{color:#c5e1a5}.light-green.lighten-2{background-color:#aed581}.light-green-text.text-lighten-2{color:#aed581}.light-green.lighten-1{background-color:#9ccc65}.light-green-text.text-lighten-1{color:#9ccc65}.light-green.darken-1{background-color:#7cb342}.light-green-text.text-darken-1{color:#7cb342}.light-green.darken-2{background-color:#689f38}.light-green-text.text-darken-2{color:#689f38}.light-green.darken-3{background-color:#558b2f}.light-green-text.text-darken-3{color:#558b2f}.light-green.darken-4{background-color:#33691e}.light-green-text.text-darken-4{color:#33691e}.light-green.accent-1{background-color:#ccff90}.light-green-text.text-accent-1{color:#ccff90}.light-green.accent-2{background-color:#b2ff59}.light-green-text.text-accent-2{color:#b2ff59}.light-green.accent-3{background-color:#76ff03}.light-green-text.text-accent-3{color:#76ff03}.light-green.accent-4{background-color:#64dd17}.light-green-text.text-accent-4{color:#64dd17}.lime{background-color:#cddc39}.lime-text{color:#cddc39}.lime.lighten-5{background-color:#f9fbe7}.lime-text.text-lighten-5{color:#f9fbe7}.lime.lighten-4{background-color:#f0f4c3}.lime-text.text-lighten-4{color:#f0f4c3}.lime.lighten-3{background-color:#e6ee9c}.lime-text.text-lighten-3{color:#e6ee9c}.lime.lighten-2{background-color:#dce775}.lime-text.text-lighten-2{color:#dce775}.lime.lighten-1{background-color:#d4e157}.lime-text.text-lighten-1{color:#d4e157}.lime.darken-1{background-color:#c0ca33}.lime-text.text-darken-1{color:#c0ca33}.lime.darken-2{background-color:#afb42b}.lime-text.text-darken-2{color:#afb42b}.lime.darken-3{background-color:#9e9d24}.lime-text.text-darken-3{color:#9e9d24}.lime.darken-4{background-color:#827717}.lime-text.text-darken-4{color:#827717}.lime.accent-1{background-color:#f4ff81}.lime-text.text-accent-1{color:#f4ff81}.lime.accent-2{background-color:#eeff41}.lime-text.text-accent-2{color:#eeff41}.lime.accent-3{background-color:#c6ff00}.lime-text.text-accent-3{color:#c6ff00}.lime.accent-4{background-color:#aeea00}.lime-text.text-accent-4{color:#aeea00}.yellow{background-color:#ffeb3b}.yellow-text{color:#ffeb3b}.yellow.lighten-5{background-color:#fffde7}.yellow-text.text-lighten-5{color:#fffde7}.yellow.lighten-4{background-color:#fff9c4}.yellow-text.text-lighten-4{color:#fff9c4}.yellow.lighten-3{background-color:#fff59d}.yellow-text.text-lighten-3{color:#fff59d}.yellow.lighten-2{background-color:#fff176}.yellow-text.text-lighten-2{color:#fff176}.yellow.lighten-1{background-color:#ffee58}.yellow-text.text-lighten-1{color:#ffee58}.yellow.darken-1{background-color:#fdd835}.yellow-text.text-darken-1{color:#fdd835}.yellow.darken-2{background-color:#fbc02d}.yellow-text.text-darken-2{color:#fbc02d}.yellow.darken-3{background-color:#f9a825}.yellow-text.text-darken-3{color:#f9a825}.yellow.darken-4{background-color:#f57f17}.yellow-text.text-darken-4{color:#f57f17}.yellow.accent-1{background-color:#ffff8d}.yellow-text.text-accent-1{color:#ffff8d}.yellow.accent-2{background-color:#ff0}.yellow-text.text-accent-2{color:#ff0}.yellow.accent-3{background-color:#ffea00}.yellow-text.text-accent-3{color:#ffea00}.yellow.accent-4{background-color:#ffd600}.yellow-text.text-accent-4{color:#ffd600}.amber{background-color:#ffc107}.amber-text{color:#ffc107}.amber.lighten-5{background-color:#fff8e1}.amber-text.text-lighten-5{color:#fff8e1}.amber.lighten-4{background-color:#ffecb3}.amber-text.text-lighten-4{color:#ffecb3}.amber.lighten-3{background-color:#ffe082}.amber-text.text-lighten-3{color:#ffe082}.amber.lighten-2{background-color:#ffd54f}.amber-text.text-lighten-2{color:#ffd54f}.amber.lighten-1{background-color:#ffca28}.amber-text.text-lighten-1{color:#ffca28}.amber.darken-1{background-color:#ffb300}.amber-text.text-darken-1{color:#ffb300}.amber.darken-2{background-color:#ffa000}.amber-text.text-darken-2{color:#ffa000}.amber.darken-3{background-color:#ff8f00}.amber-text.text-darken-3{color:#ff8f00}.amber.darken-4{background-color:#ff6f00}.amber-text.text-darken-4{color:#ff6f00}.amber.accent-1{background-color:#ffe57f}.amber-text.text-accent-1{color:#ffe57f}.amber.accent-2{background-color:#ffd740}.amber-text.text-accent-2{color:#ffd740}.amber.accent-3{background-color:#ffc400}.amber-text.text-accent-3{color:#ffc400}.amber.accent-4{background-color:#ffab00}.amber-text.text-accent-4{color:#ffab00}.orange{background-color:#ff9800}.orange-text{color:#ff9800}.orange.lighten-5{background-color:#fff3e0}.orange-text.text-lighten-5{color:#fff3e0}.orange.lighten-4{background-color:#ffe0b2}.orange-text.text-lighten-4{color:#ffe0b2}.orange.lighten-3{background-color:#ffcc80}.orange-text.text-lighten-3{color:#ffcc80}.orange.lighten-2{background-color:#ffb74d}.orange-text.text-lighten-2{color:#ffb74d}.orange.lighten-1{background-color:#ffa726}.orange-text.text-lighten-1{color:#ffa726}.orange.darken-1{background-color:#fb8c00}.orange-text.text-darken-1{color:#fb8c00}.orange.darken-2{background-color:#f57c00}.orange-text.text-darken-2{color:#f57c00}.orange.darken-3{background-color:#ef6c00}.orange-text.text-darken-3{color:#ef6c00}.orange.darken-4{background-color:#e65100}.orange-text.text-darken-4{color:#e65100}.orange.accent-1{background-color:#ffd180}.orange-text.text-accent-1{color:#ffd180}.orange.accent-2{background-color:#ffab40}.orange-text.text-accent-2{color:#ffab40}.orange.accent-3{background-color:#ff9100}.orange-text.text-accent-3{color:#ff9100}.orange.accent-4{background-color:#ff6d00}.orange-text.text-accent-4{color:#ff6d00}.deep-orange{background-color:#ff5722}.deep-orange-text{color:#ff5722}.deep-orange.lighten-5{background-color:#fbe9e7}.deep-orange-text.text-lighten-5{color:#fbe9e7}.deep-orange.lighten-4{background-color:#ffccbc}.deep-orange-text.text-lighten-4{color:#ffccbc}.deep-orange.lighten-3{background-color:#ffab91}.deep-orange-text.text-lighten-3{color:#ffab91}.deep-orange.lighten-2{background-color:#ff8a65}.deep-orange-text.text-lighten-2{color:#ff8a65}.deep-orange.lighten-1{background-color:#ff7043}.deep-orange-text.text-lighten-1{color:#ff7043}.deep-orange.darken-1{background-color:#f4511e}.deep-orange-text.text-darken-1{color:#f4511e}.deep-orange.darken-2{background-color:#e64a19}.deep-orange-text.text-darken-2{color:#e64a19}.deep-orange.darken-3{background-color:#d84315}.deep-orange-text.text-darken-3{color:#d84315}.deep-orange.darken-4{background-color:#bf360c}.deep-orange-text.text-darken-4{color:#bf360c}.deep-orange.accent-1{background-color:#ff9e80}.deep-orange-text.text-accent-1{color:#ff9e80}.deep-orange.accent-2{background-color:#ff6e40}.deep-orange-text.text-accent-2{color:#ff6e40}.deep-orange.accent-3{background-color:#ff3d00}.deep-orange-text.text-accent-3{color:#ff3d00}.deep-orange.accent-4{background-color:#dd2c00}.deep-orange-text.text-accent-4{color:#dd2c00}.brown{background-color:#795548}.brown-text{color:#795548}.brown.lighten-5{background-color:#efebe9}.brown-text.text-lighten-5{color:#efebe9}.brown.lighten-4{background-color:#d7ccc8}.brown-text.text-lighten-4{color:#d7ccc8}.brown.lighten-3{background-color:#bcaaa4}.brown-text.text-lighten-3{color:#bcaaa4}.brown.lighten-2{background-color:#a1887f}.brown-text.text-lighten-2{color:#a1887f}.brown.lighten-1{background-color:#8d6e63}.brown-text.text-lighten-1{color:#8d6e63}.brown.darken-1{background-color:#6d4c41}.brown-text.text-darken-1{color:#6d4c41}.brown.darken-2{background-color:#5d4037}.brown-text.text-darken-2{color:#5d4037}.brown.darken-3{background-color:#4e342e}.brown-text.text-darken-3{color:#4e342e}.brown.darken-4{background-color:#3e2723}.brown-text.text-darken-4{color:#3e2723}.blue-gray{background-color:#607d8b}.blue-gray-text{color:#607d8b}.blue-gray.lighten-5{background-color:#eceff1}.blue-gray-text.text-lighten-5{color:#eceff1}.blue-gray.lighten-4{background-color:#cfd8dc}.blue-gray-text.text-lighten-4{color:#cfd8dc}.blue-gray.lighten-3{background-color:#b0bec5}.blue-gray-text.text-lighten-3{color:#b0bec5}.blue-gray.lighten-2{background-color:#90a4ae}.blue-gray-text.text-lighten-2{color:#90a4ae}.blue-gray.lighten-1{background-color:#78909c}.blue-gray-text.text-lighten-1{color:#78909c}.blue-gray.darken-1{background-color:#546e7a}.blue-gray-text.text-darken-1{color:#546e7a}.blue-gray.darken-2{background-color:#455a64}.blue-gray-text.text-darken-2{color:#455a64}.blue-gray.darken-3{background-color:#37474f}.blue-gray-text.text-darken-3{color:#37474f}.blue-gray.darken-4{background-color:#263238}.blue-gray-text.text-darken-4{color:#263238}.gray{background-color:#9e9e9e}.gray-text{color:#9e9e9e}.gray.lighten-5{background-color:#fafafa}.gray-text.text-lighten-5{color:#fafafa}.gray.lighten-4{background-color:#f5f5f5}.gray-text.text-lighten-4{color:#f5f5f5}.gray.lighten-3{background-color:#eee}.gray-text.text-lighten-3{color:#eee}.gray.lighten-2{background-color:#e0e0e0}.gray-text.text-lighten-2{color:#e0e0e0}.gray.lighten-1{background-color:#bdbdbd}.gray-text.text-lighten-1{color:#bdbdbd}.gray.darken-1{background-color:#757575}.gray-text.text-darken-1{color:#757575}.gray.darken-2{background-color:#616161}.gray-text.text-darken-2{color:#616161}.gray.darken-3{background-color:#424242}.gray-text.text-darken-3{color:#424242}.gray.darken-4{background-color:#212121}.gray-text.text-darken-4{color:#212121}.shades.black{background-color:#000}.shades-text.text-black{color:#000}.shades.white{background-color:#fff}.shades-text.text-white{color:#fff}.shades.transparent{background-color:rgba(0,0,0,0)}.shades-text.text-transparent{color:rgba(0,0,0,0)}.mud-ripple{--mud-ripple-offset-x: 0;--mud-ripple-offset-y: 0;position:relative;overflow:hidden}.mud-ripple:after{content:"";display:block;position:absolute;width:100%;height:100%;top:var(--mud-ripple-offset-y);left:var(--mud-ripple-offset-x);pointer-events:none;background-image:radial-gradient(circle, var(--mud-ripple-color) 10%, transparent 10.01%);background-repeat:no-repeat;background-position:50%;transform:scale(20, 20);opacity:0;transition:transform .6s,opacity 1s}.mud-ripple:active:after{transform:scale(0, 0);opacity:var(--mud-ripple-opacity);transition:0s}.mud-ripple:has(.mud-ripple:active):after{opacity:0}.mud-ripple-icon:after,.mud-ripple-checkbox:after,.mud-ripple-switch:after,.mud-ripple-radio:after{transform:scale(14, 14)}.mud-ripple-switch{position:absolute}.mud-rtl{direction:rtl !important}.mud-ltr{direction:ltr !important}.mud-application-layout-rtl .mud-flip-x-rtl{transform:scaleX(-1)} diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor/MudBlazor.min.css.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor/MudBlazor.min.css.br new file mode 100644 index 00000000..3ee69a6f Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor/MudBlazor.min.css.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor/MudBlazor.min.css.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor/MudBlazor.min.css.gz new file mode 100644 index 00000000..d41cb93b Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor/MudBlazor.min.css.gz differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor/MudBlazor.min.js b/app/MindWork AI Studio/wwwroot/system/MudBlazor/MudBlazor.min.js index 5ae019d6..29cea591 100755 --- a/app/MindWork AI Studio/wwwroot/system/MudBlazor/MudBlazor.min.js +++ b/app/MindWork AI Studio/wwwroot/system/MudBlazor/MudBlazor.min.js @@ -1,141 +1,91 @@ -class MudKeyInterceptorFactory{connect(dotNetRef,elementId,options){if(!elementId) -throw"elementId: expected element id!";var element=document.getElementById(elementId);if(!element) -throw"no element found for id: "+elementId;if(!element.mudKeyInterceptor) -element.mudKeyInterceptor=new MudKeyInterceptor(dotNetRef,options);element.mudKeyInterceptor.connect(element);} -updatekey(elementId,option){var element=document.getElementById(elementId);if(!element||!element.mudKeyInterceptor) -return;element.mudKeyInterceptor.updatekey(option);} -disconnect(elementId){var element=document.getElementById(elementId);if(!element||!element.mudKeyInterceptor) -return;element.mudKeyInterceptor.disconnect();}} -window.mudKeyInterceptor=new MudKeyInterceptorFactory();class MudKeyInterceptor{constructor(dotNetRef,options){this._dotNetRef=dotNetRef;this._options=options;this.logger=options.enableLogging?console.log:(message)=>{};this.logger('[MudBlazor | KeyInterceptor] Interceptor initialized',{options});} -connect(element){if(!this._options) -return;if(!this._options.keys) -throw"_options.keys: array of KeyOptions expected";if(!this._options.targetClass) -throw"_options.targetClass: css class name expected";if(this._observer){return;} -var targetClass=this._options.targetClass;this.logger('[MudBlazor | KeyInterceptor] Start observing DOM of element for changes to child with class ',{element,targetClass});this._element=element;this._observer=new MutationObserver(this.onDomChanged);this._observer.mudKeyInterceptor=this;this._observer.observe(this._element,{attributes:false,childList:true,subtree:true});this._observedChildren=[];this._keyOptions={};this._regexOptions=[];for(const keyOption of this._options.keys){if(!keyOption||!keyOption.key){this.logger('[MudBlazor | KeyInterceptor] got invalid key options: ',keyOption);continue;} -this.setKeyOption(keyOption)} -this.logger('[MudBlazor | KeyInterceptor] key options: ',this._keyOptions);if(this._regexOptions.size>0) -this.logger('[MudBlazor | KeyInterceptor] regex options: ',this._regexOptions);for(const child of this._element.getElementsByClassName(targetClass)){this.attachHandlers(child);}} -setKeyOption(keyOption){if(keyOption.key.length>2&&keyOption.key.startsWith('/')&&keyOption.key.endsWith('/')){keyOption.regex=new RegExp(keyOption.key.substring(1,keyOption.key.length-1));this._regexOptions.push(keyOption);} -else -this._keyOptions[keyOption.key.toLowerCase()]=keyOption;var whitespace=new RegExp("\\s","g");keyOption.preventDown=(keyOption.preventDown||"none").replace(whitespace,"").toLowerCase();keyOption.preventUp=(keyOption.preventUp||"none").replace(whitespace,"").toLowerCase();keyOption.stopDown=(keyOption.stopDown||"none").replace(whitespace,"").toLowerCase();keyOption.stopUp=(keyOption.stopUp||"none").replace(whitespace,"").toLowerCase();} -updatekey(updatedOption){var option=this._keyOptions[updatedOption.key.toLowerCase()];option||this.logger('[MudBlazor | KeyInterceptor] updating option failed: key not registered');this.setKeyOption(updatedOption);this.logger('[MudBlazor | KeyInterceptor] updated option ',{option,updatedOption});} -disconnect(){if(!this._observer) -return;this.logger('[MudBlazor | KeyInterceptor] disconnect mutation observer and event handlers');this._observer.disconnect();this._observer=null;for(const child of this._observedChildren) -this.detachHandlers(child);} -attachHandlers(child){this.logger('[MudBlazor | KeyInterceptor] attaching handlers ',{child});if(this._observedChildren.indexOf(child)>-1){return;} -child.mudKeyInterceptor=this;child.addEventListener('keydown',this.onKeyDown);child.addEventListener('keyup',this.onKeyUp);this._observedChildren.push(child);} -detachHandlers(child){this.logger('[MudBlazor | KeyInterceptor] detaching handlers ',{child});child.removeEventListener('keydown',this.onKeyDown);child.removeEventListener('keyup',this.onKeyUp);this._observedChildren=this._observedChildren.filter(x=>x!==child);} -onDomChanged(mutationsList,observer){var self=this.mudKeyInterceptor;var targetClass=self._options.targetClass;for(const mutation of mutationsList){for(const element of mutation.addedNodes){if(element.classList&&element.classList.contains(targetClass)) -self.attachHandlers(element);} -for(const element of mutation.removedNodes){if(element.classList&&element.classList.contains(targetClass)) -self.detachHandlers(element);}}} -matchesKeyCombination(option,args){if(!option||option==="none") -return false;if(option==="any") -return true;var shift=args.shiftKey;var ctrl=args.ctrlKey;var alt=args.altKey;var meta=args.metaKey;var any=shift||ctrl||alt||meta;if(any&&option==="key+any") -return true;if(!any&&option.includes("key+none")) -return true;if(!any) -return false;var combi=`key${shift?"+shift":""}${ctrl?"+ctrl":""}${alt?"+alt":""}${meta?"+meta":""}`;return option.includes(combi);} -onKeyDown(args){var self=this.mudKeyInterceptor;var key=args.key.toLowerCase();self.logger('[MudBlazor | KeyInterceptor] down "'+key+'"',args);var invoke=false;if(self._keyOptions.hasOwnProperty(key)){var keyOptions=self._keyOptions[key];self.logger('[MudBlazor | KeyInterceptor] options for "'+key+'"',keyOptions);self.processKeyDown(args,keyOptions);if(keyOptions.subscribeDown) -invoke=true;} -for(const keyOptions of self._regexOptions){if(keyOptions.regex.test(key)){self.logger('[MudBlazor | KeyInterceptor] regex options for "'+key+'"',keyOptions);self.processKeyDown(args,keyOptions);if(keyOptions.subscribeDown) -invoke=true;}} -if(invoke){var eventArgs=self.toKeyboardEventArgs(args);eventArgs.Type="keydown";self._dotNetRef.invokeMethodAsync('OnKeyDown',self._element.id,eventArgs);}} -processKeyDown(args,keyOptions){if(this.matchesKeyCombination(keyOptions.preventDown,args)) -args.preventDefault();if(this.matchesKeyCombination(keyOptions.stopDown,args)) -args.stopPropagation();} -onKeyUp(args){var self=this.mudKeyInterceptor;var key=args.key.toLowerCase();self.logger('[MudBlazor | KeyInterceptor] up "'+key+'"',args);var invoke=false;if(self._keyOptions.hasOwnProperty(key)){var keyOptions=self._keyOptions[key];self.processKeyUp(args,keyOptions);if(keyOptions.subscribeUp) -invoke=true;} -for(const keyOptions of self._regexOptions){if(keyOptions.regex.test(key)){self.processKeyUp(args,keyOptions);if(keyOptions.subscribeUp) -invoke=true;}} -if(invoke){var eventArgs=self.toKeyboardEventArgs(args);eventArgs.Type="keyup";self._dotNetRef.invokeMethodAsync('OnKeyUp',self._element.id,eventArgs);}} -processKeyUp(args,keyOptions){if(this.matchesKeyCombination(keyOptions.preventUp,args)) -args.preventDefault();if(this.matchesKeyCombination(keyOptions.stopUp,args)) -args.stopPropagation();} -toKeyboardEventArgs(args){return{Key:args.key,Code:args.code,Location:args.location,Repeat:args.repeat,CtrlKey:args.ctrlKey,ShiftKey:args.shiftKey,AltKey:args.altKey,MetaKey:args.metaKey};}} -class MudInput{resetValue(id){const input=document.getElementById(id);if(input){input.value='';}}} -window.mudInput=new MudInput();window.mudpopoverHelper={calculatePopoverPosition:function(list,boundingRect,selfRect){let top=0;let left=0;if(list.indexOf('mud-popover-anchor-top-left')>=0){left=boundingRect.left;top=boundingRect.top;}else if(list.indexOf('mud-popover-anchor-top-center')>=0){left=boundingRect.left+boundingRect.width/2;top=boundingRect.top;}else if(list.indexOf('mud-popover-anchor-top-right')>=0){left=boundingRect.left+boundingRect.width;top=boundingRect.top;}else if(list.indexOf('mud-popover-anchor-center-left')>=0){left=boundingRect.left;top=boundingRect.top+boundingRect.height/2;}else if(list.indexOf('mud-popover-anchor-center-center')>=0){left=boundingRect.left+boundingRect.width/2;top=boundingRect.top+boundingRect.height/2;}else if(list.indexOf('mud-popover-anchor-center-right')>=0){left=boundingRect.left+boundingRect.width;top=boundingRect.top+boundingRect.height/2;}else if(list.indexOf('mud-popover-anchor-bottom-left')>=0){left=boundingRect.left;top=boundingRect.top+boundingRect.height;}else if(list.indexOf('mud-popover-anchor-bottom-center')>=0){left=boundingRect.left+boundingRect.width/2;top=boundingRect.top+boundingRect.height;}else if(list.indexOf('mud-popover-anchor-bottom-right')>=0){left=boundingRect.left+boundingRect.width;top=boundingRect.top+boundingRect.height;} -let offsetX=0;let offsetY=0;if(list.indexOf('mud-popover-top-left')>=0){offsetX=0;offsetY=0;}else if(list.indexOf('mud-popover-top-center')>=0){offsetX=-selfRect.width/2;offsetY=0;}else if(list.indexOf('mud-popover-top-right')>=0){offsetX=-selfRect.width;offsetY=0;} -else if(list.indexOf('mud-popover-center-left')>=0){offsetX=0;offsetY=-selfRect.height/2;}else if(list.indexOf('mud-popover-center-center')>=0){offsetX=-selfRect.width/2;offsetY=-selfRect.height/2;}else if(list.indexOf('mud-popover-center-right')>=0){offsetX=-selfRect.width;offsetY=-selfRect.height/2;} -else if(list.indexOf('mud-popover-bottom-left')>=0){offsetX=0;offsetY=-selfRect.height;}else if(list.indexOf('mud-popover-bottom-center')>=0){offsetX=-selfRect.width/2;offsetY=-selfRect.height;}else if(list.indexOf('mud-popover-bottom-right')>=0){offsetX=-selfRect.width;offsetY=-selfRect.height;} -return{top:top,left:left,offsetX:offsetX,offsetY:offsetY};},flipClassReplacements:{'top':{'mud-popover-top-left':'mud-popover-bottom-left','mud-popover-top-center':'mud-popover-bottom-center','mud-popover-anchor-bottom-center':'mud-popover-anchor-top-center','mud-popover-top-right':'mud-popover-bottom-right',},'left':{'mud-popover-top-left':'mud-popover-top-right','mud-popover-center-left':'mud-popover-center-right','mud-popover-anchor-center-right':'mud-popover-anchor-center-left','mud-popover-bottom-left':'mud-popover-bottom-right',},'right':{'mud-popover-top-right':'mud-popover-top-left','mud-popover-center-right':'mud-popover-center-left','mud-popover-anchor-center-left':'mud-popover-anchor-center-right','mud-popover-bottom-right':'mud-popover-bottom-left',},'bottom':{'mud-popover-bottom-left':'mud-popover-top-left','mud-popover-bottom-center':'mud-popover-top-center','mud-popover-anchor-top-center':'mud-popover-anchor-bottom-center','mud-popover-bottom-right':'mud-popover-top-right',},'top-and-left':{'mud-popover-top-left':'mud-popover-bottom-right',},'top-and-right':{'mud-popover-top-right':'mud-popover-bottom-left',},'bottom-and-left':{'mud-popover-bottom-left':'mud-popover-top-right',},'bottom-and-right':{'mud-popover-bottom-right':'mud-popover-top-left',},},flipMargin:0,getPositionForFlippedPopver:function(inputArray,selector,boundingRect,selfRect){const classList=[];for(var i=0;i0){appBarOffset=appBarElements[0].getBoundingClientRect().height;} -const graceMargin=window.mudpopoverHelper.flipMargin;const deltaToLeft=left+offsetX;const deltaToRight=window.innerWidth-left-selfRect.width;const deltaTop=top-selfRect.height-appBarOffset;const spaceToTop=top-appBarOffset;const deltaBottom=window.innerHeight-top-selfRect.height;let selector=popoverContentNode.mudPopoverFliped;if(!selector){if(classList.contains('mud-popover-top-left')){if(deltaBottom=selfRect.height&&deltaToLeft>=selfRect.width){selector='top-and-left';}else if(deltaBottom=selfRect.height){selector='top';}else if(deltaToRight=selfRect.width){selector='left';}}else if(classList.contains('mud-popover-top-center')){if(deltaBottom=selfRect.height){selector='top';}}else if(classList.contains('mud-popover-top-right')){if(deltaBottom=selfRect.height&&deltaToRight>=selfRect.width){selector='top-and-right';}else if(deltaBottom=selfRect.height){selector='top';}else if(deltaToLeft=selfRect.width){selector='right';}} -else if(classList.contains('mud-popover-center-left')){if(deltaToRight=selfRect.width){selector='left';}} -else if(classList.contains('mud-popover-center-right')){if(deltaToLeft=selfRect.width){selector='right';}} -else if(classList.contains('mud-popover-bottom-left')){if(deltaTop=0&&deltaToLeft>=selfRect.width){selector='bottom-and-left';}else if(deltaTop=0){selector='bottom';}else if(deltaToRight=selfRect.width){selector='left';}}else if(classList.contains('mud-popover-bottom-center')){if(deltaTop=0){selector='bottom';}}else if(classList.contains('mud-popover-bottom-right')){if(deltaTop=0&&deltaToRight>=selfRect.width){selector='bottom-and-right';}else if(deltaTop=0){selector='bottom';}else if(deltaToLeft=selfRect.width){selector='right';}}} -if(selector&&selector!='none'){const newPosition=window.mudpopoverHelper.getPositionForFlippedPopver(classListArray,selector,boundingRect,selfRect);left=newPosition.left;top=newPosition.top;offsetX=newPosition.offsetX;offsetY=newPosition.offsetY;popoverContentNode.setAttribute('data-mudpopover-flip','flipped');} -else{if(left+offsetX<0){left=Math.max(0,left+offsetX);offsetX=0;} -if(top+offsetY=0){continue;} -tickValues.push(tickValue);if(tickValue>max){max=tickValue;}}} -if(tickValues.length==0){continue;} -const sortedTickValues=tickValues.sort((x,y)=>x-y);for(let i=0;i{window.mudpopoverHelper.placePopoverByClassSelector();});this.contentObserver.observe(mainContent[0]);}} -connect(id){this.initialize(this.mainContainerClass);const popoverNode=document.getElementById('popover-'+id);const popoverContentNode=document.getElementById('popovercontent-'+id);if(popoverNode&&popoverNode.parentNode&&popoverContentNode){window.mudpopoverHelper.placePopover(popoverNode);const config={attributeFilter:['class','data-ticks']};const observer=new MutationObserver(this.callback.bind(this,id));observer.observe(popoverContentNode,config);const resizeObserver=new ResizeObserver(entries=>{for(let entry of entries){const target=entry.target;for(var i=0;i{for(let entry of entries){var target=entry.target;window.mudpopoverHelper.placePopoverByNode(target);}});contentNodeObserver.observe(popoverContentNode);this.map[id]={mutationObserver:observer,resizeObserver:resizeObserver,contentNodeObserver:contentNodeObserver};}} -disconnect(id){if(this.map[id]){const item=this.map[id] -item.mutationObserver.disconnect();item.resizeObserver.disconnect();item.contentNodeObserver.disconnect();delete this.map[id];}} -dispose(){for(var i in this.map){disconnect(i);} -this.contentObserver.disconnect();this.contentObserver=null;} -getAllObservedContainers(){const result=[];for(var i in this.map){result.push(i);} -return result;}} -window.mudPopover=new MudPopover();window.addEventListener('scroll',()=>{window.mudpopoverHelper.placePopoverByClassSelector('mud-popover-fixed');window.mudpopoverHelper.placePopoverByClassSelector('mud-popover-overflow-flip-always');});window.addEventListener('resize',()=>{window.mudpopoverHelper.placePopoverByClassSelector();});window.mudTimePicker={initPointerEvents:(clock,dotNetHelper)=>{let isPointerDown=false;const startHandler=(event)=>{if(event.button!==0){return;} -isPointerDown=true;event.target.releasePointerCapture(event.pointerId);if(event.target.classList.contains('mud-hour')||event.target.classList.contains('mud-minute')){let attributeValue=event.target.getAttribute('data-stick-value');let stickValue=attributeValue?parseInt(attributeValue):-1;dotNetHelper.invokeMethodAsync('SelectTimeFromStick',stickValue,false);} -event.preventDefault();};const endHandler=(event)=>{if(event.button!==0){return;} -isPointerDown=false;if(event.target.classList.contains('mud-hour')||event.target.classList.contains('mud-minute')){let attributeValue=event.target.getAttribute('data-stick-value');let stickValue=attributeValue?parseInt(attributeValue):-1;dotNetHelper.invokeMethodAsync('OnStickClick',stickValue);} -event.preventDefault();};const moveHandler=(event)=>{if(!isPointerDown||(!event.target.classList.contains('mud-hour')&&!event.target.classList.contains('mud-minute'))){return;} -let attributeValue=event.target.getAttribute('data-stick-value');let stickValue=attributeValue?parseInt(attributeValue):-1;dotNetHelper.invokeMethodAsync('SelectTimeFromStick',stickValue,true);event.preventDefault();};clock.addEventListener('pointerdown',startHandler);clock.addEventListener('pointerup',endHandler);clock.addEventListener('pointercancel',endHandler);clock.addEventListener('pointerover',moveHandler);clock.destroy=()=>{clock.removeEventListener('pointerdown',startHandler);clock.removeEventListener('pointerup',endHandler);clock.removeEventListener('pointercancel',endHandler);clock.removeEventListener('pointerover',moveHandler);};},destroyPointerEvents:(container)=>{if(container==null){return;} -if(typeof container.destroy==='function'){container.destroy();}}};class MudResizeListener{constructor(id){this.logger=function(message){};this.options={};this.throttleResizeHandlerId=-1;this.dotnet=undefined;this.breakpoint=-1;this.id=id;this.handleResize=this.throttleResizeHandler.bind(this);} -listenForResize(dotnetRef,options){if(this.dotnet){this.options=options;return;} -this.options=options;this.dotnet=dotnetRef;this.logger=options.enableLogging?console.log:(message)=>{};this.logger(`[MudBlazor]Reporting resize events at rate of:${this.options.reportRate}ms`);window.addEventListener("resize",this.handleResize,false);if(!this.options.suppressInitEvent){this.resizeHandler();} -this.breakpoint=this.getBreakpoint(window.innerWidth);} -throttleResizeHandler(){clearTimeout(this.throttleResizeHandlerId);this.throttleResizeHandlerId=window.setTimeout(this.resizeHandler.bind(this),this.options.reportRate);} -resizeHandler(){if(this.options.notifyOnBreakpointOnly){let bp=this.getBreakpoint(window.innerWidth);if(bp==this.breakpoint){return;} -this.breakpoint=bp;} -try{if(this.id){this.dotnet.invokeMethodAsync('RaiseOnResized',{height:window.innerHeight,width:window.innerWidth},this.getBreakpoint(window.innerWidth),this.id);} -else{this.dotnet.invokeMethodAsync('RaiseOnResized',{height:window.innerHeight,width:window.innerWidth},this.getBreakpoint(window.innerWidth));}}catch(error){this.logger("[MudBlazor] Error in resizeHandler:",{error});}} -cancelListener(){this.dotnet=undefined;window.removeEventListener("resize",this.handleResize);} -matchMedia(query){let m=window.matchMedia(query).matches;return m;} -getBrowserWindowSize(){return{height:window.innerHeight,width:window.innerWidth};} -getBreakpoint(width){if(width>=this.options.breakpointDefinitions["Xxl"]) -return 5;else if(width>=this.options.breakpointDefinitions["Xl"]) -return 4;else if(width>=this.options.breakpointDefinitions["Lg"]) -return 3;else if(width>=this.options.breakpointDefinitions["Md"]) -return 2;else if(width>=this.options.breakpointDefinitions["Sm"]) -return 1;else -return 0;}};window.mudResizeListener=new MudResizeListener();window.mudResizeListenerFactory={mapping:{},listenForResize:(dotnetRef,options,id)=>{var map=window.mudResizeListenerFactory.mapping;if(map[id]){return;} -var listener=new MudResizeListener(id);listener.listenForResize(dotnetRef,options);map[id]=listener;},cancelListener:(id)=>{var map=window.mudResizeListenerFactory.mapping;if(!map[id]){return;} -var listener=map[id];listener.cancelListener();delete map[id];},cancelListeners:(ids)=>{for(let i=0;i{const elem=document.getElementById(id);elem.addEventListener('dragover',()=>event.preventDefault());elem.addEventListener('dragstart',()=>event.dataTransfer.setData('',event.target.id));},makeDropZonesNotRelative:()=>{var firstDropItems=Array.from(document.getElementsByClassName('mud-drop-item')).filter(x=>x.getAttribute('index')=="-1");for(let dropItem of firstDropItems){dropItem.style.position='static';} +class MudThrottledEventManager{constructor(){this.mapper={};} +subscribe(eventName,elementId,projection,throotleInterval,key,properties,dotnetReference){const handlerRef=this.throttleEventHandler.bind(this,key);let elem=document.getElementById(elementId);if(elem){elem.addEventListener(eventName,handlerRef,false);let projector=null;if(projection){const parts=projection.split('.');let functionPointer=window;let functionReferenceFound=true;if(parts.length==0||parts.length==1){functionPointer=functionPointer[projection];} +else{for(let i=0;i0?this.throttleEventHandler.bind(this,key):this.eventHandler.bind(this,key);document.addEventListener(eventName,handlerRef,false);this.mapper[key]={eventName:eventName,handler:handlerRef,delay:throotleInterval,timerId:-1,reference:dotnetReference,elementId:document,properties:properties,projection:null,};} +throttleEventHandler(key,event){const entry=this.mapper[key];if(!entry){return;} +clearTimeout(entry.timerId);entry.timerId=window.setTimeout(this.eventHandler.bind(this,key,event),entry.delay);} +eventHandler(key,event){const entry=this.mapper[key];if(!entry){return;} +var elem=document.getElementById(entry.elementId);if(elem!=event.srcElement&&entry.elementId!=document){return;} +const eventEntry={};for(var i=0;i({identifier:touchPoint.identifier,screenX:touchPoint.screenX,screenY:touchPoint.screenY,clientX:touchPoint.clientX,clientY:touchPoint.clientY,pageX:touchPoint.pageX,pageY:touchPoint.pageY,}));} +else{eventEntry[propertyName]=propertyValue;}} +if(entry.projection){if(typeof entry.projection==="function"){entry.projection.apply(null,[eventEntry,event]);}} +entry.reference.invokeMethodAsync('OnEventOccur',key,JSON.stringify(eventEntry));} +unsubscribe(key){const entry=this.mapper[key];if(!entry){return;} +entry.reference=null;if(document==entry.elementId){document.removeEventListener(entry.eventName,entry.handler,false);}else{const elem=document.getElementById(entry.elementId);if(elem){elem.removeEventListener(entry.eventName,entry.handler,false);}} +delete this.mapper[key];}};window.mudThrottledEventManager=new MudThrottledEventManager();window.mudEventProjections={correctOffset:function(eventEntry,event){var target=event.target.getBoundingClientRect();eventEntry.offsetX=event.clientX-target.x;eventEntry.offsetY=event.clientY-target.y;}};class MudElementReference{constructor(){this.listenerId=0;this.eventListeners={};} +focus(element){if(element) +{element.focus();}} +blur(element){if(element){element.blur();}} +focusFirst(element,skip=0,min=0){if(element) +{let tabbables=getTabbableElements(element);if(tabbables.length<=min) +element.focus();else +tabbables[skip].focus();}} +focusLast(element,skip=0,min=0){if(element) +{let tabbables=getTabbableElements(element);if(tabbables.length<=min) +element.focus();else +tabbables[tabbables.length-skip-1].focus();}} +saveFocus(element){if(element) +{element['mudblazor_savedFocus']=document.activeElement;}} +restoreFocus(element){if(element) +{let previous=element['mudblazor_savedFocus'];delete element['mudblazor_savedFocus'] +if(previous) +previous.focus();}} +selectRange(element,pos1,pos2){if(element) +{if(element.createTextRange){let selRange=element.createTextRange();selRange.collapse(true);selRange.moveStart('character',pos1);selRange.moveEnd('character',pos2);selRange.select();}else if(element.setSelectionRange){element.setSelectionRange(pos1,pos2);}else if(element.selectionStart){element.selectionStart=pos1;element.selectionEnd=pos2;} +element.focus();}} +select(element){if(element) +{element.select();}} +getBoundingClientRect(element){if(!element)return;var rect=JSON.parse(JSON.stringify(element.getBoundingClientRect()));rect.scrollY=window.scrollY||document.documentElement.scrollTop;rect.scrollX=window.scrollX||document.documentElement.scrollLeft;rect.windowHeight=window.innerHeight;rect.windowWidth=window.innerWidth;return rect;} +changeCss(element,css){if(element) +{element.className=css;}} +removeEventListener(element,event,eventId){element.removeEventListener(event,this.eventListeners[eventId]);delete this.eventListeners[eventId];} +addDefaultPreventingHandler(element,eventName){let listener=function(e){if(!e.defaultPrevented){e.preventDefault();}};element.addEventListener(eventName,listener,{passive:false});this.eventListeners[++this.listenerId]=listener;return this.listenerId;} +removeDefaultPreventingHandler(element,eventName,listenerId){this.removeEventListener(element,eventName,listenerId);} +addDefaultPreventingHandlers(element,eventNames){let listeners=[];for(const eventName of eventNames){let listenerId=this.addDefaultPreventingHandler(element,eventName);listeners.push(listenerId);} +return listeners;} +removeDefaultPreventingHandlers(element,eventNames,listenerIds){for(let index=0;index{return darkThemeMediaQuery.matches;};function darkModeChangeListener(e){dotNetHelperTheme.invokeMethodAsync('SystemPreferenceChanged',e.matches);} +function watchDarkThemeMedia(dotNetHelper){dotNetHelperTheme=dotNetHelper;darkThemeMediaQuery.addEventListener('change',darkModeChangeListener);} +function stopWatchingDarkThemeMedia(){darkThemeMediaQuery.removeEventListener('change',darkModeChangeListener);} +class MudScrollManager{scrollToYear(elementId,offset){let element=document.getElementById(elementId);if(element){element.parentNode.scrollTop=element.offsetTop-element.parentNode.offsetTop-element.scrollHeight*3;}} +scrollToListItem(elementId){let element=document.getElementById(elementId);if(element){let parent=element.parentElement;if(parent){parent.scrollTop=element.offsetTop;}}} +scrollTo(selector,left,top,behavior){let element=document.querySelector(selector)||document.documentElement;element.scrollTo({left,top,behavior});} +scrollIntoView(selector,behavior){let element=document.querySelector(selector)||document.documentElement;if(element) +element.scrollIntoView({behavior,block:'center',inline:'start'});} +scrollToBottom(selector,behavior){let element=document.querySelector(selector);if(element){element.scrollTo({top:element.scrollHeight,behavior:behavior});}else{window.scrollTo({top:document.body.scrollHeight,behavior:behavior});}} +lockScroll(selector,lockclass){let element=document.querySelector(selector)||document.body;let hasScrollBar=window.innerWidth>document.body.clientWidth;if(hasScrollBar){element.classList.add(lockclass);}else{let lockClassNoPadding=lockclass+"-no-padding";element.classList.add(lockClassNoPadding);}} +unlockScroll(selector,lockclass){let element=document.querySelector(selector)||document.body;element.classList.remove(lockclass);element.classList.remove(lockclass+"-no-padding");}};window.mudScrollManager=new MudScrollManager();window.getTabbableElements=(element)=>{return element.querySelectorAll("a[href]:not([tabindex='-1']),"+"area[href]:not([tabindex='-1']),"+"button:not([disabled]):not([tabindex='-1']),"+"input:not([disabled]):not([tabindex='-1']):not([type='hidden']),"+"select:not([disabled]):not([tabindex='-1']),"+"textarea:not([disabled]):not([tabindex='-1']),"+"iframe:not([tabindex='-1']),"+"details:not([tabindex='-1']),"+"[tabindex]:not([tabindex='-1']),"+"[contentEditable=true]:not([tabindex='-1'])");};window.serializeParameter=(data,spec)=>{if(typeof data=="undefined"||data===null){return null;} +if(typeof data==="number"||typeof data==="string"||typeof data=="boolean"){return data;} +let res=(Array.isArray(data))?[]:{};if(!spec){spec="*";} +for(let i in data){let currentMember=data[i];if(typeof currentMember==='function'||currentMember===null){continue;} +let currentMemberSpec;if(spec!="*"){currentMemberSpec=Array.isArray(data)?spec:spec[i];if(!currentMemberSpec){continue;}}else{currentMemberSpec="*"} +if(typeof currentMember==='object'){if(Array.isArray(currentMember)||currentMember.length){res[i]=[];for(let j=0;j{const bbox=svgElement.getBBox();return{x:bbox.x,y:bbox.y,width:bbox.width,height:bbox.height};};window.mudObserveElementSize=(dotNetReference,element,functionName='OnElementSizeChanged',debounceMillis=200)=>{if(!element)return;let lastNotifiedTime=0;let scheduledCall=null;const throttledNotify=(width,height)=>{const now=Date.now();const timeSinceLast=now-lastNotifiedTime;if(timeSinceLast>=debounceMillis){lastNotifiedTime=now;try{dotNetReference.invokeMethodAsync(functionName,{width,height});} +catch(error){this.logger("[MudBlazor] Error in mudObserveElementSize:",{error});}}else{if(scheduledCall!==null){clearTimeout(scheduledCall);} +scheduledCall=setTimeout(()=>{lastNotifiedTime=Date.now();scheduledCall=null;try{dotNetReference.invokeMethodAsync(functionName,{width,height});} +catch(error){this.logger("[MudBlazor] Error in mudObserveElementSize:",{error});}},debounceMillis-timeSinceLast);}};const resizeObserver=new ResizeObserver(entries=>{let width=element.clientWidth;let height=element.clientHeight;for(const entry of entries){width=entry.contentRect.width;height=entry.contentRect.height;} +width=Math.floor(width);height=Math.floor(height);throttledNotify(width,height);});resizeObserver.observe(element);let mutationObserver=null;const parent=element.parentNode;if(parent){mutationObserver=new MutationObserver(mutations=>{for(const mutation of mutations){for(const removedNode of mutation.removedNodes){if(removedNode===element){cleanup();}}}});mutationObserver.observe(parent,{childList:true});} +function cleanup(){resizeObserver.disconnect();if(mutationObserver){mutationObserver.disconnect();} +if(scheduledCall!==null){clearTimeout(scheduledCall);}} +return{width:element.clientWidth,height:element.clientHeight};};window.mudDragAndDrop={initDropZone:(id)=>{const elem=document.getElementById(id);elem.addEventListener('dragover',()=>event.preventDefault());elem.addEventListener('dragstart',()=>event.dataTransfer.setData('',event.target.id));},makeDropZonesNotRelative:()=>{var firstDropItems=Array.from(document.getElementsByClassName('mud-drop-item')).filter(x=>x.getAttribute('index')=="-1");for(let dropItem of firstDropItems){dropItem.style.position='static';} const dropZones=document.getElementsByClassName('mud-drop-zone');for(let dropZone of dropZones){dropZone.style.position='unset';}},getDropZoneIdentifierOnPosition:(x,y)=>{const elems=document.elementsFromPoint(x,y);const dropZones=elems.filter(e=>e.classList.contains('mud-drop-zone')) const dropZone=dropZones[0];if(dropZone){return dropZone.getAttribute('identifier')||"";} return"";},getDropIndexOnPosition:(x,y,id)=>{const elems=document.elementsFromPoint(x,y);const dropItems=elems.filter(e=>e.classList.contains('mud-drop-item')&&e.id!=id) const dropItem=dropItems[0];if(dropItem){return dropItem.getAttribute('index')||"";} return"";},makeDropZonesRelative:()=>{const dropZones=document.getElementsByClassName('mud-drop-zone');for(let dropZone of dropZones){dropZone.style.position='relative';} -var firstDropItems=Array.from(document.getElementsByClassName('mud-drop-item')).filter(x=>x.getAttribute('index')=="-1");for(let dropItem of firstDropItems){dropItem.style.position='relative';}},moveItemByDifference:(id,dx,dy)=>{const elem=document.getElementById(id);var tx=(parseFloat(elem.getAttribute('data-x'))||0)+dx;var ty=(parseFloat(elem.getAttribute('data-y'))||0)+dy;elem.style.webkitTransform=elem.style.transform='translate3d('+tx+'px, '+ty+'px, 10px)';elem.setAttribute('data-x',tx);elem.setAttribute('data-y',ty);},resetItem:(id)=>{const elem=document.getElementById(id);if(elem){elem.style.webkitTransform=elem.style.transform='';elem.setAttribute('data-x',0);elem.setAttribute('data-y',0);}}};class MudJsEventFactory{connect(dotNetRef,elementId,options){if(!elementId) +var firstDropItems=Array.from(document.getElementsByClassName('mud-drop-item')).filter(x=>x.getAttribute('index')=="-1");for(let dropItem of firstDropItems){dropItem.style.position='relative';}},moveItemByDifference:(id,dx,dy)=>{const elem=document.getElementById(id);var tx=(parseFloat(elem.getAttribute('data-x'))||0)+dx;var ty=(parseFloat(elem.getAttribute('data-y'))||0)+dy;elem.style.webkitTransform=elem.style.transform='translate3d('+tx+'px, '+ty+'px, 10px)';elem.setAttribute('data-x',tx);elem.setAttribute('data-y',ty);},resetItem:(id)=>{const elem=document.getElementById(id);if(elem){elem.style.webkitTransform=elem.style.transform='';elem.setAttribute('data-x',0);elem.setAttribute('data-y',0);}}};class MudWindow{copyToClipboard(text){navigator.clipboard.writeText(text);} +changeCssById(id,css){var element=document.getElementById(id);if(element){element.className=css;}} +updateStyleProperty(elementId,propertyName,value){const element=document.getElementById(elementId);if(element){element.style.setProperty(propertyName,value);}} +changeGlobalCssVariable(name,newValue){document.documentElement.style.setProperty(name,newValue);} +open(args){window.open(args);}} +window.mudWindow=new MudWindow();class MudJsEventFactory{connect(dotNetRef,elementId,options){if(!elementId) throw"[MudBlazor | JsEvent] elementId: expected element id!";var element=document.getElementById(elementId);if(!element) throw"[MudBlazor | JsEvent] no element found for id: "+elementId;if(!element.mudJsEvent) element.mudJsEvent=new MudJsEvent(dotNetRef,options);element.mudJsEvent.connect(element);} @@ -175,26 +125,17 @@ self.detachHandlers(element);}}}} eventHandler(e){var self=this.mudJsEvent;var eventName=e.type;self.logger('[MudBlazor | JsEvent] "'+eventName+'"',e);self["on"+eventName](self,e);} onkeyup(self,e){const caretPosition=e.target.selectionStart;const invoke=self._subscribedEvents["keyup"];if(invoke){self._dotNetRef.invokeMethodAsync('OnCaretPositionChanged',caretPosition);}} onclick(self,e){const caretPosition=e.target.selectionStart;const invoke=self._subscribedEvents["click"];if(invoke){self._dotNetRef.invokeMethodAsync('OnCaretPositionChanged',caretPosition);}} -onpaste(self,e){const invoke=self._subscribedEvents["paste"];if(invoke){e.preventDefault();e.stopPropagation();const text=(e.originalEvent||e).clipboardData.getData('text/plain');self._dotNetRef.invokeMethodAsync('OnPaste',text);}} +onpaste(self,e){const invoke=self._subscribedEvents["paste"];if(invoke){e.preventDefault();e.stopPropagation();const clipboardData=((e.originalEvent||e).clipboardData||window.clipboardData);if(!clipboardData){self.logger('[MudBlazor | JsEvent] clipboardData is null',e);return;} +const text=clipboardData.getData('text/plain');self._dotNetRef.invokeMethodAsync('OnPaste',text);}} onselect(self,e){const invoke=self._subscribedEvents["select"];if(invoke){const start=e.target.selectionStart;const end=e.target.selectionEnd;if(start===end) return;self._dotNetRef.invokeMethodAsync('OnSelect',start,end);}}} -class MudScrollManager{scrollToYear(elementId,offset){let element=document.getElementById(elementId);if(element){element.parentNode.scrollTop=element.offsetTop-element.parentNode.offsetTop-element.scrollHeight*3;}} -scrollToListItem(elementId){let element=document.getElementById(elementId);if(element){let parent=element.parentElement;if(parent){parent.scrollTop=element.offsetTop;}}} -scrollTo(selector,left,top,behavior){let element=document.querySelector(selector)||document.documentElement;element.scrollTo({left,top,behavior});} -scrollIntoView(selector,behavior){let element=document.querySelector(selector)||document.documentElement;if(element) -element.scrollIntoView({behavior,block:'center',inline:'start'});} -scrollToBottom(selector,behavior){let element=document.querySelector(selector);if(element){element.scrollTo({top:element.scrollHeight,behavior:behavior});}else{window.scrollTo({top:document.body.scrollHeight,behavior:behavior});}} -lockScroll(selector,lockclass){let element=document.querySelector(selector)||document.body;let hasScrollBar=window.innerWidth>document.body.clientWidth;if(hasScrollBar){element.classList.add(lockclass);}else{let lockClassNoPadding=lockclass+"-no-padding";element.classList.add(lockClassNoPadding);}} -unlockScroll(selector,lockclass){let element=document.querySelector(selector)||document.body;element.classList.remove(lockclass);element.classList.remove(lockclass+"-no-padding");}};window.mudScrollManager=new MudScrollManager();window.mudInputAutoGrow={initAutoGrow:(elem,maxLines)=>{const compStyle=getComputedStyle(elem);const lineHeight=parseFloat(compStyle.getPropertyValue('line-height'));let maxHeight=0;elem.updateParameters=function(newMaxLines){if(newMaxLines>0){maxHeight=lineHeight*newMaxLines;}else{maxHeight=0;}} -elem.adjustAutoGrowHeight=function(didReflow=false){const scrollTops=[];let curElem=elem;while(curElem&&curElem.parentNode&&curElem.parentNode instanceof Element){if(curElem.parentNode.scrollTop){scrollTops.push([curElem.parentNode,curElem.parentNode.scrollTop]);} -curElem=curElem.parentNode;} -elem.style.height=0;if(didReflow){elem.style.textAlign=null;} -let minHeight=lineHeight*elem.rows;let newHeight=Math.max(minHeight,elem.scrollHeight);let initialOverflowY=elem.style.overflowY;if(maxHeight>0&&newHeight>maxHeight){elem.style.overflowY='auto';newHeight=maxHeight;}else{elem.style.overflowY='hidden';} -elem.style.height=newHeight+"px";scrollTops.forEach(([node,scrollTop])=>{node.style.scrollBehavior='auto';node.scrollTop=scrollTop;node.style.scrollBehavior=null;});if(!didReflow&&initialOverflowY!==elem.style.overflowY&&elem.style.overflowY==='hidden'){elem.style.textAlign='end';elem.adjustAutoGrowHeight(true);}} -elem.restoreToInitialState=function(){elem.removeEventListener('input',elem.adjustAutoGrowHeight);elem.style.overflowY=null;elem.style.height=null;} -elem.addEventListener('input',elem.adjustAutoGrowHeight);window.addEventListener('resize',elem.adjustAutoGrowHeight);elem.updateParameters(maxLines);elem.adjustAutoGrowHeight();},adjustHeight:(elem)=>{if(typeof elem.adjustAutoGrowHeight==='function'){elem.adjustAutoGrowHeight();}},updateParams:(elem,maxLines)=>{if(typeof elem.updateParameters==='function'){elem.updateParameters(maxLines);} -if(typeof elem.adjustAutoGrowHeight==='function'){elem.adjustAutoGrowHeight();}},destroy:(elem)=>{if(elem==null){return;} -window.removeEventListener('resize',elem.adjustAutoGrowHeight);if(typeof elem.restoreToInitialState==='function'){elem.restoreToInitialState();}}};class MudResizeObserverFactory{constructor(){this._maps={};} +window.mudTimePicker={initPointerEvents:(clock,dotNetHelper)=>{let isPointerDown=false;const startHandler=(event)=>{if(event.button!==0){return;} +isPointerDown=true;event.target.releasePointerCapture(event.pointerId);if(event.target.classList.contains('mud-hour')||event.target.classList.contains('mud-minute')){let attributeValue=event.target.getAttribute('data-stick-value');let stickValue=attributeValue?parseInt(attributeValue):-1;dotNetHelper.invokeMethodAsync('SelectTimeFromStick',stickValue,false);} +event.preventDefault();};const endHandler=(event)=>{if(event.button!==0){return;} +isPointerDown=false;if(event.target.classList.contains('mud-hour')||event.target.classList.contains('mud-minute')){let attributeValue=event.target.getAttribute('data-stick-value');let stickValue=attributeValue?parseInt(attributeValue):-1;dotNetHelper.invokeMethodAsync('OnStickClick',stickValue);} +event.preventDefault();};const moveHandler=(event)=>{if(!isPointerDown||(!event.target.classList.contains('mud-hour')&&!event.target.classList.contains('mud-minute'))){return;} +let attributeValue=event.target.getAttribute('data-stick-value');let stickValue=attributeValue?parseInt(attributeValue):-1;dotNetHelper.invokeMethodAsync('SelectTimeFromStick',stickValue,true);event.preventDefault();};clock.addEventListener('pointerdown',startHandler);clock.addEventListener('pointerup',endHandler);clock.addEventListener('pointercancel',endHandler);clock.addEventListener('pointerover',moveHandler);clock.destroy=()=>{clock.removeEventListener('pointerdown',startHandler);clock.removeEventListener('pointerup',endHandler);clock.removeEventListener('pointercancel',endHandler);clock.removeEventListener('pointerover',moveHandler);};},destroyPointerEvents:(container)=>{if(container==null){return;} +if(typeof container.destroy==='function'){container.destroy();}}};class MudResizeObserverFactory{constructor(){this._maps={};} connect(id,dotNetRef,elements,elementIds,options){var existingEntry=this._maps[id];if(!existingEntry){var observer=new MudResizeObserver(dotNetRef,options);this._maps[id]=observer;} var result=this._maps[id].connect(elements,elementIds);return result;} disconnect(id,element){var existingEntry=this._maps[id];if(existingEntry){existingEntry.disconnect(element);}} @@ -209,49 +150,86 @@ connect(elements,ids){var result=[];this.logger('[MudBlazor | ResizeObserver] St return result;} disconnect(elementId){this.logger('[MudBlazor | ResizeObserver] Try to unobserve element with id',{elementId});var affectedObservedElement=this._observervedElements.find((x)=>x.id==elementId);if(affectedObservedElement){var element=affectedObservedElement.element;this._resizeObserver.unobserve(element);this.logger('[MudBlazor | ResizeObserver] Element found. Ubobserving size changes of element',{element});var index=this._observervedElements.indexOf(affectedObservedElement);this._observervedElements.splice(index,1);}} cancelListener(){this.logger('[MudBlazor | ResizeObserver] Closing ResizeObserver. Detaching all observed elements');this._resizeObserver.disconnect();this._dotNetRef=undefined;}} -window.mudResizeObserver=new MudResizeObserverFactory();class MudElementReference{constructor(){this.listenerId=0;this.eventListeners={};} -focus(element){if(element) -{element.focus();}} -blur(element){if(element){element.blur();}} -focusFirst(element,skip=0,min=0){if(element) -{let tabbables=getTabbableElements(element);if(tabbables.length<=min) -element.focus();else -tabbables[skip].focus();}} -focusLast(element,skip=0,min=0){if(element) -{let tabbables=getTabbableElements(element);if(tabbables.length<=min) -element.focus();else -tabbables[tabbables.length-skip-1].focus();}} -saveFocus(element){if(element) -{element['mudblazor_savedFocus']=document.activeElement;}} -restoreFocus(element){if(element) -{let previous=element['mudblazor_savedFocus'];delete element['mudblazor_savedFocus'] -if(previous) -previous.focus();}} -selectRange(element,pos1,pos2){if(element) -{if(element.createTextRange){let selRange=element.createTextRange();selRange.collapse(true);selRange.moveStart('character',pos1);selRange.moveEnd('character',pos2);selRange.select();}else if(element.setSelectionRange){element.setSelectionRange(pos1,pos2);}else if(element.selectionStart){element.selectionStart=pos1;element.selectionEnd=pos2;} -element.focus();}} -select(element){if(element) -{element.select();}} -getBoundingClientRect(element){if(!element)return;var rect=JSON.parse(JSON.stringify(element.getBoundingClientRect()));rect.scrollY=window.scrollY||document.documentElement.scrollTop;rect.scrollX=window.scrollX||document.documentElement.scrollLeft;rect.windowHeight=window.innerHeight;rect.windowWidth=window.innerWidth;return rect;} -changeCss(element,css){if(element) -{element.className=css;}} -removeEventListener(element,event,eventId){element.removeEventListener(event,this.eventListeners[eventId]);delete this.eventListeners[eventId];} -addDefaultPreventingHandler(element,eventName){let listener=function(e){e.preventDefault();} -element.addEventListener(eventName,listener,{passive:false});this.eventListeners[++this.listenerId]=listener;return this.listenerId;} -removeDefaultPreventingHandler(element,eventName,listenerId){this.removeEventListener(element,eventName,listenerId);} -addDefaultPreventingHandlers(element,eventNames){let listeners=[];for(const eventName of eventNames){let listenerId=this.addDefaultPreventingHandler(element,eventName);listeners.push(listenerId);} -return listeners;} -removeDefaultPreventingHandlers(element,eventNames,listenerIds){for(let index=0;index{clearTimeout(timeout);func(...args);};clearTimeout(timeout);timeout=setTimeout(later,wait);};},rafThrottle:function(func){let ticking=false;return function(...args){if(!ticking){window.requestAnimationFrame(()=>{func.apply(this,args);ticking=false;});ticking=true;}};},calculatePopoverPosition:function(list,boundingRect,selfRect){let top=0;let left=0;if(list.indexOf('mud-popover-anchor-top-left')>=0){left=boundingRect.left;top=boundingRect.top;}else if(list.indexOf('mud-popover-anchor-top-center')>=0){left=boundingRect.left+boundingRect.width/2;top=boundingRect.top;}else if(list.indexOf('mud-popover-anchor-top-right')>=0){left=boundingRect.left+boundingRect.width;top=boundingRect.top;}else if(list.indexOf('mud-popover-anchor-center-left')>=0){left=boundingRect.left;top=boundingRect.top+boundingRect.height/2;}else if(list.indexOf('mud-popover-anchor-center-center')>=0){left=boundingRect.left+boundingRect.width/2;top=boundingRect.top+boundingRect.height/2;}else if(list.indexOf('mud-popover-anchor-center-right')>=0){left=boundingRect.left+boundingRect.width;top=boundingRect.top+boundingRect.height/2;}else if(list.indexOf('mud-popover-anchor-bottom-left')>=0){left=boundingRect.left;top=boundingRect.top+boundingRect.height;}else if(list.indexOf('mud-popover-anchor-bottom-center')>=0){left=boundingRect.left+boundingRect.width/2;top=boundingRect.top+boundingRect.height;}else if(list.indexOf('mud-popover-anchor-bottom-right')>=0){left=boundingRect.left+boundingRect.width;top=boundingRect.top+boundingRect.height;} +let offsetX=0;let offsetY=0;if(list.indexOf('mud-popover-top-left')>=0){offsetX=0;offsetY=0;}else if(list.indexOf('mud-popover-top-center')>=0){offsetX=-selfRect.width/2;offsetY=0;}else if(list.indexOf('mud-popover-top-right')>=0){offsetX=-selfRect.width;offsetY=0;} +else if(list.indexOf('mud-popover-center-left')>=0){offsetX=0;offsetY=-selfRect.height/2;}else if(list.indexOf('mud-popover-center-center')>=0){offsetX=-selfRect.width/2;offsetY=-selfRect.height/2;}else if(list.indexOf('mud-popover-center-right')>=0){offsetX=-selfRect.width;offsetY=-selfRect.height/2;} +else if(list.indexOf('mud-popover-bottom-left')>=0){offsetX=0;offsetY=-selfRect.height;}else if(list.indexOf('mud-popover-bottom-center')>=0){offsetX=-selfRect.width/2;offsetY=-selfRect.height;}else if(list.indexOf('mud-popover-bottom-right')>=0){offsetX=-selfRect.width;offsetY=-selfRect.height;} +return{top:top,left:left,offsetX:offsetX,offsetY:offsetY};},flipClassReplacements:{'top':{'mud-popover-top-left':'mud-popover-bottom-left','mud-popover-top-center':'mud-popover-bottom-center','mud-popover-anchor-bottom-center':'mud-popover-anchor-top-center','mud-popover-top-right':'mud-popover-bottom-right',},'left':{'mud-popover-top-left':'mud-popover-top-right','mud-popover-center-left':'mud-popover-center-right','mud-popover-anchor-center-right':'mud-popover-anchor-center-left','mud-popover-bottom-left':'mud-popover-bottom-right',},'right':{'mud-popover-top-right':'mud-popover-top-left','mud-popover-center-right':'mud-popover-center-left','mud-popover-anchor-center-left':'mud-popover-anchor-center-right','mud-popover-bottom-right':'mud-popover-bottom-left',},'bottom':{'mud-popover-bottom-left':'mud-popover-top-left','mud-popover-bottom-center':'mud-popover-top-center','mud-popover-anchor-top-center':'mud-popover-anchor-bottom-center','mud-popover-bottom-right':'mud-popover-top-right',},'top-and-left':{'mud-popover-top-left':'mud-popover-bottom-right',},'top-and-right':{'mud-popover-top-right':'mud-popover-bottom-left',},'bottom-and-left':{'mud-popover-bottom-left':'mud-popover-top-right',},'bottom-and-right':{'mud-popover-bottom-right':'mud-popover-top-left',},},flipMargin:0,basePopoverZIndex:parseInt(getComputedStyle(document.documentElement).getPropertyValue('--mud-zindex-popover'))||1200,baseTooltipZIndex:parseInt(getComputedStyle(document.documentElement).getPropertyValue('--mud-zindex-tooltip'))||1600,getPositionForFlippedPopver:function(inputArray,selector,boundingRect,selfRect){const classList=[];for(var i=0;i0){appBarOffset=appBarElements[0].getBoundingClientRect().height;} +const graceMargin=window.mudpopoverHelper.flipMargin;const deltaToLeft=left+offsetX;const deltaToRight=window.innerWidth-left-selfRect.width;const deltaTop=top-selfRect.height-appBarOffset;const spaceToTop=top-appBarOffset;const deltaBottom=window.innerHeight-top-selfRect.height;let selector=popoverContentNode.mudPopoverFliped;if(!selector){if(classList.contains('mud-popover-top-left')){if(deltaBottom=selfRect.height&&deltaToLeft>=selfRect.width){selector='top-and-left';}else if(deltaBottom=selfRect.height){selector='top';}else if(deltaToRight=selfRect.width){selector='left';}}else if(classList.contains('mud-popover-top-center')){if(deltaBottom=selfRect.height){selector='top';}}else if(classList.contains('mud-popover-top-right')){if(deltaBottom=selfRect.height&&deltaToRight>=selfRect.width){selector='top-and-right';}else if(deltaBottom=selfRect.height){selector='top';}else if(deltaToLeft=selfRect.width){selector='right';}} +else if(classList.contains('mud-popover-center-left')){if(deltaToRight=selfRect.width){selector='left';}} +else if(classList.contains('mud-popover-center-right')){if(deltaToLeft=selfRect.width){selector='right';}} +else if(classList.contains('mud-popover-bottom-left')){if(deltaTop=0&&deltaToLeft>=selfRect.width){selector='bottom-and-left';}else if(deltaTop=0){selector='bottom';}else if(deltaToRight=selfRect.width){selector='left';}}else if(classList.contains('mud-popover-bottom-center')){if(deltaTop=0){selector='bottom';}}else if(classList.contains('mud-popover-bottom-right')){if(deltaTop=0&&deltaToRight>=selfRect.width){selector='bottom-and-right';}else if(deltaTop=0){selector='bottom';}else if(deltaToLeft=selfRect.width){selector='right';}}} +if(selector&&selector!='none'){const newPosition=window.mudpopoverHelper.getPositionForFlippedPopver(classListArray,selector,boundingRect,selfRect);left=newPosition.left;top=newPosition.top;offsetX=newPosition.offsetX;offsetY=newPosition.offsetY;popoverContentNode.setAttribute('data-mudpopover-flip','flipped');} +else{if(left+offsetX<0&&Math.abs(left+offsetX)0){this.updatePopoverZIndex(popoverContentNode,appBarElements[0]);} +if(top+offsetY<0&&Math.abs(top+offsetY)listMaxHeight){list.style.maxHeight=(listMaxHeight-listPadding)+'px';} +popoverContentNode.removeAttribute('data-mudpopover-flip');} +if(classList.contains('mud-popover-overflow-flip-onopen')){if(!popoverContentNode.mudPopoverFliped){popoverContentNode.mudPopoverFliped=selector||'none';}}} +if(window.getComputedStyle(popoverNode).position=='fixed'){popoverContentNode.style['position']='fixed';} +else if(!classList.contains('mud-popover-fixed')){offsetX+=window.scrollX;offsetY+=window.scrollY} +if(classList.contains('mud-popover-position-override')){offsetX=0;offsetY=0;} +popoverContentNode.style['left']=(left+offsetX)+'px';popoverContentNode.style['top']=(top+offsetY)+'px';this.updatePopoverZIndex(popoverContentNode,popoverNode.parentNode);if(window.getComputedStyle(popoverNode).getPropertyValue('z-index')!='auto'){popoverContentNode.style['z-index']=Math.max(window.getComputedStyle(popoverNode).getPropertyValue('z-index'),popoverContentNode.style['z-index']);popoverContentNode.skipZIndex=true;}} +else{}},popoverScrollListener:function(node){let currentNode=node.parentNode;while(currentNode){const isScrollable=(currentNode.scrollHeight>currentNode.clientHeight)||(currentNode.scrollWidth>currentNode.clientWidth);if(isScrollable){currentNode.addEventListener('scroll',()=>{window.mudpopoverHelper.placePopoverByClassSelector('mud-popover-fixed');window.mudpopoverHelper.placePopoverByClassSelector('mud-popover-overflow-flip-always');});} +if(currentNode.tagName==="BODY"){break;} +currentNode=currentNode.parentNode;}},placePopoverByClassSelector:function(classSelector=null){var items=window.mudPopover.getAllObservedContainers();for(let i=0;i=0){continue;} +tickValues.push(tickValue);if(tickValue>max){max=tickValue;}}} +let highestTickItem=null;let highestTickValue=-1;for(const mapItem of Object.values(this.map)){const popoverContentNode=mapItem.popoverContentNode;if(popoverContentNode){const tickValue=Number(popoverContentNode.getAttribute('data-ticks'));if(tickValue>highestTickValue){highestTickValue=tickValue;highestTickItem=popoverContentNode;}}} +if(highestTickItem){window.mudpopoverHelper.updatePopoverOverlay(highestTickItem);} +if(tickValues.length==0){continue;} +const sortedTickValues=tickValues.sort((x,y)=>x-y);continue;for(let i=0;i{window.mudpopoverHelper.placePopoverByClassSelector();});this.contentObserver.observe(mainContent[0]);}} +connect(id){this.initialize(this.mainContainerClass);const popoverNode=document.getElementById('popover-'+id);mudpopoverHelper.popoverScrollListener(popoverNode);const popoverContentNode=document.getElementById('popovercontent-'+id);if(popoverNode&&popoverNode.parentNode&&popoverContentNode){window.mudpopoverHelper.placePopover(popoverNode);const config={attributeFilter:['class','data-ticks']};const observer=new MutationObserver(this.callback.bind(this,id));observer.observe(popoverContentNode,config);const throttledResize=window.mudpopoverHelper.rafThrottle(entries=>{for(let entry of entries){const target=entry.target;for(let childNode of target.childNodes){if(childNode.id&&childNode.id.startsWith('popover-')){window.mudpopoverHelper.placePopover(childNode);}}}});const resizeObserver=new ResizeObserver(throttledResize);resizeObserver.observe(popoverNode.parentNode);const throttledContent=window.mudpopoverHelper.rafThrottle(entries=>{for(let entry of entries){window.mudpopoverHelper.placePopoverByNode(entry.target);}});const contentNodeObserver=new ResizeObserver(throttledContent);contentNodeObserver.observe(popoverContentNode);this.map[id]={popoverContentNode:popoverContentNode,mutationObserver:observer,resizeObserver:resizeObserver,contentNodeObserver:contentNodeObserver};}} +disconnect(id){if(this.map[id]){const item=this.map[id] +item.mutationObserver.disconnect();item.resizeObserver.disconnect();item.contentNodeObserver.disconnect();delete this.map[id];}} +dispose(){for(var i in this.map){disconnect(i);} +this.contentObserver.disconnect();this.contentObserver=null;} +getAllObservedContainers(){const result=[];for(var i in this.map){result.push(i);} +return result;}} +window.mudPopover=new MudPopover();const debouncedResize=window.mudpopoverHelper.debounce(()=>{window.mudpopoverHelper.placePopoverByClassSelector();},100);const throttledScroll=window.mudpopoverHelper.rafThrottle(()=>{window.mudpopoverHelper.placePopoverByClassSelector('mud-popover-fixed');window.mudpopoverHelper.placePopoverByClassSelector('mud-popover-overflow-flip-always');});window.addEventListener('resize',debouncedResize,{passive:true});window.addEventListener('scroll',throttledScroll,{passive:true});class MudScrollListener{constructor(){this.throttleScrollHandlerId=-1;this.handlerRef=null;} listenForScroll(dotnetReference,selector){let element=selector?document.querySelector(selector):document;this.handlerRef=this.throttleScrollHandler.bind(this,dotnetReference);element.addEventListener('scroll',this.handlerRef,false);} throttleScrollHandler(dotnetReference,event){clearTimeout(this.throttleScrollHandlerId);this.throttleScrollHandlerId=window.setTimeout(this.scrollHandler.bind(this,dotnetReference,event),100);} scrollHandler(dotnetReference,event){try{let element=event.target;let scrollTop=element.scrollTop;let scrollHeight=element.scrollHeight;let scrollWidth=element.scrollWidth;let scrollLeft=element.scrollLeft;let nodeName=element.nodeName;let firstChild=element.firstElementChild;let firstChildBoundingClientRect=firstChild.getBoundingClientRect();dotnetReference.invokeMethodAsync('RaiseOnScroll',{firstChildBoundingClientRect,scrollLeft,scrollTop,scrollHeight,scrollWidth,nodeName,});}catch(error){console.log('[MudBlazor] Error in scrollHandler:',{error});}} -cancelListener(selector){let element=selector?document.querySelector(selector):document;element.removeEventListener('scroll',this.handlerRef);}};window.mudScrollListener=new MudScrollListener();class MudWindow{copyToClipboard(text){navigator.clipboard.writeText(text);} -changeCssById(id,css){var element=document.getElementById(id);if(element){element.className=css;}} -updateStyleProperty(elementId,propertyName,value){const element=document.getElementById(elementId);if(element){element.style.setProperty(propertyName,value);}} -changeGlobalCssVariable(name,newValue){document.documentElement.style.setProperty(name,newValue);} -open(args){window.open(args);}} -window.mudWindow=new MudWindow();function setRippleOffset(event,target){const rect=target.getBoundingClientRect();const x=event.clientX-rect.left-rect.width/2;const y=event.clientY-rect.top-rect.height/2;target.style.setProperty("--mud-ripple-offset-x",`${x}px`);target.style.setProperty("--mud-ripple-offset-y",`${y}px`);} -document.addEventListener("click",function(event){const target=event.target.closest(".mud-ripple");if(target){setRippleOffset(event,target);}});class MudScrollSpy{constructor(){this.lastKnowElement=null;this.handlerRef=null;} +cancelListener(selector){let element=selector?document.querySelector(selector):document;element.removeEventListener('scroll',this.handlerRef);}};window.mudScrollListener=new MudScrollListener();window.mudInputAutoGrow={initAutoGrow:(elem,maxLines)=>{const compStyle=getComputedStyle(elem);const lineHeight=parseFloat(compStyle.getPropertyValue('line-height'));const paddingTop=parseFloat(compStyle.getPropertyValue('padding-top'));let maxHeight=0;elem.updateParameters=function(newMaxLines){if(newMaxLines>0){maxHeight=lineHeight*newMaxLines+paddingTop;}else{maxHeight=0;}} +elem.adjustAutoGrowHeight=function(didReflow=false){const scrollTops=[];let curElem=elem;while(curElem&&curElem.parentNode&&curElem.parentNode instanceof Element){if(curElem.parentNode.scrollTop){scrollTops.push([curElem.parentNode,curElem.parentNode.scrollTop]);} +curElem=curElem.parentNode;} +elem.style.height=0;if(didReflow){elem.style.textAlign=null;} +let minHeight=lineHeight*elem.rows+paddingTop;let newHeight=Math.max(minHeight,elem.scrollHeight);let initialOverflowY=elem.style.overflowY;if(maxHeight>0&&newHeight>maxHeight){elem.style.overflowY='auto';newHeight=maxHeight;}else{elem.style.overflowY='hidden';} +elem.style.height=newHeight+"px";scrollTops.forEach(([node,scrollTop])=>{node.style.scrollBehavior='auto';node.scrollTop=scrollTop;node.style.scrollBehavior=null;});if(!didReflow&&initialOverflowY!==elem.style.overflowY&&elem.style.overflowY==='hidden'){elem.style.textAlign='end';elem.adjustAutoGrowHeight(true);}} +elem.restoreToInitialState=function(){elem.removeEventListener('input',elem.adjustAutoGrowHeight);elem.style.overflowY=null;elem.style.height=null;} +elem.addEventListener('input',elem.adjustAutoGrowHeight);window.addEventListener('resize',elem.adjustAutoGrowHeight);elem.updateParameters(maxLines);elem.adjustAutoGrowHeight();},adjustHeight:(elem)=>{if(typeof elem.adjustAutoGrowHeight==='function'){elem.adjustAutoGrowHeight();}},updateParams:(elem,maxLines)=>{if(typeof elem.updateParameters==='function'){elem.updateParameters(maxLines);} +if(typeof elem.adjustAutoGrowHeight==='function'){elem.adjustAutoGrowHeight();}},destroy:(elem)=>{if(elem==null){return;} +window.removeEventListener('resize',elem.adjustAutoGrowHeight);if(typeof elem.restoreToInitialState==='function'){elem.restoreToInitialState();}}};class MudInput{resetValue(id){const input=document.getElementById(id);if(input){input.value='';}}} +window.mudInput=new MudInput();class MudFileUpload{openFilePicker(id){const element=document.getElementById(id);if(!element){return;} +try{element.showPicker();}catch(error){element.click();}}} +window.mudFileUpload=new MudFileUpload();class MudScrollSpy{constructor(){this.lastKnowElement=null;this.handlerRef=null;} spying(dotnetReference,containerSelector,sectionClassSelector){this.lastKnowElement=null;this.handlerRef=this.handleScroll.bind(this,dotnetReference,containerSelector,sectionClassSelector);document.addEventListener('scroll',this.handlerRef,true);window.addEventListener('resize',this.handlerRef,true);} handleScroll(dotnetReference,containerSelector,sectionClassSelector,event){const container=document.querySelector(containerSelector);if(container===null){return;} const elements=document.getElementsByClassName(sectionClassSelector);if(elements.length===0){return;} @@ -262,28 +240,81 @@ if(elementId!==this.lastKnowElement){this.lastKnowElement=elementId;history.repl activateSection(sectionId){const element=document.getElementById(sectionId);if(element){this.lastKnowElement=sectionId;history.replaceState(null,'',window.location.pathname+"#"+sectionId);}} scrollToSection(sectionId){if(sectionId){let element=document.getElementById(sectionId);if(element){element.scrollIntoView({behavior:'smooth',block:'center',inline:'start'});}} else{window.scrollTo({top:0,behavior:'smooth'});}} -unspy(){document.removeEventListener('scroll',this.handlerRef,true);window.removeEventListener('resize',this.handlerRef,true);}};window.mudScrollSpy=new MudScrollSpy();class MudThrottledEventManager{constructor(){this.mapper={};} -subscribe(eventName,elementId,projection,throotleInterval,key,properties,dotnetReference){const handlerRef=this.throttleEventHandler.bind(this,key);let elem=document.getElementById(elementId);if(elem){elem.addEventListener(eventName,handlerRef,false);let projector=null;if(projection){const parts=projection.split('.');let functionPointer=window;let functionReferenceFound=true;if(parts.length==0||parts.length==1){functionPointer=functionPointer[projection];} -else{for(let i=0;i0?this.throttleEventHandler.bind(this,key):this.eventHandler.bind(this,key);document.addEventListener(eventName,handlerRef,false);this.mapper[key]={eventName:eventName,handler:handlerRef,delay:throotleInterval,timerId:-1,reference:dotnetReference,elementId:document,properties:properties,projection:null,};} -throttleEventHandler(key,event){const entry=this.mapper[key];if(!entry){return;} -clearTimeout(entry.timerId);entry.timerId=window.setTimeout(this.eventHandler.bind(this,key,event),entry.delay);} -eventHandler(key,event){const entry=this.mapper[key];if(!entry){return;} -var elem=document.getElementById(entry.elementId);if(elem!=event.srcElement&&entry.elementId!=document){return;} -const eventEntry={};for(var i=0;i{return element.querySelectorAll("a[href]:not([tabindex='-1']),"+"area[href]:not([tabindex='-1']),"+"button:not([disabled]):not([tabindex='-1']),"+"input:not([disabled]):not([tabindex='-1']):not([type='hidden']),"+"select:not([disabled]):not([tabindex='-1']),"+"textarea:not([disabled]):not([tabindex='-1']),"+"iframe:not([tabindex='-1']),"+"details:not([tabindex='-1']),"+"[tabindex]:not([tabindex='-1']),"+"[contentEditable=true]:not([tabindex='-1'])");};window.serializeParameter=(data,spec)=>{if(typeof data=="undefined"||data===null){return null;} -if(typeof data==="number"||typeof data==="string"||typeof data=="boolean"){return data;} -let res=(Array.isArray(data))?[]:{};if(!spec){spec="*";} -for(let i in data){let currentMember=data[i];if(typeof currentMember==='function'||currentMember===null){continue;} -let currentMemberSpec;if(spec!="*"){currentMemberSpec=Array.isArray(data)?spec:spec[i];if(!currentMemberSpec){continue;}}else{currentMemberSpec="*"} -if(typeof currentMember==='object'){if(Array.isArray(currentMember)||currentMember.length){res[i]=[];for(let j=0;j{return darkThemeMediaQuery.matches;};function darkModeChangeListener(e){dotNetHelperTheme.invokeMethodAsync('SystemPreferenceChanged',e.matches);} -function watchDarkThemeMedia(dotNetHelper){dotNetHelperTheme=dotNetHelper;darkThemeMediaQuery.addEventListener('change',darkModeChangeListener);} -function stopWatchingDarkThemeMedia(){darkThemeMediaQuery.removeEventListener('change',darkModeChangeListener);} \ No newline at end of file +unspy(){document.removeEventListener('scroll',this.handlerRef,true);window.removeEventListener('resize',this.handlerRef,true);}};window.mudScrollSpy=new MudScrollSpy();class MudResizeListener{constructor(id){this.logger=function(message){};this.options={};this.throttleResizeHandlerId=-1;this.dotnet=undefined;this.breakpoint=-1;this.id=id;this.handleResize=this.throttleResizeHandler.bind(this);} +listenForResize(dotnetRef,options){if(this.dotnet){this.options=options;return;} +this.options=options;this.dotnet=dotnetRef;this.logger=options.enableLogging?console.log:(message)=>{};this.logger(`[MudBlazor]Reporting resize events at rate of:${this.options.reportRate}ms`);window.addEventListener("resize",this.handleResize,false);if(!this.options.suppressInitEvent){this.resizeHandler();} +this.breakpoint=this.getBreakpoint(window.innerWidth);} +throttleResizeHandler(){clearTimeout(this.throttleResizeHandlerId);this.throttleResizeHandlerId=window.setTimeout(this.resizeHandler.bind(this),this.options.reportRate);} +resizeHandler(){if(this.options.notifyOnBreakpointOnly){let bp=this.getBreakpoint(window.innerWidth);if(bp==this.breakpoint){return;} +this.breakpoint=bp;} +try{if(this.id){this.dotnet.invokeMethodAsync('RaiseOnResized',{height:window.innerHeight,width:window.innerWidth},this.getBreakpoint(window.innerWidth),this.id);} +else{this.dotnet.invokeMethodAsync('RaiseOnResized',{height:window.innerHeight,width:window.innerWidth},this.getBreakpoint(window.innerWidth));}}catch(error){this.logger("[MudBlazor] Error in resizeHandler:",{error});}} +cancelListener(){this.dotnet=undefined;window.removeEventListener("resize",this.handleResize);} +matchMedia(query){let m=window.matchMedia(query).matches;return m;} +getBrowserWindowSize(){return{height:window.innerHeight,width:window.innerWidth};} +getBreakpoint(width){if(width>=this.options.breakpointDefinitions["Xxl"]) +return 5;else if(width>=this.options.breakpointDefinitions["Xl"]) +return 4;else if(width>=this.options.breakpointDefinitions["Lg"]) +return 3;else if(width>=this.options.breakpointDefinitions["Md"]) +return 2;else if(width>=this.options.breakpointDefinitions["Sm"]) +return 1;else +return 0;}};window.mudResizeListener=new MudResizeListener();window.mudResizeListenerFactory={mapping:{},listenForResize:(dotnetRef,options,id)=>{var map=window.mudResizeListenerFactory.mapping;if(map[id]){return;} +var listener=new MudResizeListener(id);listener.listenForResize(dotnetRef,options);map[id]=listener;},cancelListener:(id)=>{var map=window.mudResizeListenerFactory.mapping;if(!map[id]){return;} +var listener=map[id];listener.cancelListener();delete map[id];},cancelListeners:(ids)=>{for(let i=0;i{};this.logger('[MudBlazor | KeyInterceptor] Interceptor initialized',{options});} +connect(element){if(!this._options) +return;if(!this._options.keys) +throw"_options.keys: array of KeyOptions expected";if(!this._options.targetClass) +throw"_options.targetClass: css class name expected";if(this._observer){return;} +var targetClass=this._options.targetClass;this.logger('[MudBlazor | KeyInterceptor] Start observing DOM of element for changes to child with class ',{element,targetClass});this._element=element;this._observer=new MutationObserver(this.onDomChanged);this._observer.mudKeyInterceptor=this;this._observer.observe(this._element,{attributes:false,childList:true,subtree:true});this._observedChildren=[];this._keyOptions={};this._regexOptions=[];for(const keyOption of this._options.keys){if(!keyOption||!keyOption.key){this.logger('[MudBlazor | KeyInterceptor] got invalid key options: ',keyOption);continue;} +this.setKeyOption(keyOption)} +this.logger('[MudBlazor | KeyInterceptor] key options: ',this._keyOptions);if(this._regexOptions.size>0) +this.logger('[MudBlazor | KeyInterceptor] regex options: ',this._regexOptions);for(const child of this._element.getElementsByClassName(targetClass)){this.attachHandlers(child);}} +setKeyOption(keyOption){if(keyOption.key.length>2&&keyOption.key.startsWith('/')&&keyOption.key.endsWith('/')){keyOption.regex=new RegExp(keyOption.key.substring(1,keyOption.key.length-1));this._regexOptions.push(keyOption);} +else +this._keyOptions[keyOption.key.toLowerCase()]=keyOption;var whitespace=new RegExp("\\s","g");keyOption.preventDown=(keyOption.preventDown||"none").replace(whitespace,"").toLowerCase();keyOption.preventUp=(keyOption.preventUp||"none").replace(whitespace,"").toLowerCase();keyOption.stopDown=(keyOption.stopDown||"none").replace(whitespace,"").toLowerCase();keyOption.stopUp=(keyOption.stopUp||"none").replace(whitespace,"").toLowerCase();} +updatekey(updatedOption){var option=this._keyOptions[updatedOption.key.toLowerCase()];option||this.logger('[MudBlazor | KeyInterceptor] updating option failed: key not registered');this.setKeyOption(updatedOption);this.logger('[MudBlazor | KeyInterceptor] updated option ',{option,updatedOption});} +disconnect(){if(!this._observer) +return;this.logger('[MudBlazor | KeyInterceptor] disconnect mutation observer and event handlers');this._observer.disconnect();this._observer=null;for(const child of this._observedChildren) +this.detachHandlers(child);} +attachHandlers(child){this.logger('[MudBlazor | KeyInterceptor] attaching handlers ',{child});if(this._observedChildren.indexOf(child)>-1){return;} +child.mudKeyInterceptor=this;child.addEventListener('keydown',this.onKeyDown);child.addEventListener('keyup',this.onKeyUp);this._observedChildren.push(child);} +detachHandlers(child){this.logger('[MudBlazor | KeyInterceptor] detaching handlers ',{child});child.removeEventListener('keydown',this.onKeyDown);child.removeEventListener('keyup',this.onKeyUp);this._observedChildren=this._observedChildren.filter(x=>x!==child);} +onDomChanged(mutationsList,observer){var self=this.mudKeyInterceptor;var targetClass=self._options.targetClass;for(const mutation of mutationsList){for(const element of mutation.addedNodes){if(element.classList&&element.classList.contains(targetClass)) +self.attachHandlers(element);} +for(const element of mutation.removedNodes){if(element.classList&&element.classList.contains(targetClass)) +self.detachHandlers(element);}}} +matchesKeyCombination(option,args){if(!option||option==="none") +return false;if(option==="any") +return true;var shift=args.shiftKey;var ctrl=args.ctrlKey;var alt=args.altKey;var meta=args.metaKey;var any=shift||ctrl||alt||meta;if(any&&option==="key+any") +return true;if(!any&&option.includes("key+none")) +return true;if(!any) +return false;var combi=`key${shift?"+shift":""}${ctrl?"+ctrl":""}${alt?"+alt":""}${meta?"+meta":""}`;return option.includes(combi);} +onKeyDown(args){var self=this.mudKeyInterceptor;if(!args.key){self.logger('[MudBlazor | KeyInterceptor] key is undefined',args);return;} +var key=args.key.toLowerCase();self.logger('[MudBlazor | KeyInterceptor] down "'+key+'"',args);var invoke=false;if(self._keyOptions.hasOwnProperty(key)){var keyOptions=self._keyOptions[key];self.logger('[MudBlazor | KeyInterceptor] options for "'+key+'"',keyOptions);self.processKeyDown(args,keyOptions);if(keyOptions.subscribeDown) +invoke=true;} +for(const keyOptions of self._regexOptions){if(keyOptions.regex.test(key)){self.logger('[MudBlazor | KeyInterceptor] regex options for "'+key+'"',keyOptions);self.processKeyDown(args,keyOptions);if(keyOptions.subscribeDown) +invoke=true;}} +if(invoke){var eventArgs=self.toKeyboardEventArgs(args);eventArgs.Type="keydown";self._dotNetRef.invokeMethodAsync('OnKeyDown',self._element.id,eventArgs);}} +processKeyDown(args,keyOptions){if(this.matchesKeyCombination(keyOptions.preventDown,args)) +args.preventDefault();if(this.matchesKeyCombination(keyOptions.stopDown,args)) +args.stopPropagation();} +onKeyUp(args){var self=this.mudKeyInterceptor;if(!args.key){self.logger('[MudBlazor | KeyInterceptor] key is undefined',args);return;} +var key=args.key.toLowerCase();self.logger('[MudBlazor | KeyInterceptor] up "'+key+'"',args);var invoke=false;if(self._keyOptions.hasOwnProperty(key)){var keyOptions=self._keyOptions[key];self.processKeyUp(args,keyOptions);if(keyOptions.subscribeUp) +invoke=true;} +for(const keyOptions of self._regexOptions){if(keyOptions.regex.test(key)){self.processKeyUp(args,keyOptions);if(keyOptions.subscribeUp) +invoke=true;}} +if(invoke){var eventArgs=self.toKeyboardEventArgs(args);eventArgs.Type="keyup";self._dotNetRef.invokeMethodAsync('OnKeyUp',self._element.id,eventArgs);}} +processKeyUp(args,keyOptions){if(this.matchesKeyCombination(keyOptions.preventUp,args)) +args.preventDefault();if(this.matchesKeyCombination(keyOptions.stopUp,args)) +args.stopPropagation();} +toKeyboardEventArgs(args){return{Key:args.key,Code:args.code,Location:args.location,Repeat:args.repeat,CtrlKey:args.ctrlKey,ShiftKey:args.shiftKey,AltKey:args.altKey,MetaKey:args.metaKey};}} \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor/MudBlazor.min.js.br b/app/MindWork AI Studio/wwwroot/system/MudBlazor/MudBlazor.min.js.br new file mode 100644 index 00000000..1d27d385 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor/MudBlazor.min.js.br differ diff --git a/app/MindWork AI Studio/wwwroot/system/MudBlazor/MudBlazor.min.js.gz b/app/MindWork AI Studio/wwwroot/system/MudBlazor/MudBlazor.min.js.gz new file mode 100644 index 00000000..330ca264 Binary files /dev/null and b/app/MindWork AI Studio/wwwroot/system/MudBlazor/MudBlazor.min.js.gz differ diff --git a/app/SourceCodeRules/SourceCodeRules/AnalyzerReleases.Shipped.md b/app/SourceCodeRules/SourceCodeRules/AnalyzerReleases.Shipped.md new file mode 100644 index 00000000..e6f97e74 --- /dev/null +++ b/app/SourceCodeRules/SourceCodeRules/AnalyzerReleases.Shipped.md @@ -0,0 +1,14 @@ +## Release 1.0 + +### New Rules + + Rule ID | Category | Severity | Notes +-----------|----------|----------|-------------------------------- + MWAIS0001 | Usage | Error | ProviderAccessAnalyzer + MWAIS0002 | Naming | Error | ConstStaticAnalyzer + MWAIS0003 | Naming | Error | UnderscorePrefixAnalyzer + MWAIS0004 | Usage | Error | RandomInstantiationAnalyzer + MWAIS0005 | Usage | Error | ThisUsageAnalyzer + MWAIS0006 | Style | Error | SwitchExpressionMethodAnalyzer + MWAIS0007 | Usage | Error | EmptyStringAnalyzer + MWAIS0008 | Naming | Error | LocalConstantsAnalyzer \ No newline at end of file diff --git a/app/SourceCodeRules/SourceCodeRules/AnalyzerReleases.Unshipped.md b/app/SourceCodeRules/SourceCodeRules/AnalyzerReleases.Unshipped.md new file mode 100644 index 00000000..5ae74b33 --- /dev/null +++ b/app/SourceCodeRules/SourceCodeRules/AnalyzerReleases.Unshipped.md @@ -0,0 +1,10 @@ +### New Rules + + Rule ID | Category | Severity | Notes +---------|----------|----------|------- + + +### Changed Rules + + Rule ID | New Category | New Severity | Old Category | Old Severity | Notes +---------|--------------|--------------|--------------|--------------|------- diff --git a/app/SourceCodeRules/SourceCodeRules/Identifier.cs b/app/SourceCodeRules/SourceCodeRules/Identifier.cs new file mode 100644 index 00000000..aa782cf9 --- /dev/null +++ b/app/SourceCodeRules/SourceCodeRules/Identifier.cs @@ -0,0 +1,13 @@ +namespace SourceCodeRules; + +public static class Identifier +{ + public const string PROVIDER_ACCESS_ANALYZER = $"{Tools.ID_PREFIX}0001"; + public const string CONST_STATIC_ANALYZER = $"{Tools.ID_PREFIX}0002"; + public const string UNDERSCORE_PREFIX_ANALYZER = $"{Tools.ID_PREFIX}0003"; + public const string RANDOM_INSTANTIATION_ANALYZER = $"{Tools.ID_PREFIX}0004"; + public const string THIS_USAGE_ANALYZER = $"{Tools.ID_PREFIX}0005"; + public const string SWITCH_EXPRESSION_METHOD_ANALYZER = $"{Tools.ID_PREFIX}0006"; + public const string EMPTY_STRING_ANALYZER = $"{Tools.ID_PREFIX}0007"; + public const string LOCAL_CONSTANTS_ANALYZER = $"{Tools.ID_PREFIX}0008"; +} \ No newline at end of file diff --git a/app/SourceCodeRules/SourceCodeRules/NamingAnalyzers/ConstStaticAnalyzer.cs b/app/SourceCodeRules/SourceCodeRules/NamingAnalyzers/ConstStaticAnalyzer.cs new file mode 100644 index 00000000..d3273132 --- /dev/null +++ b/app/SourceCodeRules/SourceCodeRules/NamingAnalyzers/ConstStaticAnalyzer.cs @@ -0,0 +1,67 @@ +using System.Collections.Immutable; +using System.Linq; + +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Diagnostics; + +namespace SourceCodeRules.NamingAnalyzers; + +#pragma warning disable RS1038 +[DiagnosticAnalyzer(LanguageNames.CSharp)] +#pragma warning restore RS1038 +public sealed class ConstStaticAnalyzer : DiagnosticAnalyzer +{ + private const string DIAGNOSTIC_ID = Identifier.CONST_STATIC_ANALYZER; + + private static readonly string TITLE = "Constant and static fields must be in UPPER_CASE"; + + private static readonly string MESSAGE_FORMAT = "Field '{0}' must be in UPPER_CASE"; + + private static readonly string DESCRIPTION = "All constant and static fields should be named using UPPER_CASE."; + + private const string CATEGORY = "Naming"; + + private static readonly DiagnosticDescriptor RULE = new(DIAGNOSTIC_ID, TITLE, MESSAGE_FORMAT, CATEGORY, DiagnosticSeverity.Error, isEnabledByDefault: true, description: DESCRIPTION); + + public override ImmutableArray SupportedDiagnostics => [RULE]; + + public override void Initialize(AnalysisContext context) + { + context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); + context.EnableConcurrentExecution(); + context.RegisterSyntaxNodeAction(this.AnalyzeField, SyntaxKind.FieldDeclaration); + } + + private void AnalyzeField(SyntaxNodeAnalysisContext context) + { + var fieldDeclaration = (FieldDeclarationSyntax)context.Node; + + // Prüfen ob das Feld static oder const ist + if (!fieldDeclaration.Modifiers.Any(m => m.IsKind(SyntaxKind.StaticKeyword) || m.IsKind(SyntaxKind.ConstKeyword))) + return; + + foreach (var variable in fieldDeclaration.Declaration.Variables) + { + var fieldName = variable.Identifier.Text; + + // Prüfen ob der Name bereits in UPPER_CASE ist + if (!IsUpperCase(fieldName)) + { + var diagnostic = Diagnostic.Create( + RULE, + variable.Identifier.GetLocation(), + fieldName); + + context.ReportDiagnostic(diagnostic); + } + } + } + + private static bool IsUpperCase(string name) + { + // Erlaubt: Nur Großbuchstaben, Zahlen und Unterstriche + return name.All(c => char.IsUpper(c) || char.IsDigit(c) || c == '_'); + } +} \ No newline at end of file diff --git a/app/SourceCodeRules/SourceCodeRules/NamingAnalyzers/LocalConstantsAnalyzer.cs b/app/SourceCodeRules/SourceCodeRules/NamingAnalyzers/LocalConstantsAnalyzer.cs new file mode 100644 index 00000000..da0e130e --- /dev/null +++ b/app/SourceCodeRules/SourceCodeRules/NamingAnalyzers/LocalConstantsAnalyzer.cs @@ -0,0 +1,63 @@ +using System.Collections.Immutable; +using System.Linq; + +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Diagnostics; + +namespace SourceCodeRules.NamingAnalyzers; + +#pragma warning disable RS1038 +[DiagnosticAnalyzer(LanguageNames.CSharp)] +#pragma warning restore RS1038 +public sealed class LocalConstantsAnalyzer : DiagnosticAnalyzer +{ + private const string DIAGNOSTIC_ID = Identifier.LOCAL_CONSTANTS_ANALYZER; + + private static readonly string TITLE = "Local constant variables must be in UPPER_CASE"; + + private static readonly string MESSAGE_FORMAT = "Local constant variable '{0}' must be in UPPER_CASE"; + + private static readonly string DESCRIPTION = "All local constant variables should be named using UPPER_CASE with words separated by underscores."; + + private const string CATEGORY = "Naming"; + + private static readonly DiagnosticDescriptor RULE = new( + DIAGNOSTIC_ID, + TITLE, + MESSAGE_FORMAT, + CATEGORY, + DiagnosticSeverity.Error, + isEnabledByDefault: true, + description: DESCRIPTION); + + public override ImmutableArray SupportedDiagnostics => [RULE]; + + public override void Initialize(AnalysisContext context) + { + context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); + context.EnableConcurrentExecution(); + context.RegisterSyntaxNodeAction(AnalyzeLocalDeclaration, SyntaxKind.LocalDeclarationStatement); + } + + private static void AnalyzeLocalDeclaration(SyntaxNodeAnalysisContext context) + { + var localDeclaration = (LocalDeclarationStatementSyntax)context.Node; + if (!localDeclaration.Modifiers.Any(m => m.IsKind(SyntaxKind.ConstKeyword))) + return; + + foreach (var variable in localDeclaration.Declaration.Variables) + { + var variableName = variable.Identifier.Text; + if (!IsUpperCase(variableName)) + { + var diagnostic = Diagnostic.Create(RULE, variable.Identifier.GetLocation(), variableName); + context.ReportDiagnostic(diagnostic); + } + } + } + + private static bool IsUpperCase(string name) => name.All(c => char.IsUpper(c) || char.IsDigit(c) || c == '_') && + !string.IsNullOrEmpty(name) && name.Any(char.IsLetter); +} \ No newline at end of file diff --git a/app/SourceCodeRules/SourceCodeRules/NamingAnalyzers/UnderscorePrefixAnalyzer.cs b/app/SourceCodeRules/SourceCodeRules/NamingAnalyzers/UnderscorePrefixAnalyzer.cs new file mode 100644 index 00000000..6f35469c --- /dev/null +++ b/app/SourceCodeRules/SourceCodeRules/NamingAnalyzers/UnderscorePrefixAnalyzer.cs @@ -0,0 +1,46 @@ +using System.Collections.Immutable; + +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Diagnostics; + +namespace SourceCodeRules.NamingAnalyzers; + +#pragma warning disable RS1038 +[DiagnosticAnalyzer(LanguageNames.CSharp)] +#pragma warning restore RS1038 +public sealed class UnderscorePrefixAnalyzer : DiagnosticAnalyzer +{ + private const string DIAGNOSTIC_ID = Identifier.UNDERSCORE_PREFIX_ANALYZER; + + private static readonly string TITLE = "Variable names cannot start with underscore"; + + private static readonly string MESSAGE_FORMAT = "The variable name '{0}' starts with an underscore which is not allowed"; + + private static readonly string DESCRIPTION = "Variable names cannot start with an underscore prefix."; + + private const string CATEGORY = "Naming"; + + private static readonly DiagnosticDescriptor RULE = new(DIAGNOSTIC_ID, TITLE, MESSAGE_FORMAT, CATEGORY, DiagnosticSeverity.Error, isEnabledByDefault: true, description: DESCRIPTION); + + public override ImmutableArray SupportedDiagnostics => [RULE]; + + public override void Initialize(AnalysisContext context) + { + context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); + context.EnableConcurrentExecution(); + context.RegisterSyntaxNodeAction(AnalyzeVariableDeclaration, SyntaxKind.VariableDeclarator); + } + + private static void AnalyzeVariableDeclaration(SyntaxNodeAnalysisContext context) + { + var variableDeclarator = (VariableDeclaratorSyntax)context.Node; + var variableName = variableDeclarator.Identifier.Text; + if (variableName.StartsWith("_")) + { + var diagnostic = Diagnostic.Create(RULE, variableDeclarator.Identifier.GetLocation(), variableName); + context.ReportDiagnostic(diagnostic); + } + } +} \ No newline at end of file diff --git a/app/SourceCodeRules/SourceCodeRules/NamingCodeFixes/ConvertToUpperCodeFixProvider.cs b/app/SourceCodeRules/SourceCodeRules/NamingCodeFixes/ConvertToUpperCodeFixProvider.cs new file mode 100644 index 00000000..961e7e04 --- /dev/null +++ b/app/SourceCodeRules/SourceCodeRules/NamingCodeFixes/ConvertToUpperCodeFixProvider.cs @@ -0,0 +1,67 @@ +using System.Collections.Immutable; +using System.Composition; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CodeActions; +using Microsoft.CodeAnalysis.CodeFixes; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Rename; + +namespace SourceCodeRules.NamingCodeFixes; + +[ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(ConvertToUpperCodeFixProvider)), Shared] +public sealed class ConvertToUpperCodeFixProvider : CodeFixProvider +{ + public override ImmutableArray FixableDiagnosticIds => [Identifier.CONST_STATIC_ANALYZER, Identifier.LOCAL_CONSTANTS_ANALYZER]; + + public override FixAllProvider GetFixAllProvider() => WellKnownFixAllProviders.BatchFixer; + + public override async Task RegisterCodeFixesAsync(CodeFixContext context) + { + var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken); + var diagnostic = context.Diagnostics.First(); + var diagnosticSpan = diagnostic.Location.SourceSpan; + var declaration = root?.FindToken(diagnosticSpan.Start).Parent?.AncestorsAndSelf().OfType().First(); + if (declaration is null) + return; + + context.RegisterCodeFix(CodeAction.Create(title: "Convert to UPPER_CASE", createChangedDocument: c => this.ConvertToUpperCaseAsync(context.Document, declaration, c), equivalenceKey: nameof(ConvertToUpperCodeFixProvider)), diagnostic); + } + + private async Task ConvertToUpperCaseAsync(Document document, VariableDeclaratorSyntax declarator, CancellationToken cancellationToken) + { + var oldName = declarator.Identifier.Text; + var newName = ConvertToUpperCase(oldName); + + var semanticModel = await document.GetSemanticModelAsync(cancellationToken); + var symbol = semanticModel?.GetDeclaredSymbol(declarator, cancellationToken); + if (symbol is null) + return document; + + var solution = document.Project.Solution; + var newSolution = await Renamer.RenameSymbolAsync(solution, symbol, new SymbolRenameOptions(), newName, cancellationToken); + + return newSolution.GetDocument(document.Id) ?? document; + } + + private static string ConvertToUpperCase(string name) + { + var result = new StringBuilder(); + for (var i = 0; i < name.Length; i++) + { + var current = name[i]; + + // Insert an underscore before each uppercase letter, except the first one: + if (i > 0 && char.IsUpper(current) && !char.IsUpper(name[i - 1])) + result.Append('_'); + + result.Append(char.ToUpper(current)); + } + + return result.ToString(); + } +} \ No newline at end of file diff --git a/app/SourceCodeRules/SourceCodeRules/NamingCodeFixes/UnderscorePrefixCodeFixProvider.cs b/app/SourceCodeRules/SourceCodeRules/NamingCodeFixes/UnderscorePrefixCodeFixProvider.cs new file mode 100644 index 00000000..6308e572 --- /dev/null +++ b/app/SourceCodeRules/SourceCodeRules/NamingCodeFixes/UnderscorePrefixCodeFixProvider.cs @@ -0,0 +1,54 @@ +using System.Collections.Immutable; +using System.Composition; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CodeActions; +using Microsoft.CodeAnalysis.CodeFixes; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Rename; + +namespace SourceCodeRules.NamingCodeFixes; + +[ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(UnderscorePrefixCodeFixProvider)), Shared] +public sealed class UnderscorePrefixCodeFixProvider : CodeFixProvider +{ + public override ImmutableArray FixableDiagnosticIds => [Identifier.UNDERSCORE_PREFIX_ANALYZER]; + + public override FixAllProvider GetFixAllProvider() => WellKnownFixAllProviders.BatchFixer; + + public override async Task RegisterCodeFixesAsync(CodeFixContext context) + { + var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken); + var diagnostic = context.Diagnostics.First(); + var diagnosticSpan = diagnostic.Location.SourceSpan; + var declaration = root?.FindToken(diagnosticSpan.Start).Parent?.AncestorsAndSelf().OfType().First(); + if (declaration is null) + return; + + context.RegisterCodeFix( + CodeAction.Create( + title: "Remove underscore prefix", + createChangedDocument: c => this.RemoveUnderscorePrefixAsync(context.Document, declaration, c), + equivalenceKey: nameof(UnderscorePrefixCodeFixProvider)), + diagnostic); + } + + private async Task RemoveUnderscorePrefixAsync(Document document, VariableDeclaratorSyntax declarator, CancellationToken cancellationToken) + { + var oldName = declarator.Identifier.Text; + var newName = oldName.TrimStart('_'); + + var semanticModel = await document.GetSemanticModelAsync(cancellationToken); + var symbol = semanticModel?.GetDeclaredSymbol(declarator, cancellationToken); + if (symbol is null) + return document; + + var solution = document.Project.Solution; + var newSolution = await Renamer.RenameSymbolAsync(solution, symbol, new SymbolRenameOptions(), newName, cancellationToken); + + return newSolution.GetDocument(document.Id) ?? document; + } +} \ No newline at end of file diff --git a/app/SourceCodeRules/SourceCodeRules/SourceCodeRules.csproj b/app/SourceCodeRules/SourceCodeRules/SourceCodeRules.csproj new file mode 100644 index 00000000..8cf49a2a --- /dev/null +++ b/app/SourceCodeRules/SourceCodeRules/SourceCodeRules.csproj @@ -0,0 +1,26 @@ + + + + netstandard2.0 + false + enable + latest + + true + true + + SourceCodeRules + SourceCodeRules + 1.0.0 + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + diff --git a/app/SourceCodeRules/SourceCodeRules/StyleAnalyzers/SwitchExpressionMethodAnalyzer.cs b/app/SourceCodeRules/SourceCodeRules/StyleAnalyzers/SwitchExpressionMethodAnalyzer.cs new file mode 100644 index 00000000..2bd7f80e --- /dev/null +++ b/app/SourceCodeRules/SourceCodeRules/StyleAnalyzers/SwitchExpressionMethodAnalyzer.cs @@ -0,0 +1,96 @@ +using System.Collections.Immutable; + +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Diagnostics; + +namespace SourceCodeRules.StyleAnalyzers; + +#pragma warning disable RS1038 +[DiagnosticAnalyzer(LanguageNames.CSharp)] +#pragma warning restore RS1038 +public class SwitchExpressionMethodAnalyzer : DiagnosticAnalyzer +{ + private const string DIAGNOSTIC_ID = Identifier.SWITCH_EXPRESSION_METHOD_ANALYZER; + + private static readonly string TITLE = "Method with switch expression should use inline expression body"; + + private static readonly string MESSAGE_FORMAT = "Method with a switch expression should use inline expression body syntax with the switch keyword on the same line"; + + private static readonly string DESCRIPTION = "Methods that only return a switch expression should use the expression body syntax (=>) with the switch keyword on the same line for better readability."; + + private const string CATEGORY = "Style"; + + private static readonly DiagnosticDescriptor RULE = new( + DIAGNOSTIC_ID, + TITLE, + MESSAGE_FORMAT, + CATEGORY, + DiagnosticSeverity.Error, + isEnabledByDefault: true, + description: DESCRIPTION); + + public override ImmutableArray SupportedDiagnostics => [RULE]; + + public override void Initialize(AnalysisContext context) + { + context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); + context.EnableConcurrentExecution(); + context.RegisterSyntaxNodeAction(AnalyzeMethodDeclaration, SyntaxKind.MethodDeclaration); + } + + private static void AnalyzeMethodDeclaration(SyntaxNodeAnalysisContext context) + { + var methodDeclaration = (MethodDeclarationSyntax)context.Node; + + // Fall 1: Methode hat Block-Body mit einem Return-Statement, das eine Switch-Expression ist + if (methodDeclaration is { Body: not null, ExpressionBody: null }) + { + var statements = methodDeclaration.Body.Statements; + if (statements.Count == 1 && statements[0] is ReturnStatementSyntax { Expression: SwitchExpressionSyntax }) + { + var diagnostic = Diagnostic.Create(RULE, methodDeclaration.Identifier.GetLocation()); + context.ReportDiagnostic(diagnostic); + return; + } + } + + // Fall 2: Methode hat Expression-Body, aber die Switch-Expression beginnt auf einer neuen Zeile + var expressionBody = methodDeclaration.ExpressionBody; + if (expressionBody?.Expression is SwitchExpressionSyntax switchExpr) + { + var arrowToken = expressionBody.ArrowToken; + var switchToken = switchExpr.SwitchKeyword; + bool hasNewLineBetweenArrowAndSwitch = false; + + foreach (var trivia in arrowToken.TrailingTrivia) + { + if (trivia.IsKind(SyntaxKind.EndOfLineTrivia)) + { + hasNewLineBetweenArrowAndSwitch = true; + break; + } + } + + // Prüfe Leading Trivia des Switch-Keywords, falls notwendig + if (!hasNewLineBetweenArrowAndSwitch) + { + foreach (var trivia in switchToken.LeadingTrivia) + { + if (trivia.IsKind(SyntaxKind.EndOfLineTrivia)) + { + hasNewLineBetweenArrowAndSwitch = true; + break; + } + } + } + + if (hasNewLineBetweenArrowAndSwitch) + { + var diagnostic = Diagnostic.Create(RULE, methodDeclaration.Identifier.GetLocation()); + context.ReportDiagnostic(diagnostic); + } + } + } +} \ No newline at end of file diff --git a/app/SourceCodeRules/SourceCodeRules/StyleCodeFixes/SwitchExpressionMethodCodeFixProvider.cs b/app/SourceCodeRules/SourceCodeRules/StyleCodeFixes/SwitchExpressionMethodCodeFixProvider.cs new file mode 100644 index 00000000..d89751ff --- /dev/null +++ b/app/SourceCodeRules/SourceCodeRules/StyleCodeFixes/SwitchExpressionMethodCodeFixProvider.cs @@ -0,0 +1,162 @@ +using System.Collections.Immutable; +using System.Composition; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CodeActions; +using Microsoft.CodeAnalysis.CodeFixes; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Text; + +namespace SourceCodeRules.StyleCodeFixes; + +[ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(SwitchExpressionMethodCodeFixProvider)), Shared] +public class SwitchExpressionMethodCodeFixProvider : CodeFixProvider +{ + public sealed override ImmutableArray FixableDiagnosticIds => [Identifier.SWITCH_EXPRESSION_METHOD_ANALYZER]; + + public sealed override FixAllProvider GetFixAllProvider() => WellKnownFixAllProviders.BatchFixer; + + public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context) + { + var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false); + if (root == null) + return; + + var diagnostic = context.Diagnostics.First(); + var diagnosticSpan = diagnostic.Location.SourceSpan; + var methodDeclaration = root.FindToken(diagnosticSpan.Start) + .Parent?.AncestorsAndSelf() + .OfType() + .First(); + + if(methodDeclaration == null) + return; + + context.RegisterCodeFix( + CodeAction.Create( + title: "Use inline expression body for switch expression", + createChangedDocument: c => UseInlineExpressionBodyAsync(context.Document, methodDeclaration, c), + equivalenceKey: nameof(SwitchExpressionMethodCodeFixProvider)), + diagnostic); + } + + private static async Task UseInlineExpressionBodyAsync(Document document, MethodDeclarationSyntax methodDecl, CancellationToken cancellationToken) + { + var sourceText = await document.GetTextAsync(cancellationToken); + var parameterText = methodDecl.ParameterList.ToString(); + var methodStartLine = sourceText.Lines.GetLineFromPosition(methodDecl.SpanStart); + + SwitchExpressionSyntax? switchExpr = null; + ExpressionSyntax? governingExpression = null; + var switchBodyText = string.Empty; + + if (methodDecl.Body != null) + { + // Case: Block-Body with a Return-Statement that contains a Switch-Expression + var returnStmt = (ReturnStatementSyntax)methodDecl.Body.Statements[0]; + if (returnStmt.Expression is not SwitchExpressionSyntax matchingSwitchExpr) + return document; + + switchExpr = matchingSwitchExpr; + governingExpression = switchExpr.GoverningExpression; + + // Extract the switch body text: + var switchStart = switchExpr.SwitchKeyword.SpanStart; + var switchEnd = switchExpr.CloseBraceToken.Span.End; + switchBodyText = sourceText.ToString(TextSpan.FromBounds(switchStart, switchEnd)); + } + else if (methodDecl.ExpressionBody != null) + { + // Case 2: Expression-Body with a poorly formatted Switch-Expression + switchExpr = (SwitchExpressionSyntax)methodDecl.ExpressionBody.Expression; + governingExpression = switchExpr.GoverningExpression; + + // Extract the switch body text: + var switchStart = switchExpr.SwitchKeyword.SpanStart; + var switchEnd = switchExpr.CloseBraceToken.Span.End; + switchBodyText = sourceText.ToString(TextSpan.FromBounds(switchStart, switchEnd)); + } + + if (switchExpr is null || governingExpression is null) + return document; + + // Extract the governing expression and the switch body: + var govExprText = sourceText.ToString(governingExpression.Span); + + // Create the new method with inline expression body and correct formatting: + var returnTypeText = methodDecl.ReturnType.ToString(); + var modifiersText = string.Join(" ", methodDecl.Modifiers); + var methodNameText = methodDecl.Identifier.Text; + + // Determine the indentation of the method: + var methodIndentation = ""; + for (var i = methodStartLine.Start; i < methodDecl.SpanStart; i++) + { + if (char.IsWhiteSpace(sourceText[i])) + methodIndentation += sourceText[i]; + else + break; + } + + // Erstelle die neue Methode mit Expression-Body und korrekter Formatierung + var newMethodText = new StringBuilder(); + newMethodText.Append($"{modifiersText} {returnTypeText} {methodNameText}{parameterText} => {govExprText} switch"); + + // Formatiere die geschweiften Klammern und den Switch-Body + var switchBody = switchBodyText.Substring("switch".Length).Trim(); + + // Bestimme die Einrückung für die Switch-Cases (4 Spaces oder 1 Tab mehr als die Methode) + var caseIndentation = methodIndentation + " "; // 4 Spaces Einrückung + + // Verarbeite die Klammern und formatiere den Body + var formattedSwitchBody = FormatSwitchBody(switchBody, methodIndentation, caseIndentation); + newMethodText.Append(formattedSwitchBody); + + // Ersetze die alte Methoden-Deklaration mit dem neuen Text + var newText = sourceText.Replace(methodDecl.Span, newMethodText.ToString()); + return document.WithText(newText); + } + + private static string FormatSwitchBody(string switchBody, string methodIndentation, string caseIndentation) + { + var result = new StringBuilder(); + + // Remove braces from the switch body: + var bodyWithoutBraces = switchBody.Trim(); + if (bodyWithoutBraces.StartsWith("{")) + bodyWithoutBraces = bodyWithoutBraces.Substring(1); + if (bodyWithoutBraces.EndsWith("}")) + bodyWithoutBraces = bodyWithoutBraces.Substring(0, bodyWithoutBraces.Length - 1); + + bodyWithoutBraces = bodyWithoutBraces.Trim(); + + // Add braces with correct indentation: + result.AppendLine(); + result.Append($"{methodIndentation}{{"); + + // Process each line of the switch body: + var lines = bodyWithoutBraces.Split(["\r\n", "\n"], System.StringSplitOptions.None); + foreach (var line in lines) + { + result.AppendLine(); + + var trimmedLine = line.Trim(); + if (string.IsNullOrWhiteSpace(trimmedLine)) + continue; + + // Add correct indentation for each case: + result.Append(caseIndentation); + result.Append(trimmedLine); + } + + // Add the closing brace with correct indentation: + result.AppendLine(); + result.Append($"{methodIndentation}}};"); + + return result.ToString(); + } +} \ No newline at end of file diff --git a/app/SourceCodeRules/SourceCodeRules/Tools.cs b/app/SourceCodeRules/SourceCodeRules/Tools.cs new file mode 100644 index 00000000..aa83af87 --- /dev/null +++ b/app/SourceCodeRules/SourceCodeRules/Tools.cs @@ -0,0 +1,6 @@ +namespace SourceCodeRules; + +public static class Tools +{ + public const string ID_PREFIX = "MWAIS"; +} \ No newline at end of file diff --git a/app/SourceCodeRules/SourceCodeRules/UsageAnalyzers/EmptyStringAnalyzer.cs b/app/SourceCodeRules/SourceCodeRules/UsageAnalyzers/EmptyStringAnalyzer.cs new file mode 100644 index 00000000..5092d436 --- /dev/null +++ b/app/SourceCodeRules/SourceCodeRules/UsageAnalyzers/EmptyStringAnalyzer.cs @@ -0,0 +1,88 @@ +using System.Collections.Immutable; + +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Diagnostics; + +namespace SourceCodeRules.UsageAnalyzers; + +#pragma warning disable RS1038 +[DiagnosticAnalyzer(LanguageNames.CSharp)] +#pragma warning restore RS1038 +public sealed class EmptyStringAnalyzer : DiagnosticAnalyzer +{ + private const string DIAGNOSTIC_ID = Identifier.EMPTY_STRING_ANALYZER; + + private static readonly string TITLE = """ + Use string.Empty instead of "" + """; + + private static readonly string MESSAGE_FORMAT = """ + Use string.Empty instead of "" + """; + + private static readonly string DESCRIPTION = """Empty string literals ("") should be replaced with string.Empty for better code consistency and readability except in const contexts."""; + + private const string CATEGORY = "Usage"; + + private static readonly DiagnosticDescriptor RULE = new(DIAGNOSTIC_ID, TITLE, MESSAGE_FORMAT, CATEGORY, DiagnosticSeverity.Error, isEnabledByDefault: true, description: DESCRIPTION); + + public override ImmutableArray SupportedDiagnostics => [RULE]; + + public override void Initialize(AnalysisContext context) + { + context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); + context.EnableConcurrentExecution(); + context.RegisterSyntaxNodeAction(AnalyzeEmptyStringLiteral, SyntaxKind.StringLiteralExpression); + } + + private static void AnalyzeEmptyStringLiteral(SyntaxNodeAnalysisContext context) + { + var stringLiteral = (LiteralExpressionSyntax)context.Node; + if (stringLiteral.Token.ValueText != string.Empty) + return; + + if (IsInConstContext(stringLiteral)) + return; + + if (IsInParameterDefaultValue(stringLiteral)) + return; + + var diagnostic = Diagnostic.Create(RULE, stringLiteral.GetLocation()); + context.ReportDiagnostic(diagnostic); + } + + private static bool IsInConstContext(LiteralExpressionSyntax stringLiteral) + { + var variableDeclarator = stringLiteral.FirstAncestorOrSelf(); + if (variableDeclarator is null) + return false; + + var declaration = variableDeclarator.Parent?.Parent; + return declaration switch + { + FieldDeclarationSyntax fieldDeclaration => fieldDeclaration.Modifiers.Any(SyntaxKind.ConstKeyword), + LocalDeclarationStatementSyntax localDeclaration => localDeclaration.Modifiers.Any(SyntaxKind.ConstKeyword), + + _ => false + }; + } + + private static bool IsInParameterDefaultValue(LiteralExpressionSyntax stringLiteral) + { + // Prüfen, ob das String-Literal Teil eines Parameter-Defaults ist + var parameter = stringLiteral.FirstAncestorOrSelf(); + if (parameter is null) + return false; + + // Überprüfen, ob das String-Literal im Default-Wert des Parameters verwendet wird + if (parameter.Default is not null && + parameter.Default.Value == stringLiteral) + { + return true; + } + + return false; + } +} \ No newline at end of file diff --git a/app/SourceCodeRules/SourceCodeRules/UsageAnalyzers/ProviderAccessAnalyzer.cs b/app/SourceCodeRules/SourceCodeRules/UsageAnalyzers/ProviderAccessAnalyzer.cs new file mode 100644 index 00000000..a2db69df --- /dev/null +++ b/app/SourceCodeRules/SourceCodeRules/UsageAnalyzers/ProviderAccessAnalyzer.cs @@ -0,0 +1,71 @@ +using System.Collections.Generic; +using System.Collections.Immutable; + +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Diagnostics; + +namespace SourceCodeRules.UsageAnalyzers; + +#pragma warning disable RS1038 +[DiagnosticAnalyzer(LanguageNames.CSharp)] +#pragma warning restore RS1038 +public sealed class ProviderAccessAnalyzer : DiagnosticAnalyzer +{ + private const string DIAGNOSTIC_ID = Identifier.PROVIDER_ACCESS_ANALYZER; + + private static readonly string TITLE = "Direct access to `Providers` is not allowed"; + + private static readonly string MESSAGE_FORMAT = "Direct access to `SettingsManager.ConfigurationData.Providers` is not allowed. Instead, use APIs like `SettingsManager.GetPreselectedProvider`, etc."; + + private static readonly string DESCRIPTION = MESSAGE_FORMAT; + + private const string CATEGORY = "Usage"; + + private static readonly DiagnosticDescriptor RULE = new(DIAGNOSTIC_ID, TITLE, MESSAGE_FORMAT, CATEGORY, DiagnosticSeverity.Error, isEnabledByDefault: true, description: DESCRIPTION); + + public override ImmutableArray SupportedDiagnostics => [RULE]; + + public override void Initialize(AnalysisContext context) + { + context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); + context.EnableConcurrentExecution(); + context.RegisterSyntaxNodeAction(this.AnalyzeMemberAccess, SyntaxKind.SimpleMemberAccessExpression); + } + + private void AnalyzeMemberAccess(SyntaxNodeAnalysisContext context) + { + var memberAccess = (MemberAccessExpressionSyntax)context.Node; + + // Check if the member access is not on the `Providers` property: + if (memberAccess.Name.Identifier.Text != "Providers") + return; + + // Get the full path of the member access: + var fullPath = this.GetFullMemberAccessPath(memberAccess); + + // Check for the forbidden pattern: + if (fullPath.EndsWith("ConfigurationData.Providers")) + { + var diagnostic = Diagnostic.Create(RULE, memberAccess.GetLocation()); + context.ReportDiagnostic(diagnostic); + } + } + + private string GetFullMemberAccessPath(ExpressionSyntax expression) + { + var parts = new List(); + while (expression is MemberAccessExpressionSyntax memberAccess) + { + parts.Add(memberAccess.Name.Identifier.Text); + expression = memberAccess.Expression; + } + + if (expression is IdentifierNameSyntax identifier) + parts.Add(identifier.Identifier.Text); + + parts.Reverse(); + return string.Join(".", parts); + } +} \ No newline at end of file diff --git a/app/SourceCodeRules/SourceCodeRules/UsageAnalyzers/RandomInstantiationAnalyzer.cs b/app/SourceCodeRules/SourceCodeRules/UsageAnalyzers/RandomInstantiationAnalyzer.cs new file mode 100644 index 00000000..8244aa8e --- /dev/null +++ b/app/SourceCodeRules/SourceCodeRules/UsageAnalyzers/RandomInstantiationAnalyzer.cs @@ -0,0 +1,55 @@ +using System.Collections.Immutable; + +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Diagnostics; + +namespace SourceCodeRules.UsageAnalyzers; + +#pragma warning disable RS1038 +[DiagnosticAnalyzer(LanguageNames.CSharp)] +#pragma warning restore RS1038 +public class RandomInstantiationAnalyzer : DiagnosticAnalyzer +{ + private const string DIAGNOSTIC_ID = Identifier.RANDOM_INSTANTIATION_ANALYZER; + + private static readonly string TITLE = "Direct instantiation of Random is not allowed"; + + private static readonly string MESSAGE_FORMAT = "Do not use 'new Random()'. Instead, inject and use the ThreadSafeRandom service from the DI container."; + + private static readonly string DESCRIPTION = "Using 'new Random()' can lead to issues in multi-threaded scenarios. Use the ThreadSafeRandom service instead."; + + private const string CATEGORY = "Usage"; + + private static readonly DiagnosticDescriptor RULE = new( + DIAGNOSTIC_ID, + TITLE, + MESSAGE_FORMAT, + CATEGORY, + DiagnosticSeverity.Error, + isEnabledByDefault: true, + description: DESCRIPTION); + + public override ImmutableArray SupportedDiagnostics => [RULE]; + + public override void Initialize(AnalysisContext context) + { + context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); + context.EnableConcurrentExecution(); + context.RegisterSyntaxNodeAction(this.AnalyzeObjectCreation, SyntaxKind.ObjectCreationExpression); + } + + private void AnalyzeObjectCreation(SyntaxNodeAnalysisContext context) + { + var objectCreation = (ObjectCreationExpressionSyntax)context.Node; + if (context.SemanticModel.GetSymbolInfo(objectCreation.Type).Symbol is not ITypeSymbol typeSymbol) + return; + + if (typeSymbol.ToString() == "System.Random" || typeSymbol is { Name: "Random", ContainingNamespace.Name: "System" }) + { + var diagnostic = Diagnostic.Create(RULE, objectCreation.GetLocation()); + context.ReportDiagnostic(diagnostic); + } + } +} \ No newline at end of file diff --git a/app/SourceCodeRules/SourceCodeRules/UsageAnalyzers/ThisUsageAnalyzer.cs b/app/SourceCodeRules/SourceCodeRules/UsageAnalyzers/ThisUsageAnalyzer.cs new file mode 100644 index 00000000..f48c374b --- /dev/null +++ b/app/SourceCodeRules/SourceCodeRules/UsageAnalyzers/ThisUsageAnalyzer.cs @@ -0,0 +1,236 @@ +using System.Collections.Immutable; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Diagnostics; + +namespace SourceCodeRules.UsageAnalyzers; +#pragma warning disable RS1038 +[DiagnosticAnalyzer(LanguageNames.CSharp)] +#pragma warning restore RS1038 +public sealed class ThisUsageAnalyzer : DiagnosticAnalyzer +{ + private const string DIAGNOSTIC_ID = Identifier.THIS_USAGE_ANALYZER; + + private static readonly string TITLE = "`this.` must be used"; + + private static readonly string MESSAGE_FORMAT = "`this.` must be used to access variables, methods, and properties"; + + private static readonly string DESCRIPTION = MESSAGE_FORMAT; + + private const string CATEGORY = "Usage"; + + private static readonly DiagnosticDescriptor RULE = new(DIAGNOSTIC_ID, TITLE, MESSAGE_FORMAT, CATEGORY, DiagnosticSeverity.Error, isEnabledByDefault: true, description: DESCRIPTION); + + public override ImmutableArray SupportedDiagnostics => [RULE]; + + public override void Initialize(AnalysisContext context) + { + context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); + context.EnableConcurrentExecution(); + context.RegisterSyntaxNodeAction(this.AnalyzeIdentifier, SyntaxKind.IdentifierName); + context.RegisterSyntaxNodeAction(this.AnalyzeGenericName, SyntaxKind.GenericName); + } + + private void AnalyzeGenericName(SyntaxNodeAnalysisContext context) + { + var genericNameSyntax = (GenericNameSyntax)context.Node; + + // Skip if already part of a 'this' expression + if (IsAccessedThroughThis(genericNameSyntax)) + return; + + if (IsWithinInitializer(genericNameSyntax)) + return; + + if (IsPartOfMemberAccess(genericNameSyntax)) + return; + + // Get symbol info for the generic name + var symbolInfo = context.SemanticModel.GetSymbolInfo(genericNameSyntax); + var symbol = symbolInfo.Symbol; + + if (symbol == null) + return; + + // Skip static methods + if (symbol.IsStatic) + return; + + // Skip local functions + if (symbol is IMethodSymbol methodSymbol && IsLocalFunction(methodSymbol)) + return; + + // Get the containing type of the current context + var containingSymbol = context.ContainingSymbol; + var currentType = containingSymbol?.ContainingType; + + // If we're in a static context, allow accessing members without this + if (IsInStaticContext(containingSymbol)) + return; + + if (symbol is IMethodSymbol) + { + var containingType = symbol.ContainingType; + + // If the symbol is a member of the current type or a base type, then require this + if (currentType != null && (SymbolEqualityComparer.Default.Equals(containingType, currentType) || + IsBaseTypeOf(containingType, currentType))) + { + var diagnostic = Diagnostic.Create(RULE, genericNameSyntax.Identifier.GetLocation()); + context.ReportDiagnostic(diagnostic); + } + } + } + + private void AnalyzeIdentifier(SyntaxNodeAnalysisContext context) + { + var identifierNameSyntax = (IdentifierNameSyntax)context.Node; + + // Skip if this identifier is part of a generic name - we'll handle that separately + if (identifierNameSyntax.Parent is GenericNameSyntax) + return; + + // Skip if already part of a 'this' expression + if (IsAccessedThroughThis(identifierNameSyntax)) + return; + + if (IsWithinInitializer(identifierNameSyntax)) + return; + + if (IsPartOfMemberAccess(identifierNameSyntax)) + return; + + // Also skip if it's part of static import statements + if (IsPartOfUsingStaticDirective(identifierNameSyntax)) + return; + + // Skip if it's part of a namespace or type name + if (IsPartOfNamespaceOrTypeName(identifierNameSyntax)) + return; + + // Get symbol info + var symbolInfo = context.SemanticModel.GetSymbolInfo(identifierNameSyntax); + var symbol = symbolInfo.Symbol; + + if (symbol == null) + return; + + // Skip local variables, parameters, and range variables + if (symbol.Kind is SymbolKind.Local or SymbolKind.Parameter or SymbolKind.RangeVariable or SymbolKind.TypeParameter) + return; + + // Skip types and namespaces + if (symbol.Kind is SymbolKind.NamedType or SymbolKind.Namespace) + return; + + // Explicitly check if this is a local function + if (symbol is IMethodSymbol methodSymbol && IsLocalFunction(methodSymbol)) + return; + + // Get the containing type of the current context + var containingSymbol = context.ContainingSymbol; + var currentType = containingSymbol?.ContainingType; + + // If we're in a static context, allow accessing members without this + if (IsInStaticContext(containingSymbol)) + return; + + // Now check if the symbol is an instance member of the current class + if (symbol is IFieldSymbol or IPropertySymbol or IMethodSymbol or IEventSymbol) + { + // Skip static members + if (symbol.IsStatic) + return; + + // Skip constants + if (symbol is IFieldSymbol { IsConst: true }) + return; + + var containingType = symbol.ContainingType; + + // If the symbol is a member of the current type or a base type, then require this + if (currentType != null && (SymbolEqualityComparer.Default.Equals(containingType, currentType) || + IsBaseTypeOf(containingType, currentType))) + { + var diagnostic = Diagnostic.Create(RULE, identifierNameSyntax.GetLocation()); + context.ReportDiagnostic(diagnostic); + } + } + } + + private static bool IsLocalFunction(IMethodSymbol methodSymbol) => methodSymbol.MethodKind is MethodKind.LocalFunction; + + private static bool IsBaseTypeOf(INamedTypeSymbol baseType, INamedTypeSymbol derivedType) + { + var currentType = derivedType.BaseType; + while (currentType != null) + { + if (SymbolEqualityComparer.Default.Equals(currentType, baseType)) + return true; + + currentType = currentType.BaseType; + } + + return false; + } + + private static bool IsInStaticContext(ISymbol? containingSymbol) => containingSymbol?.IsStatic is true; + + private static bool IsAccessedThroughThis(SyntaxNode node) + { + if (node.Parent is MemberAccessExpressionSyntax memberAccess) + if (memberAccess.Expression is ThisExpressionSyntax && memberAccess.Name == node) + return true; + + return false; + } + + private static bool IsWithinInitializer(SyntaxNode node) + { + for (var current = node.Parent; current != null; current = current.Parent) + if (current is InitializerExpressionSyntax) + return true; + + return false; + } + + private static bool IsPartOfMemberAccess(SyntaxNode node) + { + // Check if the node is part of a member access expression where the expression is not 'this': + if (node.Parent is MemberAccessExpressionSyntax memberAccess) + { + // If the member access expression is 'this', it's allowed: + if (memberAccess.Expression is ThisExpressionSyntax) + return false; + + // If the member access expression is something else (e.g., instance.Member), skip: + if (memberAccess.Name == node) + return true; + } + + // Also check for conditional access expressions (e.g., instance?.Member): + if (node.Parent is ConditionalAccessExpressionSyntax) + return true; + + return false; + } + + private static bool IsPartOfUsingStaticDirective(SyntaxNode node) + { + for (var current = node.Parent; current != null; current = current.Parent) + if (current is UsingDirectiveSyntax) + return true; + + return false; + } + + private static bool IsPartOfNamespaceOrTypeName(SyntaxNode node) + { + // Check if a node is part of a namespace, class, or type declaration: + if (node.Parent is NameSyntax && node.Parent is not MemberAccessExpressionSyntax) + return true; + + return false; + } +} \ No newline at end of file diff --git a/app/SourceCodeRules/SourceCodeRules/UsageCodeFixes/EmptyStringCodeFixProvider.cs b/app/SourceCodeRules/SourceCodeRules/UsageCodeFixes/EmptyStringCodeFixProvider.cs new file mode 100644 index 00000000..fe04dadf --- /dev/null +++ b/app/SourceCodeRules/SourceCodeRules/UsageCodeFixes/EmptyStringCodeFixProvider.cs @@ -0,0 +1,54 @@ +using System.Collections.Immutable; +using System.Composition; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CodeActions; +using Microsoft.CodeAnalysis.CodeFixes; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Formatting; + +namespace SourceCodeRules.UsageCodeFixes; + +[ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(EmptyStringCodeFixProvider)), Shared] +public class EmptyStringCodeFixProvider : CodeFixProvider +{ + private const string TITLE = """Replace "" with string.Empty"""; + + public sealed override ImmutableArray FixableDiagnosticIds => [Identifier.EMPTY_STRING_ANALYZER]; + + public sealed override FixAllProvider GetFixAllProvider() => WellKnownFixAllProviders.BatchFixer; + + public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context) + { + var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken); + if(root is null) + return; + + var diagnostic = context.Diagnostics.First(); + var diagnosticSpan = diagnostic.Location.SourceSpan; + + if (root.FindToken(diagnosticSpan.Start).Parent is not LiteralExpressionSyntax emptyStringLiteral) + return; + + context.RegisterCodeFix( + CodeAction.Create( + title: TITLE, + createChangedDocument: c => ReplaceWithStringEmpty(context.Document, emptyStringLiteral, c), + equivalenceKey: TITLE), + diagnostic); + } + private static async Task ReplaceWithStringEmpty(Document document, LiteralExpressionSyntax emptyStringLiteral, CancellationToken cancellationToken) + { + var stringEmptyExpression = SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, SyntaxFactory.IdentifierName("string"), SyntaxFactory.IdentifierName("Empty")).WithAdditionalAnnotations(Formatter.Annotation); + var root = await document.GetSyntaxRootAsync(cancellationToken); + if (root is null) + return document; + + var newRoot = root.ReplaceNode(emptyStringLiteral, stringEmptyExpression); + return document.WithSyntaxRoot(newRoot); + } +} \ No newline at end of file diff --git a/app/SourceCodeRules/SourceCodeRules/UsageCodeFixes/ThisUsageCodeFixProvider.cs b/app/SourceCodeRules/SourceCodeRules/UsageCodeFixes/ThisUsageCodeFixProvider.cs new file mode 100644 index 00000000..6f98772c --- /dev/null +++ b/app/SourceCodeRules/SourceCodeRules/UsageCodeFixes/ThisUsageCodeFixProvider.cs @@ -0,0 +1,71 @@ +using System.Collections.Immutable; +using System.Composition; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CodeActions; +using Microsoft.CodeAnalysis.CodeFixes; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; + +namespace SourceCodeRules.UsageCodeFixes; + +[ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(ThisUsageCodeFixProvider)), Shared] +public class ThisUsageCodeFixProvider : CodeFixProvider +{ + private const string TITLE = "Add 'this.' prefix"; + + public sealed override ImmutableArray FixableDiagnosticIds => [Identifier.THIS_USAGE_ANALYZER]; + + public sealed override FixAllProvider GetFixAllProvider() => WellKnownFixAllProviders.BatchFixer; + + public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context) + { + var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken); + if (root == null) + return; + + var diagnostic = context.Diagnostics.First(); + var diagnosticSpan = diagnostic.Location.SourceSpan; + var node = root.FindNode(diagnosticSpan); + + if (node is IdentifierNameSyntax identifierNode) + { + context.RegisterCodeFix( + CodeAction.Create( + title: TITLE, + createChangedDocument: c => AddThisPrefixAsync(context.Document, identifierNode, c), + equivalenceKey: nameof(ThisUsageCodeFixProvider)), + diagnostic); + } + else if (node is GenericNameSyntax genericNameNode) + { + context.RegisterCodeFix( + CodeAction.Create( + title: TITLE, + createChangedDocument: c => AddThisPrefixAsync(context.Document, genericNameNode, c), + equivalenceKey: nameof(ThisUsageCodeFixProvider)), + diagnostic); + } + } + + private static async Task AddThisPrefixAsync(Document document, SyntaxNode node, CancellationToken cancellationToken) + { + var root = await document.GetSyntaxRootAsync(cancellationToken); + if (root == null) + return document; + + var thisExpression = SyntaxFactory.ThisExpression(); + var leadingTrivia = node.GetLeadingTrivia(); + var memberAccessExpression = SyntaxFactory.MemberAccessExpression( + SyntaxKind.SimpleMemberAccessExpression, + thisExpression.WithLeadingTrivia(leadingTrivia), + ((SimpleNameSyntax)node).WithLeadingTrivia(SyntaxTriviaList.Empty)) + .WithTrailingTrivia(node.GetTrailingTrivia()); + + var newRoot = root.ReplaceNode(node, memberAccessExpression); + return document.WithSyntaxRoot(newRoot); + } +} \ No newline at end of file diff --git a/documentation/Build.md b/documentation/Build.md index 795c65b2..b25a27ef 100644 --- a/documentation/Build.md +++ b/documentation/Build.md @@ -2,7 +2,7 @@ You just want to use the app? Then simply [download the appropriate setup for your operating system](Setup.md). This chapter is intended for developers who want to modify and customize the code. ## Prerequisites -1. Install the [.NET 8 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/8.0). +1. Install the [.NET 9 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/9.0). 2. [Install the Rust compiler](https://www.rust-lang.org/tools/install) in the latest version. 3. Met the prerequisites for building [Tauri](https://tauri.app/v1/guides/getting-started/prerequisites/). Node.js is **not** required, though. 4. Install the Tauri CLI by running `cargo install --version 1.6.2 tauri-cli`. @@ -42,6 +42,6 @@ Do you want to test your changes before creating a PR? Follow these steps: 2. At least once, you have to run the `nu build.nu publish` command (see above, "Build instructions"). This is necessary because the Tauri framework checks whether the .NET app as so-called "sidecar" is available. Although the sidecar is only necessary for the final release and shipping, Tauri requires it to be present during development. 3. Open a terminal (in this case, it doesn't have to be NuShell). 4. Navigate to the `runtime` directory within the repository, e.g. `cd repos/mindwork-ai-studio/runtime`. -5. Run `cargo run`. +5. Run `cargo tauri dev --no-watch`. Cargo will compile the Rust code and start the runtime. The runtime will then start the .NET compiler. When the .NET source code is compiled, the app will start. You can now test your changes. \ No newline at end of file diff --git a/metadata.txt b/metadata.txt index b43df068..ff758381 100644 --- a/metadata.txt +++ b/metadata.txt @@ -1,9 +1,9 @@ -0.9.25 -2025-01-04 18:33:07 UTC -200 -8.0.111 (commit f3835a7fb4) -8.0.11 (commit 9cb3b725e3) -1.83.0 (commit 90b35a623) -7.15.0 +0.9.38 +2025-03-17 18:18:00 UTC +213 +9.0.104 (commit 2750432faa) +9.0.3 (commit 831d23e561) +1.85.1 (commit 4eb161250) +8.4.0 1.8.1 -e4b1ea32fb6, release +820294c14db, release diff --git a/runtime/Cargo.lock b/runtime/Cargo.lock index dda5652b..e16f6234 100644 --- a/runtime/Cargo.lock +++ b/runtime/Cargo.lock @@ -404,9 +404,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.6.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" +checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" dependencies = [ "serde", ] @@ -472,12 +472,11 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.6" +version = "1.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aba8f4e9906c7ce3c73463f62a7f0c65183ada1a2d47e397cc8810827f9694f" +checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" dependencies = [ - "jobserver", - "libc", + "shlex", ] [[package]] @@ -1467,17 +1466,6 @@ dependencies = [ "wasi 0.9.0+wasi-snapshot-preview1", ] -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", -] - [[package]] name = "gif" version = "0.13.1" @@ -1487,6 +1475,18 @@ dependencies = [ "color_quant", "weezl", ] + +[[package]] +name = "getrandom" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets 0.52.6", +] [[package]] name = "gimli" @@ -1894,6 +1894,23 @@ dependencies = [ "want", ] +[[package]] +name = "hyper-rustls" +version = "0.27.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +dependencies = [ + "futures-util", + "http 1.1.0", + "hyper 1.4.1", + "hyper-util", + "rustls 0.23.22", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.26.1", + "tower-service", +] + [[package]] name = "hyper-tls" version = "0.5.0" @@ -1925,9 +1942,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.6" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", @@ -1938,7 +1955,6 @@ dependencies = [ "pin-project-lite", "socket2", "tokio", - "tower", "tower-service", "tracing", ] @@ -2405,9 +2421,9 @@ dependencies = [ [[package]] name = "keyring" -version = "3.6.1" +version = "3.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f8fe839464d4e4b37d756d7e910063696af79a7e877282cb1825e4ec5f10833" +checksum = "1961983669d57bdfe6c0f3ef8e4c229b5ef751afcc7d87e4271d2f71f6ccfa8b" dependencies = [ "byteorder", "dbus-secret-service", @@ -2444,9 +2460,9 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.155" +version = "0.2.170" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" [[package]] name = "libdbus-sys" @@ -2517,9 +2533,9 @@ checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" [[package]] name = "log" -version = "0.4.22" +version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" [[package]] name = "loom" @@ -2627,7 +2643,7 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mindwork-ai-studio" -version = "0.9.25" +version = "0.9.38" dependencies = [ "aes", "arboard", @@ -2642,12 +2658,14 @@ dependencies = [ "keyring", "log", "once_cell", + "openssl", "pbkdf2", "pdfium-render", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand 0.9.0", + "rand_chacha 0.9.0", "rcgen", - "reqwest 0.12.4", + "reqwest 0.12.12", + "ring", "rocket", "serde", "serde_json", @@ -3083,9 +3101,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.2" +version = "1.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" [[package]] name = "open" @@ -3099,9 +3117,9 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.66" +version = "0.10.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" +checksum = "61cfb4e166a8bb8c9b55c500bc2308550148ece889be90f609377e58140f42c6" dependencies = [ "bitflags 2.6.0", "cfg-if", @@ -3140,9 +3158,9 @@ dependencies = [ [[package]] name = "openssl-sys" -version = "0.9.103" +version = "0.9.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +checksum = "8b22d5b84be05a8d6947c7cb71f7c849aa0f112acd4bf51c2a7c1c988ac0a9dc" dependencies = [ "cc", "libc", @@ -3436,26 +3454,6 @@ dependencies = [ "siphasher", ] -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.93", -] - [[package]] name = "pin-project-lite" version = "0.2.14" @@ -3673,6 +3671,17 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.0", + "zerocopy", +] + [[package]] name = "rand_chacha" version = "0.2.2" @@ -3693,6 +3702,16 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.0", +] + [[package]] name = "rand_core" version = "0.5.1" @@ -3711,6 +3730,16 @@ dependencies = [ "getrandom 0.2.15", ] +[[package]] +name = "rand_core" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b08f3c9802962f7e1b25113931d94f43ed9725bebc59db9d0c3e9a23b67e15ff" +dependencies = [ + "getrandom 0.3.1", + "zerocopy", +] + [[package]] name = "rand_hc" version = "0.2.0" @@ -3938,8 +3967,8 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", - "system-configuration", + "sync_wrapper 0.1.2", + "system-configuration 0.5.1", "tokio", "tokio-native-tls", "tokio-util", @@ -3954,9 +3983,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.4" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" +checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" dependencies = [ "base64 0.22.1", "bytes", @@ -3968,6 +3997,7 @@ dependencies = [ "http-body 1.0.1", "http-body-util", "hyper 1.4.1", + "hyper-rustls", "hyper-tls 0.6.0", "hyper-util", "ipnet", @@ -3982,16 +4012,17 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", - "system-configuration", + "sync_wrapper 1.0.2", + "system-configuration 0.6.1", "tokio", "tokio-native-tls", + "tower", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winreg 0.52.0", + "windows-registry", ] [[package]] @@ -4029,15 +4060,14 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.8" +version = "0.17.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "70ac5d832aa16abd7d1def883a8545280c20a60f523a370aa3a9617c2b8550ee" dependencies = [ "cc", "cfg-if", "getrandom 0.2.15", "libc", - "spin", "untrusted", "windows-sys 0.52.0", ] @@ -4115,7 +4145,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "ref-cast", - "rustls", + "rustls 0.21.12", "rustls-pemfile 1.0.4", "serde", "smallvec", @@ -4123,7 +4153,7 @@ dependencies = [ "state 0.6.0", "time", "tokio", - "tokio-rustls", + "tokio-rustls 0.24.1", "uncased", ] @@ -4163,10 +4193,23 @@ checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", "ring", - "rustls-webpki", + "rustls-webpki 0.101.7", "sct", ] +[[package]] +name = "rustls" +version = "0.23.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb9263ab4eb695e42321db096e3b8fbd715a59b154d5c88d82db2175b681ba7" +dependencies = [ + "once_cell", + "rustls-pki-types", + "rustls-webpki 0.102.8", + "subtle", + "zeroize", +] + [[package]] name = "rustls-pemfile" version = "1.0.4" @@ -4188,9 +4231,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.7.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" +checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" [[package]] name = "rustls-webpki" @@ -4202,6 +4245,17 @@ dependencies = [ "untrusted", ] +[[package]] +name = "rustls-webpki" +version = "0.102.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.17" @@ -4321,18 +4375,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.217" +version = "1.0.218" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.217" +version = "1.0.218" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" dependencies = [ "proc-macro2", "quote", @@ -4476,6 +4530,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -4632,9 +4692,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subtle" -version = "2.4.1" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -4664,6 +4724,15 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + [[package]] name = "synstructure" version = "0.13.1" @@ -4683,7 +4752,18 @@ checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", "core-foundation 0.9.4", - "system-configuration-sys", + "system-configuration-sys 0.5.0", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.6.0", + "core-foundation 0.9.4", + "system-configuration-sys 0.6.0", ] [[package]] @@ -4696,6 +4776,16 @@ dependencies = [ "libc", ] +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "system-deps" version = "5.0.0" @@ -5146,9 +5236,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.42.0" +version = "1.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" +checksum = "9975ea0f48b5aa3972bf2d888c238182458437cc2a19374b81b25cdf1023fb3a" dependencies = [ "backtrace", "bytes", @@ -5163,9 +5253,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", @@ -5188,7 +5278,17 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls", + "rustls 0.21.12", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" +dependencies = [ + "rustls 0.23.22", "tokio", ] @@ -5286,14 +5386,14 @@ dependencies = [ [[package]] name = "tower" -version = "0.4.13" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" dependencies = [ "futures-core", "futures-util", - "pin-project", "pin-project-lite", + "sync_wrapper 1.0.2", "tokio", "tower-layer", "tower-service", @@ -5301,15 +5401,15 @@ dependencies = [ [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -5576,6 +5676,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasm-bindgen" version = "0.2.92" @@ -5864,6 +5973,36 @@ version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278" +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.42.0" @@ -6182,6 +6321,15 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags 2.6.0", +] + [[package]] name = "write16" version = "1.0.0" @@ -6323,6 +6471,26 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zerocopy" +version = "0.8.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa91407dacce3a68c56de03abe2760159582b846c6a4acd2f456618087f12713" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06718a168365cad3d5ff0bb133aad346959a2074bd4a85c121255a11304a8626" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.93", +] + [[package]] name = "zerofrom" version = "0.1.5" @@ -6344,6 +6512,12 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + [[package]] name = "zerovec" version = "0.10.4" diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index a094ae36..b23437e5 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mindwork-ai-studio" -version = "0.9.25" +version = "0.9.38" edition = "2021" description = "MindWork AI Studio" authors = ["Thorsten Sommer"] @@ -11,17 +11,17 @@ tauri-build = { version = "1.5", features = [] } [dependencies] tauri = { version = "1.8", features = [ "http-all", "updater", "shell-sidecar", "shell-open", "dialog"] } tauri-plugin-window-state = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1" } -serde = { version = "1.0.217", features = ["derive"] } +serde = { version = "1.0.218", features = ["derive"] } serde_json = "1.0.134" -keyring = { version = "3.6.1", features = ["apple-native", "windows-native", "sync-secret-service"] } +keyring = { version = "3.6.2", features = ["apple-native", "windows-native", "sync-secret-service"] } arboard = "3.4.1" -tokio = { version = "1.42", features = ["rt", "rt-multi-thread", "macros", "process"] } +tokio = { version = "1.44", features = ["rt", "rt-multi-thread", "macros", "process"] } flexi_logger = "0.29.8" -log = { version = "0.4", features = ["kv"] } -once_cell = "1.20" +log = { version = "0.4.26", features = ["kv"] } +once_cell = "1.20.3" rocket = { version = "0.5.1", features = ["json", "tls"] } -rand = "0.8" -rand_chacha = "0.3.1" +rand = "0.9" +rand_chacha = "0.9" base64 = "0.22.1" cipher = { version = "0.4.4", features = ["std"] } aes = "0.8.4" @@ -39,10 +39,14 @@ tokio-stream = "0.1" # Fixes security vulnerability downstream, where the upstream is not fixed yet: url = "2.5" +ring = "0.17.13" [target.'cfg(target_os = "linux")'.dependencies] # See issue https://github.com/tauri-apps/tauri/issues/4470 -reqwest = { version = "0.12", features = ["native-tls-vendored"] } +reqwest = { version = "0.12.12", features = ["native-tls-vendored"] } + +# Fixes security vulnerability downstream, where the upstream is not fixed yet: +openssl = "0.10.70" [features] custom-protocol = ["tauri/custom-protocol"] diff --git a/runtime/src/api_token.rs b/runtime/src/api_token.rs index 3fe1f182..31759185 100644 --- a/runtime/src/api_token.rs +++ b/runtime/src/api_token.rs @@ -8,7 +8,7 @@ use rocket::request::FromRequest; /// The API token used to authenticate requests. pub static API_TOKEN: Lazy = Lazy::new(|| { let mut token = [0u8; 32]; - let mut rng = rand_chacha::ChaChaRng::from_entropy(); + let mut rng = rand_chacha::ChaChaRng::from_os_rng(); rng.fill_bytes(&mut token); let token = APIToken::from_bytes(token.to_vec()); diff --git a/runtime/src/app_window.rs b/runtime/src/app_window.rs index e83b2b57..a3b41510 100644 --- a/runtime/src/app_window.rs +++ b/runtime/src/app_window.rs @@ -30,14 +30,14 @@ pub fn start_tauri() { *MAIN_WINDOW.lock().unwrap() = Some(window); info!(Source = "Bootloader Tauri"; "Setup is running."); - let logger_path = app.path_resolver().app_local_data_dir().unwrap(); - let logger_path = logger_path.join("data"); + let data_path = app.path_resolver().app_local_data_dir().unwrap(); + let data_path = data_path.join("data"); - DATA_DIRECTORY.set(logger_path.to_str().unwrap().to_string()).map_err(|_| error!("Was not abe to set the data directory.")).unwrap(); + DATA_DIRECTORY.set(data_path.to_str().unwrap().to_string()).map_err(|_| error!("Was not abe to set the data directory.")).unwrap(); CONFIG_DIRECTORY.set(app.path_resolver().app_config_dir().unwrap().to_str().unwrap().to_string()).map_err(|_| error!("Was not able to set the config directory.")).unwrap(); - info!(Source = "Bootloader Tauri"; "Reconfigure the file logger to use the app data directory {logger_path:?}"); - switch_to_file_logging(logger_path).map_err(|e| error!("Failed to switch logging to file: {e}")).unwrap(); + info!(Source = "Bootloader Tauri"; "Reconfigure the file logger to use the app data directory {data_path:?}"); + switch_to_file_logging(data_path).map_err(|e| error!("Failed to switch logging to file: {e}")).unwrap(); Ok(()) }) @@ -270,4 +270,53 @@ pub struct PreviousDirectory { pub struct DirectorySelectionResponse { user_cancelled: bool, selected_directory: String, +} + +/// Let the user select a file. +#[post("/select/file?", data = "<previous_file>")] +pub fn select_file(_token: APIToken, title: &str, previous_file: Option<Json<PreviousFile>>) -> Json<FileSelectionResponse> { + let file_path = match previous_file { + Some(previous) => { + let previous_path = previous.file_path.as_str(); + FileDialogBuilder::new() + .set_title(title) + .set_directory(previous_path) + .pick_file() + }, + + None => { + FileDialogBuilder::new() + .set_title(title) + .pick_file() + }, + }; + + match file_path { + Some(path) => { + info!("User selected file: {path:?}"); + Json(FileSelectionResponse { + user_cancelled: false, + selected_file_path: path.to_str().unwrap().to_string(), + }) + }, + + None => { + info!("User cancelled file selection."); + Json(FileSelectionResponse { + user_cancelled: true, + selected_file_path: String::from(""), + }) + }, + } +} + +#[derive(Clone, Deserialize)] +pub struct PreviousFile { + file_path: String, +} + +#[derive(Serialize)] +pub struct FileSelectionResponse { + user_cancelled: bool, + selected_file_path: String, } \ No newline at end of file diff --git a/runtime/src/encryption.rs b/runtime/src/encryption.rs index d28dbf27..632915d7 100644 --- a/runtime/src/encryption.rs +++ b/runtime/src/encryption.rs @@ -32,7 +32,7 @@ pub static ENCRYPTION: Lazy<Encryption> = Lazy::new(|| { // We use a cryptographically secure pseudo-random number generator // to generate the secret password & salt. ChaCha20Rng is the algorithm // of our choice: - let mut rng = rand_chacha::ChaChaRng::from_entropy(); + let mut rng = rand_chacha::ChaChaRng::from_os_rng(); // Fill the secret key & salt with random bytes: rng.fill_bytes(&mut secret_key); diff --git a/runtime/src/log.rs b/runtime/src/log.rs index 30befd46..b626639a 100644 --- a/runtime/src/log.rs +++ b/runtime/src/log.rs @@ -1,16 +1,25 @@ use std::collections::BTreeMap; +use std::env::{current_dir, temp_dir}; use std::error::Error; use std::fmt::Debug; -use std::path::PathBuf; +use std::path::{absolute, PathBuf}; use std::sync::OnceLock; use flexi_logger::{DeferredNow, Duplicate, FileSpec, Logger, LoggerHandle}; use flexi_logger::writers::FileLogWriter; use log::kv; use log::kv::{Key, Value, VisitSource}; +use rocket::get; +use rocket::serde::json::Json; +use rocket::serde::Serialize; +use crate::api_token::APIToken; use crate::environment::is_dev; static LOGGER: OnceLock<RuntimeLoggerHandle> = OnceLock::new(); +static LOG_STARTUP_PATH: OnceLock<String> = OnceLock::new(); + +static LOG_APP_PATH: OnceLock<String> = OnceLock::new(); + /// Initialize the logging system. pub fn init_logging() { @@ -42,11 +51,17 @@ pub fn init_logging() { false => "AI Studio Events", }; + let log_path = FileSpec::default() + .directory(get_startup_log_path()) + .basename(log_basename) + .suppress_timestamp() + .suffix("log"); + + // Store the startup log path: + let _ = LOG_STARTUP_PATH.set(convert_log_path_to_string(&log_path)); + let runtime_logger = Logger::try_with_str(log_config).expect("Cannot create logging") - .log_to_file(FileSpec::default() - .basename(log_basename) - .suppress_timestamp() - .suffix("log")) + .log_to_file(log_path) .duplicate_to_stdout(Duplicate::All) .use_utc() .format_for_files(file_logger_format) @@ -61,14 +76,60 @@ pub fn init_logging() { LOGGER.set(runtime_logger).expect("Cannot set LOGGER"); } -/// Switch the logging system to a file-based output. +fn convert_log_path_to_string(log_path: &FileSpec) -> String { + let log_path = log_path.as_pathbuf(None); + + // Case: The path is already absolute: + if log_path.is_absolute() { + return log_path.to_str().unwrap().to_string(); + } + + // Case: The path is relative. Let's try to convert it to an absolute path: + match log_path.canonicalize() { + // Case: The path exists: + Ok(log_path) => log_path.to_str().unwrap().to_string(), + + // Case: The path does not exist. Let's try to build the + // absolute path without touching the file system: + Err(_) => match absolute(log_path.clone()) { + + // Case: We could build the absolute path: + Ok(log_path) => log_path.to_str().unwrap().to_string(), + + // Case: We could not reconstruct the path using the working directory. + Err(_) => log_path.to_str().unwrap().to_string(), + } + } +} + +// Note: Rust plans to remove the deprecation flag for std::env::home_dir() in Rust 1.86.0. +#[allow(deprecated)] +fn get_startup_log_path() -> String { + match std::env::home_dir() { + // Case: We could determine the home directory: + Some(home_dir) => home_dir.to_str().unwrap().to_string(), + + // Case: We could not determine the home directory. Let's try to use the working directory: + None => match current_dir() { + + // Case: We could determine the working directory: + Ok(working_directory) => working_directory.to_str().unwrap().to_string(), + + // Case: We could not determine the working directory. Let's use the temporary directory: + Err(_) => temp_dir().to_str().unwrap().to_string(), + }, + } +} + +/// Switch the logging system to a file-based output inside the given directory. pub fn switch_to_file_logging(logger_path: PathBuf) -> Result<(), Box<dyn Error>>{ - LOGGER.get().expect("No LOGGER was set").handle.reset_flw(&FileLogWriter::builder( - FileSpec::default() - .directory(logger_path) - .basename("events") - .suppress_timestamp() - .suffix("log")))?; + let log_path = FileSpec::default() + .directory(logger_path) + .basename("events") + .suppress_timestamp() + .suffix("log"); + let _ = LOG_APP_PATH.set(convert_log_path_to_string(&log_path)); + LOGGER.get().expect("No LOGGER was set").handle.reset_flw(&FileLogWriter::builder(log_path))?; Ok(()) } @@ -160,4 +221,19 @@ fn file_logger_format( // Write the log message: write!(w, "{}", &record.args()) +} + +#[get("/log/paths")] +pub async fn get_log_paths(_token: APIToken) -> Json<LogPathsResponse> { + Json(LogPathsResponse { + log_startup_path: LOG_STARTUP_PATH.get().expect("No startup log path was set").clone(), + log_app_path: LOG_APP_PATH.get().expect("No app log path was set").clone(), + }) +} + +/// The response the get log paths request. +#[derive(Serialize)] +pub struct LogPathsResponse { + log_startup_path: String, + log_app_path: String, } \ No newline at end of file diff --git a/runtime/src/runtime_api.rs b/runtime/src/runtime_api.rs index b6c18bbb..0f383cc1 100644 --- a/runtime/src/runtime_api.rs +++ b/runtime/src/runtime_api.rs @@ -1,4 +1,3 @@ -use std::collections::HashSet; use log::info; use once_cell::sync::Lazy; use rocket::config::Shutdown; @@ -25,22 +24,9 @@ pub static API_SERVER_PORT: Lazy<u16> = Lazy::new(|| { pub fn start_runtime_api() { let api_port = *API_SERVER_PORT; info!("Try to start the API server on 'http://localhost:{api_port}'..."); - - // The shutdown configuration for the runtime API server: - let mut shutdown = Shutdown { - // We do not want to use the Ctrl+C signal to stop the server: - ctrlc: false, - - // Everything else is set to default for now: - ..Shutdown::default() - }; - - #[cfg(unix)] - { - // We do not want to use the termination signal to stop the server. - // This option, however, is only available on Unix systems: - shutdown.signals = HashSet::new(); - } + + // Get the shutdown configuration: + let shutdown = create_shutdown(); // Configure the runtime API server: let figment = Figment::from(rocket::Config::release_default()) @@ -85,14 +71,47 @@ pub fn start_runtime_api() { crate::app_window::check_for_update, crate::app_window::install_update, crate::app_window::select_directory, + crate::app_window::select_file, crate::secret::get_secret, crate::secret::store_secret, crate::secret::delete_secret, crate::environment::get_data_directory, crate::environment::get_config_directory, crate::file_data::extract_data, + crate::log::get_log_paths, ]) .ignite().await.unwrap() .launch().await.unwrap(); }); +} + +fn create_shutdown() -> Shutdown { + // + // Create a shutdown configuration, depending on the operating system: + // + #[cfg(unix)] + { + use std::collections::HashSet; + let mut shutdown = Shutdown { + // We do not want to use the Ctrl+C signal to stop the server: + ctrlc: false, + + // Everything else is set to default for now: + ..Shutdown::default() + }; + + shutdown.signals = HashSet::new(); + shutdown + } + + #[cfg(windows)] + { + Shutdown { + // We do not want to use the Ctrl+C signal to stop the server: + ctrlc: false, + + // Everything else is set to default for now: + ..Shutdown::default() + } + } } \ No newline at end of file diff --git a/runtime/tauri.conf.json b/runtime/tauri.conf.json index 7b802a59..c8bb4299 100644 --- a/runtime/tauri.conf.json +++ b/runtime/tauri.conf.json @@ -6,7 +6,7 @@ }, "package": { "productName": "MindWork AI Studio", - "version": "0.9.25" + "version": "0.9.38" }, "tauri": { "allowlist": {